diff --git a/src/vs/workbench/parts/emmet/node/emmetActions.ts b/src/vs/workbench/parts/emmet/node/emmetActions.ts index b5cb782dcecdfeec6405c9b1037750830ed06f7c..efa608ad7f0c1f62f1b63d02cd793253ac6bf5a9 100644 --- a/src/vs/workbench/parts/emmet/node/emmetActions.ts +++ b/src/vs/workbench/parts/emmet/node/emmetActions.ts @@ -12,7 +12,7 @@ import { ICommandKeybindingsOptions } from 'vs/editor/common/config/config'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { grammarsExtPoint, ITMSyntaxExtensionPoint } from 'vs/editor/node/textMate/TMGrammars'; import { IModeService } from 'vs/editor/common/services/modeService'; - +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { EditorAccessor, IGrammarContributions } from 'vs/workbench/parts/emmet/node/editorAccessor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IExtensionService, ExtensionPointContribution } from 'vs/platform/extensions/common/extensions'; @@ -69,10 +69,13 @@ class LazyEmmet { private static snippetsFromFile = {}; private static syntaxProfilesFromFile = {}; private static preferencesFromFile = {}; + private static workspaceRoot = ''; public static withConfiguredEmmet(configurationService: IConfigurationService, messageService: IMessageService, + workspaceRoot: string, callback: (_emmet: typeof emmet) => void): TPromise { + LazyEmmet.workspaceRoot = workspaceRoot; return LazyEmmet._INSTANCE.withEmmetPreferences(configurationService, messageService, callback); } @@ -133,11 +136,15 @@ class LazyEmmet { LazyEmmet.syntaxProfilesFromFile = {}; if (extPath && extPath.trim()) { - return pfs.dirExists(LazyEmmet.extensionsPath).then(exists => { + let dirPath = path.isAbsolute(extPath) ? extPath : path.join(LazyEmmet.workspaceRoot, extPath); + let snippetsPath = path.join(dirPath, 'snippets.json'); + let syntaxProfilesPath = path.join(dirPath, 'syntaxProfiles.json'); + let preferencesPath = path.join(dirPath, 'preferences.json'); + return pfs.dirExists(dirPath).then(exists => { if (exists) { - let snippetsPromise = this.getEmmetCustomization('snippets.json').then(value => LazyEmmet.snippetsFromFile = value); - let profilesPromise = this.getEmmetCustomization('syntaxProfiles.json').then(value => LazyEmmet.syntaxProfilesFromFile = value); - let preferencesPromise = this.getEmmetCustomization('preferences.json').then(value => LazyEmmet.preferencesFromFile = value); + let snippetsPromise = this.getEmmetCustomization(snippetsPath).then(value => LazyEmmet.snippetsFromFile = value); + let profilesPromise = this.getEmmetCustomization(syntaxProfilesPath).then(value => LazyEmmet.syntaxProfilesFromFile = value); + let preferencesPromise = this.getEmmetCustomization(preferencesPath).then(value => LazyEmmet.preferencesFromFile = value); return TPromise.join([snippetsPromise, profilesPromise, preferencesPromise]); } @@ -148,8 +155,7 @@ class LazyEmmet { return TPromise.as(void 0); } - private getEmmetCustomization(fileName: string): TPromise { - let filePath = path.join(LazyEmmet.extensionsPath, fileName); + private getEmmetCustomization(filePath: string): TPromise { return pfs.fileExists(filePath).then(fileExists => { if (fileExists) { return pfs.readFile(filePath).then(buff => { @@ -162,7 +168,6 @@ class LazyEmmet { return parsedData; }); } - this._messageService.show(Severity.Error, `The file "${filePath}" from emmet.extensionsPath does not exist.`); return {}; }); } @@ -216,6 +221,8 @@ export abstract class EmmetEditorAction extends EditorAction { const extensionService = accessor.get(IExtensionService); const modeService = accessor.get(IModeService); const messageService = accessor.get(IMessageService); + const contextService = accessor.get(IWorkspaceContextService); + const workspaceRoot = contextService.getWorkspace() ? contextService.getWorkspace().resource.fsPath : ''; return this._withGrammarContributions(extensionService).then((grammarContributions) => { @@ -232,7 +239,7 @@ export abstract class EmmetEditorAction extends EditorAction { return; } - return LazyEmmet.withConfiguredEmmet(configurationService, messageService, (_emmet) => { + return LazyEmmet.withConfiguredEmmet(configurationService, messageService, workspaceRoot, (_emmet) => { editorAccessor.onBeforeEmmetAction(); instantiationService.invokeFunction((accessor) => { this.runEmmetAction(accessor, new EmmetActionContext(editor, _emmet, editorAccessor));