提交 da9d758e 编写于 作者: J Johannes Rieken

fix #65145

上级 b1aad4b7
...@@ -7,10 +7,8 @@ import * as nls from 'vs/nls'; ...@@ -7,10 +7,8 @@ import * as nls from 'vs/nls';
import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { CommandsRegistry } from 'vs/platform/commands/common/commands';
import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IModeService } from 'vs/editor/common/services/modeService'; import { IModeService } from 'vs/editor/common/services/modeService';
import { IWindowService } from 'vs/platform/windows/common/windows'; import { join, basename, extname } from 'vs/base/common/path';
import { join, basename, dirname, extname } from 'vs/base/common/path';
import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions';
import { timeout } from 'vs/base/common/async';
import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IOpenerService } from 'vs/platform/opener/common/opener';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution'; import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
...@@ -19,8 +17,9 @@ import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/ ...@@ -19,8 +17,9 @@ import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/
import { SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; import { SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { IFileService } from 'vs/platform/files/common/files'; import { IFileService } from 'vs/platform/files/common/files';
import { INotificationService } from 'vs/platform/notification/common/notification';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { isValidBasename } from 'vs/base/common/extpath';
import { joinPath } from 'vs/base/common/resources';
const id = 'workbench.action.openSnippets'; const id = 'workbench.action.openSnippets';
...@@ -121,24 +120,39 @@ async function computePicks(snippetService: ISnippetsService, envService: IEnvir ...@@ -121,24 +120,39 @@ async function computePicks(snippetService: ISnippetsService, envService: IEnvir
return { existing, future }; return { existing, future };
} }
async function createSnippetFile(scope: string, defaultPath: URI, windowService: IWindowService, notificationService: INotificationService, fileService: IFileService, textFileService: ITextFileService, opener: IOpenerService) { async function createSnippetFile(scope: string, defaultPath: URI, quickInputService: IQuickInputService, fileService: IFileService, textFileService: ITextFileService, opener: IOpenerService) {
function createSnippetUri(input: string) {
const filename = extname(input) !== '.code-snippets'
? `${input}.code-snippets`
: input;
return joinPath(defaultPath, filename);
}
await fileService.createFolder(defaultPath); await fileService.createFolder(defaultPath);
await timeout(100); // ensure quick pick closes...
const path = await windowService.showSaveDialog({ const input = await quickInputService.input({
defaultPath: defaultPath.fsPath, placeHolder: nls.localize('name', "Type snippet file name"),
filters: [{ name: 'Code Snippets', extensions: ['code-snippets'] }] async validateInput(input) {
}); if (!input) {
if (!path) { return nls.localize('bad_name1', "Invalid file name");
}
if (!isValidBasename(input)) {
return nls.localize('bad_name2', "'{0}' is not a valid file name", input);
}
if (await fileService.exists(createSnippetUri(input))) {
return nls.localize('bad_name3', "'{0}' already exists", input);
}
return undefined; return undefined;
} }
const resource = URI.file(path); });
if (dirname(resource.fsPath) !== defaultPath.fsPath) {
notificationService.error(nls.localize('badPath', "Snippets must be inside this folder: '{0}'. ", defaultPath.fsPath)); if (!input) {
return undefined; return undefined;
} }
const resource = createSnippetUri(input);
await textFileService.write(resource, [ await textFileService.write(resource, [
'{', '{',
'\t// Place your ' + scope + ' snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and ', '\t// Place your ' + scope + ' snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and ',
...@@ -193,10 +207,8 @@ CommandsRegistry.registerCommand(id, async (accessor): Promise<any> => { ...@@ -193,10 +207,8 @@ CommandsRegistry.registerCommand(id, async (accessor): Promise<any> => {
const snippetService = accessor.get(ISnippetsService); const snippetService = accessor.get(ISnippetsService);
const quickInputService = accessor.get(IQuickInputService); const quickInputService = accessor.get(IQuickInputService);
const opener = accessor.get(IOpenerService); const opener = accessor.get(IOpenerService);
const windowService = accessor.get(IWindowService);
const modeService = accessor.get(IModeService); const modeService = accessor.get(IModeService);
const envService = accessor.get(IEnvironmentService); const envService = accessor.get(IEnvironmentService);
const notificationService = accessor.get(INotificationService);
const workspaceService = accessor.get(IWorkspaceContextService); const workspaceService = accessor.get(IWorkspaceContextService);
const fileService = accessor.get(IFileService); const fileService = accessor.get(IFileService);
const textFileService = accessor.get(ITextFileService); const textFileService = accessor.get(ITextFileService);
...@@ -233,9 +245,9 @@ CommandsRegistry.registerCommand(id, async (accessor): Promise<any> => { ...@@ -233,9 +245,9 @@ CommandsRegistry.registerCommand(id, async (accessor): Promise<any> => {
}); });
if (globalSnippetPicks.indexOf(pick as SnippetPick) >= 0) { if (globalSnippetPicks.indexOf(pick as SnippetPick) >= 0) {
return createSnippetFile((pick as SnippetPick).scope, (pick as SnippetPick).uri, windowService, notificationService, fileService, textFileService, opener); return createSnippetFile((pick as SnippetPick).scope, (pick as SnippetPick).uri, quickInputService, fileService, textFileService, opener);
} else if (workspaceSnippetPicks.indexOf(pick as SnippetPick) >= 0) { } else if (workspaceSnippetPicks.indexOf(pick as SnippetPick) >= 0) {
return createSnippetFile((pick as SnippetPick).scope, (pick as SnippetPick).uri, windowService, notificationService, fileService, textFileService, opener); return createSnippetFile((pick as SnippetPick).scope, (pick as SnippetPick).uri, quickInputService, fileService, textFileService, opener);
} else if (ISnippetPick.is(pick)) { } else if (ISnippetPick.is(pick)) {
if (pick.hint) { if (pick.hint) {
await createLanguageSnippetFile(pick, fileService, textFileService); await createLanguageSnippetFile(pick, fileService, textFileService);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册