diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 3086dbd7b532f99ec2f892b434c4e8662039f845..866c77d69c8ebc5e521188fad65e089765cc47c4 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -74,6 +74,11 @@ "type": "string", "default": null, "description": "%emmetExtensionsPath%" + }, + "emmet.triggerExpansionOnTab": { + "type": "boolean", + "default": false, + "description": "%emmetTriggerExpansionOnTab%" } } }, diff --git a/extensions/emmet/package.nls.json b/extensions/emmet/package.nls.json index 5a21d5bc4790ef86ab1e71cb5bf337a469ab3263..cafd59328708f3a4d33f9f213864c80eb69aeec3 100644 --- a/extensions/emmet/package.nls.json +++ b/extensions/emmet/package.nls.json @@ -28,5 +28,6 @@ "emmetShowExpandedAbbreviation": "Shows expanded emmet abbreviations as suggestions.\nThe option \"inMarkupAndStylesheetFilesOnly\" applies to html, haml, jade, slim, xml, xsl, css, scss, sass, less and stylus.\nThe option \"always\" applies to all parts of the file regardless of markup/css.", "emmetShowAbbreviationSuggestions": "Shows possible emmet abbreviations as suggestions. Not applicable in stylesheets or when emmet.showExpandedAbbreviation is set to \"never\".", "emmetIncludeLanguages": "Enable emmet abbreviations in languages that are not supported by default. Add a mapping here between the language and emmet supported language.\n Eg: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", - "emmetVariables": "Variables to be used in emmet snippets" + "emmetVariables": "Variables to be used in emmet snippets", + "emmetTriggerExpansionOnTab": "When enabled, emmet abbreviations are expanded when pressing TAB." } \ No newline at end of file diff --git a/extensions/emmet/src/abbreviationActions.ts b/extensions/emmet/src/abbreviationActions.ts index ab7c17e72500f2688c8cd7719514c497927eb9a9..85d0ba4a46078150a1d76c792e5e32af7f0c7af6 100644 --- a/extensions/emmet/src/abbreviationActions.ts +++ b/extensions/emmet/src/abbreviationActions.ts @@ -82,17 +82,17 @@ export function wrapIndividualLinesWithAbbreviation(args) { } -export function expandEmmetAbbreviation(args) { +export function expandEmmetAbbreviation(args): Thenable { const syntax = getSyntaxFromArgs(args); if (!syntax || !validate()) { - return Promise.resolve(false); + return fallbackTab(); } const editor = vscode.window.activeTextEditor; let rootNode = parseDocument(editor.document); if (!rootNode) { - return Promise.resolve(false); + return fallbackTab(); } let abbreviationList: ExpandAbbreviationInput[] = []; @@ -153,10 +153,18 @@ export function expandEmmetAbbreviation(args) { abbreviationList.push({ syntax, abbreviation, rangeToReplace, filters }); }); - return expandAbbreviationInRange(editor, abbreviationList, allAbbreviationsSame); + return expandAbbreviationInRange(editor, abbreviationList, allAbbreviationsSame).then(success => { + if (!success) { + return fallbackTab(); + } + }); } - +function fallbackTab(): Thenable { + if (vscode.workspace.getConfiguration('emmet')['triggerExpansionOnTab'] === true) { + return vscode.commands.executeCommand('tab'); + } +} /** * Checks if given position is a valid location to expand emmet abbreviation. * Works only on html and css/less/scss syntax @@ -200,6 +208,7 @@ export function isValidLocationForEmmetAbbreviation(currentNode: Node, syntax: s * @param editor * @param expandAbbrList * @param insertSameSnippet + * @returns false if no snippet can be inserted. */ function expandAbbreviationInRange(editor: vscode.TextEditor, expandAbbrList: ExpandAbbreviationInput[], insertSameSnippet: boolean): Thenable { if (!expandAbbrList || expandAbbrList.length === 0) { @@ -217,6 +226,9 @@ function expandAbbreviationInRange(editor: vscode.TextEditor, expandAbbrList: Ex insertPromises.push(editor.insertSnippet(new vscode.SnippetString(expandedText), expandAbbrInput.rangeToReplace)); } }); + if (insertPromises.length === 0) { + return Promise.resolve(false); + } return Promise.all(insertPromises).then(() => Promise.resolve(true)); } diff --git a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts index b40d18fabcf7a11767324ef5cd5d0006c27fb2cf..fc9136fce72fa856746b6d08c7abb2ba8a7b1351 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts @@ -8,6 +8,8 @@ import nls = require('vs/nls'); import { EmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @editorAction class ExpandAbbreviationAction extends EmmetEditorAction { @@ -18,7 +20,15 @@ class ExpandAbbreviationAction extends EmmetEditorAction { label: nls.localize('expandAbbreviationAction', "Emmet: Expand Abbreviation"), alias: 'Emmet: Expand Abbreviation', precondition: EditorContextKeys.writable, - actionName: 'expand_abbreviation' + actionName: 'expand_abbreviation', + kbOpts: { + primary: KeyCode.Tab, + kbExpr: ContextKeyExpr.and( + EditorContextKeys.textFocus, + EditorContextKeys.tabDoesNotMoveFocus, + ContextKeyExpr.has('config.emmet.triggerExpansionOnTab') + ) + } }); }