From b4bb439b2782bcc65e9f7b9b54b6a097755dd8ba Mon Sep 17 00:00:00 2001 From: Till Date: Tue, 12 Dec 2017 09:27:17 +0100 Subject: [PATCH] Merge with master --- .github/classifier.yml | 34 +- .github/commands.yml | 28 +- .nvmrc | 1 + .travis.yml | 1 + .vscode/settings.json | 3 +- OSSREADME.json | 37 + ThirdPartyNotices.txt | 193 +- appveyor.yml | 1 + build/gulpfile.hygiene.js | 1 + build/gulpfile.vscode.js | 9 +- build/lib/i18n.js | 2 +- build/lib/i18n.ts | 2 +- .../lib/tslint/noUnexternalizedStringsRule.js | 10 + .../lib/tslint/noUnexternalizedStringsRule.ts | 9 + build/tslint.json | 2 +- build/win32/i18n/messages.ja.isl | 2 +- extensions/OSSREADME.json | 7 + extensions/bat/package.json | 4 + .../bat/snippets/batchfile.snippets.json | 16 + .../coffeescript/language-configuration.json | 8 +- extensions/coffeescript/package.json | 6 +- .../snippets/coffeescript.snippets.json | 16 + extensions/configuration-editing/package.json | 2 +- .../configuration-editing/src/extension.ts | 4 +- .../src/settingsDocumentHelper.ts | 15 +- extensions/cpp/language-configuration.json | 4 - extensions/css/client/src/cssMain.ts | 29 +- extensions/css/server/package.json | 10 +- extensions/css/server/yarn.lock | 6 +- extensions/emmet/package.json | 21 +- extensions/emmet/package.nls.json | 5 +- extensions/emmet/src/abbreviationActions.ts | 96 +- .../emmet/src/defaultCompletionProvider.ts | 71 +- .../emmet/src/test/abbreviationAction.test.ts | 346 +- .../emmet/src/test/updateImageSize.test.ts | 274 +- extensions/emmet/yarn.lock | 6 +- extensions/git/package.json | 223 +- extensions/git/package.nls.json | 2 + extensions/git/resources/icons/dark/clean.svg | 2 +- .../git/resources/icons/light/clean.svg | 2 +- extensions/git/src/api.ts | 42 + extensions/git/src/autofetch.ts | 50 +- extensions/git/src/commands.ts | 132 +- extensions/git/src/contentProvider.ts | 4 +- extensions/git/src/decorationProvider.ts | 26 +- extensions/git/src/git.ts | 6 +- extensions/git/src/main.ts | 36 +- extensions/git/src/model.ts | 93 +- extensions/git/src/repository.ts | 72 +- extensions/git/src/staging.ts | 12 +- extensions/git/src/statusbar.ts | 4 +- extensions/git/src/util.ts | 16 +- extensions/go/language-configuration.json | 2 +- extensions/html/client/src/htmlMain.ts | 27 +- extensions/html/language-configuration.json | 8 +- extensions/html/package.json | 10 + extensions/html/server/package.json | 16 +- extensions/html/server/src/htmlServerMain.ts | 2 +- .../html/server/src/modes/javascriptMode.ts | 1 + extensions/html/server/yarn.lock | 12 +- .../html.json => snippets/html.snippets.json} | 10 +- extensions/java/package.json | 4 + extensions/java/snippets/java.snippets.json | 16 + extensions/javascript/package.json | 4 + .../src/features/bowerJSONContribution.ts | 12 +- .../syntaxes/JavaScript.tmLanguage.json | 22 +- .../syntaxes/JavaScriptReact.tmLanguage.json | 22 +- .../test/colorize-results/test_jsx.json | 18 +- extensions/json/client/src/jsonMain.ts | 12 +- extensions/json/package.json | 31 +- extensions/json/server/package.json | 10 +- extensions/json/server/src/jsonServerMain.ts | 86 +- extensions/json/server/src/utils/errors.ts | 33 + extensions/json/server/yarn.lock | 6 +- extensions/less/language-configuration.json | 6 + extensions/markdown/src/commandManager.ts | 36 + extensions/markdown/src/commands.ts | 291 + extensions/markdown/src/extension.ts | 315 +- .../{ => features}/documentLinkProvider.ts | 14 +- .../{ => features}/documentSymbolProvider.ts | 4 +- extensions/markdown/src/markdownExtensions.ts | 86 + .../markdown/src/previewContentProvider.ts | 318 - extensions/markdown/src/security.ts | 2 +- extensions/markdown/src/telemetryReporter.ts | 60 + .../markdown/syntaxes/markdown.tmLanguage | 12 +- .../syntaxes/markdown.tmLanguage.base | 12 +- .../markdown/test/colorize-fixtures/test.md | 1 + .../test/colorize-results/test_md.json | 44 + extensions/merge-conflict/package.json | 5 + extensions/merge-conflict/package.nls.json | 1 + .../ms-vscode.node-debug/OSSREADME.json | 143 +- .../ms-vscode.node-debug/package-lock.json | 7077 +++++++++++++++++ .../ms-vscode.node-debug2/OSSREADME.json | 171 +- .../ms-vscode.node-debug2/package-lock.json | 5106 ++++++++++++ extensions/package.json | 2 +- extensions/php/package.json | 2 +- .../snippets/{php.json => php.snippets.json} | 14 + .../src/features/completionItemProvider.ts | 12 +- extensions/php/src/phpMain.ts | 1 - extensions/python/language-configuration.json | 18 +- extensions/ruby/language-configuration.json | 4 +- extensions/scss/language-configuration.json | 8 +- .../theme-defaults/themes/dark_plus.json | 3 +- .../theme-defaults/themes/hc_black.json | 3 +- .../theme-defaults/themes/light_plus.json | 3 +- .../themes/quietlight-color-theme.json | 24 +- extensions/typescript/package.json | 28 +- extensions/typescript/src/commands.ts | 100 + extensions/typescript/src/extension.ts | 97 + .../src/features/completionItemProvider.ts | 67 +- .../src/features/formattingProvider.ts | 6 +- .../src/features/quickFixProvider.ts | 30 +- .../src/features/refactorProvider.ts | 2 +- .../typescript/src/features/taskProvider.ts | 47 +- extensions/typescript/src/typescriptMain.ts | 228 +- .../typescript/src/typescriptServiceClient.ts | 23 +- extensions/typescript/src/utils/api.ts | 4 + .../typescript/src/utils/fileSchemes.ts | 20 + .../src/utils/languageDescription.ts | 27 + extensions/typescript/src/utils/lazy.ts | 39 + .../src/utils/managedFileContext.ts | 51 + extensions/typescript/src/utils/previewer.ts | 1 + extensions/typescript/src/utils/tsconfig.ts | 3 +- .../typescript/src/utils/versionStatus.ts | 19 +- .../syntaxes/TypeScript.tmLanguage.json | 24 +- .../syntaxes/TypeScriptReact.tmLanguage.json | 22 +- extensions/yarn.lock | 6 +- .../css/client/out/cssMain.i18n.json | 4 +- i18n/chs/extensions/css/package.i18n.json | 2 +- .../extensions/git/out/autofetch.i18n.json | 11 + .../chs/extensions/git/out/commands.i18n.json | 8 +- i18n/chs/extensions/git/out/main.i18n.json | 5 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/chs/extensions/git/package.i18n.json | 11 +- .../html/client/out/htmlMain.i18n.json | 4 +- .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../markdown/out/security.i18n.json | 3 + .../merge-conflict/package.i18n.json | 1 + i18n/chs/extensions/php/package.i18n.json | 2 +- .../features/completionItemProvider.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 12 + .../src/vs/code/electron-main/menus.i18n.json | 13 +- .../src/vs/code/node/cliProcessMain.i18n.json | 2 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 18 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../menusExtensionPoint.i18n.json | 4 +- .../platform/environment/node/argv.i18n.json | 7 +- .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 12 +- .../theme/common/colorRegistry.i18n.json | 6 +- .../actions/toggleTabsVisibility.i18n.json | 9 + .../compositeBarActions.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 24 +- .../main.contribution.i18n.json | 12 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 5 + .../electron-browser/debugService.i18n.json | 3 +- .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsQuickOpen.i18n.json | 2 +- .../browser/extensionsWidgets.i18n.json | 8 + .../extensionProfileService.i18n.json | 8 + .../extensions.contribution.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 +- .../runtimeExtensionsEditor.i18n.json | 19 + .../parts/files/browser/fileActions.i18n.json | 4 +- .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 9 + .../parts/markers/common/messages.i18n.json | 3 +- .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 2 +- .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 9 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 7 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 4 +- .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 2 +- .../terminalService.i18n.json | 2 +- .../themes.contribution.i18n.json | 6 +- .../vs_code_welcome_page.i18n.json | 2 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../extensionHostProfiler.i18n.json | 8 + .../extensionService.i18n.json | 3 +- .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 2 +- .../textfile/common/textFileService.i18n.json | 2 +- .../workbenchThemeService.i18n.json | 2 - .../extensions/git/out/autofetch.i18n.json | 9 + .../cht/extensions/git/out/commands.i18n.json | 4 +- i18n/cht/extensions/git/out/main.i18n.json | 2 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/cht/extensions/git/package.i18n.json | 3 + .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 11 + .../src/vs/code/electron-main/menus.i18n.json | 9 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 12 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../platform/environment/node/argv.i18n.json | 3 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 1 + .../actions/toggleTabsVisibility.i18n.json | 9 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 13 +- .../main.contribution.i18n.json | 10 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 1 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 6 + .../extensionProfileService.i18n.json | 6 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 8 + .../parts/files/browser/fileActions.i18n.json | 4 +- .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 6 + .../parts/markers/common/messages.i18n.json | 2 - .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 1 - .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 7 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 4 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 2 - .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 5 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 4 +- .../extensionHostProfiler.i18n.json | 6 + .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 3 +- .../textfile/common/textFileService.i18n.json | 4 +- .../workbenchThemeService.i18n.json | 2 - .../extensions/git/out/autofetch.i18n.json | 9 + .../deu/extensions/git/out/commands.i18n.json | 5 +- i18n/deu/extensions/git/out/main.i18n.json | 3 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/deu/extensions/git/package.i18n.json | 2 + .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 8 + .../src/vs/code/electron-main/menus.i18n.json | 11 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 12 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 5 +- .../actions/toggleTabsVisibility.i18n.json | 8 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 1 - .../parts/editor/editorStatus.i18n.json | 3 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 13 +- .../main.contribution.i18n.json | 10 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 6 + .../extensionProfileService.i18n.json | 6 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 8 + .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 73 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 12 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 18 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 6 + .../parts/markers/common/messages.i18n.json | 2 - .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 1 - .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 6 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 4 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 3 - .../tasks/node/taskConfiguration.i18n.json | 2 - .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 3 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 4 +- .../extensionHostProfiler.i18n.json | 6 + .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 3 +- .../textfile/common/textFileService.i18n.json | 4 +- .../workbenchThemeService.i18n.json | 2 - .../css/client/out/cssMain.i18n.json | 4 +- .../extensions/git/out/autofetch.i18n.json | 11 + .../esn/extensions/git/out/commands.i18n.json | 8 +- i18n/esn/extensions/git/out/main.i18n.json | 5 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/esn/extensions/git/package.i18n.json | 5 + .../html/client/out/htmlMain.i18n.json | 4 +- .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../markdown/out/security.i18n.json | 3 + .../merge-conflict/package.i18n.json | 1 + .../features/completionItemProvider.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 12 + .../src/vs/code/electron-main/menus.i18n.json | 13 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 10 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../platform/environment/node/argv.i18n.json | 3 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 2 + .../actions/toggleTabsVisibility.i18n.json | 9 + .../compositeBarActions.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 24 +- .../main.contribution.i18n.json | 12 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 5 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 8 + .../extensionProfileService.i18n.json | 8 + .../extensionTipsService.i18n.json | 2 +- .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 19 + .../parts/files/browser/fileActions.i18n.json | 4 +- .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 9 + .../parts/markers/common/messages.i18n.json | 3 +- .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 2 +- .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 9 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 5 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 4 +- .../browser/terminalQuickOpen.i18n.json | 1 - .../themes.contribution.i18n.json | 5 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 2 +- .../extensionHostProfiler.i18n.json | 6 + .../extensionService.i18n.json | 3 +- .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 2 +- .../textfile/common/textFileService.i18n.json | 2 +- .../workbenchThemeService.i18n.json | 2 - .../css/client/out/cssMain.i18n.json | 4 +- .../extensions/git/out/autofetch.i18n.json | 11 + .../fra/extensions/git/out/commands.i18n.json | 8 +- i18n/fra/extensions/git/out/main.i18n.json | 5 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/fra/extensions/git/package.i18n.json | 7 +- .../html/client/out/htmlMain.i18n.json | 4 +- .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../markdown/out/security.i18n.json | 3 + .../merge-conflict/package.i18n.json | 1 + .../features/completionItemProvider.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 12 + .../src/vs/code/electron-main/menus.i18n.json | 13 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 14 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../platform/environment/node/argv.i18n.json | 3 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 2 + .../actions/toggleTabsVisibility.i18n.json | 9 + .../compositeBarActions.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 24 +- .../main.contribution.i18n.json | 12 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 5 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 8 + .../extensionProfileService.i18n.json | 8 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 19 + .../parts/files/browser/fileActions.i18n.json | 4 +- .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 9 + .../parts/markers/common/messages.i18n.json | 3 +- .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 2 +- .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 9 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 5 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 4 +- .../browser/terminalQuickOpen.i18n.json | 2 +- .../themes.contribution.i18n.json | 6 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 2 +- .../extensionHostProfiler.i18n.json | 8 + .../extensionService.i18n.json | 3 +- .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 2 +- .../textfile/common/textFileService.i18n.json | 2 +- .../workbenchThemeService.i18n.json | 2 - .../extensions/git/out/autofetch.i18n.json | 11 + .../hun/extensions/git/out/commands.i18n.json | 7 +- i18n/hun/extensions/git/out/main.i18n.json | 5 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/hun/extensions/git/package.i18n.json | 5 + .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../markdown/out/security.i18n.json | 3 + .../merge-conflict/package.i18n.json | 1 + .../features/completionItemProvider.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 12 + .../src/vs/code/electron-main/menus.i18n.json | 11 +- .../src/vs/code/node/cliProcessMain.i18n.json | 1 + .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 15 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 17 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../platform/environment/node/argv.i18n.json | 4 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 2 + .../actions/toggleTabsVisibility.i18n.json | 9 + .../compositeBarActions.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 25 +- .../main.contribution.i18n.json | 12 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 5 + .../electron-browser/debugService.i18n.json | 2 +- .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 6 + .../extensionProfileService.i18n.json | 6 + .../extensionTipsService.i18n.json | 4 +- .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 8 + .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 9 + .../parts/markers/common/messages.i18n.json | 3 +- .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 2 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 9 +- .../preferences.contribution.i18n.json | 10 + .../browser/commandsHandler.i18n.json | 2 +- .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 5 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 4 +- .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 2 +- .../themes.contribution.i18n.json | 5 +- .../electron-browser/watermark.i18n.json | 2 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 2 +- .../extensionHostProfiler.i18n.json | 6 + .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 2 +- .../textfile/common/textFileService.i18n.json | 2 +- .../workbenchThemeService.i18n.json | 2 - .../extensions/git/out/autofetch.i18n.json | 9 + .../ita/extensions/git/out/commands.i18n.json | 5 +- i18n/ita/extensions/git/out/main.i18n.json | 3 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/ita/extensions/git/package.i18n.json | 3 + .../markdown/out/commands.i18n.json | 8 + .../features/previewContentProvider.i18n.json | 10 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 8 + .../src/vs/code/electron-main/menus.i18n.json | 10 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 12 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 14 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../node/extensionGalleryService.i18n.json | 5 +- .../node/extensionManagementService.i18n.json | 3 +- .../actions/toggleTabsVisibility.i18n.json | 9 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 1 - .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 13 +- .../main.contribution.i18n.json | 10 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 1 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 6 + .../extensionProfileService.i18n.json | 6 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 8 + .../parts/files/browser/fileActions.i18n.json | 4 +- .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 9 + .../electron-browser/fileActions.i18n.json | 72 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 52 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 12 + .../explorerDecorationsProvider.i18n.json | 8 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 6 + .../parts/markers/common/messages.i18n.json | 2 - .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 1 - .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 7 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 5 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 3 +- .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 5 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 2 +- .../extensionHostProfiler.i18n.json | 6 + .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 3 +- .../textfile/common/textFileService.i18n.json | 4 +- .../workbenchThemeService.i18n.json | 2 - .../css/client/out/cssMain.i18n.json | 4 +- .../extensions/git/out/autofetch.i18n.json | 11 + .../jpn/extensions/git/out/commands.i18n.json | 8 +- i18n/jpn/extensions/git/out/main.i18n.json | 5 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/jpn/extensions/git/package.i18n.json | 5 + .../html/client/out/htmlMain.i18n.json | 4 +- .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../markdown/out/security.i18n.json | 3 + .../merge-conflict/package.i18n.json | 1 + .../features/completionItemProvider.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 12 + .../src/vs/code/electron-main/menus.i18n.json | 13 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 10 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../platform/environment/node/argv.i18n.json | 3 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 2 + .../actions/toggleTabsVisibility.i18n.json | 9 + .../compositeBarActions.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 24 +- .../main.contribution.i18n.json | 12 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 5 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 8 + .../extensionProfileService.i18n.json | 8 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 19 + .../parts/files/browser/fileActions.i18n.json | 4 +- .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 9 + .../parts/markers/common/messages.i18n.json | 3 +- .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 2 +- .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 9 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 5 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 4 +- .../browser/terminalQuickOpen.i18n.json | 2 +- .../themes.contribution.i18n.json | 6 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../extensionHostProfiler.i18n.json | 8 + .../extensionService.i18n.json | 3 +- .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 2 +- .../textfile/common/textFileService.i18n.json | 2 +- .../workbenchThemeService.i18n.json | 2 - .../extensions/git/out/autofetch.i18n.json | 9 + .../kor/extensions/git/out/commands.i18n.json | 1 - i18n/kor/extensions/git/out/main.i18n.json | 2 +- .../extensions/git/out/repository.i18n.json | 1 + .../markdown/out/commands.i18n.json | 8 + .../features/previewContentProvider.i18n.json | 10 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 8 + .../src/vs/code/electron-main/menus.i18n.json | 9 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 12 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../node/extensionGalleryService.i18n.json | 5 +- .../node/extensionManagementService.i18n.json | 3 +- .../actions/toggleTabsVisibility.i18n.json | 8 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 1 - .../parts/editor/editorStatus.i18n.json | 3 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 13 +- .../main.contribution.i18n.json | 10 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 6 + .../extensionProfileService.i18n.json | 6 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 8 + .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 73 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 12 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 6 + .../parts/markers/common/messages.i18n.json | 2 - .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 1 - .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 5 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 6 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 4 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 6 + .../task.contribution.i18n.json | 3 - .../tasks/node/taskConfiguration.i18n.json | 2 - .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 3 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 4 +- .../extensionHostProfiler.i18n.json | 6 + .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 3 +- .../textfile/common/textFileService.i18n.json | 4 +- .../workbenchThemeService.i18n.json | 2 - .../css/client/out/cssMain.i18n.json | 4 +- .../extensions/git/out/autofetch.i18n.json | 11 + .../ptb/extensions/git/out/commands.i18n.json | 8 +- i18n/ptb/extensions/git/out/main.i18n.json | 5 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/ptb/extensions/git/package.i18n.json | 5 + .../html/client/out/htmlMain.i18n.json | 4 +- .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../markdown/out/security.i18n.json | 3 + .../merge-conflict/package.i18n.json | 1 + .../features/completionItemProvider.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 12 + .../src/vs/code/electron-main/menus.i18n.json | 13 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 12 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 15 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../platform/environment/node/argv.i18n.json | 3 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 2 + .../actions/toggleTabsVisibility.i18n.json | 9 + .../compositeBarActions.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 24 +- .../main.contribution.i18n.json | 12 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 3 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 8 + .../extensionProfileService.i18n.json | 8 + .../extensions.contribution.i18n.json | 5 +- .../runtimeExtensionsEditor.i18n.json | 16 + .../parts/files/browser/fileActions.i18n.json | 4 +- .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 9 + .../parts/markers/common/messages.i18n.json | 3 +- .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 2 +- .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 9 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 5 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 4 +- .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 2 +- .../themes.contribution.i18n.json | 6 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 2 +- .../extensionHostProfiler.i18n.json | 6 + .../extensionService.i18n.json | 3 +- .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 2 +- .../textfile/common/textFileService.i18n.json | 2 +- .../workbenchThemeService.i18n.json | 2 - .../extensions/git/out/autofetch.i18n.json | 9 + .../rus/extensions/git/out/commands.i18n.json | 1 - i18n/rus/extensions/git/out/main.i18n.json | 2 +- .../extensions/git/out/repository.i18n.json | 1 + .../markdown/out/commands.i18n.json | 8 + .../features/previewContentProvider.i18n.json | 10 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 8 + .../src/vs/code/electron-main/menus.i18n.json | 8 +- .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 7 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 14 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../node/extensionGalleryService.i18n.json | 5 +- .../node/extensionManagementService.i18n.json | 3 +- .../actions/toggleTabsVisibility.i18n.json | 8 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 1 - .../parts/editor/editorStatus.i18n.json | 3 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 13 +- .../main.contribution.i18n.json | 10 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../electron-browser/debugService.i18n.json | 1 - .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 6 + .../extensionProfileService.i18n.json | 6 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 8 + .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 72 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 11 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 17 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 6 + .../parts/markers/common/messages.i18n.json | 2 - .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 1 - .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 6 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 4 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 6 + .../task.contribution.i18n.json | 3 - .../tasks/node/taskConfiguration.i18n.json | 2 - .../browser/terminalQuickOpen.i18n.json | 2 +- .../terminal.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 3 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 4 +- .../extensionHostProfiler.i18n.json | 6 + .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 3 +- .../textfile/common/textFileService.i18n.json | 4 +- .../workbenchThemeService.i18n.json | 2 - .../extensions/git/out/autofetch.i18n.json | 11 + .../trk/extensions/git/out/commands.i18n.json | 8 +- i18n/trk/extensions/git/out/main.i18n.json | 5 +- .../extensions/git/out/repository.i18n.json | 1 + i18n/trk/extensions/git/package.i18n.json | 7 +- .../markdown/out/commands.i18n.json | 9 + .../features/previewContentProvider.i18n.json | 10 + .../markdown/out/security.i18n.json | 3 + .../out/codelensProvider.i18n.json | 2 +- .../out/commandHandler.i18n.json | 6 +- .../out/mergeDecorator.i18n.json | 2 +- .../merge-conflict/package.i18n.json | 3 +- .../features/completionItemProvider.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 1 + .../src/vs/base/common/errorMessage.i18n.json | 7 - .../src/vs/code/electron-main/main.i18n.json | 12 + .../src/vs/code/electron-main/menus.i18n.json | 11 +- .../src/vs/code/node/cliProcessMain.i18n.json | 1 + .../browser/services/bulkEdit.i18n.json | 11 + .../config/commonEditorConfig.i18n.json | 10 +- .../bracketMatching/bracketMatching.i18n.json | 8 + .../caretOperations/caretOperations.i18n.json | 9 + .../caretOperations/transpose.i18n.json | 8 + .../contrib/clipboard/clipboard.i18n.json | 11 + .../editor/contrib/comment/comment.i18n.json | 11 + .../contrib/contextmenu/contextmenu.i18n.json | 8 + .../contrib/find/findController.i18n.json | 15 + .../editor/contrib/find/findWidget.i18n.json | 21 + .../contrib/find/simpleFindWidget.i18n.json | 12 + .../editor/contrib/folding/folding.i18n.json | 17 + .../contrib/format/formatActions.i18n.json | 14 + .../goToDeclarationCommands.i18n.json | 23 + .../goToDeclarationMouse.i18n.json | 8 + .../contrib/gotoError/gotoError.i18n.json | 14 + .../vs/editor/contrib/hover/hover.i18n.json | 8 + .../contrib/hover/modesContentHover.i18n.json | 8 + .../inPlaceReplace/inPlaceReplace.i18n.json | 9 + .../contrib/indentation/indentation.i18n.json | 15 + .../linesOperations/linesOperations.i18n.json | 25 + .../vs/editor/contrib/links/links.i18n.json | 16 + .../contrib/multicursor/multicursor.i18n.json | 16 + .../parameterHints/parameterHints.i18n.json | 8 + .../parameterHintsWidget.i18n.json | 8 + .../quickFix/quickFixCommands.i18n.json | 10 + .../referenceSearch/peekViewWidget.i18n.json | 8 + .../referenceSearch/referenceSearch.i18n.json | 9 + .../referencesController.i18n.json | 8 + .../referenceSearch/referencesModel.i18n.json | 14 + .../referencesWidget.i18n.json | 27 + .../vs/editor/contrib/rename/rename.i18n.json | 11 + .../contrib/rename/renameInputField.i18n.json | 8 + .../contrib/smartSelect/smartSelect.i18n.json | 9 + .../suggest/suggestController.i18n.json | 9 + .../contrib/suggest/suggestWidget.i18n.json | 21 + .../toggleTabFocusMode.i18n.json | 8 + .../wordHighlighter/wordHighlighter.i18n.json | 13 + .../platform/environment/node/argv.i18n.json | 4 + .../node/extensionGalleryService.i18n.json | 3 +- .../node/extensionManagementService.i18n.json | 9 +- .../common/extensionsRegistry.i18n.json | 2 + .../actions/toggleTabsVisibility.i18n.json | 9 + .../compositeBarActions.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 1 + .../parts/editor/editorCommands.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../vs/workbench/browser/quickopen.i18n.json | 3 +- .../electron-browser/actions.i18n.json | 13 +- .../main.contribution.i18n.json | 12 +- .../debug/browser/debugActions.i18n.json | 1 - .../breakpointsView.i18n.json | 11 + .../electron-browser/callStackView.i18n.json | 18 + .../debug.contribution.i18n.json | 5 + .../electron-browser/debugService.i18n.json | 3 +- .../electron-browser/variablesView.i18n.json | 12 + .../watchExpressionsView.i18n.json | 13 + .../browser/extensionEditor.i18n.json | 2 + .../browser/extensionsActions.i18n.json | 15 +- .../browser/extensionsWidgets.i18n.json | 6 + .../extensionProfileService.i18n.json | 6 + .../extensions.contribution.i18n.json | 4 +- .../runtimeExtensionsEditor.i18n.json | 8 + .../explorerViewlet.i18n.json | 8 + .../fileActions.contribution.i18n.json | 11 + .../electron-browser/fileActions.i18n.json | 75 + .../electron-browser/fileCommands.i18n.json | 9 + .../files.contribution.i18n.json | 53 + .../saveErrorHandler.i18n.json | 16 + .../views/emptyView.i18n.json | 13 + .../explorerDecorationsProvider.i18n.json | 9 + .../views/explorerView.i18n.json | 9 + .../views/explorerViewer.i18n.json | 19 + .../views/openEditorsView.i18n.json | 16 + .../views/openEditorsViewer.i18n.json | 15 + .../markers/browser/markersPanel.i18n.json | 9 + .../parts/markers/common/messages.i18n.json | 3 +- .../startupProfiler.i18n.json | 13 + .../browser/keybindingWidgets.i18n.json | 2 +- .../browser/keybindingsEditor.i18n.json | 1 + .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 6 +- .../browser/preferencesRenderers.i18n.json | 2 - .../browser/preferencesWidgets.i18n.json | 9 +- .../preferences.contribution.i18n.json | 10 + .../scm/electron-browser/scmViewlet.i18n.json | 1 - .../browser/patternInputWidget.i18n.json | 3 +- .../browser/search.contribution.i18n.json | 1 - .../search/browser/searchActions.i18n.json | 7 +- .../search.contribution.i18n.json | 22 + .../electron-browser/searchActions.i18n.json | 9 + .../task.contribution.i18n.json | 5 +- .../terminalTaskSystem.i18n.json | 1 + .../tasks/node/taskConfiguration.i18n.json | 4 +- .../browser/terminalQuickOpen.i18n.json | 2 +- .../themes.contribution.i18n.json | 6 +- .../configurationExtensionPoint.i18n.json | 2 +- .../crashReporterService.i18n.json | 9 + .../browser/decorationsService.i18n.json | 2 +- .../extensionHostProfiler.i18n.json | 8 + .../extensionService.i18n.json | 3 +- .../services/files/node/fileService.i18n.json | 2 +- .../keybindingService.i18n.json | 2 +- .../textfile/common/textFileService.i18n.json | 2 +- .../workbenchThemeService.i18n.json | 2 - package.json | 13 +- resources/linux/bin/code.sh | 2 +- src/main.js | 11 +- src/tsconfig.json | 3 +- src/typings/node.d.ts | 6 +- src/typings/spdlog.d.ts | 34 + src/typings/v8-inspect-profiler.d.ts | 37 + src/vs/base/browser/builder.ts | 515 +- src/vs/base/browser/dnd.ts | 21 +- src/vs/base/browser/dom.ts | 17 - src/vs/base/browser/htmlContentRenderer.ts | 12 +- src/vs/base/browser/touch.ts | 131 +- src/vs/base/browser/ui/actionbar/actionbar.ts | 14 +- src/vs/base/browser/ui/dropdown/dropdown.ts | 2 +- src/vs/base/browser/ui/inputbox/inputBox.ts | 4 - src/vs/base/browser/ui/list/list.ts | 25 +- src/vs/base/browser/ui/list/listPaging.ts | 30 +- src/vs/base/browser/ui/list/listView.ts | 146 +- src/vs/base/browser/ui/list/listWidget.ts | 131 +- src/vs/base/browser/ui/sash/sash.ts | 3 +- src/vs/base/browser/ui/splitview/splitview.ts | 50 +- src/vs/base/common/async.ts | 9 +- src/vs/base/common/color.ts | 2 +- src/vs/base/common/date.ts | 25 + src/vs/base/common/diff/diff.ts | 4 +- src/vs/base/common/event.ts | 9 + src/vs/base/common/events.ts | 78 - src/vs/base/common/filters.ts | 70 +- src/vs/base/common/iterator.ts | 2 +- src/vs/base/common/json.ts | 3 + src/vs/base/common/jsonSchema.ts | 1 + src/vs/base/common/labels.ts | 4 + src/vs/base/common/linkedList.ts | 14 +- src/vs/base/common/map.ts | 12 - src/vs/base/common/marshalling.ts | 32 +- src/vs/base/common/types.ts | 2 +- src/vs/base/common/uri.ts | 10 +- src/vs/base/node/encoding.ts | 87 + src/vs/base/node/extfs.ts | 29 + src/vs/base/node/id.ts | 27 +- src/vs/base/node/ports.ts | 30 +- src/vs/base/node/profiler.ts | 100 - src/vs/base/node/ps-win.ps1 | 183 + src/vs/base/node/ps.ts | 253 + src/vs/base/node/stats.ts | 152 + .../parts/quickopen/browser/quickOpenModel.ts | 11 +- .../quickopen/browser/quickOpenWidget.ts | 65 +- .../base/parts/quickopen/common/quickOpen.ts | 12 +- .../parts/quickopen/common/quickOpenScorer.ts | 31 +- .../test/common/quickOpenScorer.test.ts | 37 + src/vs/base/parts/tree/browser/treeDnd.ts | 3 +- src/vs/base/parts/tree/browser/treeView.ts | 27 +- src/vs/base/test/browser/builder.test.ts | 403 +- src/vs/base/test/common/color.test.ts | 6 + src/vs/base/test/common/filters.perf.test.ts | 7 +- src/vs/base/test/common/filters.test.ts | 28 +- src/vs/base/test/common/json.test.ts | 1 + .../base/test/node/encoding/encoding.test.ts | 18 + src/vs/base/test/node/extfs/extfs.test.ts | 25 + src/vs/base/test/node/id.test.ts | 17 + src/vs/base/test/node/port.test.ts | 4 +- src/vs/code/electron-browser/sharedProcess.js | 6 +- .../electron-browser/sharedProcessMain.ts | 45 +- src/vs/code/electron-main/app.ts | 105 +- src/vs/code/electron-main/auth.ts | 4 +- src/vs/code/electron-main/diagnostics.ts | 178 + src/vs/code/electron-main/keyboard.ts | 16 +- src/vs/code/electron-main/launch.ts | 72 +- src/vs/code/electron-main/main.ts | 99 +- src/vs/code/electron-main/menus.ts | 108 +- src/vs/code/electron-main/sharedProcess.ts | 12 +- src/vs/code/electron-main/window.ts | 59 +- src/vs/code/electron-main/windows.ts | 174 +- src/vs/code/node/cli.ts | 162 +- src/vs/code/node/cliProcessMain.ts | 49 +- .../editor/browser/controller/coreCommands.ts | 7 +- .../browser/controller/pointerHandler.ts | 5 +- .../browser/services/codeEditorServiceImpl.ts | 2 +- .../editor/browser/widget/codeEditorWidget.ts | 17 +- .../common/config/commonEditorConfig.ts | 19 +- src/vs/editor/common/config/editorOptions.ts | 16 +- .../editor/common/controller/cursorCommon.ts | 28 +- src/vs/editor/common/core/lineTokens.ts | 60 +- .../common/model/textModelWithTokens.ts | 59 +- src/vs/editor/common/modes.ts | 2 +- .../modes/languageConfigurationRegistry.ts | 39 +- .../common/viewLayout/viewLineRenderer.ts | 10 +- .../contrib/codelens/codelensController.ts | 14 +- src/vs/editor/contrib/dnd/dnd.ts | 22 +- src/vs/editor/contrib/find/findController.ts | 60 +- src/vs/editor/contrib/find/findState.ts | 5 + src/vs/editor/contrib/find/findWidget.ts | 106 +- .../contrib/find/test/findController.test.ts | 119 +- src/vs/editor/contrib/folding/folding.ts | 85 +- src/vs/editor/contrib/folding/foldingModel.ts | 77 +- .../editor/contrib/folding/foldingRanges.ts | 40 + .../contrib/folding/test/foldingModel.test.ts | 44 +- src/vs/editor/contrib/gotoError/gotoError.ts | 12 - src/vs/editor/contrib/hover/hover.css | 10 +- .../editor/contrib/hover/modesContentHover.ts | 6 +- .../editor/contrib/indentation/indentation.ts | 24 +- src/vs/editor/contrib/links/links.css | 1 + src/vs/editor/contrib/quickFix/quickFix.ts | 6 +- .../contrib/quickFix/quickFixCommands.ts | 3 +- .../editor/contrib/quickFix/quickFixModel.ts | 13 +- .../contrib/quickFix/test/quickFix.test.ts | 58 + .../media/referencesWidget.css | 3 +- .../referenceSearch/referencesController.ts | 36 +- .../referenceSearch/referencesWidget.ts | 2 +- .../contrib/snippet/snippetController2.ts | 22 + .../editor/contrib/snippet/snippetSession.css | 6 +- .../editor/contrib/snippet/snippetSession.ts | 94 +- .../test/snippetController2.old.test.ts | 3 +- .../snippet/test/snippetController2.test.ts | 57 +- .../editor/contrib/suggest/completionModel.ts | 52 +- .../contrib/suggest/suggestController.ts | 37 +- .../editor/contrib/suggest/suggestMemory.ts | 107 + src/vs/editor/contrib/suggest/suggestModel.ts | 25 +- .../editor/contrib/suggest/suggestWidget.ts | 9 +- .../suggest/test/completionModel.test.ts | 69 +- .../contrib/suggest/test/suggestModel.test.ts | 88 +- .../wordHighlighter/wordHighlighter.ts | 6 +- .../editor/contrib/zoneWidget/zoneWidget.ts | 8 +- .../quickOpen/quickOpenEditorWidget.ts | 3 +- .../standalone/browser/simpleServices.ts | 6 +- .../viewLayout/viewLineRenderer.test.ts | 30 + .../actions/test/common/menuService.test.ts | 11 +- .../backup/electron-main/backupMainService.ts | 2 +- .../electron-main/backupMainService.test.ts | 4 +- .../clipboard/common/clipboardService.ts | 12 +- .../electron-browser/clipboardService.ts | 16 +- .../commands/common/commandService.ts | 6 +- .../commands/test/commandService.test.ts | 20 +- .../common/configurationRegistry.ts | 25 +- .../contextkey/browser/contextKeyService.ts | 6 +- src/vs/platform/editor/common/editor.ts | 15 +- .../environment/common/environment.ts | 21 +- src/vs/platform/environment/node/argv.ts | 8 +- .../environment/node/environmentService.ts | 87 +- .../test/node/environmentService.test.ts | 2 +- .../common/extensionEnablementService.ts | 7 +- .../common/extensionManagementUtil.ts | 36 +- .../common/extensionNls.ts | 2 +- .../node/extensionGalleryService.ts | 257 +- .../node/extensionManagementService.ts | 485 +- .../node/extensionManagementUtil.ts | 23 + .../test/node/extensionGalleryService.test.ts | 51 + .../platform/extensions/common/extensions.ts | 95 +- .../extensions/common/extensionsRegistry.ts | 10 + src/vs/platform/files/common/files.ts | 6 +- .../electron-main/historyMainService.ts | 24 +- src/vs/platform/integrity/common/integrity.ts | 3 +- .../integrity/node/integrityServiceImpl.ts | 12 +- .../common/abstractKeybindingService.test.ts | 2 +- .../lifecycle/electron-main/lifecycleMain.ts | 24 +- src/vs/platform/list/browser/listService.ts | 222 +- src/vs/platform/log/common/log.ts | 247 +- src/vs/platform/log/node/spdlogService.ts | 111 + .../platform/markers/common/problemMatcher.ts | 2 +- src/vs/platform/message/common/message.ts | 6 +- src/vs/platform/node/product.ts | 1 + src/vs/platform/progress/common/progress.ts | 2 +- .../electron-browser/requestService.ts | 1 + src/vs/platform/state/common/state.ts | 18 + src/vs/platform/state/node/stateService.ts | 110 + src/vs/platform/state/test/node/state.test.ts | 56 + src/vs/platform/storage/node/storage.ts | 94 - .../platform/telemetry/browser/idleMonitor.ts | 78 - .../telemetry/common/telemetryUtils.ts | 13 - .../telemetry/node/commonProperties.ts | 21 +- .../node/workbenchCommonProperties.ts | 40 +- .../electron-browser/commonProperties.test.ts | 64 +- .../update/electron-main/updateService.ts | 11 +- src/vs/platform/windows/common/windows.ts | 12 +- .../windows/electron-browser/windowService.ts | 16 +- .../platform/workbench/common/contextkeys.ts | 11 + .../workspaces/common/workspacesIpc.ts | 4 +- .../electron-main/workspacesMainService.ts | 14 +- .../workspacesMainService.test.ts | 4 +- src/vs/vscode.d.ts | 14 +- src/vs/vscode.proposed.d.ts | 83 +- .../electron-browser/mainThreadCommands.ts | 2 +- .../mainThreadDebugService.ts | 73 +- .../api/electron-browser/mainThreadDialogs.ts | 26 +- .../mainThreadDocumentsAndEditors.ts | 6 +- .../api/electron-browser/mainThreadEditors.ts | 20 - .../api/electron-browser/mainThreadErrors.ts | 4 +- .../mainThreadExtensionService.ts | 17 +- .../mainThreadLanguageFeatures.ts | 2 +- .../mainThreadMessageService.ts | 1 - .../electron-browser/mainThreadProgress.ts | 3 +- .../mainThreadSaveParticipant.ts | 79 +- .../electron-browser/mainThreadTreeViews.ts | 74 +- .../electron-browser/mainThreadWorkspace.ts | 13 +- src/vs/workbench/api/node/extHost.api.impl.ts | 37 +- src/vs/workbench/api/node/extHost.protocol.ts | 55 +- .../workbench/api/node/extHostApiCommands.ts | 17 +- src/vs/workbench/api/node/extHostCommands.ts | 21 +- .../workbench/api/node/extHostDebugService.ts | 89 +- .../node/extHostDocumentSaveParticipant.ts | 42 +- .../api/node/extHostExtensionActivator.ts | 37 +- .../api/node/extHostExtensionService.ts | 109 +- .../api/node/extHostLanguageFeatures.ts | 74 +- src/vs/workbench/api/node/extHostSCM.ts | 14 +- .../workbench/api/node/extHostTextEditors.ts | 4 +- src/vs/workbench/api/node/extHostTreeViews.ts | 213 +- .../api/node/extHostTypeConverters.ts | 18 +- src/vs/workbench/api/node/extHostTypes.ts | 33 + src/vs/workbench/api/node/extHostWorkspace.ts | 26 +- src/vs/workbench/browser/composite.ts | 40 +- src/vs/workbench/browser/editor.ts | 44 +- src/vs/workbench/browser/labels.ts | 2 +- src/vs/workbench/browser/layout.ts | 4 + .../parts/activitybar/activitybarPart.ts | 10 +- .../parts/compositebar/compositeBar.ts | 20 +- .../browser/parts/editor/editorActions.ts | 21 +- .../parts/editor/editorAreaDropHandler.ts | 171 + .../parts/editor/editorGroupsControl.ts | 75 +- .../browser/parts/editor/editorPart.ts | 109 +- .../browser/parts/editor/editorPicker.ts | 14 +- .../browser/parts/editor/media/tabstitle.css | 44 +- .../parts/editor/noTabsTitleControl.ts | 11 +- .../browser/parts/editor/tabsTitleControl.ts | 149 +- .../browser/parts/editor/titleControl.ts | 89 +- .../browser/parts/panel/media/panelpart.css | 34 +- .../browser/parts/panel/panelPart.ts | 24 +- .../parts/quickopen/quickOpenController.ts | 33 +- .../browser/parts/sidebar/sidebarPart.ts | 9 + .../workbench/browser/parts/views/treeView.ts | 66 +- .../browser/parts/views/viewsViewlet.ts | 112 +- src/vs/workbench/browser/quickopen.ts | 21 +- src/vs/workbench/common/actions.ts | 9 +- src/vs/workbench/common/editor.ts | 21 +- .../common/editor/resourceEditorInput.ts | 3 +- src/vs/workbench/common/theme.ts | 24 + src/vs/workbench/common/views.ts | 6 +- src/vs/workbench/electron-browser/actions.ts | 104 +- .../electron-browser/bootstrap/index.js | 122 +- src/vs/workbench/electron-browser/commands.ts | 101 +- .../electron-browser/main.contribution.ts | 240 +- src/vs/workbench/electron-browser/main.ts | 21 +- src/vs/workbench/electron-browser/shell.ts | 88 +- .../workbench/electron-browser/workbench.ts | 121 +- src/vs/workbench/node/extensionHostMain.ts | 43 +- src/vs/workbench/node/extensionHostProcess.ts | 17 + .../parts/backup/common/backupRestorer.ts | 2 - .../languageConfigurationExtensionPoint.ts | 1 + .../electron-browser/selectionClipboard.ts | 6 +- .../parts/debug/browser/debugActions.ts | 6 + .../parts/debug/browser/debugActionsWidget.ts | 38 +- .../parts/debug/browser/debugViewlet.ts | 10 +- .../browser/media/debug.contribution.css | 4 + .../debug/browser/media/debugViewlet.css | 6 +- src/vs/workbench/parts/debug/common/debug.ts | 18 +- .../parts/debug/common/debugModel.ts | 95 +- .../parts/debug/common/debugProtocol.d.ts | 4 +- .../parts/debug/common/debugViewModel.ts | 7 - .../debug/electron-browser/baseDebugView.ts | 248 + .../debug/electron-browser/breakpointsView.ts | 518 ++ .../debug/electron-browser/callStackView.ts | 543 ++ .../electron-browser/debug.contribution.ts | 6 +- .../debug/electron-browser/debugCommands.ts | 10 +- .../debugConfigurationManager.ts | 144 +- .../debugEditorContribution.ts | 18 +- .../debug/electron-browser/debugHover.ts | 22 +- .../debug/electron-browser/debugService.ts | 118 +- .../debug/electron-browser/debugViewer.ts | 1323 --- .../debug/electron-browser/debugViews.ts | 511 -- .../parts/debug/electron-browser/repl.ts | 41 +- .../debug/electron-browser/replViewer.ts | 48 +- .../debug/electron-browser/terminalSupport.ts | 21 +- .../debug/electron-browser/variablesView.ts | 334 + .../electron-browser/watchExpressionsView.ts | 395 + .../electron-browser/TerminalHelper.scpt | Bin 14736 -> 15672 bytes .../electron-browser/iTermHelper.scpt | Bin 6790 -> 7330 bytes .../electron-browser/terminalService.ts | 16 +- .../extensions/browser/extensionEditor.ts | 26 +- .../extensions/browser/extensionsActions.ts | 100 +- .../extensions/browser/extensionsWidgets.ts | 2 + .../browser/media/extensionActions.css | 8 +- .../browser/media/extensionEditor.css | 1 - .../common/extensionsFileTemplate.ts | 1 + .../extensionProfileService.ts | 182 + .../electron-browser/extensionTipsService.ts | 8 +- .../extensions.contribution.ts | 45 +- .../electron-browser/extensionsActions.ts | 4 - .../electron-browser/extensionsUtils.ts | 67 +- .../electron-browser/extensionsViews.ts | 78 +- .../media/profile-start-inverse.svg | 1 + .../electron-browser/media/profile-start.svg | 1 + .../media/profile-stop-inverse.svg | 1 + .../electron-browser/media/profile-stop.svg | 1 + .../media/runtimeExtensionsEditor.css | 126 + .../electron-browser/media/save-inverse.svg | 1 + .../electron-browser/media/save.svg | 1 + .../runtimeExtensionsEditor.ts | 593 ++ .../node/extensionsWorkbenchService.ts | 38 +- .../extensionsWorkbenchService.test.ts | 2 +- .../electron-browser/feedbackStatusbarItem.ts | 4 +- .../browser/editors/fileEditorTracker.ts | 14 +- .../files/common/editors/fileEditorInput.ts | 8 +- src/vs/workbench/parts/files/common/files.ts | 11 +- .../files/electron-browser/explorerViewlet.ts | 7 +- .../files/electron-browser/fileActions.ts | 21 +- .../files/electron-browser/fileCommands.ts | 13 +- .../media/explorerviewlet.css | 33 +- .../electron-browser/media/fileactions.css | 10 +- .../files/electron-browser/views/emptyView.ts | 2 +- .../electron-browser/views/explorerView.ts | 110 +- .../electron-browser/views/explorerViewer.ts | 11 +- .../electron-browser/views/openEditorsView.ts | 651 +- .../views/openEditorsViewer.ts | 521 -- .../parts/html/browser/html.contribution.ts | 3 +- .../parts/html/browser/webview-pre.js | 64 +- .../workbench/parts/html/browser/webview.ts | 157 +- .../parts/markers/browser/markersPanel.ts | 74 +- .../markers/browser/markersPanelActions.ts | 43 +- .../parts/markers/common/constants.ts | 2 +- .../parts/markers/common/markersModel.ts | 31 +- .../performance.contribution.ts | 82 +- .../electron-browser/startupProfiler.ts | 97 + .../preferences/browser/keybindingWidgets.ts | 2 +- .../preferences/browser/keybindingsEditor.ts | 38 +- .../preferences/browser/media/preferences.css | 22 +- .../preferences/browser/preferencesEditor.ts | 35 +- .../browser/preferencesRenderers.ts | 15 +- .../preferences/browser/preferencesService.ts | 6 +- .../preferences/browser/preferencesWidgets.ts | 98 +- .../parts/preferences/common/preferences.ts | 4 +- .../common/preferencesContribution.ts | 2 +- .../preferences/common/preferencesModels.ts | 210 +- .../electron-browser/preferencesSearch.ts | 54 +- .../quickopen/browser/gotoLineHandler.ts | 10 +- .../quickopen/browser/gotoSymbolHandler.ts | 10 +- .../relauncher.contribution.ts | 2 +- .../electron-browser/dirtydiffDecorator.ts | 60 +- .../scm/electron-browser/media/scmViewlet.css | 13 +- .../scm/electron-browser/scm.contribution.ts | 14 + .../parts/scm/electron-browser/scmViewlet.ts | 117 +- .../search/browser/openAnythingHandler.ts | 148 +- .../parts/search/browser/openFileHandler.ts | 7 +- .../search/browser/patternInputWidget.ts | 7 +- .../parts/search/browser/replaceService.ts | 8 +- .../parts/search/browser/searchActions.ts | 207 +- .../parts/search/browser/searchViewlet.ts | 94 +- .../parts/search/common/queryBuilder.ts | 7 +- .../parts/search/common/searchModel.ts | 12 +- .../electron-browser/search.contribution.ts | 23 +- .../search/electron-browser/searchActions.ts | 7 +- .../search/test/common/queryBuilder.test.ts | 34 +- .../electron-browser/snippets.contribution.ts | 1 + .../electron-browser/snippetsService.ts | 1 + .../parts/stats/node/workspaceStats.ts | 47 +- .../electron-browser/task.contribution.ts | 4 +- .../terminal/browser/terminalQuickOpen.ts | 2 +- .../parts/terminal/common/terminal.ts | 10 - .../electron-browser/media/scrollbar.css | 1 + .../electron-browser/terminalInstance.ts | 16 - .../electron-browser/terminalPanel.ts | 3 +- .../electron-browser/terminalService.ts | 3 +- .../parts/terminal/node/terminalProcess.ts | 3 +- .../electron-browser/themes.contribution.ts | 4 +- ...supportedWorkspaceSettings.contribution.ts | 18 - .../electron-browser/media/code-icon.svg | 1 + .../media/update.contribution.css | 6 + .../electron-browser/releaseNotesEditor.ts | 10 +- .../electron-browser/releaseNotesInput.ts | 5 + .../parts/update/electron-browser/update.ts | 5 +- .../watermark/electron-browser/watermark.ts | 11 +- .../page/electron-browser/welcomePage.ts | 25 +- .../electron-browser/walkThroughPart.ts | 26 +- .../walkThrough/node/walkThroughInput.ts | 45 - .../services/backup/common/backup.ts | 8 + .../services/backup/node/backupFileService.ts | 8 +- .../test/node/backupFileService.test.ts | 8 +- .../common/configurationExtensionPoint.ts | 1 + .../configuration/node/configuration.ts | 18 +- .../node/configurationEditingService.ts | 2 +- .../node/configurationService.ts | 48 +- .../node/configurationEditingService.test.ts | 22 + .../test/node/configurationService.test.ts | 20 + .../services/editor/common/editorService.ts | 15 +- .../electron-browser/extensionHost.ts | 67 +- .../electron-browser/extensionHostProfiler.ts | 154 + .../electron-browser/extensionPoints.ts | 219 +- .../electron-browser/extensionService.ts | 417 +- .../files/electron-browser/fileService.ts | 2 + .../services/files/node/fileService.ts | 16 +- .../services/files/test/node/resolver.test.ts | 2 +- .../services/group/common/groupService.ts | 2 + .../electron-browser/keybindingService.ts | 37 +- .../message/browser/messageService.ts | 6 +- .../electron-browser/messageService.ts | 38 +- .../services/part/common/partService.ts | 7 +- .../progress/browser/progressService2.ts | 10 +- .../services/scm/common/scmService.ts | 5 +- .../services/search/node/fileSearch.ts | 12 +- .../services/search/node/ripgrepTextSearch.ts | 38 +- .../services/search/node/searchService.ts | 13 +- .../textfile/common/textFileEditorModel.ts | 3 +- .../textfile/common/textFileService.ts | 31 +- .../services/textfile/common/textfiles.ts | 21 +- .../electron-browser/textFileService.ts | 10 +- .../common/textModelResolverService.ts | 2 + .../themes/common/colorThemeSchema.ts | 1 + .../themes/common/fileIconThemeSchema.ts | 1 + .../services/timer/node/timerService.ts | 2 +- .../workspace/node/workspaceEditingService.ts | 62 +- .../api/extHostApiCommands.test.ts | 19 +- .../api/extHostCommands.test.ts | 5 +- .../extHostDocumentSaveParticipant.test.ts | 68 +- .../api/extHostLanguageFeatures.test.ts | 11 +- .../api/extHostTreeViews.test.ts | 336 +- .../api/mainThreadDocumentsAndEditors.test.ts | 1 - .../api/mainThreadEditors.test.ts | 2 - .../api/mainThreadSaveParticipant.test.ts | 31 + .../quickopen.perf.integrationTest.ts | 2 +- .../textsearch.perf.integrationTest.ts | 2 +- .../workbench/test/workbenchTestServices.ts | 27 +- test/electron/renderer.js | 6 + test/smoke/README.md | 2 +- test/smoke/src/areas/css/css.test.ts | 94 +- test/smoke/src/areas/debug/debug.test.ts | 285 +- test/smoke/src/areas/editor/editor.test.ts | 132 +- .../smoke/src/areas/explorer/explorer.test.ts | 70 +- .../src/areas/extensions/extensions.test.ts | 56 +- test/smoke/src/areas/git/git.test.ts | 125 +- test/smoke/src/areas/git/scm.ts | 6 +- .../src/areas/multiroot/multiroot.test.ts | 50 +- .../src/areas/preferences/preferences.test.ts | 72 +- test/smoke/src/areas/search/search.test.ts | 98 +- .../src/areas/statusbar/statusbar.test.ts | 174 +- .../src/areas/workbench/data-loss.test.ts | 66 +- .../areas/workbench/data-migration.test.ts | 165 +- .../src/areas/workbench/localization.test.ts | 86 +- test/smoke/src/helpers/utilities.ts | 29 - test/smoke/src/main.ts | 85 +- test/smoke/src/spectron/application.ts | 28 +- test/smoke/src/spectron/client.ts | 8 - yarn.lock | 73 +- 1982 files changed, 41842 insertions(+), 12801 deletions(-) create mode 100644 .nvmrc create mode 100644 extensions/OSSREADME.json create mode 100644 extensions/bat/snippets/batchfile.snippets.json create mode 100644 extensions/coffeescript/snippets/coffeescript.snippets.json create mode 100644 extensions/git/src/api.ts rename extensions/html/{snippet/html.json => snippets/html.snippets.json} (77%) create mode 100644 extensions/java/snippets/java.snippets.json create mode 100644 extensions/json/server/src/utils/errors.ts create mode 100644 extensions/markdown/src/commandManager.ts create mode 100644 extensions/markdown/src/commands.ts rename extensions/markdown/src/{ => features}/documentLinkProvider.ts (93%) rename extensions/markdown/src/{ => features}/documentSymbolProvider.ts (88%) create mode 100644 extensions/markdown/src/markdownExtensions.ts delete mode 100644 extensions/markdown/src/previewContentProvider.ts create mode 100644 extensions/markdown/src/telemetryReporter.ts create mode 100644 extensions/ms-vscode.node-debug/package-lock.json create mode 100644 extensions/ms-vscode.node-debug2/package-lock.json rename extensions/php/snippets/{php.json => php.snippets.json} (95%) create mode 100644 extensions/typescript/src/commands.ts create mode 100644 extensions/typescript/src/extension.ts create mode 100644 extensions/typescript/src/utils/fileSchemes.ts create mode 100644 extensions/typescript/src/utils/languageDescription.ts create mode 100644 extensions/typescript/src/utils/lazy.ts create mode 100644 extensions/typescript/src/utils/managedFileContext.ts create mode 100644 i18n/chs/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/chs/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/chs/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/chs/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/chs/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/chs/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/chs/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/cht/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/cht/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/cht/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/cht/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/cht/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/cht/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/cht/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/deu/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/deu/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/deu/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/deu/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/deu/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/deu/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/deu/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/esn/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/esn/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/esn/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/esn/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/esn/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/esn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/esn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/fra/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/fra/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/fra/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/fra/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/fra/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/fra/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/fra/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/hun/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/hun/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/hun/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/hun/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/hun/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/hun/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/hun/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/ita/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/ita/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/ita/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/ita/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/ita/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/ita/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/ita/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/jpn/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/jpn/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/jpn/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/jpn/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/jpn/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/kor/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/kor/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/kor/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/kor/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/kor/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/kor/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/kor/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/ptb/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/ptb/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/rus/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/rus/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/rus/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/rus/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/rus/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/rus/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/rus/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 i18n/trk/extensions/git/out/autofetch.i18n.json create mode 100644 i18n/trk/extensions/markdown/out/commands.i18n.json create mode 100644 i18n/trk/extensions/markdown/out/features/previewContentProvider.i18n.json create mode 100644 i18n/trk/src/vs/code/electron-main/main.i18n.json create mode 100644 i18n/trk/src/vs/editor/browser/services/bulkEdit.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/caretOperations/transpose.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/clipboard/clipboard.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/comment/comment.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/find/findController.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/find/findWidget.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/find/simpleFindWidget.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/folding/folding.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/format/formatActions.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/hover/hover.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/hover/modesContentHover.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/links/links.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/multicursor/multicursor.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/rename/rename.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/rename/renameInputField.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/suggest/suggestController.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/suggest/suggestWidget.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json create mode 100644 i18n/trk/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json create mode 100644 i18n/trk/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json create mode 100644 i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json create mode 100644 src/typings/spdlog.d.ts create mode 100644 src/typings/v8-inspect-profiler.d.ts create mode 100644 src/vs/base/common/date.ts delete mode 100644 src/vs/base/common/events.ts delete mode 100644 src/vs/base/node/profiler.ts create mode 100644 src/vs/base/node/ps-win.ps1 create mode 100644 src/vs/base/node/ps.ts create mode 100644 src/vs/base/node/stats.ts create mode 100644 src/vs/base/test/node/id.test.ts create mode 100644 src/vs/code/electron-main/diagnostics.ts create mode 100644 src/vs/editor/contrib/quickFix/test/quickFix.test.ts create mode 100644 src/vs/editor/contrib/suggest/suggestMemory.ts create mode 100644 src/vs/platform/extensionManagement/node/extensionManagementUtil.ts create mode 100644 src/vs/platform/extensionManagement/test/node/extensionGalleryService.test.ts create mode 100644 src/vs/platform/log/node/spdlogService.ts create mode 100644 src/vs/platform/state/common/state.ts create mode 100644 src/vs/platform/state/node/stateService.ts create mode 100644 src/vs/platform/state/test/node/state.test.ts delete mode 100644 src/vs/platform/storage/node/storage.ts delete mode 100644 src/vs/platform/telemetry/browser/idleMonitor.ts create mode 100644 src/vs/platform/workbench/common/contextkeys.ts create mode 100644 src/vs/workbench/browser/parts/editor/editorAreaDropHandler.ts create mode 100644 src/vs/workbench/parts/debug/electron-browser/baseDebugView.ts create mode 100644 src/vs/workbench/parts/debug/electron-browser/breakpointsView.ts create mode 100644 src/vs/workbench/parts/debug/electron-browser/callStackView.ts delete mode 100644 src/vs/workbench/parts/debug/electron-browser/debugViewer.ts delete mode 100644 src/vs/workbench/parts/debug/electron-browser/debugViews.ts create mode 100644 src/vs/workbench/parts/debug/electron-browser/variablesView.ts create mode 100644 src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts create mode 100644 src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts create mode 100644 src/vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg create mode 100644 src/vs/workbench/parts/extensions/electron-browser/media/profile-start.svg create mode 100644 src/vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg create mode 100644 src/vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg create mode 100644 src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css create mode 100644 src/vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg create mode 100644 src/vs/workbench/parts/extensions/electron-browser/media/save.svg create mode 100644 src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts delete mode 100644 src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.ts create mode 100644 src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts create mode 100644 src/vs/workbench/parts/update/electron-browser/media/code-icon.svg create mode 100644 src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.ts diff --git a/.github/classifier.yml b/.github/classifier.yml index 8124cd886dab..d66324e01fad 100644 --- a/.github/classifier.yml +++ b/.github/classifier.yml @@ -3,26 +3,34 @@ alwaysRequireAssignee: false, labelsRequiringAssignee: [ feature-request ], autoAssignees: { - accessibility: [], api: [], + color-picker: [], css-less-sass: [], - debug: [ weinand ], + debug: [ isidorn ], + diff-editor: [], editor: [], + editor-1000-limit: [], + editor-autoclosing: [], + editor-autoindent: [], editor-brackets: [], editor-clipboard: [], - editor-colors: [], + editor-columnselect: [], editor-contrib: [], editor-core: [], editor-find-widget: [], editor-folding: [], editor-ime: [], - editor-indentation: [], editor-input: [], editor-minimap: [], editor-multicursor: [], + editor-smooth: [], editor-wrapping: [], emmet: [ ramya-rao-a ], error-list: [], + extensions: [], + file-encoding: [ bpasero ], + file-explorer: [ isidorn ], + format: [], git: [ joaomoreno ], hot-exit: [ Tyriar ], html: [ aeschli ], @@ -31,15 +39,31 @@ integrated-terminal: [ Tyriar ], javascript: [ mjbvz ], json: [], + keybindings: [], + keyboard-layout: [], languages basic: [], markdown: [ mjbvz ], merge-conflict: [ chrmarti ], perf-profile: [], php: [ roblourens ], + proxy: [], + scm: [], search: [ roblourens ], snippets: [ jrieken ], tasks: [ dbaeumer ], + telemetry: [], + themes: [], typescript: [ mjbvz ], - workbench: [ bpasero ] + workbench: [ bpasero ], + workbench-dnd: [ bpasero ], + workbench-editors: [ bpasero ], + workbench-feedback: [ bpasero ], + workbench-layout: [ bpasero ], + workbench-menu: [ bpasero ], + workbench-notifications: [ bpasero ], + workbench-state: [ bpasero ], + workbench-status: [ bpasero ], + workbench-tabs: [ bpasero ], + workbench-welcome: [ chrmarti ], } } diff --git a/.github/commands.yml b/.github/commands.yml index a44236ef6ecb..8076f05fd1f6 100644 --- a/.github/commands.yml +++ b/.github/commands.yml @@ -5,25 +5,37 @@ type: 'label', name: '*question', action: 'close', - comment: "This issue has been closed because it represents a question. Questions are better addressed on [StackOverflow](https://aka.ms/vscodestackoverflow). See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" + comment: "Please ask your question on [StackOverflow](https://aka.ms/vscodestackoverflow). We have a great community over [there](https://aka.ms/vscodestackoverflow). They have already answered thousands of questions and are happy to answer yours as well. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" + }, + { + type: 'label', + name: '*dev-question', + action: 'close', + comment: "We have a great developer community [over on slack](https://aka.ms/vscode-dev-community) where extension authors help each other. This is a great place for you to ask questions and find support.\n\nHappy Coding!" }, { type: 'label', name: '*extension-candidate', action: 'close', - comment: "This issue has been closed because it is not within the scope of the core product, but could be addressed by an extension. The [VS Code Marketplace](https://aka.ms/vscodemarketplace) shows all existing extensions and you can get started [writing your own extension](https://aka.ms/vscodewritingextensions) in a few simple steps. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" + comment: "We try to keep VS Code lean and we think the functionality you're asking for is great for a VS Code extension. Maybe you can already find one that suits you in the [VS Code Marketplace](https://aka.ms/vscodemarketplace). Just in case, in a few simple steps you can get started [writing your own extension](https://aka.ms/vscodewritingextensions). See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" }, { type: 'label', name: '*not-reproducible', action: 'close', - comment: "This issue has been closed because the problem could not be reproduced either because it is already fixed in later versions of the product or because it requires additional details on how to reproduce it. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" + comment: "We closed this issue because we are unable to reproduce the problem with the steps you describe. Chances are we've already fixed your problem in a recent version of VS Code. If not, please ask us to reopen the issue and provide us with more detail. Our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines might help you with that.\n\nHappy Coding!" }, { type: 'label', name: '*out-of-scope', action: 'close', - comment: "This feature request will not be considered in the next [6-12 months roadmap](https://aka.ms/vscoderoadmap) and has been closed to keep the number of issues we have to maintain manageable. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nThanks for your understanding and happy coding!" + comment: "This issue is being closed to keep the number of issues in our inbox on a manageable level, we are closing issues that have been on the backlog for a long time but have not gained traction: We look at the number of votes the issue has received and the number of duplicate issues filed. If you disagree and feel that this issue is crucial: We are happy to listen and to reconsider.\n\nIf you wonder what we are up to, please see our [roadmap](https://aka.ms/vscoderoadmap) and [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nThanks for your understanding and happy coding!" + }, + { + type: 'label', + name: '*caused-by-extension', + action: 'close', + comment: "This issue is caused by an extension, please file it with the repository (or contact) the extension has linked in its overview in VS Code or the [marketplace](https://aka.ms/vscodemarketplace) for VS Code. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" }, { type: 'comment', @@ -36,7 +48,13 @@ name: '*duplicate', allowTriggerByBot: true, action: 'close', - comment: "This issue has been closed because it is already tracked by another issue. See also our [GitHub issues](https://aka.ms/vscodeissuesearch) to search for existing issues and our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" + comment: "Thanks for creating this issue! We figured it's covering the same as another one we already have. Thus, we closed this one as a duplicate. You can search for existing issues [here](https://aka.ms/vscodeissuesearch). See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!" + }, + { + type: 'comment', + name: 'confirm', + action: 'updateLabels', + addLabel: 'confirmed' }, ] } diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000000..32c861f970d8 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +8.9.2 diff --git a/.travis.yml b/.travis.yml index cdf6766096d6..12d94a22d1b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,6 +53,7 @@ install: script: - node_modules/.bin/gulp hygiene - node_modules/.bin/gulp electron --silent + - node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit - node_modules/.bin/gulp compile --silent --max_old_space_size=4096 - node_modules/.bin/gulp optimize-vscode --silent --max_old_space_size=4096 - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./scripts/test.sh --coverage --reporter dot; else ./scripts/test.sh --reporter dot; fi diff --git a/.vscode/settings.json b/.vscode/settings.json index 0d85ac560db7..d4cdcdbedd85 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -34,5 +34,6 @@ "command": "${workspaceFolder}\\scripts\\test.bat --coverage --run ${file}" } } - ] + ], + "typescript.tsdk": "node_modules/typescript/lib" } \ No newline at end of file diff --git a/OSSREADME.json b/OSSREADME.json index 8d13681d4160..ccc6ceb8c2e2 100644 --- a/OSSREADME.json +++ b/OSSREADME.json @@ -771,5 +771,42 @@ "\"\"\"" ], "isProd": true +}, +{ + "name": "spdlog original", + "version": "0.14.0", + "repositoryURL": "https://github.com/gabime/spdlog", + "license": "MIT", + "isProd": true +}, +{ + "isLicense": true, + "name": "spdlog", + "version": "0.14.0", + "repositoryURL": "https://github.com/gabime/spdlog", + "license": "MIT", + "licenseDetail": [ + "MIT License", + "", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE" + ] } ] diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 4a73d4a61eb6..00e7f5e3da90 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -12,52 +12,52 @@ This project incorporates components from the projects listed below. The origina 5. atom/language-java (https://github.com/atom/language-java) 6. atom/language-objective-c (https://github.com/atom/language-objective-c) 7. atom/language-sass version 0.52.0 (https://github.com/atom/language-sass) -8. atom/language-xml (https://github.com/atom/language-xml) -9. Benvie/JavaScriptNext.tmLanguage (https://github.com/Microsoft/vscode-JSON.tmLanguage) -10. chjj-marked version 0.3.6 (https://github.com/npmcomponent/chjj-marked) -11. chriskempson/tomorrow-theme (https://github.com/chriskempson/tomorrow-theme) -12. Colorsublime-Themes version 0.1.0 (https://github.com/Colorsublime/Colorsublime-Themes) -13. daaain/Handlebars (https://github.com/daaain/Handlebars) -14. davidrios/jade-tmbundle (https://github.com/davidrios/jade-tmbundle) -15. definitelytyped (https://github.com/DefinitelyTyped/DefinitelyTyped) -16. demyte/language-cshtml (https://github.com/demyte/language-cshtml) -17. dotnet/csharp-tmLanguage version 0.1.0 (https://github.com/dotnet/csharp-tmLanguage) -18. expand-abbreviation version 0.5.8 (https://github.com/emmetio/expand-abbreviation) -19. fadeevab/make.tmbundle (https://github.com/fadeevab/make.tmbundle) -20. freebroccolo/atom-language-swift (https://github.com/freebroccolo/atom-language-swift) -21. HTML 5.1 W3C Working Draft version 08 October 2015 (http://www.w3.org/TR/2015/WD-html51-20151008/) -22. Ikuyadeu/vscode-R (https://github.com/Ikuyadeu/vscode-R) -23. Ionic documentation version 1.2.4 (https://github.com/ionic-team/ionic-site) -24. ionide/ionide-fsgrammar (https://github.com/ionide/ionide-fsgrammar) -25. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) -26. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) -27. language-docker (https://github.com/moby/moby) -28. language-go version 0.39.0 (https://github.com/atom/language-go) -29. language-less (https://github.com/atom/language-less) -30. language-php (https://github.com/atom/language-php) -31. language-rust version 0.4.9 (https://github.com/zargony/atom-language-rust) -32. MagicStack/MagicPython (https://github.com/MagicStack/MagicPython) -33. Microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/Microsoft/TypeScript-TmLanguage) -34. Microsoft/vscode-mssql (https://github.com/Microsoft/vscode-mssql) -35. octicons-code version 3.1.0 (https://octicons.github.com) -36. octicons-font version 3.1.0 (https://octicons.github.com) -37. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) -38. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) -39. sublimehq/Packages (https://github.com/sublimehq/Packages) -40. SublimeText/PowerShell (https://github.com/SublimeText/PowerShell) -41. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) -42. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) -43. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) -44. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) -45. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) -46. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) -47. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) -48. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) -49. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) -50. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) -51. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) -52. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) -53. textmate/shellscript.tmbundle (https://github.com/textmate/shellscript.tmbundle) +8. atom/language-shellscript (https://github.com/atom/language-shellscript) +9. atom/language-xml (https://github.com/atom/language-xml) +10. Benvie/JavaScriptNext.tmLanguage (https://github.com/Microsoft/vscode-JSON.tmLanguage) +11. chjj-marked version 0.3.6 (https://github.com/npmcomponent/chjj-marked) +12. chriskempson/tomorrow-theme (https://github.com/chriskempson/tomorrow-theme) +13. Colorsublime-Themes version 0.1.0 (https://github.com/Colorsublime/Colorsublime-Themes) +14. daaain/Handlebars (https://github.com/daaain/Handlebars) +15. davidrios/jade-tmbundle (https://github.com/davidrios/jade-tmbundle) +16. definitelytyped (https://github.com/DefinitelyTyped/DefinitelyTyped) +17. demyte/language-cshtml (https://github.com/demyte/language-cshtml) +18. dotnet/csharp-tmLanguage version 0.1.0 (https://github.com/dotnet/csharp-tmLanguage) +19. expand-abbreviation version 0.5.8 (https://github.com/emmetio/expand-abbreviation) +20. fadeevab/make.tmbundle (https://github.com/fadeevab/make.tmbundle) +21. freebroccolo/atom-language-swift (https://github.com/freebroccolo/atom-language-swift) +22. HTML 5.1 W3C Working Draft version 08 October 2015 (http://www.w3.org/TR/2015/WD-html51-20151008/) +23. Ikuyadeu/vscode-R (https://github.com/Ikuyadeu/vscode-R) +24. Ionic documentation version 1.2.4 (https://github.com/ionic-team/ionic-site) +25. ionide/ionide-fsgrammar (https://github.com/ionide/ionide-fsgrammar) +26. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) +27. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) +28. language-docker (https://github.com/moby/moby) +29. language-go version 0.39.0 (https://github.com/atom/language-go) +30. language-less (https://github.com/atom/language-less) +31. language-php (https://github.com/atom/language-php) +32. language-rust version 0.4.9 (https://github.com/zargony/atom-language-rust) +33. MagicStack/MagicPython (https://github.com/MagicStack/MagicPython) +34. Microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/Microsoft/TypeScript-TmLanguage) +35. Microsoft/vscode-mssql (https://github.com/Microsoft/vscode-mssql) +36. mmims/language-batchfile (https://github.com/mmims/language-batchfile) +37. octicons-code version 3.1.0 (https://octicons.github.com) +38. octicons-font version 3.1.0 (https://octicons.github.com) +39. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) +40. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) +41. SublimeText/PowerShell (https://github.com/SublimeText/PowerShell) +42. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) +43. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) +44. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) +45. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) +46. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) +47. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) +48. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) +49. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) +50. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) +51. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) +52. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) +53. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) 54. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle) 55. TypeScript-TmLanguage version 0.1.8 (https://github.com/Microsoft/TypeScript-TmLanguage) 56. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift) @@ -371,6 +371,43 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ========================================= END OF atom/language-sass NOTICES AND INFORMATION +%% atom/language-shellscript NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014 GitHub Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This package was derived from a TextMate bundle located at +https://github.com/textmate/shellscript.tmbundle and distributed under the +following license, located in `README.mdown`: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. +========================================= +END OF atom/language-shellscript NOTICES AND INFORMATION + %% atom/language-xml NOTICES AND INFORMATION BEGIN HERE ========================================= The MIT License (MIT) @@ -1303,6 +1340,32 @@ THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ========================================= END OF Microsoft/vscode-mssql NOTICES AND INFORMATION +%% mmims/language-batchfile NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2017 Michael Mims + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF mmims/language-batchfile NOTICES AND INFORMATION + %% octicons-code NOTICES AND INFORMATION BEGIN HERE ========================================= The MIT License (MIT) @@ -1471,24 +1534,6 @@ SOFTWARE. ========================================= END OF shaders-tmLanguage NOTICES AND INFORMATION -%% sublimehq/Packages NOTICES AND INFORMATION BEGIN HERE -========================================= -Copyright (c) Sublime Packages project authors - -If not otherwise specified (see below), files in this folder fall under the following license: - -Permission to copy, use, modify, sell and distribute this -software is granted. This software is provided "as is" without -express or implied warranty, and with no claim as to its -suitability for any purpose. - -An exception is made for files in readable text which contain their own license information, -or files where an accompanying file exists (in the same directory) with a "-license" suffix added -to the base-name name of the original file, and an extension of txt, html, or similar. For example -"tidy" is accompanied by "tidy-license.txt". -========================================= -END OF sublimehq/Packages NOTICES AND INFORMATION - %% SublimeText/PowerShell NOTICES AND INFORMATION BEGIN HERE ========================================= The MIT License (MIT) @@ -1728,24 +1773,6 @@ to the base-name name of the original file, and an extension of txt, html, or si ========================================= END OF textmate/ruby.tmbundle NOTICES AND INFORMATION -%% textmate/shellscript.tmbundle NOTICES AND INFORMATION BEGIN HERE -========================================= -Copyright (c) textmate-shellscript.tmbundle project authors - -If not otherwise specified (see below), files in this repository fall under the following license: - -Permission to copy, use, modify, sell and distribute this -software is granted. This software is provided "as is" without -express or implied warranty, and with no claim as to its -suitability for any purpose. - -An exception is made for files in readable text which contain their own license information, -or files where an accompanying file exists (in the same directory) with a "-license" suffix added -to the base-name name of the original file, and an extension of txt, html, or similar. For example -"tidy" is accompanied by "tidy-license.txt". -========================================= -END OF textmate/shellscript.tmbundle NOTICES AND INFORMATION - %% textmate/yaml.tmbundle NOTICES AND INFORMATION BEGIN HERE ========================================= Copyright (c) 2015 FichteFoll @@ -1819,4 +1846,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ========================================= -END OF vscode-swift NOTICES AND INFORMATION \ No newline at end of file +END OF vscode-swift NOTICES AND INFORMATION diff --git a/appveyor.yml b/appveyor.yml index d9471f2a8f88..3ece36f7a3e1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,7 @@ install: build_script: - yarn - .\node_modules\.bin\gulp electron + - .\node_modules\.bin\tsc -p .\src\tsconfig.monaco.json --noEmit - npm run compile test_script: diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index c67dd07beb7f..f766cfaca0f5 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -69,6 +69,7 @@ const indentationFilter = [ '!**/vs/base/common/marked/raw.marked.js', '!**/vs/base/common/winjs.base.raw.js', '!**/vs/base/node/terminateProcess.sh', + '!**/vs/base/node/ps-win.ps1', '!**/vs/nls.js', '!**/vs/css.js', '!**/vs/loader.js', diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index d2c53d94ce69..a74246fa4d63 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -45,8 +45,8 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.19.1' }, - { name: 'ms-vscode.node-debug2', version: '1.19.0' } + { name: 'ms-vscode.node-debug', version: '1.19.7' }, + { name: 'ms-vscode.node-debug2', version: '1.19.3' } ]; const excludedExtensions = [ @@ -69,7 +69,7 @@ const vscodeResources = [ 'out-build/paths.js', 'out-build/vs/**/*.{svg,png,cur,html}', 'out-build/vs/base/common/performance.js', - 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh}', + 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,ps-win.ps1}', 'out-build/vs/base/browser/ui/octiconLabel/octicons/**', 'out-build/vs/workbench/browser/media/*-theme.css', 'out-build/vs/workbench/electron-browser/bootstrap/**', @@ -138,7 +138,6 @@ const config = { role: 'Editor', ostypes: ["TEXT", "utxt", "TUTX", "****"], extensions: ["ascx", "asp", "aspx", "bash", "bash_login", "bash_logout", "bash_profile", "bashrc", "bat", "bowerrc", "c", "cc", "clj", "cljs", "cljx", "clojure", "cmd", "code-workspace", "coffee", "config", "cpp", "cs", "cshtml", "csproj", "css", "csx", "ctp", "cxx", "dockerfile", "dot", "dtd", "editorconfig", "edn", "eyaml", "eyml", "fs", "fsi", "fsscript", "fsx", "gemspec", "gitattributes", "gitconfig", "gitignore", "go", "h", "handlebars", "hbs", "hh", "hpp", "htm", "html", "hxx", "ini", "jade", "jav", "java", "js", "jscsrc", "jshintrc", "jshtm", "json", "jsp", "less", "lua", "m", "makefile", "markdown", "md", "mdoc", "mdown", "mdtext", "mdtxt", "mdwn", "mkd", "mkdn", "ml", "mli", "php", "phtml", "pl", "pl6", "pm", "pm6", "pod", "pp", "profile", "properties", "ps1", "psd1", "psgi", "psm1", "py", "r", "rb", "rhistory", "rprofile", "rs", "rt", "scss", "sh", "shtml", "sql", "svg", "svgz", "t", "ts", "txt", "vb", "wxi", "wxl", "wxs", "xaml", "xcodeproj", "xcworkspace", "xml", "yaml", "yml", "zlogin", "zlogout", "zprofile", "zsh", "zshenv", "zshrc"], - utis: ['public.source-code'], iconFile: 'resources/darwin/code_file.icns' }], darwinBundleURLTypes: [{ @@ -298,11 +297,11 @@ function packageTask(platform, arch, opts) { .pipe(util.cleanNodeModule('windows-mutex', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('native-keymap', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('native-watchdog', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) + .pipe(util.cleanNodeModule('spdlog', ['binding.gyp', 'build/**', 'deps/**', 'src/**', 'test/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('jschardet', ['dist/**'])) .pipe(util.cleanNodeModule('windows-foreground-love', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('windows-process-tree', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) - .pipe(util.cleanNodeModule('v8-profiler', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) .pipe(util.cleanNodeModule('keytar', ['binding.gyp', 'build/**', 'src/**', 'script/**', 'node_modules/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/**'])) .pipe(util.cleanNodeModule('nsfw', ['binding.gyp', 'build/**', 'src/**', 'openpa/**', 'includes/**'], ['**/*.node', '**/*.a'])) diff --git a/build/lib/i18n.js b/build/lib/i18n.js index 09a94bc33f1e..1be9709523fc 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -141,7 +141,7 @@ var XLF = /** @class */ (function () { }; XLF.prototype.addStringItem = function (item) { if (!item.id || !item.message) { - throw new Error('No item ID or value specified.'); + throw new Error("No item ID or value specified: " + JSON.stringify(item)); } this.appendNewLine("", 4); this.appendNewLine("" + item.message + "", 6); diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index abfe57c8afc9..db67ffc38126 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -192,7 +192,7 @@ export class XLF { private addStringItem(item: Item): void { if (!item.id || !item.message) { - throw new Error('No item ID or value specified.'); + throw new Error(`No item ID or value specified: ${JSON.stringify(item)}`); } this.appendNewLine(``, 4); diff --git a/build/lib/tslint/noUnexternalizedStringsRule.js b/build/lib/tslint/noUnexternalizedStringsRule.js index 3114c4d98aa3..d5ad583f442a 100644 --- a/build/lib/tslint/noUnexternalizedStringsRule.js +++ b/build/lib/tslint/noUnexternalizedStringsRule.js @@ -144,6 +144,16 @@ var NoUnexternalizedStringsRuleWalker = /** @class */ (function (_super) { }; NoUnexternalizedStringsRuleWalker.prototype.recordKey = function (keyNode, messageNode) { var text = keyNode.getText(); + // We have an empty key + if (text.match(/(['"]) *\1/)) { + if (messageNode) { + this.addFailureAtNode(keyNode, "Key is empty for message: " + messageNode.getText()); + } + else { + this.addFailureAtNode(keyNode, "Key is empty."); + } + return; + } var occurrences = this.usedKeys[text]; if (!occurrences) { occurrences = []; diff --git a/build/lib/tslint/noUnexternalizedStringsRule.ts b/build/lib/tslint/noUnexternalizedStringsRule.ts index 3327a5a4bc60..abcd54966702 100644 --- a/build/lib/tslint/noUnexternalizedStringsRule.ts +++ b/build/lib/tslint/noUnexternalizedStringsRule.ts @@ -169,6 +169,15 @@ class NoUnexternalizedStringsRuleWalker extends Lint.RuleWalker { private recordKey(keyNode: ts.StringLiteral, messageNode: ts.Node) { let text = keyNode.getText(); + // We have an empty key + if (text.match(/(['"]) *\1/)) { + if (messageNode) { + this.addFailureAtNode(keyNode, `Key is empty for message: ${messageNode.getText()}`); + } else { + this.addFailureAtNode(keyNode, `Key is empty.`); + } + return; + } let occurrences: KeyMessagePair[] = this.usedKeys[text]; if (!occurrences) { occurrences = []; diff --git a/build/tslint.json b/build/tslint.json index e269a87c0e65..a85e98b95dcb 100644 --- a/build/tslint.json +++ b/build/tslint.json @@ -2,10 +2,10 @@ "rules": { "no-unused-expression": true, "no-duplicate-variable": true, - "no-unused-variable": true, "curly": true, "class-name": true, "semicolon": [ + true, "always" ], "triple-equals": true diff --git a/build/win32/i18n/messages.ja.isl b/build/win32/i18n/messages.ja.isl index ee2ccd82bdb7..8a4b1240c960 100644 --- a/build/win32/i18n/messages.ja.isl +++ b/build/win32/i18n/messages.ja.isl @@ -2,7 +2,7 @@ AddContextMenuFiles=ƒGƒNƒXƒvƒ��[ƒ‰�[‚̃tƒ@ƒCƒ‹ ƒRƒ“ƒeƒLƒXƒg ƒ�ƒjƒ…�[‚É [%1 ‚ŊJ‚­] ƒAƒNƒVƒ‡ƒ“‚ð’ljÁ‚·‚é AddContextMenuFolders=ƒGƒNƒXƒvƒ��[ƒ‰�[‚̃fƒBƒŒƒNƒgƒŠ ƒRƒ“ƒeƒLƒXƒg ƒ�ƒjƒ…�[‚É [%1 ‚ŊJ‚­] ƒAƒNƒVƒ‡ƒ“‚ð’ljÁ‚·‚é AssociateWithFiles=ƒTƒ|�[ƒg‚³‚ê‚Ă¢‚éƒtƒ@ƒCƒ‹‚̎í—ނ̃GƒfƒBƒ^�[‚Ƃµ‚āA%1 ‚ð“o˜^‚·‚é -AddToPath=PATH ‚ւ̒ljÁ (�ċN“®Œã‚Ɏg—p‰”\‚ɂȂé) +AddToPath=PATH ‚ւ̒ljÁ�i�ċN“®Œã‚Ɏg—p‰”\�j RunAfter=ƒCƒ“ƒXƒg�[ƒ‹Œã‚É %1 ‚ðŽÀ�s‚·‚é Other=‚»‚̑¼: SourceFile=%1 ƒ\�[ƒX ƒtƒ@ƒCƒ‹ \ No newline at end of file diff --git a/extensions/OSSREADME.json b/extensions/OSSREADME.json new file mode 100644 index 000000000000..518d360d2326 --- /dev/null +++ b/extensions/OSSREADME.json @@ -0,0 +1,7 @@ +[{ + "name": "typescript", + "version": "2.6.2", + "license": "Apache-2.0", + "repositoryURL": "https://github.com/Microsoft/TypeScript", + "isProd": true +}] diff --git a/extensions/bat/package.json b/extensions/bat/package.json index 8363d58ed049..d9f1cba592bd 100644 --- a/extensions/bat/package.json +++ b/extensions/bat/package.json @@ -17,6 +17,10 @@ "language": "bat", "scopeName": "source.batchfile", "path": "./syntaxes/batchfile.tmLanguage.json" + }], + "snippets": [{ + "language": "bat", + "path": "./snippets/batchfile.snippets.json" }] } } \ No newline at end of file diff --git a/extensions/bat/snippets/batchfile.snippets.json b/extensions/bat/snippets/batchfile.snippets.json new file mode 100644 index 000000000000..3759e25eacd3 --- /dev/null +++ b/extensions/bat/snippets/batchfile.snippets.json @@ -0,0 +1,16 @@ +{ + "Region Start": { + "prefix": "#region", + "body": [ + "::#region" + ], + "description": "Folding Region Start" + }, + "Region End": { + "prefix": "#endregion", + "body": [ + "::#endregion" + ], + "description": "Folding Region End" + } +} diff --git a/extensions/coffeescript/language-configuration.json b/extensions/coffeescript/language-configuration.json index 8c7fbd458df1..01fc34db790d 100644 --- a/extensions/coffeescript/language-configuration.json +++ b/extensions/coffeescript/language-configuration.json @@ -23,6 +23,10 @@ ["'", "'"] ], "folding": { - "offSide": true + "offSide": true, + "markers": { + "start": "^\\s*#region\\b", + "end": "^\\s*#endregion\\b" + } } -} \ No newline at end of file +} diff --git a/extensions/coffeescript/package.json b/extensions/coffeescript/package.json index 5c8f11b72064..c688f7b08366 100644 --- a/extensions/coffeescript/package.json +++ b/extensions/coffeescript/package.json @@ -22,6 +22,10 @@ { "language": "coffeescript" } - ] + ], + "snippets": [{ + "language": "coffeescript", + "path": "./snippets/coffeescript.snippets.json" + }] } } \ No newline at end of file diff --git a/extensions/coffeescript/snippets/coffeescript.snippets.json b/extensions/coffeescript/snippets/coffeescript.snippets.json new file mode 100644 index 000000000000..49d6a927993a --- /dev/null +++ b/extensions/coffeescript/snippets/coffeescript.snippets.json @@ -0,0 +1,16 @@ +{ + "Region Start": { + "prefix": "#region", + "body": [ + "#region" + ], + "description": "Folding Region Start" + }, + "Region End": { + "prefix": "#endregion", + "body": [ + "#endregion" + ], + "description": "Folding Region End" + } +} diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index 67c6c899c164..9659fdcbc96d 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -10,7 +10,7 @@ "Other" ], "activationEvents": [ - "onLanguage:json" + "onLanguage:json", "onLanguage:jsonc" ], "main": "./out/extension", "scripts": { diff --git a/extensions/configuration-editing/src/extension.ts b/extensions/configuration-editing/src/extension.ts index ea0655e5bf3b..e215f0fb5a92 100644 --- a/extensions/configuration-editing/src/extension.ts +++ b/extensions/configuration-editing/src/extension.ts @@ -60,7 +60,7 @@ function registerKeybindingsCompletions(): vscode.Disposable { } function registerSettingsCompletions(): vscode.Disposable { - return vscode.languages.registerCompletionItemProvider({ language: 'json', pattern: '**/settings.json' }, { + return vscode.languages.registerCompletionItemProvider({ language: 'jsonc', pattern: '**/settings.json' }, { provideCompletionItems(document, position, token) { return new SettingsDocument(document).provideCompletionItems(position, token); } @@ -173,7 +173,7 @@ function updateLaunchJsonDecorations(editor: vscode.TextEditor | undefined): voi editor.setDecorations(decoration, ranges); } -vscode.languages.registerDocumentSymbolProvider({ pattern: '**/launch.json', language: 'json' }, { +vscode.languages.registerDocumentSymbolProvider({ pattern: '**/launch.json', language: 'jsonc' }, { provideDocumentSymbols(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult { const result: vscode.SymbolInformation[] = []; let name: string = ''; diff --git a/extensions/configuration-editing/src/settingsDocumentHelper.ts b/extensions/configuration-editing/src/settingsDocumentHelper.ts index 32c6ac14854d..5f9cc61c9a90 100644 --- a/extensions/configuration-editing/src/settingsDocumentHelper.ts +++ b/extensions/configuration-editing/src/settingsDocumentHelper.ts @@ -151,9 +151,18 @@ export class SettingsDocument { private provideLanguageCompletionItems(location: Location, range: vscode.Range, formatFunc: (string: string) => string = (l) => JSON.stringify(l)): vscode.ProviderResult { return vscode.languages.getLanguages().then(languages => { - return languages.map(l => { - return this.newSimpleCompletionItem(formatFunc(l), range); - }); + const completionItems = []; + const configuration = vscode.workspace.getConfiguration(); + for (const language of languages) { + const inspect = configuration.inspect(`[${language}]`); + if (!inspect || !inspect.defaultValue) { + const item = new vscode.CompletionItem(formatFunc(language)); + item.kind = vscode.CompletionItemKind.Property; + item.range = range; + completionItems.push(item); + } + } + return completionItems; }); } diff --git a/extensions/cpp/language-configuration.json b/extensions/cpp/language-configuration.json index a4f6c85aeabb..23d99a485e17 100644 --- a/extensions/cpp/language-configuration.json +++ b/extensions/cpp/language-configuration.json @@ -22,10 +22,6 @@ ["\"", "\""], ["'", "'"] ], - "indentationRules": { - "increaseIndentPattern": "^.*\\{[^}\"\\']*$|^.*\\([^\\)\"\\']*$|^\\s*(public|private|protected):\\s*$|^\\s*@(public|private|protected)\\s*$|^\\s*\\{\\}$", - "decreaseIndentPattern": "^\\s*(\\s*/[*].*[*]/\\s*)*\\}|^\\s*(\\s*/[*].*[*]/\\s*)*\\)|^\\s*(public|private|protected):\\s*$|^\\s*@(public|private|protected)\\s*$" - }, "folding": { "markers": { "start": "^\\s*#pragma\\s+region\\b", diff --git a/extensions/css/client/src/cssMain.ts b/extensions/css/client/src/cssMain.ts index 1f8095776ad2..19f131224eda 100644 --- a/extensions/css/client/src/cssMain.ts +++ b/extensions/css/client/src/cssMain.ts @@ -6,8 +6,8 @@ import * as path from 'path'; -import { languages, window, commands, ExtensionContext, TextDocument, ColorInformation, ColorPresentation, Color } from 'vscode'; -import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, TextEdit } from 'vscode-languageclient'; +import { languages, window, commands, ExtensionContext, TextDocument, ColorInformation, ColorPresentation, Color, Range, Position, CompletionItem, CompletionItemKind, TextEdit, SnippetString } from 'vscode'; +import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient'; import { ConfigurationFeature } from 'vscode-languageclient/lib/configuration.proposed'; import { DocumentColorRequest, DocumentColorParams, ColorPresentationRequest, ColorPresentationParams } from 'vscode-languageserver-protocol/lib/protocol.colorProvider.proposed'; @@ -104,6 +104,31 @@ export function activate(context: ExtensionContext) { indentationRules: indentationRules }); + const regionCompletionRegExpr = /^(\s*)(\/(\*\s*(#\w*)?)?)?/; + languages.registerCompletionItemProvider(documentSelector, { + provideCompletionItems(doc, pos) { + let lineUntilPos = doc.getText(new Range(new Position(pos.line, 0), pos)); + let match = lineUntilPos.match(regionCompletionRegExpr); + if (match) { + let range = new Range(new Position(pos.line, match[1].length), pos); + let beginProposal = new CompletionItem('#region', CompletionItemKind.Snippet); + beginProposal.range = range; TextEdit.replace(range, '/* #region */'); + beginProposal.insertText = new SnippetString('/* #region $1*/'); + beginProposal.documentation = localize('folding.start', 'Folding Region Start'); + beginProposal.filterText = match[2]; + beginProposal.sortText = 'za'; + let endProposal = new CompletionItem('#endregion', CompletionItemKind.Snippet); + endProposal.range = range; + endProposal.insertText = '/* #endregion */'; + endProposal.documentation = localize('folding.end', 'Folding Region End'); + endProposal.sortText = 'zb'; + endProposal.filterText = match[2]; + return [beginProposal, endProposal]; + } + return null; + } + }); + commands.registerCommand('_css.applyCodeAction', applyCodeAction); function applyCodeAction(uri: string, documentVersion: number, edits: TextEdit[]) { diff --git a/extensions/css/server/package.json b/extensions/css/server/package.json index 7915f24a7f65..5dd73152edc5 100644 --- a/extensions/css/server/package.json +++ b/extensions/css/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.1", + "vscode-css-languageservice": "^3.0.2", "vscode-languageserver": "^3.5.0" }, "devDependencies": { @@ -17,9 +17,9 @@ "scripts": { "compile": "gulp compile-extension:css-server", "watch": "gulp watch-extension:css-server", - "install-service-next": "npm install vscode-css-languageservice@next -f -S", - "install-service-local": "npm install ../../../../vscode-css-languageservice -f -S", - "install-server-next": "npm install vscode-languageserver@next -f -S", - "install-server-local": "npm install ../../../../vscode-languageserver-node/server -f -S" + "install-service-next": "yarn add vscode-css-languageservice@next", + "install-service-local": "npm install ../../../../vscode-css-languageservice -f", + "install-server-next": "yarn add vscode-languageserver@next", + "install-server-local": "npm install ../../../../vscode-languageserver-node/server -f" } } diff --git a/extensions/css/server/yarn.lock b/extensions/css/server/yarn.lock index 5826839458bb..24a54f0acdf0 100644 --- a/extensions/css/server/yarn.lock +++ b/extensions/css/server/yarn.lock @@ -6,9 +6,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.1.tgz#2fb8f33d959d289289154142e8c22ad501a0139b" +vscode-css-languageservice@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.2.tgz#ae0c43836318455aa290c777556394d6127b8f6c" dependencies: vscode-languageserver-types "3.5.0" vscode-nls "^2.0.1" diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 8dd6947b175c..84196a8b6583 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -159,6 +159,25 @@ "class" ], "description": "%emmetPreferencesFilterCommentTrigger%" + }, + "format.noIndentTags": { + "type": "array", + "default": [ + "html" + ], + "description": "%emmetPreferencesFormatNoIndentTags%" + }, + "format.forceIndentationForTags": { + "type": "array", + "default": [ + "body" + ], + "description": "%emmetPreferencesFormatForceIndentTags%" + }, + "profile.allowCompactBoolean": { + "type": "boolean", + "default": false, + "description": "%emmetPreferencesAllowCompactBoolean%" } } }, @@ -298,7 +317,7 @@ "@emmetio/html-matcher": "^0.3.1", "@emmetio/css-parser": "ramya-rao-a/css-parser#vscode", "@emmetio/math-expression": "^0.1.1", - "vscode-emmet-helper": "^1.1.17", + "vscode-emmet-helper": "^1.1.19", "vscode-languageserver-types": "^3.0.3", "image-size": "^0.5.2", "vscode-nls": "2.0.2" diff --git a/extensions/emmet/package.nls.json b/extensions/emmet/package.nls.json index 07ffacf4b448..52df8adca119 100644 --- a/extensions/emmet/package.nls.json +++ b/extensions/emmet/package.nls.json @@ -44,5 +44,8 @@ "emmetPreferencesBemModifierSeparator": "Modifier separator used for classes when using the BEM filter", "emmetPreferencesFilterCommentBefore": "A definition of comment that should be placed before matched element when comment filter is applied.", "emmetPreferencesFilterCommentAfter": "A definition of comment that should be placed after matched element when comment filter is applied.", - "emmetPreferencesFilterCommentTrigger": "A comma-separated list of attribute names that should exist in abbreviation for the comment filter to be applied" + "emmetPreferencesFilterCommentTrigger": "A comma-separated list of attribute names that should exist in abbreviation for the comment filter to be applied", + "emmetPreferencesFormatNoIndentTags": "An array of tag names that should not get inner indentation", + "emmetPreferencesFormatForceIndentTags": "An array of tag names that should always get inner indentation", + "emmetPreferencesAllowCompactBoolean": "If true, compact notation of boolean attributes are produced" } diff --git a/extensions/emmet/src/abbreviationActions.ts b/extensions/emmet/src/abbreviationActions.ts index caefcf492901..480699eafe1b 100644 --- a/extensions/emmet/src/abbreviationActions.ts +++ b/extensions/emmet/src/abbreviationActions.ts @@ -105,6 +105,11 @@ export function expandEmmetAbbreviation(args: any): Thenable -1) { + return fallbackTab(); + } } const syntax = getSyntaxFromArgs(args); if (!syntax) { @@ -176,7 +181,7 @@ export function expandEmmetAbbreviation(args: any): Thenable { /** * Checks if given position is a valid location to expand emmet abbreviation. * Works only on html and css/less/scss syntax + * @param document current Text Document * @param currentNode parsed node at given position * @param syntax syntax of the abbreviation * @param position position to validate + * @param abbreviationRange The range of the abbreviation for which given position is being validated */ -export function isValidLocationForEmmetAbbreviation(currentNode: Node | null, syntax: string, position: vscode.Position): boolean { - // Continue validation only if the file was parse-able and the currentNode has been found - if (!currentNode) { - return true; - } - +export function isValidLocationForEmmetAbbreviation(document: vscode.TextDocument, currentNode: Node | null, syntax: string, position: vscode.Position, abbreviationRange: vscode.Range): boolean { if (isStyleSheet(syntax)) { + // Continue validation only if the file was parse-able and the currentNode has been found + if (!currentNode) { + return true; + } + // If current node is a rule or at-rule, then perform additional checks to ensure // emmet suggestions are not provided in the rule selector if (currentNode.type !== 'rule' && currentNode.type !== 'at-rule') { @@ -242,13 +249,72 @@ export function isValidLocationForEmmetAbbreviation(currentNode: Node | null, sy return false; } + const startAngle = '<'; + const endAngle = '>'; + const escape = '\\'; const currentHtmlNode = currentNode; - if (currentHtmlNode.close) { + let start = new vscode.Position(0, 0); + + if (currentHtmlNode) { const innerRange = getInnerRange(currentHtmlNode); - return !!innerRange && innerRange.contains(position); + + // Fix for https://github.com/Microsoft/vscode/issues/28829 + if (!innerRange || !innerRange.contains(position)) { + return false; + } + + // Fix for https://github.com/Microsoft/vscode/issues/35128 + // Find the position up till where we will backtrack looking for unescaped < or > + // to decide if current position is valid for emmet expansion + start = innerRange.start; + let lastChildBeforePosition = currentHtmlNode.firstChild; + while (lastChildBeforePosition) { + if (lastChildBeforePosition.end.isAfter(position)) { + break; + } + start = lastChildBeforePosition.end; + lastChildBeforePosition = lastChildBeforePosition.nextSibling; + } + } + let textToBackTrack = document.getText(new vscode.Range(start.line, start.character, abbreviationRange.start.line, abbreviationRange.start.character)); + + // Worse case scenario is when cursor is inside a big chunk of text which needs to backtracked + // Backtrack only 500 offsets to ensure we dont waste time doing this + if (textToBackTrack.length > 500) { + textToBackTrack = textToBackTrack.substr(textToBackTrack.length - 500); } - return false; + if (!textToBackTrack.trim()) { + return true; + } + + let valid = true; + let foundSpace = false; // If < is found before finding whitespace, then its valid abbreviation. Eg: = 0) { + const char = textToBackTrack[i]; + i--; + if (!foundSpace && /\s/.test(char)) { + foundSpace = true; + continue; + } + if (char !== startAngle && char !== endAngle) { + continue; + } + if (i >= 0 && textToBackTrack[i] === escape) { + i--; + continue; + } + if (char === endAngle) { + break; + } + if (char === startAngle) { + valid = !foundSpace; + break; + } + } + + return valid; } /** @@ -343,9 +409,13 @@ function expandAbbr(input: ExpandAbbreviationInput): string | undefined { function getSyntaxFromArgs(args: Object): string | undefined { const mappedModes = getMappingForIncludedLanguages(); - let language: string = args['language']; - let parentMode: string = args['parentMode']; - let excludedLanguages = vscode.workspace.getConfiguration('emmet')['excludeLanguages'] ? vscode.workspace.getConfiguration('emmet')['excludeLanguages'] : []; + const language: string = args['language']; + const parentMode: string = args['parentMode']; + const excludedLanguages = vscode.workspace.getConfiguration('emmet')['excludeLanguages'] ? vscode.workspace.getConfiguration('emmet')['excludeLanguages'] : []; + if (excludedLanguages.indexOf(language) > -1) { + return; + } + let syntax = getEmmetMode((mappedModes[language] ? mappedModes[language] : language), excludedLanguages); if (!syntax) { syntax = getEmmetMode((mappedModes[parentMode] ? mappedModes[parentMode] : parentMode), excludedLanguages); diff --git a/extensions/emmet/src/defaultCompletionProvider.ts b/extensions/emmet/src/defaultCompletionProvider.ts index dc54fe1cbd80..7d331f575b72 100644 --- a/extensions/emmet/src/defaultCompletionProvider.ts +++ b/extensions/emmet/src/defaultCompletionProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { HtmlNode } from 'EmmetNode'; +import { HtmlNode, Node } from 'EmmetNode'; import { isValidLocationForEmmetAbbreviation } from './abbreviationActions'; import { getEmmetHelper, getNode, getInnerRange, getMappingForIncludedLanguages, parseDocument, getEmmetConfiguration, getEmmetMode, isStyleSheet } from './util'; @@ -13,17 +13,37 @@ const allowedMimeTypesInScriptTag = ['text/html', 'text/plain', 'text/x-template export class DefaultCompletionItemProvider implements vscode.CompletionItemProvider { public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable | undefined { - const mappedLanguages = getMappingForIncludedLanguages(); const emmetConfig = vscode.workspace.getConfiguration('emmet'); + const excludedLanguages = emmetConfig['excludeLanguages'] ? emmetConfig['excludeLanguages'] : []; + if (excludedLanguages.indexOf(document.languageId) > -1) { + return; + } - let isSyntaxMapped = mappedLanguages[document.languageId] ? true : false; - let excludedLanguages = emmetConfig['excludeLanguages'] ? emmetConfig['excludeLanguages'] : []; + const mappedLanguages = getMappingForIncludedLanguages(); + const isSyntaxMapped = mappedLanguages[document.languageId] ? true : false; let syntax = getEmmetMode((isSyntaxMapped ? mappedLanguages[document.languageId] : document.languageId), excludedLanguages); + const helper = getEmmetHelper(); + const extractAbbreviationResults = helper.extractAbbreviation(document, position); + if (!extractAbbreviationResults) { + return; + } + + // If document can be html/css parsed, validate syntax and location if (document.languageId === 'html' || isStyleSheet(document.languageId)) { - // Document can be html/css parsed - // Use syntaxHelper to parse file, validate location and update sytnax if needed - syntax = this.syntaxHelper(syntax, document, position); + const rootNode = parseDocument(document, false); + if (!rootNode) { + return; + } + + // Use syntaxHelper to update sytnax if needed + const currentNode = getNode(rootNode, position, true); + syntax = this.syntaxHelper(syntax, currentNode, position); + + // Validate location + if (!syntax || !isValidLocationForEmmetAbbreviation(document, currentNode, syntax, position, extractAbbreviationResults.abbreviationRange)) { + return; + } } if (!syntax @@ -32,23 +52,19 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi return; } - const helper = getEmmetHelper(); let noiseCheckPromise: Thenable = Promise.resolve(); // Fix for https://github.com/Microsoft/vscode/issues/32647 // Check for document symbols in js/ts/jsx/tsx and avoid triggering emmet for abbreviations of the form symbolName.sometext // Presence of > or * or + in the abbreviation denotes valid abbreviation that should trigger emmet if (!isStyleSheet(syntax) && (document.languageId === 'javascript' || document.languageId === 'javascriptreact' || document.languageId === 'typescript' || document.languageId === 'typescriptreact')) { - let extractAbbreviationResults = helper.extractAbbreviation(document, position); - if (extractAbbreviationResults) { - let abbreviation: string = extractAbbreviationResults.abbreviation; - if (abbreviation.startsWith('this.')) { - noiseCheckPromise = Promise.resolve(true); - } else { - noiseCheckPromise = vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', document.uri).then((symbols: vscode.SymbolInformation[] | undefined) => { - return symbols && symbols.find(x => abbreviation === x.name || (abbreviation.startsWith(x.name + '.') && !/>|\*|\+/.test(abbreviation))); - }); - } + let abbreviation: string = extractAbbreviationResults.abbreviation; + if (abbreviation.startsWith('this.')) { + noiseCheckPromise = Promise.resolve(true); + } else { + noiseCheckPromise = vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', document.uri).then((symbols: vscode.SymbolInformation[] | undefined) => { + return symbols && symbols.find(x => abbreviation === x.name || (abbreviation.startsWith(x.name + '.') && !/>|\*|\+/.test(abbreviation))); + }); } } @@ -85,21 +101,11 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi /** * Parses given document to check whether given position is valid for emmet abbreviation and returns appropriate syntax * @param syntax string language mode of current document - * @param document vscode.Textdocument + * @param currentNode node in the document that contains the position * @param position vscode.Position position of the abbreviation that needs to be expanded */ - private syntaxHelper(syntax: string | undefined, document: vscode.TextDocument, position: vscode.Position): string | undefined { - if (!syntax) { - return syntax; - } - let rootNode = parseDocument(document, false); - if (!rootNode) { - return; - } - - let currentNode = getNode(rootNode, position, true); - - if (!isStyleSheet(syntax)) { + private syntaxHelper(syntax: string | undefined, currentNode: Node | null, position: vscode.Position): string | undefined { + if (syntax && !isStyleSheet(syntax)) { const currentHtmlNode = currentNode; if (currentHtmlNode && currentHtmlNode.close) { const innerRange = getInnerRange(currentHtmlNode); @@ -118,9 +124,6 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi } } - if (!currentNode || !isValidLocationForEmmetAbbreviation(currentNode, syntax, position)) { - return; - } return syntax; } diff --git a/extensions/emmet/src/test/abbreviationAction.test.ts b/extensions/emmet/src/test/abbreviationAction.test.ts index 6a73b3db30da..101da90685c8 100644 --- a/extensions/emmet/src/test/abbreviationAction.test.ts +++ b/extensions/emmet/src/test/abbreviationAction.test.ts @@ -5,10 +5,12 @@ import 'mocha'; import * as assert from 'assert'; -import { Selection, workspace } from 'vscode'; +import { Selection, workspace, CompletionList, CancellationTokenSource, Position } from 'vscode'; import { withRandomFileEditor, closeAllEditors } from './testUtils'; import { expandEmmetAbbreviation, wrapWithAbbreviation, wrapIndividualLinesWithAbbreviation } from '../abbreviationActions'; +import { DefaultCompletionItemProvider } from '../defaultCompletionProvider'; +const completionProvider = new DefaultCompletionItemProvider(); const cssContents = ` .boo { margin: 20px 10px; @@ -40,7 +42,7 @@ const scssContents = ` p40 } } -` +`; const htmlContents = ` @@ -51,7 +53,7 @@ const htmlContents = ` ul>li*2 ul>li.item$*2 ul>li.item$@44*2 -
- - `; - const expectedContents = ` - - - - `; - return withRandomFileEditor(htmlWithCssContents, 'html', (editor, doc) => { - editor.selections = [ - new Selection(6, 50, 6, 50), - new Selection(9, 50, 9, 50), - new Selection(13, 50, 13, 50) - ]; + // test('update image size in css in html file with multiple cursors', () => { + // const htmlWithCssContents = ` + // + // + // + // `; + // const expectedContents = ` + // + // + // + // `; + // return withRandomFileEditor(htmlWithCssContents, 'html', (editor, doc) => { + // editor.selections = [ + // new Selection(6, 50, 6, 50), + // new Selection(9, 50, 9, 50), + // new Selection(13, 50, 13, 50) + // ]; - return updateImageSize()!.then(() => { - assert.equal(doc.getText(), expectedContents); - return Promise.resolve(); - }); - }); - }); + // return updateImageSize()!.then(() => { + // assert.equal(doc.getText(), expectedContents); + // return Promise.resolve(); + // }); + // }); + // }); - test('update image size in img tag in html file with multiple cursors', () => { - const htmlwithimgtag = ` - - - - - - `; - const expectedContents = ` - - - - - - `; - return withRandomFileEditor(htmlwithimgtag, 'html', (editor, doc) => { - editor.selections = [ - new Selection(2, 50, 2, 50), - new Selection(3, 50, 3, 50), - new Selection(4, 50, 4, 50) - ]; + // test('update image size in img tag in html file with multiple cursors', () => { + // const htmlwithimgtag = ` + // + // + // + // + // + // `; + // const expectedContents = ` + // + // + // + // + // + // `; + // return withRandomFileEditor(htmlwithimgtag, 'html', (editor, doc) => { + // editor.selections = [ + // new Selection(2, 50, 2, 50), + // new Selection(3, 50, 3, 50), + // new Selection(4, 50, 4, 50) + // ]; - return updateImageSize()!.then(() => { - assert.equal(doc.getText(), expectedContents); - return Promise.resolve(); - }); - }); - }); + // return updateImageSize()!.then(() => { + // assert.equal(doc.getText(), expectedContents); + // return Promise.resolve(); + // }); + // }); + // }); -}); +// }); diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock index d09eea35b1c8..8d8874a062d9 100644 --- a/extensions/emmet/yarn.lock +++ b/extensions/emmet/yarn.lock @@ -2048,9 +2048,9 @@ vinyl@~2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vscode-emmet-helper@^1.1.17: - version "1.1.17" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.17.tgz#40eb2955257d27472a6e8d542d70cfa3d247077e" +vscode-emmet-helper@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.19.tgz#e5b607076171555c6be3655a8eb11c17f980b2dd" dependencies: "@emmetio/extract-abbreviation" "^0.1.1" vscode-languageserver-types "^3.0.3" diff --git a/extensions/git/package.json b/extensions/git/package.json index 9e6bdb1f56de..65d4faf08a1d 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -234,6 +234,11 @@ "title": "%command.createTag%", "category": "Git" }, + { + "command": "git.fetch", + "title": "%command.fetch%", + "category": "Git" + }, { "command": "git.pull", "title": "%command.pull%", @@ -320,33 +325,37 @@ "command": "git.init", "when": "config.git.enabled" }, + { + "command": "git.close", + "when": "gitOpenRepositoryCount != 0" + }, { "command": "git.refresh", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.openFile", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.openHEADFile", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.openChange", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.stage", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.stageAll", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.stageSelectedRanges", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.stageChange", @@ -354,7 +363,7 @@ }, { "command": "git.revertSelectedRanges", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.revertChange", @@ -362,396 +371,404 @@ }, { "command": "git.unstage", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.unstageAll", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.unstageSelectedRanges", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.clean", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.cleanAll", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.commit", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.commitStaged", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.commitStagedSigned", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.commitStagedAmend", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.commitAll", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.commitAllSigned", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.commitAllAmend", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.undoCommit", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.checkout", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.branch", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.deleteBranch", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.renameBranch", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.pull", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.pullFrom", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.pullRebase", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.pullFrom", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.merge", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.createTag", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" + }, + { + "command": "git.fetch", + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.push", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.pushTo", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.pushWithTags", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.sync", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.syncRebase", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.publish", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.showOutput", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.ignore", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" + }, + { + "command": "git.stashIncludeUntracked", + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.stash", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.stashPop", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" }, { "command": "git.stashPopLatest", - "when": "config.git.enabled && gitOpenRepositoryCount != 0" + "when": "gitOpenRepositoryCount != 0" } ], "scm/title": [ { "command": "git.init", "group": "navigation", - "when": "config.git.enabled && !scmProvider && gitOpenRepositoryCount == 0" + "when": "config.git.enabled && !scmProvider && gitOpenRepositoryCount == 0 && workspaceFolderCount != 0" }, { "command": "git.commit", "group": "navigation", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.refresh", "group": "navigation", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.sync", "group": "1_sync", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.syncRebase", "group": "1_sync", - "when": "config.git.enabled && scmProvider == git && gitState == idle" + "when": "scmProvider == git && gitState == idle" }, { "command": "git.pull", "group": "1_sync", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.pullRebase", "group": "1_sync", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.pullFrom", "group": "1_sync", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.push", "group": "1_sync", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.pushTo", "group": "1_sync", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.publish", "group": "2_publish", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.commitStaged", "group": "3_commit", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.commitStagedSigned", "group": "3_commit", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.commitStagedAmend", "group": "3_commit", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.commitAll", "group": "3_commit", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.commitAllSigned", "group": "3_commit", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.commitAllAmend", "group": "3_commit", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.undoCommit", "group": "3_commit", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.stageAll", "group": "4_stage", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.unstageAll", "group": "4_stage", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.cleanAll", "group": "4_stage", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.stashIncludeUntracked", "group": "5_stash", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.stash", "group": "5_stash", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.stashPop", "group": "5_stash", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.stashPopLatest", "group": "5_stash", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" }, { "command": "git.showOutput", "group": "7_repository", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" } ], "scm/sourceControl": [ { "command": "git.close", "group": "navigation", - "when": "config.git.enabled && scmProvider == git" + "when": "scmProvider == git" } ], "scm/resourceGroup/context": [ { "command": "git.stageAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == merge", + "when": "scmProvider == git && scmResourceGroup == merge", "group": "1_modification" }, { "command": "git.stageAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == merge", + "when": "scmProvider == git && scmResourceGroup == merge", "group": "inline" }, { "command": "git.unstageAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == index", + "when": "scmProvider == git && scmResourceGroup == index", "group": "1_modification" }, { "command": "git.unstageAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == index", + "when": "scmProvider == git && scmResourceGroup == index", "group": "inline" }, { "command": "git.cleanAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "1_modification" }, { "command": "git.stageAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "1_modification" }, { "command": "git.cleanAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "inline" }, { "command": "git.stageAll", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "inline" } ], "scm/resourceState/context": [ { "command": "git.stage", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == merge", + "when": "scmProvider == git && scmResourceGroup == merge", "group": "1_modification" }, { "command": "git.stage", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == merge", + "when": "scmProvider == git && scmResourceGroup == merge", "group": "inline" }, { "command": "git.openChange", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == index", + "when": "scmProvider == git && scmResourceGroup == index", "group": "navigation" }, { "command": "git.openFile", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == index", + "when": "scmProvider == git && scmResourceGroup == index", "group": "navigation" }, { "command": "git.openHEADFile", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == index", + "when": "scmProvider == git && scmResourceGroup == index", "group": "navigation" }, { "command": "git.unstage", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == index", + "when": "scmProvider == git && scmResourceGroup == index", "group": "1_modification" }, { "command": "git.unstage", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == index", + "when": "scmProvider == git && scmResourceGroup == index", "group": "inline" }, { "command": "git.openChange", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "navigation" }, { "command": "git.openHEADFile", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "navigation" }, { "command": "git.openFile", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "navigation" }, { "command": "git.stage", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "1_modification" }, { "command": "git.clean", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "1_modification" }, { "command": "git.clean", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "inline" }, { "command": "git.stage", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "inline" }, { "command": "git.ignore", - "when": "config.git.enabled && scmProvider == git && scmResourceGroup == workingTree", + "when": "scmProvider == git && scmResourceGroup == workingTree", "group": "1_modification@3" } ], @@ -759,37 +776,37 @@ { "command": "git.openFile", "group": "navigation", - "when": "config.git.enabled && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != extension && resourceScheme != merge-conflict.conflict-diff" + "when": "gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != extension && resourceScheme != merge-conflict.conflict-diff" }, { "command": "git.openChange", "group": "navigation", - "when": "config.git.enabled && gitOpenRepositoryCount != 0 && !isInDiffEditor && resourceScheme == file" + "when": "gitOpenRepositoryCount != 0 && !isInDiffEditor && resourceScheme == file" }, { "command": "git.stageSelectedRanges", "group": "2_git@1", - "when": "config.git.enabled && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != merge-conflict.conflict-diff" + "when": "gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != merge-conflict.conflict-diff" }, { "command": "git.unstageSelectedRanges", "group": "2_git@2", - "when": "config.git.enabled && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != merge-conflict.conflict-diff" + "when": "gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != merge-conflict.conflict-diff" }, { "command": "git.revertSelectedRanges", "group": "2_git@3", - "when": "config.git.enabled && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != merge-conflict.conflict-diff" + "when": "gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme != merge-conflict.conflict-diff" } ], "scm/change/title": [ { "command": "git.stageChange", - "when": "config.git.enabled && originalResourceScheme == git" + "when": "originalResourceScheme == git" }, { "command": "git.revertChange", - "when": "config.git.enabled && originalResourceScheme == git" + "when": "originalResourceScheme == git" } ] }, @@ -798,6 +815,7 @@ "properties": { "git.enabled": { "type": "boolean", + "scope": "resource", "description": "%config.enabled%", "default": true }, @@ -810,6 +828,11 @@ "default": null, "isExecutable": true }, + "git.autoRepositoryDetection": { + "type": "boolean", + "description": "%config.autoRepositoryDetection%", + "default": true + }, "git.autorefresh": { "type": "boolean", "description": "%config.autorefresh%", @@ -818,7 +841,7 @@ "git.autofetch": { "type": "boolean", "description": "%config.autofetch%", - "default": true + "default": false }, "git.confirmSync": { "type": "boolean", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 4f6d0fe91f5b..542740ef483e 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -31,6 +31,7 @@ "command.renameBranch": "Rename Branch...", "command.merge": "Merge Branch...", "command.createTag": "Create Tag", + "command.fetch": "Fetch", "command.pull": "Pull", "command.pullRebase": "Pull (Rebase)", "command.pullFrom": "Pull from...", @@ -48,6 +49,7 @@ "command.stashPopLatest": "Pop Latest Stash", "config.enabled": "Whether git is enabled", "config.path": "Path to the git executable", + "config.autoRepositoryDetection": "Whether repositories should be automatically detected", "config.autorefresh": "Whether auto refreshing is enabled", "config.autofetch": "Whether auto fetching is enabled", "config.enableLongCommitWarning": "Whether long commit messages should be warned about", diff --git a/extensions/git/resources/icons/dark/clean.svg b/extensions/git/resources/icons/dark/clean.svg index 9f1756333891..3770d63d5f9a 100644 --- a/extensions/git/resources/icons/dark/clean.svg +++ b/extensions/git/resources/icons/dark/clean.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/extensions/git/resources/icons/light/clean.svg b/extensions/git/resources/icons/light/clean.svg index 1fa6ba48a19e..f86ec7d627dc 100644 --- a/extensions/git/resources/icons/light/clean.svg +++ b/extensions/git/resources/icons/light/clean.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/extensions/git/src/api.ts b/extensions/git/src/api.ts new file mode 100644 index 000000000000..4e569a8e8842 --- /dev/null +++ b/extensions/git/src/api.ts @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { Model } from './model'; +import { SourceControlInputBox, Uri } from 'vscode'; + +export interface InputBox { + value: string; +} + +export interface Repository { + readonly rootUri: Uri; + readonly inputBox: InputBox; +} + +export interface API { + getRepositories(): Promise; +} + +export function createApi(modelPromise: Promise) { + return { + async getRepositories(): Promise { + const model = await modelPromise; + + return model.repositories.map(repository => ({ + rootUri: Uri.file(repository.root), + inputBox: { + set value(value: string) { + repository.inputBox.value = value; + }, + get value(): string { + return repository.inputBox.value; + } + } + })); + } + }; +} \ No newline at end of file diff --git a/extensions/git/src/autofetch.ts b/extensions/git/src/autofetch.ts index 741188de75d7..cb8e054e90a1 100644 --- a/extensions/git/src/autofetch.ts +++ b/extensions/git/src/autofetch.ts @@ -5,14 +5,22 @@ 'use strict'; -import { workspace, Disposable, EventEmitter } from 'vscode'; +import { workspace, Disposable, EventEmitter, Memento, window, MessageItem, ConfigurationTarget } from 'vscode'; import { GitErrorCodes } from './git'; -import { Repository } from './repository'; -import { eventToPromise, filterEvent } from './util'; +import { Repository, Operation } from './repository'; +import { eventToPromise, filterEvent, onceEvent } from './util'; +import * as nls from 'vscode-nls'; + +const localize = nls.loadMessageBundle(); + +function isRemoteOperation(operation: Operation): boolean { + return operation === Operation.Pull || operation === Operation.Push || operation === Operation.Sync || operation === Operation.Fetch; +} export class AutoFetcher { private static readonly Period = 3 * 60 * 1000 /* three minutes */; + private static DidInformUser = 'autofetch.didInformUser'; private _onDidChange = new EventEmitter(); private onDidChange = this._onDidChange.event; @@ -23,9 +31,43 @@ export class AutoFetcher { private disposables: Disposable[] = []; - constructor(private repository: Repository) { + constructor(private repository: Repository, private globalState: Memento) { workspace.onDidChangeConfiguration(this.onConfiguration, this, this.disposables); this.onConfiguration(); + + const onGoodRemoteOperation = filterEvent(repository.onDidRunOperation, ({ operation, error }) => !error && isRemoteOperation(operation)); + const onFirstGoodRemoteOperation = onceEvent(onGoodRemoteOperation); + onFirstGoodRemoteOperation(this.onFirstGoodRemoteOperation, this, this.disposables); + } + + private async onFirstGoodRemoteOperation(): Promise { + const didInformUser = !this.globalState.get(AutoFetcher.DidInformUser); + + if (this.enabled && !didInformUser) { + this.globalState.update(AutoFetcher.DidInformUser, true); + } + + const shouldInformUser = !this.enabled && didInformUser; + + if (!shouldInformUser) { + return; + } + + const yes: MessageItem = { title: localize('yes', "Yes") }; + const no: MessageItem = { isCloseAffordance: true, title: localize('no', "No") }; + const askLater: MessageItem = { title: localize('not now', "Not Now") }; + const result = await window.showInformationMessage(localize('suggest auto fetch', "Would you like to enable auto fetching of Git repositories?"), yes, no, askLater); + + if (result === askLater) { + return; + } + + if (result === yes) { + const gitConfig = workspace.getConfiguration('git'); + gitConfig.update('autofetch', true, ConfigurationTarget.Global); + } + + this.globalState.update(AutoFetcher.DidInformUser, true); } private onConfiguration(): void { diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 57a1701510e4..cdc048a12344 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -207,30 +207,31 @@ export class CommandCenter { } try { - if (ref === '~') { + let gitRef = ref; + + if (gitRef === '~') { const uriString = uri.toString(); const [indexStatus] = repository.indexGroup.resourceStates.filter(r => r.resourceUri.toString() === uriString); - ref = indexStatus ? '' : 'HEAD'; - } - - const { size, object } = await repository.lstree(ref, uri.fsPath); - - if (size > 1000000) { // 1 MB - return Uri.parse(`data:;label:${path.basename(uri.fsPath)};description:${ref},`); + gitRef = indexStatus ? '' : 'HEAD'; } + const { size, object } = await repository.lstree(gitRef, uri.fsPath); const { mimetype, encoding } = await repository.detectObjectType(object); if (mimetype === 'text/plain') { return toGitUri(uri, ref); } - if (ImageMimetypes.indexOf(mimetype) > -1) { - const contents = await repository.buffer(ref, uri.fsPath); - return Uri.parse(`data:${mimetype};label:${path.basename(uri.fsPath)};description:${ref};size:${size};base64,${contents.toString('base64')}`); + if (size > 1000000) { // 1 MB + return Uri.parse(`data:;label:${path.basename(uri.fsPath)};description:${gitRef},`); } - return Uri.parse(`data:;label:${path.basename(uri.fsPath)};description:${ref},`); + if (ImageMimetypes.indexOf(mimetype) > -1) { + const contents = await repository.buffer(gitRef, uri.fsPath); + return Uri.parse(`data:${mimetype};label:${path.basename(uri.fsPath)};description:${gitRef};size:${size};base64,${contents.toString('base64')}`); + } + + return Uri.parse(`data:;label:${path.basename(uri.fsPath)};description:${gitRef},`); } catch (err) { return toGitUri(uri, ref); @@ -407,35 +408,52 @@ export class CommandCenter { @command('git.init') async init(): Promise { - const homeUri = Uri.file(os.homedir()); - const defaultUri = workspace.workspaceFolders && workspace.workspaceFolders.length > 0 - ? Uri.file(workspace.workspaceFolders[0].uri.fsPath) - : homeUri; + let path: string | undefined; - const result = await window.showOpenDialog({ - canSelectFiles: false, - canSelectFolders: true, - canSelectMany: false, - defaultUri, - openLabel: localize('init repo', "Initialize Repository") - }); + if (workspace.workspaceFolders && workspace.workspaceFolders.length > 1) { + const placeHolder = localize('init', "Pick workspace folder to initialize git repo in"); + const items = workspace.workspaceFolders.map(folder => ({ label: folder.name, description: folder.uri.fsPath, folder })); + const item = await window.showQuickPick(items, { placeHolder, ignoreFocusOut: true }); - if (!result || result.length === 0) { - return; - } - - const uri = result[0]; - - if (homeUri.toString().startsWith(uri.toString())) { - const yes = localize('create repo', "Initialize Repository"); - const answer = await window.showWarningMessage(localize('are you sure', "This will create a Git repository in '{0}'. Are you sure you want to continue?", uri.fsPath), yes); - - if (answer !== yes) { + if (!item) { return; } + + path = item.folder.uri.fsPath; + } + + if (!path) { + const homeUri = Uri.file(os.homedir()); + const defaultUri = workspace.workspaceFolders && workspace.workspaceFolders.length > 0 + ? Uri.file(workspace.workspaceFolders[0].uri.fsPath) + : homeUri; + + const result = await window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + defaultUri, + openLabel: localize('init repo', "Initialize Repository") + }); + + if (!result || result.length === 0) { + return; + } + + const uri = result[0]; + + if (homeUri.toString().startsWith(uri.toString())) { + const yes = localize('create repo', "Initialize Repository"); + const answer = await window.showWarningMessage(localize('are you sure', "This will create a Git repository in '{0}'. Are you sure you want to continue?", uri.fsPath), yes); + + if (answer !== yes) { + return; + } + } + + path = uri.fsPath; } - const path = uri.fsPath; await this.git.init(path); await this.model.tryOpenRepository(path); } @@ -945,6 +963,8 @@ export class CommandCenter { if (!opts) { opts = { all: noStagedChanges }; + } else if (!opts.all && noStagedChanges) { + opts = { ...opts, all: true }; } // enable signing of commits if configurated @@ -978,8 +998,21 @@ export class CommandCenter { return message; } + let value: string | undefined = undefined; + + if (opts && opts.amend && repository.HEAD && repository.HEAD.commit) { + value = (await repository.getCommit(repository.HEAD.commit)).message; + } + + const getPreviousCommitMessage = async () => { + //Only return the previous commit message if it's an amend commit and the repo already has a commit + if (opts && opts.amend && repository.HEAD && repository.HEAD.commit) { + return (await repository.getCommit('HEAD')).message; + } + }; + return await window.showInputBox({ - value: opts && opts.defaultMsg, + value, placeHolder: localize('commit message', "Commit message"), prompt: localize('provide commit message', "Please provide a commit message"), ignoreFocusOut: true @@ -1023,15 +1056,7 @@ export class CommandCenter { @command('git.commitStagedAmend', { repository: true }) async commitStagedAmend(repository: Repository): Promise { - let msg; - if (repository.HEAD) { - if (repository.HEAD.commit) { - let id = repository.HEAD.commit; - let commit = await repository.getCommit(id); - msg = commit.message; - } - } - await this.commitWithAnyInput(repository, { all: false, amend: true, defaultMsg: msg }); + await this.commitWithAnyInput(repository, { all: false, amend: true }); } @command('git.commitAll', { repository: true }) @@ -1230,6 +1255,16 @@ export class CommandCenter { await repository.tag(name, message); } + @command('git.fetch', { repository: true }) + async fetch(repository: Repository): Promise { + if (repository.remotes.length === 0) { + window.showWarningMessage(localize('no remotes to fetch', "This repository has no remotes configured to fetch from.")); + return; + } + + await repository.fetch(); + } + @command('git.pullFrom', { repository: true }) async pullFrom(repository: Repository): Promise { const remotes = repository.remotes; @@ -1437,7 +1472,10 @@ export class CommandCenter { } private async _stash(repository: Repository, includeUntracked = false): Promise { - if (repository.workingTreeGroup.resourceStates.length === 0) { + const noUnstagedChanges = repository.workingTreeGroup.resourceStates.length === 0; + const noStagedChanges = repository.indexGroup.resourceStates.length === 0; + + if (noUnstagedChanges && noStagedChanges) { window.showInformationMessage(localize('no changes stash', "There are no changes to stash.")); return; } @@ -1543,7 +1581,7 @@ export class CommandCenter { message = localize('clean repo', "Please clean your repository working tree before checkout."); break; case GitErrorCodes.PushRejected: - message = localize('cant push', "Can't push refs to remote. Run 'Pull' first to integrate your changes."); + message = localize('cant push', "Can't push refs to remote. Try running 'Pull' first to integrate your changes."); break; default: const hint = (err.stderr || err.message || String(err)) diff --git a/extensions/git/src/contentProvider.ts b/extensions/git/src/contentProvider.ts index d7bd26dffc2d..9ab283dcd1e2 100644 --- a/extensions/git/src/contentProvider.ts +++ b/extensions/git/src/contentProvider.ts @@ -9,7 +9,7 @@ import { workspace, Uri, Disposable, Event, EventEmitter, window } from 'vscode' import { debounce, throttle } from './decorators'; import { fromGitUri, toGitUri } from './uri'; import { Model, ModelChangeEvent, OriginalResourceChangeEvent } from './model'; -import { filterEvent, eventToPromise } from './util'; +import { filterEvent, eventToPromise, isDescendant } from './util'; interface CacheRow { uri: Uri; @@ -72,7 +72,7 @@ export class GitContentProvider { const fsPath = uri.fsPath; for (const root of this.changedRepositoryRoots) { - if (fsPath.startsWith(root)) { + if (isDescendant(root, fsPath)) { this._onDidChange.fire(uri); return; } diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index dcd1077819ee..fc068efd8c4c 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -6,7 +6,7 @@ 'use strict'; import { window, workspace, Uri, Disposable, Event, EventEmitter, DecorationData, DecorationProvider, ThemeColor } from 'vscode'; -import { Repository, GitResourceGroup } from './repository'; +import { Repository, GitResourceGroup, Status } from './repository'; import { Model } from './model'; import { debounce } from './decorators'; import { filterEvent } from './util'; @@ -74,34 +74,28 @@ class GitDecorationProvider implements DecorationProvider { constructor(private repository: Repository) { this.disposables.push( window.registerDecorationProvider(this), - repository.onDidRunOperation(this.onDidRunOperation, this) + repository.onDidRunGitStatus(this.onDidRunGitStatus, this) ); } - private onDidRunOperation(): void { + private onDidRunGitStatus(): void { let newDecorations = new Map(); this.collectDecorationData(this.repository.indexGroup, newDecorations); this.collectDecorationData(this.repository.workingTreeGroup, newDecorations); this.collectDecorationData(this.repository.mergeGroup, newDecorations); - let uris: Uri[] = []; - newDecorations.forEach((value, uriString) => { - if (this.decorations.has(uriString)) { - this.decorations.delete(uriString); - } else { - uris.push(Uri.parse(uriString)); - } - }); - this.decorations.forEach((value, uriString) => { - uris.push(Uri.parse(uriString)); - }); + const uris = new Set([...this.decorations.keys()].concat([...newDecorations.keys()])); this.decorations = newDecorations; - this._onDidChangeDecorations.fire(uris); + this._onDidChangeDecorations.fire([...uris.values()].map(Uri.parse)); } private collectDecorationData(group: GitResourceGroup, bucket: Map): void { group.resourceStates.forEach(r => { - if (r.resourceDecoration) { + if (r.resourceDecoration + && r.type !== Status.DELETED + && r.type !== Status.INDEX_DELETED + ) { + // not deleted and has a decoration bucket.set(r.original.toString(), r.resourceDecoration); } }); diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index c85ab5551c9e..17e6cd299422 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -977,7 +977,7 @@ export class Repository { try { const args = ['stash', 'pop']; - if (typeof index === 'string') { + if (typeof index === 'number') { args.push(`stash@{${index}}`); } @@ -1017,12 +1017,12 @@ export class Repository { const onStdoutData = (raw: string) => { parser.update(raw); - if (parser.status.length > 5000) { + if (parser.status.length > limit) { child.removeListener('exit', onExit); child.stdout.removeListener('data', onStdoutData); child.kill(); - c({ status: parser.status.slice(0, 5000), didHitLimit: true }); + c({ status: parser.status.slice(0, limit), didHitLimit: true }); } }; diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index b9bc3aedcd3e..d3e07cd4da08 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -16,20 +16,19 @@ import { GitDecorations } from './decorationProvider'; import { Askpass } from './askpass'; import { toDisposable } from './util'; import TelemetryReporter from 'vscode-extension-telemetry'; +import { API, createApi } from './api'; -async function init(context: ExtensionContext, outputChannel: OutputChannel, disposables: Disposable[]): Promise { +async function init(context: ExtensionContext, outputChannel: OutputChannel, disposables: Disposable[]): Promise { const { name, version, aiKey } = require(context.asAbsolutePath('./package.json')) as { name: string, version: string, aiKey: string }; const telemetryReporter: TelemetryReporter = new TelemetryReporter(name, version, aiKey); disposables.push(telemetryReporter); - const config = workspace.getConfiguration('git'); - const enabled = config.get('enabled') === true; const pathHint = workspace.getConfiguration('git').get('path'); const info = await findGit(pathHint, path => outputChannel.appendLine(localize('looking', "Looking for git in: {0}", path))); const askpass = new Askpass(); const env = await askpass.getEnv(); const git = new Git({ gitPath: info.path, version: info.version, env }); - const model = new Model(git); + const model = new Model(git, context.globalState); disposables.push(model); const onRepository = () => commands.executeCommand('setContext', 'gitOpenRepositoryCount', `${model.repositories.length}`); @@ -37,12 +36,6 @@ async function init(context: ExtensionContext, outputChannel: OutputChannel, dis model.onDidCloseRepository(onRepository, null, disposables); onRepository(); - if (!enabled) { - const commandCenter = new CommandCenter(git, model, outputChannel, telemetryReporter); - disposables.push(commandCenter); - return; - } - outputChannel.appendLine(localize('using git', "Using git {0} from {1}", info.version, info.path)); const onOutput = (str: string) => outputChannel.append(str); @@ -56,24 +49,22 @@ async function init(context: ExtensionContext, outputChannel: OutputChannel, dis ); await checkGitVersion(info); + + return model; } -async function _activate(context: ExtensionContext, disposables: Disposable[]): Promise { +async function _activate(context: ExtensionContext, disposables: Disposable[]): Promise { const outputChannel = window.createOutputChannel('Git'); commands.registerCommand('git.showOutput', () => outputChannel.show()); disposables.push(outputChannel); try { - await init(context, outputChannel, disposables); + return await init(context, outputChannel, disposables); } catch (err) { if (!/Git installation not found/.test(err.message || '')) { throw err; } - console.warn(err.message); - outputChannel.appendLine(err.message); - outputChannel.show(); - const config = workspace.getConfiguration('git'); const shouldIgnore = config.get('ignoreMissingGitWarning') === true; @@ -81,6 +72,10 @@ async function _activate(context: ExtensionContext, disposables: Disposable[]): return; } + console.warn(err.message); + outputChannel.appendLine(err.message); + outputChannel.show(); + const download = localize('downloadgit', "Download Git"); const neverShowAgain = localize('neverShowAgain', "Don't show again"); const choice = await window.showWarningMessage( @@ -97,12 +92,15 @@ async function _activate(context: ExtensionContext, disposables: Disposable[]): } } -export function activate(context: ExtensionContext): any { +export function activate(context: ExtensionContext): API { const disposables: Disposable[] = []; context.subscriptions.push(new Disposable(() => Disposable.from(...disposables).dispose())); - _activate(context, disposables) - .catch(err => console.error(err)); + const activatePromise = _activate(context, disposables); + const modelPromise = activatePromise.then(model => model || Promise.reject('Git model not found')); + activatePromise.catch(err => console.error(err)); + + return createApi(modelPromise); } async function checkGitVersion(info: IGit): Promise { diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index be87561ae9ac..e22242329e72 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -5,10 +5,10 @@ 'use strict'; -import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor } from 'vscode'; +import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor, Memento, ConfigurationChangeEvent } from 'vscode'; import { Repository, RepositoryState } from './repository'; import { memoize, sequentialize, debounce } from './decorators'; -import { dispose, anyEvent, filterEvent } from './util'; +import { dispose, anyEvent, filterEvent, IDisposable, isDescendant } from './util'; import { Git, GitErrorCodes } from './git'; import * as path from 'path'; import * as fs from 'fs'; @@ -44,10 +44,6 @@ interface OpenRepository extends Disposable { repository: Repository; } -function isParent(parent: string, child: string): boolean { - return child.startsWith(parent); -} - export class Model { private _onDidOpenRepository = new EventEmitter(); @@ -67,45 +63,17 @@ export class Model { private possibleGitRepositoryPaths = new Set(); - private enabled = false; - private configurationChangeDisposable: Disposable; private disposables: Disposable[] = []; - constructor(private git: Git) { - const config = workspace.getConfiguration('git'); - this.enabled = config.get('enabled') === true; - - this.configurationChangeDisposable = workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this); - - if (this.enabled) { - this.enable(); - } - } - - private onDidChangeConfiguration(): void { - const config = workspace.getConfiguration('git'); - const enabled = config.get('enabled') === true; - - if (enabled === this.enabled) { - return; - } - - this.enabled = enabled; - - if (enabled) { - this.enable(); - } else { - this.disable(); - } - } - - private enable(): void { + constructor(private git: Git, private globalState: Memento) { workspace.onDidChangeWorkspaceFolders(this.onDidChangeWorkspaceFolders, this, this.disposables); this.onDidChangeWorkspaceFolders({ added: workspace.workspaceFolders || [], removed: [] }); window.onDidChangeVisibleTextEditors(this.onDidChangeVisibleTextEditors, this, this.disposables); this.onDidChangeVisibleTextEditors(window.visibleTextEditors); + workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this, this.disposables); + const fsWatcher = workspace.createFileSystemWatcher('**'); this.disposables.push(fsWatcher); @@ -117,15 +85,6 @@ export class Model { this.scanWorkspaceFolders(); } - private disable(): void { - const openRepositories = [...this.openRepositories]; - openRepositories.forEach(r => r.dispose()); - this.openRepositories = []; - - this.possibleGitRepositoryPaths.clear(); - this.disposables = dispose(this.disposables); - } - /** * Scans the first level of each workspace folder, looking * for git repositories. @@ -169,13 +128,34 @@ export class Model { .map(folder => this.getOpenRepository(folder.uri)) .filter(r => !!r) .filter(r => !activeRepositories.has(r!.repository)) - .filter(r => !(workspace.workspaceFolders || []).some(f => isParent(f.uri.fsPath, r!.repository.root))) as OpenRepository[]; + .filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[]; + + possibleRepositoryFolders.forEach(p => this.tryOpenRepository(p.uri.fsPath)); + openRepositoriesToDispose.forEach(r => r.dispose()); + } + + private onDidChangeConfiguration(): void { + const possibleRepositoryFolders = (workspace.workspaceFolders || []) + .filter(folder => workspace.getConfiguration('git', folder.uri).get('enabled') === true) + .filter(folder => !this.getOpenRepository(folder.uri)); + + const openRepositoriesToDispose = this.openRepositories + .map(repository => ({ repository, root: Uri.file(repository.repository.root) })) + .filter(({ root }) => workspace.getConfiguration('git', root).get('enabled') !== true) + .map(({ repository }) => repository); possibleRepositoryFolders.forEach(p => this.tryOpenRepository(p.uri.fsPath)); openRepositoriesToDispose.forEach(r => r.dispose()); } private onDidChangeVisibleTextEditors(editors: TextEditor[]): void { + const config = workspace.getConfiguration('git'); + const enabled = config.get('autoRepositoryDetection') === true; + + if (!enabled) { + return; + } + editors.forEach(editor => { const uri = editor.document.uri; @@ -199,6 +179,13 @@ export class Model { return; } + const config = workspace.getConfiguration('git', Uri.file(path)); + const enabled = config.get('enabled') === true; + + if (!enabled) { + return; + } + try { const repositoryRoot = await this.git.getRepositoryRoot(path); @@ -209,7 +196,7 @@ export class Model { return; } - const repository = new Repository(this.git.open(repositoryRoot)); + const repository = new Repository(this.git.open(repositoryRoot), this.globalState); this.open(repository); } catch (err) { @@ -297,7 +284,7 @@ export class Model { for (const liveRepository of this.openRepositories) { const relativePath = path.relative(liveRepository.repository.root, resourcePath); - if (!/^\.\./.test(relativePath)) { + if (isDescendant(liveRepository.repository.root, resourcePath)) { return liveRepository; } } @@ -321,7 +308,11 @@ export class Model { } dispose(): void { - this.disable(); - this.configurationChangeDisposable.dispose(); + const openRepositories = [...this.openRepositories]; + openRepositories.forEach(r => r.dispose()); + this.openRepositories = []; + + this.possibleGitRepositoryPaths.clear(); + this.disposables = dispose(this.disposables); } } \ No newline at end of file diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 93e8386e4401..098ee2bd9547 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -5,9 +5,9 @@ 'use strict'; -import { Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData } from 'vscode'; +import { Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData, Memento } from 'vscode'; import { Repository as BaseRepository, Ref, Branch, Remote, Commit, GitErrorCodes, Stash, RefType, GitError } from './git'; -import { anyEvent, filterEvent, eventToPromise, dispose, find } from './util'; +import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant } from './util'; import { memoize, throttle, debounce } from './decorators'; import { toGitUri } from './uri'; import { AutoFetcher } from './autofetch'; @@ -171,10 +171,8 @@ export class Resource implements SourceControlResourceState { } get decorations(): SourceControlResourceDecorations { - // TODO@joh, still requires restart/redraw in the SCM viewlet - const decorations = workspace.getConfiguration().get('git.decorations.enabled'); - const light = !decorations ? { iconPath: this.getIconPath('light') } : undefined; - const dark = !decorations ? { iconPath: this.getIconPath('dark') } : undefined; + const light = this._useIcons ? { iconPath: this.getIconPath('light') } : undefined; + const dark = this._useIcons ? { iconPath: this.getIconPath('dark') } : undefined; const tooltip = this.tooltip; const strikeThrough = this.strikeThrough; const faded = this.faded; @@ -275,6 +273,7 @@ export class Resource implements SourceControlResourceState { private _resourceGroupType: ResourceGroupType, private _resourceUri: Uri, private _type: Status, + private _useIcons: boolean, private _renameResourceUri?: Uri ) { } } @@ -374,13 +373,17 @@ export interface CommitOptions { amend?: boolean; signoff?: boolean; signCommit?: boolean; - defaultMsg?: string; } export interface GitResourceGroup extends SourceControlResourceGroup { resourceStates: Resource[]; } +export interface OperationResult { + operation: Operation; + error: any; +} + export class Repository implements Disposable { private _onDidChangeRepository = new EventEmitter(); @@ -390,7 +393,7 @@ export class Repository implements Disposable { readonly onDidChangeState: Event = this._onDidChangeState.event; private _onDidChangeStatus = new EventEmitter(); - readonly onDidChangeStatus: Event = this._onDidChangeStatus.event; + readonly onDidRunGitStatus: Event = this._onDidChangeStatus.event; private _onDidChangeOriginalResource = new EventEmitter(); readonly onDidChangeOriginalResource: Event = this._onDidChangeOriginalResource.event; @@ -398,8 +401,8 @@ export class Repository implements Disposable { private _onRunOperation = new EventEmitter(); readonly onRunOperation: Event = this._onRunOperation.event; - private _onDidRunOperation = new EventEmitter(); - readonly onDidRunOperation: Event = this._onDidRunOperation.event; + private _onDidRunOperation = new EventEmitter(); + readonly onDidRunOperation: Event = this._onDidRunOperation.event; @memoize get onDidChangeOperations(): Event { @@ -462,13 +465,14 @@ export class Repository implements Disposable { private disposables: Disposable[] = []; constructor( - private readonly repository: BaseRepository + private readonly repository: BaseRepository, + globalState: Memento ) { const fsWatcher = workspace.createFileSystemWatcher('**'); this.disposables.push(fsWatcher); const onWorkspaceChange = anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate, fsWatcher.onDidDelete); - const onRepositoryChange = filterEvent(onWorkspaceChange, uri => !/^\.\./.test(path.relative(repository.root, uri.fsPath))); + const onRepositoryChange = filterEvent(onWorkspaceChange, uri => isDescendant(repository.root, uri.fsPath)); const onRelevantRepositoryChange = filterEvent(onRepositoryChange, uri => !/\/\.git\/index\.lock$/.test(uri.path)); onRelevantRepositoryChange(this.onFSChange, this, this.disposables); @@ -492,7 +496,7 @@ export class Repository implements Disposable { this.disposables.push(this.indexGroup); this.disposables.push(this.workingTreeGroup); - this.disposables.push(new AutoFetcher(this)); + this.disposables.push(new AutoFetcher(this, globalState)); const statusBar = new StatusBarCommands(this); this.disposables.push(statusBar); @@ -755,7 +759,8 @@ export class Repository implements Disposable { return this.run(Operation.CheckIgnore, () => { return new Promise>((resolve, reject) => { - filePaths = filePaths.filter(filePath => !path.relative(this.root, filePath).startsWith('..')); + filePaths = filePaths + .filter(filePath => isDescendant(this.root, filePath)); if (filePaths.length === 0) { // nothing left @@ -802,6 +807,8 @@ export class Repository implements Disposable { } const run = async () => { + let error: any = null; + this._operations.start(operation); this._onRunOperation.fire(operation); @@ -814,6 +821,8 @@ export class Repository implements Disposable { return result; } catch (err) { + error = err; + if (err.gitErrorCode === GitErrorCodes.NotAGitRepository) { this.state = RepositoryState.Disposed; } @@ -821,7 +830,7 @@ export class Repository implements Disposable { throw err; } finally { this._operations.end(operation); - this._onDidRunOperation.fire(operation); + this._onDidRunOperation.fire({ operation, error }); } }; @@ -853,6 +862,7 @@ export class Repository implements Disposable { const { status, didHitLimit } = await this.repository.getStatus(); const config = workspace.getConfiguration('git'); const shouldIgnore = config.get('ignoreLimitWarning') === true; + const useIcons = config.get('decorations.enabled', true); this.isRepositoryHuge = didHitLimit; @@ -900,30 +910,30 @@ export class Repository implements Disposable { const renameUri = raw.rename ? Uri.file(path.join(this.repository.root, raw.rename)) : undefined; switch (raw.x + raw.y) { - case '??': return workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.UNTRACKED)); - case '!!': return workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.IGNORED)); - case 'DD': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_DELETED)); - case 'AU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.ADDED_BY_US)); - case 'UD': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.DELETED_BY_THEM)); - case 'UA': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.ADDED_BY_THEM)); - case 'DU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.DELETED_BY_US)); - case 'AA': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_ADDED)); - case 'UU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_MODIFIED)); + case '??': return workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.UNTRACKED, useIcons)); + case '!!': return workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.IGNORED, useIcons)); + case 'DD': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_DELETED, useIcons)); + case 'AU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.ADDED_BY_US, useIcons)); + case 'UD': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.DELETED_BY_THEM, useIcons)); + case 'UA': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.ADDED_BY_THEM, useIcons)); + case 'DU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.DELETED_BY_US, useIcons)); + case 'AA': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_ADDED, useIcons)); + case 'UU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_MODIFIED, useIcons)); } let isModifiedInIndex = false; switch (raw.x) { - case 'M': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_MODIFIED)); isModifiedInIndex = true; break; - case 'A': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_ADDED)); break; - case 'D': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_DELETED)); break; - case 'R': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_RENAMED, renameUri)); break; - case 'C': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_COPIED, renameUri)); break; + case 'M': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_MODIFIED, useIcons)); isModifiedInIndex = true; break; + case 'A': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_ADDED, useIcons)); break; + case 'D': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_DELETED, useIcons)); break; + case 'R': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_RENAMED, useIcons, renameUri)); break; + case 'C': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_COPIED, useIcons, renameUri)); break; } switch (raw.y) { - case 'M': workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.MODIFIED, renameUri)); break; - case 'D': workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.DELETED, renameUri)); break; + case 'M': workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.MODIFIED, useIcons, renameUri)); break; + case 'D': workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.DELETED, useIcons, renameUri)); break; } }); diff --git a/extensions/git/src/staging.ts b/extensions/git/src/staging.ts index 8cfe16e67931..863d9f6591b2 100644 --- a/extensions/git/src/staging.ts +++ b/extensions/git/src/staging.ts @@ -73,9 +73,15 @@ export function toLineRanges(selections: Selection[], textDocument: TextDocument } function getModifiedRange(textDocument: TextDocument, diff: LineChange): Range { - return diff.modifiedEndLineNumber === 0 - ? new Range(textDocument.lineAt(diff.modifiedStartLineNumber - 1).range.end, textDocument.lineAt(diff.modifiedStartLineNumber).range.start) - : new Range(textDocument.lineAt(diff.modifiedStartLineNumber - 1).range.start, textDocument.lineAt(diff.modifiedEndLineNumber - 1).range.end); + if (diff.modifiedEndLineNumber === 0) { + if (diff.modifiedStartLineNumber === 0) { + return new Range(textDocument.lineAt(diff.modifiedStartLineNumber).range.end, textDocument.lineAt(diff.modifiedStartLineNumber).range.start); + } else { + return new Range(textDocument.lineAt(diff.modifiedStartLineNumber - 1).range.end, textDocument.lineAt(diff.modifiedStartLineNumber).range.start); + } + } else { + return new Range(textDocument.lineAt(diff.modifiedStartLineNumber - 1).range.start, textDocument.lineAt(diff.modifiedEndLineNumber - 1).range.end); + } } export function intersectDiffWithRange(textDocument: TextDocument, diff: LineChange, range: Range): LineChange | null { diff --git a/extensions/git/src/statusbar.ts b/extensions/git/src/statusbar.ts index 4233abec5807..8d093e29b211 100644 --- a/extensions/git/src/statusbar.ts +++ b/extensions/git/src/statusbar.ts @@ -20,7 +20,7 @@ class CheckoutStatusBar { private disposables: Disposable[] = []; constructor(private repository: Repository) { - repository.onDidChangeStatus(this._onDidChange.fire, this._onDidChange, this.disposables); + repository.onDidRunGitStatus(this._onDidChange.fire, this._onDidChange, this.disposables); } get command(): Command | undefined { @@ -65,7 +65,7 @@ class SyncStatusBar { } constructor(private repository: Repository) { - repository.onDidChangeStatus(this.onModelChange, this, this.disposables); + repository.onDidRunGitStatus(this.onModelChange, this, this.disposables); repository.onDidChangeOperations(this.onOperationsChange, this, this.disposables); this._onDidChange.fire(); } diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts index ef13e9de13ce..6831fea9428f 100644 --- a/extensions/git/src/util.ts +++ b/extensions/git/src/util.ts @@ -6,7 +6,7 @@ 'use strict'; import { Event } from 'vscode'; -import { dirname } from 'path'; +import { dirname, sep } from 'path'; import { Readable } from 'stream'; import * as fs from 'fs'; import * as byline from 'byline'; @@ -273,4 +273,16 @@ export function detectUnicodeEncoding(buffer: Buffer): Encoding | null { } return null; -} \ No newline at end of file +} + +export function isDescendant(parent: string, descendant: string): boolean { + if (parent === descendant) { + return true; + } + + if (parent.charAt(parent.length - 1) !== sep) { + parent += sep; + } + + return descendant.startsWith(parent); +} diff --git a/extensions/go/language-configuration.json b/extensions/go/language-configuration.json index 51519e3479c3..f8b2b18e5b07 100644 --- a/extensions/go/language-configuration.json +++ b/extensions/go/language-configuration.json @@ -26,6 +26,6 @@ ], "indentationRules": { "increaseIndentPattern": "^.*(\\bcase\\b.*:|\\bdefault\\b:|(\\b(func|if|else|switch|select|for|struct)\\b.*)?{[^}]*|\\([^)]*)$", - "decreaseIndentPattern": "^\\s*(\\bcase\\b.*:|\\bdefault\\b:|}[),]?|\\)[,]?)$" + "decreaseIndentPattern": "^\\s*(\\bcase\\b.*:|\\bdefault\\b:|}[)}]*[),]?|\\)[,]?)$" } } \ No newline at end of file diff --git a/extensions/html/client/src/htmlMain.ts b/extensions/html/client/src/htmlMain.ts index f8e3ffd59217..a30fe9ea7126 100644 --- a/extensions/html/client/src/htmlMain.ts +++ b/extensions/html/client/src/htmlMain.ts @@ -6,7 +6,7 @@ import * as path from 'path'; -import { languages, ExtensionContext, IndentAction, Position, TextDocument, Color, ColorInformation, ColorPresentation } from 'vscode'; +import { languages, ExtensionContext, IndentAction, Position, TextDocument, Color, ColorInformation, ColorPresentation, Range, CompletionItem, CompletionItemKind, SnippetString } from 'vscode'; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, RequestType, TextDocumentPositionParams } from 'vscode-languageclient'; import { EMPTY_ELEMENTS } from './htmlEmptyTagsShared'; import { activateTagClosing } from './tagClosing'; @@ -163,6 +163,31 @@ export function activate(context: ExtensionContext) { } ], }); + + const regionCompletionRegExpr = /^(\s*)(<(!(-(-\s*(#\w*)?)?)?)?)?/; + languages.registerCompletionItemProvider(documentSelector, { + provideCompletionItems(doc, pos) { + let lineUntilPos = doc.getText(new Range(new Position(pos.line, 0), pos)); + let match = lineUntilPos.match(regionCompletionRegExpr); + if (match) { + let range = new Range(new Position(pos.line, match[1].length), pos); + let beginProposal = new CompletionItem('#region', CompletionItemKind.Snippet); + beginProposal.range = range; + beginProposal.insertText = new SnippetString(''); + beginProposal.documentation = localize('folding.start', 'Folding Region Start'); + beginProposal.filterText = match[2]; + beginProposal.sortText = 'za'; + let endProposal = new CompletionItem('#endregion', CompletionItemKind.Snippet); + endProposal.range = range; + endProposal.insertText = new SnippetString(''); + endProposal.documentation = localize('folding.end', 'Folding Region End'); + endProposal.filterText = match[2]; + endProposal.sortText = 'zb'; + return [beginProposal, endProposal]; + } + return null; + } + }); } function getPackageInfo(context: ExtensionContext): IPackageInfo | null { diff --git a/extensions/html/language-configuration.json b/extensions/html/language-configuration.json index 51bae7c4088b..372ec2496876 100644 --- a/extensions/html/language-configuration.json +++ b/extensions/html/language-configuration.json @@ -22,5 +22,11 @@ { "open": "[", "close": "]"}, { "open": "(", "close": ")" }, { "open": "<", "close": ">" } - ] + ], + "folding": { + "markers": { + "start": "^\\s*", + "end": "^^\\s*" + } + } } \ No newline at end of file diff --git a/extensions/html/package.json b/extensions/html/package.json index 32b3b6df8236..13e5d82ca51d 100644 --- a/extensions/html/package.json +++ b/extensions/html/package.json @@ -67,6 +67,16 @@ } } ], + "folding": { + "markers": { + "start": "^\\s*/", + "end": "^\\s*/" + } + }, + "snippets": [{ + "language": "html", + "path": "./snippets/html.snippets.json" + }], "configuration": { "id": "html", "order": 20, diff --git a/extensions/html/server/package.json b/extensions/html/server/package.json index 441cf4bb411f..9056f257be6a 100644 --- a/extensions/html/server/package.json +++ b/extensions/html/server/package.json @@ -8,23 +8,23 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.1", - "vscode-html-languageservice": "^2.0.11", + "vscode-css-languageservice": "^3.0.2", + "vscode-html-languageservice": "^2.0.13", "vscode-languageserver": "^3.5.0", "vscode-nls": "^2.0.2", "vscode-uri": "^1.0.1" }, "devDependencies": { - "@types/node": "7.0.43", - "@types/mocha": "2.2.33" + "@types/mocha": "2.2.33", + "@types/node": "7.0.43" }, "scripts": { "compile": "gulp compile-extension:html-server", "watch": "gulp watch-extension:html-server", - "install-service-next": "npm install vscode-css-languageservice@next -f -S && npm install vscode-html-languageservice@next -f -S", - "install-service-local": "npm install ../../../../vscode-css-languageservice -f -S && npm install ../../../../vscode-html-languageservice -f -S", - "install-server-next": "npm install vscode-languageserver@next -f -S", - "install-server-local": "npm install ../../../../vscode-languageserver-node/server -f -S", + "install-service-next": "yarn add vscode-css-languageservice@next && yarn add vscode-html-languageservice@next", + "install-service-local": "npm install ../../../../vscode-css-languageservice -f && npm install ../../../../vscode-html-languageservice -f", + "install-server-next": "yarn add vscode-languageserver@next", + "install-server-local": "npm install ../../../../vscode-languageserver-node/server -f", "test": "../../../node_modules/.bin/mocha" } } diff --git a/extensions/html/server/src/htmlServerMain.ts b/extensions/html/server/src/htmlServerMain.ts index 1719e612d2af..2593ab4b1477 100644 --- a/extensions/html/server/src/htmlServerMain.ts +++ b/extensions/html/server/src/htmlServerMain.ts @@ -103,7 +103,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { let capabilities: ServerCapabilities & CPServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, - completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/', '>'] } : undefined, + completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/'] } : undefined, hoverProvider: true, documentHighlightProvider: true, documentRangeFormattingProvider: false, diff --git a/extensions/html/server/src/modes/javascriptMode.ts b/extensions/html/server/src/modes/javascriptMode.ts index 59e4b0bb5693..a1d0c2850fcc 100644 --- a/extensions/html/server/src/modes/javascriptMode.ts +++ b/extensions/html/server/src/modes/javascriptMode.ts @@ -77,6 +77,7 @@ export function getJavascriptMode(documentRegions: LanguageModelCache", "\t", "\t", - "\t{{Page Title}}", + "\t${1:Page Title}", "\t", - "\t", - "\t", + "\t", + "\t", "", "", - "\t{{}}", + "\t$0", "", "" ], "description": "Simple HTML5 starting point" } -} \ No newline at end of file +} diff --git a/extensions/java/package.json b/extensions/java/package.json index d8c9375f0c3b..6493004d0a80 100644 --- a/extensions/java/package.json +++ b/extensions/java/package.json @@ -17,6 +17,10 @@ "language": "java", "scopeName": "source.java", "path": "./syntaxes/java.tmLanguage.json" + }], + "snippets": [{ + "language": "java", + "path": "./snippets/java.snippets.json" }] } } \ No newline at end of file diff --git a/extensions/java/snippets/java.snippets.json b/extensions/java/snippets/java.snippets.json new file mode 100644 index 000000000000..9a2300b18f2f --- /dev/null +++ b/extensions/java/snippets/java.snippets.json @@ -0,0 +1,16 @@ +{ + "Region Start": { + "prefix": "#region", + "body": [ + "//#region" + ], + "description": "Folding Region Start" + }, + "Region End": { + "prefix": "#endregion", + "body": [ + "//#endregion" + ], + "description": "Folding Region End" + } +} diff --git a/extensions/javascript/package.json b/extensions/javascript/package.json index b3b68dedd5f1..15da42cf0a91 100644 --- a/extensions/javascript/package.json +++ b/extensions/javascript/package.json @@ -115,6 +115,10 @@ "fileMatch": ".babelrc", "url": "http://json.schemastore.org/babelrc" }, + { + "fileMatch": ".babelrc.json", + "url": "http://json.schemastore.org/babelrc" + }, { "fileMatch": "jsconfig.json", "url": "http://json.schemastore.org/jsconfig" diff --git a/extensions/javascript/src/features/bowerJSONContribution.ts b/extensions/javascript/src/features/bowerJSONContribution.ts index a3c7b17e46d1..13d6ccd29eea 100644 --- a/extensions/javascript/src/features/bowerJSONContribution.ts +++ b/extensions/javascript/src/features/bowerJSONContribution.ts @@ -13,6 +13,8 @@ import { textToMarkedString } from './markedTextUtil'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); +const USER_AGENT = 'Visual Studio Code'; + export class BowerJSONContribution implements IJSONContribution { private topRanked = ['twitter', 'bootstrap', 'angular-1.1.6', 'angular-latest', 'angulerjs', 'd3', 'myjquery', 'jq', 'abcdef1234567890', 'jQuery', 'jquery-1.11.1', 'jquery', @@ -49,10 +51,11 @@ export class BowerJSONContribution implements IJSONContribution { public collectPropertySuggestions(_resource: string, location: Location, currentWord: string, addValue: boolean, isLast: boolean, collector: ISuggestionsCollector): Thenable | null { if ((location.matches(['dependencies']) || location.matches(['devDependencies']))) { if (currentWord.length > 0) { - const queryUrl = 'https://bower.herokuapp.com/packages/search/' + encodeURIComponent(currentWord); + const queryUrl = 'https://registry.bower.io/packages/search/' + encodeURIComponent(currentWord); return this.xhr({ - url: queryUrl + url: queryUrl, + agent: USER_AGENT }).then((success) => { if (success.status === 200) { try { @@ -141,10 +144,11 @@ export class BowerJSONContribution implements IJSONContribution { } private getInfo(pack: string): Thenable { - const queryUrl = 'https://bower.herokuapp.com/packages/' + encodeURIComponent(pack); + const queryUrl = 'https://registry.bower.io/packages/' + encodeURIComponent(pack); return this.xhr({ - url: queryUrl + url: queryUrl, + agent: USER_AGENT }).then((success) => { try { const obj = JSON.parse(success.responseText); diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index d9981eea898c..9adeabe27aa4 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8361b1a232501c67911c81a4664a9460d7922c6b", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/06831946d0a23cb56be0c1ead7cab10be01306cd", "name": "JavaScript (with React support)", "scopeName": "source.js", "fileTypes": [ @@ -278,7 +278,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.js", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.js entity.name.function.js" @@ -512,7 +512,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "captures": { "1": { "name": "storage.modifier.js" @@ -739,7 +739,7 @@ }, { "name": "meta.definition.property.js entity.name.function.js", - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" }, { "name": "meta.definition.property.js variable.object.property.js", @@ -1002,7 +1002,7 @@ }, { "name": "meta.arrow.js", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.js" @@ -1946,7 +1946,7 @@ }, { "name": "meta.object.member.js", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.js" @@ -2039,13 +2039,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.js", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?=\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2492,7 +2492,7 @@ } }, { - "match": "(?x) (\\.) \\s* (?:\n (ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE\n |DOMSTRING_SIZE_ERR|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|HIERARCHY_REQUEST_ERR|INDEX_SIZE_ERR\n |INUSE_ATTRIBUTE_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR\n |NOT_SUPPORTED_ERR|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|WRONG_DOCUMENT_ERR)\n |\n (_content|[xyz]|abbr|above|accept|acceptCharset|accessKey|action|align|[av]Link(?:color)?|all|alt|anchors|appCodeName\n |appCore|applets|appMinorVersion|appName|appVersion|archive|areas|arguments|attributes|availHeight|availLeft|availTop\n |availWidth|axis|background|backgroundColor|backgroundImage|below|bgColor|body|border|borderBottomWidth|borderColor\n |borderLeftWidth|borderRightWidth|borderStyle|borderTopWidth|borderWidth|bottom|bufferDepth|callee|caller|caption\n |cellPadding|cells|cellSpacing|ch|characterSet|charset|checked|childNodes|chOff|cite|classes|className|clear\n |clientInformation|clip|clipBoardData|closed|code|codeBase|codeType|color|colorDepth|cols|colSpan|compact|complete\n |components|content|controllers|cookie|cookieEnabled|cords|cpuClass|crypto|current|data|dateTime|declare|defaultCharset\n |defaultChecked|defaultSelected|defaultStatus|defaultValue|defaultView|defer|description|dialogArguments|dialogHeight\n |dialogLeft|dialogTop|dialogWidth|dir|directories|disabled|display|docmain|doctype|documentElement|elements|embeds\n |enabledPlugin|encoding|enctype|entities|event|expando|external|face|fgColor|filename|firstChild|fontFamily|fontSize\n |fontWeight|form|formName|forms|frame|frameBorder|frameElement|frames|hasFocus|hash|headers|height|history|host\n |hostname|href|hreflang|hspace|htmlFor|httpEquiv|id|ids|ignoreCase|images|implementation|index|innerHeight|innerWidth\n |input|isMap|label|lang|language|lastChild|lastIndex|lastMatch|lastModified|lastParen|layer[sXY]|left|leftContext\n |lineHeight|link|linkColor|links|listStyleType|localName|location|locationbar|longDesc|lowsrc|lowSrc|marginBottom\n |marginHeight|marginLeft|marginRight|marginTop|marginWidth|maxLength|media|menubar|method|mimeTypes|multiline|multiple\n |name|nameProp|namespaces|namespaceURI|next|nextSibling|nodeName|nodeType|nodeValue|noHref|noResize|noShade|notationName\n |notations|noWrap|object|offscreenBuffering|onLine|onreadystatechange|opener|opsProfile|options|oscpu|outerHeight\n |outerWidth|ownerDocument|paddingBottom|paddingLeft|paddingRight|paddingTop|page[XY]|page[XY]Offset|parent|parentLayer\n |parentNode|parentWindow|pathname|personalbar|pixelDepth|pkcs11|platform|plugins|port|prefix|previous|previousDibling\n |product|productSub|profile|profileend|prompt|prompter|protocol|publicId|readOnly|readyState|referrer|rel|responseText\n |responseXML|rev|right|rightContext|rowIndex|rows|rowSpan|rules|scheme|scope|screen[XY]|screenLeft|screenTop|scripts\n |scrollbars|scrolling|sectionRowIndex|security|securityPolicy|selected|selectedIndex|selection|self|shape|siblingAbove\n |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary\n |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead\n |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile\n |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\\b(?!\\$|\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "match": "(?x) (\\.) \\s* (?:\n (ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE\n |DOMSTRING_SIZE_ERR|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|HIERARCHY_REQUEST_ERR|INDEX_SIZE_ERR\n |INUSE_ATTRIBUTE_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR\n |NOT_SUPPORTED_ERR|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|WRONG_DOCUMENT_ERR)\n |\n (_content|[xyz]|abbr|above|accept|acceptCharset|accessKey|action|align|[av]Link(?:color)?|all|alt|anchors|appCodeName\n |appCore|applets|appMinorVersion|appName|appVersion|archive|areas|arguments|attributes|availHeight|availLeft|availTop\n |availWidth|axis|background|backgroundColor|backgroundImage|below|bgColor|body|border|borderBottomWidth|borderColor\n |borderLeftWidth|borderRightWidth|borderStyle|borderTopWidth|borderWidth|bottom|bufferDepth|callee|caller|caption\n |cellPadding|cells|cellSpacing|ch|characterSet|charset|checked|childNodes|chOff|cite|classes|className|clear\n |clientInformation|clip|clipBoardData|closed|code|codeBase|codeType|color|colorDepth|cols|colSpan|compact|complete\n |components|content|controllers|cookie|cookieEnabled|cords|cpuClass|crypto|current|data|dateTime|declare|defaultCharset\n |defaultChecked|defaultSelected|defaultStatus|defaultValue|defaultView|defer|description|dialogArguments|dialogHeight\n |dialogLeft|dialogTop|dialogWidth|dir|directories|disabled|display|docmain|doctype|documentElement|elements|embeds\n |enabledPlugin|encoding|enctype|entities|event|expando|external|face|fgColor|filename|firstChild|fontFamily|fontSize\n |fontWeight|form|formName|forms|frame|frameBorder|frameElement|frames|hasFocus|hash|headers|height|history|host\n |hostname|href|hreflang|hspace|htmlFor|httpEquiv|id|ids|ignoreCase|images|implementation|index|innerHeight|innerWidth\n |input|isMap|label|lang|language|lastChild|lastIndex|lastMatch|lastModified|lastParen|layer[sXY]|left|leftContext\n |lineHeight|link|linkColor|links|listStyleType|localName|location|locationbar|longDesc|lowsrc|lowSrc|marginBottom\n |marginHeight|marginLeft|marginRight|marginTop|marginWidth|maxLength|media|menubar|method|mimeTypes|multiline|multiple\n |name|nameProp|namespaces|namespaceURI|next|nextSibling|nodeName|nodeType|nodeValue|noHref|noResize|noShade|notationName\n |notations|noWrap|object|offscreenBuffering|onLine|onreadystatechange|opener|opsProfile|options|oscpu|outerHeight\n |outerWidth|ownerDocument|paddingBottom|paddingLeft|paddingRight|paddingTop|page[XY]|page[XY]Offset|parent|parentLayer\n |parentNode|parentWindow|pathname|personalbar|pixelDepth|pkcs11|platform|plugins|port|prefix|previous|previousDibling\n |product|productSub|profile|profileend|prompt|prompter|protocol|publicId|readOnly|readyState|referrer|rel|responseText\n |responseXML|rev|right|rightContext|rowIndex|rows|rowSpan|rules|scheme|scope|screen[XY]|screenLeft|screenTop|scripts\n |scrollbars|scrolling|sectionRowIndex|security|securityPolicy|selected|selectedIndex|selection|self|shape|siblingAbove\n |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary\n |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead\n |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile\n |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\\b(?!\\$|\\s*(<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\\()", "captures": { "1": { "name": "punctuation.accessor.js" @@ -2572,7 +2572,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.js" diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json index c72bdbc95fa6..5e5384f09467 100644 --- a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8361b1a232501c67911c81a4664a9460d7922c6b", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/06831946d0a23cb56be0c1ead7cab10be01306cd", "name": "JavaScript (with React support)", "scopeName": "source.js.jsx", "fileTypes": [ @@ -278,7 +278,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.js.jsx", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.js.jsx entity.name.function.js.jsx" @@ -512,7 +512,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "captures": { "1": { "name": "storage.modifier.js.jsx" @@ -739,7 +739,7 @@ }, { "name": "meta.definition.property.js.jsx entity.name.function.js.jsx", - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" }, { "name": "meta.definition.property.js.jsx variable.object.property.js.jsx", @@ -1002,7 +1002,7 @@ }, { "name": "meta.arrow.js.jsx", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.js.jsx" @@ -1946,7 +1946,7 @@ }, { "name": "meta.object.member.js.jsx", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.js.jsx" @@ -2039,13 +2039,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.js.jsx", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?=\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2492,7 +2492,7 @@ } }, { - "match": "(?x) (\\.) \\s* (?:\n (ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE\n |DOMSTRING_SIZE_ERR|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|HIERARCHY_REQUEST_ERR|INDEX_SIZE_ERR\n |INUSE_ATTRIBUTE_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR\n |NOT_SUPPORTED_ERR|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|WRONG_DOCUMENT_ERR)\n |\n (_content|[xyz]|abbr|above|accept|acceptCharset|accessKey|action|align|[av]Link(?:color)?|all|alt|anchors|appCodeName\n |appCore|applets|appMinorVersion|appName|appVersion|archive|areas|arguments|attributes|availHeight|availLeft|availTop\n |availWidth|axis|background|backgroundColor|backgroundImage|below|bgColor|body|border|borderBottomWidth|borderColor\n |borderLeftWidth|borderRightWidth|borderStyle|borderTopWidth|borderWidth|bottom|bufferDepth|callee|caller|caption\n |cellPadding|cells|cellSpacing|ch|characterSet|charset|checked|childNodes|chOff|cite|classes|className|clear\n |clientInformation|clip|clipBoardData|closed|code|codeBase|codeType|color|colorDepth|cols|colSpan|compact|complete\n |components|content|controllers|cookie|cookieEnabled|cords|cpuClass|crypto|current|data|dateTime|declare|defaultCharset\n |defaultChecked|defaultSelected|defaultStatus|defaultValue|defaultView|defer|description|dialogArguments|dialogHeight\n |dialogLeft|dialogTop|dialogWidth|dir|directories|disabled|display|docmain|doctype|documentElement|elements|embeds\n |enabledPlugin|encoding|enctype|entities|event|expando|external|face|fgColor|filename|firstChild|fontFamily|fontSize\n |fontWeight|form|formName|forms|frame|frameBorder|frameElement|frames|hasFocus|hash|headers|height|history|host\n |hostname|href|hreflang|hspace|htmlFor|httpEquiv|id|ids|ignoreCase|images|implementation|index|innerHeight|innerWidth\n |input|isMap|label|lang|language|lastChild|lastIndex|lastMatch|lastModified|lastParen|layer[sXY]|left|leftContext\n |lineHeight|link|linkColor|links|listStyleType|localName|location|locationbar|longDesc|lowsrc|lowSrc|marginBottom\n |marginHeight|marginLeft|marginRight|marginTop|marginWidth|maxLength|media|menubar|method|mimeTypes|multiline|multiple\n |name|nameProp|namespaces|namespaceURI|next|nextSibling|nodeName|nodeType|nodeValue|noHref|noResize|noShade|notationName\n |notations|noWrap|object|offscreenBuffering|onLine|onreadystatechange|opener|opsProfile|options|oscpu|outerHeight\n |outerWidth|ownerDocument|paddingBottom|paddingLeft|paddingRight|paddingTop|page[XY]|page[XY]Offset|parent|parentLayer\n |parentNode|parentWindow|pathname|personalbar|pixelDepth|pkcs11|platform|plugins|port|prefix|previous|previousDibling\n |product|productSub|profile|profileend|prompt|prompter|protocol|publicId|readOnly|readyState|referrer|rel|responseText\n |responseXML|rev|right|rightContext|rowIndex|rows|rowSpan|rules|scheme|scope|screen[XY]|screenLeft|screenTop|scripts\n |scrollbars|scrolling|sectionRowIndex|security|securityPolicy|selected|selectedIndex|selection|self|shape|siblingAbove\n |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary\n |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead\n |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile\n |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\\b(?!\\$|\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "match": "(?x) (\\.) \\s* (?:\n (ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE\n |DOMSTRING_SIZE_ERR|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|HIERARCHY_REQUEST_ERR|INDEX_SIZE_ERR\n |INUSE_ATTRIBUTE_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR\n |NOT_SUPPORTED_ERR|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|WRONG_DOCUMENT_ERR)\n |\n (_content|[xyz]|abbr|above|accept|acceptCharset|accessKey|action|align|[av]Link(?:color)?|all|alt|anchors|appCodeName\n |appCore|applets|appMinorVersion|appName|appVersion|archive|areas|arguments|attributes|availHeight|availLeft|availTop\n |availWidth|axis|background|backgroundColor|backgroundImage|below|bgColor|body|border|borderBottomWidth|borderColor\n |borderLeftWidth|borderRightWidth|borderStyle|borderTopWidth|borderWidth|bottom|bufferDepth|callee|caller|caption\n |cellPadding|cells|cellSpacing|ch|characterSet|charset|checked|childNodes|chOff|cite|classes|className|clear\n |clientInformation|clip|clipBoardData|closed|code|codeBase|codeType|color|colorDepth|cols|colSpan|compact|complete\n |components|content|controllers|cookie|cookieEnabled|cords|cpuClass|crypto|current|data|dateTime|declare|defaultCharset\n |defaultChecked|defaultSelected|defaultStatus|defaultValue|defaultView|defer|description|dialogArguments|dialogHeight\n |dialogLeft|dialogTop|dialogWidth|dir|directories|disabled|display|docmain|doctype|documentElement|elements|embeds\n |enabledPlugin|encoding|enctype|entities|event|expando|external|face|fgColor|filename|firstChild|fontFamily|fontSize\n |fontWeight|form|formName|forms|frame|frameBorder|frameElement|frames|hasFocus|hash|headers|height|history|host\n |hostname|href|hreflang|hspace|htmlFor|httpEquiv|id|ids|ignoreCase|images|implementation|index|innerHeight|innerWidth\n |input|isMap|label|lang|language|lastChild|lastIndex|lastMatch|lastModified|lastParen|layer[sXY]|left|leftContext\n |lineHeight|link|linkColor|links|listStyleType|localName|location|locationbar|longDesc|lowsrc|lowSrc|marginBottom\n |marginHeight|marginLeft|marginRight|marginTop|marginWidth|maxLength|media|menubar|method|mimeTypes|multiline|multiple\n |name|nameProp|namespaces|namespaceURI|next|nextSibling|nodeName|nodeType|nodeValue|noHref|noResize|noShade|notationName\n |notations|noWrap|object|offscreenBuffering|onLine|onreadystatechange|opener|opsProfile|options|oscpu|outerHeight\n |outerWidth|ownerDocument|paddingBottom|paddingLeft|paddingRight|paddingTop|page[XY]|page[XY]Offset|parent|parentLayer\n |parentNode|parentWindow|pathname|personalbar|pixelDepth|pkcs11|platform|plugins|port|prefix|previous|previousDibling\n |product|productSub|profile|profileend|prompt|prompter|protocol|publicId|readOnly|readyState|referrer|rel|responseText\n |responseXML|rev|right|rightContext|rowIndex|rows|rowSpan|rules|scheme|scope|screen[XY]|screenLeft|screenTop|scripts\n |scrollbars|scrolling|sectionRowIndex|security|securityPolicy|selected|selectedIndex|selection|self|shape|siblingAbove\n |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary\n |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead\n |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile\n |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\\b(?!\\$|\\s*(<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\\()", "captures": { "1": { "name": "punctuation.accessor.js.jsx" @@ -2572,7 +2572,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.js.jsx" diff --git a/extensions/javascript/test/colorize-results/test_jsx.json b/extensions/javascript/test/colorize-results/test_jsx.json index 7824e567af25..a375d5d7b9d9 100644 --- a/extensions/javascript/test/colorize-results/test_jsx.json +++ b/extensions/javascript/test/colorize-results/test_jsx.json @@ -135,11 +135,11 @@ "c": "getInitialState", "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx entity.name.function.js.jsx", "r": { - "dark_plus": "meta.object-literal.key entity.name.function: #9CDCFE", - "light_plus": "meta.object-literal.key entity.name.function: #001080", + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "meta.object-literal.key entity.name.function: #9CDCFE" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -399,11 +399,11 @@ "c": "toggle", "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx entity.name.function.js.jsx", "r": { - "dark_plus": "meta.object-literal.key entity.name.function: #9CDCFE", - "light_plus": "meta.object-literal.key entity.name.function: #001080", + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "meta.object-literal.key entity.name.function: #9CDCFE" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -927,11 +927,11 @@ "c": "render", "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx entity.name.function.js.jsx", "r": { - "dark_plus": "meta.object-literal.key entity.name.function: #9CDCFE", - "light_plus": "meta.object-literal.key entity.name.function: #001080", + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "meta.object-literal.key entity.name.function: #9CDCFE" + "hc_black": "entity.name.function: #DCDCAA" } }, { diff --git a/extensions/json/client/src/jsonMain.ts b/extensions/json/client/src/jsonMain.ts index ecbfa1e35a0d..770cdb18d25a 100644 --- a/extensions/json/client/src/jsonMain.ts +++ b/extensions/json/client/src/jsonMain.ts @@ -6,7 +6,7 @@ import * as path from 'path'; -import { workspace, languages, ExtensionContext, extensions, Uri, TextDocument, ColorInformation, Color, ColorPresentation } from 'vscode'; +import { workspace, languages, ExtensionContext, extensions, Uri, TextDocument, ColorInformation, Color, ColorPresentation, LanguageConfiguration } from 'vscode'; import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; import { ConfigurationFeature } from 'vscode-languageclient/lib/configuration.proposed'; @@ -67,7 +67,7 @@ export function activate(context: ExtensionContext) { // The server is implemented in node let serverModule = context.asAbsolutePath(path.join('server', 'out', 'jsonServerMain.js')); // The debug options for the server - let debugOptions = { execArgv: ['--nolazy', '--inspect=6004'] }; + let debugOptions = { execArgv: ['--nolazy', '--inspect'] }; // If the extension is launch in debug mode the debug server options are use // Otherwise the run options are used @@ -76,7 +76,7 @@ export function activate(context: ExtensionContext) { debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } }; - let documentSelector = ['json']; + let documentSelector = ['json', 'jsonc']; // Options to control the language client let clientOptions: LanguageClientOptions = { @@ -159,13 +159,15 @@ export function activate(context: ExtensionContext) { })); }); - languages.setLanguageConfiguration('json', { + let languageConfiguration: LanguageConfiguration = { wordPattern: /("(?:[^\\\"]*(?:\\.)?)*"?)|[^\s{}\[\],:]+/, indentationRules: { increaseIndentPattern: /^.*(\{[^}]*|\[[^\]]*)$/, decreaseIndentPattern: /^\s*[}\]],?\s*$/ } - }); + }; + languages.setLanguageConfiguration('json', languageConfiguration); + languages.setLanguageConfiguration('jsonc', languageConfiguration); } function getSchemaAssociation(context: ExtensionContext): ISchemaAssociations { diff --git a/extensions/json/package.json b/extensions/json/package.json index d6de62b2797a..afffbf02d821 100644 --- a/extensions/json/package.json +++ b/extensions/json/package.json @@ -7,7 +7,7 @@ "vscode": "0.10.x" }, "activationEvents": [ - "onLanguage:json" + "onLanguage:json", "onLanguage:jsonc" ], "enableProposedApi": true, "main": "./client/out/jsonMain", @@ -32,8 +32,7 @@ ".jscsrc", ".eslintrc", ".babelrc", - ".webmanifest", - ".code-workspace" + ".webmanifest" ], "filenames": [ ".watchmanconfig", @@ -44,6 +43,27 @@ "application/manifest+json" ], "configuration": "./language-configuration.json" + }, + { + "id": "jsonc", + "aliases": [ + "JSON with Comments" + ], + "extensions": [ + ".code-workspace", + "language-configuration.json", + "icon-theme.json", + "color-theme.json" + ], + "filenames": [ + "settings.json", + "launch.json", + "tasks.json", + "keybindings.json", + "tsconfig.json", + "jsconfig.json" + ], + "configuration": "./language-configuration.json" } ], "grammars": [ @@ -51,6 +71,11 @@ "language": "json", "scopeName": "source.json", "path": "./syntaxes/JSON.tmLanguage.json" + }, + { + "language": "jsonc", + "scopeName": "source.json", + "path": "./syntaxes/JSON.tmLanguage.json" } ], "jsonValidation": [ diff --git a/extensions/json/server/package.json b/extensions/json/server/package.json index 13fe26647e40..a9a68b0a3cfc 100644 --- a/extensions/json/server/package.json +++ b/extensions/json/server/package.json @@ -10,7 +10,7 @@ "dependencies": { "jsonc-parser": "^1.0.0", "request-light": "^0.2.1", - "vscode-json-languageservice": "^3.0.1", + "vscode-json-languageservice": "^3.0.4", "vscode-languageserver": "^3.5.0", "vscode-nls": "^2.0.2", "vscode-uri": "^1.0.1" @@ -21,9 +21,9 @@ "scripts": { "compile": "gulp compile-extension:json-server", "watch": "gulp watch-extension:json-server", - "install-service-next": "npm install vscode-json-languageservice@next -f -S", - "install-service-local": "npm install ../../../../vscode-json-languageservice -f -S", - "install-server-next": "npm install vscode-languageserver@next -f -S", - "install-server-local": "npm install ../../../../vscode-languageserver-node/server -f -S" + "install-service-next": "yarn add vscode-json-languageservice@next", + "install-service-local": "npm install ../../../../vscode-json-languageservice -f", + "install-server-next": "yarn add vscode-languageserver@next", + "install-server-local": "npm install ../../../../vscode-languageserver-node/server -f" } } diff --git a/extensions/json/server/src/jsonServerMain.ts b/extensions/json/server/src/jsonServerMain.ts index 1706466ab614..dea8fdc2b21e 100644 --- a/extensions/json/server/src/jsonServerMain.ts +++ b/extensions/json/server/src/jsonServerMain.ts @@ -17,7 +17,8 @@ import fs = require('fs'); import URI from 'vscode-uri'; import * as URL from 'url'; import Strings = require('./utils/strings'); -import { JSONDocument, JSONSchema, LanguageSettings, getLanguageService } from 'vscode-json-languageservice'; +import { formatError, runSafe } from './utils/errors'; +import { JSONDocument, JSONSchema, LanguageSettings, getLanguageService, DocumentLanguageSettings } from 'vscode-json-languageservice'; import { getLanguageModelCache } from './languageModelCache'; import * as nls from 'vscode-nls'; @@ -42,6 +43,10 @@ namespace SchemaContentChangeNotification { // Create a connection for the server let connection: IConnection = createConnection(); +process.on('unhandledRejection', e => { + connection.console.error(formatError(`Unhandled exception`, e)); +}); + console.log = connection.console.log.bind(connection.console); console.error = connection.console.error.bind(connection.console); @@ -161,7 +166,7 @@ connection.onDidChangeConfiguration((change) => { let enableFormatter = settings && settings.json && settings.json.format && settings.json.format.enable; if (enableFormatter) { if (!formatterRegistration) { - formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector: [{ language: 'json' }] }); + formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector: [{ language: 'json' }, { language: 'jsonc' }] }); } } else if (formatterRegistration) { formatterRegistration.then(r => r.dispose()); @@ -251,12 +256,17 @@ function validateTextDocument(textDocument: TextDocument): void { connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); return; } + try { + let jsonDocument = getJSONDocument(textDocument); - let jsonDocument = getJSONDocument(textDocument); - languageService.doValidation(textDocument, jsonDocument).then(diagnostics => { - // Send the computed diagnostics to VSCode. - connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); - }); + let documentSettings: DocumentLanguageSettings = textDocument.languageId === 'jsonc' ? { comments: 'ignore', trailingCommas: 'ignore' } : { comments: 'error', trailingCommas: 'error' }; + languageService.doValidation(textDocument, jsonDocument, documentSettings).then(diagnostics => { + // Send the computed diagnostics to VSCode. + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); + }); + } catch (e) { + connection.console.error(formatError(`Error while validating ${textDocument.uri}`, e)); + } } connection.onDidChangeWatchedFiles((change) => { @@ -285,48 +295,62 @@ function getJSONDocument(document: TextDocument): JSONDocument { } connection.onCompletion(textDocumentPosition => { - let document = documents.get(textDocumentPosition.textDocument.uri); - let jsonDocument = getJSONDocument(document); - return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); + return runSafe(() => { + let document = documents.get(textDocumentPosition.textDocument.uri); + let jsonDocument = getJSONDocument(document); + return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); + }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`); }); connection.onCompletionResolve(completionItem => { - return languageService.doResolve(completionItem); + return runSafe(() => { + return languageService.doResolve(completionItem); + }, null, `Error while resolving completion proposal`); }); connection.onHover(textDocumentPositionParams => { - let document = documents.get(textDocumentPositionParams.textDocument.uri); - let jsonDocument = getJSONDocument(document); - return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); + return runSafe(() => { + let document = documents.get(textDocumentPositionParams.textDocument.uri); + let jsonDocument = getJSONDocument(document); + return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); + }, null, `Error while computing hover for ${textDocumentPositionParams.textDocument.uri}`); }); connection.onDocumentSymbol(documentSymbolParams => { - let document = documents.get(documentSymbolParams.textDocument.uri); - let jsonDocument = getJSONDocument(document); - return languageService.findDocumentSymbols(document, jsonDocument); + return runSafe(() => { + let document = documents.get(documentSymbolParams.textDocument.uri); + let jsonDocument = getJSONDocument(document); + return languageService.findDocumentSymbols(document, jsonDocument); + }, [], `Error while computing document symbols for ${documentSymbolParams.textDocument.uri}`); }); connection.onDocumentRangeFormatting(formatParams => { - let document = documents.get(formatParams.textDocument.uri); - return languageService.format(document, formatParams.range, formatParams.options); + return runSafe(() => { + let document = documents.get(formatParams.textDocument.uri); + return languageService.format(document, formatParams.range, formatParams.options); + }, [], `Error while formatting range for ${formatParams.textDocument.uri}`); }); connection.onRequest(DocumentColorRequest.type, params => { - let document = documents.get(params.textDocument.uri); - if (document) { - let jsonDocument = getJSONDocument(document); - return languageService.findDocumentColors(document, jsonDocument); - } - return []; + return runSafe(() => { + let document = documents.get(params.textDocument.uri); + if (document) { + let jsonDocument = getJSONDocument(document); + return languageService.findDocumentColors(document, jsonDocument); + } + return []; + }, [], `Error while computing document colors for ${params.textDocument.uri}`); }); connection.onRequest(ColorPresentationRequest.type, params => { - let document = documents.get(params.textDocument.uri); - if (document) { - let jsonDocument = getJSONDocument(document); - return languageService.getColorPresentations(document, jsonDocument, params.color, params.range); - } - return []; + return runSafe(() => { + let document = documents.get(params.textDocument.uri); + if (document) { + let jsonDocument = getJSONDocument(document); + return languageService.getColorPresentations(document, jsonDocument, params.color, params.range); + } + return []; + }, [], `Error while computing color presentationsd for ${params.textDocument.uri}`); }); // Listen on the connection diff --git a/extensions/json/server/src/utils/errors.ts b/extensions/json/server/src/utils/errors.ts new file mode 100644 index 000000000000..d5a0c8e7d053 --- /dev/null +++ b/extensions/json/server/src/utils/errors.ts @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +export function formatError(message: string, err: any): string { + if (err instanceof Error) { + let error = err; + return `${message}: ${error.message}\n${error.stack}`; + } else if (typeof err === 'string') { + return `${message}: ${err}`; + } else if (err) { + return `${message}: ${err.toString()}`; + } + return message; +} + +export function runSafe(func: () => Thenable | T, errorVal: T, errorMessage: string): Thenable | T { + try { + let t = func(); + if (t instanceof Promise) { + return t.then(void 0, e => { + console.error(formatError(errorMessage, e)); + return errorVal; + }); + } + return t; + } catch (e) { + console.error(formatError(errorMessage, e)); + return errorVal; + } +} \ No newline at end of file diff --git a/extensions/json/server/yarn.lock b/extensions/json/server/yarn.lock index a32aed0ba400..b7fd490aa8af 100644 --- a/extensions/json/server/yarn.lock +++ b/extensions/json/server/yarn.lock @@ -52,9 +52,9 @@ request-light@^0.2.1: https-proxy-agent "^0.3.5" vscode-nls "^2.0.2" -vscode-json-languageservice@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.0.1.tgz#e29eef0ef7c4548be3961b831d9b326cca9bd88d" +vscode-json-languageservice@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.0.4.tgz#293970ef3179d7793ffd25887acf158d93ff8733" dependencies: jsonc-parser "^1.0.0" vscode-languageserver-types "^3.5.0" diff --git a/extensions/less/language-configuration.json b/extensions/less/language-configuration.json index f60130d9d46b..181954633b09 100644 --- a/extensions/less/language-configuration.json +++ b/extensions/less/language-configuration.json @@ -25,5 +25,11 @@ "indentationRules": { "increaseIndentPattern": "(^.*\\{[^}]*$)", "decreaseIndentPattern": "^\\s*\\}" + }, + "folding": { + "markers": { + "start": "^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/", + "end": "^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/" + } } } \ No newline at end of file diff --git a/extensions/markdown/src/commandManager.ts b/extensions/markdown/src/commandManager.ts new file mode 100644 index 000000000000..359d5b9ca960 --- /dev/null +++ b/extensions/markdown/src/commandManager.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; + +export interface Command { + readonly id: string; + + execute(...args: any[]): void; +} + +export class CommandManager { + private readonly commands = new Map(); + + public dispose() { + for (const registration of this.commands.values()) { + registration.dispose(); + } + this.commands.clear(); + } + + public register(command: T): T { + this.registerCommand(command.id, command.execute, command); + return command; + } + + private registerCommand(id: string, impl: (...args: any[]) => void, thisArg?: any) { + if (this.commands.has(id)) { + return; + } + + this.commands.set(id, vscode.commands.registerCommand(id, impl, thisArg)); + } +} \ No newline at end of file diff --git a/extensions/markdown/src/commands.ts b/extensions/markdown/src/commands.ts new file mode 100644 index 000000000000..0051c2fa0f8b --- /dev/null +++ b/extensions/markdown/src/commands.ts @@ -0,0 +1,291 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vscode-nls'; +const localize = nls.config(process.env.VSCODE_NLS_CONFIG)(); + +import * as vscode from 'vscode'; +import * as path from 'path'; + +import { Command } from './commandManager'; +import { ExtensionContentSecurityPolicyArbiter, PreviewSecuritySelector } from './security'; +import { getMarkdownUri, MDDocumentContentProvider, isMarkdownFile } from './features/previewContentProvider'; +import { Logger } from './logger'; +import { TableOfContentsProvider } from './tableOfContentsProvider'; +import { MarkdownEngine } from './markdownEngine'; +import { TelemetryReporter } from './telemetryReporter'; + + +function getViewColumn(sideBySide: boolean): vscode.ViewColumn | undefined { + const active = vscode.window.activeTextEditor; + if (!active) { + return vscode.ViewColumn.One; + } + + if (!sideBySide) { + return active.viewColumn; + } + + switch (active.viewColumn) { + case vscode.ViewColumn.One: + return vscode.ViewColumn.Two; + case vscode.ViewColumn.Two: + return vscode.ViewColumn.Three; + } + + return active.viewColumn; +} + +function showPreview( + cspArbiter: ExtensionContentSecurityPolicyArbiter, + telemetryReporter: TelemetryReporter, + uri?: vscode.Uri, + sideBySide: boolean = false, +) { + let resource = uri; + if (!(resource instanceof vscode.Uri)) { + if (vscode.window.activeTextEditor) { + // we are relaxed and don't check for markdown files + resource = vscode.window.activeTextEditor.document.uri; + } + } + + if (!(resource instanceof vscode.Uri)) { + if (!vscode.window.activeTextEditor) { + // this is most likely toggling the preview + return vscode.commands.executeCommand('markdown.showSource'); + } + // nothing found that could be shown or toggled + return; + } + + const thenable = vscode.commands.executeCommand('vscode.previewHtml', + getMarkdownUri(resource), + getViewColumn(sideBySide), + localize('previewTitle', 'Preview {0}', path.basename(resource.fsPath)), + { + allowScripts: true, + allowSvgs: cspArbiter.shouldAllowSvgsForResource(resource) + }); + + telemetryReporter.sendTelemetryEvent('openPreview', { + where: sideBySide ? 'sideBySide' : 'inPlace', + how: (uri instanceof vscode.Uri) ? 'action' : 'pallete' + }); + + return thenable; +} + +export class ShowPreviewCommand implements Command { + public readonly id = 'markdown.showPreview'; + + public constructor( + private readonly cspArbiter: ExtensionContentSecurityPolicyArbiter, + private readonly telemetryReporter: TelemetryReporter + ) { } + + public execute(uri?: vscode.Uri) { + showPreview(this.cspArbiter, this.telemetryReporter, uri, false); + } +} + +export class ShowPreviewToSideCommand implements Command { + public readonly id = 'markdown.showPreviewToSide'; + + public constructor( + private readonly cspArbiter: ExtensionContentSecurityPolicyArbiter, + private readonly telemetryReporter: TelemetryReporter + ) { } + + public execute(uri?: vscode.Uri) { + showPreview(this.cspArbiter, this.telemetryReporter, uri, true); + } +} + +export class ShowSourceCommand implements Command { + public readonly id = 'markdown.showSource'; + + public execute(mdUri?: vscode.Uri) { + if (!mdUri) { + return vscode.commands.executeCommand('workbench.action.navigateBack'); + } + + const docUri = vscode.Uri.parse(mdUri.query); + for (const editor of vscode.window.visibleTextEditors) { + if (editor.document.uri.scheme === docUri.scheme && editor.document.uri.toString() === docUri.toString()) { + return vscode.window.showTextDocument(editor.document, editor.viewColumn); + } + } + + return vscode.workspace.openTextDocument(docUri) + .then(vscode.window.showTextDocument); + } +} + +export class RefreshPreviewCommand implements Command { + public readonly id = 'markdown.refreshPreview'; + + public constructor( + private readonly contentProvider: MDDocumentContentProvider + ) { } + + public execute(resource: string | undefined) { + if (resource) { + const source = vscode.Uri.parse(resource); + this.contentProvider.update(source); + } else if (vscode.window.activeTextEditor && isMarkdownFile(vscode.window.activeTextEditor.document)) { + this.contentProvider.update(getMarkdownUri(vscode.window.activeTextEditor.document.uri)); + } else { + // update all generated md documents + for (const document of vscode.workspace.textDocuments) { + if (document.uri.scheme === 'markdown') { + this.contentProvider.update(document.uri); + } + } + } + } +} + +export class ShowPreviewSecuritySelectorCommand implements Command { + public readonly id = 'markdown.showPreviewSecuritySelector'; + + public constructor( + private readonly previewSecuritySelector: PreviewSecuritySelector + ) { } + + public execute(resource: string | undefined) { + if (resource) { + const source = vscode.Uri.parse(resource).query; + this.previewSecuritySelector.showSecutitySelectorForResource(vscode.Uri.parse(source)); + } else { + if (vscode.window.activeTextEditor && vscode.window.activeTextEditor.document.languageId === 'markdown') { + this.previewSecuritySelector.showSecutitySelectorForResource(vscode.window.activeTextEditor.document.uri); + } + } + } +} + +export class RevealLineCommand implements Command { + public readonly id = '_markdown.revealLine'; + + public constructor( + private logger: Logger + ) { } + + public execute(uri: string, line: number) { + const sourceUri = vscode.Uri.parse(decodeURIComponent(uri)); + this.logger.log('revealLine', { uri, sourceUri: sourceUri.toString(), line }); + + vscode.window.visibleTextEditors + .filter(editor => isMarkdownFile(editor.document) && editor.document.uri.toString() === sourceUri.toString()) + .forEach(editor => { + const sourceLine = Math.floor(line); + const fraction = line - sourceLine; + const text = editor.document.lineAt(sourceLine).text; + const start = Math.floor(fraction * text.length); + editor.revealRange( + new vscode.Range(sourceLine, start, sourceLine + 1, 0), + vscode.TextEditorRevealType.AtTop); + }); + } +} + +export class DidClickCommand implements Command { + public readonly id = '_markdown.didClick'; + + public execute(uri: string, line: number) { + const sourceUri = vscode.Uri.parse(decodeURIComponent(uri)); + return vscode.workspace.openTextDocument(sourceUri) + .then(document => vscode.window.showTextDocument(document)) + .then(editor => + vscode.commands.executeCommand('revealLine', { lineNumber: Math.floor(line), at: 'center' }) + .then(() => editor)) + .then(editor => { + if (editor) { + editor.selection = new vscode.Selection( + new vscode.Position(Math.floor(line), 0), + new vscode.Position(Math.floor(line), 0)); + } + }); + } +} + +export class MoveCursorToPositionCommand implements Command { + public readonly id = '_markdown.moveCursorToPosition'; + + public execute(line: number, character: number) { + if (!vscode.window.activeTextEditor) { + return; + } + const position = new vscode.Position(line, character); + const selection = new vscode.Selection(position, position); + vscode.window.activeTextEditor.revealRange(selection); + vscode.window.activeTextEditor.selection = selection; + } +} + +export class OnPreviewStyleLoadErrorCommand implements Command { + public readonly id = '_markdown.onPreviewStyleLoadError'; + + public execute(resources: string[]) { + vscode.window.showWarningMessage(localize('onPreviewStyleLoadError', "Could not load 'markdown.styles': {0}", resources.join(', '))); + } +} + +export interface OpenDocumentLinkArgs { + path: string; + fragment: string; +} + +export class OpenDocumentLinkCommand implements Command { + private static readonly id = '_markdown.openDocumentLink'; + public readonly id = OpenDocumentLinkCommand.id; + + public static createCommandUri( + path: string, + fragment: string + ): vscode.Uri { + return vscode.Uri.parse(`command:${OpenDocumentLinkCommand.id}?${encodeURIComponent(JSON.stringify({ path, fragment }))}`); + } + + public constructor( + private readonly engine: MarkdownEngine + ) { } + + public execute(args: OpenDocumentLinkArgs) { + const tryRevealLine = async (editor: vscode.TextEditor) => { + if (editor && args.fragment) { + const toc = new TableOfContentsProvider(this.engine, editor.document); + const line = await toc.lookup(args.fragment); + if (!isNaN(line)) { + return editor.revealRange( + new vscode.Range(line, 0, line, 0), + vscode.TextEditorRevealType.AtTop); + } + } + }; + + const tryOpen = async (path: string) => { + if (vscode.window.activeTextEditor && isMarkdownFile(vscode.window.activeTextEditor.document) && vscode.window.activeTextEditor.document.uri.fsPath === path) { + return tryRevealLine(vscode.window.activeTextEditor); + } else { + const resource = vscode.Uri.file(path); + return vscode.workspace.openTextDocument(resource) + .then(vscode.window.showTextDocument) + .then(tryRevealLine); + } + }; + + return tryOpen(args.path).catch(() => { + if (path.extname(args.path) === '') { + return tryOpen(args.path + '.md'); + } + const resource = vscode.Uri.file(args.path); + return Promise.resolve(void 0) + .then(() => vscode.commands.executeCommand('vscode.open', resource)) + .then(() => void 0); + }); + } +} diff --git a/extensions/markdown/src/extension.ts b/extensions/markdown/src/extension.ts index a1c002d35aff..77487fbec187 100644 --- a/extensions/markdown/src/extension.ts +++ b/extensions/markdown/src/extension.ts @@ -3,213 +3,52 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as nls from 'vscode-nls'; -const localize = nls.config(process.env.VSCODE_NLS_CONFIG)(); import * as vscode from 'vscode'; -import * as path from 'path'; -import TelemetryReporter from 'vscode-extension-telemetry'; + import { MarkdownEngine } from './markdownEngine'; -import LinkProvider from './documentLinkProvider'; -import MDDocumentSymbolProvider from './documentSymbolProvider'; import { ExtensionContentSecurityPolicyArbiter, PreviewSecuritySelector } from './security'; -import { MDDocumentContentProvider, getMarkdownUri, isMarkdownFile } from './previewContentProvider'; -import { TableOfContentsProvider } from './tableOfContentsProvider'; import { Logger } from './logger'; +import { CommandManager } from './commandManager'; +import * as commands from './commands'; +import { loadDefaultTelemetryReporter } from './telemetryReporter'; +import { loadMarkdownExtensions } from './markdownExtensions'; +import LinkProvider from './features/documentLinkProvider'; +import MDDocumentSymbolProvider from './features/documentSymbolProvider'; +import { MDDocumentContentProvider, getMarkdownUri, isMarkdownFile } from './features/previewContentProvider'; -interface IPackageInfo { - name: string; - version: string; - aiKey: string; -} - -interface OpenDocumentLinkArgs { - path: string; - fragment: string; -} - -const resolveExtensionResources = (extension: vscode.Extension, stylePath: string): vscode.Uri => { - const resource = vscode.Uri.parse(stylePath); - if (resource.scheme) { - return resource; - } - return vscode.Uri.file(path.join(extension.extensionPath, stylePath)); -}; - -var telemetryReporter: TelemetryReporter | null; export function activate(context: vscode.ExtensionContext) { - const packageInfo = getPackageInfo(); - telemetryReporter = packageInfo && new TelemetryReporter(packageInfo.name, packageInfo.version, packageInfo.aiKey); - if (telemetryReporter) { - context.subscriptions.push(telemetryReporter); - } + const telemetryReporter = loadDefaultTelemetryReporter(); + context.subscriptions.push(telemetryReporter); const cspArbiter = new ExtensionContentSecurityPolicyArbiter(context.globalState, context.workspaceState); const engine = new MarkdownEngine(); - const logger = new Logger(); + const selector = 'markdown'; + const contentProvider = new MDDocumentContentProvider(engine, context, cspArbiter, logger); - const contentProviderRegistration = vscode.workspace.registerTextDocumentContentProvider('markdown', contentProvider); + context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider(selector, contentProvider)); + + loadMarkdownExtensions(contentProvider, engine); + + context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, new MDDocumentSymbolProvider(engine))); + context.subscriptions.push(vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider())); + const previewSecuritySelector = new PreviewSecuritySelector(cspArbiter, contentProvider); - for (const extension of vscode.extensions.all) { - const contributes = extension.packageJSON && extension.packageJSON.contributes; - if (!contributes) { - continue; - } - - const styles = contributes['markdown.previewStyles']; - if (styles && Array.isArray(styles)) { - for (const style of styles) { - try { - contentProvider.addStyle(resolveExtensionResources(extension, style)); - } catch (e) { - // noop - } - } - } - - const scripts = contributes['markdown.previewScripts']; - if (scripts && Array.isArray(scripts)) { - for (const script of scripts) { - try { - contentProvider.addScript(resolveExtensionResources(extension, script)); - } catch (e) { - // noop - } - } - } - - if (contributes['markdown.markdownItPlugins']) { - extension.activate().then(() => { - if (extension.exports && extension.exports.extendMarkdownIt) { - engine.addPlugin((md: any) => extension.exports.extendMarkdownIt(md)); - } - }); - } - } - - const symbolsProvider = new MDDocumentSymbolProvider(engine); - const symbolsProviderRegistration = vscode.languages.registerDocumentSymbolProvider({ language: 'markdown' }, symbolsProvider); - context.subscriptions.push(contentProviderRegistration, symbolsProviderRegistration); - - context.subscriptions.push(vscode.languages.registerDocumentLinkProvider('markdown', new LinkProvider())); - - context.subscriptions.push(vscode.commands.registerCommand('markdown.showPreview', (uri) => showPreview(cspArbiter, uri, false))); - context.subscriptions.push(vscode.commands.registerCommand('markdown.showPreviewToSide', uri => showPreview(cspArbiter, uri, true))); - context.subscriptions.push(vscode.commands.registerCommand('markdown.showSource', showSource)); - - context.subscriptions.push(vscode.commands.registerCommand('_markdown.moveCursorToPosition', (line: number, character: number) => { - if (!vscode.window.activeTextEditor) { - return; - } - const position = new vscode.Position(line, character); - const selection = new vscode.Selection(position, position); - vscode.window.activeTextEditor.revealRange(selection); - vscode.window.activeTextEditor.selection = selection; - })); - - context.subscriptions.push(vscode.commands.registerCommand('_markdown.revealLine', (uri, line) => { - const sourceUri = vscode.Uri.parse(decodeURIComponent(uri)); - logger.log('revealLine', { uri, sourceUri: sourceUri.toString(), line }); - - vscode.window.visibleTextEditors - .filter(editor => isMarkdownFile(editor.document) && editor.document.uri.toString() === sourceUri.toString()) - .forEach(editor => { - const sourceLine = Math.floor(line); - const fraction = line - sourceLine; - const text = editor.document.lineAt(sourceLine).text; - const start = Math.floor(fraction * text.length); - editor.revealRange( - new vscode.Range(sourceLine, start, sourceLine + 1, 0), - vscode.TextEditorRevealType.AtTop); - }); - })); - - context.subscriptions.push(vscode.commands.registerCommand('_markdown.didClick', (uri: string, line) => { - const sourceUri = vscode.Uri.parse(decodeURIComponent(uri)); - return vscode.workspace.openTextDocument(sourceUri) - .then(document => vscode.window.showTextDocument(document)) - .then(editor => - vscode.commands.executeCommand('revealLine', { lineNumber: Math.floor(line), at: 'center' }) - .then(() => editor)) - .then(editor => { - if (editor) { - editor.selection = new vscode.Selection( - new vscode.Position(Math.floor(line), 0), - new vscode.Position(Math.floor(line), 0)); - } - }); - })); - - context.subscriptions.push(vscode.commands.registerCommand('_markdown.openDocumentLink', (args: OpenDocumentLinkArgs) => { - const tryRevealLine = async (editor: vscode.TextEditor) => { - if (editor && args.fragment) { - const toc = new TableOfContentsProvider(engine, editor.document); - const line = await toc.lookup(args.fragment); - if (!isNaN(line)) { - return editor.revealRange( - new vscode.Range(line, 0, line, 0), - vscode.TextEditorRevealType.AtTop); - } - } - }; - - const tryOpen = async (path: string) => { - if (vscode.window.activeTextEditor && isMarkdownFile(vscode.window.activeTextEditor.document) && vscode.window.activeTextEditor.document.uri.fsPath === path) { - return tryRevealLine(vscode.window.activeTextEditor); - } else { - const resource = vscode.Uri.file(path); - return vscode.workspace.openTextDocument(resource) - .then(vscode.window.showTextDocument) - .then(tryRevealLine); - } - }; - - return tryOpen(args.path).catch(() => { - if (path.extname(args.path) === '') { - return tryOpen(args.path + '.md'); - } - const resource = vscode.Uri.file(args.path); - return Promise.resolve(void 0) - .then(() => vscode.commands.executeCommand('vscode.open', resource)) - .then(() => void 0); - }); - })); - - context.subscriptions.push(vscode.commands.registerCommand('markdown.showPreviewSecuritySelector', (resource: string | undefined) => { - if (resource) { - const source = vscode.Uri.parse(resource).query; - previewSecuritySelector.showSecutitySelectorForResource(vscode.Uri.parse(source)); - } else { - if (vscode.window.activeTextEditor && vscode.window.activeTextEditor.document.languageId === 'markdown') { - previewSecuritySelector.showSecutitySelectorForResource(vscode.window.activeTextEditor.document.uri); - } - } - })); - - context.subscriptions.push(vscode.commands.registerCommand('markdown.refreshPreview', (resource: string | undefined) => { - if (resource) { - const source = vscode.Uri.parse(resource); - contentProvider.update(source); - } else if (vscode.window.activeTextEditor && isMarkdownFile(vscode.window.activeTextEditor.document)) { - contentProvider.update(getMarkdownUri(vscode.window.activeTextEditor.document.uri)); - } else { - // update all generated md documents - for (const document of vscode.workspace.textDocuments) { - if (document.uri.scheme === 'markdown') { - contentProvider.update(document.uri); - } - } - } - })); - - context.subscriptions.push(vscode.commands.registerCommand('_markdown.onPreviewStyleLoadError', (resources: string[]) => { - vscode.window.showWarningMessage(localize('onPreviewStyleLoadError', "Could not load 'markdown.styles': {0}", resources.join(', '))); - })); + const commandManager = new CommandManager(); + context.subscriptions.push(commandManager); + commandManager.register(new commands.ShowPreviewCommand(cspArbiter, telemetryReporter)); + commandManager.register(new commands.ShowPreviewToSideCommand(cspArbiter, telemetryReporter)); + commandManager.register(new commands.ShowSourceCommand()); + commandManager.register(new commands.RefreshPreviewCommand(contentProvider)); + commandManager.register(new commands.RevealLineCommand(logger)); + commandManager.register(new commands.MoveCursorToPositionCommand()); + commandManager.register(new commands.ShowPreviewSecuritySelectorCommand(previewSecuritySelector)); + commandManager.register(new commands.OnPreviewStyleLoadErrorCommand()); + commandManager.register(new commands.DidClickCommand()); + commandManager.register(new commands.OpenDocumentLinkCommand(engine)); context.subscriptions.push(vscode.workspace.onDidSaveTextDocument(document => { if (isMarkdownFile(document)) { @@ -243,95 +82,3 @@ export function activate(context: vscode.ExtensionContext) { } })); } - - -function showPreview(cspArbiter: ExtensionContentSecurityPolicyArbiter, uri?: vscode.Uri, sideBySide: boolean = false) { - let resource = uri; - if (!(resource instanceof vscode.Uri)) { - if (vscode.window.activeTextEditor) { - // we are relaxed and don't check for markdown files - resource = vscode.window.activeTextEditor.document.uri; - } - } - - if (!(resource instanceof vscode.Uri)) { - if (!vscode.window.activeTextEditor) { - // this is most likely toggling the preview - return vscode.commands.executeCommand('markdown.showSource'); - } - // nothing found that could be shown or toggled - return; - } - - const thenable = vscode.commands.executeCommand('vscode.previewHtml', - getMarkdownUri(resource), - getViewColumn(sideBySide), - localize('previewTitle', 'Preview {0}', path.basename(resource.fsPath)), - { - allowScripts: true, - allowSvgs: cspArbiter.shouldAllowSvgsForResource(resource) - }); - - if (telemetryReporter) { - /* __GDPR__ - "openPreview" : { - "where" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "how": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryReporter.sendTelemetryEvent('openPreview', { - where: sideBySide ? 'sideBySide' : 'inPlace', - how: (uri instanceof vscode.Uri) ? 'action' : 'pallete' - }); - } - - return thenable; -} - -function getViewColumn(sideBySide: boolean): vscode.ViewColumn | undefined { - const active = vscode.window.activeTextEditor; - if (!active) { - return vscode.ViewColumn.One; - } - - if (!sideBySide) { - return active.viewColumn; - } - - switch (active.viewColumn) { - case vscode.ViewColumn.One: - return vscode.ViewColumn.Two; - case vscode.ViewColumn.Two: - return vscode.ViewColumn.Three; - } - - return active.viewColumn; -} - -function showSource(mdUri: vscode.Uri) { - if (!mdUri) { - return vscode.commands.executeCommand('workbench.action.navigateBack'); - } - - const docUri = vscode.Uri.parse(mdUri.query); - for (const editor of vscode.window.visibleTextEditors) { - if (editor.document.uri.scheme === docUri.scheme && editor.document.uri.toString() === docUri.toString()) { - return vscode.window.showTextDocument(editor.document, editor.viewColumn); - } - } - - return vscode.workspace.openTextDocument(docUri) - .then(vscode.window.showTextDocument); -} - -function getPackageInfo(): IPackageInfo | null { - const extention = vscode.extensions.getExtension('Microsoft.vscode-markdown'); - if (extention && extention.packageJSON) { - return { - name: extention.packageJSON.name, - version: extention.packageJSON.version, - aiKey: extention.packageJSON.aiKey - }; - } - return null; -} diff --git a/extensions/markdown/src/documentLinkProvider.ts b/extensions/markdown/src/features/documentLinkProvider.ts similarity index 93% rename from extensions/markdown/src/documentLinkProvider.ts rename to extensions/markdown/src/features/documentLinkProvider.ts index 12ef17312d1f..8ad3619b32d3 100644 --- a/extensions/markdown/src/documentLinkProvider.ts +++ b/extensions/markdown/src/features/documentLinkProvider.ts @@ -7,8 +7,13 @@ import * as vscode from 'vscode'; import * as path from 'path'; +import { OpenDocumentLinkCommand } from '../commands'; -function normalizeLink(document: vscode.TextDocument, link: string, base: string): vscode.Uri { +function normalizeLink( + document: vscode.TextDocument, + link: string, + base: string +): vscode.Uri { const uri = vscode.Uri.parse(link); if (uri.scheme) { return uri; @@ -27,10 +32,13 @@ function normalizeLink(document: vscode.TextDocument, link: string, base: string resourcePath = path.join(base, uri.path); } - return vscode.Uri.parse(`command:_markdown.openDocumentLink?${encodeURIComponent(JSON.stringify({ fragment: uri.fragment, path: resourcePath }))}`); + return OpenDocumentLinkCommand.createCommandUri(resourcePath, uri.fragment); } -function matchAll(pattern: RegExp, text: string): Array { +function matchAll( + pattern: RegExp, + text: string +): Array { const out: RegExpMatchArray[] = []; pattern.lastIndex = 0; let match: RegExpMatchArray | null; diff --git a/extensions/markdown/src/documentSymbolProvider.ts b/extensions/markdown/src/features/documentSymbolProvider.ts similarity index 88% rename from extensions/markdown/src/documentSymbolProvider.ts rename to extensions/markdown/src/features/documentSymbolProvider.ts index 77c0e0baad8c..53213f0661d8 100644 --- a/extensions/markdown/src/documentSymbolProvider.ts +++ b/extensions/markdown/src/features/documentSymbolProvider.ts @@ -7,8 +7,8 @@ import * as vscode from 'vscode'; -import { MarkdownEngine } from './markdownEngine'; -import { TableOfContentsProvider } from './tableOfContentsProvider'; +import { MarkdownEngine } from '../markdownEngine'; +import { TableOfContentsProvider } from '../tableOfContentsProvider'; export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolProvider { diff --git a/extensions/markdown/src/markdownExtensions.ts b/extensions/markdown/src/markdownExtensions.ts new file mode 100644 index 000000000000..b01a14b994bc --- /dev/null +++ b/extensions/markdown/src/markdownExtensions.ts @@ -0,0 +1,86 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import * as path from 'path'; + +import { MDDocumentContentProvider } from './features/previewContentProvider'; +import { MarkdownEngine } from './markdownEngine'; + +const resolveExtensionResources = (extension: vscode.Extension, stylePath: string): vscode.Uri => { + const resource = vscode.Uri.parse(stylePath); + if (resource.scheme) { + return resource; + } + return vscode.Uri.file(path.join(extension.extensionPath, stylePath)); +}; + + +export function loadMarkdownExtensions( + contentProvider: MDDocumentContentProvider, + engine: MarkdownEngine +) { + for (const extension of vscode.extensions.all) { + const contributes = extension.packageJSON && extension.packageJSON.contributes; + if (!contributes) { + continue; + } + + tryLoadPreviewStyles(contributes, contentProvider, extension); + tryLoadPreviewScripts(contributes, contentProvider, extension); + tryLoadMarkdownItPlugins(contributes, extension, engine); + } +} + +function tryLoadMarkdownItPlugins( + contributes: any, + extension: vscode.Extension, + engine: MarkdownEngine +) { + if (contributes['markdown.markdownItPlugins']) { + extension.activate().then(() => { + if (extension.exports && extension.exports.extendMarkdownIt) { + engine.addPlugin((md: any) => extension.exports.extendMarkdownIt(md)); + } + }); + } +} + +function tryLoadPreviewScripts( + contributes: any, + contentProvider: MDDocumentContentProvider, + extension: vscode.Extension +) { + const scripts = contributes['markdown.previewScripts']; + if (scripts && Array.isArray(scripts)) { + for (const script of scripts) { + try { + contentProvider.addScript(resolveExtensionResources(extension, script)); + } + catch (e) { + // noop + } + } + } +} + +function tryLoadPreviewStyles( + contributes: any, + contentProvider: MDDocumentContentProvider, + extension: vscode.Extension +) { + const styles = contributes['markdown.previewStyles']; + if (styles && Array.isArray(styles)) { + for (const style of styles) { + try { + contentProvider.addStyle(resolveExtensionResources(extension, style)); + } + catch (e) { + // noop + } + } + } +} + diff --git a/extensions/markdown/src/previewContentProvider.ts b/extensions/markdown/src/previewContentProvider.ts deleted file mode 100644 index 41a708e44c04..000000000000 --- a/extensions/markdown/src/previewContentProvider.ts +++ /dev/null @@ -1,318 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import * as vscode from 'vscode'; -import * as path from 'path'; -import { MarkdownEngine } from './markdownEngine'; - -import * as nls from 'vscode-nls'; -import { Logger } from './logger'; -import { ContentSecurityPolicyArbiter, MarkdownPreviewSecurityLevel } from './security'; -const localize = nls.loadMessageBundle(); - -const previewStrings = { - cspAlertMessageText: localize('preview.securityMessage.text', 'Some content has been disabled in this document'), - cspAlertMessageTitle: localize('preview.securityMessage.title', 'Potentially unsafe or insecure content has been disabled in the markdown preview. Change the Markdown preview security setting to allow insecure content or enable scripts'), - cspAlertMessageLabel: localize('preview.securityMessage.label', 'Content Disabled Security Warning') -}; - -export function isMarkdownFile(document: vscode.TextDocument) { - return document.languageId === 'markdown' - && document.uri.scheme !== 'markdown'; // prevent processing of own documents -} - -export function getMarkdownUri(uri: vscode.Uri) { - if (uri.scheme === 'markdown') { - return uri; - } - - return uri.with({ - scheme: 'markdown', - path: uri.path + '.rendered', - query: uri.toString() - }); -} - -class MarkdownPreviewConfig { - public static getConfigForResource(resource: vscode.Uri) { - return new MarkdownPreviewConfig(resource); - } - - public readonly scrollBeyondLastLine: boolean; - public readonly wordWrap: boolean; - public readonly previewFrontMatter: string; - public readonly lineBreaks: boolean; - public readonly doubleClickToSwitchToEditor: boolean; - public readonly scrollEditorWithPreview: boolean; - public readonly scrollPreviewWithEditorSelection: boolean; - public readonly markEditorSelection: boolean; - - public readonly lineHeight: number; - public readonly fontSize: number; - public readonly fontFamily: string | undefined; - public readonly styles: string[]; - - private constructor(resource: vscode.Uri) { - const editorConfig = vscode.workspace.getConfiguration('editor', resource); - const markdownConfig = vscode.workspace.getConfiguration('markdown', resource); - const markdownEditorConfig = vscode.workspace.getConfiguration('[markdown]'); - - this.scrollBeyondLastLine = editorConfig.get('scrollBeyondLastLine', false); - - this.wordWrap = editorConfig.get('wordWrap', 'off') !== 'off'; - if (markdownEditorConfig && markdownEditorConfig['editor.wordWrap']) { - this.wordWrap = markdownEditorConfig['editor.wordWrap'] !== 'off'; - } - - this.previewFrontMatter = markdownConfig.get('previewFrontMatter', 'hide'); - this.scrollPreviewWithEditorSelection = !!markdownConfig.get('preview.scrollPreviewWithEditorSelection', true); - this.scrollEditorWithPreview = !!markdownConfig.get('preview.scrollEditorWithPreview', true); - this.lineBreaks = !!markdownConfig.get('preview.breaks', false); - this.doubleClickToSwitchToEditor = !!markdownConfig.get('preview.doubleClickToSwitchToEditor', true); - this.markEditorSelection = !!markdownConfig.get('preview.markEditorSelection', true); - - this.fontFamily = markdownConfig.get('preview.fontFamily', undefined); - this.fontSize = Math.max(8, +markdownConfig.get('preview.fontSize', NaN)); - this.lineHeight = Math.max(0.6, +markdownConfig.get('preview.lineHeight', NaN)); - - this.styles = markdownConfig.get('styles', []); - } - - public isEqualTo(otherConfig: MarkdownPreviewConfig) { - for (let key in this) { - if (this.hasOwnProperty(key) && key !== 'styles') { - if (this[key] !== otherConfig[key]) { - return false; - } - } - } - - // Check styles - if (this.styles.length !== otherConfig.styles.length) { - return false; - } - for (let i = 0; i < this.styles.length; ++i) { - if (this.styles[i] !== otherConfig.styles[i]) { - return false; - } - } - - return true; - } - - [key: string]: any; -} - -class PreviewConfigManager { - private previewConfigurationsForWorkspaces = new Map(); - - public loadAndCacheConfiguration( - resource: vscode.Uri - ) { - const config = MarkdownPreviewConfig.getConfigForResource(resource); - this.previewConfigurationsForWorkspaces.set(this.getKey(resource), config); - return config; - } - - public shouldUpdateConfiguration( - resource: vscode.Uri - ): boolean { - const key = this.getKey(resource); - const currentConfig = this.previewConfigurationsForWorkspaces.get(key); - const newConfig = MarkdownPreviewConfig.getConfigForResource(resource); - return (!currentConfig || !currentConfig.isEqualTo(newConfig)); - } - - private getKey( - resource: vscode.Uri - ): string { - const folder = vscode.workspace.getWorkspaceFolder(resource); - if (!folder) { - return ''; - } - return folder.uri.toString(); - } -} - -export class MDDocumentContentProvider implements vscode.TextDocumentContentProvider { - private _onDidChange = new vscode.EventEmitter(); - private _waiting: boolean = false; - private previewConfigurations = new PreviewConfigManager(); - - private extraStyles: Array = []; - private extraScripts: Array = []; - - constructor( - private engine: MarkdownEngine, - private context: vscode.ExtensionContext, - private cspArbiter: ContentSecurityPolicyArbiter, - private logger: Logger - ) { } - - public addScript(resource: vscode.Uri): void { - this.extraScripts.push(resource); - } - - public addStyle(resource: vscode.Uri): void { - this.extraStyles.push(resource); - } - - private getMediaPath(mediaFile: string): string { - return vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile))).toString(); - } - - private fixHref(resource: vscode.Uri, href: string): string { - if (!href) { - return href; - } - - // Use href if it is already an URL - const hrefUri = vscode.Uri.parse(href); - if (['file', 'http', 'https'].indexOf(hrefUri.scheme) >= 0) { - return hrefUri.toString(); - } - - // Use href as file URI if it is absolute - if (path.isAbsolute(href)) { - return vscode.Uri.file(href).toString(); - } - - // use a workspace relative path if there is a workspace - let root = vscode.workspace.getWorkspaceFolder(resource); - if (root) { - return vscode.Uri.file(path.join(root.uri.fsPath, href)).toString(); - } - - // otherwise look relative to the markdown file - return vscode.Uri.file(path.join(path.dirname(resource.fsPath), href)).toString(); - } - - private computeCustomStyleSheetIncludes(resource: vscode.Uri, config: MarkdownPreviewConfig): string { - if (config.styles && Array.isArray(config.styles)) { - return config.styles.map(style => { - return ``; - }).join('\n'); - } - return ''; - } - - private getSettingsOverrideStyles(nonce: string, config: MarkdownPreviewConfig): string { - return ``; - } - - private getStyles(resource: vscode.Uri, nonce: string, config: MarkdownPreviewConfig): string { - const baseStyles = [ - this.getMediaPath('markdown.css'), - this.getMediaPath('tomorrow.css') - ].concat(this.extraStyles.map(resource => resource.toString())); - - return `${baseStyles.map(href => ``).join('\n')} - ${this.getSettingsOverrideStyles(nonce, config)} - ${this.computeCustomStyleSheetIncludes(resource, config)}`; - } - - private getScripts(nonce: string): string { - const scripts = [this.getMediaPath('main.js')].concat(this.extraScripts.map(resource => resource.toString())); - return scripts - .map(source => ``) - .join('\n'); - } - - public async provideTextDocumentContent(uri: vscode.Uri): Promise { - const sourceUri = vscode.Uri.parse(uri.query); - - let initialLine: number | undefined = undefined; - const editor = vscode.window.activeTextEditor; - if (editor && editor.document.uri.toString() === sourceUri.toString()) { - initialLine = editor.selection.active.line; - } - - const document = await vscode.workspace.openTextDocument(sourceUri); - const config = this.previewConfigurations.loadAndCacheConfiguration(sourceUri); - - const initialData = { - previewUri: uri.toString(), - source: sourceUri.toString(), - line: initialLine, - scrollPreviewWithEditorSelection: config.scrollPreviewWithEditorSelection, - scrollEditorWithPreview: config.scrollEditorWithPreview, - doubleClickToSwitchToEditor: config.doubleClickToSwitchToEditor, - disableSecurityWarnings: this.cspArbiter.shouldDisableSecurityWarnings() - }; - - this.logger.log('provideTextDocumentContent', initialData); - - // Content Security Policy - const nonce = new Date().getTime() + '' + new Date().getMilliseconds(); - const csp = this.getCspForResource(sourceUri, nonce); - - const body = await this.engine.render(sourceUri, config.previewFrontMatter === 'hide', document.getText()); - return ` - - - - ${csp} - - - - ${this.getStyles(sourceUri, nonce, config)} - - - - ${body} -
- ${this.getScripts(nonce)} - - `; - } - - public updateConfiguration() { - // update all generated md documents - for (const document of vscode.workspace.textDocuments) { - if (document.uri.scheme === 'markdown') { - const sourceUri = vscode.Uri.parse(document.uri.query); - if (this.previewConfigurations.shouldUpdateConfiguration(sourceUri)) { - this.update(document.uri); - } - } - } - } - - get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public update(uri: vscode.Uri) { - if (!this._waiting) { - this._waiting = true; - setTimeout(() => { - this._waiting = false; - this._onDidChange.fire(uri); - }, 300); - } - } - - private getCspForResource(resource: vscode.Uri, nonce: string): string { - switch (this.cspArbiter.getSecurityLevelForResource(resource)) { - case MarkdownPreviewSecurityLevel.AllowInsecureContent: - return ``; - - case MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent: - return ''; - - case MarkdownPreviewSecurityLevel.Strict: - default: - return ``; - } - } -} diff --git a/extensions/markdown/src/security.ts b/extensions/markdown/src/security.ts index fe2bd4c8be39..5f0898e49721 100644 --- a/extensions/markdown/src/security.ts +++ b/extensions/markdown/src/security.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; -import { getMarkdownUri, MDDocumentContentProvider } from './previewContentProvider'; +import { getMarkdownUri, MDDocumentContentProvider } from './features/previewContentProvider'; import * as nls from 'vscode-nls'; diff --git a/extensions/markdown/src/telemetryReporter.ts b/extensions/markdown/src/telemetryReporter.ts new file mode 100644 index 000000000000..d00dca386d1a --- /dev/null +++ b/extensions/markdown/src/telemetryReporter.ts @@ -0,0 +1,60 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as vscode from 'vscode'; +import { default as VSCodeTelemetryReporter } from 'vscode-extension-telemetry'; + +interface IPackageInfo { + name: string; + version: string; + aiKey: string; +} + +export interface TelemetryReporter { + dispose(): void; + sendTelemetryEvent(eventName: string, properties?: { + [key: string]: string; + }): void; +} + +const nullReporter = new class NullTelemetryReporter implements TelemetryReporter { + sendTelemetryEvent() { /** noop */ } + dispose() { /** noop */ } +}; + +class ExtensionReporter implements TelemetryReporter { + private readonly _reporter: VSCodeTelemetryReporter; + + constructor( + packageInfo: IPackageInfo + ) { + this._reporter = new VSCodeTelemetryReporter(packageInfo.name, packageInfo.version, packageInfo.aiKey); + } + sendTelemetryEvent(eventName: string, properties?: { + [key: string]: string; + }) { + this._reporter.sendTelemetryEvent(eventName, properties); + } + + dispose() { + this._reporter.dispose(); + } +} + +export function loadDefaultTelemetryReporter(): TelemetryReporter { + const packageInfo = getPackageInfo(); + return packageInfo ? new ExtensionReporter(packageInfo) : nullReporter; +} + +function getPackageInfo(): IPackageInfo | null { + const extention = vscode.extensions.getExtension('Microsoft.vscode-markdown'); + if (extention && extention.packageJSON) { + return { + name: extention.packageJSON.name, + version: extention.packageJSON.version, + aiKey: extention.packageJSON.aiKey + }; + } + return null; +} diff --git a/extensions/markdown/syntaxes/markdown.tmLanguage b/extensions/markdown/syntaxes/markdown.tmLanguage index a39b9d80b1e0..26a48c15d3e6 100644 --- a/extensions/markdown/syntaxes/markdown.tmLanguage +++ b/extensions/markdown/syntaxes/markdown.tmLanguage @@ -478,7 +478,7 @@ list_paragraph begin - (^|\G)(?=\S)(?![*+-]\s|[0-9]+\.\s) + (^|\G)(?=\S)(?![*+->]\s|[0-9]+\.\s) name meta.paragraph.markdown patterns @@ -497,7 +497,7 @@ while - (^|\G)(?!\s*$|#|[ ]{0,3}([-*_][ ]{2,}){3,}[ \t]*$\n?|>|[ ]{0,3}[*+-]|[ ]{0,3}[0-9]+\.) + (^|\G)(?!\s*$|#|[ ]{0,3}([-*_>][ ]{2,}){3,}[ \t]*$\n?|[ ]{0,3}[*+->]|[ ]{0,3}[0-9]+\.) lists @@ -522,11 +522,11 @@ include - #list_paragraph + #block include - #block + #list_paragraph while @@ -549,11 +549,11 @@ include - #list_paragraph + #block include - #block + #list_paragraph while diff --git a/extensions/markdown/syntaxes/markdown.tmLanguage.base b/extensions/markdown/syntaxes/markdown.tmLanguage.base index b24197713a31..ca8b920a22ff 100644 --- a/extensions/markdown/syntaxes/markdown.tmLanguage.base +++ b/extensions/markdown/syntaxes/markdown.tmLanguage.base @@ -303,7 +303,7 @@ list_paragraph begin - (^|\G)(?=\S)(?![*+-]\s|[0-9]+\.\s) + (^|\G)(?=\S)(?![*+->]\s|[0-9]+\.\s) name meta.paragraph.markdown patterns @@ -322,7 +322,7 @@ while - (^|\G)(?!\s*$|#|[ ]{0,3}([-*_][ ]{2,}){3,}[ \t]*$\n?|>|[ ]{0,3}[*+-]|[ ]{0,3}[0-9]+\.) + (^|\G)(?!\s*$|#|[ ]{0,3}([-*_>][ ]{2,}){3,}[ \t]*$\n?|[ ]{0,3}[*+->]|[ ]{0,3}[0-9]+\.) lists @@ -347,11 +347,11 @@ include - #list_paragraph + #block include - #block + #list_paragraph while @@ -374,11 +374,11 @@ include - #list_paragraph + #block include - #block + #list_paragraph while diff --git a/extensions/markdown/test/colorize-fixtures/test.md b/extensions/markdown/test/colorize-fixtures/test.md index 5a003c7b7f0e..28f3590536e5 100644 --- a/extensions/markdown/test/colorize-fixtures/test.md +++ b/extensions/markdown/test/colorize-fixtures/test.md @@ -47,6 +47,7 @@ in_words_are ignored. >> And, they can be nested 1. A numbered list + > Block quotes in list 2. Which is numbered 3. With periods and a space diff --git a/extensions/markdown/test/colorize-results/test_md.json b/extensions/markdown/test/colorize-results/test_md.json index c07d83165257..01b3aac17072 100644 --- a/extensions/markdown/test/colorize-results/test_md.json +++ b/extensions/markdown/test/colorize-results/test_md.json @@ -1792,6 +1792,50 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": " ", + "t": "text.html.markdown markup.list.numbered.markdown", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ">", + "t": "text.html.markdown markup.list.numbered.markdown markup.quote.markdown beginning.punctuation.definition.quote.markdown", + "r": { + "dark_plus": "beginning.punctuation.definition.quote.markdown: #608B4E", + "light_plus": "beginning.punctuation.definition.quote.markdown: #0451A5", + "dark_vs": "beginning.punctuation.definition.quote.markdown: #608B4E", + "light_vs": "beginning.punctuation.definition.quote.markdown: #0451A5", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "text.html.markdown markup.list.numbered.markdown markup.quote.markdown", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Block quotes in list", + "t": "text.html.markdown markup.list.numbered.markdown markup.quote.markdown meta.paragraph.markdown", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "2.", "t": "text.html.markdown markup.list.numbered.markdown beginning.punctuation.definition.list.markdown", diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index 38a330873458..02ca68b911e9 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -21,6 +21,11 @@ }, "contributes": { "commands": [ + { + "category": "%command.category%", + "title": "%command.accept.all-current%", + "command": "merge-conflict.accept.all-current" + }, { "category": "%command.category%", "title": "%command.accept.all-incoming%", diff --git a/extensions/merge-conflict/package.nls.json b/extensions/merge-conflict/package.nls.json index b2927ca3431c..1df5beb9e71a 100644 --- a/extensions/merge-conflict/package.nls.json +++ b/extensions/merge-conflict/package.nls.json @@ -1,5 +1,6 @@ { "command.category": "Merge Conflict", + "command.accept.all-current": "Accept All Current", "command.accept.all-incoming": "Accept All Incoming", "command.accept.all-both": "Accept All Both", "command.accept.current": "Accept Current", diff --git a/extensions/ms-vscode.node-debug/OSSREADME.json b/extensions/ms-vscode.node-debug/OSSREADME.json index dd57c88e8050..215c33cbe0f4 100644 --- a/extensions/ms-vscode.node-debug/OSSREADME.json +++ b/extensions/ms-vscode.node-debug/OSSREADME.json @@ -1,129 +1,16 @@ -// ATTENTION - THIS DIRECTORY CONTAINS THIRD PARTY OPEN SOURCE MATERIALS: -[ -{ - "name": "agent-base", - "repositoryURL": "https://github.com/TooTallNate/node-agent-base", - "version": "1.0.2", +[{ + "isLicense": true, + "name": "@types/source-map", + "repositoryURL": "https://www.github.com/DefinitelyTyped/DefinitelyTyped", "license": "MIT", - "isProd": true -}, -{ - "name": "balanced-match", - "repositoryURL": "https://github.com/juliangruber/balanced-match", - "version": "1.0.0", - "license": "MIT", - "isProd": true -}, -{ - "name": "brace-expansion", - "repositoryURL": "https://github.com/juliangruber/brace-expansion", - "version": "1.1.8", - "license": "MIT", - "isProd": true -}, -{ - "name": "concat-map", - "repositoryURL": "https://github.com/substack/node-concat-map", - "version": "0.0.1", - "license": "MIT", - "isProd": true -}, -{ - "name": "debug", - "repositoryURL": "https://github.com/visionmedia/debug", - "version": "2.6.8", - "license": "MIT", - "isProd": true -}, -{ - "name": "extend", - "repositoryURL": "https://github.com/justmoon/node-extend", - "version": "3.0.1", - "license": "MIT", - "isProd": true -}, -{ - "name": "fs.realpath", - "repositoryURL": "https://github.com/isaacs/fs.realpath", - "version": "1.0.0", - "license": "ISC", - "isProd": true -}, -{ - "name": "glob", - "repositoryURL": "https://github.com/isaacs/node-glob", - "version": "7.1.2", - "license": "ISC", - "isProd": true -}, -{ - "name": "http-proxy-agent", - "repositoryURL": "https://github.com/TooTallNate/node-http-proxy-agent", - "version": "0.2.7", - "license": "MIT", - "isProd": true -}, -{ - "name": "https-proxy-agent", - "repositoryURL": "https://github.com/TooTallNate/node-https-proxy-agent", - "version": "0.3.6", - "license": "MIT", - "isProd": true -}, -{ - "name": "inflight", - "repositoryURL": "https://github.com/npm/inflight", - "version": "1.0.6", - "license": "ISC", - "isProd": true -}, -{ - "name": "inherits", - "repositoryURL": "https://github.com/isaacs/inherits", - "version": "2.0.3", - "license": "ISC", - "isProd": true -}, -{ - "name": "minimatch", - "repositoryURL": "https://github.com/isaacs/minimatch", - "version": "3.0.4", - "license": "ISC", - "isProd": true -}, -{ - "name": "ms", - "repositoryURL": "https://github.com/rauchg/ms.js", - "version": "2.0.0", - "license": "MIT", - "isProd": true -}, -{ - "name": "once", - "repositoryURL": "https://github.com/isaacs/once", - "version": "1.4.0", - "license": "ISC", - "isProd": true -}, -{ - "name": "path-is-absolute", - "repositoryURL": "https://github.com/sindresorhus/path-is-absolute", - "version": "1.0.1", - "license": "MIT", - "isProd": true -}, -{ - "name": "source-map", - "repositoryURL": "https://github.com/mozilla/source-map", - "version": "0.5.6", - "license": "BSD-3-Clause", - "isProd": true -}, -{ - "name": "wrappy", - "repositoryURL": "https://github.com/npm/wrappy", - "version": "1.0.2", - "license": "ISC", - "isProd": true -} -] \ No newline at end of file + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] +}] diff --git a/extensions/ms-vscode.node-debug/package-lock.json b/extensions/ms-vscode.node-debug/package-lock.json new file mode 100644 index 000000000000..82260da1aa1e --- /dev/null +++ b/extensions/ms-vscode.node-debug/package-lock.json @@ -0,0 +1,7077 @@ +{ + "name": "node-debug", + "version": "1.19.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz", + "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=", + "dev": true, + "requires": { + "acorn": "5.2.1", + "css": "2.2.1", + "normalize-path": "2.1.1", + "source-map": "0.5.7", + "through2": "2.0.3" + }, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "requires": { + "normalize-path": "2.1.1", + "through2": "2.0.3" + } + }, + "@types/mocha": { + "version": "2.2.42", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.42.tgz", + "integrity": "sha512-b6gVDoxEbAQGwbV7gSzeFw/hy3/eEAokztktdzl4bHvGgb9K5zW4mVQDlVYch2w31m8t/J7L2iqhQvz3r5edCQ==", + "dev": true + }, + "@types/node": { + "version": "6.0.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.52.tgz", + "integrity": "sha1-GsOpm0IyD55GNILyWvTCNZRzqqY=", + "dev": true + }, + "@types/source-map": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/source-map/-/source-map-0.5.1.tgz", + "integrity": "sha512-/GVAjL1Y8puvZab63n8tsuBiYwZt1bApMdx58/msQ9ID5T05ov+wm/ZV1DvYC/DKKEygpTJViqQvkh5Rhrl4CA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "agent-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", + "integrity": "sha1-aJDT+yFwBLYrcPiSjg+uX4lSpwY=" + }, + "ajv": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.4.0.tgz", + "integrity": "sha1-MtHPCNvIDEMvQm8S4QslEfa0ZHQ=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", + "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "boxen": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", + "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.4", + "parse5": "3.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "1.0.7", + "through2": "2.0.3" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", + "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "source-map": "0.1.43", + "source-map-resolve": "0.3.1", + "urix": "0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.35" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.2.1.tgz", + "integrity": "sha512-u0TV6HcfLsZ03xLBhdhSViQMldaiQ2o+8/nSILaXkuNSWvxkx66vYJUAam0Eu7gAilJRX/69J4kKdqajQPaPyw==", + "dev": true, + "requires": { + "debug": "3.1.0", + "memoizee": "0.4.11", + "object-assign": "4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", + "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.3" + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.1.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "0.2.0", + "which": "1.3.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.0" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.4", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + } + }, + "gulp-chmod": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", + "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true, + "requires": { + "deep-assign": "1.0.0", + "stat-mode": "0.2.2", + "through2": "2.0.3" + } + }, + "gulp-filter": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.0.1.tgz", + "integrity": "sha512-5olRzAhFdXB2klCu1lnazP65aO9YdA/5WfC9VdInIc8PrUeDIoZfaA3Edb0yUBGhVdHv4eHKL9Fg5tUoEJ9z5A==", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "multimatch": "2.1.0", + "streamfilter": "1.0.5" + } + }, + "gulp-gunzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", + "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "gulp-remote-src": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz", + "integrity": "sha1-VyjP1kNDPdSEXd7wlp8PlxoqtKE=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "node.extend": "1.1.6", + "request": "2.79.0", + "through2": "2.0.3", + "vinyl": "2.0.2" + }, + "dependencies": { + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "is-stream": "1.1.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "gulp-sourcemaps": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.1.tgz", + "integrity": "sha512-1qHCI3hdmsMdq/SUotxwUh/L8YzlI6J9zQ5ifNOtx4Y6KV5y5sGuORv1KZzWhuKtz/mXNh5xLESUtwC4EndCjA==", + "dev": true, + "requires": { + "@gulp-sourcemaps/identity-map": "1.0.1", + "@gulp-sourcemaps/map-sources": "1.0.0", + "acorn": "4.0.13", + "convert-source-map": "1.5.0", + "css": "2.2.1", + "debug-fabulous": "0.2.1", + "detect-newline": "2.1.0", + "graceful-fs": "4.1.11", + "source-map": "0.6.1", + "strip-bom-string": "1.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-symdest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", + "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "mkdirp": "0.5.1", + "queue": "3.1.0", + "vinyl-fs": "2.4.4" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.0", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.3" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } + } + } + }, + "gulp-tsb": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/gulp-tsb/-/gulp-tsb-2.0.4.tgz", + "integrity": "sha1-CymAktTf1OXP2AZ57Uwdk7/bpko=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "through": "2.3.8", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "gulp-tslint": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.2.tgz", + "integrity": "sha512-0RNGqbp2TKPdbG+sWU3mNMXEMuF/noY1KS4+jd5lOStkvuFINkFL29dHX3IT1u+vVFD4Glwf+lkcdR2QMVNMzA==", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "map-stream": "0.0.7", + "through": "2.3.8" + }, + "dependencies": { + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "dev": true + } + } + }, + "gulp-typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.2.tgz", + "integrity": "sha1-t+Xh08s193LlPmBAJmAYJuK+d/w=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "source-map": "0.5.7", + "through2": "2.0.3", + "vinyl-fs": "2.4.4" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.0", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.3" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } + } + } + }, + "gulp-uglify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-2.0.0.tgz", + "integrity": "sha1-y+Sq5P4La912AzW8RvIA//aZxK8=", + "dev": true, + "requires": { + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash": "4.17.4", + "make-error-cause": "1.2.2", + "through2": "2.0.3", + "uglify-js": "2.7.0", + "uglify-save-license": "0.4.1", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "gulp-untar": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", + "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "gulp-util": "3.0.8", + "streamifier": "0.1.1", + "tar": "2.2.1", + "through2": "2.0.3" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulp-vinyl-zip": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", + "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "queue": "4.4.2", + "through2": "2.0.3", + "vinyl": "2.1.0", + "vinyl-fs": "2.4.4", + "yauzl": "2.9.1", + "yazl": "2.4.3" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.0", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.3" + } + }, + "queue": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", + "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.1", + "pinkie-promise": "2.0.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "http-proxy-agent": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-0.2.7.tgz", + "integrity": "sha1-4X/aZfCQLZUs55IeYsf/iGJlWl4=", + "requires": { + "agent-base": "1.0.2", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-proxy-agent": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz", + "integrity": "sha1-cT+jjl01P1DrFKNC/r4pAz7RYZs=", + "requires": { + "agent-base": "1.0.2", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.0" + } + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "0.1.2" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true, + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.5.0" + } + }, + "linkify-it": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", + "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "dev": true, + "requires": { + "uc.micro": "1.0.3" + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9", + "lodash.restparam": "3.6.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._createassigner": "3.1.1", + "lodash.keys": "3.1.2" + } + }, + "lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "dev": true, + "requires": { + "lodash.assign": "3.2.0", + "lodash.restparam": "3.6.1" + } + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "0.10.35" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", + "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", + "dev": true + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, + "requires": { + "make-error": "1.3.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "markdown-it": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.0.tgz", + "integrity": "sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "entities": "1.1.1", + "linkify-it": "2.0.3", + "mdurl": "1.0.1", + "uc.micro": "1.0.3" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "memoizee": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.11.tgz", + "integrity": "sha1-vemBdmPJ5A/bKk6hw2cpYIeujI8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-weak-map": "2.0.2", + "event-emitter": "0.3.5", + "is-promise": "2.1.0", + "lru-queue": "0.1.0", + "next-tick": "1.0.0", + "timers-ext": "0.1.2" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz", + "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, + "requires": { + "is": "3.2.1" + } + }, + "nodemon": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", + "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "debug": "2.6.9", + "es6-promise": "3.3.1", + "ignore-by-default": "1.0.1", + "lodash.defaults": "3.1.2", + "minimatch": "3.0.4", + "ps-tree": "1.1.0", + "touch": "3.1.0", + "undefsafe": "0.0.3", + "update-notifier": "2.3.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.0.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true, + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "6.0.52" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "3.3.4" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + }, + "queue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", + "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "0.0.7" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true, + "requires": { + "rc": "1.2.2", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.4.0", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "request-light": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.2.1.tgz", + "integrity": "sha1-mG9agok+nRymqJbr5vRsUca0VX8=", + "requires": { + "http-proxy-agent": "0.2.7", + "https-proxy-agent": "0.3.6", + "vscode-nls": "2.0.2" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-sequence": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.0.tgz", + "integrity": "sha512-xW5DmUwdvoyYQUMPKN8UW7TZSFs7AxtT59xo1m5y91jHbvwGlGgOmdV1Yw5P68fkjf3aHUZ4G1o1mZCtNe0qtw==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "gulp-util": "3.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", + "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", + "dev": true, + "requires": { + "atob": "1.1.3", + "resolve-url": "0.2.1", + "source-map-url": "0.3.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", + "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + }, + "source-map-url": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", + "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", + "dev": true + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamfilter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.5.tgz", + "integrity": "sha1-h1BxEb644phFFxe1Ec/tjwAqv1M=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "streamifier": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-ext": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz", + "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", + "dev": true, + "requires": { + "es5-ext": "0.10.35", + "next-tick": "1.0.0" + } + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1" + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "1.0.10" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tslib": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", + "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==", + "dev": true + }, + "tslint": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", + "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.3.0", + "commander": "2.11.0", + "diff": "3.3.1", + "glob": "7.1.2", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.4.1", + "tslib": "1.8.0", + "tsutils": "2.12.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "tslint-microsoft-contrib": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.1.tgz", + "integrity": "sha1-Mo7pwo0HzfeTKTIEyW4v+rkiGZQ=", + "dev": true, + "requires": { + "tsutils": "1.9.1" + }, + "dependencies": { + "tsutils": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", + "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "dev": true + } + } + }, + "tsutils": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.12.2.tgz", + "integrity": "sha1-rVikhl0X7D3bZjG2ylO+FKVlb/M=", + "dev": true, + "requires": { + "tslib": "1.8.0" + } + }, + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typed-rest-client": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz", + "integrity": "sha1-92jMDcP06VDwbgSCXDaz54NKofI=", + "dev": true, + "requires": { + "tunnel": "0.0.4", + "underscore": "1.8.3" + } + }, + "typescript": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz", + "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE=", + "dev": true + }, + "uc.micro": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", + "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=", + "dev": true + }, + "uglify-js": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.0.tgz", + "integrity": "sha1-8CHji6LKdAhg9b1caVwqgXNF8Ow=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undefsafe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", + "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "1.2.2", + "chalk": "2.3.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-join": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", + "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "dev": true + }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-source-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz", + "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "vsce": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.32.0.tgz", + "integrity": "sha1-EN+pIyGCwg6r5r8xJdMzpLIG/j0=", + "dev": true, + "requires": { + "cheerio": "1.0.0-rc.2", + "commander": "2.11.0", + "denodeify": "1.2.1", + "glob": "7.1.2", + "lodash": "4.17.4", + "markdown-it": "8.4.0", + "mime": "1.4.1", + "minimatch": "3.0.4", + "osenv": "0.1.4", + "read": "1.0.7", + "semver": "5.4.1", + "tmp": "0.0.29", + "url-join": "1.1.0", + "vso-node-api": "6.1.2-preview", + "yauzl": "2.9.1", + "yazl": "2.4.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, + "vscode": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.6.tgz", + "integrity": "sha1-Ru0a+iwbnWifY5TI8WvR1xkPdfs=", + "dev": true, + "requires": { + "glob": "7.1.2", + "gulp-chmod": "2.0.0", + "gulp-filter": "5.0.1", + "gulp-gunzip": "1.0.0", + "gulp-remote-src": "0.4.3", + "gulp-symdest": "1.1.0", + "gulp-untar": "0.0.6", + "gulp-vinyl-zip": "2.1.0", + "mocha": "4.0.1", + "request": "2.83.0", + "semver": "5.4.1", + "source-map-support": "0.5.0", + "url-parse": "1.2.0", + "vinyl-source-stream": "1.1.0" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, + "vscode-debugadapter": { + "version": "1.25.0-pre.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.25.0-pre.0.tgz", + "integrity": "sha1-0pDsVH5h5Pvss2P/9ojSAyMZQmQ=", + "requires": { + "vscode-debugprotocol": "1.25.0-pre.0" + }, + "dependencies": { + "vscode-debugprotocol": { + "version": "1.25.0-pre.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.25.0-pre.0.tgz", + "integrity": "sha1-rYPnvZWxmseV31D6Di/pA0YqcrY=" + } + } + }, + "vscode-debugadapter-testsupport": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter-testsupport/-/vscode-debugadapter-testsupport-1.24.0.tgz", + "integrity": "sha1-rDZ1scU/wW+1JMvSt+znEhtiXng=", + "dev": true, + "requires": { + "vscode-debugprotocol": "1.24.0" + } + }, + "vscode-debugprotocol": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.24.0.tgz", + "integrity": "sha1-28EOjX2VsQJyehmvPw/O9+JSsI4=", + "dev": true + }, + "vscode-nls": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-2.0.2.tgz", + "integrity": "sha1-gIUiOAhEuK0VNJmvXDsDkhrqAto=" + }, + "vscode-nls-dev": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vscode-nls-dev/-/vscode-nls-dev-2.1.5.tgz", + "integrity": "sha1-GfqjsYp/MCIBA5pMlnu9IvoShE0=", + "dev": true, + "requires": { + "clone": "1.0.3", + "event-stream": "3.3.4", + "glob": "6.0.4", + "gulp-util": "3.0.8", + "iconv-lite": "0.4.19", + "is": "3.2.1", + "source-map": "0.5.7", + "typescript": "2.6.1", + "vinyl": "1.2.0", + "xml2js": "0.4.19", + "yargs": "3.32.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "vso-node-api": { + "version": "6.1.2-preview", + "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.1.2-preview.tgz", + "integrity": "sha1-qrNUbfJFHs2JTgcbuZtd8Zxfp48=", + "dev": true, + "requires": { + "q": "1.5.1", + "tunnel": "0.0.4", + "typed-rest-client": "0.9.0", + "underscore": "1.8.3" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.4" + } + }, + "xmlbuilder": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", + "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, + "yazl": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", + "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13" + } + } + } +} diff --git a/extensions/ms-vscode.node-debug2/OSSREADME.json b/extensions/ms-vscode.node-debug2/OSSREADME.json index e2b9268eb401..83ffc0884d28 100644 --- a/extensions/ms-vscode.node-debug2/OSSREADME.json +++ b/extensions/ms-vscode.node-debug2/OSSREADME.json @@ -1,150 +1,23 @@ -// ATTENTION - THIS DIRECTORY CONTAINS THIRD PARTY OPEN SOURCE MATERIALS: -[ -{ - "name": "agent-base", - "repositoryURL": "https://github.com/TooTallNate/node-agent-base", - "version": "1.0.2", +[{ + "isLicense": true, + "name": "noice-json-rpc", + "repositoryURL": "https://github.com/nojvek/noice-json-rpc", "license": "MIT", - "isProd": true -}, -{ - "name": "balanced-match", - "repositoryURL": "https://github.com/juliangruber/balanced-match", - "version": "0.4.2", - "license": "MIT", - "isProd": true -}, -{ - "name": "brace-expansion", - "repositoryURL": "https://github.com/juliangruber/brace-expansion", - "version": "1.1.6", - "license": "MIT", - "isProd": true -}, -{ - "name": "concat-map", - "repositoryURL": "https://github.com/substack/node-concat-map", - "version": "0.0.1", - "license": "MIT", - "isProd": true -}, -{ - "name": "debug", - "repositoryURL": "https://github.com/visionmedia/debug", - "version": "2.2.0", - "license": "MIT", - "isProd": true -}, -{ - "name": "extend", - "repositoryURL": "https://github.com/justmoon/node-extend", - "version": "3.0.0", - "license": "MIT", - "isProd": true -}, -{ - "name": "fs.realpath", - "repositoryURL": "https://github.com/isaacs/fs.realpath", - "version": "1.0.0", - "license": "ISC", - "isProd": true -}, -{ - "name": "glob", - "repositoryURL": "https://github.com/isaacs/node-glob", - "version": "7.1.0", - "license": "ISC", - "isProd": true -}, -{ - "name": "http-proxy-agent", - "repositoryURL": "https://github.com/TooTallNate/node-http-proxy-agent", - "version": "0.2.7", - "license": "MIT", - "isProd": true -}, -{ - "name": "https-proxy-agent", - "repositoryURL": "https://github.com/TooTallNate/node-https-proxy-agent", - "version": "0.3.6", - "license": "MIT", - "isProd": true -}, -{ - "name": "inflight", - "repositoryURL": "https://github.com/npm/inflight", - "version": "1.0.5", - "license": "ISC", - "isProd": true -}, -{ - "name": "inherits", - "repositoryURL": "https://github.com/isaacs/inherits", - "version": "2.0.3", - "license": "ISC", - "isProd": true -}, -{ - "name": "minimatch", - "repositoryURL": "https://github.com/isaacs/minimatch", - "version": "3.0.3", - "license": "ISC", - "isProd": true -}, -{ - "name": "ms", - "repositoryURL": "https://github.com/rauchg/ms.js", - "version": "0.7.1", - "license": "MIT", - "isProd": true -}, -{ - "name": "once", - "repositoryURL": "https://github.com/isaacs/once", - "version": "1.4.0", - "license": "ISC", - "isProd": true -}, -{ - "name": "options", - "repositoryURL": "https://github.com/einaros/options.js", - "version": "0.0.6", - "license": "MIT", - "isProd": true -}, -{ - "name": "ultron", - "repositoryURL": "https://github.com/unshiftio/ultron", - "version": "1.0.2", - "license": "MIT", - "isProd": true -}, -{ - "name": "path-is-absolute", - "repositoryURL": "https://github.com/sindresorhus/path-is-absolute", - "version": "1.0.0", - "license": "MIT", - "isProd": true -}, -{ - "name": "source-map", - "repositoryURL": "https://github.com/mozilla/source-map", - "version": "0.5.6", - "license": "BSD-3-Clause", - "isProd": true -}, -{ - "name": "wrappy", - "repositoryURL": "https://github.com/npm/wrappy", - "version": "1.0.2", - "license": "ISC", - "isProd": true -}, -{ - "name": "ws", - "repositoryURL": "https://github.com/websockets/ws", - "version": "1.1.1", - "license": "MIT", - "isProd": true -} -] \ No newline at end of file + "licenseDetail": [ + "Copyright (c) Manoj Patel", + "", + "MIT License", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation", + "files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy,", + "modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES", + "OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS", + "BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT", + "OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] +}] diff --git a/extensions/ms-vscode.node-debug2/package-lock.json b/extensions/ms-vscode.node-debug2/package-lock.json new file mode 100644 index 000000000000..7f8ba502cc46 --- /dev/null +++ b/extensions/ms-vscode.node-debug2/package-lock.json @@ -0,0 +1,5106 @@ +{ + "name": "node-debug2", + "version": "1.19.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz", + "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=", + "dev": true, + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "css": "2.2.1", + "normalize-path": "2.1.1", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "through2": "2.0.3" + }, + "dependencies": { + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha1-MXrHghgmwixwLWYYmrg1lnXxNdc=", + "dev": true + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "requires": { + "normalize-path": "2.1.1", + "through2": "2.0.3" + } + }, + "@types/mocha": { + "version": "2.2.44", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.44.tgz", + "integrity": "sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw==", + "dev": true + }, + "@types/node": { + "version": "6.0.92", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.92.tgz", + "integrity": "sha512-awEYSSTn7dauwVCYSx2CJaPTu0Z1Ht2oR1b2AD3CYao6ZRb+opb6EL43fzmD7eMFgMHzTBWSUzlWSD+S8xN0Nw==", + "dev": true + }, + "@types/source-map": { + "version": "https://registry.npmjs.org/@types/source-map/-/source-map-0.1.29.tgz", + "integrity": "sha1-1wSKYBgLCfiqbVO9oxHGtRy9cBg=" + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "agent-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", + "integrity": "sha1-aJDT+yFwBLYrcPiSjg+uX4lSpwY=" + }, + "ajv": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz", + "integrity": "sha1-6yhAdG6dxIvV4GOjbj/UAMXqtak=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + } + }, + "arr-flatten": { + "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", + "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.4", + "parse5": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "process-nextick-args": "1.0.7", + "through2": "2.0.3" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "css": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", + "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "source-map": "0.1.43", + "source-map-resolve": "0.3.1", + "urix": "0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.37" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "debug-fabulous": { + "version": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.2.1.tgz", + "integrity": "sha1-V+EWS6DprW2aZfIAdf88K9a94Nw=", + "dev": true, + "requires": { + "debug": "3.1.0", + "memoizee": "0.4.11", + "object-assign": "4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", + "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.3" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } + }, + "duplexify": { + "version": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha1-ThUWvmiDi8kKSZlPCzmm5ZYL780=", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "stream-shift": "1.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + } + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "es5-ext": { + "version": "0.10.37", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", + "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-symbol": "3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "extend": { + "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.1.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "mkdirp": "0.5.1", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "2.0.10", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "0.2.0", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.0" + } + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.4", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + } + }, + "gulp-chmod": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", + "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true, + "requires": { + "deep-assign": "1.0.0", + "stat-mode": "0.2.2", + "through2": "2.0.3" + } + }, + "gulp-filter": { + "version": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.0.1.tgz", + "integrity": "sha1-XYf2YuMX5YOe92UOYg5skAj/ktA=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "multimatch": "2.1.0", + "streamfilter": "1.0.5" + } + }, + "gulp-gunzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", + "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "gulp-remote-src": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz", + "integrity": "sha1-VyjP1kNDPdSEXd7wlp8PlxoqtKE=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "node.extend": "1.1.6", + "request": "2.79.0", + "through2": "2.0.3", + "vinyl": "2.0.2" + }, + "dependencies": { + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" + } + }, + "vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "is-stream": "1.1.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "gulp-sourcemaps": { + "version": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.1.tgz", + "integrity": "sha1-gzpOKPC49GYQdQMs14JBf3zY+ws=", + "dev": true, + "requires": { + "@gulp-sourcemaps/identity-map": "1.0.1", + "@gulp-sourcemaps/map-sources": "1.0.0", + "acorn": "4.0.13", + "convert-source-map": "1.5.1", + "css": "2.2.1", + "debug-fabulous": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.2.1.tgz", + "detect-newline": "2.1.0", + "graceful-fs": "4.1.11", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "strip-bom-string": "1.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-symdest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", + "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "mkdirp": "0.5.1", + "queue": "3.1.0", + "vinyl-fs": "2.4.4" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } + } + } + }, + "gulp-tslint": { + "version": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.2.tgz", + "integrity": "sha1-4PQxlLRz1+drtFpY/oxg59/jvrI=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "map-stream": "0.0.7", + "through": "2.3.8" + }, + "dependencies": { + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "dev": true + } + } + }, + "gulp-typescript": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.3.tgz", + "integrity": "sha512-Np2sJXgtDUwIAoMtlJ9uXsVmpu1FWXlKZw164hLuo56uJa7qo5W2KZ0yAYiYH/HUsaz5L0O2toMOcLIokpFCPg==", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "through2": "2.0.3", + "vinyl-fs": "2.4.4" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } + } + } + }, + "gulp-untar": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", + "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "gulp-util": "3.0.8", + "streamifier": "0.1.1", + "tar": "2.2.1", + "through2": "2.0.3" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulp-vinyl-zip": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", + "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "queue": "4.4.2", + "through2": "2.0.3", + "vinyl": "2.1.0", + "vinyl-fs": "2.4.4", + "yauzl": "2.9.1", + "yazl": "2.4.3" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.3" + } + }, + "queue": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", + "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.9.0", + "is-my-json-valid": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "pinkie-promise": "2.0.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + } + } + }, + "http-proxy-agent": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-0.2.7.tgz", + "integrity": "sha1-4X/aZfCQLZUs55IeYsf/iGJlWl4=", + "requires": { + "agent-base": "1.0.2", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-proxy-agent": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz", + "integrity": "sha1-cT+jjl01P1DrFKNC/r4pAz7RYZs=", + "requires": { + "agent-base": "1.0.2", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz" + } + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "dev": true + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + } + }, + "is-buffer": { + "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-my-json-valid": { + "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "0.1.2" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true, + "requires": { + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz" + } + }, + "linkify-it": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", + "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "dev": true, + "requires": { + "uc.micro": "1.0.3" + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "0.10.37" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "markdown-it": { + "version": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.0.tgz", + "integrity": "sha1-4kAIgb8XH3AY7RvZ2kQdrIr2MG0=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "entities": "1.1.1", + "linkify-it": "2.0.3", + "mdurl": "1.0.1", + "uc.micro": "1.0.3" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "memoizee": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.11.tgz", + "integrity": "sha1-vemBdmPJ5A/bKk6hw2cpYIeujI8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-weak-map": "2.0.2", + "event-emitter": "0.3.5", + "is-promise": "2.1.0", + "lru-queue": "0.1.0", + "next-tick": "1.0.0", + "timers-ext": "0.1.2" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, + "requires": { + "is": "3.2.1" + } + }, + "noice-json-rpc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/noice-json-rpc/-/noice-json-rpc-1.0.1.tgz", + "integrity": "sha1-XnKJpgocIIgEicsVEBVSusOSJm4=" + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.0.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true, + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "dev": true, + "requires": { + "semver": "5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, + "parse5": { + "version": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w=", + "dev": true, + "requires": { + "@types/node": "6.0.92" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + }, + "queue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", + "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "randomatic": { + "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "0.0.7" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz" + } + }, + "regex-cache": { + "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz" + }, + "dependencies": { + "boom": { + "version": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", + "dev": true, + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz" + } + } + } + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.0", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "sntp": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz" + } + }, + "hoek": { + "version": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha1-ctnQdU9/4lyi0BrY+PmpRJqJUm0=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "dev": true + }, + "sntp": { + "version": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", + "dev": true, + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + } + } + }, + "request-light": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.1.0.tgz", + "integrity": "sha1-/mXd/7suh5RPDMr9hcuDnpE4U0U=", + "requires": { + "http-proxy-agent": "0.2.7", + "https-proxy-agent": "0.3.6", + "vscode-nls": "1.0.7" + }, + "dependencies": { + "vscode-nls": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-1.0.7.tgz", + "integrity": "sha1-KYwB/Oh4AsZEwKFe9SajPGLA1Y4=" + } + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "rimraf": { + "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + } + }, + "run-sequence": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz", + "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "gulp-util": "3.0.8" + } + }, + "safe-buffer": { + "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "dev": true + }, + "sax": { + "version": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + }, + "source-map-resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", + "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", + "dev": true, + "requires": { + "atob": "1.1.3", + "resolve-url": "0.2.1", + "source-map-url": "0.3.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", + "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", + "dev": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", + "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", + "dev": true + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamfilter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.5.tgz", + "integrity": "sha1-h1BxEb644phFFxe1Ec/tjwAqv1M=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + } + } + }, + "streamifier": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "xtend": "4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + } + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-ext": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz", + "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", + "dev": true, + "requires": { + "es5-ext": "0.10.37", + "next-tick": "1.0.0" + } + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tslib": { + "version": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", + "integrity": "sha1-3GBOutZLy/aW1hPabJVKoOfqHrY=", + "dev": true + }, + "tslint": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", + "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.3.0", + "commander": "2.9.0", + "diff": "3.2.0", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "tslib": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", + "tsutils": "2.12.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "tsutils": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.12.2.tgz", + "integrity": "sha1-rVikhl0X7D3bZjG2ylO+FKVlb/M=", + "dev": true, + "requires": { + "tslib": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz" + } + }, + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typed-rest-client": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz", + "integrity": "sha1-92jMDcP06VDwbgSCXDaz54NKofI=", + "dev": true, + "requires": { + "tunnel": "0.0.4", + "underscore": "1.8.3" + } + }, + "typescript": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz", + "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE=", + "dev": true + }, + "uc.micro": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", + "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-join": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", + "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "dev": true + }, + "url-parse": { + "version": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha1-OhnoqqbQI93SfcxEy0/I9/7COYY=", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-source-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz", + "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vsce": { + "version": "1.33.2", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.33.2.tgz", + "integrity": "sha1-NkX2mq+YTiL3TqSdNfON0Y1m/18=", + "dev": true, + "requires": { + "cheerio": "1.0.0-rc.2", + "commander": "2.9.0", + "denodeify": "1.2.1", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "lodash": "4.17.4", + "markdown-it": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.0.tgz", + "mime": "1.6.0", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "osenv": "0.1.4", + "parse-semver": "1.1.1", + "read": "1.0.7", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "tmp": "0.0.29", + "url-join": "1.1.0", + "vso-node-api": "6.1.2-preview", + "yauzl": "2.9.1", + "yazl": "2.4.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", + "dev": true + } + } + }, + "vscode": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.8.tgz", + "integrity": "sha512-kT6sIA1AEKR5M+us2fXk5dxwV9SR/IEdLHNmVW4/dl1wNBHoEvgIo1qMQwHNxPVTQmw70KTGZ9UVeVb8FbpNFA==", + "dev": true, + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "gulp-chmod": "2.0.0", + "gulp-filter": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.0.1.tgz", + "gulp-gunzip": "1.0.0", + "gulp-remote-src": "0.4.3", + "gulp-symdest": "1.1.0", + "gulp-untar": "0.0.6", + "gulp-vinyl-zip": "2.1.0", + "mocha": "4.0.1", + "request": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "source-map-support": "0.5.0", + "url-parse": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "vinyl-source-stream": "1.1.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "mocha": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz", + "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "vscode-chrome-debug-core": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/vscode-chrome-debug-core/-/vscode-chrome-debug-core-3.19.0.tgz", + "integrity": "sha1-70aLFweJqQhC+2wsQVS7OsZXvvc=", + "requires": { + "@types/source-map": "https://registry.npmjs.org/@types/source-map/-/source-map-0.1.29.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "noice-json-rpc": "1.0.1", + "request-light": "0.1.0", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "vscode-debugadapter": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.24.0.tgz", + "vscode-debugprotocol": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.24.0.tgz", + "vscode-nls": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-2.0.2.tgz", + "ws": "1.1.5" + } + }, + "vscode-chrome-debug-core-testsupport": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/vscode-chrome-debug-core-testsupport/-/vscode-chrome-debug-core-testsupport-3.17.1.tgz", + "integrity": "sha1-DUazMXWZooWLSkz+QgzDUuQZiBw=", + "dev": true, + "requires": { + "vscode-debugadapter-testsupport": "1.24.0" + }, + "dependencies": { + "vscode-debugadapter-testsupport": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter-testsupport/-/vscode-debugadapter-testsupport-1.24.0.tgz", + "integrity": "sha1-rDZ1scU/wW+1JMvSt+znEhtiXng=", + "dev": true, + "requires": { + "vscode-debugprotocol": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.24.0.tgz" + } + } + } + }, + "vscode-debugadapter": { + "version": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.24.0.tgz", + "integrity": "sha1-KAY7AcyorB5fehPRGOMgem6If/0=", + "requires": { + "vscode-debugprotocol": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.24.0.tgz" + } + }, + "vscode-debugadapter-testsupport": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter-testsupport/-/vscode-debugadapter-testsupport-1.23.0.tgz", + "integrity": "sha1-pItd5CrYChckDZxRHDeGA41pbRs=", + "dev": true, + "requires": { + "vscode-debugprotocol": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.24.0.tgz" + } + }, + "vscode-debugprotocol": { + "version": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.24.0.tgz", + "integrity": "sha1-28EOjX2VsQJyehmvPw/O9+JSsI4=" + }, + "vscode-nls": { + "version": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-2.0.2.tgz", + "integrity": "sha1-gIUiOAhEuK0VNJmvXDsDkhrqAto=" + }, + "vscode-nls-dev": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/vscode-nls-dev/-/vscode-nls-dev-2.1.6.tgz", + "integrity": "sha512-1IylC/ekENYqz1vEItfrzrMXS8LW9aZQnNTU6BfdwT0Jddzed+l+nvU8amgVKFFmC1/GoiMFk5wtC20zWBbEbw==", + "dev": true, + "requires": { + "clone": "1.0.3", + "event-stream": "3.3.4", + "glob": "6.0.4", + "gulp-util": "3.0.8", + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "is": "3.2.1", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "typescript": "2.6.1", + "vinyl": "1.2.0", + "xml2js": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "yargs": "3.32.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vso-node-api": { + "version": "6.1.2-preview", + "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.1.2-preview.tgz", + "integrity": "sha1-qrNUbfJFHs2JTgcbuZtd8Zxfp48=", + "dev": true, + "requires": { + "q": "1.5.1", + "tunnel": "0.0.4", + "typed-rest-client": "0.9.0", + "underscore": "1.8.3" + } + }, + "which": { + "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "xml2js": { + "version": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "dev": true, + "requires": { + "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "xmlbuilder": "9.0.4" + } + }, + "xmlbuilder": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", + "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, + "yazl": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", + "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13" + } + } + } +} \ No newline at end of file diff --git a/extensions/package.json b/extensions/package.json index ce3a1287ac2c..339d071066ac 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "2.6.2-insiders.20171120" + "typescript": "2.6.2" }, "scripts": { "postinstall": "node ./postinstall" diff --git a/extensions/php/package.json b/extensions/php/package.json index 7d4eb5204e37..6954ae5c661e 100644 --- a/extensions/php/package.json +++ b/extensions/php/package.json @@ -53,7 +53,7 @@ "snippets": [ { "language": "php", - "path": "./snippets/php.json" + "path": "./snippets/php.snippets.json" } ], "configuration": { diff --git a/extensions/php/snippets/php.json b/extensions/php/snippets/php.snippets.json similarity index 95% rename from extensions/php/snippets/php.json rename to extensions/php/snippets/php.snippets.json index 24a4426a54aa..4ae37b3a6e05 100644 --- a/extensions/php/snippets/php.json +++ b/extensions/php/snippets/php.snippets.json @@ -234,5 +234,19 @@ "$0" ], "description": "Throw exception" + }, + "Region Start": { + "prefix": "#region", + "body": [ + "#region" + ], + "description": "Folding Region Start" + }, + "Region End": { + "prefix": "#endregion", + "body": [ + "#endregion" + ], + "description": "Folding Region End" } } \ No newline at end of file diff --git a/extensions/php/src/features/completionItemProvider.ts b/extensions/php/src/features/completionItemProvider.ts index c948c8357add..601944f277c6 100644 --- a/extensions/php/src/features/completionItemProvider.ts +++ b/extensions/php/src/features/completionItemProvider.ts @@ -5,12 +5,12 @@ 'use strict'; -import { CompletionItemProvider, CompletionItem, CompletionItemKind, CancellationToken, TextDocument, Position, Range, TextEdit, workspace } from 'vscode'; +import { CompletionItemProvider, CompletionItem, CompletionItemKind, CancellationToken, TextDocument, Position, Range, TextEdit, workspace, CompletionContext } from 'vscode'; import phpGlobals = require('./phpGlobals'); export default class PHPCompletionItemProvider implements CompletionItemProvider { - public provideCompletionItems(document: TextDocument, position: Position, _token: CancellationToken): Promise { + public provideCompletionItems(document: TextDocument, position: Position, _token: CancellationToken, context: CompletionContext): Promise { let result: CompletionItem[] = []; let shouldProvideCompletionItems = workspace.getConfiguration('php').get('suggest.basic', true); @@ -24,6 +24,14 @@ export default class PHPCompletionItemProvider implements CompletionItemProvider range = new Range(position, position); } + if (context.triggerCharacter === '>') { + const twoBeforeCursor = new Position(position.line, Math.max(0, position.character - 2)); + const previousTwoChars = document.getText(new Range(twoBeforeCursor, position)); + if (previousTwoChars !== '->') { + return Promise.resolve(result); + } + } + var added: any = {}; var createNewProposal = function (kind: CompletionItemKind, name: string, entry: phpGlobals.IEntry | null): CompletionItem { var proposal: CompletionItem = new CompletionItem(name); diff --git a/extensions/php/src/phpMain.ts b/extensions/php/src/phpMain.ts index 320f9da2c529..64eda6c78095 100644 --- a/extensions/php/src/phpMain.ts +++ b/extensions/php/src/phpMain.ts @@ -23,7 +23,6 @@ export function activate(context: vscode.ExtensionContext): any { context.subscriptions.push(vscode.languages.registerHoverProvider('php', new PHPHoverProvider())); context.subscriptions.push(vscode.languages.registerSignatureHelpProvider('php', new PHPSignatureHelpProvider(), '(', ',')); - // need to set in the extension host as well as the completion provider uses it. vscode.languages.setLanguageConfiguration('php', { wordPattern: /(-?\d*\.\d\w*)|([^\-\`\~\!\@\#\%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, diff --git a/extensions/python/language-configuration.json b/extensions/python/language-configuration.json index 14ad98220b4c..736124425d74 100644 --- a/extensions/python/language-configuration.json +++ b/extensions/python/language-configuration.json @@ -13,7 +13,23 @@ { "open": "[", "close": "]" }, { "open": "(", "close": ")" }, { "open": "\"", "close": "\"", "notIn": ["string"] }, - { "open": "'", "close": "'", "notIn": ["string", "comment"] } + { "open": "r\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "R\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "u\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "U\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "f\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "F\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "b\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "B\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "r'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "R'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "u'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "U'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "f'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "F'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "b'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "B'", "close": "'", "notIn": ["string", "comment"] } ], "surroundingPairs": [ ["{", "}"], diff --git a/extensions/ruby/language-configuration.json b/extensions/ruby/language-configuration.json index fc4125f06911..04a0fae6e093 100644 --- a/extensions/ruby/language-configuration.json +++ b/extensions/ruby/language-configuration.json @@ -23,7 +23,7 @@ ["'", "'"] ], "indentationRules": { - "increaseIndentPattern": "^\\s*((begin|class|(private|protected)\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while)|(.*\\sdo\\b))\\b[^\\{;]*$", - "decreaseIndentPattern": "^\\s*([}\\]]([,)]?\\s*(#|$)|\\.[a-zA-Z_]\\w*\\b)|(end|rescue|ensure|else|elsif)\\b)" + "increaseIndentPattern": "^\\s*((begin|class|(private|protected)\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while|case)|(.*\\sdo\\b)|(.*=\\s*(case|if|unless)))\\b[^\\{;]*$", + "decreaseIndentPattern": "^\\s*([}\\]]([,)]?\\s*(#|$)|\\.[a-zA-Z_]\\w*\\b)|(end|rescue|ensure|else|elsif|when)\\b)" } } diff --git a/extensions/scss/language-configuration.json b/extensions/scss/language-configuration.json index 36a9cccd688f..bdf0984ec186 100644 --- a/extensions/scss/language-configuration.json +++ b/extensions/scss/language-configuration.json @@ -21,5 +21,11 @@ ["(", ")"], ["\"", "\""], ["'", "'"] - ] + ], + "folding": { + "markers": { + "start": "^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/", + "end": "^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/" + } + } } \ No newline at end of file diff --git a/extensions/theme-defaults/themes/dark_plus.json b/extensions/theme-defaults/themes/dark_plus.json index 6fdfb2263cea..fe868c9a3750 100644 --- a/extensions/theme-defaults/themes/dark_plus.json +++ b/extensions/theme-defaults/themes/dark_plus.json @@ -80,8 +80,7 @@ { "name": "Object keys, TS grammar specific", "scope": [ - "meta.object-literal.key", - "meta.object-literal.key entity.name.function" + "meta.object-literal.key" ], "settings": { "foreground": "#9CDCFE" diff --git a/extensions/theme-defaults/themes/hc_black.json b/extensions/theme-defaults/themes/hc_black.json index 5cadf6c65cf9..c34b0981fd60 100644 --- a/extensions/theme-defaults/themes/hc_black.json +++ b/extensions/theme-defaults/themes/hc_black.json @@ -84,8 +84,7 @@ { "name": "Object keys, TS grammar specific", "scope": [ - "meta.object-literal.key", - "meta.object-literal.key entity.name.function" + "meta.object-literal.key" ], "settings": { "foreground": "#9CDCFE" diff --git a/extensions/theme-defaults/themes/light_plus.json b/extensions/theme-defaults/themes/light_plus.json index 3d5775ecec59..0ab71013c2f7 100644 --- a/extensions/theme-defaults/themes/light_plus.json +++ b/extensions/theme-defaults/themes/light_plus.json @@ -80,8 +80,7 @@ { "name": "Object keys, TS grammar specific", "scope": [ - "meta.object-literal.key", - "meta.object-literal.key entity.name.function" + "meta.object-literal.key" ], "settings": { "foreground": "#001080" diff --git a/extensions/theme-quietlight/themes/quietlight-color-theme.json b/extensions/theme-quietlight/themes/quietlight-color-theme.json index fc9e8f7db2c3..0e0bcae413e9 100644 --- a/extensions/theme-quietlight/themes/quietlight-color-theme.json +++ b/extensions/theme-quietlight/themes/quietlight-color-theme.json @@ -245,7 +245,7 @@ ], "settings": { "fontStyle": "italic", - "foreground": "#91B3E0" + "foreground": "#8190A0" } }, { @@ -460,7 +460,25 @@ "background": "#DDFFDD", "foreground": "#434343" } - } + }, + { + "name": "JSX: Tags", + "scope": [ + "punctuation.definition.tag.js", + "punctuation.definition.tag.begin.js", + "punctuation.definition.tag.end.js" + ], + "settings": { + "foreground": "#91B3E0" + } + }, + { + "name": "JSX: InnerText", + "scope": "meta.jsx.children.js", + "settings": { + "foreground": "#333333ff" + } + } ], "colors": { "focusBorder": "#A6B39B", @@ -511,4 +529,4 @@ "badge.background": "#705697AA", "progressBar.background": "#705697" } -} \ No newline at end of file +} diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index 6d2e4f192304..1997b63f7f7e 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -38,7 +38,7 @@ "onCommand:typescript.openTsServerLog", "onCommand:workbench.action.tasks.runTask" ], - "main": "./out/typescriptMain", + "main": "./out/extension", "contributes": { "languages": [ { @@ -483,23 +483,23 @@ "commandPalette": [ { "command": "typescript.reloadProjects", - "when": "editorLangId == 'typescript'" + "when": "editorLangId == typescript && typescript.isManagedFile" }, { "command": "typescript.reloadProjects", - "when": "editorLangId == typescriptreact" + "when": "editorLangId == typescriptreact && typescript.isManagedFile" }, { "command": "javascript.reloadProjects", - "when": "editorLangId == 'javascript'" + "when": "editorLangId == javascript && typescript.isManagedFile" }, { "command": "javascript.reloadProjects", - "when": "editorLangId == javascriptreact" + "when": "editorLangId == javascriptreact && typescript.isManagedFile" }, { "command": "typescript.goToProjectConfig", - "when": "editorLangId == 'typescript'" + "when": "editorLangId == typescript && typescript.isManagedFile" }, { "command": "typescript.goToProjectConfig", @@ -507,11 +507,23 @@ }, { "command": "javascript.goToProjectConfig", - "when": "editorLangId == 'javascript'" + "when": "editorLangId == javascript && typescript.isManagedFile" }, { "command": "javascript.goToProjectConfig", - "when": "editorLangId == javascriptreact" + "when": "editorLangId == javascriptreact && typescript.isManagedFile" + }, + { + "command": "typescript.selectTypeScriptVersion", + "when": "typescript.isManagedFile" + }, + { + "command": "typescript.openTsServerLog", + "when": "typescript.isManagedFile" + }, + { + "command": "typescript.restartTsServer", + "when": "typescript.isManagedFile" } ] }, diff --git a/extensions/typescript/src/commands.ts b/extensions/typescript/src/commands.ts new file mode 100644 index 000000000000..357f063b20e9 --- /dev/null +++ b/extensions/typescript/src/commands.ts @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; + +import { TypeScriptServiceClientHost } from './typescriptMain'; +import { Command } from './utils/commandManager'; +import { Lazy } from './utils/lazy'; + +export class ReloadTypeScriptProjectsCommand implements Command { + public readonly id = 'typescript.reloadProjects'; + + public constructor( + private readonly lazyClientHost: Lazy + ) { } + + public execute() { + this.lazyClientHost.value.reloadProjects(); + } +} + +export class ReloadJavaScriptProjectsCommand implements Command { + public readonly id = 'javascript.reloadProjects'; + + public constructor( + private readonly lazyClientHost: Lazy + ) { } + + public execute() { + this.lazyClientHost.value.reloadProjects(); + } +} + +export class SelectTypeScriptVersionCommand implements Command { + public readonly id = 'typescript.selectTypeScriptVersion'; + + public constructor( + private readonly lazyClientHost: Lazy + ) { } + + public execute() { + this.lazyClientHost.value.serviceClient.onVersionStatusClicked(); + } +} + +export class OpenTsServerLogCommand implements Command { + public readonly id = 'typescript.openTsServerLog'; + + public constructor( + private readonly lazyClientHost: Lazy + ) { } + + public execute() { + this.lazyClientHost.value.serviceClient.openTsServerLogFile(); + } +} + +export class RestartTsServerCommand implements Command { + public readonly id = 'typescript.restartTsServer'; + + public constructor( + private readonly lazyClientHost: Lazy + ) { } + + public execute() { + this.lazyClientHost.value.serviceClient.restartTsServer(); + } +} + +export class TypeScriptGoToProjectConfigCommand implements Command { + public readonly id = 'typescript.goToProjectConfig'; + + public constructor( + private readonly lazyClientHost: Lazy, + ) { } + + public execute() { + const editor = vscode.window.activeTextEditor; + if (editor) { + this.lazyClientHost.value.goToProjectConfig(true, editor.document.uri); + } + } +} + +export class JavaScriptGoToProjectConfigCommand implements Command { + public readonly id = 'javascript.goToProjectConfig'; + + public constructor( + private readonly lazyClientHost: Lazy, + ) { } + + public execute() { + const editor = vscode.window.activeTextEditor; + if (editor) { + this.lazyClientHost.value.goToProjectConfig(false, editor.document.uri); + } + } +} \ No newline at end of file diff --git a/extensions/typescript/src/extension.ts b/extensions/typescript/src/extension.ts new file mode 100644 index 000000000000..a6e1673b2cc1 --- /dev/null +++ b/extensions/typescript/src/extension.ts @@ -0,0 +1,97 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { CommandManager } from './utils/commandManager'; +import { TypeScriptServiceClientHost } from './typescriptMain'; +import * as commands from './commands'; + +import TypeScriptTaskProviderManager from './features/taskProvider'; +import { getContributedTypeScriptServerPlugins, TypeScriptServerPlugin } from './utils/plugins'; +import * as ProjectStatus from './utils/projectStatus'; +import * as languageModeIds from './utils/languageModeIds'; +import * as languageConfigurations from './utils/languageConfigurations'; +import { standardLanguageDescriptions } from './utils/languageDescription'; +import ManagedFileContextManager from './utils/managedFileContext'; +import { lazy, Lazy } from './utils/lazy'; +import * as fileSchemes from './utils/fileSchemes'; + +export function activate( + context: vscode.ExtensionContext +): void { + const plugins = getContributedTypeScriptServerPlugins(); + + const commandManager = new CommandManager(); + context.subscriptions.push(commandManager); + + const lazyClientHost = createLazyClientHost(context, plugins, commandManager); + + registerCommands(commandManager, lazyClientHost); + context.subscriptions.push(new TypeScriptTaskProviderManager(lazyClientHost.map(x => x.serviceClient))); + context.subscriptions.push(vscode.languages.setLanguageConfiguration(languageModeIds.jsxTags, languageConfigurations.jsxTags)); + + const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); + function didOpenTextDocument(textDocument: vscode.TextDocument): boolean { + if (isSupportedDocument(supportedLanguage, textDocument)) { + openListener.dispose(); + // Force activation + // tslint:disable-next-line:no-unused-expression + void lazyClientHost.value; + + context.subscriptions.push(new ManagedFileContextManager(resource => { + return lazyClientHost.value.serviceClient.normalizePath(resource); + })); + return true; + } + return false; + } + const openListener = vscode.workspace.onDidOpenTextDocument(didOpenTextDocument, undefined, context.subscriptions); + for (const textDocument of vscode.workspace.textDocuments) { + if (didOpenTextDocument(textDocument)) { + break; + } + } +} + +function createLazyClientHost( + context: vscode.ExtensionContext, + plugins: TypeScriptServerPlugin[], + commandManager: CommandManager +): Lazy { + return lazy(() => { + const clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.workspaceState, plugins, commandManager); + context.subscriptions.push(clientHost); + const host = clientHost; + clientHost.serviceClient.onReady().then(() => { + context.subscriptions.push(ProjectStatus.create(host.serviceClient, host.serviceClient.telemetryReporter, path => new Promise(resolve => setTimeout(() => resolve(host.handles(path)), 750)), context.workspaceState)); + }, () => { + // Nothing to do here. The client did show a message; + }); + return clientHost; + }); +} + +function registerCommands( + commandManager: CommandManager, + lazyClientHost: Lazy +) { + commandManager.register(new commands.ReloadTypeScriptProjectsCommand(lazyClientHost)); + commandManager.register(new commands.ReloadJavaScriptProjectsCommand(lazyClientHost)); + commandManager.register(new commands.SelectTypeScriptVersionCommand(lazyClientHost)); + commandManager.register(new commands.OpenTsServerLogCommand(lazyClientHost)); + commandManager.register(new commands.RestartTsServerCommand(lazyClientHost)); + commandManager.register(new commands.TypeScriptGoToProjectConfigCommand(lazyClientHost)); + commandManager.register(new commands.JavaScriptGoToProjectConfigCommand(lazyClientHost)); +} + +function isSupportedDocument( + supportedLanguage: string[], + document: vscode.TextDocument +): boolean { + if (supportedLanguage.indexOf(document.languageId) < 0) { + return false; + } + return fileSchemes.isSupportedScheme(document.uri.scheme); +} \ No newline at end of file diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 35823bbca734..f3800d5cd102 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -328,21 +328,27 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP const detail = details[0]; item.detail = Previewer.plain(detail.displayParts); const documentation = new MarkdownString(); - if (item.source) { - let importPath = `'${item.source}'`; - // Try to resolve the real import name that will be added - if (detail.codeActions && detail.codeActions[0]) { - const action = detail.codeActions[0]; - if (action.changes[0] && action.changes[0].textChanges[0]) { - const textChange = action.changes[0].textChanges[0]; - const matchedImport = textChange.newText.match(/(['"])(.+?)\1/); - if (matchedImport) { - importPath = matchedImport[0]; - item.detail += ` — from ${matchedImport[0]}`; + if (detail.source) { + let importPath = `'${Previewer.plain(detail.source)}'`; + + if (this.client.apiVersion.has260Features() && !this.client.apiVersion.has262Features()) { + // Try to resolve the real import name that will be added + if (detail.codeActions && detail.codeActions[0]) { + const action = detail.codeActions[0]; + if (action.changes[0] && action.changes[0].textChanges[0]) { + const textChange = action.changes[0].textChanges[0]; + const matchedImport = textChange.newText.match(/(['"])(.+?)\1/); + if (matchedImport) { + importPath = matchedImport[0]; + item.detail += ` — from ${matchedImport[0]}`; + } } } + documentation.appendMarkdown(localize('autoImportLabel', 'Auto import from {0}', importPath)); + } else { + const autoImportLabel = localize('autoImportLabel', 'Auto import from {0}', importPath); + item.detail = `${autoImportLabel}\n${item.detail}`; } - documentation.appendMarkdown(localize('autoImportLabel', 'Auto import from {0}', importPath)); documentation.appendMarkdown('\n\n'); } @@ -372,13 +378,13 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP }); } - private isValidFunctionCompletionContext(filepath: string, position: Position): Promise { - const args = vsPositionToTsFileLocation(filepath, position); + private async isValidFunctionCompletionContext(filepath: string, position: Position): Promise { // Workaround for https://github.com/Microsoft/TypeScript/issues/12677 // Don't complete function calls inside of destructive assigments or imports - return this.client.execute('quickinfo', args).then(infoResponse => { + try { + const infoResponse = await this.client.execute('quickinfo', vsPositionToTsFileLocation(filepath, position)); const info = infoResponse.body; - switch (info && info.kind as string) { + switch (info && info.kind) { case 'var': case 'let': case 'const': @@ -387,35 +393,40 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP default: return true; } - }, () => { + } catch (e) { return true; - }); + } } private snippetForFunctionCall(detail: CompletionEntryDetails): SnippetString { const suggestionArgumentNames: string[] = []; + let hasOptionalParemeters = false; let parenCount = 0; - for (let i = 0; i < detail.displayParts.length; ++i) { + let i = 0; + for (; i < detail.displayParts.length; ++i) { const part = detail.displayParts[i]; // Only take top level paren names if (part.kind === 'parameterName' && parenCount === 1) { - suggestionArgumentNames.push(`\${${i + 1}:${part.text}}`); + const next = detail.displayParts[i + 1]; + // Skip optional parameters + const nameIsFollowedByOptionalIndicator = next && next.text === '?'; + if (!nameIsFollowedByOptionalIndicator) { + suggestionArgumentNames.push(`\${${i + 1}:${part.text}}`); + } + hasOptionalParemeters = hasOptionalParemeters || nameIsFollowedByOptionalIndicator; } else if (part.kind === 'punctuation') { if (part.text === '(') { ++parenCount; } else if (part.text === ')') { --parenCount; + } else if (part.text === '...' && parenCount === 1) { + // Found rest parmeter. Do not fill in any further arguments + hasOptionalParemeters = true; + break; } } } - - let codeSnippet = detail.name; - if (suggestionArgumentNames.length > 0) { - codeSnippet += '(' + suggestionArgumentNames.join(', ') + ')$0'; - } else { - codeSnippet += '()'; - } - + const codeSnippet = `${detail.name}(${suggestionArgumentNames.join(', ')}${hasOptionalParemeters ? '${' + i + '}' : ''})$0`; return new SnippetString(codeSnippet); } diff --git a/extensions/typescript/src/features/formattingProvider.ts b/extensions/typescript/src/features/formattingProvider.ts index 6a149b96f75b..390ae6dc91b6 100644 --- a/extensions/typescript/src/features/formattingProvider.ts +++ b/extensions/typescript/src/features/formattingProvider.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DocumentRangeFormattingEditProvider, OnTypeFormattingEditProvider, FormattingOptions, TextDocument, Position, Range, CancellationToken, TextEdit, WorkspaceConfiguration, Disposable, languages, workspace } from 'vscode'; +import { DocumentRangeFormattingEditProvider, OnTypeFormattingEditProvider, FormattingOptions, TextDocument, Position, Range, CancellationToken, TextEdit, WorkspaceConfiguration, Disposable, languages, workspace, DocumentSelector } from 'vscode'; import * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; @@ -75,7 +75,7 @@ export class TypeScriptFormattingProvider implements DocumentRangeFormattingEdit if (!filepath) { return []; } - let args: Proto.FormatOnKeyRequestArgs = { + const args: Proto.FormatOnKeyRequestArgs = { file: filepath, line: position.line + 1, offset: position.character + 1, @@ -123,7 +123,7 @@ export class FormattingProviderManager { constructor( private readonly modeId: string, private readonly formattingProvider: TypeScriptFormattingProvider, - private readonly selector: string[] + private readonly selector: DocumentSelector ) { } public dispose() { diff --git a/extensions/typescript/src/features/quickFixProvider.ts b/extensions/typescript/src/features/quickFixProvider.ts index 5a8c74f6b2ff..9293818f1b05 100644 --- a/extensions/typescript/src/features/quickFixProvider.ts +++ b/extensions/typescript/src/features/quickFixProvider.ts @@ -9,19 +9,38 @@ import * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; import { vsRangeToTsFileRange } from '../utils/convert'; import FormattingConfigurationManager from './formattingConfigurationManager'; -import { getEditForCodeAction } from '../utils/codeAction'; +import { getEditForCodeAction, applyCodeActionCommands } from '../utils/codeAction'; +import { Command, CommandManager } from '../utils/commandManager'; interface NumberSet { [key: number]: boolean; } +class ApplyCodeActionCommand implements Command { + public static readonly ID = '_typescript.applyCodeActionCommand'; + public readonly id = ApplyCodeActionCommand.ID; + + constructor( + private readonly client: ITypeScriptServiceClient + ) { } + + public async execute( + actions: Proto.CodeAction + ): Promise { + return applyCodeActionCommands(this.client, actions); + } +} + export default class TypeScriptQuickFixProvider implements vscode.CodeActionProvider { private _supportedCodeActions?: Thenable; constructor( private readonly client: ITypeScriptServiceClient, - private readonly formattingConfigurationManager: FormattingConfigurationManager - ) { } + private readonly formattingConfigurationManager: FormattingConfigurationManager, + commandManager: CommandManager + ) { + commandManager.register(new ApplyCodeActionCommand(client)); + } public provideCodeActions( _document: vscode.TextDocument, @@ -88,6 +107,11 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv return { title: action.description, edits: getEditForCodeAction(this.client, action), + command: action.commands ? { + command: ApplyCodeActionCommand.ID, + arguments: [action], + title: action.description + } : undefined, diagnostics: [] }; } diff --git a/extensions/typescript/src/features/refactorProvider.ts b/extensions/typescript/src/features/refactorProvider.ts index 312ac3ed0b82..e2a6da69e7c4 100644 --- a/extensions/typescript/src/features/refactorProvider.ts +++ b/extensions/typescript/src/features/refactorProvider.ts @@ -49,7 +49,7 @@ class ApplyRefactoringCommand implements Command { const renameLocation = response.body.renameLocation; if (renameLocation) { - if (vscode.window.activeTextEditor && vscode.window.activeTextEditor.document.uri.fsPath === file) { + if (vscode.window.activeTextEditor && vscode.window.activeTextEditor.document.uri.fsPath === document.uri.fsPath) { const pos = tsLocationToVsPosition(renameLocation); vscode.window.activeTextEditor.selection = new vscode.Selection(pos, pos); await vscode.commands.executeCommand('editor.action.rename'); diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts index 6582ad68e82e..12244de22f28 100644 --- a/extensions/typescript/src/features/taskProvider.ts +++ b/extensions/typescript/src/features/taskProvider.ts @@ -15,6 +15,7 @@ import TsConfigProvider, { TSConfig } from '../utils/tsconfigProvider'; import { isImplicitProjectConfigFile } from '../utils/tsconfig'; import * as nls from 'vscode-nls'; +import { Lazy } from '../utils/lazy'; const localize = nls.loadMessageBundle(); type AutoDetect = 'on' | 'off' | 'build' | 'watch'; @@ -42,7 +43,7 @@ class TscTaskProvider implements vscode.TaskProvider { private readonly disposables: vscode.Disposable[] = []; public constructor( - private readonly lazyClient: () => ITypeScriptServiceClient + private readonly client: Lazy ) { this.tsconfigProvider = new TsConfigProvider(); @@ -104,7 +105,7 @@ class TscTaskProvider implements vscode.TaskProvider { } try { - const res: Proto.ProjectInfoResponse = await this.lazyClient().execute( + const res: Proto.ProjectInfoResponse = await this.client.value.execute( 'projectInfo', { file, needFileNameList: false }, token); @@ -123,8 +124,7 @@ class TscTaskProvider implements vscode.TaskProvider { workspaceFolder: folder }]; } - } - catch (e) { + } catch (e) { // noop } return []; @@ -134,32 +134,47 @@ class TscTaskProvider implements vscode.TaskProvider { return Array.from(await this.tsconfigProvider.getConfigsForWorkspace()); } - private async getCommand(project: TSConfig): Promise { + private static async getCommand(project: TSConfig): Promise { if (project.workspaceFolder) { - const platform = process.platform; - const bin = path.join(project.workspaceFolder.uri.fsPath, 'node_modules', '.bin'); - if (platform === 'win32' && await exists(path.join(bin, 'tsc.cmd'))) { - return path.join(bin, 'tsc.cmd'); - } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(bin, 'tsc'))) { - return path.join(bin, 'tsc'); + const localTsc = await TscTaskProvider.getLocalTscAtPath(path.dirname(project.path)); + if (localTsc) { + return localTsc; + } + + const workspaceTsc = await TscTaskProvider.getLocalTscAtPath(project.workspaceFolder.uri.fsPath); + if (workspaceTsc) { + return workspaceTsc; } } + + // Use global tsc version return 'tsc'; } + private static async getLocalTscAtPath(folderPath: string): Promise { + const platform = process.platform; + const bin = path.join(folderPath, 'node_modules', '.bin'); + if (platform === 'win32' && await exists(path.join(bin, 'tsc.cmd'))) { + return path.join(bin, 'tsc.cmd'); + } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(bin, 'tsc'))) { + return path.join(bin, 'tsc'); + } + return undefined; + } + private getActiveTypeScriptFile(): string | null { const editor = vscode.window.activeTextEditor; if (editor) { const document = editor.document; if (document && (document.languageId === 'typescript' || document.languageId === 'typescriptreact')) { - return this.lazyClient().normalizePath(document.uri); + return this.client.value.normalizePath(document.uri); } } return null; } private async getTasksForProject(project: TSConfig): Promise { - const command = await this.getCommand(project); + const command = await TscTaskProvider.getCommand(project); const label = this.getLabelForTasks(project); const tasks: vscode.Task[] = []; @@ -221,14 +236,14 @@ class TscTaskProvider implements vscode.TaskProvider { } /** - * Manages registrations of TypeScript task provides with VScode. + * Manages registrations of TypeScript task providers with VS Code. */ export default class TypeScriptTaskProviderManager { private taskProviderSub: vscode.Disposable | undefined = undefined; private readonly disposables: vscode.Disposable[] = []; constructor( - private readonly lazyClient: () => ITypeScriptServiceClient + private readonly client: Lazy ) { vscode.workspace.onDidChangeConfiguration(this.onConfigurationChanged, this, this.disposables); this.onConfigurationChanged(); @@ -248,7 +263,7 @@ export default class TypeScriptTaskProviderManager { this.taskProviderSub.dispose(); this.taskProviderSub = undefined; } else if (!this.taskProviderSub && autoDetect !== 'off') { - this.taskProviderSub = vscode.workspace.registerTaskProvider('typescript', new TscTaskProvider(this.lazyClient)); + this.taskProviderSub = vscode.workspace.registerTaskProvider('typescript', new TscTaskProvider(this.client)); } } } \ No newline at end of file diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 3c620dc95cf3..82dd3b9326d7 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -8,7 +8,7 @@ * https://github.com/Microsoft/TypeScript-Sublime-Plugin/blob/master/TypeScript%20Indent.tmPreferences * ------------------------------------------------------------------------------------------ */ -import { env, languages, commands, workspace, window, ExtensionContext, Memento, Diagnostic, Range, Disposable, Uri, MessageItem, DiagnosticSeverity, TextDocument } from 'vscode'; +import { env, languages, commands, workspace, window, Memento, Diagnostic, Range, Disposable, Uri, MessageItem, DiagnosticSeverity, TextDocument, DocumentFilter } from 'vscode'; // This must be the first statement otherwise modules might got loaded with // the wrong locale. @@ -25,188 +25,18 @@ import TypeScriptServiceClient from './typescriptServiceClient'; import { ITypeScriptServiceClientHost } from './typescriptService'; import BufferSyncSupport from './features/bufferSyncSupport'; -import TypeScriptTaskProviderManager from './features/taskProvider'; -import * as ProjectStatus from './utils/projectStatus'; import TypingsStatus, { AtaProgressReporter } from './utils/typingsStatus'; import VersionStatus from './utils/versionStatus'; -import { getContributedTypeScriptServerPlugins, TypeScriptServerPlugin } from './utils/plugins'; +import { TypeScriptServerPlugin } from './utils/plugins'; import { openOrCreateConfigFile, isImplicitProjectConfigFile } from './utils/tsconfig'; import { tsLocationToVsPosition } from './utils/convert'; import FormattingConfigurationManager from './features/formattingConfigurationManager'; -import * as languageModeIds from './utils/languageModeIds'; import * as languageConfigurations from './utils/languageConfigurations'; -import { CommandManager, Command } from './utils/commandManager'; +import { CommandManager } from './utils/commandManager'; import DiagnosticsManager from './features/diagnostics'; - -interface LanguageDescription { - id: string; - diagnosticSource: string; - modeIds: string[]; - configFile?: string; - isExternal?: boolean; -} - -const standardLanguageDescriptions: LanguageDescription[] = [ - { - id: 'typescript', - diagnosticSource: 'ts', - modeIds: [languageModeIds.typescript, languageModeIds.typescriptreact], - configFile: 'tsconfig.json' - }, { - id: 'javascript', - diagnosticSource: 'js', - modeIds: [languageModeIds.javascript, languageModeIds.javascriptreact], - configFile: 'jsconfig.json' - } -]; - -class ReloadTypeScriptProjectsCommand implements Command { - public readonly id = 'typescript.reloadProjects'; - - public constructor( - private readonly lazyClientHost: () => TypeScriptServiceClientHost - ) { } - - public execute() { - this.lazyClientHost().reloadProjects(); - } -} - -class ReloadJavaScriptProjectsCommand implements Command { - public readonly id = 'javascript.reloadProjects'; - - public constructor( - private readonly lazyClientHost: () => TypeScriptServiceClientHost - ) { } - - public execute() { - this.lazyClientHost().reloadProjects(); - } -} - -class SelectTypeScriptVersionCommand implements Command { - public readonly id = 'typescript.selectTypeScriptVersion'; - - public constructor( - private readonly lazyClientHost: () => TypeScriptServiceClientHost - ) { } - - public execute() { - this.lazyClientHost().serviceClient.onVersionStatusClicked(); - } -} - -class OpenTsServerLogCommand implements Command { - public readonly id = 'typescript.openTsServerLog'; - - public constructor( - private readonly lazyClientHost: () => TypeScriptServiceClientHost - ) { } - - public execute() { - this.lazyClientHost().serviceClient.openTsServerLogFile(); - } -} - -class RestartTsServerCommand implements Command { - public readonly id = 'typescript.restartTsServer'; - - public constructor( - private readonly lazyClientHost: () => TypeScriptServiceClientHost - ) { } - - public execute() { - this.lazyClientHost().serviceClient.restartTsServer(); - } -} - -class TypeScriptGoToProjectConfigCommand implements Command { - public readonly id = 'typescript.goToProjectConfig'; - - public constructor( - private readonly lazyClientHost: () => TypeScriptServiceClientHost, - ) { } - - public execute() { - const editor = window.activeTextEditor; - if (editor) { - this.lazyClientHost().goToProjectConfig(true, editor.document.uri); - } - } -} - -class JavaScriptGoToProjectConfigCommand implements Command { - public readonly id = 'javascript.goToProjectConfig'; - - public constructor( - private readonly lazyClientHost: () => TypeScriptServiceClientHost, - ) { } - - public execute() { - const editor = window.activeTextEditor; - if (editor) { - this.lazyClientHost().goToProjectConfig(false, editor.document.uri); - } - } -} - -export function activate(context: ExtensionContext): void { - const plugins = getContributedTypeScriptServerPlugins(); - - const commandManager = new CommandManager(); - context.subscriptions.push(commandManager); - - const lazyClientHost = (() => { - let clientHost: TypeScriptServiceClientHost | undefined; - return () => { - if (!clientHost) { - clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.workspaceState, plugins, commandManager); - context.subscriptions.push(clientHost); - - const host = clientHost; - clientHost.serviceClient.onReady().then(() => { - context.subscriptions.push(ProjectStatus.create(host.serviceClient, host.serviceClient.telemetryReporter, - path => new Promise(resolve => setTimeout(() => resolve(host.handles(path)), 750)), - context.workspaceState)); - }, () => { - // Nothing to do here. The client did show a message; - }); - } - return clientHost; - }; - })(); - - commandManager.register(new ReloadTypeScriptProjectsCommand(lazyClientHost)); - commandManager.register(new ReloadJavaScriptProjectsCommand(lazyClientHost)); - commandManager.register(new SelectTypeScriptVersionCommand(lazyClientHost)); - commandManager.register(new OpenTsServerLogCommand(lazyClientHost)); - commandManager.register(new RestartTsServerCommand(lazyClientHost)); - commandManager.register(new TypeScriptGoToProjectConfigCommand(lazyClientHost)); - commandManager.register(new JavaScriptGoToProjectConfigCommand(lazyClientHost)); - - context.subscriptions.push(new TypeScriptTaskProviderManager(() => lazyClientHost().serviceClient)); - - context.subscriptions.push(languages.setLanguageConfiguration(languageModeIds.jsxTags, languageConfigurations.jsxTags)); - - const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); - function didOpenTextDocument(textDocument: TextDocument): boolean { - if (supportedLanguage.indexOf(textDocument.languageId) >= 0) { - openListener.dispose(); - // Force activation - void lazyClientHost(); - return true; - } - return false; - } - const openListener = workspace.onDidOpenTextDocument(didOpenTextDocument); - for (let textDocument of workspace.textDocuments) { - if (didOpenTextDocument(textDocument)) { - break; - } - } -} - +import { LanguageDescription } from './utils/languageDescription'; +import * as fileSchemes from './utils/fileSchemes'; const validateSetting = 'validate.enable'; @@ -219,6 +49,8 @@ class LanguageProvider { private _validate: boolean = true; + private _documentSelector: DocumentFilter[]; + private readonly disposables: Disposable[] = []; private readonly versionDependentDisposables: Disposable[] = []; @@ -268,12 +100,24 @@ class LanguageProvider { this.formattingOptionsManager.dispose(); } + private get documentSelector(): DocumentFilter[] { + if (!this._documentSelector) { + this._documentSelector = []; + for (const language of this.description.modeIds) { + for (const scheme of fileSchemes.supportedSchemes) { + this._documentSelector.push({ language, scheme }); + } + } + } + return this._documentSelector; + } + private async registerProviders( client: TypeScriptServiceClient, commandManager: CommandManager, typingsStatus: TypingsStatus ): Promise { - const selector = this.description.modeIds; + const selector = this.documentSelector; const config = workspace.getConfiguration(this.id); this.disposables.push(languages.registerCompletionItemProvider(selector, @@ -300,7 +144,7 @@ class LanguageProvider { this.disposables.push(languages.registerDocumentSymbolProvider(selector, new (await import('./features/documentSymbolProvider')).default(client))); this.disposables.push(languages.registerSignatureHelpProvider(selector, new (await import('./features/signatureHelpProvider')).default(client), '(', ',')); this.disposables.push(languages.registerRenameProvider(selector, new (await import('./features/renameProvider')).default(client))); - this.disposables.push(languages.registerCodeActionsProvider(selector, new (await import('./features/quickFixProvider')).default(client, this.formattingOptionsManager))); + this.disposables.push(languages.registerCodeActionsProvider(selector, new (await import('./features/quickFixProvider')).default(client, this.formattingOptionsManager, commandManager))); this.disposables.push(languages.registerCodeActionsProvider(selector, new (await import('./features/refactorProvider')).default(client, this.formattingOptionsManager, commandManager))); this.registerVersionDependentProviders(); @@ -385,7 +229,7 @@ class LanguageProvider { return; } - const selector = this.description.modeIds; + const selector = this.documentSelector; if (this.client.apiVersion.has220Features()) { this.versionDependentDisposables.push(languages.registerImplementationProvider(selector, new (await import('./features/implementationProvider')).default(this.client))); } @@ -422,7 +266,7 @@ const styleCheckDiagnostics = [ 7030 // not all code paths return a value ]; -class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { +export class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { private readonly ataProgressReporter: AtaProgressReporter; private readonly typingsStatus: TypingsStatus; private readonly client: TypeScriptServiceClient; @@ -430,6 +274,7 @@ class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { private readonly languagePerId = new Map(); private readonly disposables: Disposable[] = []; private readonly versionStatus: VersionStatus; + private reportStyleCheckAsWarnings: boolean = true; constructor( descriptions: LanguageDescription[], @@ -452,12 +297,12 @@ class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { configFileWatcher.onDidDelete(handleProjectCreateOrDelete, this, this.disposables); configFileWatcher.onDidChange(handleProjectChange, this, this.disposables); - this.versionStatus = new VersionStatus(); - this.disposables.push(this.versionStatus); - - this.client = new TypeScriptServiceClient(this, workspaceState, this.versionStatus, plugins); + this.client = new TypeScriptServiceClient(this, workspaceState, version => this.versionStatus.onDidChangeTypeScriptVersion(version), plugins); this.disposables.push(this.client); + this.versionStatus = new VersionStatus(resource => this.client.normalizePath(resource)); + this.disposables.push(this.versionStatus); + this.typingsStatus = new TypingsStatus(this.client); this.ataProgressReporter = new AtaProgressReporter(this.client); @@ -468,6 +313,7 @@ class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { this.languagePerId.set(description.id, manager); } + this.client.startService(); this.client.onReady().then(() => { if (!this.client.apiVersion.has230Features()) { return; @@ -496,6 +342,9 @@ class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { this.client.onTsServerStarted(() => { this.triggerAllDiagnostics(); }); + + workspace.onDidChangeConfiguration(this.configurationChanged, this, this.disposables); + this.configurationChanged(); } public dispose(): void { @@ -603,6 +452,11 @@ class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { } } + private configurationChanged(): void { + const config = workspace.getConfiguration('typescript'); + this.reportStyleCheckAsWarnings = config.get('reportStyleChecksAsWarnings', true); + } + private async findLanguage(file: string): Promise { try { const doc = await workspace.openTextDocument(this.client.asUrl(file)); @@ -717,8 +571,7 @@ class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { } private getDiagnosticSeverity(diagnostic: Proto.Diagnostic): DiagnosticSeverity { - - if (this.reportStyleCheckAsWarnings() && this.isStyleCheckDiagnostic(diagnostic.code)) { + if (this.reportStyleCheckAsWarnings && this.isStyleCheckDiagnostic(diagnostic.code)) { return DiagnosticSeverity.Warning; } @@ -737,9 +590,4 @@ class TypeScriptServiceClientHost implements ITypeScriptServiceClientHost { private isStyleCheckDiagnostic(code: number | undefined): boolean { return code ? styleCheckDiagnostics.indexOf(code) !== -1 : false; } - - private reportStyleCheckAsWarnings() { - const config = workspace.getConfiguration('typescript'); - return config.get('reportStyleChecksAsWarnings', true); - } } \ No newline at end of file diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index fb4f732e7ce7..89964180240c 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -17,7 +17,6 @@ import { ITypeScriptServiceClient, ITypeScriptServiceClientHost } from './typesc import { TypeScriptServerPlugin } from './utils/plugins'; import Logger from './utils/logger'; -import VersionStatus from './utils/versionStatus'; import * as is from './utils/is'; import TelemetryReporter from './utils/telemetry'; import Tracer from './utils/tracer'; @@ -27,6 +26,8 @@ import * as nls from 'vscode-nls'; import { TypeScriptServiceConfiguration, TsServerLogLevel } from './utils/configuration'; import { TypeScriptVersionProvider, TypeScriptVersion } from './utils/versionProvider'; import { TypeScriptVersionPicker } from './utils/versionPicker'; +import * as fileSchemes from './utils/fileSchemes'; + const localize = nls.loadMessageBundle(); interface CallbackItem { @@ -108,8 +109,7 @@ class RequestQueue { } export default class TypeScriptServiceClient implements ITypeScriptServiceClient { - private static readonly WALK_THROUGH_SNIPPET_SCHEME = 'walkThroughSnippet'; - private static readonly WALK_THROUGH_SNIPPET_SCHEME_COLON = `${TypeScriptServiceClient.WALK_THROUGH_SNIPPET_SCHEME}:`; + private static readonly WALK_THROUGH_SNIPPET_SCHEME_COLON = `${fileSchemes.walkThroughSnippet}:`; private pathSeparator: string; @@ -153,7 +153,7 @@ export default class TypeScriptServiceClient implements ITypeScriptServiceClient constructor( private readonly host: ITypeScriptServiceClientHost, private readonly workspaceState: Memento, - private readonly versionStatus: VersionStatus, + private readonly onDidChangeTypeScriptVersion: (version: TypeScriptVersion) => void, public readonly plugins: TypeScriptServerPlugin[] ) { this.pathSeparator = path.sep; @@ -199,7 +199,6 @@ export default class TypeScriptServiceClient implements ITypeScriptServiceClient }, this, this.disposables); this.telemetryReporter = new TelemetryReporter(() => this._tsserverVersion || this._apiVersion.versionString); this.disposables.push(this.telemetryReporter); - this.startService(); } public get configuration() { @@ -301,7 +300,7 @@ export default class TypeScriptServiceClient implements ITypeScriptServiceClient return Promise.reject(new Error('Could not create TS service')); } - private startService(resendModels: boolean = false): Thenable { + public startService(resendModels: boolean = false): Thenable { let currentVersion = this.versionPicker.currentVersion; return this.servicePromise = new Promise((resolve, reject) => { @@ -314,7 +313,7 @@ export default class TypeScriptServiceClient implements ITypeScriptServiceClient } this._apiVersion = this.versionPicker.currentVersion.version || API.defaultVersion; - this.versionStatus.onDidChangeTypeScriptVersion(currentVersion); + this.onDidChangeTypeScriptVersion(currentVersion); this.requestQueue = new RequestQueue(); this.callbacks = new CallbackMap(); @@ -557,15 +556,15 @@ export default class TypeScriptServiceClient implements ITypeScriptServiceClient } public normalizePath(resource: Uri): string | null { - if (resource.scheme === TypeScriptServiceClient.WALK_THROUGH_SNIPPET_SCHEME) { + if (resource.scheme === fileSchemes.walkThroughSnippet) { return resource.toString(); } - if (resource.scheme === 'untitled' && this._apiVersion.has213Features()) { + if (resource.scheme === fileSchemes.untitled && this._apiVersion.has213Features()) { return resource.toString(); } - if (resource.scheme !== 'file') { + if (resource.scheme !== fileSchemes.file) { return null; } const result = resource.fsPath; @@ -578,7 +577,7 @@ export default class TypeScriptServiceClient implements ITypeScriptServiceClient public asUrl(filepath: string): Uri { if (filepath.startsWith(TypeScriptServiceClient.WALK_THROUGH_SNIPPET_SCHEME_COLON) - || (filepath.startsWith('untitled:') && this._apiVersion.has213Features()) + || (filepath.startsWith(fileSchemes.untitled + ':') && this._apiVersion.has213Features()) ) { return Uri.parse(filepath); } @@ -591,7 +590,7 @@ export default class TypeScriptServiceClient implements ITypeScriptServiceClient return undefined; } - if (resource.scheme === 'file' || resource.scheme === 'untitled') { + if (resource.scheme === fileSchemes.file || resource.scheme === fileSchemes.untitled) { for (const root of roots.sort((a, b) => a.uri.fsPath.length - b.uri.fsPath.length)) { if (resource.fsPath.startsWith(root.uri.fsPath + path.sep)) { return root.uri.fsPath; diff --git a/extensions/typescript/src/utils/api.ts b/extensions/typescript/src/utils/api.ts index 51a630b83a0f..6e13c01a574f 100644 --- a/extensions/typescript/src/utils/api.ts +++ b/extensions/typescript/src/utils/api.ts @@ -72,4 +72,8 @@ export default class API { public has260Features(): boolean { return semver.gte(this.version, '2.6.0'); } + + public has262Features(): boolean { + return semver.gte(this.version, '2.6.2'); + } } \ No newline at end of file diff --git a/extensions/typescript/src/utils/fileSchemes.ts b/extensions/typescript/src/utils/fileSchemes.ts new file mode 100644 index 000000000000..285ea43f3317 --- /dev/null +++ b/extensions/typescript/src/utils/fileSchemes.ts @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const file = 'file'; + +export const untitled = 'untitled'; + +export const walkThroughSnippet = 'walkThroughSnippet'; + +export const supportedSchemes = [ + file, + untitled, + walkThroughSnippet +]; + +export function isSupportedScheme(scheme: string): boolean { + return supportedSchemes.indexOf(scheme) >= 0; +} \ No newline at end of file diff --git a/extensions/typescript/src/utils/languageDescription.ts b/extensions/typescript/src/utils/languageDescription.ts new file mode 100644 index 000000000000..5ac2f55483fd --- /dev/null +++ b/extensions/typescript/src/utils/languageDescription.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as languageModeIds from './languageModeIds'; + +export interface LanguageDescription { + id: string; + diagnosticSource: string; + modeIds: string[]; + configFile?: string; + isExternal?: boolean; +} + +export const standardLanguageDescriptions: LanguageDescription[] = [ + { + id: 'typescript', + diagnosticSource: 'ts', + modeIds: [languageModeIds.typescript, languageModeIds.typescriptreact], + configFile: 'tsconfig.json' + }, { + id: 'javascript', + diagnosticSource: 'js', + modeIds: [languageModeIds.javascript, languageModeIds.javascriptreact], + configFile: 'jsconfig.json' + } +]; diff --git a/extensions/typescript/src/utils/lazy.ts b/extensions/typescript/src/utils/lazy.ts new file mode 100644 index 000000000000..de62fd580ee3 --- /dev/null +++ b/extensions/typescript/src/utils/lazy.ts @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface Lazy { + value: T; + hasValue: boolean; + map(f: (x: T) => R): Lazy; +} + +class LazyValue implements Lazy { + private _hasValue: boolean = false; + private _value: T; + + constructor( + private readonly _getValue: () => T + ) { } + + get value(): T { + if (!this._hasValue) { + this._hasValue = true; + this._value = this._getValue(); + } + return this._value; + } + + get hasValue(): boolean { + return this._hasValue; + } + + public map(f: (x: T) => R): Lazy { + return new LazyValue(() => f(this.value)); + } +} + +export function lazy(getValue: () => T): Lazy { + return new LazyValue(getValue); +} \ No newline at end of file diff --git a/extensions/typescript/src/utils/managedFileContext.ts b/extensions/typescript/src/utils/managedFileContext.ts new file mode 100644 index 000000000000..baf4fd704e63 --- /dev/null +++ b/extensions/typescript/src/utils/managedFileContext.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import * as languageModeIds from './languageModeIds'; + +/** + * When clause context set when the current file is managed by vscode's built-in typescript extension. + */ +const isManagedFile_contextName = 'typescript.isManagedFile'; + +export default class ManagedFileContextManager { + + private isInManagedFileContext: boolean = false; + + private readonly onDidChangeActiveTextEditorSub: vscode.Disposable; + + public constructor( + private readonly normalizePath: (resource: vscode.Uri) => string | null + ) { + this.onDidChangeActiveTextEditorSub = vscode.window.onDidChangeActiveTextEditor(this.onDidChangeActiveTextEditor, this); + + this.onDidChangeActiveTextEditor(vscode.window.activeTextEditor); + } + + public dispose() { + this.onDidChangeActiveTextEditorSub.dispose(); + } + + private onDidChangeActiveTextEditor(editor?: vscode.TextEditor): any { + if (editor) { + const isManagedFile = isSupportedLanguageMode(editor.document) && this.normalizePath(editor.document.uri) !== null; + this.updateContext(isManagedFile); + } + } + + private updateContext(newValue: boolean) { + if (newValue === this.isInManagedFileContext) { + return; + } + + vscode.commands.executeCommand('setContext', isManagedFile_contextName, newValue); + this.isInManagedFileContext = newValue; + } +} + +function isSupportedLanguageMode(doc: vscode.TextDocument) { + return vscode.languages.match([languageModeIds.typescript, languageModeIds.typescriptreact, languageModeIds.javascript, languageModeIds.javascriptreact], doc) > 0; +} diff --git a/extensions/typescript/src/utils/previewer.ts b/extensions/typescript/src/utils/previewer.ts index 0a21260f3375..4625a18a0a24 100644 --- a/extensions/typescript/src/utils/previewer.ts +++ b/extensions/typescript/src/utils/previewer.ts @@ -13,6 +13,7 @@ function getTagText(tag: Proto.JSDocTagInfo): string | undefined { switch (tag.name) { case 'example': + case 'default': // Convert to markdown code block if (tag.text.match(/^\s*[~`]{3}/g)) { return tag.text; diff --git a/extensions/typescript/src/utils/tsconfig.ts b/extensions/typescript/src/utils/tsconfig.ts index a495afc5590c..fd65741cf5b0 100644 --- a/extensions/typescript/src/utils/tsconfig.ts +++ b/extensions/typescript/src/utils/tsconfig.ts @@ -17,7 +17,8 @@ function getEmptyConfig( ) { const compilerOptions = [ '"target": "ES6"', - '"module": "commonjs"' + '"module": "commonjs"', + '"jsx": "preserve"', ]; if (!isTypeScriptProject && config.checkJs) { compilerOptions.push('"checkJs": true'); diff --git a/extensions/typescript/src/utils/versionStatus.ts b/extensions/typescript/src/utils/versionStatus.ts index 78b5d0167c04..3ed92289670a 100644 --- a/extensions/typescript/src/utils/versionStatus.ts +++ b/extensions/typescript/src/utils/versionStatus.ts @@ -8,10 +8,12 @@ import { TypeScriptVersion } from './versionProvider'; import * as languageModeIds from './languageModeIds'; export default class VersionStatus { - private onChangeEditorSub: vscode.Disposable; - private versionBarEntry: vscode.StatusBarItem; + private readonly onChangeEditorSub: vscode.Disposable; + private readonly versionBarEntry: vscode.StatusBarItem; - constructor() { + constructor( + private readonly normalizePath: (resource: vscode.Uri) => string | null + ) { this.versionBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE); this.onChangeEditorSub = vscode.window.onDidChangeActiveTextEditor(this.showHideStatus, this); } @@ -29,9 +31,6 @@ export default class VersionStatus { } private showHideStatus() { - if (!this.versionBarEntry) { - return; - } if (!vscode.window.activeTextEditor) { this.versionBarEntry.hide(); return; @@ -39,13 +38,15 @@ export default class VersionStatus { const doc = vscode.window.activeTextEditor.document; if (vscode.languages.match([languageModeIds.typescript, languageModeIds.typescriptreact], doc)) { - this.versionBarEntry.show(); - return; + if (this.normalizePath(doc.uri)) { + this.versionBarEntry.show(); + return; + } } if (!vscode.window.activeTextEditor.viewColumn) { // viewColumn is undefined for the debug/output panel, but we still want - // to show the version info + // to show the version info in the existing editor return; } diff --git a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json index 70717a1ef046..e37e885a6b5f 100644 --- a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8361b1a232501c67911c81a4664a9460d7922c6b", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/06831946d0a23cb56be0c1ead7cab10be01306cd", "name": "TypeScript", "scopeName": "source.ts", "fileTypes": [ @@ -272,7 +272,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.ts", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.ts entity.name.function.ts" @@ -506,7 +506,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "captures": { "1": { "name": "storage.modifier.ts" @@ -733,7 +733,7 @@ }, { "name": "meta.definition.property.ts entity.name.function.ts", - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" }, { "name": "meta.definition.property.ts variable.object.property.ts", @@ -996,7 +996,7 @@ }, { "name": "meta.arrow.ts", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.ts" @@ -1940,7 +1940,7 @@ }, { "name": "meta.object.member.ts", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.ts" @@ -2033,13 +2033,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.ts", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?=\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2141,7 +2141,7 @@ "patterns": [ { "name": "cast.expr.ts", - "begin": "(?:(?<=return|throw|yield|await|default|[=(,:>*?]|[^+]\\+))\\s*(<)(?!*?\\&\\|\\^]|[^_$[:alnum:]](?:\\+\\+|\\-\\-)|[^\\+]\\+|[^\\-]\\-))\\s*(<)(?!=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "match": "(?x) (\\.) \\s* (?:\n (ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE\n |DOMSTRING_SIZE_ERR|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|HIERARCHY_REQUEST_ERR|INDEX_SIZE_ERR\n |INUSE_ATTRIBUTE_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR\n |NOT_SUPPORTED_ERR|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|WRONG_DOCUMENT_ERR)\n |\n (_content|[xyz]|abbr|above|accept|acceptCharset|accessKey|action|align|[av]Link(?:color)?|all|alt|anchors|appCodeName\n |appCore|applets|appMinorVersion|appName|appVersion|archive|areas|arguments|attributes|availHeight|availLeft|availTop\n |availWidth|axis|background|backgroundColor|backgroundImage|below|bgColor|body|border|borderBottomWidth|borderColor\n |borderLeftWidth|borderRightWidth|borderStyle|borderTopWidth|borderWidth|bottom|bufferDepth|callee|caller|caption\n |cellPadding|cells|cellSpacing|ch|characterSet|charset|checked|childNodes|chOff|cite|classes|className|clear\n |clientInformation|clip|clipBoardData|closed|code|codeBase|codeType|color|colorDepth|cols|colSpan|compact|complete\n |components|content|controllers|cookie|cookieEnabled|cords|cpuClass|crypto|current|data|dateTime|declare|defaultCharset\n |defaultChecked|defaultSelected|defaultStatus|defaultValue|defaultView|defer|description|dialogArguments|dialogHeight\n |dialogLeft|dialogTop|dialogWidth|dir|directories|disabled|display|docmain|doctype|documentElement|elements|embeds\n |enabledPlugin|encoding|enctype|entities|event|expando|external|face|fgColor|filename|firstChild|fontFamily|fontSize\n |fontWeight|form|formName|forms|frame|frameBorder|frameElement|frames|hasFocus|hash|headers|height|history|host\n |hostname|href|hreflang|hspace|htmlFor|httpEquiv|id|ids|ignoreCase|images|implementation|index|innerHeight|innerWidth\n |input|isMap|label|lang|language|lastChild|lastIndex|lastMatch|lastModified|lastParen|layer[sXY]|left|leftContext\n |lineHeight|link|linkColor|links|listStyleType|localName|location|locationbar|longDesc|lowsrc|lowSrc|marginBottom\n |marginHeight|marginLeft|marginRight|marginTop|marginWidth|maxLength|media|menubar|method|mimeTypes|multiline|multiple\n |name|nameProp|namespaces|namespaceURI|next|nextSibling|nodeName|nodeType|nodeValue|noHref|noResize|noShade|notationName\n |notations|noWrap|object|offscreenBuffering|onLine|onreadystatechange|opener|opsProfile|options|oscpu|outerHeight\n |outerWidth|ownerDocument|paddingBottom|paddingLeft|paddingRight|paddingTop|page[XY]|page[XY]Offset|parent|parentLayer\n |parentNode|parentWindow|pathname|personalbar|pixelDepth|pkcs11|platform|plugins|port|prefix|previous|previousDibling\n |product|productSub|profile|profileend|prompt|prompter|protocol|publicId|readOnly|readyState|referrer|rel|responseText\n |responseXML|rev|right|rightContext|rowIndex|rows|rowSpan|rules|scheme|scope|screen[XY]|screenLeft|screenTop|scripts\n |scrollbars|scrolling|sectionRowIndex|security|securityPolicy|selected|selectedIndex|selection|self|shape|siblingAbove\n |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary\n |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead\n |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile\n |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\\b(?!\\$|\\s*(<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\\()", "captures": { "1": { "name": "punctuation.accessor.ts" @@ -2603,7 +2603,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.ts" diff --git a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json index 477576d48140..58ece2fd7626 100644 --- a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8361b1a232501c67911c81a4664a9460d7922c6b", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/06831946d0a23cb56be0c1ead7cab10be01306cd", "name": "TypeScriptReact", "scopeName": "source.tsx", "fileTypes": [ @@ -275,7 +275,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.tsx", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.tsx entity.name.function.tsx" @@ -509,7 +509,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "captures": { "1": { "name": "storage.modifier.tsx" @@ -736,7 +736,7 @@ }, { "name": "meta.definition.property.tsx entity.name.function.tsx", - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" }, { "name": "meta.definition.property.tsx variable.object.property.tsx", @@ -999,7 +999,7 @@ }, { "name": "meta.arrow.tsx", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.tsx" @@ -1943,7 +1943,7 @@ }, { "name": "meta.object.member.tsx", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.tsx" @@ -2036,13 +2036,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.tsx", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?=\\s*(<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\))|\\<\\s*(([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))([^<>\\(]|(\\([^\\(\\)]*\\)))*\\>)*>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2489,7 +2489,7 @@ } }, { - "match": "(?x) (\\.) \\s* (?:\n (ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE\n |DOMSTRING_SIZE_ERR|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|HIERARCHY_REQUEST_ERR|INDEX_SIZE_ERR\n |INUSE_ATTRIBUTE_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR\n |NOT_SUPPORTED_ERR|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|WRONG_DOCUMENT_ERR)\n |\n (_content|[xyz]|abbr|above|accept|acceptCharset|accessKey|action|align|[av]Link(?:color)?|all|alt|anchors|appCodeName\n |appCore|applets|appMinorVersion|appName|appVersion|archive|areas|arguments|attributes|availHeight|availLeft|availTop\n |availWidth|axis|background|backgroundColor|backgroundImage|below|bgColor|body|border|borderBottomWidth|borderColor\n |borderLeftWidth|borderRightWidth|borderStyle|borderTopWidth|borderWidth|bottom|bufferDepth|callee|caller|caption\n |cellPadding|cells|cellSpacing|ch|characterSet|charset|checked|childNodes|chOff|cite|classes|className|clear\n |clientInformation|clip|clipBoardData|closed|code|codeBase|codeType|color|colorDepth|cols|colSpan|compact|complete\n |components|content|controllers|cookie|cookieEnabled|cords|cpuClass|crypto|current|data|dateTime|declare|defaultCharset\n |defaultChecked|defaultSelected|defaultStatus|defaultValue|defaultView|defer|description|dialogArguments|dialogHeight\n |dialogLeft|dialogTop|dialogWidth|dir|directories|disabled|display|docmain|doctype|documentElement|elements|embeds\n |enabledPlugin|encoding|enctype|entities|event|expando|external|face|fgColor|filename|firstChild|fontFamily|fontSize\n |fontWeight|form|formName|forms|frame|frameBorder|frameElement|frames|hasFocus|hash|headers|height|history|host\n |hostname|href|hreflang|hspace|htmlFor|httpEquiv|id|ids|ignoreCase|images|implementation|index|innerHeight|innerWidth\n |input|isMap|label|lang|language|lastChild|lastIndex|lastMatch|lastModified|lastParen|layer[sXY]|left|leftContext\n |lineHeight|link|linkColor|links|listStyleType|localName|location|locationbar|longDesc|lowsrc|lowSrc|marginBottom\n |marginHeight|marginLeft|marginRight|marginTop|marginWidth|maxLength|media|menubar|method|mimeTypes|multiline|multiple\n |name|nameProp|namespaces|namespaceURI|next|nextSibling|nodeName|nodeType|nodeValue|noHref|noResize|noShade|notationName\n |notations|noWrap|object|offscreenBuffering|onLine|onreadystatechange|opener|opsProfile|options|oscpu|outerHeight\n |outerWidth|ownerDocument|paddingBottom|paddingLeft|paddingRight|paddingTop|page[XY]|page[XY]Offset|parent|parentLayer\n |parentNode|parentWindow|pathname|personalbar|pixelDepth|pkcs11|platform|plugins|port|prefix|previous|previousDibling\n |product|productSub|profile|profileend|prompt|prompter|protocol|publicId|readOnly|readyState|referrer|rel|responseText\n |responseXML|rev|right|rightContext|rowIndex|rows|rowSpan|rules|scheme|scope|screen[XY]|screenLeft|screenTop|scripts\n |scrollbars|scrolling|sectionRowIndex|security|securityPolicy|selected|selectedIndex|selection|self|shape|siblingAbove\n |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary\n |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead\n |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile\n |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\\b(?!\\$|\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "match": "(?x) (\\.) \\s* (?:\n (ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE\n |DOMSTRING_SIZE_ERR|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|HIERARCHY_REQUEST_ERR|INDEX_SIZE_ERR\n |INUSE_ATTRIBUTE_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR\n |NOT_SUPPORTED_ERR|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|WRONG_DOCUMENT_ERR)\n |\n (_content|[xyz]|abbr|above|accept|acceptCharset|accessKey|action|align|[av]Link(?:color)?|all|alt|anchors|appCodeName\n |appCore|applets|appMinorVersion|appName|appVersion|archive|areas|arguments|attributes|availHeight|availLeft|availTop\n |availWidth|axis|background|backgroundColor|backgroundImage|below|bgColor|body|border|borderBottomWidth|borderColor\n |borderLeftWidth|borderRightWidth|borderStyle|borderTopWidth|borderWidth|bottom|bufferDepth|callee|caller|caption\n |cellPadding|cells|cellSpacing|ch|characterSet|charset|checked|childNodes|chOff|cite|classes|className|clear\n |clientInformation|clip|clipBoardData|closed|code|codeBase|codeType|color|colorDepth|cols|colSpan|compact|complete\n |components|content|controllers|cookie|cookieEnabled|cords|cpuClass|crypto|current|data|dateTime|declare|defaultCharset\n |defaultChecked|defaultSelected|defaultStatus|defaultValue|defaultView|defer|description|dialogArguments|dialogHeight\n |dialogLeft|dialogTop|dialogWidth|dir|directories|disabled|display|docmain|doctype|documentElement|elements|embeds\n |enabledPlugin|encoding|enctype|entities|event|expando|external|face|fgColor|filename|firstChild|fontFamily|fontSize\n |fontWeight|form|formName|forms|frame|frameBorder|frameElement|frames|hasFocus|hash|headers|height|history|host\n |hostname|href|hreflang|hspace|htmlFor|httpEquiv|id|ids|ignoreCase|images|implementation|index|innerHeight|innerWidth\n |input|isMap|label|lang|language|lastChild|lastIndex|lastMatch|lastModified|lastParen|layer[sXY]|left|leftContext\n |lineHeight|link|linkColor|links|listStyleType|localName|location|locationbar|longDesc|lowsrc|lowSrc|marginBottom\n |marginHeight|marginLeft|marginRight|marginTop|marginWidth|maxLength|media|menubar|method|mimeTypes|multiline|multiple\n |name|nameProp|namespaces|namespaceURI|next|nextSibling|nodeName|nodeType|nodeValue|noHref|noResize|noShade|notationName\n |notations|noWrap|object|offscreenBuffering|onLine|onreadystatechange|opener|opsProfile|options|oscpu|outerHeight\n |outerWidth|ownerDocument|paddingBottom|paddingLeft|paddingRight|paddingTop|page[XY]|page[XY]Offset|parent|parentLayer\n |parentNode|parentWindow|pathname|personalbar|pixelDepth|pkcs11|platform|plugins|port|prefix|previous|previousDibling\n |product|productSub|profile|profileend|prompt|prompter|protocol|publicId|readOnly|readyState|referrer|rel|responseText\n |responseXML|rev|right|rightContext|rowIndex|rows|rowSpan|rules|scheme|scope|screen[XY]|screenLeft|screenTop|scripts\n |scrollbars|scrolling|sectionRowIndex|security|securityPolicy|selected|selectedIndex|selection|self|shape|siblingAbove\n |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary\n |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead\n |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile\n |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\\b(?!\\$|\\s*(<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\\()", "captures": { "1": { "name": "punctuation.accessor.tsx" @@ -2569,7 +2569,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(\\.)\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{[^\\{\\}]*\\})|(\\([^\\(\\)]*\\))|(\\[[^\\[\\]]*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.tsx" diff --git a/extensions/yarn.lock b/extensions/yarn.lock index 9851e68940c1..43a297415a9a 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -2,6 +2,6 @@ # yarn lockfile v1 -typescript@2.6.2-insiders.20171120: - version "2.6.2-insiders.20171120" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2-insiders.20171120.tgz#d2f4c36831fa663639624799a62814cbdca9aaae" +typescript@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" diff --git a/i18n/chs/extensions/css/client/out/cssMain.i18n.json b/i18n/chs/extensions/css/client/out/cssMain.i18n.json index a61dc149b35e..e64cca9eac13 100644 --- a/i18n/chs/extensions/css/client/out/cssMain.i18n.json +++ b/i18n/chs/extensions/css/client/out/cssMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "cssserver.name": "CSS 语言服务器" + "cssserver.name": "CSS 语言服务器", + "folding.start": "折叠区域开始", + "folding.end": "折叠区域结束" } \ No newline at end of file diff --git a/i18n/chs/extensions/css/package.i18n.json b/i18n/chs/extensions/css/package.i18n.json index 6b34f395c3d3..c9f83c620229 100644 --- a/i18n/chs/extensions/css/package.i18n.json +++ b/i18n/chs/extensions/css/package.i18n.json @@ -18,7 +18,7 @@ "css.lint.important.desc": "避免使用 !important。它表明整个 CSS 的特异性已经失去控制且需要重构。", "css.lint.importStatement.desc": "Import 语句不会并行加载", "css.lint.propertyIgnoredDueToDisplay.desc": "因显示而忽略属性。例如,使用 \"display: inline\"时,宽度、高度、上边距、下边距和 float 属性将不起作用", - "css.lint.universalSelector.desc": "已知通配选择符 (*) 慢", + "css.lint.universalSelector.desc": "通配选择符 (*) 运行效率低", "css.lint.unknownProperties.desc": "未知的属性。", "css.lint.unknownVendorSpecificProperties.desc": "未知的供应商特定属性。", "css.lint.vendorPrefix.desc": "使用供应商特定前缀时,还应包括标准属性", diff --git a/i18n/chs/extensions/git/out/autofetch.i18n.json b/i18n/chs/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..6df74592845c --- /dev/null +++ b/i18n/chs/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "是", + "no": "否", + "not now": "不是现在", + "suggest auto fetch": "是否启用自动抓取 Git 存储库?" +} \ No newline at end of file diff --git a/i18n/chs/extensions/git/out/commands.i18n.json b/i18n/chs/extensions/git/out/commands.i18n.json index 020ac1e3589e..2b05a1b187dc 100644 --- a/i18n/chs/extensions/git/out/commands.i18n.json +++ b/i18n/chs/extensions/git/out/commands.i18n.json @@ -9,9 +9,12 @@ "create branch": "$(plus) 创建新分支", "repourl": "存储库 URL", "parent": "父目录", + "cancel": "$(sync~spin) 正在克隆存储库... 点击取消", + "cancel tooltip": "取消克隆", "cloning": "正在克隆 GIT 存储库...", "openrepo": "打开存储库", "proposeopen": "是否要打开已克隆存储库?", + "init": "选择用于初始化 Git 储存库的工作区文件夹", "init repo": "初始化存储库", "create repo": "初始化存储库", "are you sure": "将在“{0}”中创建 Git 存储库。确定要继续吗?", @@ -49,12 +52,15 @@ "select branch to delete": "选择要删除的分支", "confirm force delete branch": "“{0}”分支未被完全合并。是否仍要删除?", "delete branch": "删除分支", + "invalid branch name": "分支名称无效", + "branch already exists": "已存在名为“{0}”的分支", "select a branch to merge from": "选择要从其合并的分支", "merge conflicts": "存在合并冲突。请在提交之前解决这些冲突。", "tag name": "标签名称", "provide tag name": "请提供标签名称", "tag message": "消息", "provide tag message": "请提供消息以对标签进行注释", + "no remotes to fetch": "此存储库未配置可以从中抓取的远程存储库。", "no remotes to pull": "存储库未配置任何从其中进行拉取的远程存储库。", "pick remote pull repo": "选择要从其拉取分支的远程位置", "no remotes to push": "存储库未配置任何要推送到的远程存储库。", @@ -71,7 +77,7 @@ "no stashes": "没有可以恢复的储藏。", "pick stash to pop": "选择要弹出的储藏", "clean repo": "在签出前,请清理存储库工作树。", - "cant push": "无法推送 refs 到远端。请先运行“拉取”功能以整合你的更改。", + "cant push": "无法推送 refs 到远端。您可以试着运行“拉取”功能,整合您的更改。", "git error details": "Git:{0}", "git error": "Git 错误", "open git log": "打开 GIT 日志" diff --git a/i18n/chs/extensions/git/out/main.i18n.json b/i18n/chs/extensions/git/out/main.i18n.json index 7b6c6f37d1f6..19364485e2ea 100644 --- a/i18n/chs/extensions/git/out/main.i18n.json +++ b/i18n/chs/extensions/git/out/main.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "在 {0} 查找 Git 中", "using git": "使用 {1} 中的 GIT {0}", - "updateGit": "更新 GIT", + "downloadgit": "下载 Git", "neverShowAgain": "不再显示", + "notfound": "未找到 Git。请安装 Git,或在 \"git.path\" 设置中配置。", + "updateGit": "更新 GIT", "git20": "你似乎已安装 Git {0}。Code 和 Git 版本 >=2 一起工作最佳" } \ No newline at end of file diff --git a/i18n/chs/extensions/git/out/repository.i18n.json b/i18n/chs/extensions/git/out/repository.i18n.json index 8b700b3abe3c..1e99b7312ed0 100644 --- a/i18n/chs/extensions/git/out/repository.i18n.json +++ b/i18n/chs/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "已被我们删除", "both added": "两者均已添加", "both modified": "二者均已修改", + "commitMessage": "消息(按 {0} 提交)", "commit": "提交", "merge changes": "合并更改", "staged changes": "暂存的更改", diff --git a/i18n/chs/extensions/git/package.i18n.json b/i18n/chs/extensions/git/package.i18n.json index 657920b4ae98..3f973cac6735 100644 --- a/i18n/chs/extensions/git/package.i18n.json +++ b/i18n/chs/extensions/git/package.i18n.json @@ -33,8 +33,10 @@ "command.checkout": "签出到...", "command.branch": "创建分支...", "command.deleteBranch": "删除分支...", + "command.renameBranch": "重命名分支...", "command.merge": "合并分支...", "command.createTag": "创建标签", + "command.fetch": "抓取", "command.pull": "拉取", "command.pullRebase": "拉取(变基)", "command.pullFrom": "拉取自...", @@ -42,21 +44,24 @@ "command.pushTo": "推送到...", "command.pushWithTags": "带标签推送", "command.sync": "同步", + "command.syncRebase": "同步(变基)", "command.publish": "发布分支", "command.showOutput": "显示 GIT 输出", "command.ignore": "将文件添加到 .gitignore", + "command.stashIncludeUntracked": "储藏(包含未跟踪)", "command.stash": "储藏", "command.stashPop": "弹出储藏...", "command.stashPopLatest": "弹出最新储藏", - "config.enabled": "是否已启用 GIT", + "config.enabled": "是否启用 Git", "config.path": "Git 可执行文件路径", - "config.autorefresh": "是否已启用自动刷新", - "config.autofetch": "是否启用了自动提取", + "config.autorefresh": "是否启用自动刷新", + "config.autofetch": "是否启用自动拉取", "config.enableLongCommitWarning": "是否针对长段提交消息进行警告", "config.confirmSync": "同步 Git 存储库前进行确认", "config.countBadge": "控制 Git 徽章计数器。“all”计算所有更改。“tracked”只计算跟踪的更改。“off”关闭此功能。", "config.checkoutType": "控制运行“签出到...”命令时列出的分支的类型。\"all\" 显示所有 refs,\"local\" 只显示本地分支,\"tags\" 只显示标记,\"remote\" 只显示远程分支。", "config.ignoreLegacyWarning": "忽略旧版 Git 警告", + "config.ignoreMissingGitWarning": "忽略“缺失 Git”警告", "config.ignoreLimitWarning": "忽略“存储库中存在大量更改”的警告", "config.defaultCloneDirectory": "克隆 Git 存储库的默认位置", "config.enableSmartCommit": "在没有暂存的更改时提交所有更改。", diff --git a/i18n/chs/extensions/html/client/out/htmlMain.i18n.json b/i18n/chs/extensions/html/client/out/htmlMain.i18n.json index 67c68ad50f55..ff2b693ae94e 100644 --- a/i18n/chs/extensions/html/client/out/htmlMain.i18n.json +++ b/i18n/chs/extensions/html/client/out/htmlMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "htmlserver.name": "HTML 语言服务器" + "htmlserver.name": "HTML 语言服务器", + "folding.start": "折叠区域开始", + "folding.end": "折叠区域结束" } \ No newline at end of file diff --git a/i18n/chs/extensions/markdown/out/commands.i18n.json b/i18n/chs/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..d598feff8a02 --- /dev/null +++ b/i18n/chs/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "预览 {0}", + "onPreviewStyleLoadError": "无法加载“markdown.styles”:{0}" +} \ No newline at end of file diff --git a/i18n/chs/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/chs/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..4ff7c59a498a --- /dev/null +++ b/i18n/chs/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "已禁用此文档中的部分内容", + "preview.securityMessage.title": "已禁用此 Markdown 预览中的可能不安全的内容。更改 Markdown 预览安全设置以允许不安全内容或启用脚本。", + "preview.securityMessage.label": "已禁用内容安全警告" +} \ No newline at end of file diff --git a/i18n/chs/extensions/markdown/out/security.i18n.json b/i18n/chs/extensions/markdown/out/security.i18n.json index dbe6ce5383fb..c1daf87e291c 100644 --- a/i18n/chs/extensions/markdown/out/security.i18n.json +++ b/i18n/chs/extensions/markdown/out/security.i18n.json @@ -11,5 +11,8 @@ "disable.title": "禁用", "disable.description": "允许所有内容,执行所有脚本。不推荐", "moreInfo.title": "详细信息", + "enableSecurityWarning.title": "在此工作区中启用预览安全警告", + "disableSecurityWarning.title": "在此工作区中取消预览安全警告", + "toggleSecurityWarning.description": "不影响内容安全等级", "preview.showPreviewSecuritySelector.title": "选择此工作区中 Markdown 预览的安全设置" } \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/package.i18n.json b/i18n/chs/extensions/merge-conflict/package.i18n.json index ae0c9b417049..2b8572cb7f13 100644 --- a/i18n/chs/extensions/merge-conflict/package.i18n.json +++ b/i18n/chs/extensions/merge-conflict/package.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "command.category": "合并冲突", + "command.accept.all-current": "全部采用当前内容", "command.accept.all-incoming": "全部采用传入版本", "command.accept.all-both": "全部保留两者", "command.accept.current": "采用当前内容", diff --git a/i18n/chs/extensions/php/package.i18n.json b/i18n/chs/extensions/php/package.i18n.json index 79f8c7d511de..2d5bee8dc94f 100644 --- a/i18n/chs/extensions/php/package.i18n.json +++ b/i18n/chs/extensions/php/package.i18n.json @@ -7,7 +7,7 @@ "configuration.suggest.basic": "如果已启用内置 PHP 语言建议,则进行配置。此支持建议 PHP 全局变量和变量。", "configuration.validate.enable": "启用/禁用内置的 PHP 验证。", "configuration.validate.executablePath": "指向 PHP 可执行文件。", - "configuration.validate.run": "不管 linter 是在 save 还是在 type 上运行。", + "configuration.validate.run": "决定 linter 是在保存时还是输入时运行。", "configuration.title": "PHP", "commands.categroy.php": "PHP", "command.untrustValidationExecutable": "禁止 PHP 验证程序(定义为工作区设置)" diff --git a/i18n/chs/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/chs/extensions/typescript/out/features/completionItemProvider.i18n.json index b1b7365e6c0e..2d01e9a74765 100644 --- a/i18n/chs/extensions/typescript/out/features/completionItemProvider.i18n.json +++ b/i18n/chs/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "selectCodeAction": "选择要应用的代码操作", "acquiringTypingsLabel": "正在获取 typings...", "acquiringTypingsDetail": "获取 IntelliSense 的 typings 定义。", "autoImportLabel": "从 {0} 自动导入" diff --git a/i18n/chs/extensions/typescript/package.i18n.json b/i18n/chs/extensions/typescript/package.i18n.json index 2c5382844542..0283416a000e 100644 --- a/i18n/chs/extensions/typescript/package.i18n.json +++ b/i18n/chs/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "打开 TS 服务器日志", "typescript.restartTsServer": "重启 TS 服务器", "typescript.selectTypeScriptVersion.title": "选择 TypeScript 版本", + "typescript.reportStyleChecksAsWarnings": "将风格检查问题报告为警告", "jsDocCompletion.enabled": "启用/禁用自动 JSDoc 注释", "javascript.implicitProjectConfig.checkJs": "启用/禁用 JavaScript 文件的语义检查。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", "typescript.npm": "指定用于自动获取类型的 NPM 可执行文件的路径。要求 TypeScript >= 2.3.4。", diff --git a/i18n/chs/src/vs/base/common/errorMessage.i18n.json b/i18n/chs/src/vs/base/common/errorMessage.i18n.json index 01836ff54651..d2672e3915e3 100644 --- a/i18n/chs/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/chs/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}。错误代码: {1}", - "error.permission.verbose": "权限被拒绝(HTTP {0})", - "error.permission": "权限被拒绝", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "未知连接错误 ({0})", - "error.connection.unknown": "出现未知连接错误。您的 Internet 连接已断开,或者您连接的服务器已脱机。", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "出现未知错误。有关详细信息,请参阅日志。", "nodeExceptionMessage": "发生了系统错误 ({0})", diff --git a/i18n/chs/src/vs/code/electron-main/main.i18n.json b/i18n/chs/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..9649647c78d8 --- /dev/null +++ b/i18n/chs/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "{0} 的另一实例正在运行但没有响应", + "secondInstanceNoResponseDetail": "请先关闭其他所有实例,然后重试。", + "secondInstanceAdmin": "{0} 的第二个实例已经以管理员身份运行。", + "secondInstanceAdminDetail": "请先关闭另一个实例,然后重试。", + "close": "关闭(&&C)" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index 4b3a4e43c6ea..5b6467ead389 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,12 @@ "miQuit": "退出 {0}", "miNewFile": "新建文件(&&N)", "miOpen": "打开(&&O)...", - "miOpenWorkspace": "打开工作区(&&O)...", + "miOpenWorkspace": "打开工作区(&&K)...", "miOpenFolder": "打开文件夹(&&F)...", "miOpenFile": "打开文件(&&O)...", "miOpenRecent": "打开最近的文件(&&R)", - "miSaveWorkspaceAs": "将工作区另存为(&&S)...", - "miAddFolderToWorkspace": "将文件夹添加到工作区(&&A)...", + "miSaveWorkspaceAs": "将工作区另存为...", + "miAddFolderToWorkspace": "将文件夹添加到工作区(&&D)...", "miSave": "保存(&&S)", "miSaveAs": "另存为(&&A)...", "miSaveAll": "全部保存(&&L)", @@ -157,7 +157,7 @@ "mMergeAllWindows": "合并所有窗口", "miToggleDevTools": "切换开发人员工具(&&T)", "miAccessibilityOptions": "辅助功能选项(&&O)", - "miReportIssues": "报告问题(&&I)", + "miReportIssue": "使用英文报告问题(&&I)", "miWelcome": "欢迎使用(&&W)", "miInteractivePlayground": "交互式演练场(&&I)", "miDocumentation": "文档(&&D)", @@ -184,6 +184,7 @@ "miDownloadingUpdate": "正在下载更新...", "miInstallingUpdate": "正在安装更新...", "miCheckForUpdates": "检查更新...", - "aboutDetail": "\n版本 {0}\n提交 {1}\n日期 {2}\nShell {3}\n渲染器 {4}\nNode {5}\n架构 {6}", - "okButton": "确定" + "aboutDetail": "版本 {0}\n提交 {1}\n日期 {2}\nShell {3}\n渲染器 {4}\nNode {5}\n架构 {6}", + "okButton": "确定", + "copy": "复制(&&C)" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/node/cliProcessMain.i18n.json b/i18n/chs/src/vs/code/node/cliProcessMain.i18n.json index 7c34830a5376..39c718630115 100644 --- a/i18n/chs/src/vs/code/node/cliProcessMain.i18n.json +++ b/i18n/chs/src/vs/code/node/cliProcessMain.i18n.json @@ -9,7 +9,7 @@ "useId": "确保使用完整扩展 ID,包括发布服务器,如: {0}", "successVsixInstall": "已成功安装扩展“{0}”!", "alreadyInstalled": "已安装扩展“{0}”。", - "foundExtension": "在应用商店中找到了“{0}”。", + "foundExtension": "在商店中找到了“{0}”。", "installing": "正在安装...", "successInstall": "已成功安装扩展“{0}” v{1}!", "uninstalling": "正在卸载 {0}...", diff --git a/i18n/chs/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/chs/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..2b957467d140 --- /dev/null +++ b/i18n/chs/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "这些文件也已同时更改: {0}", + "summary.0": "未做编辑", + "summary.nm": "在 {1} 个文件中进行了 {0} 次编辑", + "summary.n0": "在 1 个文件中进行了 {0} 次编辑" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index fc23def60129..3aa5c1a68d42 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,16 @@ "fontSize": "以像素为单位控制字号。", "lineHeight": "控制行高。使用 0 通过字号计算行高。", "letterSpacing": "以像素为单位控制字符间距。", - "lineNumbers": "控制行号的显示。可能的值为“开”、“关”和“相对”。“相对”将显示从当前光标位置开始计数的行数。", + "lineNumbers.off": "不显示行号。", + "lineNumbers.on": "将行号显示为绝对行数。", + "lineNumbers.relative": "将行号显示为与光标相隔的行数。", + "lineNumbers.interval": "每 10 行显示一次行号。", + "lineNumbers": "控制行号的显示。可选值为 \"on\"、\"off\" 和 \"relative\"。", "rulers": "在一定数量的等宽字符后显示垂直标尺。输入多个值,显示多个标尺。若数组为空,则不绘制标尺。", "wordSeparators": "执行文字相关的导航或操作时将用作文字分隔符的字符", - "tabSize": "一个制表符等于的空格数。该设置在 `editor.detectIndentation` 启用时根据文件内容进行重写。", + "tabSize": "一个制表符等于的空格数。该设置在 \"editor.detectIndentation\" 启用时根据文件内容可能会被覆盖。", "tabSize.errorMessage": "应为“number”。注意,值“auto”已由“editor.detectIndentation”设置替换。", - "insertSpaces": "按 \"Tab\" 时插入空格。该设置在 `editor.detectIndentation` 启用时根据文件内容进行重写。", + "insertSpaces": "按 Tab 键时插入空格。该设置在 \"editor.detectIndentation\" 启用时根据文件内容可能会被覆盖。", "insertSpaces.errorMessage": "应为 \"boolean\"。注意,值 \"auto\" 已由 \"editor.detectIndentation\" 设置替换。", "detectIndentation": "当打开文件时,将基于文件内容检测 \"editor.tabSize\" 和 \"editor.insertSpaces\"。", "roundedSelection": "控制选取范围是否有圆角", @@ -37,7 +41,7 @@ "mouseWheelScrollSensitivity": "要对鼠标滚轮滚动事件的 \"deltaX\" 和 \"deltaY\" 使用的乘数 ", "multiCursorModifier.ctrlCmd": "映射到“Control”(Windows 和 Linux)或“Command”(OSX)。", "multiCursorModifier.alt": "映射到“Alt”(Windows 和 Linux)或“Option”(OSX)。", - "multiCursorModifier": "用鼠标添加多个光标时使用的修改键。“ctrlCmd”映射为“Control”(Windows 和 Linux)或“Command”(OSX)。“转到定义”和“打开链接”功能的鼠标手势将会相应调整,不与多光标修改键冲突。", + "multiCursorModifier": "用鼠标添加多个光标时使用的修改键。\"ctrlCmd\" 会映射为 \"Ctrl\" (Windows 和 Linux) 或 \"Command\" (OSX)。“转到定义”和“打开链接”功能所需的动作将会相应调整,不与多光标修改键冲突。", "quickSuggestions.strings": "在字符串内启用快速建议。", "quickSuggestions.comments": "在注释内启用快速建议。", "quickSuggestions.other": "在字符串和注释外启用快速建议。", @@ -57,7 +61,7 @@ "snippetSuggestions.none": "不显示代码片段建议。", "snippetSuggestions": "控制是否将代码段与其他建议一起显示以及它们的排序方式。", "emptySelectionClipboard": "控制没有选择内容的复制是否复制当前行。", - "wordBasedSuggestions": "控制是否应根据文档中的字数计算完成。", + "wordBasedSuggestions": "控制是否根据文档中的文字计算自动完成列表。", "suggestFontSize": "建议小组件的字号", "suggestLineHeight": "建议小组件的行高", "selectionHighlight": "控制编辑器是否应突出显示选项的近似匹配", @@ -89,8 +93,8 @@ "links": "控制编辑器是否应检测链接并使它们可被点击", "colorDecorators": "控制编辑器是否显示内联颜色修饰器和颜色选取器。", "codeActions": "启用代码操作小灯泡提示", + "selectionClipboard": "控制是否支持 Linux 主剪贴板。", "sideBySide": "控制 Diff 编辑器以并排或内联形式显示差异", "ignoreTrimWhitespace": "控制差异编辑器是否将对前导空格或尾随空格的更改显示为差异", - "renderIndicators": "控制差异编辑器是否为已添加/删除的更改显示 +/- 指示符号", - "selectionClipboard": "控制是否支持 Linux 主剪贴板。" + "renderIndicators": "控制差异编辑器是否为已添加/删除的更改显示 +/- 指示符号" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/chs/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..e6089cc95a10 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "转到括号" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/chs/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..3e7623177668 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "将插入点左移", + "caret.moveRight": "将插入点右移" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/chs/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..93fd558794e2 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "转置字母" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/chs/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..08e6a1cc3ece --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "剪切", + "actions.clipboard.copyLabel": "复制", + "actions.clipboard.pasteLabel": "粘贴", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "复制并突出显示语法" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/chs/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..34ee8916cd6a --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "切换行注释", + "comment.line.add": "添加行注释", + "comment.line.remove": "删除行注释", + "comment.block": "切换块注释" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/chs/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..73baa5747797 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "显示编辑器上下文菜单" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/find/findController.i18n.json b/i18n/chs/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..385ba32bfeb8 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "查找", + "findNextMatchAction": "查找下一个", + "findPreviousMatchAction": "查找上一个", + "nextSelectionMatchFindAction": "查找下一个选择", + "previousSelectionMatchFindAction": "查找上一个选择", + "startReplace": "替换", + "showNextFindTermAction": "显示下一个搜索结果", + "showPreviousFindTermAction": "显示上一个搜索结果" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..9f9c20bbce2b --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "查找", + "placeholder.find": "查找", + "label.previousMatchButton": "上一个匹配", + "label.nextMatchButton": "下一个匹配", + "label.toggleSelectionFind": "在选定内容中查找", + "label.closeButton": "关闭", + "label.replace": "替换", + "placeholder.replace": "替换", + "label.replaceButton": "替换", + "label.replaceAllButton": "全部替换", + "label.toggleReplaceButton": "切换替换模式", + "title.matchesCountLimit": "仅高亮了前 {0} 个结果,但所有查找操作均针对全文。", + "label.matchesLocation": "第 {0} 个(共 {1} 个)", + "label.noResults": "无结果" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..d650d2c5ce65 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "查找", + "placeholder.find": "查找", + "label.previousMatchButton": "上一个匹配", + "label.nextMatchButton": "下一个匹配", + "label.closeButton": "关闭" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/chs/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..90d90c3c8ff7 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "展开", + "unFoldRecursivelyAction.label": "以递归方式展开", + "foldAction.label": "折叠", + "foldRecursivelyAction.label": "以递归方式折叠", + "foldAllBlockComments.label": "折叠所有块注释", + "foldAllAction.label": "全部折叠", + "unfoldAllAction.label": "全部展开", + "foldLevelAction.label": "折叠级别 {0}" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..628b8cc784e1 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "在第 {0} 行进行了 1 次格式编辑", + "hintn1": "在第 {1} 行进行了 {0} 次格式编辑", + "hint1n": "第 {0} 行到第 {1} 行间进行了 1 次格式编辑", + "hintnn": "第 {1} 行到第 {2} 行间进行了 {0} 次格式编辑", + "no.provider": "抱歉,当前没有安装“{0}”文件的格式化程序。", + "formatDocument.label": "格式化文件", + "formatSelection.label": "格式化选定代码" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..2f90179af6b2 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "未找到“{0}”的任何定义", + "generic.noResults": "找不到定义", + "meta.title": " – {0} 定义", + "actions.goToDecl.label": "转到定义", + "actions.goToDeclToSide.label": "打开侧边的定义", + "actions.previewDecl.label": "速览定义", + "goToImplementation.noResultWord": "未找到“{0}”的实现", + "goToImplementation.generic.noResults": "未找到实现", + "meta.implementations.title": "– {0} 个实现", + "actions.goToImplementation.label": "转到实现", + "actions.peekImplementation.label": "速览实现", + "goToTypeDefinition.noResultWord": "未找到“{0}”的类型定义", + "goToTypeDefinition.generic.noResults": "未找到类型定义", + "meta.typeDefinitions.title": " – {0} 个类型定义", + "actions.goToTypeDefinition.label": "转到类型定义", + "actions.peekTypeDefinition.label": "速览类型定义" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..ab0b4761cf9a --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "单击显示 {0} 个定义。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..8dc6ee587608 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "转到下一个错误或警告", + "markerAction.previous.label": "转到上一个错误或警告", + "editorMarkerNavigationError": "编辑器标记导航小组件错误颜色。", + "editorMarkerNavigationWarning": "编辑器标记导航小组件警告颜色。", + "editorMarkerNavigationInfo": "编辑器标记导航小组件信息颜色。", + "editorMarkerNavigationBackground": "编辑器标记导航小组件背景色。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/chs/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..659108444816 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "显示悬停" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/chs/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..f37c4060b5b9 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "正在加载..." +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/chs/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..8017b862c108 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "替换为上一个值", + "InPlaceReplaceAction.next.label": "替换为下一个值" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..5bd5906da321 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "将缩进转换为空格", + "indentationToTabs": "将缩进转换为制表符", + "configuredTabSize": "已配置制表符大小", + "selectTabWidth": "选择当前文件的制表符大小", + "indentUsingTabs": "使用“Tab”缩进", + "indentUsingSpaces": "使用空格缩进", + "detectIndentation": "检查内容中的缩进", + "editor.reindentlines": "重新缩进行" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/chs/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..346d11b67061 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "向上复制行", + "lines.copyDown": "向下复制行", + "lines.moveUp": "向上移动行", + "lines.moveDown": "向下移动行", + "lines.sortAscending": "按升序排列行", + "lines.sortDescending": "按降序排列行", + "lines.trimTrailingWhitespace": "裁剪尾随空格", + "lines.delete": "删除行", + "lines.indent": "行缩进", + "lines.outdent": "行减少缩进", + "lines.insertBefore": "在上面插入行", + "lines.insertAfter": "在下面插入行", + "lines.deleteAllLeft": "删除左侧所有内容", + "lines.deleteAllRight": "删除右侧所有内容", + "lines.joinLines": "合并行", + "editor.transpose": "转置游标处的字符", + "editor.transformToUppercase": "转换为大写", + "editor.transformToLowercase": "转换为小写" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/links/links.i18n.json b/i18n/chs/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..51e2dbb55544 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Cmd + 单击以跟踪链接", + "links.navigate": "按住 Ctrl 并单击可访问链接", + "links.command.mac": "Cmd + 单击以执行命令", + "links.command": "Ctrl + 单击以执行命令", + "links.navigate.al": "按住 Alt 并单击可访问链接", + "links.command.al": "Alt + 单击以执行命令", + "invalid.url": "抱歉,无法打开此链接,因为其格式不正确: {0}", + "missing.url": "抱歉,无法打开此链接,因为其目标丢失。", + "label": "打开链接" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/chs/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..3c402b850ddf --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "在上面添加光标", + "mutlicursor.insertBelow": "在下面添加光标", + "mutlicursor.insertAtEndOfEachLineSelected": "在行尾添加光标", + "addSelectionToNextFindMatch": "将选择添加到下一个查找匹配项", + "addSelectionToPreviousFindMatch": "将选择内容添加到上一查找匹配项", + "moveSelectionToNextFindMatch": "将上次选择移动到下一个查找匹配项", + "moveSelectionToPreviousFindMatch": "将上个选择内容移动到上一查找匹配项", + "selectAllOccurrencesOfFindMatch": "选择所有找到的查找匹配项", + "changeAll.label": "更改所有匹配项" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/chs/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..af6d0f3a465c --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "触发参数提示" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..d56310c99161 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0},提示" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..57cec414a184 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "显示修补程序({0})", + "quickFix": "显示修补程序", + "quickfix.trigger.label": "快速修复" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..3ebf52a28ce2 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "关闭" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..6feb8c65167d --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " – {0} 个引用", + "references.action.label": "查找所有引用" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..ee8d3370d1d9 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "正在加载..." +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..710eeeefcfc8 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "在文件 {0} 的 {1} 行 {2} 列的符号", + "aria.fileReferences.1": "{0} 中有 1 个符号,完整路径:{1}", + "aria.fileReferences.N": "{1} 中有 {0} 个符号,完整路径:{2}", + "aria.result.0": "未找到结果", + "aria.result.1": "在 {0} 中找到 1 个符号", + "aria.result.n1": "在 {1} 中找到 {0} 个符号", + "aria.result.nm": "在 {1} 个文件中找到 {0} 个符号" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..70e89645ee3d --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "解析文件失败。", + "referencesCount": "{0} 个引用", + "referenceCount": "{0} 个引用", + "missingPreviewMessage": "无可用预览", + "treeAriaLabel": "引用", + "noResults": "无结果", + "peekView.alternateTitle": "引用", + "peekViewTitleBackground": "速览视图标题区域背景颜色。", + "peekViewTitleForeground": "速览视图标题颜色。", + "peekViewTitleInfoForeground": "速览视图标题信息颜色。", + "peekViewBorder": "速览视图边框和箭头颜色。", + "peekViewResultsBackground": "速览视图结果列表背景颜色。", + "peekViewResultsMatchForeground": "速览视图结果列表中行节点的前景色。", + "peekViewResultsFileForeground": "速览视图结果列表中文件节点的前景色。", + "peekViewResultsSelectionBackground": "速览视图结果列表中所选条目的背景颜色。", + "peekViewResultsSelectionForeground": "速览视图结果列表中所选条目的前景色。", + "peekViewEditorBackground": "速览视图编辑器背景颜色。", + "peekViewEditorGutterBackground": "速览视图编辑器中导航线的背景颜色。", + "peekViewResultsMatchHighlight": "在速览视图结果列表中匹配突出显示颜色。", + "peekViewEditorMatchHighlight": "在速览视图编辑器中匹配突出显示颜色。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/chs/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..1f33c3d33d2b --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "无结果。", + "aria": "成功将“{0}”重命名为“{1}”。摘要:{2}", + "rename.failed": "抱歉,重命名无法执行。", + "rename.label": "重命名符号" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/chs/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..e4a7636ddc1d --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "重命名输入。键入新名称并按 \"Enter\" 提交。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/chs/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..6109b7602b0f --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "扩大选择", + "smartSelect.shrink": "缩小选择" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/chs/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..ef3fe110728f --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "确认“{0}”插入以下文本:{1}", + "suggest.trigger.label": "触发建议" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..ec34ba659f11 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "建议小组件的背景颜色", + "editorSuggestWidgetBorder": "建议小组件的边框颜色", + "editorSuggestWidgetForeground": "建议小组件的前景颜色。", + "editorSuggestWidgetSelectedBackground": "建议小组件中被选择条目的背景颜色。", + "editorSuggestWidgetHighlightForeground": "建议小组件中匹配内容的高亮颜色。", + "readMore": "阅读详细信息...{0}", + "suggestionWithDetailsAriaLabel": "{0}(建议)具有详细信息", + "suggestionAriaLabel": "{0},建议", + "readLess": "阅读简略信息...{0}", + "suggestWidget.loading": "正在加载...", + "suggestWidget.noSuggestions": "无建议。", + "suggestionAriaAccepted": "{0},已接受", + "ariaCurrentSuggestionWithDetails": "{0}(建议)具有详细信息", + "ariaCurrentSuggestion": "{0},建议" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/chs/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..897e74dff44a --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "切换 Tab 键是否移动焦点" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/chs/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..7926047995cd --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "读取访问时符号的背景颜色,例如读取变量时。", + "wordHighlightStrong": "写入访问时符号的背景颜色,例如写入变量时。", + "overviewRulerWordHighlightForeground": "概述符号突出显示的标尺标记颜色。", + "overviewRulerWordHighlightStrongForeground": "概述写访问符号突出显示的标尺标记颜色。", + "wordHighlight.next.label": "转到下一个突出显示的符号", + "wordHighlight.previous.label": "转到上一个突出显示的符号" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index d9700a739f99..21c4685e274f 100644 --- a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -39,7 +39,7 @@ "dup": "命令“{0}”多次出现在“命令”部分。", "menuId.invalid": "“{0}”为无效菜单标识符", "missing.command": "菜单项引用未在“命令”部分进行定义的命令“{0}”。", - "missing.altCommand": "菜单项引用未在“命令”部分进行定义的 alt 命令“{0}”。", - "dupe.command": "菜单项引用与默认和 alt 命令相同的命令", + "missing.altCommand": "菜单项引用了未在 \"commands\" 部分定义的替代命令“{0}”。", + "dupe.command": "菜单项引用的命令中默认和替代命令相同", "nosupport.altCommand": "抱歉,目前仅有 \"editor/title\" 菜单的 \"navigation\" 组支持替代命令" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json index 9fc0d95c7bd4..77d5d77fd7b3 100644 --- a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json @@ -12,9 +12,11 @@ "newWindow": "强制创建一个新的 Code 实例。", "performance": "通过启用 \"Developer: Startup Performance\" 命令开始。", "prof-startup": "启动期间运行 CPU 探查器", + "inspect-extensions": "允许进行扩展的调试与分析。检查开发人员工具可获取连接 URI。", + "inspect-brk-extensions": "允许在扩展主机在启动后暂停时进行扩展的调试与分析。检查开发人员工具可获取连接 URI。", "reuseWindow": "在上一活动窗口中强制打开文件或文件夹。", - "userDataDir": "指定存放用户数据的目录,此目录在作为根运行时十分有用。", - "verbose": "打印详细输出(表示 - 等待)。", + "userDataDir": "指定存放用户数据的目录。此目录在以 root 身份运行时十分有用。", + "verbose": "打印详细输出(隐含 --wait 参数)。", "wait": "等文件关闭后再返回。", "extensionHomePath": "设置扩展的根路径。", "listExtensions": "列出已安装的扩展。", @@ -24,6 +26,7 @@ "experimentalApis": "启用扩展程序实验性 api 功能。", "disableExtensions": "禁用所有已安装的扩展。", "disableGPU": "禁用 GPU 硬件加速。", + "status": "打印进程使用情况和诊断信息。", "version": "打印版本。", "help": "打印使用情况。", "usage": "使用情况", diff --git a/i18n/chs/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/chs/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index e17a499e47fc..5b77e214eaab 100644 --- a/i18n/chs/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/chs/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "未找到扩展名", - "noCompatible": "找不到可与此代码版本兼容的 {0} 版本。" + "notCompatibleDownload": "无法下载。找不到与 VS Code 当前版本 ({0}) 兼容的扩展。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 123f6947cde3..a6e3a8ea7bc9 100644 --- a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "扩展无效: package.json 不是 JSON 文件。", "restartCodeLocal": "请先重启 Code 再重新安装 {0}。", - "restartCodeGallery": "请先重启 Code 再重新安装。", + "installingOutdatedExtension": "您已安装此扩展的新版程序。是否要使用旧版覆盖?", + "override": "覆盖", + "cancel": "取消", + "notFoundCompatible": "无法安装。找不到与 VS Code 当前版本 ({1}) 兼容的扩展“{0}”。", + "quitCode": "无法安装,因为此扩展的一个过时实例仍在运行。请先完全重启 VS Code,再重新安装。", + "exitCode": "无法安装,因为此扩展的一个过时实例仍在运行。请先完全重启 VS Code,再重新安装。", + "notFoundCompatibleDependency": "无法安装。找不到与 VS Code 当前版本 ({1}) 兼容的依赖扩展“{0}”。", "uninstallDependeciesConfirmation": "要仅卸载“{0}”或者其依赖项也一起卸载?", "uninstallOnly": "仅", "uninstallAll": "全部", - "cancel": "取消", "uninstallConfirmation": "是否确定要卸载“{0}”?", "ok": "确定", "singleDependentError": "无法卸载扩展程序“{0}”。扩展程序“{1}”依赖于此。", diff --git a/i18n/chs/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/chs/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index 4ae3c02e3c1b..66040db95cc9 100644 --- a/i18n/chs/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -5,22 +5,24 @@ // Do not edit this file. It is machine generated. { "vscode.extension.engines.vscode": "对于 VS Code 扩展程序,指定该扩展程序与之兼容的 VS Code 版本。不能为 *. 例如: ^0.10.5 表示最低兼容 VS Code 版本 0.10.5。", - "vscode.extension.publisher": "VS Code 扩展的发布服务器。", + "vscode.extension.publisher": "VS Code 扩展的发布者。", "vscode.extension.displayName": "VS Code 库中使用的扩展的显示名称。", "vscode.extension.categories": "VS Code 库用于对扩展进行分类的类别。", - "vscode.extension.galleryBanner": "VS Code 商城使用的横幅。", + "vscode.extension.galleryBanner": "在 VS Code 商店中使用的横幅。", "vscode.extension.galleryBanner.color": "VS Code 商城页标题上的横幅颜色。", - "vscode.extension.galleryBanner.theme": "横幅中使用的字体颜色主题。", + "vscode.extension.galleryBanner.theme": "横幅文字的颜色主题。", "vscode.extension.contributes": "由此包表示的 VS Code 扩展的所有贡献。", - "vscode.extension.preview": "在 Marketplace 中设置扩展,将其标记为“预览”。", + "vscode.extension.preview": "在商店中将扩展标记为“预览版”", "vscode.extension.activationEvents": "VS Code 扩展的激活事件。", "vscode.extension.activationEvents.onLanguage": "在打开被解析为指定语言的文件时发出的激活事件。", "vscode.extension.activationEvents.onCommand": "在调用指定命令时发出的激活事件。", "vscode.extension.activationEvents.onDebug": "在用户准备调试或准备设置调试配置时发出的激活事件。", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "在需要创建 \"launch.json\" 文件 (且需要调用 provideDebugConfigurations 的所有方法) 时发出的激活事件。", + "vscode.extension.activationEvents.onDebugResolve": "在将要启动具有特定类型的调试会话 (且需要调用相应的 resolveDebugConfiguration 方法) 时发出的激活事件。", "vscode.extension.activationEvents.workspaceContains": "在打开至少包含一个匹配指定 glob 模式的文件的文件夹时发出的激活事件。", "vscode.extension.activationEvents.onView": "在指定视图被展开时发出的激活事件。", "vscode.extension.activationEvents.star": "在 VS Code 启动时发出的激活事件。为确保良好的最终用户体验,请仅在其他激活事件组合不适用于你的情况时,才在扩展中使用此事件。", - "vscode.extension.badges": "在 Marketplace 的扩展页边栏中显示的徽章数组。", + "vscode.extension.badges": "在商店扩展页面侧边栏中显示的徽章的数组。", "vscode.extension.badges.url": "徽章图像 URL。", "vscode.extension.badges.href": "徽章链接。", "vscode.extension.badges.description": "徽章说明。", diff --git a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json index 5827e2f251ee..7c3d96dd488d 100644 --- a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -25,11 +25,11 @@ "inputBoxBorder": "输入框边框。", "inputBoxActiveOptionBorder": "输入字段中已激活选项的边框颜色。", "inputPlaceholderForeground": "输入框中占位符的前景色。", - "inputValidationInfoBackground": "严重性为信息时输入验证的背景颜色。", + "inputValidationInfoBackground": "输入验证结果为信息级别时的背景色。", "inputValidationInfoBorder": "严重性为信息时输入验证的边框颜色。", - "inputValidationWarningBackground": "严重性为警告时输入验证的背景颜色。", + "inputValidationWarningBackground": "输入验证结果为警告级别时的背景色。", "inputValidationWarningBorder": "严重性为警告时输入验证的边框颜色。", - "inputValidationErrorBackground": "严重性为错误时输入验证的背景颜色。", + "inputValidationErrorBackground": "输入验证结果为错误级别时的背景色。", "inputValidationErrorBorder": "严重性为错误时输入验证的边框颜色。", "dropdownBackground": "下拉列表背景色。", "dropdownForeground": "下拉列表前景色。", diff --git a/i18n/chs/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/chs/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..d9e09ebdfd05 --- /dev/null +++ b/i18n/chs/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "切换标签页可见性", + "view": "查看" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json index c62511519019..01a52479abad 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "largeNumberBadge": "1万+", "badgeTitle": "{0} - {1}", "additionalViews": "其他视图", "numberBadge": "{0} ({1})", diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 1e4690982944..dd3e01e846c5 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "打开上一个编辑器", "nextEditorInGroup": "打开组中的下一个编辑器", "openPreviousEditorInGroup": "打开组中上一个编辑器", + "lastEditorInGroup": "打开组中上一个编辑器", "navigateNext": "前进", "navigatePrevious": "后退", "navigateLast": "转到最后", diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index 086f25858e13..9c9da616c68f 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "按标签或按组移动活动编辑器", "editorCommand.activeEditorMove.arg.name": "活动编辑器移动参数", - "editorCommand.activeEditorMove.arg.description": "参数属性:\n\t\t\t\t\t\t* 'to': 提供向何处移动的字符串值。\n\t\t\t\t\t\t* 'by': 提供要移动的单元的字符串值。按标签或按组。\n\t\t\t\t\t\t* 'value': 提供要移动的位置或绝对位置数量的数字值。\n\t\t\t\t\t", + "editorCommand.activeEditorMove.arg.description": "参数属性:\n\t* \"to\": 提供向何处移动的字符串值。\n\t* \"by\": 提供移动的单位的字符串值。按选项卡或按组。\n\t* \"value\": 提供移动的位置数量或移动到的绝对位置的数字型值。", "commandDeprecated": "已删除命令 **{0}**。你可以改用 **{1}**", "openKeybindings": "配置键盘快捷方式" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 67671aeb85cf..65d7dab6d61c 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "是", "screenReaderDetectedExplanation.answerNo": "否", "screenReaderDetectedExplanation.body1": "VS Code 已为屏幕阅读器的使用进行优化。", - "screenReaderDetectedExplanation.body2": "一些编辑器功能将有不同的行为: 例如,文字换行,折叠,自动关闭括号等。" + "screenReaderDetectedExplanation.body2": "某些编辑器功能可能会有不同的行为,例如自动换行、折叠等。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/quickopen.i18n.json b/i18n/chs/src/vs/workbench/browser/quickopen.i18n.json index 949f6468fc28..a6af2a3c8740 100644 --- a/i18n/chs/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "没有匹配的结果", - "noResultsFound2": "未找到结果", - "entryAriaLabel": "{0},命令" + "noResultsFound2": "未找到结果" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json index 47bc050edeba..8b65741ef0b0 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "打开最近的文件…", "quickOpenRecent": "快速打开最近的文件…", "closeMessages": "关闭通知消息", - "reportIssues": "报告问题", + "reportIssueInEnglish": "使用英文报告问题", "reportPerformanceIssue": "报告性能问题", "keybindingsReference": "键盘快捷方式参考", "openDocumentationUrl": "文档", @@ -47,5 +47,25 @@ "showNextWindowTab": "显示下一个窗口选项卡", "moveWindowTabToNewWindow": "将窗口选项卡移动到新窗口", "mergeAllWindowTabs": "合并所有窗口", - "toggleWindowTabsBar": "切换窗口选项卡栏" + "toggleWindowTabsBar": "切换窗口选项卡栏", + "configureLocale": "配置语言", + "displayLanguage": "定义 VSCode 的显示语言。", + "doc": "请参阅 {0},了解支持的语言列表。", + "restart": "更改此值需要重启 VSCode。", + "fail.createSettings": "无法创建“{0}”({1})。", + "openLogsFolder": "打开日志文件夹", + "showLogs": "显示日志...", + "mainProcess": "主进程", + "sharedProcess": "共享进程", + "rendererProcess": "渲染器进程", + "extensionHost": "扩展主机", + "selectProcess": "选择进程", + "setLogLevel": "设置日志级别", + "trace": "跟踪", + "debug": "调试", + "info": "信息", + "warn": "警告", + "err": "错误", + "critical": "关键", + "off": "关闭" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index 91dacb2a81d1..e93318a00b83 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "查看", "help": "帮助", "file": "文件", - "workspaces": "工作区", "developer": "开发者", + "workspaces": "工作区", "showEditorTabs": "控制打开的编辑器是否显示在选项卡中。", "workbench.editor.labelFormat.default": "显示文件名。当启用选项卡且在同一组内有两个相同名称的文件时,将添加每个文件路径中可以用于区分的部分。在选项卡被禁用且编辑器活动时,将显示相对于工作区文件夹的路径。", "workbench.editor.labelFormat.short": "在文件的目录名之后显示文件名。", @@ -16,6 +16,7 @@ "workbench.editor.labelFormat.long": "在文件的绝对路径之后显示文件名。", "tabDescription": "控制编辑器标签的格式。修改这项设置会让文件的路径更容易理解:\n- short: \"parent\"\n- medium: \"workspace/src/parent\"\n- long: \"/home/user/workspace/src/parent\"\n- default: 当与另一选项卡标题相同时为 \".../parent\"。选项卡被禁用时则为相对工作区路径", "editorTabCloseButton": "控制编辑器的选项卡关闭按钮的位置,或当设置为 \"off\" 时禁用关闭它们。", + "tabSizing": "控制编辑器选项卡的大小。若设置为 \"fit\",选项卡将总是足够大,能够完全显示编辑器标签。若设置为 \"shrink\",将在不能一次全部显示所有选项卡时,允许选项卡缩小。", "showIcons": "控制打开的编辑器是否随图标一起显示。这还需启用图标主题。", "enablePreview": "控制是否将打开的编辑器显示为预览。预览编辑器将会重用至其被保留(例如,通过双击或编辑),且其字体样式将为斜体。", "enablePreviewFromQuickOpen": "控制 Quick Open 中打开的编辑器是否显示为预览。预览编辑器可以重新使用,直到将其保留(例如,通过双击或编辑)。", @@ -26,18 +27,17 @@ "closeOnFocusLost": "控制 Quick Open 是否应在失去焦点时自动关闭。", "openDefaultSettings": "控制打开设置时是否打开显示所有默认设置的编辑器。", "sideBarLocation": "控制边栏的位置。它可显示在工作台的左侧或右侧。", - "panelLocation": "控制面板的位置。它可显示在工作台的底部或右侧。", "statusBarVisibility": "控制工作台底部状态栏的可见性。", "activityBarVisibility": "控制工作台中活动栏的可见性。", "closeOnFileDelete": "控制文件被其他某些进程删除或重命名时是否应该自动关闭显示文件的编辑器。禁用此项会保持编辑器作为此类事件的脏文件打开。请注意,从应用程序内部进行删除操作会始终关闭编辑器,并且脏文件始终不会关闭以保存数据。", - "experimentalFuzzySearchEndpoint": "表示用于实验性设置搜索的端点。", - "experimentalFuzzySearchKey": "表示用于实验性设置搜索的密钥。", + "enableNaturalLanguageSettingsSearch": "控制是否在设置中启用自然语言搜索模式。", "fontAliasing": "控制工作台中字体的渲染方式\n- default: 次像素平滑字体。将在大多数非 retina 显示器上显示最清晰的文字\n- antialiased: 进行像素而不是次像素级别的字体平滑。可能会导致字体整体显示得更细\n- none: 禁用字体平滑。将显示边缘粗糙、有锯齿的文字", "workbench.fontAliasing.default": "次像素平滑字体。将在大多数非 retina 显示器上显示最清晰的文字。", "workbench.fontAliasing.antialiased": "进行像素而不是次像素级别的字体平滑。可能会导致字体整体显示得更细。", "workbench.fontAliasing.none": "禁用字体平滑。将显示边缘粗糙、有锯齿的文字。", "swipeToNavigate": "使用三指横扫在打开的文件之间导航", "workbenchConfigurationTitle": "工作台", + "windowConfigurationTitle": "窗口", "window.openFilesInNewWindow.on": "文件将在新窗口中打开", "window.openFilesInNewWindow.off": "文件将在该文件的文件夹打开的窗口中打开,或在上一个活动窗口中打开", "window.openFilesInNewWindow.default": "文件将在该文件的文件夹打开的窗口中打开,或在上一个活动窗口中打开,除非通过平台或从查找程序(仅限 macOS)打开", @@ -69,11 +69,11 @@ "autoDetectHighContrast": "如果已启用,将自动更改为高对比度主题;如果 Windows 正在使用高对比度主题,则当离开 Windows 高对比度主题时会更改为深色主题。", "titleBarStyle": "调整窗口标题栏的外观。更改需要在完全重启后才能应用。", "window.nativeTabs": "\n启用macOS Sierra窗口选项卡。请注意,更改需要完全重新启动程序才能生效。如果配置此选项,本机选项卡将禁用自定义标题栏样式。", - "windowConfigurationTitle": "窗口", "zenModeConfigurationTitle": "Zen 模式", "zenMode.fullScreen": "控制打开 Zen Mode 是否也会将工作台置于全屏模式。", "zenMode.hideTabs": "控制打开 Zen 模式是否也会隐藏工作台选项卡。", "zenMode.hideStatusBar": "控制打开 Zen 模式是否也会隐藏工作台底部的状态栏。", "zenMode.hideActivityBar": "控制打开 Zen 模式是否也会隐藏工作台左侧的活动栏。", - "zenMode.restore": "控制如果某窗口已退出 zen 模式,是否应还原到 zen 模式。" + "zenMode.restore": "控制如果某窗口已退出 zen 模式,是否应还原到 zen 模式。", + "JsonSchema.locale": "要使用的 UI 语言。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 258e88045a6c..e6a086dba295 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "停用断点", "reapplyAllBreakpoints": "重新应用所有断点", "addFunctionBreakpoint": "添加函数断点", - "renameFunctionBreakpoint": "重命名函数断点", "addConditionalBreakpoint": "添加条件断点...", "editConditionalBreakpoint": "编辑断点...", "setValue": "设置值", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..ba253c8fba5f --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "编辑断点...", + "functionBreakpointsNotSupported": "此调试类型不支持函数断点", + "functionBreakpointPlaceholder": "要断开的函数", + "functionBreakPointInputAriaLabel": "键入函数断点" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..da826ee92a9b --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "调用堆栈部分", + "debugStopped": "因 {0} 已暂停", + "callStackAriaLabel": "调试调用堆栈", + "process": "进程", + "paused": "已暂停", + "running": "正在运行", + "thread": "线程", + "pausedOn": "因 {0} 已暂停", + "loadMoreStackFrames": "加载多个堆栈帧", + "threadAriaLabel": "线程 {0},调用堆栈,调试", + "stackFrameAriaLabel": "堆栈帧 {0} 行 {1} {2},调用堆栈,调试" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index e96dadb14ac5..96b79d61f2a9 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,10 @@ "openExplorerOnEnd": "调试会话结束时自动打开资源管理器视图", "inlineValues": "调试时,在编辑器中显示变量值内联", "hideActionBar": "控制是否应该隐藏浮点调试操作栏", + "never": "在状态栏中不再显示调试", + "always": "始终在状态栏中显示调试", + "onFirstSessionStart": "仅于第一次启动调试后在状态栏中显示调试", + "showInStatusBar": "控制何时显示调试状态栏", + "openDebug": "控制是否在调试会话开始时打开调试侧边栏面板。", "launch": "全局的调试启动配置。应用作跨工作区共享的 \"launch.json\" 的替代。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index c3b4b3591051..0623903445b6 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "已添加断点,行 {0}, 文件 {1}", "breakpointRemoved": "已删除断点,行 {0},文件 {1}", "compoundMustHaveConfigurations": "复合项必须拥有 \"configurations\" 属性集,才能启动多个配置。", - "configMissing": "\"launch.json\" 中缺少配置“{0}”。", "debugRequestNotSupported": "所选调试配置的属性“{0}”的值“{1}”不受支持。", "debugRequesMissing": "所选的调试配置缺少属性“{0}”。", "debugTypeNotSupported": "配置的类型“{0}”不受支持。", @@ -23,5 +22,5 @@ "noFolderWorkspaceDebugError": "无法调试活动文件。请确保它保存在磁盘上,并确保已为该文件类型安装了调试扩展。", "NewLaunchConfig": "请设置应用程序的启动配置文件。{0}", "DebugTaskNotFound": "找不到 preLaunchTask“{0}”。", - "taskNotTracked": "无法跟踪预启动任务“{0}”。" + "taskNotTracked": "无法跟踪 preLaunchTask “{0}”。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..48a10073c86f --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "变量部分", + "variablesAriaTreeLabel": "调试变量", + "variableValueAriaLabel": "键入新的变量值", + "variableScopeAriaLabel": "范围 {0},变量,调试", + "variableAriaLabel": "{0} 值 {1},变量,调试" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..dd591fbee67a --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "表达式部分", + "watchAriaTreeLabel": "调试监视表达式", + "watchExpressionPlaceholder": "要监视的表达式", + "watchExpressionInputAriaLabel": "键入监视表达式", + "watchExpressionAriaLabel": "{0} 值 {1},监视,调试", + "watchVariableAriaLabel": "{0} 值 {1},监视,调试" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index adb3d890c408..3f110c4b49de 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "扩展名", "extension id": "扩展标识符", + "preview": "预览", "publisher": "发布服务器名称", "install count": "安装计数", "rating": "评级", + "repository": "存储库", "license": "许可证", "details": "详细信息", "contributions": "发布内容", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index aa1f57a84b5f..460dc8dbb515 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "正在卸载", "updateAction": "更新", "updateTo": "更新到 {0}", - "enableForWorkspaceAction.label": "启用(工作区)", - "enableAlwaysAction.label": "启用(始终)", - "disableForWorkspaceAction.label": "禁用(工作区)", - "disableAlwaysAction.label": "禁用(始终)", "ManageExtensionAction.uninstallingTooltip": "正在卸载", - "enableForWorkspaceAction": "工作区", - "enableGloballyAction": "始终", + "enableForWorkspaceAction": "启用(工作区)", + "enableGloballyAction": "启用", "enableAction": "启用", - "disableForWorkspaceAction": "工作区", - "disableGloballyAction": "始终", + "disableForWorkspaceAction": "禁用(工作区)", + "disableGloballyAction": "禁用", "disableAction": "禁用", "checkForUpdates": "检查更新", "enableAutoUpdate": "启用自动更新扩展", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "已安装根据工作区推荐的所有扩展", "installRecommendedExtension": "安装推荐的扩展", "extensionInstalled": "您已经安装过此推荐扩展", - "showRecommendedKeymapExtensions": "显示推荐键映射", "showRecommendedKeymapExtensionsShort": "键映射", - "showLanguageExtensions": "显示语言扩展", "showLanguageExtensionsShort": "语言扩展", - "showAzureExtensions": "显示 Azure 扩展", "showAzureExtensionsShort": "Azure 扩展", "OpenExtensionsFile.failed": "无法在 \".vscode\" 文件夹({0})内创建 \"extensions.json\" 文件。", "configureWorkspaceRecommendedExtensions": "配置建议的扩展(工作区)", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json index 6f09a313cda1..1792f02cce43 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json @@ -7,6 +7,6 @@ "manage": "按 Enter 管理你的扩展。", "notfound": "没有在商店中找到扩展“{0}”。", "install": "按 Enter 键在商店中安装“{0}”。", - "searchFor": "按 Enter 以在应用商店中搜索“{0}”。", + "searchFor": "按 Enter 键在商店中搜索“{0}”。", "noExtensionsToInstall": "键入扩展名称" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..e4ad48944193 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ratedByUsers": "评价来自 {0} 位用户" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..750cf2f54019 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectAndStartDebug": "单击停止分析。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index 1320378fc4d3..8bff3c904df2 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -7,9 +7,11 @@ "extensionsCommands": "管理扩展", "galleryExtensionsCommands": "安装库扩展", "extension": "扩展", + "runtimeExtension": "正在运行的扩展", "extensions": "扩展", "view": "查看", + "developer": "开发者", "extensionsConfigurationTitle": "扩展", "extensionsAutoUpdate": "自动更新扩展", - "extensionsIgnoreRecommendations": "忽略推荐的扩展" + "extensionsIgnoreRecommendations": "如果设置为 \"true\",将不再显示扩展建议的通知。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index b797d01df970..83c6c0f0855b 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -10,7 +10,7 @@ "recommendedExtensions": "推荐", "otherRecommendedExtensions": "其他推荐", "workspaceRecommendedExtensions": "工作区推荐", - "searchExtensions": "在应用商店中搜索扩展", + "searchExtensions": "在商店中搜索扩展", "sort by installs": "排序依据: 安装计数", "sort by rating": "排序依据: 分级", "sort by name": "排序依据: 名称", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..4ae4f87f67c6 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "starActivation": "已于启动时激活", + "workspaceContainsGlobActivation": "已激活,因为工作区中存在与 {0} 匹配的文件", + "workspaceContainsFileActivation": "已激活,因为工作区中存在文件 {0}", + "languageActivation": "已激活,因为您打开了 {0} 文件", + "workspaceGenericActivation": "已于 {0} 时激活", + "errors": "{0} 个未捕获的错误", + "extensionsInputName": "正在运行的扩展", + "showRuntimeExtensions": "显示正在运行的扩展", + "reportExtensionIssue": "报告问题", + "extensionHostProfileStart": "开始分析扩展主机", + "extensionHostProfileStop": "停止分析扩展主机", + "saveExtensionHostProfile": "保存扩展主机分析文件" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/fileActions.i18n.json index 6a30564b3983..f9208415003c 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/fileActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -69,5 +69,7 @@ "invalidFileNameError": "名称 **{0}** 作为文件或文件夹名无效。请选择其他名称。", "filePathTooLongError": "名称 **{0}** 导致路径太长。请选择更短的名称。", "compareWithSaved": "比较活动与已保存的文件", - "modifiedLabel": "{0} (磁盘上) ↔ {1}" + "modifiedLabel": "{0} (磁盘上) ↔ {1}", + "compareWithClipboard": "比较活动文件与剪贴板", + "clipboardComparisonLabel": "剪贴板 ↔ {0}" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..c1ad2f1b1e05 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "文件夹" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..30c68b4c7adb --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "文件", + "revealInSideBar": "在侧边栏中显示", + "acceptLocalChanges": "使用你的更改并覆盖磁盘上的内容。", + "revertLocalChanges": "放弃你的更改并还原为磁盘上的内容" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..f9208415003c --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "重试", + "rename": "重命名", + "newFile": "新建文件", + "newFolder": "新建文件夹", + "openFolderFirst": "先打开一个文件夹,以在其中创建文件或文件夹。", + "newUntitledFile": "新的无标题文件", + "createNewFile": "新建文件", + "createNewFolder": "新建文件夹", + "deleteButtonLabelRecycleBin": "移动到回收站(&&M)", + "deleteButtonLabelTrash": "移动到回收站(&&M)", + "deleteButtonLabel": "删除(&&D)", + "dirtyMessageFolderOneDelete": "你正在删除的文件夹有 1 个文件具有未保存的更改。是否继续?", + "dirtyMessageFolderDelete": "你正在删除的文件夹有 {0} 个文件具有未保存的更改。是否继续?", + "dirtyMessageFileDelete": "你正在删除的文件具有未保存的更改。是否继续?", + "dirtyWarning": "如果不保存,更改将丢失。", + "confirmMoveTrashMessageFolder": "是否确实要删除“{0}”及其内容?", + "confirmMoveTrashMessageFile": "是否确实要删除“{0}”?", + "undoBin": "可以从回收站还原。", + "undoTrash": "可以从回收站还原。", + "doNotAskAgain": "不再询问", + "confirmDeleteMessageFolder": "是否确定要永久删除“{0}”及其内容?", + "confirmDeleteMessageFile": "是否确定要永久删除“{0}”?", + "irreversible": "此操作不可逆!", + "permDelete": "永久删除", + "delete": "删除", + "importFiles": "导入文件", + "confirmOverwrite": "目标文件夹中已存在具有相同名称的文件或文件夹。是否要替换它?", + "replaceButtonLabel": "替换(&&R)", + "copyFile": "复制", + "pasteFile": "粘贴", + "duplicateFile": "重复", + "openToSide": "打开到侧边", + "compareSource": "选择以进行比较", + "globalCompareFile": "比较活动文件与...", + "openFileToCompare": "首先打开文件以将其与另外一个文件比较。", + "compareWith": "将“{0}”与“{1}”比较", + "compareFiles": "比较文件", + "refresh": "刷新", + "save": "保存", + "saveAs": "另存为...", + "saveAll": "全部保存", + "saveAllInGroup": "保存组中的全部内容", + "saveFiles": "保存所有文件", + "revert": "还原文件", + "focusOpenEditors": "专注于“打开的编辑器”视图", + "focusFilesExplorer": "关注文件资源浏览器", + "showInExplorer": "在侧边栏中显示活动文件", + "openFileToShow": "请先打开要在浏览器中显示的文件", + "collapseExplorerFolders": "在资源管理器中折叠文件夹", + "refreshExplorer": "刷新资源管理器", + "openFileInNewWindow": "在新窗口中打开活动文件", + "openFileToShowInNewWindow": "请先打开要在新窗口中打开的文件", + "revealInWindows": "在资源管理器中显示", + "revealInMac": "在 Finder 中显示", + "openContainer": "打开所在的文件夹", + "revealActiveFileInWindows": "Windows 资源管理器中显示活动文件", + "revealActiveFileInMac": "在 Finder 中显示活动文件", + "openActiveFileContainer": "打开活动文件所在的文件夹", + "copyPath": "复制路径", + "copyPathOfActive": "复制活动文件的路径", + "emptyFileNameError": "必须提供文件或文件夹名。", + "fileNameExistsError": "此位置已存在文件或文件夹 **{0}**。请选择其他名称。", + "invalidFileNameError": "名称 **{0}** 作为文件或文件夹名无效。请选择其他名称。", + "filePathTooLongError": "名称 **{0}** 导致路径太长。请选择更短的名称。", + "compareWithSaved": "比较活动与已保存的文件", + "modifiedLabel": "{0} (磁盘上) ↔ {1}", + "compareWithClipboard": "比较活动文件与剪贴板", + "clipboardComparisonLabel": "剪贴板 ↔ {0}" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..702c021c5f32 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "首先打开文件以复制其路径", + "openFileToReveal": "首先打开文件以展现" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..63427668f5f3 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "显示资源管理器", + "explore": "资源管理器", + "view": "查看", + "textFileEditor": "文本文件编辑器", + "binaryFileEditor": "二进制文件编辑器", + "filesConfigurationTitle": "文件", + "exclude": "配置 glob 模式以在搜索中排除文件和文件夹。例如,文件资源管理器根据此设置决定文件或文件夹的显示和隐藏。", + "files.exclude.boolean": "匹配文件路径所依据的 glob 模式。设置为 true 或 false 可启用或禁用该模式。", + "files.exclude.when": "对匹配文件的同级文件的其他检查。使用 $(basename) 作为匹配文件名的变量。", + "associations": "配置语言的文件关联(如: \"*.extension\": \"html\")。这些关联的优先级高于已安装语言的默认关联。", + "encoding": "读取和编写文件时使用的默认字符集编码。也可以根据语言配置此设置。", + "autoGuessEncoding": "如果启用,会在打开文件时尝试猜测字符集编码。也可以根据语言配置此设置。", + "eol": "默认行尾字符。使用 \\n 表示 LF,\\r\\n 表示 CRLF。", + "trimTrailingWhitespace": "启用后,将在保存文件时剪裁尾随空格。", + "insertFinalNewline": "启用后,保存文件时在文件末尾插入一个最终新行。", + "trimFinalNewlines": "启用后,保存文件时将删除在最终新行后的所有新行。", + "files.autoSave.off": "永不自动保存更新后的文件。", + "files.autoSave.afterDelay": "配置 \"files.autoSaveDelay\" 后自动保存更新后的文件。", + "files.autoSave.onFocusChange": "编辑器失去焦点时自动保存更新后的文件。", + "files.autoSave.onWindowChange": "窗口失去焦点时自动保存更新后的文件。", + "autoSave": "控制已更新文件的自动保存。接受的值:“{0}”、\"{1}”、“{2}”(编辑器失去焦点)、“{3}”(窗口失去焦点)。如果设置为“{4}”,则可在 \"files.autoSaveDelay\" 中配置延迟。", + "autoSaveDelay": "控制在多少毫秒后自动保存更改过的文件。仅在“files.autoSave”设置为“{0}”时适用。", + "watcherExclude": "配置文件路径的 glob 模式以从文件监视排除。模式必须在绝对路径上匹配(例如 ** 前缀或完整路径需正确匹配)。更改此设置需要重启。如果在启动时遇到 Code 消耗大量 CPU 时间,则可以排除大型文件夹以减少初始加载。", + "hotExit.off": "禁用热退出。", + "hotExit.onExit": "应用程序关闭时将触发热退出。在 Windows/Linux 上关闭最后一个窗口或触发 workbench.action.quit 命令(命令托盘、键绑定、菜单)会引起应用程序关闭。下次启动时将还原所有已备份的窗口。", + "hotExit.onExitAndWindowClose": "应用程序关闭时将触发热退出。在 Windows/Linux 上关闭最后一个窗口、触发 workbench.action.quit 命令(命令托盘、键绑定、菜单)会引起应用程序关闭。对于任何有文件夹打开的窗口,则不论该窗口是否是最后一个窗口。下次启动时将还原所有未打开文件夹的窗口。若要还原打开有文件夹的窗口,请将“window.restoreWindows”设置为“all”。", + "hotExit": "控制是否在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示。", + "useExperimentalFileWatcher": "使用新的试验文件观察程序。", + "defaultLanguage": "分配给新文件的默认语言模式。", + "editorConfigurationTitle": "编辑器", + "formatOnSave": "保存时设置文件的格式。格式化程序必须可用,不能自动保存文件,并且不能关闭编辑器。", + "explorerConfigurationTitle": "文件资源管理器", + "openEditorsVisible": "在“打开的编辑器”窗格中显示的编辑器数量。将其设置为 0 可隐藏窗格。", + "dynamicHeight": "控制打开的编辑器部分的高度是否应动态适应元素数量。", + "autoReveal": "控制资源管理器是否应在打开文件时自动显示并选择它们。", + "enableDragAndDrop": "控制资源管理器是否应该允许通过拖放移动文件和文件夹。", + "confirmDragAndDrop": "控制在资源管理器内拖放移动文件或文件夹时是否进行确认。", + "confirmDelete": "控制资源管理器是否应在删除文件到回收站时进行确认。", + "sortOrder.default": "按名称的字母顺序排列文件和文件夹。文件夹显示在文件前。", + "sortOrder.mixed": "按名称的字母顺序排列文件和文件夹。两者穿插显示。", + "sortOrder.filesFirst": "按名称的字母顺序排列文件和文件夹。文件显示在文件夹前。", + "sortOrder.type": "按扩展名的字母顺序排列文件和文件夹。文件夹显示在文件前。", + "sortOrder.modified": "按最后修改日期降序排列文件和文件夹。文件夹显示在文件前。", + "sortOrder": "控制资源管理器文件和文件夹的排列顺序。除了默认排列顺序,你也可以设置为 \"mixed\" (文件和文件夹一起排序)、\"type\" (按文件类型排)、\"modified\" (按最后修改日期排)或是 \"filesFirst\" (将文件排在文件夹前)。", + "explorer.decorations.colors": "控制文件修饰是否用颜色。", + "explorer.decorations.badges": "控制文件修饰是否用徽章。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..8ebee88ce985 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "使用右侧编辑器工具栏的操作来**撤消**你的更改或用你的更改来**覆盖**磁盘上的内容", + "discard": "放弃", + "overwrite": "覆盖", + "retry": "重试", + "readonlySaveError": "无法保存“{0}”: 文件写保护。选择“覆盖”以删除保护。 ", + "genericSaveError": "未能保存“{0}”: {1}", + "staleSaveError": "无法保存“{0}”: 磁盘上的内容较新。单击 **比较** 以比较你的版本和磁盘上的版本。", + "compareChanges": "比较", + "saveConflictDiffLabel": "{0} (on disk) ↔ {1} (in {2}) - 解决保存的冲突" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..5939052419bd --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "无打开的文件夹", + "explorerSection": "文件资源管理器部分", + "noWorkspaceHelp": "你还没有在工作区中添加文件夹。", + "addFolder": "添加文件夹", + "noFolderHelp": "尚未打开文件夹。", + "openFolder": "打开文件夹" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..e301fea30f0d --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "资源管理器", + "canNotResolve": "无法解析工作区文件夹" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..7193836bd088 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "文件资源管理器部分", + "treeAriaLabel": "文件资源管理器" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..d97098d02f75 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "键入文件名。按 Enter 以确认或按 Esc 以取消。", + "filesExplorerViewerAriaLabel": "{0},文件资源管理器", + "dropFolders": "你是否要将文件夹添加到工作区?", + "dropFolder": "你是否要将文件夹添加到工作区?", + "addFolders": "添加文件夹(&&A)", + "addFolder": "添加文件夹(&&A)", + "confirmMove": "是否确实要移动“{0}”?", + "doNotAskAgain": "不再询问", + "moveButtonLabel": "移动(&&M)", + "confirmOverwriteMessage": "目标文件夹中已存在“{0}”。是否要将其替换?", + "irreversible": "此操作不可逆!", + "replaceButtonLabel": "替换(&&R)" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..0c93f41d44d0 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "打开的编辑器", + "openEditosrSection": "打开的编辑器部分", + "dirtyCounter": "{0} 个未保存", + "saveAll": "全部保存", + "closeAllUnmodified": "关闭未更改", + "closeAll": "全部关闭", + "compareWithSaved": "与已保存文件比较", + "close": "关闭", + "closeOthers": "关闭其他" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..5b583f979264 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, 编辑器组", + "openEditorAriaLabel": "{0}, 打开编辑器", + "saveAll": "全部保存", + "closeAllUnmodified": "关闭未更改", + "closeAll": "全部关闭", + "compareWithSaved": "与已保存文件比较", + "close": "关闭", + "closeOthers": "关闭其他" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..c5e7b7ca89e5 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "totalProblems": "总计 {0} 个问题", + "filteredProblems": "显示 {0} 个 (共 {1} 个) 问题" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/common/messages.i18n.json index b6d59b5586ca..3e34c78c26aa 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,7 @@ { "viewCategory": "查看", "problems.view.toggle.label": "切换显示问题视图", - "problems.view.show.label": "显示问题", - "problems.view.hide.label": "隐藏问题视图", + "problems.view.focus.label": "聚焦于问题视图", "problems.panel.configuration.title": "问题预览", "problems.panel.configuration.autoreveal": "控制问题预览是否应在打开文件时自动显示它们。", "markers.panel.title.problems": "问题", diff --git a/i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..9b26b94472e5 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "已成功创建描述文件。", + "prof.detail": "请创建问题并手动附加以下文件:\n{0}", + "prof.restartAndFileIssue": "创建问题并重启", + "prof.restart": "重启", + "prof.thanks": "感谢您的帮助。", + "prof.detail.restart": "需要重新启动才能继续使用“{0}”。再次感谢您的贡献。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 1c5aca86231a..2f3fae8940f5 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "按所需的键组合,然后按 Enter。按 Esc 可取消。", + "defineKeybinding.initial": "先按所需的组合键,再按 Enter 键。", "defineKeybinding.chordsTo": "加上" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index a191f56abf9f..34f4d8ea7017 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "更改键绑定", "addKeybindingLabelWithKey": "添加键绑定", "addKeybindingLabel": "添加键绑定", + "title": "{0} ({1})", "commandAriaLabel": "命令为 {0}。", "keybindingAriaLabel": "键绑定为 {0}。", "noKeybinding": "未分配键绑定。", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index a6386fe575c5..40d1801085b2 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openRawDefaultSettings": "打开默认设置原始文档", "openGlobalSettings": "打开用户设置", "openGlobalKeybindings": "打开键盘快捷方式", "openGlobalKeybindingsFile": "打开键盘快捷方式文件", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index f3133e2e59b9..c40e2e7cf773 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "默认设置", "SearchSettingsWidget.AriaLabel": "搜索设置", "SearchSettingsWidget.Placeholder": "搜索设置", - "totalSettingsMessage": "总计 {0} 个设置", "noSettingsFound": "无结果", "oneSettingFound": "1 个设置匹配", "settingsFound": "{0} 个设置匹配", - "fileEditorWithInputAriaLabel": "{0}。文本文件编辑器。", - "fileEditorAriaLabel": "文本文件编辑器。", + "totalSettingsMessage": "总计 {0} 个设置", + "defaultSettings": "默认设置", + "defaultFolderSettings": "默认文件夹设置", "defaultEditorReadonly": "在右侧编辑器中编辑以覆盖默认值。", "preferencesAriaLabel": "默认首选项。只读文本编辑器。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 94247b7df633..8bfc213abeaf 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "将设置放入此处以覆盖\"默认设置\"。", "emptyWorkspaceSettingsHeader": "将设置放入此处以覆盖\"用户设置\"。", "emptyFolderSettingsHeader": "将文件夹设置放入此处以覆盖\"工作区设置\"。", - "defaultFolderSettingsTitle": "默认文件夹设置", - "defaultSettingsTitle": "默认设置", "editTtile": "编辑", "replaceDefaultValue": "在设置中替换", "copyDefaultValue": "复制到设置", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 51978e63faad..5c28c560886b 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "试试模糊搜索!", + "defaultSettingsFuzzyPrompt": "试试自然语言搜索!", "defaultSettings": "将您的设置放入右侧编辑器以覆盖。", "noSettingsFound": "未找到设置。", - "folderSettingsDetails": "文件夹设置", - "enableFuzzySearch": "启用实验性的模糊搜索" + "settingsSwitcherBarAriaLabel": "设置转换器", + "userSettings": "用户设置", + "workspaceSettings": "工作区设置", + "folderSettings": "文件夹设置", + "enableFuzzySearch": "启用自然语言搜索" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..87559f85c853 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "默认首选项编辑器", + "keybindingsEditor": "键绑定编辑器", + "preferences": "首选项" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index a742f18f4d55..eb08e1a30308 100644 --- a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "源代码管理提供程序", "hideRepository": "隐藏", - "commitMessage": "消息(按 {0} 提交)", "installAdditionalSCMProviders": "安装其他源代码管理提供程序...", "no open repo": "没有活动的源代码管理提供程序。", "source control": "源代码管理", diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 71b40c10a1b4..463428de5f56 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "输入", - "useIgnoreFilesDescription": "使用忽略文件", - "useExcludeSettingsDescription": "使用排除设置" + "useExcludesAndIgnoreFilesDescription": "使用“排除设置”与“忽略文件”" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 342e7b239c15..971f3dddcce6 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "匹配文件路径所依据的 glob 模式。设置为 true 或 false 可启用或禁用该模式。", "exclude.when": "对匹配文件的同级文件的其他检查。使用 $(basename) 作为匹配文件名的变量。", "useRipgrep": "控制是否在文本和文件搜索中使用 ripgrep", - "useIgnoreFilesByDefault": "控制在新工作区中搜索文本时是否默认使用 .gitignore 和 .ignore 文件。", "useIgnoreFiles": "控制搜索文件时是否使用 .gitignore 和 .ignore 文件。", "search.quickOpen.includeSymbols": "配置为在 Quick Open 文件结果中包括全局符号搜索的结果。", "search.followSymlinks": "控制是否在搜索中跟踪符号链接。" diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 02641d5492f8..ebf392aa07de 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "显示上一个搜索排除模式", "nextSearchTerm": "显示下一个搜索词", "previousSearchTerm": "显示上一个搜索词", - "focusNextInputBox": "聚焦下一个输入框", - "focusPreviousInputBox": "聚焦上一个输入框", "showSearchViewlet": "显示搜索", "findInFiles": "在文件中查找", "findInFilesWithSelectedText": "在文件中查找所选文本", "replaceInFiles": "在文件中替换", "replaceInFilesWithSelectedText": "在文件中替换所选文本", - "findInWorkspace": "在工作区中查找...", - "findInFolder": "在文件夹中查找...", "RefreshAction.label": "刷新", - "ClearSearchResultsAction.label": "清除搜索结果", + "CollapseDeepestExpandedLevelAction.label": "全部折叠", + "ClearSearchResultsAction.label": "清除", "FocusNextSearchResult.label": "聚焦下一搜索结果", "FocusPreviousSearchResult.label": "聚焦上一搜索结果", "RemoveAction.label": "消除", diff --git a/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..971f3dddcce6 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "转到工作区中的符号...", + "name": "搜索", + "search": "搜索", + "view": "查看", + "openAnythingHandlerDescription": "转到文件", + "openSymbolDescriptionNormal": "转到工作区中的符号", + "searchOutputChannelTitle": "搜索", + "searchConfigurationTitle": "搜索", + "exclude": "配置 glob 模式以在搜索中排除文件和文件夹。从 files.exclude 设置中继承所有 glob 模式。", + "exclude.boolean": "匹配文件路径所依据的 glob 模式。设置为 true 或 false 可启用或禁用该模式。", + "exclude.when": "对匹配文件的同级文件的其他检查。使用 $(basename) 作为匹配文件名的变量。", + "useRipgrep": "控制是否在文本和文件搜索中使用 ripgrep", + "useIgnoreFiles": "控制搜索文件时是否使用 .gitignore 和 .ignore 文件。", + "search.quickOpen.includeSymbols": "配置为在 Quick Open 文件结果中包括全局符号搜索的结果。", + "search.followSymlinks": "控制是否在搜索中跟踪符号链接。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/chs/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..1821ff81617f --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "在文件夹中查找...", + "findInWorkspace": "在工作区中查找..." +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 9e55d0c22e61..f93e5155df3c 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "任务", "ConfigureTaskRunnerAction.label": "配置任务", - "ConfigureBuildTaskAction.label": "配置生成任务", "CloseMessageAction.label": "关闭", - "ShowTerminalAction.label": "查看终端", "problems": "问题", + "building": "正在生成...", "manyMarkers": "99+", "runningTasks": "显示运行中的任务", "tasks": "任务", @@ -31,7 +30,7 @@ "TaskSystem.activeSame.noBackground": "任务 \"{0}\" 已处于活动状态。若要终止任务,请选择“任务”菜单中的“终止任务...”。", "TaskSystem.active": "当前已有任务正在运行。请先终止它,然后再执行另一项任务。", "TaskSystem.restartFailed": "未能终止并重启任务 {0}", - "TaskService.noConfiguration": "错误: {0} 任务检测没有提供拥有下列配置的任务:\n{1}\n将忽略此任务。", + "TaskService.noConfiguration": "错误: {0} 任务检测没有提供拥有下列配置的任务:\n{1}\n将忽略此任务。\n", "TaskSystem.configurationErrors": "错误: 提供的任务配置具有验证错误,无法使用。请首先改正错误。", "taskService.ignoreingFolder": "将忽略工作区文件夹 {0} 的任务配置。多文件夹工作区任务支持要求所有文件夹使用任务版本 2.0.0\n", "TaskSystem.invalidTaskJson": "错误: tasks.json 文件的内容具有语法错误。请先更正错误然后再执行任务。\n", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "没有找到要运行的任务。配置任务...", "TaskService.fetchingBuildTasks": "正在获取生成任务...", "TaskService.pickBuildTask": "选择要运行的生成任务", - "TaskService.noBuildTask": "没有找到要运行的生成任务。配置任务...", + "TaskService.noBuildTask": "没有找到要运行的生成任务。配置生成任务...", "TaskService.fetchingTestTasks": "正在获取测试任务...", "TaskService.pickTestTask": "选择要运行的测试任务", "TaskService.noTestTaskTerminal": "没有找到要运行的测试任务。配置任务...", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index c557a30ebe46..7f5fd4d5b23b 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "在执行任务时发生未知错误。请参见任务输出日志了解详细信息。", "dependencyFailed": "无法解析在工作区文件夹“{1}”中的依赖任务“{0}”", "TerminalTaskSystem.terminalName": "任务 - {0}", + "closeTerminal": "按任意键关闭终端。", "reuseTerminal": "终端将被任务重用,按任意键关闭。", "TerminalTaskSystem": "无法对 UNC 驱动器执行 shell 命令。", "unkownProblemMatcher": "无法解析问题匹配程序 {0}。此匹配程序将被忽略" diff --git a/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 07d51f5b85ca..17ed7e2c519d 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,8 @@ "ConfigurationParser.noTypeDefinition": "错误: 没有注册任务类型“{0}”。你是不是忘记安装含有相应任务提供器的扩展?", "ConfigurationParser.missingRequiredProperty": "错误: 任务配置“{0}”缺失必要属性“{1}”。将忽略该任务。", "ConfigurationParser.notCustom": "错误: 任务未声明为自定义任务。将忽略配置。\n{0}\n", - "ConfigurationParser.noTaskName": "错误: 任务必须提供 taskName 属性。将忽略该任务。\n{0}\n", - "taskConfiguration.shellArgs": "警告: 任务“{0}”是 shell 命令,该命令的名称或其中一个参数具有非转义空格。若要确保命令行引用正确,请将参数合并到该命令。", + "ConfigurationParser.noTaskName": "错误: 任务必须提供 label 属性。将忽略该任务。\n{0}\n", + "taskConfiguration.shellArgs": "警告: 任务“{0}”是 shell 命令,而且其中一个参数可能含有未转义的空格。若要确保命令行引用正确,请将参数合并到该命令。", "taskConfiguration.noCommandOrDependsOn": "错误:任务“{0}”既不指定命令,也不指定 dependsOn 属性。将忽略该任务。其定义为:\n{1}", "taskConfiguration.noCommand": "错误: 任务“{0}”未定义命令。将忽略该任务。其定义为:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "任务版本 2.0.0 不支持全局操作系统特定任务。请将他们转换为含有操作系统特定命令的任务。受影响的任务有:\n{0}" diff --git a/i18n/chs/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index b7523fc74cdd..6348749fb549 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0},终端选取器", "termCreateEntryAriaLabel": "{0},新建终端", - "'workbench.action.terminal.newplus": "$(plus) 新建集成终端", + "workbench.action.terminal.newplus": "$(plus) 新建集成终端", "noTerminalsMatching": "没有匹配的终端", "noTerminalsFound": "没有打开终端" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 892b51d94731..75d151b4bb59 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,7 @@ "terminal.integrated.rightClickCopyPaste": "设置后,在终端内右键单击时,这将阻止显示上下文菜单,相反,它将在有选项时进行复制,并且在没有选项时进行粘贴。", "terminal.integrated.fontFamily": "控制终端的字体系列,这在编辑器中是默认的。fontFamily 的值。", "terminal.integrated.fontSize": "控制终端的字号(以像素为单位)。", - "terminal.integrated.lineHeight": "控制终端的行高,此数字乘以终端字号得到实际行高(以像素表示)。", + "terminal.integrated.lineHeight": "控制终端的行高,此数字乘上终端字号得到实际行高(以像素为单位)。", "terminal.integrated.enableBold": "是否在终端内启用粗体文本,注意这需要终端命令行的支持。", "terminal.integrated.cursorBlinking": "控制终端光标是否闪烁。", "terminal.integrated.cursorStyle": "控制终端游标的样式。", diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json index 6b431f37d7fa..25d612371f72 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json @@ -7,7 +7,7 @@ "terminal.integrated.chooseWindowsShellInfo": "可通过选择“自定义”按钮来更改默认的终端 shell。", "customize": "自定义", "cancel": "取消", - "never again": "好,永不再显示", + "never again": "我已了解,不再提示", "terminal.integrated.chooseWindowsShell": "选择首选的终端 shell,你可稍后在设置中进行更改", "terminalService.terminalCloseConfirmationSingular": "存在一个活动的终端会话,是否要终止此会话?", "terminalService.terminalCloseConfirmationPlural": "存在 {0} 个活动的终端会话,是否要终止这些会话?" diff --git a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 7a4782c77625..6a87d4658cd4 100644 --- a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,15 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "颜色主题", + "themes.category.light": "浅色主题", + "themes.category.dark": "深色主题", + "themes.category.hc": "高对比度主题", "installColorThemes": "安装其他颜色主题...", "themes.selectTheme": "选择颜色主题(按上下箭头键预览)", "selectIconTheme.label": "文件图标主题", - "installIconThemes": "安装其他文件图标主题...", "noIconThemeLabel": "无", "noIconThemeDesc": "禁用文件图标", - "problemChangingIconTheme": "设置图标主题时出现问题: {0}", + "installIconThemes": "安装其他文件图标主题...", "themes.selectIconTheme": "选择文件图标主题", "generateColorTheme.label": "使用当前设置生成颜色主题", "preferences": "首选项", diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 634ceb97cb36..dde9f25287de 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -14,7 +14,7 @@ "welcomePage.moreRecent": "更多...", "welcomePage.noRecentFolders": "无最近使用文件夹", "welcomePage.help": "帮助", - "welcomePage.keybindingsCheatsheet": "可打印的键盘速查表", + "welcomePage.keybindingsCheatsheet": "快捷键速查表(可打印)", "welcomePage.introductoryVideos": "入门视频", "welcomePage.tipsAndTricks": "提示与技巧", "welcomePage.productDocumentation": "产品文档", diff --git a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 2eb80022de44..efa72e262b02 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "特定于窗口的配置,可在“用户”或“工作区”设置中配置。", "scope.resource.description": "特定于资源的配置,可在“用户”、“工作区”或“文件夹”设置中配置。", "scope.description": "配置适用的范围。可用范围有“窗口”和“资源”。", + "vscode.extension.contributes.defaultConfiguration": "按语言提供默认编辑器配置设置。", "vscode.extension.contributes.configuration": "用于配置字符串。", "invalid.title": "configuration.title 必须是字符串", - "vscode.extension.contributes.defaultConfiguration": "按语言提供默认编辑器配置设置。", "invalid.properties": "configuration.properties 必须是对象", "invalid.allOf": "\"configuration.allOf\" 已被弃用且不应被使用。你可以将多个配置单元作为数组传递给 \"configuration\" 参与点。", "workspaceConfig.folders.description": "将载入到工作区的文件夹列表。", diff --git a/i18n/chs/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/chs/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..0581515bc92d --- /dev/null +++ b/i18n/chs/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "遥测", + "telemetry.enableCrashReporting": "启用要发送给 Microsoft 的故障报表。\n此选项需重启才可生效。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..4ec26228924e --- /dev/null +++ b/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "message": "$(zap) 正在分析扩展主机..." +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index c6b9abd9ce6f..09cdc54ab6e9 100644 --- a/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -9,5 +9,6 @@ "extensionHostProcess.crash": "扩展宿主意外终止。", "extensionHostProcess.unresponsiveCrash": "扩展宿主因没有响应而被终止。", "overwritingExtension": "使用扩展程序 {1} 覆盖扩展程序 {0}。", - "extensionUnderDevelopment": "正在 {0} 处加载开发扩展程序" + "extensionUnderDevelopment": "正在 {0} 处加载开发扩展程序", + "extensionCache.invalid": "扩展在磁盘上已被修改。请重新加载窗口。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/chs/src/vs/workbench/services/files/node/fileService.i18n.json index dfb188fa1798..b385a7a0f157 100644 --- a/i18n/chs/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "文件是目录", "fileNotModifiedError": "自以下时间未修改的文件:", "fileTooLargeError": "文件太大,无法打开", - "fileBinaryError": "文件似乎是二进制文件,无法作为文档打开", "fileNotFoundError": "找不到文件({0})", + "fileBinaryError": "文件似乎是二进制文件,无法作为文档打开", "fileExists": "已存在要创建的文件 ({0})", "fileMoveConflict": "无法移动/复制。文件已存在于目标位置。", "unableToMoveCopyError": "无法移动/复制。文件将替换其所在的文件夹。", diff --git a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 57fb7d30808b..af87ffb3672c 100644 --- a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -22,5 +22,5 @@ "keybindings.json.when": "键处于活动状态时的条件。", "keybindings.json.args": "要传递给命令以执行的参数。", "keyboardConfigurationTitle": "键盘", - "dispatch": "控制按键的调度逻辑以使用“keydown.code”(推荐) 或“keydown.keyCode”。" + "dispatch": "控制按键的分派逻辑以使用 \"code\" (推荐) 或 \"keyCode\"。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/chs/src/vs/workbench/services/textfile/common/textFileService.i18n.json index af00fba3ec36..804c0e84c9fb 100644 --- a/i18n/chs/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "files.backup.failSave": "无法备份文件(错误: {0}),尝试保存文件以退出。" + "files.backup.failSave": "无法将更改的文件写入备份位置 (错误: {0})。请先保存你的文件,然后退出。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index ebff4844aaf2..af35cdf722be 100644 --- a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "已向用户设置添加了新的主题设置。{0} 中可备份。", "error.cannotloadtheme": "无法加载 {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "指定工作台中使用的颜色主题。", "colorThemeError": "主题未知或未安装。", "iconTheme": "指定在工作台中使用的图标主题,或指定 \"null\" 以不显示任何文件图标。", diff --git a/i18n/cht/extensions/git/out/autofetch.i18n.json b/i18n/cht/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..bd190303079b --- /dev/null +++ b/i18n/cht/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "是", + "no": "否" +} \ No newline at end of file diff --git a/i18n/cht/extensions/git/out/commands.i18n.json b/i18n/cht/extensions/git/out/commands.i18n.json index d7d2cf339695..24b380b69e3c 100644 --- a/i18n/cht/extensions/git/out/commands.i18n.json +++ b/i18n/cht/extensions/git/out/commands.i18n.json @@ -9,6 +9,7 @@ "create branch": "$(plus) 建立新的分支", "repourl": "儲存庫 URL", "parent": "父目錄", + "cancel tooltip": "取消複製", "cloning": "正在複製 Git 儲存庫...", "openrepo": "開啟儲存庫", "proposeopen": "要開啟複製的儲存庫嗎?", @@ -49,6 +50,8 @@ "select branch to delete": "選擇分支進行刪除", "confirm force delete branch": "分支 '{0}' 尚未完整合併. 確定刪除嗎?", "delete branch": "刪除分支", + "invalid branch name": "分支名稱無效", + "branch already exists": "分支名稱 '{0}' 已經存在", "select a branch to merge from": "選擇要合併的分支。", "merge conflicts": "合併衝突。提交前請解決衝突。", "tag name": "標籤名稱", @@ -71,7 +74,6 @@ "no stashes": "沒有要隱藏可供還原。", "pick stash to pop": "請挑選要快顯的隱藏", "clean repo": "請先清除您的本地儲存庫工作區再簽出。", - "cant push": "無法將參考推送到遠端。請先執行 [提取] 以整合您的變更。", "git error details": "Git: {0}", "git error": "Git 錯誤", "open git log": "開啟 Git 記錄" diff --git a/i18n/cht/extensions/git/out/main.i18n.json b/i18n/cht/extensions/git/out/main.i18n.json index 1a5f7ab3b83f..1705b21123ca 100644 --- a/i18n/cht/extensions/git/out/main.i18n.json +++ b/i18n/cht/extensions/git/out/main.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "using git": "正在使用來自 {1} 的 git {0}", - "updateGit": "更新 Git", "neverShowAgain": "不要再顯示", + "updateGit": "更新 Git", "git20": "您似乎已安裝 Git {0}。Code 搭配 Git >= 2 的執行效果最佳" } \ No newline at end of file diff --git a/i18n/cht/extensions/git/out/repository.i18n.json b/i18n/cht/extensions/git/out/repository.i18n.json index c07485bdb634..11f473d6e80d 100644 --- a/i18n/cht/extensions/git/out/repository.i18n.json +++ b/i18n/cht/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "已受到我們刪除", "both added": "皆已新增", "both modified": "皆已修改", + "commitMessage": "訊息 (按 {0} 以認可)", "commit": "認可", "merge changes": "合併變更", "staged changes": "已分段的變更", diff --git a/i18n/cht/extensions/git/package.i18n.json b/i18n/cht/extensions/git/package.i18n.json index 1b15b9673ea1..c21ef0056863 100644 --- a/i18n/cht/extensions/git/package.i18n.json +++ b/i18n/cht/extensions/git/package.i18n.json @@ -33,6 +33,7 @@ "command.checkout": "簽出至...", "command.branch": "建立分支...", "command.deleteBranch": "刪除分支...", + "command.renameBranch": "重新命名分支...", "command.merge": "合併分支...", "command.createTag": "建立標籤", "command.pull": "提取", @@ -42,9 +43,11 @@ "command.pushTo": "推送至...", "command.pushWithTags": "使用標籤推送", "command.sync": "同步處理", + "command.syncRebase": "同步 (重定基底)", "command.publish": "發行分支", "command.showOutput": "顯示 Git 輸出", "command.ignore": "將檔案新增到 .gitignore", + "command.stashIncludeUntracked": "隱藏 (包含未被追蹤的檔案)", "command.stash": "隱藏", "command.stashPop": "快顯隱藏...", "command.stashPopLatest": "快顯上一次的隱藏", diff --git a/i18n/cht/extensions/markdown/out/commands.i18n.json b/i18n/cht/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..d65739530624 --- /dev/null +++ b/i18n/cht/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "預覽 [0]", + "onPreviewStyleLoadError": "無法載入 ‘markdown.style' 樣式:{0}" +} \ No newline at end of file diff --git a/i18n/cht/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/cht/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..66d002270185 --- /dev/null +++ b/i18n/cht/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "此文件中的部分內容已停用", + "preview.securityMessage.title": "Markdown 預覽中已停用可能不安全或不安全的內容。請將 Markdown 預覽的安全性設定變更為允許不安全內容,或啟用指令碼", + "preview.securityMessage.label": "內容已停用安全性警告" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/package.i18n.json b/i18n/cht/extensions/typescript/package.i18n.json index 5d211fb02002..c6af56454e98 100644 --- a/i18n/cht/extensions/typescript/package.i18n.json +++ b/i18n/cht/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "開啟 TS 伺服器記錄", "typescript.restartTsServer": "重新啟動TS伺服器", "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", + "typescript.reportStyleChecksAsWarnings": "使用警告顯示樣式檢查", "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", "typescript.npm": "指定用於自動類型取得的 NPM 可執行檔路徑。TypeScript 必須 >= 2.3.4.", diff --git a/i18n/cht/src/vs/base/common/errorMessage.i18n.json b/i18n/cht/src/vs/base/common/errorMessage.i18n.json index 0ff1888b74e0..53620e90dc9e 100644 --- a/i18n/cht/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/cht/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}。錯誤碼: {1}", - "error.permission.verbose": "使用權限遭拒 (HTTP {0})", - "error.permission": "使用權限遭拒", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "未知的連線錯誤 ({0})", - "error.connection.unknown": "發生未知的連接錯誤。可能是您已經沒有連線到網際網路,或是您連接的伺服器已離線。", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "發生未知的錯誤。如需詳細資訊,請參閱記錄檔。", "nodeExceptionMessage": "發生系統錯誤 ({0})", diff --git a/i18n/cht/src/vs/code/electron-main/main.i18n.json b/i18n/cht/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..0311ac8ba64b --- /dev/null +++ b/i18n/cht/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "另一個 {0} 執行個體正在執行,但沒有回應", + "secondInstanceNoResponseDetail": "請關閉其他所有執行個體,然後再試一次。", + "secondInstanceAdminDetail": "請關閉其他執行個體,然後再試一次。", + "close": "關閉(&&C)" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index 080129a4e8ae..4aad58bdfe62 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,10 @@ "miQuit": "結束 {0}", "miNewFile": "新增檔案(&&N)", "miOpen": "開啟(&&O)...", - "miOpenWorkspace": "開啟工作區(&&O)...", "miOpenFolder": "開啟資料夾(&&F)...", "miOpenFile": "開啟檔案(&&O)...", "miOpenRecent": "開啟最近的檔案(&&R)", - "miSaveWorkspaceAs": "將工作區另存為(&&S)...", - "miAddFolderToWorkspace": "將資料夾新增到工作區(&&A)", + "miSaveWorkspaceAs": "另存工作區為...", "miSave": "儲存(&&S)", "miSaveAs": "另存新檔(&&A)...", "miSaveAll": "全部儲存(&&L)", @@ -157,7 +155,6 @@ "mMergeAllWindows": "合併所有視窗", "miToggleDevTools": "切換開發人員工具(&&T)", "miAccessibilityOptions": "協助工具選項(&&O)", - "miReportIssues": "回報問題(&&I)", "miWelcome": "歡迎使用(&&W)", "miInteractivePlayground": "Interactive Playground(&&I)", "miDocumentation": "文件(&&D)", @@ -184,6 +181,6 @@ "miDownloadingUpdate": "正在下載更新...", "miInstallingUpdate": "正在安裝更新...", "miCheckForUpdates": "查看是否有更新", - "aboutDetail": "\n版本 {0}\n認可 {1}\n日期 {2}\nShell {3}\n轉譯器 {4}\n節點 {5}\n架構 {6}", - "okButton": "確定" + "okButton": "確定", + "copy": "複製(&&C)" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/cht/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..cf3f3771d6a2 --- /dev/null +++ b/i18n/cht/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "這些檔案已同時變更: {0}", + "summary.0": "未進行任何編輯", + "summary.nm": "在 {1} 個檔案中進行了 {0} 項文字編輯", + "summary.n0": "在一個檔案中進行了 {0} 項文字編輯" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index 042d523ea96b..dd7847676ef1 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,16 @@ "fontSize": "控制字型大小 (以像素為單位)。", "lineHeight": "控制行高。使用 0 會從 fontSize 計算 lineHeight。", "letterSpacing": "控制字元間距 (以像素為單位)", - "lineNumbers": "控制行號顯示。可能的值有 'on'、'off' 及 'relative'。'relative' 會從目前的資料指標位置顯示行數。", + "lineNumbers.off": "不顯示行號。", + "lineNumbers.on": "行號以絕對值顯示。", + "lineNumbers.relative": "行號以目前游標的相對值顯示。", + "lineNumbers.interval": "每 10 行顯示行號。", + "lineNumbers": "控制行號顯示方式。允許設定值包含 'on'、'off' 及 'relative'。", "rulers": "在特定的等寬字元數之後轉譯垂直尺規。有多個尺規就使用多個值。若陣列為空,則不繪製任何尺規。", "wordSeparators": "執行文字相關導覽或作業時將作為文字分隔符號的字元", "tabSize": "與 Tab 相等的空格數量。當 `editor.detectIndentation` 已開啟時,會根據檔案內容覆寫此設定。", "tabSize.errorMessage": "必須是 'number'。請注意,值 \"auto\" 已由 `editor.detectIndentation` 設定取代。", - "insertSpaces": "在按 Tab 時插入空格。當 `editor.detectIndentation` 已開啟時,會根據檔案內容覆寫此設定。", + "insertSpaces": "與 Tab 相等的空格數量。當 `editor.detectIndentation` 已開啟時,會根據檔案內容覆寫此設定。", "insertSpaces.errorMessage": "必須是 'boolean'。請注意,值 \"auto\" 已由 `editor.detect Indentation` 設定取代。", "detectIndentation": "開啟檔案時,會依據檔案內容來偵測 `editor.tabSize` 及 `editor.insertSpaces`。", "roundedSelection": "控制選取範圍是否有圓角", @@ -89,8 +93,8 @@ "links": "控制編輯器是否應偵測連結且讓它可點擊", "colorDecorators": "控制編輯器是否應轉譯內嵌色彩裝飾項目與色彩選擇器。", "codeActions": "啟用程式動作燈泡提示", + "selectionClipboard": "控制是否應支援 Linux 主要剪貼簿。", "sideBySide": "控制 Diff 編輯器要並排或內嵌顯示差異", "ignoreTrimWhitespace": "控制 Diff 編輯器是否將開頭或尾端空白字元的變更顯示為差異", - "renderIndicators": "控制 Diff 編輯器是否要為新增的/移除的變更顯示 +/- 標記", - "selectionClipboard": "控制是否應支援 Linux 主要剪貼簿。" + "renderIndicators": "控制 Diff 編輯器是否要為新增的/移除的變更顯示 +/- 標記" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/cht/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..1f0f5396a7c0 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "移至方括弧" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/cht/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..c91537d9f09e --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "將插入點左移", + "caret.moveRight": "將插入點右移" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/cht/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..0fdec24164c7 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "調換字母" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/cht/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..ed1d999b907e --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "剪下", + "actions.clipboard.copyLabel": "複製", + "actions.clipboard.pasteLabel": "貼上", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "隨語法醒目提示複製" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/cht/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..1179814825d3 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "切換行註解", + "comment.line.add": "加入行註解", + "comment.line.remove": "移除行註解", + "comment.block": "切換區塊註解" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/cht/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..90809e4802b9 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "顯示編輯器內容功能表" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/find/findController.i18n.json b/i18n/cht/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..cbbf89b710f3 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "尋找", + "findNextMatchAction": "尋找下一個", + "findPreviousMatchAction": "尋找上一個", + "nextSelectionMatchFindAction": "尋找下一個選取項目", + "previousSelectionMatchFindAction": "尋找上一個選取項目", + "startReplace": "取代", + "showNextFindTermAction": "顯示下一個尋找字詞", + "showPreviousFindTermAction": "顯示上一個尋找字詞" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..7b79c72e500d --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "尋找", + "placeholder.find": "尋找", + "label.previousMatchButton": "上一個符合項", + "label.nextMatchButton": "下一個相符項", + "label.toggleSelectionFind": "在選取範圍中尋找", + "label.closeButton": "關閉", + "label.replace": "取代", + "placeholder.replace": "取代", + "label.replaceButton": "取代", + "label.replaceAllButton": "全部取代", + "label.toggleReplaceButton": "切換取代模式", + "title.matchesCountLimit": "僅反白顯示前 {0} 筆結果,但所有尋找作業會在完整文字上執行。", + "label.matchesLocation": "{0} / {1}", + "label.noResults": "沒有結果" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..f2ff92bce070 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "尋找", + "placeholder.find": "尋找", + "label.previousMatchButton": "上一個符合項", + "label.nextMatchButton": "下一個相符項", + "label.closeButton": "關閉" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/cht/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..0a6abe069657 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "展開", + "unFoldRecursivelyAction.label": "以遞迴方式展開", + "foldAction.label": "摺疊", + "foldRecursivelyAction.label": "以遞迴方式摺疊", + "foldAllBlockComments.label": "摺疊全部區塊註解", + "foldAllAction.label": "全部摺疊", + "unfoldAllAction.label": "全部展開", + "foldLevelAction.label": "摺疊層級 {0}" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..84321c58d5f4 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "在行 {0} 編輯了 1 項格式", + "hintn1": "在行 {1} 編輯了 {0} 項格式", + "hint1n": "在行 {0} 與行 {1} 之間編輯了 1 項格式", + "hintnn": "在行 {1} 與行 {2} 之間編輯了 {0} 項格式", + "no.provider": "抱歉,尚無安裝適用於 '{0}' 檔案的格式器", + "formatDocument.label": "將文件格式化", + "formatSelection.label": "將選取項目格式化" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..26ea0a1761cf --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "找不到 '{0}' 的定義", + "generic.noResults": "找不到任何定義", + "meta.title": " - {0} 個定義", + "actions.goToDecl.label": "移至定義", + "actions.goToDeclToSide.label": "在一側開啟定義", + "actions.previewDecl.label": "預覽定義", + "goToImplementation.noResultWord": "找不到 '{0}' 的任何實作", + "goToImplementation.generic.noResults": "找不到任何實作", + "meta.implementations.title": " – {0} 個實作", + "actions.goToImplementation.label": "前往實作", + "actions.peekImplementation.label": "預覽實作", + "goToTypeDefinition.noResultWord": "找不到 '{0}' 的任何類型定義", + "goToTypeDefinition.generic.noResults": "找不到任何類型定義", + "meta.typeDefinitions.title": " – {0} 個定義", + "actions.goToTypeDefinition.label": "移至類型定義", + "actions.peekTypeDefinition.label": "預覽類型定義" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..24cf4f7503fe --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "按一下以顯示 {0} 項定義。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..9fbf329131ba --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "移至下一個錯誤或警告", + "markerAction.previous.label": "移至上一個錯誤或警告", + "editorMarkerNavigationError": "編輯器標記導覽小工具錯誤的色彩。", + "editorMarkerNavigationWarning": "編輯器標記導覽小工具警告的色彩。", + "editorMarkerNavigationInfo": "編輯器標記導覽小工具資訊的色彩", + "editorMarkerNavigationBackground": "編輯器標記導覽小工具的背景。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/cht/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..7895cc33c1f4 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "動態顯示" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/cht/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..08e865d8b154 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "正在載入..." +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/cht/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..48be4f650487 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "以上一個值取代", + "InPlaceReplaceAction.next.label": "以下一個值取代" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..174b6d1af3f5 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "將縮排轉換成空格", + "indentationToTabs": "將縮排轉換成定位點", + "configuredTabSize": "已設定的定位點大小", + "selectTabWidth": "選取目前檔案的定位點大小", + "indentUsingTabs": "使用 Tab 進行縮排", + "indentUsingSpaces": "使用空格鍵進行縮排", + "detectIndentation": "偵測內容中的縮排", + "editor.reindentlines": "重新將行縮排" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/cht/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..80873b659f28 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "將行向上複製", + "lines.copyDown": "將行向下複製", + "lines.moveUp": "上移一行", + "lines.moveDown": "下移一行", + "lines.sortAscending": "遞增排序行", + "lines.sortDescending": "遞減排序行", + "lines.trimTrailingWhitespace": "修剪尾端空白", + "lines.delete": "刪除行", + "lines.indent": "縮排行", + "lines.outdent": "凸排行", + "lines.insertBefore": "在上方插入行", + "lines.insertAfter": "在下方插入行", + "lines.deleteAllLeft": "左邊全部刪除", + "lines.deleteAllRight": "刪除所有右方項目", + "lines.joinLines": "連接線", + "editor.transpose": "轉置游標周圍的字元數", + "editor.transformToUppercase": "轉換到大寫", + "editor.transformToLowercase": "轉換到小寫" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/links/links.i18n.json b/i18n/cht/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..6a528bd35b64 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "按住 Cmd 並按一下滑鼠按鈕可連入連結", + "links.navigate": "按住 Ctrl 並按一下滑鼠按鈕可連入連結", + "links.command.mac": "按住 Cmd 並按一下滑鼠以執行命令", + "links.command": "按住 Ctrl 並按一下滑鼠以執行命令", + "links.navigate.al": "按住Alt並點擊以追蹤連結", + "links.command.al": "按住 Alt 並按一下滑鼠以執行命令", + "invalid.url": "抱歉,因為此連結的語式不正確,所以無法加以開啟: {0}", + "missing.url": "抱歉,因為此連結遺失目標,所以無法加以開啟。", + "label": "開啟連結" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/cht/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..381e4cfcb4cf --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "在上方加入游標", + "mutlicursor.insertBelow": "在下方加入游標", + "mutlicursor.insertAtEndOfEachLineSelected": "在行尾新增游標", + "addSelectionToNextFindMatch": "將選取項目加入下一個找到的相符項", + "addSelectionToPreviousFindMatch": "將選取項目加入前一個找到的相符項中", + "moveSelectionToNextFindMatch": "將最後一個選擇項目移至下一個找到的相符項", + "moveSelectionToPreviousFindMatch": "將最後一個選擇項目移至前一個找到的相符項", + "selectAllOccurrencesOfFindMatch": "選取所有找到的相符項目", + "changeAll.label": "變更所有發生次數" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/cht/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..be94bfc37708 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "觸發參數提示" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..d56310c99161 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0},提示" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..faa980e9cbdf --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "顯示修正 ({0})", + "quickFix": "顯示修正", + "quickfix.trigger.label": "Quick Fix" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..8b7662c4c930 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "關閉" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..6818cd5b1599 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " - {0} 個參考", + "references.action.label": "尋找所有參考" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..49f8938476de --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "正在載入..." +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..e42c2aa09669 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "個符號位於 {0} 中的第 {1} 行第 {2} 欄", + "aria.fileReferences.1": "1 個符號位於 {0}, 完整路徑 {1}", + "aria.fileReferences.N": "{0} 個符號位於 {1}, 完整路徑 {2}", + "aria.result.0": "找不到結果", + "aria.result.1": "在 {0} 中找到 1 個符號", + "aria.result.n1": "在 {1} 中找到 {0} 個符號", + "aria.result.nm": "在 {1} 個檔案中找到 {0} 個符號" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..3dca8b60ce1d --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "無法解析檔案。", + "referencesCount": "{0} 個參考", + "referenceCount": "{0} 個參考", + "missingPreviewMessage": "無法預覽", + "treeAriaLabel": "參考", + "noResults": "沒有結果", + "peekView.alternateTitle": "參考", + "peekViewTitleBackground": "預覽檢視標題區域的背景色彩。", + "peekViewTitleForeground": "預覽檢視標題的色彩。", + "peekViewTitleInfoForeground": "預覽檢視標題資訊的色彩。", + "peekViewBorder": "預覽檢視之框線與箭頭的色彩。", + "peekViewResultsBackground": "預覽檢視中結果清單的背景色彩。", + "peekViewResultsMatchForeground": "預覽檢視結果列表中行節點的前景色彩", + "peekViewResultsFileForeground": "預覽檢視結果列表中檔案節點的前景色彩", + "peekViewResultsSelectionBackground": "在預覽檢視之結果清單中選取項目時的背景色彩。", + "peekViewResultsSelectionForeground": "在預覽檢視之結果清單中選取項目時的前景色彩。", + "peekViewEditorBackground": "預覽檢視編輯器的背景色彩。", + "peekViewEditorGutterBackground": "預覽檢視編輯器邊框(含行號或字形圖示)的背景色彩。", + "peekViewResultsMatchHighlight": "在預覽檢視編輯器中比對時的反白顯示色彩。", + "peekViewEditorMatchHighlight": "預覽檢視編輯器中比對時的反白顯示色彩。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/cht/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..e1b559cf2ece --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "沒有結果。", + "aria": "已成功將 '{0}' 重新命名為 '{1}'。摘要: {2}", + "rename.failed": "抱歉,無法執行重新命名。", + "rename.label": "重新命名符號" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/cht/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..75bf62bd612e --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "為輸入重新命名。請鍵入新名稱,然後按 Enter 以認可。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/cht/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..a72697babbad --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "展開選取", + "smartSelect.shrink": "縮小選取" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/cht/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..87e19ea32a12 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "接受 '{0}' 時接受了插入下列文字: {1}", + "suggest.trigger.label": "觸發建議" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..beb2f4690fc3 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "建議小工具的背景色彩。", + "editorSuggestWidgetBorder": "建議小工具的邊界色彩。", + "editorSuggestWidgetForeground": "建議小工具的前景色彩。", + "editorSuggestWidgetSelectedBackground": "建議小工具中所選項目的背景色彩。", + "editorSuggestWidgetHighlightForeground": "建議小工具中相符醒目提示的色彩。", + "readMore": "進一步了解...{0}", + "suggestionWithDetailsAriaLabel": "{0},建議,有詳細資料", + "suggestionAriaLabel": "{0},建議", + "readLess": "簡易說明...{0}", + "suggestWidget.loading": "正在載入...", + "suggestWidget.noSuggestions": "無建議。", + "suggestionAriaAccepted": "{0},接受", + "ariaCurrentSuggestionWithDetails": "{0},建議,有詳細資料", + "ariaCurrentSuggestion": "{0},建議" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/cht/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..d60c7e9a6f38 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "切換 TAB 鍵移動焦點" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..97c113d82f04 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "讀取存取期間 (例如讀取變數時) 符號的背景色彩。", + "wordHighlightStrong": "寫入存取期間 (例如寫入變數時) 符號的背景色彩。", + "overviewRulerWordHighlightForeground": "符號醒目提示的概觀尺規標記色彩。", + "overviewRulerWordHighlightStrongForeground": "寫入權限符號醒目提示的概觀尺規標記色彩。", + "wordHighlight.next.label": "移至下一個反白符號", + "wordHighlight.previous.label": "移至上一個反白符號" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json index 3b2c99dd58bc..09f8c0cfeafb 100644 --- a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json @@ -12,6 +12,8 @@ "newWindow": "強制執行 Code 的新執行個體。", "performance": "在已啟用 'Developer: Startup Performance' 命令的情況下開始。", "prof-startup": "啟動時執行 CPU 分析工具", + "inspect-extensions": "允許對擴充功能進行除錯和分析。檢查開發工具的連接 uri。", + "inspect-brk-extensions": "允許對擴展主機在啟動後暫停擴充功能進行除錯和分析。檢查開發工具中的連接 uri。", "reuseWindow": "強制在最近使用的視窗中開啟檔案或資料夾。", "userDataDir": "指定保留使用者資料的目錄,這在以根目錄身分執行時有用。", "verbose": "列印詳細資訊輸出 (表示 --wait)。", @@ -24,6 +26,7 @@ "experimentalApis": "為延伸模組啟用建議的 API 功能。", "disableExtensions": "停用所有已安裝的擴充功能。", "disableGPU": "停用 GPU 硬體加速。", + "status": "列印進程使用方式和診斷資訊。", "version": "列印版本。", "help": "列印使用方式。", "usage": "使用方式", diff --git a/i18n/cht/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/cht/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index e6b158de084d..385d3c73e6b0 100644 --- a/i18n/cht/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/cht/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "找不到擴充功能", - "noCompatible": "找不到與此 Code 版本相容的 {0} 版本。" + "notCompatibleDownload": "無法安裝,因為找不到相容於 VS Code 目前版本 '{0}' 的擴充功能。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 91ed221b0183..bdd6cf533123 100644 --- a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "擴充功能無效: package.json 不是 JSON 檔案。", "restartCodeLocal": "請先重新啟動 Code,再重新安裝 {0}。", - "restartCodeGallery": "重新安裝之前,請先重新啟動 Code。", + "installingOutdatedExtension": "已安裝此擴充功能的較新版本。是否要使用舊版本覆蓋此項?", + "override": "覆寫", + "cancel": "取消", + "notFoundCompatible": "無法安裝,因為找不到相容於 VS Code 目前版本 '{1}' 的擴充功能 '{0}'。", + "quitCode": "無法安裝因為有過時的擴充功能仍在運行。請在重新安裝前退出並啟動 VS Code。", + "exitCode": "無法安裝因為有過時的擴充功能仍在運行。請在重新安裝前退出並啟動 VS Code。", + "notFoundCompatibleDependency": "無法安裝,因為找不到相容於 VS Code 目前版本 '{1}' 的相依擴充功能 '{0}'。", "uninstallDependeciesConfirmation": "只要將 '{0}' 解除安裝,或要包含其相依性?", "uninstallOnly": "只有", "uninstallAll": "全部", - "cancel": "取消", "uninstallConfirmation": "確定要將 '{0}' 解除安裝嗎?", "ok": "確定", "singleDependentError": "無法將延伸模組 '{0}' 解除安裝。其為延伸模組 '{1}' 的相依對象。", diff --git a/i18n/cht/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/cht/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index 50abb35f2818..36f7fd1af506 100644 --- a/i18n/cht/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -17,6 +17,7 @@ "vscode.extension.activationEvents.onLanguage": "當指定語言檔案開啟時激發該事件", "vscode.extension.activationEvents.onCommand": "當指定的命令被調用時激發該事件", "vscode.extension.activationEvents.onDebug": "當使用者正要開始偵錯或是設定偵錯組態時激發該事件", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "需要建立 \"launch.json\" 來觸發啟動事件 (並且需要呼叫所有 provideDebugConfigurations 方法)。", "vscode.extension.activationEvents.workspaceContains": "當開啟指定的文件夾包含glob模式匹配的文件時激發該事件", "vscode.extension.activationEvents.onView": "當指定的檢視被擴展時激發該事件", "vscode.extension.activationEvents.star": "當VS Code啟動時激發該事件,為了確保最好的使用者體驗,當您的擴充功能沒有其他組合作業時,請激活此事件.", diff --git a/i18n/cht/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/cht/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..fd863ceb4b02 --- /dev/null +++ b/i18n/cht/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "切換標籤可見度", + "view": "檢視" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index ee6864d5c656..6f4e3589f00b 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "開啟上一個編輯器", "nextEditorInGroup": "開啟群組中下一個編輯器", "openPreviousEditorInGroup": "開啟群組中上一個編輯器", + "lastEditorInGroup": "開啟群組中最後一個編輯器", "navigateNext": "向前", "navigatePrevious": "向後", "navigateLast": "移至最後", diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index 96aebe90db2c..f93bcde40361 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "以 tab 或群組為單位移動使用中的編輯器", "editorCommand.activeEditorMove.arg.name": "使用中編輯器的移動引數", - "editorCommand.activeEditorMove.arg.description": "引數屬性:\n\t\t\t\t\t\t* 'to': 提供移動目標位置的字串值。\n\t\t\t\t\t\t* 'by': 提供移動單位的字串值。\n\t\t\t\t\t\t* 'value': 提供移動單位的字串值。可依索引標籤或群組作為單位。\n\t\t\t\t\t", + "editorCommand.activeEditorMove.arg.description": "引數屬性:\n\t* 'to': 提供移動目標位置的字串值。\n\t* 'by': 提供移動單位的字串值。\n\t* 'value': 提供移動單位的字串值。可依索引標籤或群組作為單位。", "commandDeprecated": "已移除命令 **{0}**。您可以改用 **{1}**", "openKeybindings": "設定鍵盤快速鍵" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index e8b2ace0bcfe..b57df7a15742 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "是", "screenReaderDetectedExplanation.answerNo": "否", "screenReaderDetectedExplanation.body1": "已將 VS Code 最佳化,現在可搭配螢幕助讀程式使用。", - "screenReaderDetectedExplanation.body2": "某些編輯器功能會具有不同的行為: 例如文字換行、折疊、自動括上括號等。" + "screenReaderDetectedExplanation.body2": "某些編輯器功能會具有不同的行為: 例如文字換行、折疊等。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/quickopen.i18n.json b/i18n/cht/src/vs/workbench/browser/quickopen.i18n.json index cab0a05a7b4a..b0dd46b8c621 100644 --- a/i18n/cht/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "沒有相符的結果", - "noResultsFound2": "找不到結果", - "entryAriaLabel": "{0},命令" + "noResultsFound2": "找不到結果" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json index c44f42dbd5df..b7ccbfd63389 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "開啟最近使用的檔案...", "quickOpenRecent": "快速開啟最近使用的檔案...", "closeMessages": "關閉通知訊息", - "reportIssues": "回報問題", + "reportIssueInEnglish": "回報問題", "reportPerformanceIssue": "回報效能問題", "keybindingsReference": "鍵盤快速鍵參考", "openDocumentationUrl": "文件", @@ -47,5 +47,14 @@ "showNextWindowTab": "顯示下一個視窗索引標籤", "moveWindowTabToNewWindow": "將視窗索引標籤移至新的視窗", "mergeAllWindowTabs": "合併所有視窗", - "toggleWindowTabsBar": "切換視窗索引標籤列" + "toggleWindowTabsBar": "切換視窗索引標籤列", + "configureLocale": "設定語言", + "displayLanguage": "定義 VSCode 的顯示語言。", + "doc": "如需支援的語言清單,請參閱 {0}。", + "restart": "改變設定值後需要重新啟動 VSCode.", + "fail.createSettings": "無法建立 '{0}' ({1})。", + "debug": "偵錯", + "info": "資訊", + "warn": "警告", + "err": "錯誤" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index ecd8e3a4ce4c..26b36bafb2e6 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "檢視", "help": "說明", "file": "檔案", - "workspaces": "工作區", "developer": "開發人員", + "workspaces": "工作區", "showEditorTabs": "控制已開啟的編輯器是否應顯示在索引標籤中。", "workbench.editor.labelFormat.default": "顯示檔案名稱。當啟用索引標籤,且同一個群組中有兩個檔案同名時,就會新增各個檔案路徑具有識別度的的區段。當停用索引標籤時,若編輯器在使用中,就會顯示與工作區資料夾相關的路徑。", "workbench.editor.labelFormat.short": "顯示檔案的名稱,並在名稱後接著該檔案的目錄名稱。", @@ -26,18 +26,16 @@ "closeOnFocusLost": "控制是否在 Quick Open 失去焦點時自動關閉。", "openDefaultSettings": "控制開啟設定時是否也會開啟顯示所有預設設定的編輯器。", "sideBarLocation": "控制項資訊看板的位置。可顯示於 Workbench 的左方或右方。", - "panelLocation": "控制面板的位置。其可顯示於工作台底部或工作台右方。", "statusBarVisibility": "控制 Workbench 底端狀態列的可視性。", "activityBarVisibility": "控制活動列在 workbench 中的可見度。", "closeOnFileDelete": "控制顯示檔案的編輯器是否應在其他處理序刪除或重新命名該檔案時自動關閉。若停用此選項,當發生前述狀況時,編輯器會保持開啟,並呈現已變更的狀態。請注意,從應用程式內刪除一律會關閉編輯器,但已變更的檔案在資料未儲存前一律不會關閉。", - "experimentalFuzzySearchEndpoint": "表示要用於實驗性設定搜尋的端點。", - "experimentalFuzzySearchKey": "表示要用於實驗性設定搜尋的索引碼。", "fontAliasing": "在 Workbench 中控制字型鋸齒化的方法。- 預設: 子像素字型平滑處理。在大部分非 Retina 顯示器上會顯示出最銳利的文字- 已消除鋸齒: 相對於子像素,根據像素層級平滑字型。可讓字型整體顯得較細- 無: 停用字型平滑處理。文字會以鋸齒狀的銳邊顯示 ", "workbench.fontAliasing.default": "子像素字型平滑處理。在大部分非 Retina 顯示器上會顯示出最銳利的文字。", "workbench.fontAliasing.antialiased": "相對於子像素,根據像素層級平滑字型。可以讓字型整體顯得較細。", "workbench.fontAliasing.none": "禁用字體平滑.文字將會顯示鋸齒狀與鋒利的邊緣.", "swipeToNavigate": "利用三指水平撥動在開啟的檔案間瀏覽。", "workbenchConfigurationTitle": "工作台", + "windowConfigurationTitle": "視窗", "window.openFilesInNewWindow.on": "檔案會在新視窗中開啟", "window.openFilesInNewWindow.off": "檔案會在開啟了檔案資料夾的視窗,或在上一個使用中的視窗中開啟", "window.openFilesInNewWindow.default": "除非從擴充座或 Finder 中開啟,否則檔案會在開啟了檔案資料夾的視窗,或在上一個使用中的視窗中開啟 (僅限 macOS)", @@ -69,11 +67,11 @@ "autoDetectHighContrast": "若啟用,如果 Windows 使用高對比佈景主題,就會自動變更為高對比佈景主題,切換掉 Windows 高對比佈景主題時則變更為深色佈景主題。", "titleBarStyle": "調整視窗標題列的外觀。變更需要完整重新啟動才會套用。", "window.nativeTabs": "啟用 macOS Sierra 視窗索引標籤。請注意需要完全重新啟動才能套用變更,並且完成設定後原始索引標籤將會停用自訂標題列樣式。", - "windowConfigurationTitle": "視窗", "zenModeConfigurationTitle": "Zen Mode", "zenMode.fullScreen": "控制開啟 Zen Mode 是否也會將 Workbench 轉換為全螢幕模式。", "zenMode.hideTabs": "控制開啟 Zen Mode 是否也會隱藏 Workbench 索引標籤。", "zenMode.hideStatusBar": "控制開啟 Zen Mode 是否也會隱藏 Workbench 底部的狀態列。", "zenMode.hideActivityBar": "控制開啟 Zen Mode 是否也會隱藏 Workbench 左方的活動列。", - "zenMode.restore": "控制視窗如果在 Zen Mode 下結束,是否應還原為 Zen Mode。" + "zenMode.restore": "控制視窗如果在 Zen Mode 下結束,是否應還原為 Zen Mode。", + "JsonSchema.locale": "要使用的 UI 語言。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index b1e2ccbfec45..df56cbd6f90c 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "停用中斷點", "reapplyAllBreakpoints": "重新套用所有中斷點", "addFunctionBreakpoint": "加入函式中斷點", - "renameFunctionBreakpoint": "重新命名函式中斷點", "addConditionalBreakpoint": "新增條件中斷點...", "editConditionalBreakpoint": "編輯中斷點...", "setValue": "設定值", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..1c2b31ade442 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "編輯中斷點...", + "functionBreakpointsNotSupported": "此偵錯類型不支援函式中斷點", + "functionBreakpointPlaceholder": "要中斷的函式", + "functionBreakPointInputAriaLabel": "輸入函式中斷點" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..7f2bceb1df61 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "呼叫堆疊區段", + "debugStopped": "於 {0} 暫停", + "callStackAriaLabel": "偵錯呼叫堆疊", + "process": "處理序", + "paused": "已暫停", + "running": "正在執行", + "thread": "執行緒", + "pausedOn": "於 {0} 暫停", + "loadMoreStackFrames": "載入更多堆疊框架", + "threadAriaLabel": "執行緒 {0},呼叫堆疊,偵錯", + "stackFrameAriaLabel": "堆疊框架 {0} 第 {1} {2} 行,呼叫堆疊,偵錯" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index cdb820233a1a..ff4a8ed693ff 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,6 @@ "openExplorerOnEnd": "自動於偵錯工作階段結束時開啟總管檢視", "inlineValues": "在偵錯時於編輯器以內嵌方式顯示變數值", "hideActionBar": "控制是否應隱藏浮點偵錯動作列", + "showInStatusBar": "控制何時應該顯示偵錯狀態列", "launch": "全域偵錯啟動組態。應當做在工作區之間共用的 'launch.json' 替代方案使用" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index c0721bb661f7..4a1b22f7293f 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "已新增中斷點,行 {0},檔案 {1}", "breakpointRemoved": "已移除中斷點,行 {0},檔案 {1}", "compoundMustHaveConfigurations": "複合必須設有 \"configurations\" 屬性,才能啟動多個組態。", - "configMissing": "'launch.json' 中遺漏組態 '{0}'。", "debugRequestNotSupported": "在選取的偵錯組態中,屬性 `{0}` 具有不支援的值 '{1}'。", "debugRequesMissing": "所選的偵錯組態遺漏屬性 '{0}'。", "debugTypeNotSupported": "不支援設定的偵錯類型 '{0}'。", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..f122e5bf3ba8 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "變數區段", + "variablesAriaTreeLabel": "偵錯變數", + "variableValueAriaLabel": "輸入新的變數值", + "variableScopeAriaLabel": "範圍 {0},變數,偵錯", + "variableAriaLabel": "{0} 值 {1},變數,偵錯" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..1a7c7ce2534b --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "運算式區段", + "watchAriaTreeLabel": "對監看運算式執行偵錯", + "watchExpressionPlaceholder": "要監看的運算式", + "watchExpressionInputAriaLabel": "輸入監看運算式", + "watchExpressionAriaLabel": "{0} 值 {1},監看式,偵錯", + "watchVariableAriaLabel": "{0} 值 {1},監看式,偵錯" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index 9d0f768770d3..82e9231c633e 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "延伸模組名稱", "extension id": "延伸模組識別碼", + "preview": "預覽", "publisher": "發行者名稱", "install count": "安裝計數", "rating": "評等", + "repository": "儲存庫", "license": "授權", "details": "詳細資料", "contributions": "貢獻", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 237dad58880e..c246b7bb2533 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "正在解除安裝", "updateAction": "更新", "updateTo": "更新至 {0}", - "enableForWorkspaceAction.label": "啟用 (工作區)", - "enableAlwaysAction.label": "啟用 (永遠)", - "disableForWorkspaceAction.label": "停用 (工作區)", - "disableAlwaysAction.label": "停用 (永遠)", "ManageExtensionAction.uninstallingTooltip": "正在解除安裝", - "enableForWorkspaceAction": "工作區", - "enableGloballyAction": "永遠", + "enableForWorkspaceAction": "啟用 (工作區)", + "enableGloballyAction": "啟用", "enableAction": "啟用", - "disableForWorkspaceAction": "工作區", - "disableGloballyAction": "永遠", + "disableForWorkspaceAction": "停用 (工作區)", + "disableGloballyAction": "停用", "disableAction": "停用", "checkForUpdates": "查看是否有更新", "enableAutoUpdate": "啟用自動更新延伸模組", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "所有建議此工作區使用的延伸模組皆已安裝", "installRecommendedExtension": "安裝建議的擴充功能", "extensionInstalled": "建議的延伸模組已安裝", - "showRecommendedKeymapExtensions": "顯示建議的按鍵對應", "showRecommendedKeymapExtensionsShort": "按鍵對應", - "showLanguageExtensions": "顯示語言擴充功能", "showLanguageExtensionsShort": "語言擴充功能", - "showAzureExtensions": "顯示 Azure 延伸模組", "showAzureExtensionsShort": "Azure 延伸模組", "OpenExtensionsFile.failed": "無法在 '.vscode' 資料夾 ({0}) 中建立 'extensions.json' 檔案。", "configureWorkspaceRecommendedExtensions": "設定建議的延伸模組 (工作區)", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index c0f0b8275588..67a25ef14524 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -9,7 +9,7 @@ "extension": "擴充功能", "extensions": "擴充功能", "view": "檢視", + "developer": "開發人員", "extensionsConfigurationTitle": "擴充功能", - "extensionsAutoUpdate": "自動更新擴充功能", - "extensionsIgnoreRecommendations": "忽略延伸模組建議" + "extensionsAutoUpdate": "自動更新擴充功能" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..8ab5d602c3a0 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reportExtensionIssue": "回報問題" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/fileActions.i18n.json index 61b98653e608..c32641ccebc8 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/fileActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -69,5 +69,7 @@ "invalidFileNameError": "名稱 **{0}** 不能作為檔案或資料夾名稱。請選擇不同的名稱。", "filePathTooLongError": "名稱 **{0}** 導致路徑太長。請選擇較短的名稱。", "compareWithSaved": "比較使用中的檔案和已儲存的檔案", - "modifiedLabel": "{0} (在磁碟上) ↔ {1}" + "modifiedLabel": "{0} (在磁碟上) ↔ {1}", + "compareWithClipboard": "比較使用中的檔案和剪貼簿的檔案", + "clipboardComparisonLabel": "剪貼簿 ↔ {0}" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..6b1bbe9a3d6e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "資料夾" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..8edf80232253 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "檔案", + "revealInSideBar": "在提要欄位中顯示", + "acceptLocalChanges": "使用您的變更並覆寫磁碟內容 ", + "revertLocalChanges": "捨棄您的變更並還原成磁碟上的內容" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..c32641ccebc8 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "重試", + "rename": "重新命名", + "newFile": "新增檔案", + "newFolder": "新增資料夾", + "openFolderFirst": "先開啟資料夾,以在其中建立檔案或資料夾。", + "newUntitledFile": "新增未命名檔案", + "createNewFile": "新增檔案", + "createNewFolder": "新增資料夾", + "deleteButtonLabelRecycleBin": "移至資源回收筒(&&M)", + "deleteButtonLabelTrash": "移至垃圾筒(&&M)", + "deleteButtonLabel": "刪除(&&D)", + "dirtyMessageFolderOneDelete": "您要刪除的資料夾中 1 個檔案有未儲存的變更。要繼續嗎?", + "dirtyMessageFolderDelete": "您要刪除的資料夾中 {0} 個檔案有未儲存的變更。要繼續嗎?", + "dirtyMessageFileDelete": "您要刪除的檔案有未儲存的變更。要繼續嗎?", + "dirtyWarning": "如果您不儲存變更,這些變更將會遺失。", + "confirmMoveTrashMessageFolder": "您確定要刪除 '{0}' 及其內容嗎?", + "confirmMoveTrashMessageFile": "您確定要刪除 '{0}' 嗎?", + "undoBin": "您可以從資源回收筒還原。", + "undoTrash": "您可以從垃圾筒還原。", + "doNotAskAgain": "不要再詢問我", + "confirmDeleteMessageFolder": "您確定要永久刪除 '{0}' 和其中的內容嗎?", + "confirmDeleteMessageFile": "您確定要永久刪除 '{0}' 嗎?", + "irreversible": "此動作無法回復!", + "permDelete": "永久刪除", + "delete": "刪除", + "importFiles": "匯入檔案", + "confirmOverwrite": "目的資料夾中已有同名的檔案或資料夾。要取代它嗎?", + "replaceButtonLabel": "取代(&&R)", + "copyFile": "複製", + "pasteFile": "貼上", + "duplicateFile": "複製", + "openToSide": "開至側邊", + "compareSource": "選取用以比較", + "globalCompareFile": "使用中檔案的比較對象...", + "openFileToCompare": "先開啟檔案以與其他檔案進行比較", + "compareWith": "比較 '{0}' 與 '{1}'", + "compareFiles": "比較檔案", + "refresh": "重新整理", + "save": "儲存", + "saveAs": "另存新檔...", + "saveAll": "全部儲存", + "saveAllInGroup": "全部儲存在群組中", + "saveFiles": "儲存所有檔案", + "revert": "還原檔案", + "focusOpenEditors": "聚焦在 [開放式編輯器] 檢視", + "focusFilesExplorer": "將焦點設在檔案總管上", + "showInExplorer": "在提要欄位中顯示使用中的檔案", + "openFileToShow": "先開啟檔案,以在總管中加以顯示", + "collapseExplorerFolders": "摺疊 Explorer 中的資料夾", + "refreshExplorer": "重新整理 Explorer", + "openFileInNewWindow": "在新視窗中開啟使用中的檔案", + "openFileToShowInNewWindow": "先開啟檔案以在新視窗中開啟", + "revealInWindows": "在檔案總管中顯示", + "revealInMac": "在 Finder 中顯示", + "openContainer": "開啟收納資料夾", + "revealActiveFileInWindows": "在 Windows 檔案總管中顯示使用中的檔案", + "revealActiveFileInMac": "在 Finder 中顯示使用中的檔案", + "openActiveFileContainer": "開啟使用中檔案的收納資料夾", + "copyPath": "複製路徑", + "copyPathOfActive": "複製使用中檔案的路徑", + "emptyFileNameError": "必須提供檔案或資料夾名稱。", + "fileNameExistsError": "這個位置已存在檔案或資料夾 **{0}**。請選擇不同的名稱。", + "invalidFileNameError": "名稱 **{0}** 不能作為檔案或資料夾名稱。請選擇不同的名稱。", + "filePathTooLongError": "名稱 **{0}** 導致路徑太長。請選擇較短的名稱。", + "compareWithSaved": "比較使用中的檔案和已儲存的檔案", + "modifiedLabel": "{0} (在磁碟上) ↔ {1}", + "compareWithClipboard": "比較使用中的檔案和剪貼簿的檔案", + "clipboardComparisonLabel": "剪貼簿 ↔ {0}" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..75bdd9515410 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "先開啟檔案以複製其路徑", + "openFileToReveal": "先開啟檔案以顯示" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..867d603ca563 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "顯示檔案總管", + "explore": "檔案總管", + "view": "檢視", + "textFileEditor": "文字檔編輯器", + "binaryFileEditor": "二進位檔案編輯器", + "filesConfigurationTitle": "檔案", + "exclude": "設定 Glob 模式,以排除檔案及資料夾。例如,檔案總管會根據此項設定,判斷何種檔案和資料夾該顯示或隱藏。", + "files.exclude.boolean": "要符合檔案路徑的 Glob 模式。設為 True 或 False 可啟用或停用模式。", + "files.exclude.when": "在相符檔案同層級上額外的檢查。請使用 $(basename) 作為相符檔案名稱的變數。", + "associations": "將檔案關聯設定為語言 (例如 \"*.extension\": \"html\")。這些語言優先於已安裝語言的預設關聯。", + "encoding": "在讀取和寫入檔案時要使用的預設字元集編碼。此項設定也可根據每個語言加以設定。", + "autoGuessEncoding": "當啟用此功能時,會嘗試在開啟檔案時推測字元集編碼。此項設定也可根據每個語言加以設定。", + "eol": "預設結尾斷行字元.LF使用 \\n , CRLF使用\\r\\n ", + "trimTrailingWhitespace": "若啟用,將在儲存檔案時修剪尾端空白。", + "insertFinalNewline": "啟用時,請在儲存檔案時在其結尾插入最後一個新行。", + "trimFinalNewlines": "若啟用,則會在儲存檔案時,修剪檔案末新行尾的所有新行。", + "files.autoSave.off": "已變更的檔案一律不會自動儲存。", + "files.autoSave.afterDelay": "已變更的檔案會在設定的 'files.autoSaveDelay' 之後自動儲存。", + "files.autoSave.onFocusChange": "已變更的檔案會在編輯器失去焦點時自動儲存。", + "files.autoSave.onWindowChange": "已變更的檔案會在視窗失去焦點時自動儲存。", + "autoSave": "控制已變更之檔案的自動儲存。接受的值: '{0}'、'{1}、'{2}' (編輯器失去焦點)、'{3}' (視窗失去焦點)。若設為 '{4}',可以在 \"files.autoSaveDelay\" 中設定延遲。", + "autoSaveDelay": "控制要自動儲存已變更之檔案前必須經過的延遲時間 (毫秒)。僅當 'files.autoSave' 設為 \"{0}\" 時才適用。", + "watcherExclude": "設定檔案路徑的 Glob 模式已將其自檔案監看排除。模式必須符合絕對路徑 (例如使用 ** 或完整路徑前置詞以正確相符)。必須先重新開機才能變更這項設定。若是發生 Code 在啟動時取用大量 CPU 時間的情況,可以排除較大的資料夾以降低起始負載。", + "hotExit.off": "停用 Hot Exit。", + "hotExit.onExit": "Hot Exit 將會在關閉應用程式時觸發,也就是在 Windows/Linux 上關閉上一個視窗,或是觸發 workbench.action.quit 命令 (命令選擇區、按鍵繫結關係、功能表) 時觸發。具有備份的所有視窗都會在下次啟動時還原。", + "hotExit.onExitAndWindowClose": "當應用程式關閉時會觸發 Hot Exit,也就是說,當在 Windows/Linux 上關閉最後一個視窗,或是觸發 workbench.action.quit 命令 (命令選擇區、按鍵繫結關係及功能表) 時會觸發,同時也針對所有開啟資料夾的視窗,不論其是否為最後一個視窗也會觸發。下次啟動時會還原所有未開啟資料夾的視窗。若要將資料夾視窗還原到關機前的狀態,請將 \"window.restoreWindows\" 設定為 \"all\"。", + "hotExit": "控制是否讓不同工作階段記住未儲存的檔案,並允許在結束編輯器時跳過儲存提示。", + "useExperimentalFileWatcher": "使用新的實驗性檔案監看員。", + "defaultLanguage": "指派給新檔案的預設語言模式。", + "editorConfigurationTitle": "編輯器", + "formatOnSave": "在儲存時設定檔案格式。格式器必須處於可用狀態、檔案不得自動儲存,且編輯器不得關機。", + "explorerConfigurationTitle": "檔案總管", + "openEditorsVisible": "[開放式編輯器] 窗格中顯示的編輯器數目。將其設定為 0 以隱藏窗格。", + "dynamicHeight": "控制 [開放式編輯器] 區段的高度是否應依元素數目動態調整。", + "autoReveal": "控制總管是否在開啟檔案時自動加以顯示及選取。", + "enableDragAndDrop": "控制總管是否應該允許透過拖放功能移動檔案和資料夾。", + "confirmDragAndDrop": "控制總管是否須要求確認,以透過拖放來移動檔案和資料夾。", + "confirmDelete": "控制總管是否須在透過垃圾桶刪除檔案時要求確認。", + "sortOrder.default": "檔案與資料夾會依照名稱以字母順序排序。資料夾會顯示在檔案前。", + "sortOrder.mixed": "檔案與資料夾會依照名稱以字母順序排序。檔案與資料夾會交錯排列。", + "sortOrder.filesFirst": "檔案與資料夾會依照名稱以字母順序排序。檔案會顯示在資料夾前。", + "sortOrder.type": "檔案與資料夾會依照延伸模組以字母順序排序。資料夾會顯示在檔案前。", + "sortOrder.modified": "檔案與資料夾會依照最後修改日期以字母順序排序。資料夾會顯示在檔案前。", + "sortOrder": "控制檔案與資料夾在總管中的排列順序。除了預設排序外,您也可以將順序設定為 'mixed' (檔案與資料夾)、'type' (依檔案類型)、'modified' (依最後修改日期) 或 'filesFirst' (將檔案排序在資料夾前)。", + "explorer.decorations.colors": "控制檔案裝飾是否須使用色彩。", + "explorer.decorations.badges": "控制檔案裝飾是否須使用徽章。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..7a6f0b075f74 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "在右方使用編輯器工具列中的動作來 **復原** 您的變更,或以您的變更 **覆寫** 磁碟上的內容", + "discard": "捨棄", + "overwrite": "覆寫", + "retry": "重試", + "readonlySaveError": "無法儲存 '{0}': 檔案有防寫保護。請選取 [覆寫] 以移除保護。", + "genericSaveError": "無法儲存 '{0}': {1}", + "staleSaveError": "無法儲存 '{0}': 磁碟上的內容較新。請按一下 [比較],比較您的版本與磁碟上的版本。", + "compareChanges": "比較", + "saveConflictDiffLabel": "{0} (位於磁碟) ↔ {1} (在 {2} 中) - 解決儲存衝突" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..39ac1f09ad1d --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "沒有開啟的資料夾", + "explorerSection": "檔案總管區段", + "noWorkspaceHelp": "您尚未將資料夾新增至工作區。", + "addFolder": "新增資料夾", + "noFolderHelp": "您尚未開啟資料夾。", + "openFolder": "開啟資料夾" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..a90bd78ed076 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "檔案總管", + "canNotResolve": "無法解析工作區資料夾" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..9b7a2b36138b --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "檔案總管區段", + "treeAriaLabel": "檔案總管" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..bc42ca6193fc --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "輸入檔案名稱。請按 Enter 鍵確認或按 Esc 鍵取消。", + "filesExplorerViewerAriaLabel": "{0},檔案總管", + "dropFolders": "要在工作區新增資料夾嗎?", + "dropFolder": "要在工作區新增資料夾嗎?", + "addFolders": "新增資料夾(&A)", + "addFolder": "新增資料夾(&A)", + "confirmMove": "確定要移動 '{0}' 嗎?", + "doNotAskAgain": "不要再詢問我", + "moveButtonLabel": "移動(&&M)", + "confirmOverwriteMessage": "目的資料夾中已存在 '{0}'。要取代它嗎?", + "irreversible": "此動作無法回復!", + "replaceButtonLabel": "取代(&&R)" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..b48ed12d5185 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "已開啟的編輯器", + "openEditosrSection": "開放式編輯器區段", + "dirtyCounter": "{0} 未儲存", + "saveAll": "全部儲存", + "closeAllUnmodified": "關閉未變更的檔案", + "closeAll": "全部關閉", + "compareWithSaved": "與已儲存的檔案比較", + "close": "關閉", + "closeOthers": "關閉其他" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..f93f9a1f2779 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0},編輯器群組", + "openEditorAriaLabel": "{0},開啟編輯器", + "saveAll": "全部儲存", + "closeAllUnmodified": "關閉未變更的檔案", + "closeAll": "全部關閉", + "compareWithSaved": "與已儲存的檔案比較", + "close": "關閉", + "closeOthers": "關閉其他" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/common/messages.i18n.json index 2871ecef6100..af077309e72c 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,6 @@ { "viewCategory": "檢視", "problems.view.toggle.label": "切換問題", - "problems.view.show.label": "顯示問題", - "problems.view.hide.label": "隱藏問題", "problems.panel.configuration.title": "[問題] 檢視", "problems.panel.configuration.autoreveal": "控制 [問題] 檢視是否應自動在開啟檔案時加以顯示", "markers.panel.title.problems": "問題", diff --git a/i18n/cht/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/cht/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..7f9c895661aa --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "已成功建立設定檔。", + "prof.detail": "請建立問題,並手動附加下列檔案:\n{0}", + "prof.restartAndFileIssue": "建立問題並重新啟動", + "prof.restart": "重新啟動", + "prof.thanks": "感謝您的協助", + "prof.detail.restart": "需要重新啟動才能夠繼續使用'{0}‘.再次感謝您的回饋." +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index c37842d37187..1d840c42cf9e 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "按下所需按鍵組合及 ENTER。ESCAPE 可取消。", "defineKeybinding.chordsTo": "同步到" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 45b8b75fa831..0db1b09d33b5 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "變更按鍵繫結關係", "addKeybindingLabelWithKey": "新增按鍵繫結關係 {0}", "addKeybindingLabel": "新增按鍵繫結關係", + "title": "{0} ({1})", "commandAriaLabel": "命令為 {0}。", "keybindingAriaLabel": "按鍵繫結關係為 {0}。", "noKeybinding": "未指派任何按鍵繫結關係。", diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 175a2c3161c7..1b98a0d9db91 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "預設設定", "SearchSettingsWidget.AriaLabel": "搜尋設定", "SearchSettingsWidget.Placeholder": "搜尋設定", - "totalSettingsMessage": "共 {0} 項設定", "noSettingsFound": "沒有結果", "oneSettingFound": "1 項相符設定", "settingsFound": "{0} 項相符設定", - "fileEditorWithInputAriaLabel": "{0}。文字檔編輯器。", - "fileEditorAriaLabel": "文字檔編輯器。", + "totalSettingsMessage": "共 {0} 項設定", + "defaultSettings": "預設設定", + "defaultFolderSettings": "預設資料夾設定", "defaultEditorReadonly": "在右方編輯器中編輯以覆寫預設。", "preferencesAriaLabel": "預設喜好設定。唯讀文字編輯器。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 194d1e8d5141..d1713dc3e872 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "將您的設定放置在此以覆寫預設設定。", "emptyWorkspaceSettingsHeader": "將您的設定放置在此以覆寫使用者設定。", "emptyFolderSettingsHeader": "將您的資料夾設定放置在此以覆寫工作區設定的資料夾設定。", - "defaultFolderSettingsTitle": "預設資料夾設定", - "defaultSettingsTitle": "預設設定", "editTtile": "編輯", "replaceDefaultValue": "在設定中取代", "copyDefaultValue": "複製到設定", diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 6fc789518cb4..5c3acf7c7d64 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "嘗試模糊搜尋!", "defaultSettings": "將您的設定放置於右方編輯器中以覆寫。", "noSettingsFound": "找不到任何設定。", - "folderSettingsDetails": "資料夾設定", - "enableFuzzySearch": "啟用實驗性模糊搜尋" + "settingsSwitcherBarAriaLabel": "設定切換器", + "userSettings": "使用者設定", + "workspaceSettings": "工作區設定", + "folderSettings": "資料夾設定" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..978ee42a36c5 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "預設喜好設定編輯器", + "keybindingsEditor": "按鍵繫結關係編輯器", + "preferences": "喜好設定" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index e0a612882aed..72f9807aa292 100644 --- a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "原始檔控制提供者", "hideRepository": "隱藏", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "安裝額外SCM提供者...", "no open repo": "沒有使用中的原始檔控制提供者。", "source control": "原始檔控制", diff --git a/i18n/cht/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/cht/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 0fef2dc733f3..d463f62a841d 100644 --- a/i18n/cht/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "輸入", - "useIgnoreFilesDescription": "使用忽略檔案", - "useExcludeSettingsDescription": "使用排除設定" + "useExcludesAndIgnoreFilesDescription": "使用排除設定與忽略檔案" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 2192cc5b3fe3..2737e83ab4e2 100644 --- a/i18n/cht/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "要符合檔案路徑的 Glob 模式。設為 True 或 False 可啟用或停用模式。", "exclude.when": "在相符檔案同層級上額外的檢查。請使用 $(basename) 作為相符檔案名稱的變數。", "useRipgrep": "控制是否要在文字和檔案搜尋中使用 ripgrep", - "useIgnoreFilesByDefault": "控制在新的工作區中搜尋文字時,是否要根據預設使用 .gitignore 及 .ignore 檔案。 ", "useIgnoreFiles": "控制在搜尋檔案時,是否要使用 .gitignore 及 .ignore 檔案。 ", "search.quickOpen.includeSymbols": "設定以將全域符號搜尋的結果納入 Quick Open 的檔案結果中。", "search.followSymlinks": "控制是否要在搜尋時遵循 symlink。" diff --git a/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 010379cf8d26..551008efc789 100644 --- a/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "顯示上一個搜尋排除模式", "nextSearchTerm": "顯示下一個搜尋字詞", "previousSearchTerm": "顯示上一個搜尋字詞", - "focusNextInputBox": "聚焦於下一個輸入方塊", - "focusPreviousInputBox": "聚焦於上一個輸入方塊", "showSearchViewlet": "顯示搜尋", "findInFiles": "在檔案中尋找", "findInFilesWithSelectedText": "在檔案中尋找選取的文字 ", "replaceInFiles": "檔案中取代", "replaceInFilesWithSelectedText": "在檔案中取代為選取的文字", - "findInWorkspace": "在工作區中尋找...", - "findInFolder": "在資料夾中尋找...", "RefreshAction.label": "重新整理", - "ClearSearchResultsAction.label": "清除搜尋結果", + "CollapseDeepestExpandedLevelAction.label": "全部摺疊", + "ClearSearchResultsAction.label": "清除", "FocusNextSearchResult.label": "聚焦於下一個搜尋結果", "FocusPreviousSearchResult.label": "聚焦於上一個搜尋結果", "RemoveAction.label": "關閉", diff --git a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..2737e83ab4e2 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "前往工作區中的符號...", + "name": "搜尋", + "search": "搜尋", + "view": "檢視", + "openAnythingHandlerDescription": "前往檔案", + "openSymbolDescriptionNormal": "前往工作區中的符號", + "searchOutputChannelTitle": "搜尋", + "searchConfigurationTitle": "搜尋", + "exclude": "設定 Glob 模式,以排除不要搜尋的檔案及資料夾。請從 file.exclude 設定繼承所有的 Glob 模式。", + "exclude.boolean": "要符合檔案路徑的 Glob 模式。設為 True 或 False 可啟用或停用模式。", + "exclude.when": "在相符檔案同層級上額外的檢查。請使用 $(basename) 作為相符檔案名稱的變數。", + "useRipgrep": "控制是否要在文字和檔案搜尋中使用 ripgrep", + "useIgnoreFiles": "控制在搜尋檔案時,是否要使用 .gitignore 及 .ignore 檔案。 ", + "search.quickOpen.includeSymbols": "設定以將全域符號搜尋的結果納入 Quick Open 的檔案結果中。", + "search.followSymlinks": "控制是否要在搜尋時遵循 symlink。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/cht/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..9ad25ceb576a --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "在資料夾中尋找...", + "findInWorkspace": "在工作區中尋找..." +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 0e7261b9d399..9ec03d559328 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "工作", "ConfigureTaskRunnerAction.label": "設定工作", - "ConfigureBuildTaskAction.label": "設定建置工作", "CloseMessageAction.label": "關閉", - "ShowTerminalAction.label": "檢視終端機", "problems": "問題", + "building": "建置中...", "manyMarkers": "99+", "runningTasks": "顯示執行中的工作", "tasks": "工作", @@ -52,7 +51,6 @@ "TaslService.noEntryToRun": "找不到任何要執行的工作。請設定工作...", "TaskService.fetchingBuildTasks": "正在擷取組建工作...", "TaskService.pickBuildTask": "請選取要執行的組建工作", - "TaskService.noBuildTask": "找不到任何要執行的組建工作。請設定工作...", "TaskService.fetchingTestTasks": "正在擷取測試工作...", "TaskService.pickTestTask": "請選取要執行的測試工作", "TaskService.noTestTaskTerminal": "找不到任何要執行的測試工作。請設定工作...", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index a45b9045bdba..f21865638d98 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "執行工作時發生不明錯誤。如需詳細資訊,請參閱工作輸出記錄檔。", "dependencyFailed": "無法解決在工作區資料夾 '{1}' 中的相依工作 '{0}'", "TerminalTaskSystem.terminalName": "工作 - {0}", + "closeTerminal": "按任意鍵關閉終端機。", "reuseTerminal": "工作將被重新啟用.按任意鍵關閉.", "TerminalTaskSystem": "無法在 UNC 磁碟機上執行殼層命令。", "unkownProblemMatcher": "問題比對器 {0} 無法解析,比對器將予忽略。" diff --git a/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 61b47eff6f84..381d6bbb407f 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,6 @@ "ConfigurationParser.noTypeDefinition": "錯誤: 沒有已註冊工作類型 '{0}'。您是否忘記安裝提供相應工作提供者的延伸模組?", "ConfigurationParser.missingRequiredProperty": "錯誤: 工作組態 '{0}' 缺少要求的屬性 '{1}'。會略過工作組態。", "ConfigurationParser.notCustom": "錯誤: 未將工作宣告為自訂工作。將會忽略該組態。\n{0}\n", - "ConfigurationParser.noTaskName": "錯誤: 工作必須提供 taskName 屬性。即將忽略此工作。\n{0}\n", - "taskConfiguration.shellArgs": "警告: 工作 '{0}' 是殼層命令,但命令名稱或其中一個引數有的未逸出的空格。若要確保命令列正確引述,請將引數合併到命令中。", "taskConfiguration.noCommandOrDependsOn": "錯誤: 工作 '{0}' 未指定命令與 dependsOn 屬性。將會略過該工作。其定義為: \n{1}", "taskConfiguration.noCommand": "錯誤: 工作 '{0}' 未定義命令。即將略過該工作。其定義為:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "工作版本 2.0.0 不支援全域 OS 特定工作。請使用 OS 特定命令來轉換這些工作。受影響的工作為:\n{0}" diff --git a/i18n/cht/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index a83e0f144258..a843e1725418 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0} , 終端機選擇器", "termCreateEntryAriaLabel": "{0},建立新的終端機", - "'workbench.action.terminal.newplus": "$(plus) 建立新的整合式終端機", + "workbench.action.terminal.newplus": "$(plus) 建立新的整合式終端機", "noTerminalsMatching": "無相符的終端機", "noTerminalsFound": "無開啟的終端機" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 80abe8bb59c2..a6aa09a9aa9b 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,6 @@ "terminal.integrated.rightClickCopyPaste": "如有設定,這會防止在終端機內按滑鼠右鍵時顯示操作功能表,而是在有選取項目時複製、沒有選取項目時貼上。", "terminal.integrated.fontFamily": "控制終端機的字型家族,預設為 editor.fontFamily 的值。", "terminal.integrated.fontSize": "控制終端機的字型大小 (以像素為單位)。", - "terminal.integrated.lineHeight": "控制終端機的行高,此數字會乘上終端機字型大小,以取得以像素為單位的實際行高。", "terminal.integrated.enableBold": "是否要在終端機中啟用粗體文字,請注意,此動作須有終端機殼層的支援。", "terminal.integrated.cursorBlinking": "控制終端機資料指標是否閃爍。", "terminal.integrated.cursorStyle": "控制終端機資料指標的樣式。", diff --git a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index ae636e706790..c2b6d2e38859 100644 --- a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,14 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "色彩佈景主題", + "themes.category.light": "淺色主題", + "themes.category.dark": "深色主題", "installColorThemes": "安裝其他的色彩佈景主題...", "themes.selectTheme": "選取色彩主題(上/下鍵預覽)", "selectIconTheme.label": "檔案圖示佈景主題", - "installIconThemes": "安裝其他的檔案圖示主題...", "noIconThemeLabel": "無", "noIconThemeDesc": "停用檔案圖示", - "problemChangingIconTheme": "設定圖示佈景主題時發生問題: {0}", + "installIconThemes": "安裝其他的檔案圖示主題...", "themes.selectIconTheme": "選取檔案圖示佈景主題", "generateColorTheme.label": "依目前的設定產生色彩佈景主題", "preferences": "喜好設定", diff --git a/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 2bc73e75628d..d287934dae86 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "視窗特定組態,可在使用者或工作區設定中予以設定。", "scope.resource.description": "資源特定設定,可在使用者、工作區或資料夾設定中予以設定。", "scope.description": "組態適用的範圍。可用的範圍為「視窗」和「資源」。", + "vscode.extension.contributes.defaultConfiguration": "依語言貢獻預設編輯器組態設定。", "vscode.extension.contributes.configuration": "提供組態設定。", "invalid.title": "'configuration.title' 必須是字串", - "vscode.extension.contributes.defaultConfiguration": "依語言貢獻預設編輯器組態設定。", "invalid.properties": "'configuration.properties' 必須是物件", "invalid.allOf": "'configuration.allOf' 已取代而不應再使用。請改為將多個組態區段作為陣列,傳遞至「組態」貢獻點。", "workspaceConfig.folders.description": "要載入工作區之資料夾的清單。", diff --git a/i18n/cht/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/cht/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..e3e021a42548 --- /dev/null +++ b/i18n/cht/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "遙測", + "telemetry.enableCrashReporting": "允許將損毀報告傳送給 Microsoft。\n此選項需要重新啟動才會生效。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/cht/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 40b81b62803b..8b6ad71cd4e6 100644 --- a/i18n/cht/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "bubbleTitle": "包含強調項目" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json index 745c027703e8..de69c42ba6ca 100644 --- a/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "檔案是目錄", "fileNotModifiedError": "未修改檔案的時間", "fileTooLargeError": "檔案太大無法開啟", - "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟", "fileNotFoundError": "找不到檔案 ({0})", + "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟", "fileExists": "要建立的檔案已存在 ({0})", "fileMoveConflict": "無法移動/複製。目的地已存在檔案。", "unableToMoveCopyError": "無法移動/複製。檔案會取代其所在的資料夾。", diff --git a/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index f0043c73b6a4..6cf70a557161 100644 --- a/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -21,6 +21,5 @@ "keybindings.json.command": "所要執行命令的名稱", "keybindings.json.when": "按鍵為使用中時的條件。", "keybindings.json.args": "要傳遞至命令加以執行的引數。", - "keyboardConfigurationTitle": "鍵盤", - "dispatch": "控制按下按鍵時的分派邏輯 (使用 'keydown.code' (建議使用) 或 'keydown.keyCode')。" + "keyboardConfigurationTitle": "鍵盤" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/cht/src/vs/workbench/services/textfile/common/textFileService.i18n.json index 3f50386cb27c..8b6ad71cd4e6 100644 --- a/i18n/cht/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "files.backup.failSave": "無法備份檔案 (錯誤: {0}),請嘗試儲存您的檔案再結束。" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 5ab16a62ce28..939ead9df9c7 100644 --- a/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "已將新的佈景主題設定新增到使用者設定。備份位於 {0}。", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "Specifies the color theme used in the workbench.", "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "指定在工作台中使用的圖示主題,或設定為 'null' 不顯示任何檔案圖示。", diff --git a/i18n/deu/extensions/git/out/autofetch.i18n.json b/i18n/deu/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..304f70941e24 --- /dev/null +++ b/i18n/deu/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Ja", + "no": "Nein" +} \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/commands.i18n.json b/i18n/deu/extensions/git/out/commands.i18n.json index 3f2fcad2989c..9f89fe2f6628 100644 --- a/i18n/deu/extensions/git/out/commands.i18n.json +++ b/i18n/deu/extensions/git/out/commands.i18n.json @@ -9,6 +9,8 @@ "create branch": "$(plus) Neuen Branch erstellen", "repourl": "Repository-URL", "parent": "Übergeordnetes Verzeichnis", + "cancel": "$(sync~spin) Repository wird geklont... Klicken Sie zum Abbrechen", + "cancel tooltip": "Klonen abbrechen", "cloning": "Git-Repository wird geklont...", "openrepo": "Repository öffnen", "proposeopen": "Möchten Sie das geklonte Repository öffnen?", @@ -49,6 +51,8 @@ "select branch to delete": "Wählen Sie einen Branch zum Löschen aus", "confirm force delete branch": "Der Branch '{0}' ist noch nicht vollständig zusammengeführt. Trotzdem löschen?", "delete branch": "Branch löschen", + "invalid branch name": "Ungültiger Branchname", + "branch already exists": "Ein Branch namens \"{0}\" bereits vorhanden.", "select a branch to merge from": "Branch für die Zusammenführung auswählen", "merge conflicts": "Es liegen Zusammenführungskonflikte vor. Beheben Sie die Konflikte vor dem Committen.", "tag name": "Tag-Name", @@ -71,7 +75,6 @@ "no stashes": "Es ist kein Stash zum Wiederherstellen vorhanden.", "pick stash to pop": "Wählen Sie einen Stash aus, für den ein Pop ausgeführt werden soll.", "clean repo": "Bereinigen Sie Ihre Repository-Arbeitsstruktur vor Auftragsabschluss.", - "cant push": "Verweise können nicht per Push an einen Remotespeicherort übertragen werden. Führen Sie zuerst \"Pull\" aus, um Ihre Änderungen zu integrieren.", "git error details": "Git: {0}", "git error": "Git-Fehler", "open git log": "Git-Protokoll öffnen" diff --git a/i18n/deu/extensions/git/out/main.i18n.json b/i18n/deu/extensions/git/out/main.i18n.json index 58ab0b365d00..17a3a6ed1276 100644 --- a/i18n/deu/extensions/git/out/main.i18n.json +++ b/i18n/deu/extensions/git/out/main.i18n.json @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Suchen nach Git in: {0}", "using git": "Verwenden von Git {0} von {1}", - "updateGit": "Git aktualisieren", "neverShowAgain": "Nicht mehr anzeigen", + "updateGit": "Git aktualisieren", "git20": "Sie haben anscheinend Git {0} installiert. Code funktioniert am besten mit Git 2 oder neuer" } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/repository.i18n.json b/i18n/deu/extensions/git/out/repository.i18n.json index eeff60b713c4..9c6af561332b 100644 --- a/i18n/deu/extensions/git/out/repository.i18n.json +++ b/i18n/deu/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Gelöscht von uns", "both added": "Beide hinzugefügt", "both modified": "Beide geändert", + "commitMessage": "Message (press {0} to commit)", "commit": "Commit", "merge changes": "Änderungen zusammenführen", "staged changes": "Bereitgestellte Änderungen", diff --git a/i18n/deu/extensions/git/package.i18n.json b/i18n/deu/extensions/git/package.i18n.json index c692dbace320..88964f866442 100644 --- a/i18n/deu/extensions/git/package.i18n.json +++ b/i18n/deu/extensions/git/package.i18n.json @@ -33,6 +33,7 @@ "command.checkout": "Auschecken an...", "command.branch": "Branch erstellen...", "command.deleteBranch": "Branch löschen...", + "command.renameBranch": "Branch umbenennen...", "command.merge": "Branch zusammenführen...", "command.createTag": "Tag erstellen", "command.pull": "Pull", @@ -42,6 +43,7 @@ "command.pushTo": "Push zu...", "command.pushWithTags": "Push mit Tags ausführen", "command.sync": "Synchronisierung", + "command.syncRebase": "Sync (Rebase)", "command.publish": "Branch veröffentlichen", "command.showOutput": "Git-Ausgabe anzeigen", "command.ignore": "Datei zu .gitignore hinzufügen", diff --git a/i18n/deu/extensions/markdown/out/commands.i18n.json b/i18n/deu/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..a4208705fd49 --- /dev/null +++ b/i18n/deu/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "Vorschau von {0}", + "onPreviewStyleLoadError": "'markdown.styles' konnte nicht geladen werden: {0}" +} \ No newline at end of file diff --git a/i18n/deu/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/deu/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..5a04ed5447d1 --- /dev/null +++ b/i18n/deu/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "In diesem Dokument wurden einige Inhalte deaktiviert.", + "preview.securityMessage.title": "Potenziell unsichere Inhalte wurden in der Markdown-Vorschau deaktiviert. Ändern Sie die Sicherheitseinstellung der Markdown-Vorschau, um unsichere Inhalte zuzulassen oder Skripts zu aktivieren.", + "preview.securityMessage.label": "Sicherheitswarnung – Inhalt deaktiviert" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/base/common/errorMessage.i18n.json b/i18n/deu/src/vs/base/common/errorMessage.i18n.json index 4bda5bf72a26..c952791d048d 100644 --- a/i18n/deu/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/deu/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. Fehlercode: {1}", - "error.permission.verbose": "Berechtigung verweigert (HTTP {0})", - "error.permission": "Berechtigung verweigert", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Unbekannter Verbindungsfehler ({0})", - "error.connection.unknown": "Es ist ein unbekannter Verbindungsfehler aufgetreten. Entweder besteht keine Internetverbindung mehr, oder der verbundene Server ist offline.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "Ein unbekannter Fehler ist aufgetreten. Weitere Details dazu finden Sie im Protokoll.", "nodeExceptionMessage": "Systemfehler ({0})", diff --git a/i18n/deu/src/vs/code/electron-main/main.i18n.json b/i18n/deu/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..b88bee0ef1d3 --- /dev/null +++ b/i18n/deu/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "&&Schließen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/menus.i18n.json b/i18n/deu/src/vs/code/electron-main/menus.i18n.json index 26bf3d1e0205..8dcc363ec8ea 100644 --- a/i18n/deu/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,10 @@ "miQuit": "{0} beenden", "miNewFile": "&&Neue Datei", "miOpen": "&&Öffnen...", - "miOpenWorkspace": "&&Arbeitsbereich öffnen...", "miOpenFolder": "&&Ordner öffnen...", "miOpenFile": "Datei &&öffnen...", "miOpenRecent": "&&Zuletzt verwendete öffnen", - "miSaveWorkspaceAs": "Arbeitsbereich &&speichern unter...", - "miAddFolderToWorkspace": "&&Ordner zum Arbeitsbereich hinzufügen...", + "miSaveWorkspaceAs": "Arbeitsbereich speichern unter...", "miSave": "&&Speichern", "miSaveAs": "Speichern &&unter...", "miSaveAll": "A&&lles speichern", @@ -109,7 +107,7 @@ "miZoomOut": "Ver&&kleinern", "miZoomReset": "&&Zoom zurücksetzen", "miBack": "&&Zurück", - "miForward": "&&Weiterleiten", + "miForward": "&&Vorwärts", "miNextEditor": "&&Nächster Editor", "miPreviousEditor": "&&Vorheriger Editor", "miNextEditorInGroup": "&&Nächster verwendeter Editor in der Gruppe", @@ -157,7 +155,6 @@ "mMergeAllWindows": "Alle Fenster zusammenführen", "miToggleDevTools": "&&Entwicklertools umschalten", "miAccessibilityOptions": "&&Optionen für erleichterte Bedienung", - "miReportIssues": "&&Probleme melden", "miWelcome": "&&Willkommen", "miInteractivePlayground": "&&Interactive Spielwiese", "miDocumentation": "&&Dokumentation", @@ -184,6 +181,6 @@ "miDownloadingUpdate": "Das Update wird heruntergeladen...", "miInstallingUpdate": "Update wird installiert...", "miCheckForUpdates": "Nach Aktualisierungen suchen...", - "aboutDetail": "\nVersion {0}\nCommit {1}\nDatum {2}\nShell {3}\nRenderer {4}\nNode {5}\nArchitektur {6}", - "okButton": "OK" + "okButton": "OK", + "copy": "&&Kopieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/deu/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..d7541e30bc74 --- /dev/null +++ b/i18n/deu/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Die folgenden Dateien wurden in der Zwischenzeit geändert: {0}", + "summary.0": "Keine Änderungen vorgenommen", + "summary.nm": "{0} Änderungen am Text in {1} Dateien vorgenommen", + "summary.n0": "{0} Änderungen am Text in einer Datei vorgenommen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index 692a3d343b43..791032db29ac 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,14 @@ "fontSize": "Steuert den Schriftgrad in Pixeln.", "lineHeight": "Steuert die Zeilenhöhe. Verwenden Sie 0, um LineHeight aus der FontSize-Angabe zu berechnen.", "letterSpacing": "Steuert den Zeichenabstand in Pixeln.", - "lineNumbers": "Steuert die Anzeige von Zeilennummern. Mögliche Werte sind \"Ein\", \"Aus\" und \"Relativ\". \"Relativ\" zeigt die Zeilenanzahl ab der aktuellen Cursorposition.", + "lineNumbers.off": "Zeilennummern werden nicht dargestellt.", + "lineNumbers.on": "Zeilennummern werden als absolute Zahl dargestellt.", + "lineNumbers.relative": "Zeilennummern werden als Abstand in Zeilen an Cursorposition dargestellt.", + "lineNumbers.interval": "Zeilennummern werden alle 10 Zeilen dargestellt.", + "lineNumbers": "Steuert die Anzeige von Zeilennummern. Mögliche Werte sind \"Ein\", \"Aus\" und \"Relativ\".", "rulers": "Vertikale Linien nach einer bestimmten Anzahl von Monospace Zeichen zeichnen. Verwenden Sie mehrere Werte für mehrere Linien. Keine Linie wird gezeichnet, wenn das Array leer ist.", "wordSeparators": "Zeichen, die als Worttrennzeichen verwendet werden, wenn wortbezogene Navigationen oder Vorgänge ausgeführt werden.", - "tabSize": "Die Anzahl der Leerzeichen, denen ein Tabstopp entspricht. Diese Einstellung wird basierend auf dem Inhalt der Datei überschrieben, wenn \"editor.detectIndentation\" aktiviert ist.", "tabSize.errorMessage": "\"number\" wurde erwartet. Beachten Sie, dass der Wert \"auto\" durch die Einstellung \"editor.detectIndentation\" ersetzt wurde.", - "insertSpaces": "Fügt beim Drücken der TAB-TASTE Leerzeichen ein. Diese Einstellung wird basierend auf dem Inhalt der Datei überschrieben, wenn \"editor.detectIndentation\" aktiviert ist.", "insertSpaces.errorMessage": "\"boolean\" wurde erwartet. Beachten Sie, dass der Wert \"auto\" durch die Einstellung \"editor.detectIndentation\" ersetzt wurde.", "detectIndentation": "Beim Öffnen einer Datei werden \"editor.tabSize\" und \"editor.insertSpaces\" basierend auf den Dateiinhalten erkannt.", "roundedSelection": "Steuert, ob die Auswahl runde Ecken aufweist.", @@ -89,8 +91,8 @@ "links": "Steuert, ob der Editor Links erkennen und anklickbar machen soll", "colorDecorators": "Steuert, ob der Editor die Inline-Farbdecorators und die Farbauswahl rendern soll.", "codeActions": "Ermöglicht die Code-Aktion \"lightbulb\"", + "selectionClipboard": "Steuert, ob die primäre Linux-Zwischenablage unterstützt werden soll.", "sideBySide": "Steuert, ob der Diff-Editor das Diff nebeneinander oder inline anzeigt.", "ignoreTrimWhitespace": "Steuert, ob der Diff-Editor Änderungen in führenden oder nachgestellten Leerzeichen als Diffs anzeigt.", - "renderIndicators": "Steuert, ob der Diff-Editor die Indikatoren \"+\" und \"-\" für hinzugefügte/entfernte Änderungen anzeigt.", - "selectionClipboard": "Steuert, ob die primäre Linux-Zwischenablage unterstützt werden soll." + "renderIndicators": "Steuert, ob der Diff-Editor die Indikatoren \"+\" und \"-\" für hinzugefügte/entfernte Änderungen anzeigt." } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/deu/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..d357fb74a7c8 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Gehe zu Klammer" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/deu/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..e7167388d843 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Caretzeichen nach links verschieben", + "caret.moveRight": "Caretzeichen nach rechts verschieben" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/deu/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..45360f52384e --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Buchstaben austauschen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/deu/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..922dc8181a67 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Ausschneiden", + "actions.clipboard.copyLabel": "Kopieren", + "actions.clipboard.pasteLabel": "Einfügen", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Mit Syntaxhervorhebung kopieren" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/deu/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..70898acfa346 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Zeilenkommentar umschalten", + "comment.line.add": "Zeilenkommentar hinzufügen", + "comment.line.remove": "Zeilenkommentar entfernen", + "comment.block": "Blockkommentar umschalten" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/deu/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..2b06743ac4ad --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Editor-Kontextmenü anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/find/findController.i18n.json b/i18n/deu/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..966c9eafe93d --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Suchen", + "findNextMatchAction": "Nächstes Element suchen", + "findPreviousMatchAction": "Vorheriges Element suchen", + "nextSelectionMatchFindAction": "Nächste Auswahl suchen", + "previousSelectionMatchFindAction": "Vorherige Auswahl suchen", + "startReplace": "Ersetzen", + "showNextFindTermAction": "Nächsten Suchbegriff anzeigen", + "showPreviousFindTermAction": "Vorherigen Suchbegriff anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..62d72aaf3551 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Suchen", + "placeholder.find": "Suchen", + "label.previousMatchButton": "Vorherige Übereinstimmung", + "label.nextMatchButton": "Nächste Übereinstimmung", + "label.toggleSelectionFind": "In Auswahl suchen", + "label.closeButton": "Schließen", + "label.replace": "Ersetzen", + "placeholder.replace": "Ersetzen", + "label.replaceButton": "Ersetzen", + "label.replaceAllButton": "Alle ersetzen", + "label.toggleReplaceButton": "Ersetzen-Modus wechseln", + "title.matchesCountLimit": "Nur die ersten {0} Ergebnisse wurden hervorgehoben, aber alle Suchoperationen werden auf dem gesamten Text durchgeführt.", + "label.matchesLocation": "{0} von {1}", + "label.noResults": "Keine Ergebnisse" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..32db8ee0bd6e --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Suchen", + "placeholder.find": "Suchen", + "label.previousMatchButton": "Vorherige Übereinstimmung", + "label.nextMatchButton": "Nächste Übereinstimmung", + "label.closeButton": "Schließen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/deu/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..113379281fda --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Auffalten", + "unFoldRecursivelyAction.label": "Faltung rekursiv aufheben", + "foldAction.label": "Falten", + "foldRecursivelyAction.label": "Rekursiv falten", + "foldAllBlockComments.label": "Alle Blockkommentare falten", + "foldAllAction.label": "Alle falten", + "unfoldAllAction.label": "Alle auffalten", + "foldLevelAction.label": "Faltebene {0}" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..7156de16ac5f --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "1 Formatierung in Zeile {0} vorgenommen", + "hintn1": "{0} Formatierungen in Zeile {1} vorgenommen", + "hint1n": "1 Formatierung zwischen Zeilen {0} und {1} vorgenommen", + "hintnn": "{0} Formatierungen zwischen Zeilen {1} und {2} vorgenommen", + "no.provider": "Es ist leider kein Formatierer für \"{0}\"-Dateien installiert. ", + "formatDocument.label": "Dokument formatieren", + "formatSelection.label": "Auswahl formatieren" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..ffee2c2fa36d --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Keine Definition gefunden für \"{0}\".", + "generic.noResults": "Keine Definition gefunden", + "meta.title": " – {0} Definitionen", + "actions.goToDecl.label": "Gehe zu Definition", + "actions.goToDeclToSide.label": "Definition an der Seite öffnen", + "actions.previewDecl.label": "Peek-Definition", + "goToImplementation.noResultWord": "Keine Implementierung gefunden für \"{0}\"", + "goToImplementation.generic.noResults": "Keine Implementierung gefunden", + "meta.implementations.title": "{0} Implementierungen", + "actions.goToImplementation.label": "Zur Implementierung wechseln", + "actions.peekImplementation.label": "Vorschau der Implementierung anzeigen", + "goToTypeDefinition.noResultWord": "Keine Typendefinition gefunden für \"{0}\"", + "goToTypeDefinition.generic.noResults": "Keine Typendefinition gefunden", + "meta.typeDefinitions.title": "{0} Typdefinitionen", + "actions.goToTypeDefinition.label": "Zur Typdefinition wechseln", + "actions.peekTypeDefinition.label": "Vorschau der Typdefinition anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..2d5f00609a89 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Klicken Sie, um {0} Definitionen anzuzeigen." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..02553773e89a --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Gehe zum nächsten Fehler oder zur nächsten Warnung", + "markerAction.previous.label": "Gehe zum vorherigen Fehler oder zur vorherigen Warnung", + "editorMarkerNavigationError": "Editormarkierung: Farbe bei Fehler des Navigationswidgets.", + "editorMarkerNavigationWarning": "Editormarkierung: Farbe bei Warnung des Navigationswidgets.", + "editorMarkerNavigationInfo": "Editormarkierung: Farbe bei Warnung des Navigationswidgets.", + "editorMarkerNavigationBackground": "Editormarkierung: Hintergrund des Navigationswidgets." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/deu/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..44bcefc08052 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Hovern anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/deu/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..f77f3adae72a --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Wird geladen..." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/deu/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..d29adae9acc4 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Durch vorherigen Wert ersetzen", + "InPlaceReplaceAction.next.label": "Durch nächsten Wert ersetzen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..e7136cd509f3 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Einzug in Leerzeichen konvertieren", + "indentationToTabs": "Einzug in Tabstopps konvertieren", + "configuredTabSize": "Konfigurierte Tabulatorgröße", + "selectTabWidth": "Tabulatorgröße für aktuelle Datei auswählen", + "indentUsingTabs": "Einzug mithilfe von Tabstopps", + "indentUsingSpaces": "Einzug mithilfe von Leerzeichen", + "detectIndentation": "Einzug aus Inhalt erkennen", + "editor.reindentlines": "Neuen Einzug für Zeilen festlegen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/deu/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..53bb9f3fd90c --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Zeile nach oben kopieren", + "lines.copyDown": "Zeile nach unten kopieren", + "lines.moveUp": "Zeile nach oben verschieben", + "lines.moveDown": "Zeile nach unten verschieben", + "lines.sortAscending": "Zeilen aufsteigend sortieren", + "lines.sortDescending": "Zeilen absteigend sortieren", + "lines.trimTrailingWhitespace": "Nachgestelltes Leerzeichen kürzen", + "lines.delete": "Zeile löschen", + "lines.indent": "Zeileneinzug", + "lines.outdent": "Zeile ausrücken", + "lines.insertBefore": "Zeile oben einfügen", + "lines.insertAfter": "Zeile unten einfügen", + "lines.deleteAllLeft": "Alle übrigen löschen", + "lines.deleteAllRight": "Alle rechts löschen", + "lines.joinLines": "Zeilen verknüpfen", + "editor.transpose": "Zeichen um den Cursor herum transponieren", + "editor.transformToUppercase": "In Großbuchstaben umwandeln", + "editor.transformToLowercase": "In Kleinbuchstaben umwandeln" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/links/links.i18n.json b/i18n/deu/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..e9f6f2ae5ada --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "BEFEHLSTASTE + Mausklick zum Aufrufen des Links", + "links.navigate": "STRG + Mausklick zum Aufrufen des Links", + "links.command.mac": "Cmd + Klick um Befehl auszuführen", + "links.command": "Ctrl + Klick um Befehl auszuführen.", + "links.navigate.al": "ALT + Mausklick zum Aufrufen des Links", + "links.command.al": "Alt + Klick um Befehl auszuführen.", + "invalid.url": "Fehler beim Öffnen dieses Links, weil er nicht wohlgeformt ist: {0}", + "missing.url": "Fehler beim Öffnen dieses Links, weil das Ziel fehlt.", + "label": "Link öffnen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/deu/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..66385866668a --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Cursor oberhalb hinzufügen", + "mutlicursor.insertBelow": "Cursor unterhalb hinzufügen", + "mutlicursor.insertAtEndOfEachLineSelected": "Cursor an Zeilenenden hinzufügen", + "addSelectionToNextFindMatch": "Auswahl zur nächsten Übereinstimmungssuche hinzufügen", + "addSelectionToPreviousFindMatch": "Letzte Auswahl zu vorheriger Übereinstimmungssuche hinzufügen", + "moveSelectionToNextFindMatch": "Letzte Auswahl in nächste Übereinstimmungssuche verschieben", + "moveSelectionToPreviousFindMatch": "Letzte Auswahl in vorherige Übereinstimmungssuche verschieben", + "selectAllOccurrencesOfFindMatch": "Alle Vorkommen auswählen und Übereinstimmung suchen", + "changeAll.label": "Alle Vorkommen ändern" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/deu/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..1ac221c353c8 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Parameterhinweise auslösen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..7979e4c08343 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, Hinweis" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..f55e57855179 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Korrekturen anzeigen ({0})", + "quickFix": "Korrekturen anzeigen", + "quickfix.trigger.label": "Schnelle Problembehebung" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..d057bbcc4077 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Schließen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..479f89ba296c --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " – {0} Verweise", + "references.action.label": "Alle Verweise suchen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..fab6f765b349 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Wird geladen..." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..76ca2b446f44 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "Symbol in {0} in Zeile {1}, Spalte {2}", + "aria.fileReferences.1": "1 Symbol in {0}, vollständiger Pfad {1}", + "aria.fileReferences.N": "{0} Symbole in {1}, vollständiger Pfad {2}", + "aria.result.0": "Es wurden keine Ergebnisse gefunden.", + "aria.result.1": "1 Symbol in {0} gefunden", + "aria.result.n1": "{0} Symbole in {1} gefunden", + "aria.result.nm": "{0} Symbole in {1} Dateien gefunden" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..358b448e65f6 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Fehler beim Auflösen der Datei.", + "referencesCount": "{0} Verweise", + "referenceCount": "{0} Verweis", + "missingPreviewMessage": "Keine Vorschau verfügbar.", + "treeAriaLabel": "Verweise", + "noResults": "Keine Ergebnisse", + "peekView.alternateTitle": "Verweise", + "peekViewTitleBackground": "Hintergrundfarbe des Titelbereichs der Peek-Ansicht.", + "peekViewTitleForeground": "Farbe des Titels in der Peek-Ansicht.", + "peekViewTitleInfoForeground": "Farbe der Titelinformationen in der Peek-Ansicht.", + "peekViewBorder": "Farbe der Peek-Ansichtsränder und des Pfeils.", + "peekViewResultsBackground": "Hintergrundfarbe der Ergebnisliste in der Peek-Ansicht.", + "peekViewResultsMatchForeground": "Vordergrundfarbe für Zeilenknoten in der Ergebnisliste der Peek-Ansicht.", + "peekViewResultsFileForeground": "Vordergrundfarbe für Dateiknoten in der Ergebnisliste der Peek-Ansicht.", + "peekViewResultsSelectionBackground": "Hintergrundfarbe des ausgewählten Eintrags in der Ergebnisliste der Peek-Ansicht.", + "peekViewResultsSelectionForeground": "Vordergrundfarbe des ausgewählten Eintrags in der Ergebnisliste der Peek-Ansicht.", + "peekViewEditorBackground": "Hintergrundfarbe des Peek-Editors.", + "peekViewEditorGutterBackground": "Hintergrundfarbe der Leiste im Peek-Editor.", + "peekViewResultsMatchHighlight": "Farbe für Übereinstimmungsmarkierungen in der Ergebnisliste der Peek-Ansicht.", + "peekViewEditorMatchHighlight": "Farbe für Übereinstimmungsmarkierungen im Peek-Editor." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/deu/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..0a095a2aa5ed --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Kein Ergebnis.", + "aria": "\"{0}\" erfolgreich in \"{1}\" umbenannt. Zusammenfassung: {2}", + "rename.failed": "Fehler bei der Ausführung der Umbenennung.", + "rename.label": "Symbol umbenennen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/deu/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..0c2f7ec3617f --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Benennen Sie die Eingabe um. Geben Sie einen neuen Namen ein, und drücken Sie die EINGABETASTE, um den Commit auszuführen." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/deu/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..cfef202b0404 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Auswahl erweitern", + "smartSelect.shrink": "Auswahl verkleinern" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/deu/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..634627ef2a58 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "Durch Annahme von \"{0}\" wurde folgender Text eingefügt: {1}", + "suggest.trigger.label": "Vorschlag auslösen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..df507c729f97 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Hintergrundfarbe des Vorschlagswidgets.", + "editorSuggestWidgetBorder": "Rahmenfarbe des Vorschlagswidgets.", + "editorSuggestWidgetForeground": "Vordergrundfarbe des Vorschlagswidgets.", + "editorSuggestWidgetSelectedBackground": "Hintergrundfarbe des ausgewählten Eintrags im Vorschlagswidget.", + "editorSuggestWidgetHighlightForeground": "Farbe der Trefferhervorhebung im Vorschlagswidget.", + "readMore": "Mehr anzeigen...{0}", + "suggestionWithDetailsAriaLabel": "{0}, Vorschlag, hat Details", + "suggestionAriaLabel": "{0}, Vorschlag", + "readLess": "Weniger anzeigen...{0}", + "suggestWidget.loading": "Wird geladen...", + "suggestWidget.noSuggestions": "Keine Vorschläge.", + "suggestionAriaAccepted": "{0}, angenommen", + "ariaCurrentSuggestionWithDetails": "{0}, Vorschlag, hat Details", + "ariaCurrentSuggestion": "{0}, Vorschlag" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/deu/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..8dfd4e195485 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "TAB-Umschalttaste verschiebt Fokus" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..d706ff2e9b2d --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Hintergrundfarbe eines Symbols beim Lesezugriff (beispielsweise beim Lesen einer Variablen).", + "wordHighlightStrong": "Hintergrundfarbe eines Symbols beim Schreibzugriff (beispielsweise beim Schreiben in eine Variable).", + "overviewRulerWordHighlightForeground": "Übersichtslineal-Markierungsfarbe für Symbolhervorhebungen.", + "overviewRulerWordHighlightStrongForeground": "Übersichtslineal-Markierungsfarbe für Schreibzugriffs-Symbolhervorhebungen.", + "wordHighlight.next.label": "Gehe zur nächsten Symbolhervorhebungen", + "wordHighlight.previous.label": "Gehe zur vorherigen Symbolhervorhebungen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/deu/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index cca30e421303..84248e647327 100644 --- a/i18n/deu/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/deu/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "Die Extension wurde nicht gefunden.", - "noCompatible": "Eine kompatible Version von {0} mit dieser Version des Codes wurde nicht gefunden." + "notCompatibleDownload": "Kann nicht heruntergeladen werden, da die Erweiterung, die mit der aktuellen VS Code Version '{0}' kompatibel ist, nicht gefunden werden kann. " } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 521e20ed207b..185a438a129a 100644 --- a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,12 @@ { "invalidManifest": "Die Erweiterung ist ungültig: \"package.json\" ist keine JSON-Datei.", "restartCodeLocal": "Bitte starten Sie Code vor der Neuinstallation von {0} neu.", - "restartCodeGallery": "Bitte vor der Neuinstallation VSCode neu starten.", + "override": "Überschreiben", + "cancel": "Abbrechen", + "notFoundCompatibleDependency": "Kann nicht installiert werden, da die abhängige Erweiterung '{0}', die mit der aktuellen VS Code Version '{1}' kompatibel ist, nicht gefunden werden kann. ", "uninstallDependeciesConfirmation": "Möchten Sie nur \"{0}\" oder auch die zugehörigen Abhängigkeiten deinstallieren?", "uninstallOnly": "Nur", "uninstallAll": "Alle", - "cancel": "Abbrechen", "uninstallConfirmation": "Möchten Sie \"{0}\" deinstallieren?", "ok": "OK", "singleDependentError": "Die Erweiterung \"{0}\" kann nicht deinstalliert werden. Die Erweiterung \"{1}\" hängt von dieser Erweiterung ab.", diff --git a/i18n/deu/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/deu/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..c0039e0b4452 --- /dev/null +++ b/i18n/deu/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "view": "Anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 842738eb0926..eea7eefe2988 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Vorherigen Editor öffnen", "nextEditorInGroup": "Nächsten Editor in der Gruppe öffnen", "openPreviousEditorInGroup": "Vorherigen Editor in der Gruppe öffnen", + "lastEditorInGroup": "Letzten Editor in der Gruppe öffnen", "navigateNext": "Weiter", "navigatePrevious": "Zurück", "navigateLast": "Zum Ende gehen", diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index 4660e615d21a..963d490097f5 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,6 @@ { "editorCommand.activeEditorMove.description": "Aktiven Editor nach Tabstopps oder Gruppen verschieben", "editorCommand.activeEditorMove.arg.name": "Argument zum Verschieben des aktiven Editors", - "editorCommand.activeEditorMove.arg.description": "Argumenteigenschaften:\n\t\t\t\t\t\t* \"to\": Ein Zeichenfolgenwert, der das Ziel des Verschiebungsvorgangs angibt.\n\t\t\t\t\t\t* \"by\": Ein Zeichenfolgenwert, der die Einheit für die Verschiebung angibt (nach Registerkarte oder nach Gruppe).\n\t\t\t\t\t\t* \"value\": Ein Zahlenwert, der angibt, um wie viele Positionen verschoben wird. Es kann auch die absolute Position für die Verschiebung angegeben werden.\n\t\t\t\t\t", "commandDeprecated": "Der Befehl **{0}** wurde entfernt. Sie können stattdessen **{1}** verwenden.", "openKeybindings": "Tastenkombinationen konfigurieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index fb5b37b00287..56317ca59e32 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -52,6 +52,5 @@ "screenReaderDetectedExplanation.question": "Verwenden Sie eine Sprachausgabe zum Bedienen von VS Code?", "screenReaderDetectedExplanation.answerYes": "Ja", "screenReaderDetectedExplanation.answerNo": "Nein", - "screenReaderDetectedExplanation.body1": "VS Code ist jetzt für die Verwendung mit einer Sprachausgabe optimiert. ", - "screenReaderDetectedExplanation.body2": "Einige Editorfunktionen weisen ein anderes Verhalten auf, z. B. in Bezug auf den Zeilenumbruch, Faltung, automatisches Schließen von Klammern usw." + "screenReaderDetectedExplanation.body1": "VS Code ist jetzt für die Verwendung mit einer Sprachausgabe optimiert. " } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/quickopen.i18n.json b/i18n/deu/src/vs/workbench/browser/quickopen.i18n.json index 89a7706d4824..ac7dedc6bd70 100644 --- a/i18n/deu/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "Keine übereinstimmenden Ergebnisse.", - "noResultsFound2": "Es wurden keine Ergebnisse gefunden.", - "entryAriaLabel": "{0}, Befehl" + "noResultsFound2": "Es wurden keine Ergebnisse gefunden." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json index bff17f6154d2..9c274f7fb044 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Zuletzt benutzt...", "quickOpenRecent": "Zuletzt benutzte schnell öffnen...", "closeMessages": "Benachrichtigungs-E-Mail schließen", - "reportIssues": "Probleme melden", + "reportIssueInEnglish": "Problem melden", "reportPerformanceIssue": "Leistungsproblem melden", "keybindingsReference": "Referenz für Tastenkombinationen", "openDocumentationUrl": "Dokumentation", @@ -47,5 +47,14 @@ "showNextWindowTab": "Nächste Fensterregisterkarte anzeigen", "moveWindowTabToNewWindow": "Fensterregisterkarte in neues Fenster verschieben", "mergeAllWindowTabs": "Alle Fenster zusammenführen", - "toggleWindowTabsBar": "Fensterregisterkarten-Leiste umschalten" + "toggleWindowTabsBar": "Fensterregisterkarten-Leiste umschalten", + "configureLocale": "Sprache konfigurieren", + "displayLanguage": "Definiert die Anzeigesprache von VSCode.", + "doc": "Unter {0} finden Sie eine Liste der unterstützten Sprachen.", + "restart": "Das Ändern dieses Wertes erfordert einen Neustart von VSCode.", + "fail.createSettings": "{0} ({1}) kann nicht erstellt werden.", + "debug": "Debuggen", + "info": "Info", + "warn": "Warnung", + "err": "Fehler" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index 2b8cdcfb0213..f90e322ae5f8 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Anzeigen", "help": "Hilfe", "file": "Datei", - "workspaces": "Arbeitsbereiche", "developer": "Entwickler", + "workspaces": "Arbeitsbereiche", "showEditorTabs": "Steuert, ob geöffnete Editoren auf Registerkarten angezeigt werden sollen.", "workbench.editor.labelFormat.default": "Zeigt den Namen der Datei. Wenn Registerkarten aktiviert sind und zwei Dateien in einer Gruppe den gleichen Namen haben, werden die unterscheidenden Abschnitte der Pfade jeder Datei hinzugefügt. Wenn die Registerkarten deaktiviert sind, wird der Pfad relativ zum Arbeitsbereich-Ordner angezeigt, wenn der Editor aktiv ist. ", "workbench.editor.labelFormat.short": "Den Namen der Datei anzeigen, gefolgt von dessen Verzeichnisnamen.", @@ -26,18 +26,16 @@ "closeOnFocusLost": "Steuert, ob Quick Open automatisch geschlossen werden soll, sobald das Feature den Fokus verliert.", "openDefaultSettings": "Steuert, ob beim Öffnen der Einstellungen auch ein Editor geöffnet wird, der alle Standardeinstellungen anzeigt.", "sideBarLocation": "Steuert die Position der Seitenleiste. Diese kann entweder links oder rechts von der Workbench angezeigt werden.", - "panelLocation": "Steuert die Position des Panels. Dieses kann entweder unter oder rechts der Workbench angezeigt werden.", "statusBarVisibility": "Steuert die Sichtbarkeit der Statusleiste im unteren Bereich der Workbench.", "activityBarVisibility": "Steuert die Sichtbarkeit der Aktivitätsleiste in der Workbench.", "closeOnFileDelete": "Steuert, ob Editoren, die eine Datei anzeigen, automatisch geschlossen werden sollen, wenn die Datei von einem anderen Prozess umbenannt oder gelöscht wird. Wenn Sie diese Option deaktivieren, bleibt der Editor bei einem solchen Ereignis als geändert offen. Bei Löschvorgängen innerhalb der Anwendung wird der Editor immer geschlossen, und geänderte Dateien werden nie geschlossen, damit Ihre Daten nicht verloren gehen.", - "experimentalFuzzySearchEndpoint": "Gibt den Endpunkt an, der für die experimentelle Einstellungssuche verwendet wird.", - "experimentalFuzzySearchKey": "Gibt den Schlüssel an, der für die experimentelle Einstellungssuche verwendet wird.", "fontAliasing": "Steuert die Schriftartaliasingmethode in der Workbench.\n- default: Subpixel-Schriftartglättung. Auf den meisten Nicht-Retina-Displays wird Text bei dieser Einstellung am schärfsten dargestellt.\n- antialiased: Glättet die Schriftart auf der Pixelebene (im Gegensatz zur Subpixelebene). Bei dieser Einstellung kann die Schriftart insgesamt heller wirken.\n- none: Deaktiviert die Schriftartglättung. Text wird mit gezackten scharfen Kanten dargestellt.\n", "workbench.fontAliasing.default": "Subpixel-Schriftartglättung. Auf den meisten Nicht-Retina-Displays wird Text bei dieser Einstellung am schärfsten dargestellt.", "workbench.fontAliasing.antialiased": "Glättet die Schriftart auf der Pixelebene (im Gegensatz zur Subpixelebene). Bei dieser Einstellung kann die Schriftart insgesamt heller wirken.", "workbench.fontAliasing.none": "Deaktiviert die Schriftartglättung. Text wird mit gezackten scharfen Kanten dargestellt.", "swipeToNavigate": "Hiermit navigieren Sie per waagrechtem Wischen mit drei Fingen zwischen geöffneten Dateien.", "workbenchConfigurationTitle": "Workbench", + "windowConfigurationTitle": "Fenster", "window.openFilesInNewWindow.on": "Dateien werden in einem neuen Fenster geöffnet.", "window.openFilesInNewWindow.off": "Dateien werden im Fenster mit dem geöffneten Dateiordner oder im letzten aktiven Fenster geöffnet.", "window.openFilesInNewWindow.default": "Dateien werden im Fenster mit dem geöffneten Dateiordner oder im letzten aktiven Fenster geöffnet, sofern sie nicht über das Dock oder den Finder geöffnet werden (nur MacOS).", @@ -69,11 +67,11 @@ "autoDetectHighContrast": "Ist diese Option aktiviert, erfolgt automatisch ein Wechsel zu einem Design mit hohem Kontrast, wenn Windows ein Design mit hohem Kontrast verwendet, und zu einem dunklen Design, wenn Sie für Windows kein Design mit hohem Kontrast mehr verwenden.", "titleBarStyle": "Passt das Aussehen der Titelleiste des Fensters an. Zum Anwenden der Änderungen ist ein vollständiger Neustart erforderlich.", "window.nativeTabs": "Aktiviert MacOS Sierra-Fensterregisterkarten. Beachten Sie, dass zum Übernehmen von Änderungen ein vollständiger Neustart erforderlich ist und durch ggf. konfigurierte native Registerkarten ein benutzerdefinierter Titelleistenstil deaktiviert wird.", - "windowConfigurationTitle": "Fenster", "zenModeConfigurationTitle": "Zen-Modus", "zenMode.fullScreen": "Steuert, ob die Workbench durch das Aktivieren des Zen-Modus in den Vollbildmodus wechselt.", "zenMode.hideTabs": "Steuert, ob die Workbench-Registerkarten durch Aktivieren des Zen-Modus ebenfalls ausgeblendet werden.", "zenMode.hideStatusBar": "Steuert, ob die Statusleiste im unteren Bereich der Workbench durch Aktivieren des Zen-Modus ebenfalls ausgeblendet wird.", "zenMode.hideActivityBar": "Steuert, ob die Aktivitätsleiste im linken Bereich der Workbench durch Aktivieren des Zen-Modus ebenfalls ausgeblendet wird.", - "zenMode.restore": "Steuert, ob ein Fenster im Zen-Modus wiederhergestellt werden soll, wenn es im Zen-Modus beendet wurde." + "zenMode.restore": "Steuert, ob ein Fenster im Zen-Modus wiederhergestellt werden soll, wenn es im Zen-Modus beendet wurde.", + "JsonSchema.locale": "Die zu verwendende Sprache der Benutzeroberfläche." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index a294a18039b7..465478c98bc0 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Haltepunkte deaktivieren", "reapplyAllBreakpoints": "Alle Haltepunkte erneut anwenden", "addFunctionBreakpoint": "Funktionshaltepunkt hinzufügen", - "renameFunctionBreakpoint": "Funktionshaltepunkt umbenennen", "addConditionalBreakpoint": "Bedingten Haltepunkt hinzufügen...", "editConditionalBreakpoint": "Haltepunkt bearbeiten...", "setValue": "Wert festlegen", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..0d1413f84f9d --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Haltepunkt bearbeiten...", + "functionBreakpointsNotSupported": "Funktionshaltepunkte werden von diesem Debugtyp nicht unterstützt.", + "functionBreakpointPlaceholder": "Funktion mit Haltepunkt", + "functionBreakPointInputAriaLabel": "Geben Sie den Funktionshaltepunkt ein." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..41bf2194e2d6 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Aufruflistenabschnitt", + "debugStopped": "Angehalten bei {0}", + "callStackAriaLabel": "Aufrufliste debuggen", + "process": "Prozess", + "paused": "Angehalten", + "running": "Wird ausgeführt", + "thread": "Thread", + "pausedOn": "Angehalten bei {0}", + "loadMoreStackFrames": "Weitere Stapelrahmen laden", + "threadAriaLabel": "Thread {0}, Aufrufliste, Debuggen", + "stackFrameAriaLabel": "Stapelrahmen {0} Zeile {1} {2}, Aufrufliste, Debuggen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 823e29f8a004..374a6cc55501 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "Der Haltepunkt wurde hinzugefügt. Zeile {0}, Datei \"{1}\".", "breakpointRemoved": "Der Haltepunkt wurde entfernt. Zeile {0}, Datei \"{1}\".", "compoundMustHaveConfigurations": "Für den Verbund muss das Attribut \"configurations\" festgelegt werden, damit mehrere Konfigurationen gestartet werden können.", - "configMissing": "Konfiguration \"{0}\" fehlt in \"launch.json\".", "debugRequestNotSupported": "Das Attribut \"{0}\" hat in der ausgewählten Debugkonfiguration den nicht unterstützten Wert \"{1}\".", "debugRequesMissing": "Das Attribut \"{0}\" fehlt in der ausgewählten Debugkonfiguration.", "debugTypeNotSupported": "Der konfigurierte Debugtyp \"{0}\" wird nicht unterstützt.", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..c0d45dcc55f5 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Variablenabschnitt", + "variablesAriaTreeLabel": "Variablen debuggen", + "variableValueAriaLabel": "Geben Sie einen neuen Variablenwert ein.", + "variableScopeAriaLabel": "Bereich {0}, Variablen, Debuggen", + "variableAriaLabel": "{0} Wert {1}, Variablen, Debuggen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..7ee449cec7d3 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "Ausdrucksabschnitt", + "watchAriaTreeLabel": "Überwachungsausdrücke debuggen", + "watchExpressionPlaceholder": "Zu überwachender Ausdruck", + "watchExpressionInputAriaLabel": "Geben Sie den Überwachungsausdruck ein.", + "watchExpressionAriaLabel": "{0} Wert {1}, Überwachen, Debuggen", + "watchVariableAriaLabel": "{0} Wert {1}, Überwachen, Debuggen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 625d2c1f1ce1..0d5b18753ba9 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Wird deinstalliert", "updateAction": "Aktualisieren", "updateTo": "Auf \"{0}\" aktualisieren", - "enableForWorkspaceAction.label": "Aktivieren (Arbeitsbereich)", - "enableAlwaysAction.label": "Aktivieren (immer)", - "disableForWorkspaceAction.label": "Deaktivieren (Arbeitsbereich)", - "disableAlwaysAction.label": "Deaktivieren (immer)", "ManageExtensionAction.uninstallingTooltip": "Wird deinstalliert", - "enableForWorkspaceAction": "Arbeitsbereich", - "enableGloballyAction": "Immer", + "enableForWorkspaceAction": "Aktivieren (Arbeitsbereich)", + "enableGloballyAction": "Aktivieren", "enableAction": "Aktivieren", - "disableForWorkspaceAction": "Arbeitsbereich", - "disableGloballyAction": "Immer", + "disableForWorkspaceAction": "Deaktivieren (Arbeitsbereich)", + "disableGloballyAction": "Deaktivieren", "disableAction": "Deaktivieren", "checkForUpdates": "Nach Updates suchen", "enableAutoUpdate": "Aktivere die automatische Aktualisierung von Erweiterungen", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Alle für diesen Arbeitsbereich empfohlenen Erweiterungen wurden bereits installiert.", "installRecommendedExtension": "Empfohlene Erweiterung installieren", "extensionInstalled": "Die empfohlene Erweiterung wurde bereits installiert.", - "showRecommendedKeymapExtensions": "Empfohlene Tastenzuordnungen anzeigen", "showRecommendedKeymapExtensionsShort": "Tastenzuordnungen", - "showLanguageExtensions": "Spracherweiterungen anzeigen", "showLanguageExtensionsShort": "Spracherweiterungen", - "showAzureExtensions": "Azure-Erweiterungen anzeigen", "showAzureExtensionsShort": "Azure-Erweiterungen", "OpenExtensionsFile.failed": "Die Datei \"extensions.json\" kann nicht im Ordner \".vscode\" erstellt werden ({0}).", "configureWorkspaceRecommendedExtensions": "Empfohlene Erweiterungen konfigurieren (Arbeitsbereich)", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index 18b47398935e..576288a75d36 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -9,7 +9,7 @@ "extension": "Erweiterung", "extensions": "Erweiterungen", "view": "Anzeigen", + "developer": "Entwickler", "extensionsConfigurationTitle": "Erweiterungen", - "extensionsAutoUpdate": "Erweiterungen automatisch aktualisieren", - "extensionsIgnoreRecommendations": "Erweiterungsempfehlungen ignorieren" + "extensionsAutoUpdate": "Erweiterungen automatisch aktualisieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..af3cf4505942 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reportExtensionIssue": "Problem melden" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..77d792d6a705 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Ordner" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..46de1e8541a8 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Datei", + "revealInSideBar": "In Seitenleiste anzeigen", + "acceptLocalChanges": "Änderungen verwenden und Datenträgerinhalte überschreiben", + "revertLocalChanges": "Änderungen verwerfen und Datenträgerinhalte wiederherstellen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..146bfaf2e064 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Wiederholen", + "rename": "Umbenennen", + "newFile": "Neue Datei", + "newFolder": "Neuer Ordner", + "openFolderFirst": "Öffnet zuerst einen Ordner, in dem Dateien oder Ordner erstellt werden.", + "newUntitledFile": "Neue unbenannte Datei", + "createNewFile": "Neue Datei", + "createNewFolder": "Neuer Ordner", + "deleteButtonLabelRecycleBin": "&&In Papierkorb verschieben", + "deleteButtonLabelTrash": "&&In Papierkorb verschieben", + "deleteButtonLabel": "&&Löschen", + "dirtyMessageFolderOneDelete": "Sie löschen einen Ordner mit nicht gespeicherten Änderungen in einer Datei. Möchten Sie den Vorgang fortsetzen?", + "dirtyMessageFolderDelete": "Sie löschen einen Ordner mit nicht gespeicherten Änderungen in {0} Dateien. Möchten Sie den Vorgang fortsetzen?", + "dirtyMessageFileDelete": "Sie löschen eine Datei mit nicht gespeicherten Änderungen. Möchten Sie den Vorgang fortsetzen?", + "dirtyWarning": "Ihre Änderungen gehen verloren, wenn Sie diese nicht speichern.", + "confirmMoveTrashMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich löschen?", + "confirmMoveTrashMessageFile": "Möchten Sie \"{0}\" wirklich löschen?", + "undoBin": "Die Wiederherstellung kann aus dem Papierkorb erfolgen.", + "undoTrash": "Die Wiederherstellung kann aus dem Papierkorb erfolgen.", + "doNotAskAgain": "Nicht erneut fragen", + "confirmDeleteMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich endgültig löschen?", + "confirmDeleteMessageFile": "Möchten Sie \"{0}\" wirklich endgültig löschen?", + "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", + "permDelete": "Endgültig löschen", + "delete": "Löschen", + "importFiles": "Dateien importieren", + "confirmOverwrite": "Im Zielordner ist bereits eine Datei oder ein Ordner mit dem gleichen Namen vorhanden. Möchten Sie sie bzw. ihn ersetzen?", + "replaceButtonLabel": "&&Ersetzen", + "copyFile": "Kopieren", + "pasteFile": "Einfügen", + "duplicateFile": "Duplikat", + "openToSide": "Zur Seite öffnen", + "compareSource": "Für Vergleich auswählen", + "globalCompareFile": "Aktive Datei vergleichen mit...", + "openFileToCompare": "Zuerst eine Datei öffnen, um diese mit einer anderen Datei zu vergleichen", + "compareWith": "'{0}' mit '{1}' vergleichen", + "compareFiles": "Dateien vergleichen", + "refresh": "Aktualisieren", + "save": "Speichern", + "saveAs": "Speichern unter...", + "saveAll": "Alle speichern", + "saveAllInGroup": "Alle in der Gruppe speichern", + "saveFiles": "Alle Dateien speichern", + "revert": "Datei wiederherstellen", + "focusOpenEditors": "Fokus auf Ansicht \"Geöffnete Editoren\"", + "focusFilesExplorer": "Fokus auf Datei-Explorer", + "showInExplorer": "Aktive Datei in Seitenleiste anzeigen", + "openFileToShow": "Öffnet zuerst eine Datei, um sie im Explorer anzuzeigen.", + "collapseExplorerFolders": "Ordner im Explorer zuklappen", + "refreshExplorer": "Explorer aktualisieren", + "openFileInNewWindow": "Aktive Datei in neuem Fenster öffnen", + "openFileToShowInNewWindow": "Datei zuerst öffnen, um sie in einem neuen Fenster zu öffnen", + "revealInWindows": "Im Explorer anzeigen", + "revealInMac": "Im Finder anzeigen", + "openContainer": "Enthaltenden Ordner öffnen", + "revealActiveFileInWindows": "Aktive Datei im Windows-Explorer anzeigen", + "revealActiveFileInMac": "Aktive Datei im Finder anzeigen", + "openActiveFileContainer": "Enthaltenden Ordner der aktiven Datei öffnen", + "copyPath": "Pfad kopieren", + "copyPathOfActive": "Pfad der aktiven Datei kopieren", + "emptyFileNameError": "Es muss ein Datei- oder Ordnername angegeben werden.", + "fileNameExistsError": "Eine Datei oder ein Ordner **{0}** ist an diesem Ort bereits vorhanden. Wählen Sie einen anderen Namen.", + "invalidFileNameError": "Der Name **{0}** ist als Datei- oder Ordnername ungültig. Bitte wählen Sie einen anderen Namen aus.", + "filePathTooLongError": "Der Name **{0}** führt zu einem Pfad, der zu lang ist. Wählen Sie einen kürzeren Namen.", + "compareWithSaved": "Aktive Datei mit gespeicherter Datei vergleichen", + "modifiedLabel": "{0} (auf Datenträger) ↔ {1}" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..c248ffc56821 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Datei zuerst öffnen, um ihren Pfad zu kopieren", + "openFileToReveal": "Datei zuerst öffnen, um sie anzuzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..00a2164ceaa6 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Explorer anzeigen", + "explore": "Explorer", + "view": "Anzeigen", + "textFileEditor": "Textdatei-Editor", + "binaryFileEditor": "Binärdatei-Editor", + "filesConfigurationTitle": "Dateien", + "exclude": "Konfigurieren Sie Globmuster zum Ausschließen von Dateien und Ordnern. Zum Beispiel entscheidet Explorer welche Dateien und Ordner gezeigt oder ausgeblendet werden anhand dieser Einstellung.", + "files.exclude.boolean": "Das Globmuster, mit dem Dateipfade verglichen werden sollen. Legen Sie diesen Wert auf \"true\" oder \"false\" fest, um das Muster zu aktivieren bzw. zu deaktivieren.", + "files.exclude.when": "Zusätzliche Überprüfung der gleichgeordneten Elemente einer entsprechenden Datei. Verwenden Sie \"$(basename)\" als Variable für den entsprechenden Dateinamen.", + "associations": "Konfigurieren Sie Dateizuordnungen zu Sprachen (beispielsweise \"*.extension\": \"html\"). Diese besitzen Vorrang vor den Standardzuordnungen der installierten Sprachen.", + "encoding": "Die Standardzeichensatz-Codierung, die beim Lesen und Schreiben von Dateien verwendet werden soll. Diese Einstellung kann auch pro Sprache konfiguriert werden.", + "autoGuessEncoding": "Wenn diese Option aktiviert ist, wird beim Öffnen von Dateien versucht, die Zeichensatzcodierung automatisch zu ermitteln. Diese Einstellung kann auch pro Sprache konfiguriert werden.", + "eol": "Das Zeilenende-Standardzeichen. Verwenden Sie \\n für LF und \\r\\n für CRLF.", + "trimTrailingWhitespace": "Bei Aktivierung werden nachgestellte Leerzeichen beim Speichern einer Datei gekürzt.", + "insertFinalNewline": "Bei Aktivierung wird beim Speichern einer Datei eine abschließende neue Zeile am Dateiende eingefügt.", + "trimFinalNewlines": "Wenn diese Option aktiviert ist, werden beim Speichern alle neuen Zeilen nach der abschließenden neuen Zeile am Dateiende gekürzt.", + "files.autoSave.off": "Eine geänderte Datei wird nie automatisch gespeichert.", + "files.autoSave.afterDelay": "Eine geänderte Datei wird automatisch nach der konfigurierten \"files.autoSaveDelay\" gespeichert.", + "files.autoSave.onFocusChange": "Eine geänderte Datei wird automatisch gespeichert, wenn der Editor den Fokus verliert.", + "files.autoSave.onWindowChange": "Eine geänderte Datei wird automatisch gespeichert, wenn das Fenster den Fokus verliert.", + "autoSave": "Steuert die automatische Speicherung geänderter Dateien. Zulässige Werte: \"{0}\", \"{1}\", \"{2}\" (Editor verliert den Fokus), \"{3}\" (Fenster verliert den Fokus). Wenn diese Angabe auf \"{4}\" festgelegt ist, können Sie die Verzögerung in \"files.autoSaveDelay\" konfigurieren.", + "autoSaveDelay": "Steuert die Verzögerung in Millisekunden, nach der eine geänderte Datei automatisch gespeichert wird. Nur gültig, wenn \"files.autoSave\" auf \"{0}\" festgelegt ist.", + "watcherExclude": "Konfigurieren Sie Globmuster von Dateipfaden, die von der Dateiüberwachung ausgeschlossen werden sollen. Muster müssen in absoluten Pfaden übereinstimmen (d. h. für eine korrekte Überstimmung muss das Präfix ** oder der vollständige Pfad verwendet werden). Das Ändern dieser Einstellung erfordert einen Neustart. Wenn Ihr Code beim Start viel CPU-Zeit beansprucht, können Sie große Ordner ausschließen, um die anfängliche Last zu verringern.", + "hotExit.off": "Hot Exit deaktivieren.", + "hotExit.onExit": "Hot Exit wird beim Schließen der Anwendung ausgelöst, d. h. wenn unter Windows/Linux das letzte Fenster geschlossen wird oder wenn der Befehl \"workbench.action.quit\" ausgelöst wird (Befehlspalette, Tastenzuordnung, Menü). Alle Fenster mit Sicherungen werden beim nächsten Start wiederhergestellt.", + "hotExit.onExitAndWindowClose": "Hot Exit wird beim Schließen der Anwendung, d. h. wenn unter Windows/Linux das letzte Fenster geschlossen wird, oder beim Auslösen des Befehls \"workbench.action.quit\" (Befehlspalette, Tastenzuordnung, Menü) sowie für jedes Fenster mit einem geöffneten Ordner ausgelöst, unabhängig davon, ob es das letzte Fenster ist. Alle Fenster ohne geöffnete Ordner werden beim nächsten Start wiederhergestellt. Legen Sie window.restoreWindows auf \"all\" fest, um Ordnerfenster im Zustand vor dem Herunterfahren wiederherzustellen. ", + "hotExit": "Steuert, ob nicht gespeicherten Dateien zwischen den Sitzungen beibehlten werden, die Aufforderung zum Speichern wird beim Beenden des Editors übersprungen.", + "useExperimentalFileWatcher": "Verwenden Sie die neue experimentelle Dateiüberwachung.", + "defaultLanguage": "Der Standardsprachmodus, der neuen Dateien zugewiesen wird.", + "editorConfigurationTitle": "Editor", + "formatOnSave": "Hiermit wird eine Datei beim Speichern formatiert. Es muss ein Formatierer vorhanden sein, die Datei darf nicht automatisch gespeichert werden, und der Editor darf nicht geschlossen werden.", + "explorerConfigurationTitle": "Datei-Explorer", + "openEditorsVisible": "Die Anzahl der Editoren, die im Bereich \"Geöffnete Editoren\" angezeigt werden. Legen Sie diesen Wert auf 0 fest, um den Bereich auszublenden.", + "dynamicHeight": "Steuert, ob sich die Höhe des Abschnitts \"Geöffnete Editoren\" dynamisch an die Anzahl der Elemente anpassen soll.", + "autoReveal": "Steuert, ob der Explorer Dateien beim Öffnen automatisch anzeigen und auswählen soll.", + "enableDragAndDrop": "Steuert, ob der Explorer das Verschieben von Dateien und Ordnern mithilfe von Drag Drop zulassen soll.", + "confirmDragAndDrop": "Steuert, ob der Explorer um Bestätigung bittet, um Dateien und Ordner per Drag & Drop zu verschieben.", + "confirmDelete": "Steuert, ob der Explorer um Bestätigung bitten soll, wenn Sie eine Datei über den Papierkorb löschen.", + "sortOrder.default": "Dateien und Ordner werden nach ihren Namen in alphabetischer Reihenfolge sortiert. Ordner werden vor Dateien angezeigt. ", + "sortOrder.mixed": "Dateien und Ordner werden nach ihren Namen in alphabetischer Reihenfolge sortiert. Dateien und Ordner werden vermischt angezeigt.", + "sortOrder.filesFirst": "Dateien und Ordner werden nach ihren Namen in alphabetischer Reihenfolge sortiert. Dateien werden vor Ordnern angezeigt.", + "sortOrder.type": "Dateien und Ordner werden nach ihren Erweiterungen in alphabetischer Reihenfolge sortiert. Ordner werden vor Dateien angezeigt.", + "sortOrder.modified": "Dateien und Ordner werden nach dem letzten Änderungsdatum in absteigender Reihenfolge sortiert. Ordner werden vor Dateien angezeigt.", + "sortOrder": "Steuert die Sortierreihenfolge von Dateien und Ordnern im Explorer. Zusätzlich zur Standardsortierreihenfolge können Sie die Reihenfolge auf \"mixed\" (kombinierte Sortierung von Dateien und Ordnern), \"type\" (nach Dateityp), \"modified\" (nach letztem Änderungsdatum) oder \"filesFirst\" (Dateien vor Ordnern anzeigen) festlegen.", + "explorer.decorations.colors": "Steuert, ob Dateidekorationen Farben verwenden.", + "explorer.decorations.badges": "Steuert, ob Dateidekorationen Badges verwenden." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..55ed6344bee5 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Verwenden Sie die Aktionen auf der Editor-Symbolleiste auf der rechten Seite, um Ihre Änderungen **rückgängig zu machen** oder den Inhalt auf dem Datenträger mit Ihren Änderungen zu **überschreiben**.", + "discard": "Verwerfen", + "overwrite": "Überschreiben", + "retry": "Wiederholen", + "readonlySaveError": "Fehler beim Speichern von \"{0}\": Die Datei ist schreibgeschützt. Wählen Sie 'Überschreiben' aus, um den Schutz aufzuheben.", + "genericSaveError": "Fehler beim Speichern von \"{0}\": {1}.", + "staleSaveError": "Fehler beim Speichern von \"{0}\": Der Inhalt auf dem Datenträger ist neuer. Klicken Sie auf **Vergleichen**, um Ihre Version mit der Version auf dem Datenträger zu vergleichen.", + "compareChanges": "Vergleichen", + "saveConflictDiffLabel": "{0} (auf Datenträger) ↔ {1} (in {2}): Speicherkonflikt lösen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..47a84100588d --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Es ist kein Ordner geöffnet.", + "explorerSection": "Datei-Explorer-Abschnitt", + "noWorkspaceHelp": "Sie haben noch keinen Ordner zum Arbeitsbereich hinzugefügt.", + "noFolderHelp": "Sie haben noch keinen Ordner geöffnet.", + "openFolder": "Ordner öffnen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..e516583e8802 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Explorer", + "canNotResolve": "Arbeitsbereichsordner kann nicht aufgelöst werden." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..7846976127c9 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Datei-Explorer-Abschnitt", + "treeAriaLabel": "Datei-Explorer" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..9ec12051af92 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Geben Sie den Dateinamen ein. Drücken Sie zur Bestätigung die EINGABETASTE oder ESC, um den Vorgang abzubrechen.", + "filesExplorerViewerAriaLabel": "{0}, Datei-Explorer", + "dropFolders": "Möchten Sie die Ordner zum Arbeitsbereich hinzufügen?", + "dropFolder": "Möchten Sie den Ordner zum Arbeitsbereich hinzufügen?", + "addFolders": "&&Ordner hinzufügen", + "addFolder": "&&Ordner hinzufügen", + "doNotAskAgain": "Nicht erneut fragen", + "moveButtonLabel": "&&Verschieben", + "confirmOverwriteMessage": "{0} ist im Zielordner bereits vorhanden. Möchten Sie das Element ersetzen?", + "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", + "replaceButtonLabel": "&&Ersetzen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..a5003c845394 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Geöffnete Editoren", + "openEditosrSection": "Abschnitt \"Geöffnete Editoren\"", + "dirtyCounter": "{0} nicht gespeichert", + "saveAll": "Alle speichern", + "closeAllUnmodified": "Nicht geänderte schließen", + "closeAll": "Alle schließen", + "compareWithSaved": "Mit gespeicherter Datei vergleichen", + "close": "Schließen", + "closeOthers": "Andere schließen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..aebc78950721 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, Editor-Gruppe", + "openEditorAriaLabel": "{0}, geöffnete Editoren", + "saveAll": "Alle speichern", + "closeAllUnmodified": "Nicht geänderte schließen", + "closeAll": "Alle schließen", + "compareWithSaved": "Mit gespeicherter Datei vergleichen", + "close": "Schließen", + "closeOthers": "Andere schließen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/common/messages.i18n.json index d2105c83afe3..162edd8cdb47 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,6 @@ { "viewCategory": "Anzeigen", "problems.view.toggle.label": "Probleme umschalten", - "problems.view.show.label": "Probleme anzeigen", - "problems.view.hide.label": "Probleme ausblenden", "problems.panel.configuration.title": "Ansicht \"Probleme\"", "problems.panel.configuration.autoreveal": "Steuert, ob die Ansicht \"Probleme\" automatisch Dateien anzeigen sollte, wenn diese geöffnet werden.", "markers.panel.title.problems": "Probleme", diff --git a/i18n/deu/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/deu/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..4aa1862f5ccb --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "Profile wurden erfolgreich erstellt.", + "prof.detail": "Erstellen Sie ein Problem, und fügen Sie die folgenden Dateien manuell an:\n{0}", + "prof.restartAndFileIssue": "Problem erstellen und neu starten", + "prof.restart": "Neu starten", + "prof.thanks": "Danke für Ihre Hilfe.", + "prof.detail.restart": "Ein abschließender Neustart ist erforderlich um '{0}' nutzen zu können. Danke für Ihre Hilfe." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 911b6e025483..80ed5ad65892 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "Betätigen Sie die gewünschte Tastenkombination und die Eingabetaste. Drücken Sie zum Abbrechen auf ESC.", "defineKeybinding.chordsTo": "Tastenkombination zu" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index b5dc5a9cd693..330233e47256 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "Tastenzuordnung ändern", "addKeybindingLabelWithKey": "Tastenbindung hinzufügen {0}", "addKeybindingLabel": "Tastenzuordnung hinzufügen", + "title": "{0} ({1})", "commandAriaLabel": "Befehl: {0}.", "keybindingAriaLabel": "Tastenzuordnung: {0}.", "noKeybinding": "Keine Tastenzuordnung zugewiesen.", diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 4a6cbbeb787d..87d9424b74d0 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Standardeinstellungen", "SearchSettingsWidget.AriaLabel": "Einstellungen suchen", "SearchSettingsWidget.Placeholder": "Einstellungen suchen", - "totalSettingsMessage": "Insgesamt {0} Einstellungen", "noSettingsFound": "Keine Ergebnisse", "oneSettingFound": "1 Einstellung zugeordnet", "settingsFound": "{0} Einstellungen zugeordnet", - "fileEditorWithInputAriaLabel": "{0}. Textdatei-Editor.", - "fileEditorAriaLabel": "Textdatei-Editor", + "totalSettingsMessage": "Insgesamt {0} Einstellungen", + "defaultSettings": "Standardeinstellungen", + "defaultFolderSettings": "Standardordnereinstellungen", "defaultEditorReadonly": "Nehmen Sie im Editor auf der rechten Seite Änderungen vor, um Standardwerte zu überschreiben.", "preferencesAriaLabel": "Standardeinstellungen. Schreibgeschützter Text-Editor." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index e45478f5abff..cbf70edcf6a9 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Platzieren Sie Ihre Einstellungen hier, um die Standardeinstellungen zu überschreiben.", "emptyWorkspaceSettingsHeader": "Platzieren Sie Ihre Einstellungen hier, um die Benutzereinstellungen zu überschreiben.", "emptyFolderSettingsHeader": "Platzieren Sie Ihre Ordnereinstellungen hier, um die Einstellungen in den Arbeitsbereichseinstellungen zu überschreiben.", - "defaultFolderSettingsTitle": "Standardordnereinstellungen", - "defaultSettingsTitle": "Standardeinstellungen", "editTtile": "Bearbeiten", "replaceDefaultValue": "In Einstellungen ersetzen", "copyDefaultValue": "In Einstellungen kopieren", diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 9358ff2d2111..bd64052e34bd 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Testen Sie die Fuzzysuche!", "defaultSettings": "Platzieren Sie Ihre Einstellungen zum Überschreiben im Editor auf der rechten Seite.", "noSettingsFound": "Keine Einstellungen gefunden.", - "folderSettingsDetails": "Ordnereinstellungen", - "enableFuzzySearch": "Experimentelle Fuzzysuche aktivieren" + "settingsSwitcherBarAriaLabel": "Einstellungsumschaltung", + "userSettings": "Benutzereinstellungen", + "workspaceSettings": "Arbeitsbereichseinstellungen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..e0f0a6f36c4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Standardeditor für Einstellungen", + "keybindingsEditor": "Editor für Tastenzuordnungen", + "preferences": "Einstellungen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index c5c0985f4fc6..6119d2359c65 100644 --- a/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Quellcodeanbieter", "hideRepository": "Ausblenden", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Installiere weiter SCM Provider...", "no open repo": "Es gibt keine aktiven Quellcodeanbieter.", "source control": "Quellcodeverwaltung", diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 04a624657a6f..103e50639f41 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -4,7 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultLabel": "Eingabe", - "useIgnoreFilesDescription": "Ignorieren von Dateien verwenden", - "useExcludeSettingsDescription": "Ausschlusseinstellungen verwenden" + "defaultLabel": "Eingabe" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 577d7a656ebc..a765a1ac06fc 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "Das Globmuster, mit dem Dateipfade verglichen werden sollen. Legen Sie diesen Wert auf \"true\" oder \"false\" fest, um das Muster zu aktivieren bzw. zu deaktivieren.", "exclude.when": "Zusätzliche Überprüfung der gleichgeordneten Elemente einer entsprechenden Datei. Verwenden Sie \"$(basename)\" als Variable für den entsprechenden Dateinamen.", "useRipgrep": "Steuert, ob \"ripgrep\" in der Text- und Dateisuche verwendet wird.", - "useIgnoreFilesByDefault": "Steuert, ob bei der Suche nach Text in einem neuen Arbeitsbereich standardmäßig GITIGNORE- und IGNORE-Dateien verwendet werden.", "useIgnoreFiles": "Steuert, ob bei der Suche nach Dateien GITIGNORE- und IGNORE-Dateien verwendet werden.", "search.quickOpen.includeSymbols": "Konfigurieren Sie diese Option, um Ergebnisse aus einer globalen Symbolsuche in die Dateiergebnisse für Quick Open einzuschließen.", "search.followSymlinks": "Steuert, ob Symlinks während der Suche gefolgt werden." diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 5a178e2f2fa2..f4671bfc3a89 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Vorheriges Suchausschlussmuster anzeigen", "nextSearchTerm": "Nächsten Suchbegriff anzeigen", "previousSearchTerm": "Vorherigen Suchbegriff anzeigen", - "focusNextInputBox": "Fokus im nächsten Eingabefeld", - "focusPreviousInputBox": "Fokus im vorherigen Eingabefeld", "showSearchViewlet": "Suche anzeigen", "findInFiles": "In Dateien suchen", "findInFilesWithSelectedText": "In Dateien mit ausgewähltem Text suchen", "replaceInFiles": "In Dateien ersetzen", "replaceInFilesWithSelectedText": "In Dateien mit ausgewähltem Text ersetzen", - "findInWorkspace": "In Arbeitsbereich suchen...", - "findInFolder": "In Ordner suchen...", "RefreshAction.label": "Aktualisieren", - "ClearSearchResultsAction.label": "Suchergebnisse löschen", + "CollapseDeepestExpandedLevelAction.label": "Alle zuklappen", + "ClearSearchResultsAction.label": "Löschen", "FocusNextSearchResult.label": "Fokus auf nächstes Suchergebnis", "FocusPreviousSearchResult.label": "Fokus auf vorheriges Suchergebnis", "RemoveAction.label": "Schließen", diff --git a/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..a765a1ac06fc --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Zu Symbol im Arbeitsbereich wechseln...", + "name": "Suchen", + "search": "Suchen", + "view": "Anzeigen", + "openAnythingHandlerDescription": "Zu Datei wechseln", + "openSymbolDescriptionNormal": "Zu Symbol im Arbeitsbereich wechseln", + "searchOutputChannelTitle": "Suchen", + "searchConfigurationTitle": "Suchen", + "exclude": "Konfigurieren Sie Globmuster zum Ausschließen von Dateien und Ordnern in Suchvorgängen. Alle Globmuster werden von der files.exclude-Einstellung geerbt.", + "exclude.boolean": "Das Globmuster, mit dem Dateipfade verglichen werden sollen. Legen Sie diesen Wert auf \"true\" oder \"false\" fest, um das Muster zu aktivieren bzw. zu deaktivieren.", + "exclude.when": "Zusätzliche Überprüfung der gleichgeordneten Elemente einer entsprechenden Datei. Verwenden Sie \"$(basename)\" als Variable für den entsprechenden Dateinamen.", + "useRipgrep": "Steuert, ob \"ripgrep\" in der Text- und Dateisuche verwendet wird.", + "useIgnoreFiles": "Steuert, ob bei der Suche nach Dateien GITIGNORE- und IGNORE-Dateien verwendet werden.", + "search.quickOpen.includeSymbols": "Konfigurieren Sie diese Option, um Ergebnisse aus einer globalen Symbolsuche in die Dateiergebnisse für Quick Open einzuschließen.", + "search.followSymlinks": "Steuert, ob Symlinks während der Suche gefolgt werden." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/deu/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..b9ef9877508b --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "In Ordner suchen...", + "findInWorkspace": "In Arbeitsbereich suchen..." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index b4b3f22afbb8..00be7fe56b69 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,9 +6,7 @@ { "tasksCategory": "Aufgaben", "ConfigureTaskRunnerAction.label": "Aufgabe konfigurieren", - "ConfigureBuildTaskAction.label": "Buildtask konfigurieren", "CloseMessageAction.label": "Schließen", - "ShowTerminalAction.label": "Terminal anzeigen", "problems": "Probleme", "manyMarkers": "mehr als 99", "runningTasks": "Aktive Aufgaben anzeigen", @@ -52,7 +50,6 @@ "TaslService.noEntryToRun": "Es wurde keine auszuführende Aufgabe gefunden. Aufgaben konfigurieren...", "TaskService.fetchingBuildTasks": "Buildaufgaben werden abgerufen...", "TaskService.pickBuildTask": "Auszuführende Buildaufgabe auswählen", - "TaskService.noBuildTask": "Es wurde keine auszuführende Buildaufgabe gefunden. Aufgaben konfigurieren...", "TaskService.fetchingTestTasks": "Testaufgaben werden abgerufen...", "TaskService.pickTestTask": "Auszuführende Testaufgabe auswählen", "TaskService.noTestTaskTerminal": "Es wurde keine auszuführende Testaufgabe gefunden. Aufgaben konfigurieren...", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 89dde23b864b..5b756d8c2217 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,6 @@ "ConfigurationParser.noTypeDefinition": "Fehler: Der registrierte Aufgabentyp \"{0}\" ist nicht vorhanden. Wurde möglicherweise eine Erweiterung nicht installiert, die den entsprechenden Aufgabenanbieter bereitstellt?", "ConfigurationParser.missingRequiredProperty": "Fehler: Die Aufgabenkonfiguration \"{0}\" enthält die erforderlich Eigenschaft \"{1}\" nicht. Die Aufgabenkonfiguration wird ignoriert.", "ConfigurationParser.notCustom": "Fehler: Die Aufgabe ist nicht als benutzerdefinierte Aufgabe deklariert. Die Konfiguration wird ignoriert.\n{0}\n", - "ConfigurationParser.noTaskName": "Fehler: Tasks müssen eine Eigenschaft \"TaskName\" angeben. Der Task wird ignoriert.\n{0}\n", - "taskConfiguration.shellArgs": "Warnung: Die Aufgabe \"{0}\" ist ein Shellbefehl, und der Befehlsname oder eines seiner Argumente enthält Leerzeichen ohne Escapezeichen. Führen Sie Argumente im Befehl zusammen, um eine korrekte Angabe der Befehlszeile sicherzustellen.", "taskConfiguration.noCommandOrDependsOn": "Fehler: Aufgabe \"{0}\" definiert keinen Befehl bzw. keine depondsOn-Eigenschaft. Die Aufgabe wird ignoriert. Die Definition lautet:\n{1}", "taskConfiguration.noCommand": "Fehler: Aufgabe \"{0}\" definiert keinen Befehl. Die Aufgabe wird ignoriert. Die Definition lautet:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "Die Aufgabenversion 2.0.0 unterstützt globale betriebssystemspezifische Aufgaben nicht. Konvertieren Sie sie in eine Aufgabe mit einem betriebssystemspezifischen Befehl. Folgende Aufgaben sind hiervon betroffen:\n{0}" diff --git a/i18n/deu/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index 331fd59e24c4..8e202f7f4508 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, Terminalauswahl", "termCreateEntryAriaLabel": "{0}, neues Terminal erstellen", - "'workbench.action.terminal.newplus": "$(plus) Neues integriertes Terminal erstellen", + "workbench.action.terminal.newplus": "$(plus) Neues integriertes Terminal erstellen", "noTerminalsMatching": "Keine übereinstimmenden Terminals", "noTerminalsFound": "Keine geöffneten Terminals" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index bc6dee18ad00..aa687c62c7d9 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,6 @@ "terminal.integrated.rightClickCopyPaste": "Wenn dies festgelegt ist, erscheint das Kontextmenü bei einem Rechtsklick im Terminal nicht mehr. Stattdessen erfolgen die Vorgänge Kopieren, wenn eine Auswahl vorgenommen wurde, sowie Einfügen, wenn keine Auswahl vorgenommen wurde.", "terminal.integrated.fontFamily": "Steuert die Schriftartfamilie des Terminals. Der Standardwert ist \"editor.fontFamily\".", "terminal.integrated.fontSize": "Steuert den Schriftgrad des Terminals in Pixeln.", - "terminal.integrated.lineHeight": "Steuert die Zeilenhöhe für das Terminal. Dieser Wert wird mit dem Schriftgrad des Terminals multipliziert, um die tatsächliche Zeilenhöhe in Pixeln zu erhalten.", "terminal.integrated.enableBold": "Gibt an, ob Fettdruck im Terminal aktiviert wird. Dies muss durch die Terminalshell unterstützt werden.", "terminal.integrated.cursorBlinking": "Steuert, ob der Terminalcursor blinkt.", "terminal.integrated.cursorStyle": "Steuert den Stil des Terminalcursors.", diff --git a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 5b38193cdecf..ec4d01388dae 100644 --- a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -8,10 +8,9 @@ "installColorThemes": "Zusätzliche Farbschemas installieren...", "themes.selectTheme": "Farbdesign auswählen (eine Vorschau wird mit den Tasten NACH OBEN/NACH UNTEN angezeigt)", "selectIconTheme.label": "Dateisymboldesign", - "installIconThemes": "Zusätzliche Dateisymbolschemas installieren...", "noIconThemeLabel": "Keine", "noIconThemeDesc": "Dateisymbole deaktivieren", - "problemChangingIconTheme": "Problem beim Festlegen des Symboldesigns: {0}", + "installIconThemes": "Zusätzliche Dateisymbolschemas installieren...", "themes.selectIconTheme": "Dateisymboldesign auswählen", "generateColorTheme.label": "Farbdesign aus aktuellen Einstellungen erstellen", "preferences": "Einstellungen", diff --git a/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index d6a37d8334e4..cdafc1add682 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Fensterspezifische Konfiguration, die in den Benutzer- oder Arbeitsbereichseinstellungen konfiguriert werden kann.", "scope.resource.description": "Ressourcenspezifische Konfiguration, die in den Benutzer-, Arbeitsbereichs- oder Ordnereinstellungen konfiguriert werden kann.", "scope.description": "Bereich, in dem die Konfiguration gültig ist. Verfügbare Gültigkeitsbereiche sind \"window\" und \"resource\".", + "vscode.extension.contributes.defaultConfiguration": "Trägt zu Konfigurationeinstellungen des Standard-Editors für die jeweilige Sprache bei.", "vscode.extension.contributes.configuration": "Trägt Konfigurationseigenschaften bei.", "invalid.title": "configuration.title muss eine Zeichenfolge sein.", - "vscode.extension.contributes.defaultConfiguration": "Trägt zu Konfigurationeinstellungen des Standard-Editors für die jeweilige Sprache bei.", "invalid.properties": "\"configuration.properties\" muss ein Objekt sein.", "invalid.allOf": "\"configuration.allOf\" ist veraltet und sollte nicht mehr verwendet werden. Übergeben Sie stattdessen mehrere Konfigurationsabschnitte als Array an den Beitragspunkt \"configuration\".", "workspaceConfig.folders.description": "Liste von Ordnern, die in den Arbeitsbereich geladen werden.", diff --git a/i18n/deu/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/deu/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..f7a2d1f0c3ff --- /dev/null +++ b/i18n/deu/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetrie", + "telemetry.enableCrashReporting": "Aktiviert Absturzberichte, die an Microsoft gesendet werden.\nDiese Option erfordert einen Neustart, damit sie wirksam wird." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/deu/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 336dc274f393..8b6ad71cd4e6 100644 --- a/i18n/deu/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "bubbleTitle": "enthält hervorgehobene Elemente" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json index 82912560d86c..c16b29bce92f 100644 --- a/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "Die Datei ist ein Verzeichnis", "fileNotModifiedError": "Datei nicht geändert seit", "fileTooLargeError": "Die Datei ist zu groß, um sie zu öffnen.", - "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", "fileNotFoundError": "Die Datei wurde nicht gefunden ({0}).", + "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", "fileExists": "Die zu erstellende Datei ist bereits vorhanden ({0}). ", "fileMoveConflict": "Verschieben/Kopieren kann nicht ausgeführt werden. Die Datei ist am Ziel bereits vorhanden.", "unableToMoveCopyError": "Der Verschiebe-/Kopiervorgang kann nicht ausgeführt werden. Die Datei würde den Ordner ersetzen, in dem sie enthalten ist.", diff --git a/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 2bf19b5b0503..9e3cbe8e7cb0 100644 --- a/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -21,6 +21,5 @@ "keybindings.json.command": "Der Name des auszuführenden Befehls.", "keybindings.json.when": "Die Bedingung, wann der Schlüssel aktiv ist.", "keybindings.json.args": "Argumente, die an den auszuführenden Befehl übergeben werden sollen.", - "keyboardConfigurationTitle": "Tastatur", - "dispatch": "Steuert die Abgangslogik, sodass bei einem Tastendruck entweder \"keydown.code\" (empfohlen) oder \"keydown.keyCode\" verwendet wird." + "keyboardConfigurationTitle": "Tastatur" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/deu/src/vs/workbench/services/textfile/common/textFileService.i18n.json index eb134927712d..8b6ad71cd4e6 100644 --- a/i18n/deu/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "files.backup.failSave": "Die Dateien konnten nicht gesichert werden (Fehler: {0}). Versuchen Sie, Ihre Dateien zu speichern, um den Vorgang zu beenden." -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index d551e506d699..7d1b7fccbe0d 100644 --- a/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "Den Benutzereinstellungen wurden neue Designeinstellungen hinzugefügt. Sicherung verfügbar unter {0}.", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "Specifies the color theme used in the workbench.", "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Gibt das in der Workbench verwendete Symboldesign oder \"null\", um keine Dateisymbole anzuzeigen, an.", diff --git a/i18n/esn/extensions/css/client/out/cssMain.i18n.json b/i18n/esn/extensions/css/client/out/cssMain.i18n.json index 876a94392725..649760d7cc9b 100644 --- a/i18n/esn/extensions/css/client/out/cssMain.i18n.json +++ b/i18n/esn/extensions/css/client/out/cssMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "cssserver.name": "Servidor de lenguaje CSS" + "cssserver.name": "Servidor de lenguaje CSS", + "folding.start": "Inicio de la región plegable", + "folding.end": "Fin de la región plegable" } \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/autofetch.i18n.json b/i18n/esn/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..270030fe345b --- /dev/null +++ b/i18n/esn/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Sí", + "no": "No", + "not now": "Ahora No", + "suggest auto fetch": "¿Desea habilitar la búsqueda automática de repositorios de Git?" +} \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index 69862736c9d2..2258e1755477 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -9,9 +9,12 @@ "create branch": "$(plus) crear nueva rama", "repourl": "URL del repositorio", "parent": "Directorio principal", + "cancel": "$(sync~spin) Clonando repositorio... Haga clic para cancelar", + "cancel tooltip": "Cancelar clonación", "cloning": "Clonando el repositorio GIT...", "openrepo": "Abrir repositorio", "proposeopen": "¿Desea abrir el repositorio clonado?", + "init": "Seleccione una carpeta de área de trabajo en la que inicializar el repositorio de git", "init repo": "Inicializar el repositorio", "create repo": "Inicializar el repositorio", "are you sure": "Esto creará un repositorio Git en '{0}'. ¿Está seguro de que desea continuar?", @@ -49,12 +52,15 @@ "select branch to delete": "Seleccione una rama para borrar", "confirm force delete branch": "La rama '{0}' no está completamente fusionada. ¿Borrarla de todas formas?", "delete branch": "Borrar rama...", + "invalid branch name": "Nombre de rama no válido", + "branch already exists": "Ya existe una rama como '{0}'", "select a branch to merge from": "Seleccione una rama desde la que fusionar", "merge conflicts": "Hay conflictos de fusión. Resuelvalos antes de confirmar.", "tag name": "Nombre de la etiqueta", "provide tag name": "Por favor proporcione un nombre de etiqueta", "tag message": "Mensaje", "provide tag message": "Por favor, especifique un mensaje para anotar la etiqueta", + "no remotes to fetch": "El repositorio no tiene remotos configurados de los que extraer.", "no remotes to pull": "El repositorio no tiene remotos configurados de los que extraer.", "pick remote pull repo": "Seleccione un origen remoto desde el que extraer la rama", "no remotes to push": "El repositorio no tiene remotos configurados en los que insertar.", @@ -71,7 +77,7 @@ "no stashes": "No hay cambios guardados provisionalmente para restaurar.", "pick stash to pop": "Elija un cambio guardado provisionalmente para aplicarlo y quitarlo", "clean repo": "Limpie el árbol de trabajo del repositorio antes de la desprotección.", - "cant push": " No puede ejecutar la solicitud de inserción remotamente. Solicite un Pull para integrar los cambios.", + "cant push": "No se pueden enviar referencias al remoto. Intenta ejecutar 'Pull' primero para integrar tus cambios.", "git error details": "GIT: {0}", "git error": "Error de GIT", "open git log": "Abrir registro de GIT" diff --git a/i18n/esn/extensions/git/out/main.i18n.json b/i18n/esn/extensions/git/out/main.i18n.json index 83a9874c3d6e..cc3a1763339f 100644 --- a/i18n/esn/extensions/git/out/main.i18n.json +++ b/i18n/esn/extensions/git/out/main.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Buscando git en: {0}", "using git": "Usando GIT {0} desde {1}", - "updateGit": "Actualizar GIT", + "downloadgit": "Descargar Git", "neverShowAgain": "No volver a mostrar", + "notfound": "Git no encontrado. Instálalo o configúralo usando la configuración 'git.path'.", + "updateGit": "Actualizar GIT", "git20": "Parece que tiene instalado GIT {0}. El código funciona mejor con GIT >= 2" } \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/repository.i18n.json b/i18n/esn/extensions/git/out/repository.i18n.json index fc557b451ea1..46723c0d8806 100644 --- a/i18n/esn/extensions/git/out/repository.i18n.json +++ b/i18n/esn/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Borrado por nosotros", "both added": "Ambos añadidos", "both modified": "Ambos modificados", + "commitMessage": "Message (press {0} to commit)", "commit": "Confirmar", "merge changes": "Fusionar cambios mediante combinación", "staged changes": "Cambios almacenados provisionalmente", diff --git a/i18n/esn/extensions/git/package.i18n.json b/i18n/esn/extensions/git/package.i18n.json index a2502269e64f..c0bb492d13ed 100644 --- a/i18n/esn/extensions/git/package.i18n.json +++ b/i18n/esn/extensions/git/package.i18n.json @@ -33,8 +33,10 @@ "command.checkout": "Desproteger en...", "command.branch": "Crear rama...", "command.deleteBranch": "Borrar rama...", + "command.renameBranch": "Renombrar Rama...", "command.merge": "Fusionar rama...", "command.createTag": "Crear etiqueta", + "command.fetch": "Buscar", "command.pull": "Incorporación de cambios", "command.pullRebase": "Incorporación de cambios (fusionar mediante cambio de base)", "command.pullFrom": "Extraer de...", @@ -42,9 +44,11 @@ "command.pushTo": "Insertar en...", "command.pushWithTags": "Insertar con etiquetas", "command.sync": "Sincronizar", + "command.syncRebase": "Sincronizar (Rebase)", "command.publish": "Publicar rama", "command.showOutput": "Mostrar salida de GIT", "command.ignore": "Agregar archivo a .gitignore", + "command.stashIncludeUntracked": "Guardar provisionalmente (Incluir sin seguimiento)", "command.stash": "Guardar provisionalmente", "command.stashPop": "Aplicar y quitar cambios guardados provisionalmente...", "command.stashPopLatest": "Aplicar y quitar últimos cambios guardados provisionalmente...", @@ -57,6 +61,7 @@ "config.countBadge": "Controla el contador de insignia de Git. \"Todo\" cuenta todos los cambios. \"Seguimiento\" solamente cuenta los cambios realizados. \"Desactivado\" lo desconecta.", "config.checkoutType": "Controla el tipo de ramas listadas cuando ejecuta \"Desproteger\". \"Todo\" muetra todas las referencias, \"local\" solamente las ramas locales y \"remoto\" las ramas remotas.", "config.ignoreLegacyWarning": "Ignora las advertencias hereradas de Git", + "config.ignoreMissingGitWarning": "Ignora la advertencia cuando falta Git", "config.ignoreLimitWarning": "\nIgnora advertencias cuando se encuentran muchos cambios en un repositorio.", "config.defaultCloneDirectory": "La ubicación predeterminada en la que se clona un repositorio git", "config.enableSmartCommit": "Confirmar todos los cambios cuando no hay elementos almacenados provisionalmente.", diff --git a/i18n/esn/extensions/html/client/out/htmlMain.i18n.json b/i18n/esn/extensions/html/client/out/htmlMain.i18n.json index f7404453907b..d2fd055fb740 100644 --- a/i18n/esn/extensions/html/client/out/htmlMain.i18n.json +++ b/i18n/esn/extensions/html/client/out/htmlMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "htmlserver.name": "Servidor de lenguaje HTML" + "htmlserver.name": "Servidor de lenguaje HTML", + "folding.start": "Inicio de la región plegable", + "folding.end": "Fin de la región plegable" } \ No newline at end of file diff --git a/i18n/esn/extensions/markdown/out/commands.i18n.json b/i18n/esn/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..98e4bfb36f8e --- /dev/null +++ b/i18n/esn/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "Vista Previa {0}", + "onPreviewStyleLoadError": "No se pudo cargar 'markdown.styles': {0}" +} \ No newline at end of file diff --git a/i18n/esn/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/esn/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..dc058764af6f --- /dev/null +++ b/i18n/esn/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Se ha deshabilitado parte del contenido de este documento", + "preview.securityMessage.title": "Se ha deshabilitado el contenido potencialmente inseguro en la previsualización de Markdown. Para permitir el contenido inseguro o habilitar scripts cambie la configuración de la previsualización de Markdown", + "preview.securityMessage.label": "Alerta de seguridad de contenido deshabilitado" +} \ No newline at end of file diff --git a/i18n/esn/extensions/markdown/out/security.i18n.json b/i18n/esn/extensions/markdown/out/security.i18n.json index ec5482bbbf2c..c4fee815196c 100644 --- a/i18n/esn/extensions/markdown/out/security.i18n.json +++ b/i18n/esn/extensions/markdown/out/security.i18n.json @@ -11,5 +11,8 @@ "disable.title": "Deshabilitar", "disable.description": "Permitir todo el contenido y la ejecución de scripts. No se recomienda.", "moreInfo.title": "Más información", + "enableSecurityWarning.title": "Habilitar advertencias de seguridad de vista previa en este espacio de trabajo", + "disableSecurityWarning.title": "Deshabilitar advertencias de seguridad de vista previa en este espacio de trabajo", + "toggleSecurityWarning.description": "No afecta el nivel de seguridad del contenido", "preview.showPreviewSecuritySelector.title": "Seleccione configuración de seguridad para las previsualizaciones de Markdown en esta área de trabajo" } \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/package.i18n.json b/i18n/esn/extensions/merge-conflict/package.i18n.json index b72c99c527d1..b4a0d10e9981 100644 --- a/i18n/esn/extensions/merge-conflict/package.i18n.json +++ b/i18n/esn/extensions/merge-conflict/package.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "command.category": "Fusionar conflicto", + "command.accept.all-current": "Aceptar todo actual", "command.accept.all-incoming": "Aceptar todos los entrantes", "command.accept.all-both": "Aceptar ambos", "command.accept.current": "Aceptar actuales", diff --git a/i18n/esn/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/esn/extensions/typescript/out/features/completionItemProvider.i18n.json index 0f96519f3faf..0e9c911e841b 100644 --- a/i18n/esn/extensions/typescript/out/features/completionItemProvider.i18n.json +++ b/i18n/esn/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "selectCodeAction": "Seleccione acción de código para aplicar", "acquiringTypingsLabel": "Adquiriendo typings...", "acquiringTypingsDetail": "Adquiriendo definiciones de typings para IntelliSense.", "autoImportLabel": "Importar automáticamente desde {0}" diff --git a/i18n/esn/extensions/typescript/package.i18n.json b/i18n/esn/extensions/typescript/package.i18n.json index b5f0de6515d7..c662623ffcc5 100644 --- a/i18n/esn/extensions/typescript/package.i18n.json +++ b/i18n/esn/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "Abrir registro del servidor de TS", "typescript.restartTsServer": "Reiniciar servidor TS", "typescript.selectTypeScriptVersion.title": "Seleccionar versión de TypeScript", + "typescript.reportStyleChecksAsWarnings": "Notificar comprobaciones de estilo como advertencias", "jsDocCompletion.enabled": "Habilita o deshabilita comentarios automaticos de JSDoc", "javascript.implicitProjectConfig.checkJs": "Habilita/deshabilita la comprobación semántica de los archivos JavaScript. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Se requiere TypeScript >=2.3.1.", "typescript.npm": "Especifica la ruta de acceso al archivo ejecutable de NPM usada para la adquisición automática de tipos. Requiere TypeScript >= 2.3.4.", diff --git a/i18n/esn/src/vs/base/common/errorMessage.i18n.json b/i18n/esn/src/vs/base/common/errorMessage.i18n.json index ccfa6a32d0bb..f7b3549ebd5a 100644 --- a/i18n/esn/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/esn/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. Código de error: {1}", - "error.permission.verbose": "Permiso denegado (HTTP {0})", - "error.permission": "Permiso denegado", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Error de conexión desconocido ({0})", - "error.connection.unknown": "Error de conexión desconocido. Es posible que ya no esté conectado a Internet o que el servidor al que se había conectado esté sin conexión.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "Se ha producido un error desconocido. Consulte el registro para obtener más detalles.", "nodeExceptionMessage": "Error del sistema ({0})", diff --git a/i18n/esn/src/vs/code/electron-main/main.i18n.json b/i18n/esn/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..f4596c96fad3 --- /dev/null +++ b/i18n/esn/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "Se está ejecutando otra instancia de {0} pero no responde", + "secondInstanceNoResponseDetail": "Cierre todas las demás instancias y vuelva a intentarlo.", + "secondInstanceAdmin": "Ya se está ejecutando una segunda instancia de {0} como administrador.", + "secondInstanceAdminDetail": "Cierre la otra instancia y vuelva a intentarlo.", + "close": "&&Cerrar" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-main/menus.i18n.json b/i18n/esn/src/vs/code/electron-main/menus.i18n.json index 484face77176..2078d3df9fea 100644 --- a/i18n/esn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,12 @@ "miQuit": "Salir de {0}", "miNewFile": "&&Nuevo archivo", "miOpen": "Abrir...", - "miOpenWorkspace": "&& Abrir el espacio de trabajo...", + "miOpenWorkspace": "Abrir área de trabajo...", "miOpenFolder": "Abrir &&carpeta...", "miOpenFile": "&&Abrir archivo...", "miOpenRecent": "Abrir &&reciente", - "miSaveWorkspaceAs": "&& Guardar espacio de trabajo como...", - "miAddFolderToWorkspace": "&&Agregar carpeta al área de trabajo...", + "miSaveWorkspaceAs": "Guardar área de trabajo como...", + "miAddFolderToWorkspace": "Agregar carpeta al área de trabajo...", "miSave": "&&Guardar", "miSaveAs": "Guardar &&como...", "miSaveAll": "Guardar t&&odo", @@ -157,7 +157,7 @@ "mMergeAllWindows": "Fusionar todas las ventanas", "miToggleDevTools": "&&Alternar herramientas de desarrollo", "miAccessibilityOptions": "&&Opciones de accesibilidad", - "miReportIssues": "&&Notificar problemas", + "miReportIssue": "&&Notificar problema", "miWelcome": "&&Bienvenido", "miInteractivePlayground": "Área de juegos &&interactiva", "miDocumentation": "&&Documentación", @@ -184,6 +184,7 @@ "miDownloadingUpdate": "Descargando actualización...", "miInstallingUpdate": "Instalando actualización...", "miCheckForUpdates": "Buscar actualizaciones...", - "aboutDetail": "\nVersión: {0}\nConfirmación: {1}\nFecha: {2}\nShell: {3}\nRepresentador: {4}\nNodo {5}\nArquitectura {6}", - "okButton": "Aceptar" + "aboutDetail": "Versión: {0}\nConfirmación: {1}\nFecha: {2}\nShell: {3}\nRepresentador: {4}\nNodo {5}\nArquitectura {6}", + "okButton": "Aceptar", + "copy": "&&Copiar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/esn/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..73e3dfa4ecd6 --- /dev/null +++ b/i18n/esn/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Estos archivos han cambiado durante el proceso: {0}", + "summary.0": "No se realizaron ediciones", + "summary.nm": "{0} ediciones de texto en {1} archivos", + "summary.n0": "{0} ediciones de texto en un archivo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 67e2a10947cd..97f2cfda15af 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,7 +10,11 @@ "fontSize": "Controla el tamaño de fuente en píxeles.", "lineHeight": "Controla la altura de línea. Utilice 0 para calcular el valor de lineHeight a partir de fontSize.", "letterSpacing": "Controla el espacio entre letras en pixels.", - "lineNumbers": "Controla la presentación de los números de línea. Los valores posibles son \"on\", \"off\" y \"relative\". \"relative\" muestra el número de líneas desde la posición actual del cursor.", + "lineNumbers.off": "Los números de línea no se muestran.", + "lineNumbers.on": "Los números de línea se muestran como un número absoluto.", + "lineNumbers.relative": "Los números de línea se muestran como distancia en líneas a la posición del cursor.", + "lineNumbers.interval": "Los números de línea se muestran cada 10 líneas.", + "lineNumbers": "Controla la visualización de números de línea. Los valores posibles son 'on', 'off' y 'relative'.", "rulers": "Representar reglas verticales después de un cierto número de caracteres monoespacio. Usar multiples valores para multiples reglas. No se dibuja ninguna regla si la matriz esta vacía.", "wordSeparators": "Caracteres que se usarán como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.", "tabSize": "El número de espacios a los que equivale una tabulación. Este valor se invalida según el contenido del archivo cuando `editor.detectIndentation` está activado.", @@ -89,8 +93,8 @@ "links": "Controla si el editor debe detectar enlaces y hacerlos cliqueables", "colorDecorators": "Controla si el editor debe representar el Selector de colores y los elementos Decorator de color en línea.", "codeActions": "Permite que el foco de acción del código", + "selectionClipboard": "Controla si el portapapeles principal de Linux debe admitirse.", "sideBySide": "Controla si el editor de diferencias muestra las diferencias en paralelo o alineadas.", "ignoreTrimWhitespace": "Controla si el editor de diferencias muestra los cambios de espacio inicial o espacio final como diferencias.", - "renderIndicators": "Controla si el editor de diff muestra indicadores +/- para cambios agregados/quitados", - "selectionClipboard": "Controla si el portapapeles principal de Linux debe admitirse." + "renderIndicators": "Controla si el editor de diff muestra indicadores +/- para cambios agregados/quitados" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/esn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..8c194fd8751b --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Ir al corchete" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/esn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..ab2cb66648b9 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Mover símbolo de inserción a la izquierda", + "caret.moveRight": "Mover símbolo de inserción a la derecha" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/esn/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..ccd3a5c6ff49 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Transponer letras" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/esn/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..3e8a4d5d783f --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Cortar", + "actions.clipboard.copyLabel": "Copiar", + "actions.clipboard.pasteLabel": "Pegar", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Copiar con resaltado de sintaxis" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/esn/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..39d1b07ecab0 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Alternar comentario de línea", + "comment.line.add": "Agregar comentario de línea", + "comment.line.remove": "Quitar comentario de línea", + "comment.block": "Alternar comentario de bloque" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/esn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..7dee35d6d96f --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Mostrar menú contextual del editor" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/find/findController.i18n.json b/i18n/esn/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..686f3ab592d7 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Buscar", + "findNextMatchAction": "Buscar siguiente", + "findPreviousMatchAction": "Buscar anterior", + "nextSelectionMatchFindAction": "Buscar selección siguiente", + "previousSelectionMatchFindAction": "Buscar selección anterior", + "startReplace": "Reemplazar", + "showNextFindTermAction": "Mostrar siguiente término de búsqueda", + "showPreviousFindTermAction": "Mostrar término de búsqueda anterior" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..a2385b5b922d --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Buscar", + "placeholder.find": "Buscar", + "label.previousMatchButton": "Coincidencia anterior", + "label.nextMatchButton": "Coincidencia siguiente", + "label.toggleSelectionFind": "Buscar en selección", + "label.closeButton": "Cerrar", + "label.replace": "Reemplazar", + "placeholder.replace": "Reemplazar", + "label.replaceButton": "Reemplazar", + "label.replaceAllButton": "Reemplazar todo", + "label.toggleReplaceButton": "Alternar modo de reemplazar", + "title.matchesCountLimit": "Sólo los primeros {0} resultados son resaltados, pero todas las operaciones de búsqueda trabajan en todo el texto.", + "label.matchesLocation": "{0} de {1}", + "label.noResults": "Sin resultados" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..213a60a3c4fe --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Buscar", + "placeholder.find": "Buscar", + "label.previousMatchButton": "Coincidencia anterior", + "label.nextMatchButton": "Coincidencia siguiente", + "label.closeButton": "Cerrar" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/esn/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..69ac193ad0d9 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Desplegar", + "unFoldRecursivelyAction.label": "Desplegar de forma recursiva", + "foldAction.label": "Plegar", + "foldRecursivelyAction.label": "Plegar de forma recursiva", + "foldAllBlockComments.label": "Cerrar todos los comentarios de bloqueo", + "foldAllAction.label": "Plegar todo", + "unfoldAllAction.label": "Desplegar todo", + "foldLevelAction.label": "Nivel de plegamiento {0}" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..6260d665365e --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "1 edición de formato en la línea {0}", + "hintn1": "{0} ediciones de formato en la línea {1}", + "hint1n": "1 edición de formato entre las líneas {0} y {1}", + "hintnn": "{0} ediciones de formato entre las líneas {1} y {2}", + "no.provider": "Lo sentimos, pero no hay ningún formateador para los '{0}' archivos instalados.", + "formatDocument.label": "Dar formato al documento", + "formatSelection.label": "Dar formato a la selección" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..d9243b761356 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "No se encontró ninguna definición para \"{0}\"", + "generic.noResults": "No se encontró ninguna definición", + "meta.title": " – {0} definiciones", + "actions.goToDecl.label": "Ir a definición", + "actions.goToDeclToSide.label": "Abrir definición en el lateral", + "actions.previewDecl.label": "Ver la definición", + "goToImplementation.noResultWord": "No se encontró ninguna implementación para \"{0}\"", + "goToImplementation.generic.noResults": "No se encontró ninguna implementación", + "meta.implementations.title": "{0} implementaciones", + "actions.goToImplementation.label": "Ir a implementación", + "actions.peekImplementation.label": "Inspeccionar implementación", + "goToTypeDefinition.noResultWord": "No se encontró ninguna definición de tipo para \"{0}\"", + "goToTypeDefinition.generic.noResults": "No se encontró ninguna definición de tipo", + "meta.typeDefinitions.title": " – {0} definiciones de tipo", + "actions.goToTypeDefinition.label": "Ir a la definición de tipo", + "actions.peekTypeDefinition.label": "Inspeccionar definición de tipo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..d35f93e7fae0 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Haga clic para mostrar {0} definiciones." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..a46ce2aad760 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Ir al error o la advertencia siguiente", + "markerAction.previous.label": "Ir al error o la advertencia anterior", + "editorMarkerNavigationError": "Color de los errores del widget de navegación de marcadores del editor.", + "editorMarkerNavigationWarning": "Color de las advertencias del widget de navegación de marcadores del editor.", + "editorMarkerNavigationInfo": "Color del widget informativo marcador de navegación en el editor.", + "editorMarkerNavigationBackground": "Fondo del widget de navegación de marcadores del editor." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/esn/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..c190af1321da --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Mostrar al mantener el puntero" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/esn/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..cee5631f4170 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Cargando..." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/esn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..c249b2caf4f8 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Reemplazar con el valor anterior", + "InPlaceReplaceAction.next.label": "Reemplazar con el valor siguiente" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..e4b2111a1103 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Convertir sangría en espacios", + "indentationToTabs": "Convertir sangría en tabulaciones", + "configuredTabSize": "Tamaño de tabulación configurado", + "selectTabWidth": "Seleccionar tamaño de tabulación para el archivo actual", + "indentUsingTabs": "Aplicar sangría con tabulaciones", + "indentUsingSpaces": "Aplicar sangría con espacios", + "detectIndentation": "Detectar sangría del contenido", + "editor.reindentlines": "Volver a aplicar sangría a líneas" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/esn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..904c8cba9ed0 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Copiar línea arriba", + "lines.copyDown": "Copiar línea abajo", + "lines.moveUp": "Mover línea hacia arriba", + "lines.moveDown": "Mover línea hacia abajo", + "lines.sortAscending": "Ordenar líneas en orden ascendente", + "lines.sortDescending": "Ordenar líneas en orden descendente", + "lines.trimTrailingWhitespace": "Recortar espacio final", + "lines.delete": "Eliminar línea", + "lines.indent": "Sangría de línea", + "lines.outdent": "Anular sangría de línea", + "lines.insertBefore": "Insertar línea arriba", + "lines.insertAfter": "Insertar línea debajo", + "lines.deleteAllLeft": "Eliminar todo a la izquierda", + "lines.deleteAllRight": "Eliminar todo lo que está a la derecha", + "lines.joinLines": "Unir líneas", + "editor.transpose": "Transponer caracteres alrededor del cursor", + "editor.transformToUppercase": "Transformar a mayúsculas", + "editor.transformToLowercase": "Transformar a minúsculas" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/links/links.i18n.json b/i18n/esn/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..200b81a535c7 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Cmd + clic para abrir el vínculo", + "links.navigate": "Ctrl + clic para abrir el vínculo", + "links.command.mac": "Cmd + click para ejecutar el comando", + "links.command": "Ctrl + click para ejecutar el comando", + "links.navigate.al": "Alt + clic para seguir el vínculo", + "links.command.al": "Alt + clic para ejecutar el comando", + "invalid.url": "No se pudo abrir este vínculo porque no tiene un formato correcto: {0}", + "missing.url": "No se pudo abrir este vínculo porque falta el destino.", + "label": "Abrir vínculo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/esn/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..d59941467537 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Agregar cursor arriba", + "mutlicursor.insertBelow": "Agregar cursor debajo", + "mutlicursor.insertAtEndOfEachLineSelected": "Añadir cursores a finales de línea", + "addSelectionToNextFindMatch": "Agregar selección hasta la siguiente coincidencia de búsqueda", + "addSelectionToPreviousFindMatch": "Agregar selección hasta la anterior coincidencia de búsqueda", + "moveSelectionToNextFindMatch": "Mover última selección hasta la siguiente coincidencia de búsqueda", + "moveSelectionToPreviousFindMatch": "Mover última selección hasta la anterior coincidencia de búsqueda", + "selectAllOccurrencesOfFindMatch": "Seleccionar todas las repeticiones de coincidencia de búsqueda", + "changeAll.label": "Cambiar todas las ocurrencias" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/esn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..4cd04b2e2430 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Sugerencias para parámetros Trigger" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..bd2e55282cd0 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, sugerencia" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..6b4f1302755c --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Mostrar correcciones ({0})", + "quickFix": "Mostrar correcciones", + "quickfix.trigger.label": "Corrección rápida" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..067249df5b16 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Cerrar" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..c2ee1b578878 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " – {0} referencias", + "references.action.label": "Buscar todas las referencias" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..068591054459 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Cargando..." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..63882c346ccb --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "símbolo en {0} linea {1} en la columna {2}", + "aria.fileReferences.1": "1 símbolo en {0}, ruta de acceso completa {1}", + "aria.fileReferences.N": "{0} símbolos en {1}, ruta de acceso completa {2}", + "aria.result.0": "No se encontraron resultados", + "aria.result.1": "Encontró 1 símbolo en {0}", + "aria.result.n1": "Encontró {0} símbolos en {1}", + "aria.result.nm": "Encontró {0} símbolos en {1} archivos" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..1e3309b1cf63 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Error al resolver el archivo.", + "referencesCount": "{0} referencias", + "referenceCount": "{0} referencia", + "missingPreviewMessage": "vista previa no disponible", + "treeAriaLabel": "Referencias", + "noResults": "No hay resultados.", + "peekView.alternateTitle": "Referencias", + "peekViewTitleBackground": "Color de fondo del área de título de la vista de inspección.", + "peekViewTitleForeground": "Color del título de la vista de inpección.", + "peekViewTitleInfoForeground": "Color de la información del título de la vista de inspección.", + "peekViewBorder": "Color de los bordes y la flecha de la vista de inspección.", + "peekViewResultsBackground": "Color de fondo de la lista de resultados de vista de inspección.", + "peekViewResultsMatchForeground": "Color de primer plano de los nodos de inspección en la lista de resultados.", + "peekViewResultsFileForeground": "Color de primer plano de los archivos de inspección en la lista de resultados.", + "peekViewResultsSelectionBackground": "Color de fondo de la entrada seleccionada en la lista de resultados de vista de inspección.", + "peekViewResultsSelectionForeground": "Color de primer plano de la entrada seleccionada en la lista de resultados de vista de inspección.", + "peekViewEditorBackground": "Color de fondo del editor de vista de inspección.", + "peekViewEditorGutterBackground": "Color de fondo del margen en el editor de vista de inspección.", + "peekViewResultsMatchHighlight": "Buscar coincidencia con el color de resaltado de la lista de resultados de vista de inspección.", + "peekViewEditorMatchHighlight": "Buscar coincidencia del color de resultado del editor de vista de inspección." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/esn/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..00a7dc4990e4 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "No hay ningún resultado.", + "aria": "Nombre cambiado correctamente de '{0}' a '{1}'. Resumen: {2}", + "rename.failed": "No se pudo cambiar el nombre.", + "rename.label": "Cambiar el nombre del símbolo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/esn/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..86b4308b9d35 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Cambie el nombre de la entrada. Escriba el nuevo nombre y presione Entrar para confirmar." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/esn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..e5a3dca5e22c --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Expandir selección", + "smartSelect.shrink": "Reducir selección" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/esn/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..e651f27c5865 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "Aceptando '{0}' Insertó el siguente texto : {1}", + "suggest.trigger.label": "Sugerencias para Trigger" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..bf3d8015426a --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Color de fondo del widget sugerido.", + "editorSuggestWidgetBorder": "Color de borde del widget sugerido.", + "editorSuggestWidgetForeground": "Color de primer plano del widget sugerido.", + "editorSuggestWidgetSelectedBackground": "Color de fondo de la entrada seleccionada del widget sugerido.", + "editorSuggestWidgetHighlightForeground": "Color del resaltado coincidido en el widget sugerido.", + "readMore": "Leer más...{0}", + "suggestionWithDetailsAriaLabel": "{0}, sugerencia, con detalles", + "suggestionAriaLabel": "{0}, sugerencia", + "readLess": "Leer menos...{0}", + "suggestWidget.loading": "Cargando...", + "suggestWidget.noSuggestions": "No hay sugerencias.", + "suggestionAriaAccepted": "{0}, aceptada", + "ariaCurrentSuggestionWithDetails": "{0}, sugerencia, con detalles", + "ariaCurrentSuggestion": "{0}, sugerencia" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/esn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..2349a0a85148 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Alternar tecla de tabulación para mover el punto de atención" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..ce1db0c57f28 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Color de fondo de un símbolo durante el acceso de lectura; por ejemplo, cuando se lee una variable.", + "wordHighlightStrong": "Color de fondo de un símbolo durante el acceso de escritura; por ejemplo, cuando se escribe una variable.", + "overviewRulerWordHighlightForeground": "Color de marcador de regla de información general para símbolos resaltados.", + "overviewRulerWordHighlightStrongForeground": "Color de marcador de regla de información general para símbolos de acceso de escritura resaltados. ", + "wordHighlight.next.label": "Ir al siguiente símbolo destacado", + "wordHighlight.previous.label": "Ir al símbolo destacado anterior" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json index 26e8b7914893..e7d97465a8cf 100644 --- a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json @@ -12,6 +12,8 @@ "newWindow": "Fuerce una nueva instancia de Code.", "performance": "Comience con el comando 'Developer: Startup Performance' habilitado.", "prof-startup": "Ejecutar generador de perfiles de CPU durante el inicio", + "inspect-extensions": "Permitir la depuración y el perfil de las extensiones. Revisar las herramientas de desarrollador para la conexión uri.", + "inspect-brk-extensions": "Permitir la depuración y el perfil de las extensiones con el host de la extensión pausado después del inicio. Revisar las herramientas de desarrollador para la conexión uri.", "reuseWindow": "Fuerce la apertura de un archivo o carpeta en la última ventana activa.", "userDataDir": "Especifica el directorio en que se conservan los datos de usuario; es útil cuando se ejecuta como raíz.", "verbose": "Imprima salidas detalladas (implica --wait).", @@ -24,6 +26,7 @@ "experimentalApis": "Habilita características de API propuestas para una extensión.", "disableExtensions": "Deshabilite todas las extensiones instaladas.", "disableGPU": "Deshabilita la aceleración de hardware de GPU.", + "status": "Imprimir el uso del proceso y la información de diagnóstico.", "version": "Versión de impresión.", "help": "Imprima el uso.", "usage": "Uso", diff --git a/i18n/esn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/esn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index 03e8971b5585..dedafdbe5bf5 100644 --- a/i18n/esn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/esn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "Extensión no encontrada", - "noCompatible": "No se encontró una versión de {0} compatible con esta versión de Code." + "notCompatibleDownload": "No se puede descargar porque no se encuentra la extensión compatible con la versión actual '{0}' de VS Code." } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index d12f28224866..645d8566a96a 100644 --- a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "Extensión no válida: package.json no es un archivo JSON.", "restartCodeLocal": "Reinicie Code antes de volver a instalar {0}.", - "restartCodeGallery": "Por favor reinicie Code antes de reinstalar.", + "installingOutdatedExtension": "Una versión más nueva de esta extensión ya está instalada. ¿Desea anular esto con la versión anterior?", + "override": "Anular", + "cancel": "Cancelar", + "notFoundCompatible": "No se puede instalar porque no se encuentra la extensión '{0}' compatible con la versión actual '{1}' del VS Code.", + "quitCode": "No se puede instalar porque todavía se está ejecutando una instancia obsoleta de la extensión. Por favor, salga e inicie el VS Code antes de volver a instalarlo.\n", + "exitCode": "No se puede instalar porque todavía se está ejecutando una instancia obsoleta de la extensión. Por favor, salga e inicie VS Code antes de volver a instalarlo.", + "notFoundCompatibleDependency": "No se puede instalar porque no se encuentra la extensión dependiente '{0}' compatible con la versión actual '{1}' del VS Code.", "uninstallDependeciesConfirmation": "¿Quiere desinstalar solo '{0}' o también sus dependencias?", "uninstallOnly": "Solo", "uninstallAll": "Todo", - "cancel": "Cancelar", "uninstallConfirmation": "¿Seguro que quiere desinstalar '{0}'?", "ok": "Aceptar", "singleDependentError": "No se puede desinstalar la extensión '{0}'. La extensión '{1}' depende de esta.", diff --git a/i18n/esn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/esn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index 5568bf781763..693071735c22 100644 --- a/i18n/esn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -17,6 +17,8 @@ "vscode.extension.activationEvents.onLanguage": "Un evento de activación emitido cada vez que se abre un archivo que se resuelve en el idioma especificado.", "vscode.extension.activationEvents.onCommand": "Un evento de activación emitido cada vez que se invoca el comando especificado.", "vscode.extension.activationEvents.onDebug": "Un evento de activación emitido cada vez que un usuario está a punto de iniciar la depuración o cada vez que está a punto de configurar las opciones de depuración.", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "Un evento de activación emitido cada vez que se necesite crear un \"launch.json\" (y se necesite llamar a todos los métodos provideDebugConfigurations).", + "vscode.extension.activationEvents.onDebugResolve": "Un evento de activación emitido cada vez que esté a punto de ser iniciada una sesión de depuración con el tipo específico (y se necesite llamar al método resolveDebugConfiguration correspondiente).", "vscode.extension.activationEvents.workspaceContains": "Un evento de activación emitido cada vez que se abre una carpeta que contiene al menos un archivo que coincide con el patrón global especificado.", "vscode.extension.activationEvents.onView": "Un evento de activación emitido cada vez que se expande la vista especificada.", "vscode.extension.activationEvents.star": "Un evento de activación emitido al inicio de VS Code. Para garantizar una buena experiencia para el usuario final, use este evento de activación en su extensión solo cuando no le sirva ninguna otra combinación de eventos de activación en su caso.", diff --git a/i18n/esn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/esn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..77a690db833b --- /dev/null +++ b/i18n/esn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "Alternar visibilidad de la pestaña", + "view": "Ver" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json index 5cf2aa986a54..23135259cde1 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "largeNumberBadge": "10k+", "badgeTitle": "{0} - {1} ", "additionalViews": "Vistas adicionales", "numberBadge": "{0} ({1})", diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 5f8d21bad140..f88c82cd9dfd 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Abrir el editor anterior", "nextEditorInGroup": "Abrir el siguiente editor del grupo", "openPreviousEditorInGroup": "Abrir el editor anterior en el grupo", + "lastEditorInGroup": "Abrir el último editor del grupo", "navigateNext": "Hacia delante", "navigatePrevious": "Hacia atrás", "navigateLast": "Vaya al último", diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index 2992be9bea82..a44acd1dea7c 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "Mover el editor activo por tabulaciones o grupos", "editorCommand.activeEditorMove.arg.name": "Argumento para mover el editor activo", - "editorCommand.activeEditorMove.arg.description": "Propiedades del argumento:\n\t\t\t\t\t\t* 'to': valor de cadena que indica el lugar al que mover.\n\t\t\t\t\t\t* 'by': valor de cadena que proporciona la unidad para mover. Por pestaña o por grupo.\n\t\t\t\t\t\t* 'value': valor numérico que indica el número de posiciones o una posición absoluta para mover.\n\t\t\t\t\t", + "editorCommand.activeEditorMove.arg.description": "Propiedades del argumento:\n * 'to': cadena de valor que proporciona dónde moverse.\n\t* 'by': cadena de valor que proporciona la unidad de medida para moverse. Por pestaña o por grupo.\n\t* 'value': valor numérico que proporciona cuantas posiciones o una posición absoluta para mover.", "commandDeprecated": "El comando **{0}** se ha quitado. Puede usar en su lugar **{1}**", "openKeybindings": "Configurar métodos abreviados de teclado" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index d3bb899fc077..f7bccf7369d9 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "Sí", "screenReaderDetectedExplanation.answerNo": "No", "screenReaderDetectedExplanation.body1": "VS Code se ha optimizado para ser utilizado con un lector de pantalla", - "screenReaderDetectedExplanation.body2": "Algunas características del editor tendrán comportamientos diferentes: por ejemplo, los ajustes de línea, plegamiento, cierre automático de llaves, etc." + "screenReaderDetectedExplanation.body2": "Algunas características del editor tendrán comportamientos diferentes: p. ej. ajuste de línea, plegado, etc." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/quickopen.i18n.json b/i18n/esn/src/vs/workbench/browser/quickopen.i18n.json index 6677960aba0d..5951cd82b002 100644 --- a/i18n/esn/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "No hay resultados coincidentes", - "noResultsFound2": "No se encontraron resultados", - "entryAriaLabel": "{0}, comando" + "noResultsFound2": "No se encontraron resultados" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json index a404f8a1152e..69c31d258054 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Abrir Reciente...", "quickOpenRecent": "Abrir Reciente Rapidamente...", "closeMessages": "Cerrar mensajes de notificación", - "reportIssues": "Notificar problemas", + "reportIssueInEnglish": "Notificar problema", "reportPerformanceIssue": "Notificar problema de rendimiento", "keybindingsReference": "Referencia de métodos abreviados de teclado", "openDocumentationUrl": "Documentación", @@ -47,5 +47,25 @@ "showNextWindowTab": "Mostrar siguiente pestaña de ventana", "moveWindowTabToNewWindow": "Mover pestaña de ventana a una nueva ventana", "mergeAllWindowTabs": "Fusionar todas las ventanas", - "toggleWindowTabsBar": "Alternar barra de pestañas de ventana" + "toggleWindowTabsBar": "Alternar barra de pestañas de ventana", + "configureLocale": "Configurar idioma", + "displayLanguage": "Define el lenguaje para mostrar de VSCode.", + "doc": "Consulte {0} para obtener una lista de idiomas compatibles.", + "restart": "Al cambiar el valor se requiere reiniciar VSCode.", + "fail.createSettings": "No se puede crear '{0}' ({1}).", + "openLogsFolder": "Abrir carpeta de registros", + "showLogs": "Mostrar registros...", + "mainProcess": "Principal", + "sharedProcess": "Compartido", + "rendererProcess": "Renderizador", + "extensionHost": "Host de extensión", + "selectProcess": "Seleccionar proceso", + "setLogLevel": "Establecer nivel de registro", + "trace": "Seguimiento", + "debug": "Depurar", + "info": "Información", + "warn": "Advertencia", + "err": "Error", + "critical": "Crítico", + "off": "Apagado" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 33913ddd2b52..f2abdd8deafb 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Ver", "help": "Ayuda", "file": "Archivo", - "workspaces": "Áreas de trabajo", "developer": "Desarrollador", + "workspaces": "Áreas de trabajo", "showEditorTabs": "Controla si los editores abiertos se deben mostrar o no en pestañas.", "workbench.editor.labelFormat.default": "Mostrar el nombre del archivo. Cuando están habilitadas las pestañas y dos archivos tienen el mismo nombre en un grupo se agregan las secciones de distinguinshing de ruta de cada archivo. Cuando se desactivan las pestañas, se muestra la ruta de acceso relativa a la carpeta de trabajo si el editor está activo.", "workbench.editor.labelFormat.short": "Mostrar el nombre del archivo seguido de su nombre de directorio.", @@ -16,6 +16,7 @@ "workbench.editor.labelFormat.long": "Mostrar el nombre del archivo seguido de la ruta de acceso absoluta.", "tabDescription": "Controla el formato de la etiqueta para un editor. Modificar este ajuste puede hacer, por ejemplo, que sea más fácil entender la ubicación de un archivo: - corta: 'parent' - media: 'workspace/src/parent' - larga: '/home/user/workspace/src/parect' - por defecto: '.../parent', cuando otra pestaña comparte el mismo título, o la ruta de acceso relativa del espacio de trabajo si las pestañas están deshabilitadas", "editorTabCloseButton": "Controla la posición de los botones de cierre de pestañas del editor o los deshabilita si se establece en \"off\".", + "tabSizing": "Controla el tamaño de las pestañas del editor. Configurado para 'fit' para mantener las pestañas siempre lo suficientemente grandes para mostrar la etiqueta completa del editor. Establezca 'shrink' para permitir que las pestañas se vuelvan más pequeñas cuando el espacio disponible no sea suficiente para mostrar todas las pestañas juntas.", "showIcons": "Controla si los editores abiertos deben mostrarse o no con un icono. Requiere que también se habilite un tema de icono.", "enablePreview": "Controla si los editores abiertos se muestran en vista previa. Los editores en vista previa se reutilizan hasta que se guardan (por ejemplo, mediante doble clic o editándolos) y se muestran en cursiva.", "enablePreviewFromQuickOpen": "Controla si los editores abiertos mediante Quick Open se muestran en modo de vista previa. Los editores en modo de vista previa se reutilizan hasta que se conservan (por ejemplo, mediante doble clic o editándolos).", @@ -26,18 +27,17 @@ "closeOnFocusLost": "Controla si Quick Open debe cerrarse automáticamente cuando pierde el foco.", "openDefaultSettings": "Controla si la configuración de apertura también abre un editor que muestra todos los valores predeterminados.", "sideBarLocation": "Controla la ubicación de la barra lateral. Puede mostrarse a la izquierda o a la derecha del área de trabajo.", - "panelLocation": "Controla la ubicación de la barra lateral. Puede mostrarse a la izquierda o a la derecha del área de trabajo.", "statusBarVisibility": "Controla la visibilidad de la barra de estado en la parte inferior del área de trabajo.", "activityBarVisibility": "Controla la visibilidad de la barra de actividades en el área de trabajo.", "closeOnFileDelete": "Controla si los editores que muestran un archivo deben cerrarse automáticamente cuando otro proceso elimina el archivo o le cambia el nombre. Si se deshabilita esta opción y se da alguna de estas circunstancias, se mantiene el editor abierto con modificaciones. Tenga en cuenta que, cuando se eliminan archivos desde la aplicación, siempre se cierra el editor y que los archivos con modificaciones no se cierran nunca para preservar los datos.", - "experimentalFuzzySearchEndpoint": "Indica el punto final para la búsqueda de configuraciones experimentales.", - "experimentalFuzzySearchKey": "Indica la clave a utilizar para la búsqueda de configuraciones experimentales.", + "enableNaturalLanguageSettingsSearch": "Controla si habilita el modo de búsqueda de lenguaje natural para la configuración.", "fontAliasing": "Controla el método de suavizado de fuentes en el área de trabajo.\n- default: suavizado de fuentes en subpíxeles. En la mayoría de las pantallas que no son Retina, esta opción muestra el texto más nítido.\n- antialiased: suaviza las fuentes en píxeles, en lugar de subpíxeles. Puede hacer que las fuentes se vean más claras en general\n- none: deshabilita el suavizado de fuentes. El texto se muestra con bordes nítidos irregulares.", "workbench.fontAliasing.default": "Suavizado de fuentes en subpíxeles. En la mayoría de las pantallas que no son Retina, esta opción muestra el texto más nítido.", "workbench.fontAliasing.antialiased": "Suaviza las fuentes en píxeles, en lugar de subpíxeles. Puede hacer que las fuentes se vean más claras en general.", "workbench.fontAliasing.none": "Deshabilita el suavizado de fuentes. El texto se muestra con bordes nítidos irregulares.", "swipeToNavigate": "Navegar entre achivos abiertos utlizando la pulsación de tres dedos para deslizar horizontalmante.", "workbenchConfigurationTitle": "Área de trabajo", + "windowConfigurationTitle": "Ventana", "window.openFilesInNewWindow.on": "Los archivos se abrirán en una nueva ventana", "window.openFilesInNewWindow.off": "Los archivos se abrirán en la ventana con la carpeta de archivos abierta o en la última ventana activa", "window.openFilesInNewWindow.default": "Los archivos se abrirán en la ventana con la carpeta de los archivos abierta o en la última ventana activa a menos que se abran mediante el Dock o el Finder (solo macOS)", @@ -69,11 +69,11 @@ "autoDetectHighContrast": "Si está habilitado, se cambiará automáticamente al tema de contraste alto si Windows utiliza un tema de contraste alto, y al tema oscuro si cambia desde un tema de contraste alto de Windows.", "titleBarStyle": "Ajuste la apariencia de la barra de título de la ventana. Se debe realizar un reinicio completo para aplicar los cambios.", "window.nativeTabs": "Habilita las fichas de ventana en macOS Sierra. Note que los cambios requieren que reinicie el equipo y las fichas nativas deshabilitan cualquier estilo personalizado que haya configurado.", - "windowConfigurationTitle": "Ventana", "zenModeConfigurationTitle": "Modo zen", "zenMode.fullScreen": "Controla si activar el modo Zen pone también el trabajo en modo de pantalla completa.", "zenMode.hideTabs": "Controla si la activación del modo zen también oculta las pestañas del área de trabajo.", "zenMode.hideStatusBar": "Controla si la activación del modo zen oculta también la barra de estado en la parte inferior del área de trabajo.", "zenMode.hideActivityBar": "Controla si la activación del modo zen oculta también la barra de estado en la parte izquierda del área de trabajo.", - "zenMode.restore": "Controla si una ventana debe restaurarse a modo zen si se cerró en modo zen." + "zenMode.restore": "Controla si una ventana debe restaurarse a modo zen si se cerró en modo zen.", + "JsonSchema.locale": "Idioma de la interfaz de usuario que debe usarse." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index f03e5fb4d1c8..1da81a4fd68e 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Desactivar puntos de interrupción", "reapplyAllBreakpoints": "Volver a aplicar todos los puntos de interrupción", "addFunctionBreakpoint": "Agregar punto de interrupción de función", - "renameFunctionBreakpoint": "Cambiar nombre de punto de interrupción de función", "addConditionalBreakpoint": "Agregar punto de interrupción condicional...", "editConditionalBreakpoint": "Editar punto de interrupción...", "setValue": "Establecer valor", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..dcc90fa2dbde --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Editar punto de interrupción...", + "functionBreakpointsNotSupported": "Este tipo de depuración no admite puntos de interrupción en funciones", + "functionBreakpointPlaceholder": "Función donde interrumpir", + "functionBreakPointInputAriaLabel": "Escribir punto de interrupción de función" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..980bb00142f7 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Sección de la pila de llamadas", + "debugStopped": "En pausa en {0}", + "callStackAriaLabel": "Pila de llamadas de la depuración", + "process": "Proceso", + "paused": "En pausa", + "running": "En ejecución", + "thread": "Subproceso", + "pausedOn": "En pausa en {0}", + "loadMoreStackFrames": "Cargar más marcos de pila", + "threadAriaLabel": "Subproceso {0}, pila de llamadas, depuración", + "stackFrameAriaLabel": "Marco de pila {0} línea {1} {2}, pila de llamadas, depuración" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 57eb3ab2dd20..f491c842a058 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,10 @@ "openExplorerOnEnd": "Abrir automáticamente la vista del explorador al final de una sesión de depuración", "inlineValues": "Mostrar valores de variable en línea en el editor durante la depuración", "hideActionBar": "Controla si debe ocultarse la barra flotante de acciones de depuración", + "never": "Nunca mostrar debug en la barra de estado", + "always": "Siempre mostrar debug en la barra de estado", + "onFirstSessionStart": "Mostrar debug en la barra de estado solamente después del primero uso de debug", + "showInStatusBar": "Controla cuando se debe mostrar la barra de estado de depuración", + "openDebug": "Controla si el viewlet de depuración debería abrirse al inicio de la sesión de depuración.", "launch": "Configuración de lanzamiento para depuración global. Debe utilizarse como una alternativa a “launch.json” en espacios de trabajo compartidos." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index b9b659ba536f..b7bc040a66a3 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "Punto de interrupción agregado, línea {0}, archivo {1}", "breakpointRemoved": "Punto de interrupción quitado, línea {0}, archivo {1}", "compoundMustHaveConfigurations": "El compuesto debe tener configurado el atributo \"configurations\" a fin de iniciar varias configuraciones.", - "configMissing": "La configuración \"{0}\" falta en \"launch.json\".", "debugRequestNotSupported": "El atributo '{0}' tiene un valor no admitido '{1}' en la configuración de depuración seleccionada.", "debugRequesMissing": "El atributo '{0}' está ausente en la configuración de depuración elegida. ", "debugTypeNotSupported": "El tipo de depuración '{0}' configurado no es compatible.", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..9efd007c7a75 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Sección de variables", + "variablesAriaTreeLabel": "Variables de depuración", + "variableValueAriaLabel": "Escribir un nuevo valor de variable", + "variableScopeAriaLabel": "Ámbito {0}, variables, depuración", + "variableAriaLabel": "{0} valor {1}, variables, depuración" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..342df49060ce --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "Sección de expresiones", + "watchAriaTreeLabel": "Expresiones de inspección de la depuración", + "watchExpressionPlaceholder": "Expresión para inspeccionar", + "watchExpressionInputAriaLabel": "Escribir expresión de inspección", + "watchExpressionAriaLabel": "{0} valor {1}, inspección, depuración", + "watchVariableAriaLabel": "{0} valor {1}, inspección, depuración" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index 9c360797a3ca..1a8dfad33037 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "Nombre de la extensión", "extension id": "Identificador de la extensión", + "preview": "Vista Previa", "publisher": "Nombre del editor", "install count": "Número de instalaciones", "rating": "Clasificación", + "repository": "Repositorio", "license": "Licencia", "details": "Detalles", "contributions": "Contribuciones", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 148988a3afc8..21da8d1a0eea 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Desinstalando", "updateAction": "Actualizar", "updateTo": "Actualizar a {0}", - "enableForWorkspaceAction.label": "Habilitar (área de trabajo)", - "enableAlwaysAction.label": "Habilitar (siempre)", - "disableForWorkspaceAction.label": "Deshabilitar (área de trabajo)", - "disableAlwaysAction.label": "Deshabilitar (siempre)", "ManageExtensionAction.uninstallingTooltip": "Desinstalando", - "enableForWorkspaceAction": "Área de trabajo", - "enableGloballyAction": "Siempre", + "enableForWorkspaceAction": "Habilitar (área de trabajo)", + "enableGloballyAction": "Habilitar", "enableAction": "Habilitar", - "disableForWorkspaceAction": "Área de trabajo", - "disableGloballyAction": "Siempre", + "disableForWorkspaceAction": "Deshabilitar (área de trabajo)", + "disableGloballyAction": "Deshabilitar", "disableAction": "Deshabilitar", "checkForUpdates": "Buscar actualizaciones", "enableAutoUpdate": "Habilitar extensiones de actualización automática", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Ya se han instalado todas las extensiones recomendadas para esta área de trabajo", "installRecommendedExtension": "Instalar extensión recomendada", "extensionInstalled": "La extensión recomendada ya ha sido instalada", - "showRecommendedKeymapExtensions": "Mostrar asignaciones de teclado recomendadas", "showRecommendedKeymapExtensionsShort": "Asignaciones de teclado", - "showLanguageExtensions": "Mostrar extensiones del lenguaje", "showLanguageExtensionsShort": "Extensiones del lenguaje", - "showAzureExtensions": "Mostrar extensiones de Azure", "showAzureExtensionsShort": "Extensiones de Azure", "OpenExtensionsFile.failed": "No se puede crear el archivo \"extensions.json\" dentro de la carpeta \".vscode\" ({0}).", "configureWorkspaceRecommendedExtensions": "Configurar extensiones recomendadas (área de trabajo)", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..9671e111767b --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ratedByUsers": "Calificado por {0} usuarios" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..b1592505d83d --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectAndStartDebug": "Haga clic aquí para detener la generación de perfiles." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 3c9b787331df..3335907cc3ec 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -7,7 +7,7 @@ "fileBasedRecommendation": "Esta extensión se recomienda basado en los archivos que abrió recientemente.", "workspaceRecommendation": "Esta extensión es recomendada por los usuarios del espacio de trabajo actual.", "exeBasedRecommendation": "Se recomienda esta extensión porque tiene instalado {0} . ", - "reallyRecommended2": "Para este tipo de archivo, se recomineda la extensión '{0}'.", + "reallyRecommended2": "La extension recomendada para este tipo de archivo es {0}", "reallyRecommendedExtensionPack": "Para este tipo de fichero, se recomienda el paquete de extensión '{0}'.", "showRecommendations": "Mostrar recomendaciones", "install": "Instalar", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index cfbe38f24db7..5e401d2ea7a1 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -7,9 +7,11 @@ "extensionsCommands": "Administrar extensiones", "galleryExtensionsCommands": "Instalar extensiones de la galería", "extension": "Extensión", + "runtimeExtension": "Extensiones en ejecución", "extensions": "Extensiones", "view": "Ver", + "developer": "Desarrollador", "extensionsConfigurationTitle": "Extensiones", "extensionsAutoUpdate": "Actualizar extensiones automáticamente", - "extensionsIgnoreRecommendations": "No tener en cuenta las recomendaciones de extensión." + "extensionsIgnoreRecommendations": "Si se pone en true, las notificaciones para las recomendaciones de la extensión dejarán de aparecer." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..41e790c6435d --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "starActivation": "Activado al inicio", + "workspaceContainsGlobActivation": "Activado porque un archivo que coincide con {0} existe en su área de trabajo", + "workspaceContainsFileActivation": "Activado porque el archivo {0} existe en su área de trabajo", + "languageActivation": "Activado porque abrió un archivo {0}", + "workspaceGenericActivation": "Activado en {0}", + "errors": "{0} errores no detectados", + "extensionsInputName": "Extensiones en ejecución", + "showRuntimeExtensions": "Mostrar extensiones en ejecución", + "reportExtensionIssue": "Notificar problema", + "extensionHostProfileStart": "Iniciar perfil del host de extensiones", + "extensionHostProfileStop": "Detener perfil del host de extensiones", + "saveExtensionHostProfile": "Guardar perfil del host de extensiones" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/fileActions.i18n.json index 5c6f151c3538..6ceeb1cae46a 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/fileActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -69,5 +69,7 @@ "invalidFileNameError": "El nombre **{0}** no es válido para el archivo o la carpeta. Elija un nombre diferente.", "filePathTooLongError": "El nombre **{0}** da como resultado una ruta de acceso demasiado larga. Elija un nombre más corto.", "compareWithSaved": "Comparar el archivo activo con el guardado", - "modifiedLabel": "{0} (en disco) ↔ {1}" + "modifiedLabel": "{0} (en disco) ↔ {1}", + "compareWithClipboard": "Comparar archivo activo con portapapeles", + "clipboardComparisonLabel": "Portapapeles ↔ {0}" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..79a138bf53b9 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Carpetas" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..5b4f1d9a8672 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Archivo", + "revealInSideBar": "Mostrar en barra lateral", + "acceptLocalChanges": "Usar los cambios y sobrescribir el contenido del disco", + "revertLocalChanges": "Descartar los cambios y volver al contenido del disco" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..849c94fa0c7e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Reintentar", + "rename": "Cambiar nombre", + "newFile": "Nuevo archivo", + "newFolder": "Nueva carpeta", + "openFolderFirst": "Abra primero una carpeta para crear archivos o carpetas en ella.", + "newUntitledFile": "Nuevo archivo sin título", + "createNewFile": "Nuevo archivo", + "createNewFolder": "Nueva carpeta", + "deleteButtonLabelRecycleBin": "&&Mover a la papelera de reciclaje", + "deleteButtonLabelTrash": "&&Mover a la papelera", + "deleteButtonLabel": "&&Eliminar", + "dirtyMessageFolderOneDelete": "Va a eliminar una carpeta con cambios sin guardar en 1 archivo. ¿Desea continuar?", + "dirtyMessageFolderDelete": "Va a eliminar una carpeta con cambios sin guardar en {0} archivos. ¿Desea continuar?", + "dirtyMessageFileDelete": "Va a eliminar un archivo con cambios sin guardar. ¿Desea continuar?", + "dirtyWarning": "Los cambios se perderán si no se guardan.", + "confirmMoveTrashMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido?", + "confirmMoveTrashMessageFile": "¿Está seguro de que desea eliminar '{0}'?", + "undoBin": "Puede restaurar desde la papelera de reciclaje.", + "undoTrash": "Puede restaurar desde la papelera.", + "doNotAskAgain": "No volver a preguntarme", + "confirmDeleteMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido de forma permanente?", + "confirmDeleteMessageFile": "¿Está seguro de que desea eliminar '{0}' de forma permanente?", + "irreversible": "Esta acción es irreversible.", + "permDelete": "Eliminar permanentemente", + "delete": "Eliminar", + "importFiles": "Importar archivos", + "confirmOverwrite": "Ya existe un archivo o carpeta con el mismo nombre en la carpeta de destino. ¿Quiere reemplazarlo?", + "replaceButtonLabel": "&&Reemplazar", + "copyFile": "Copiar", + "pasteFile": "Pegar", + "duplicateFile": "Duplicado", + "openToSide": "Abrir en el lateral", + "compareSource": "Seleccionar para comparar", + "globalCompareFile": "Comparar archivo activo con...", + "openFileToCompare": "Abrir un archivo antes para compararlo con otro archivo.", + "compareWith": "Comparar \"{0}\" con \"{1}\"", + "compareFiles": "Comparar archivos", + "refresh": "Actualizar", + "save": "Guardar", + "saveAs": "Guardar como...", + "saveAll": "Guardar todos", + "saveAllInGroup": "Guardar todo en el grupo", + "saveFiles": "Guardar todos los archivos", + "revert": "Revertir archivo", + "focusOpenEditors": "Foco sobre la vista de editores abiertos", + "focusFilesExplorer": "Enfocar Explorador de archivos", + "showInExplorer": "Mostrar el archivo activo en la barra lateral", + "openFileToShow": "Abra primero un archivo para mostrarlo en el explorador.", + "collapseExplorerFolders": "Contraer carpetas en el Explorador", + "refreshExplorer": "Actualizar Explorador", + "openFileInNewWindow": "Abrir archivo activo en nueva ventana", + "openFileToShowInNewWindow": "Abrir un archivo antes para abrirlo en una nueva ventana", + "revealInWindows": "Mostrar en el Explorador", + "revealInMac": "Mostrar en Finder", + "openContainer": "Abrir carpeta contenedora", + "revealActiveFileInWindows": "Mostrar archivo activo en el Explorador de Windows", + "revealActiveFileInMac": "Mostrar archivo activo en Finder", + "openActiveFileContainer": "Abrir carpeta contenedora del archivo activo", + "copyPath": "Copiar ruta de acceso", + "copyPathOfActive": "Copiar ruta del archivo activo", + "emptyFileNameError": "Debe especificarse un nombre de archivo o carpeta.", + "fileNameExistsError": "Ya existe el archivo o carpeta **{0}** en esta ubicación. Elija un nombre diferente.", + "invalidFileNameError": "El nombre **{0}** no es válido para el archivo o la carpeta. Elija un nombre diferente.", + "filePathTooLongError": "El nombre **{0}** da como resultado una ruta de acceso demasiado larga. Elija un nombre más corto.", + "compareWithSaved": "Comparar el archivo activo con el guardado", + "modifiedLabel": "{0} (en el disco) ↔ {1}", + "compareWithClipboard": "Comparar archivo activo con portapapeles", + "clipboardComparisonLabel": "Clipboard ↔ {0}" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..f417c4b11aae --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Abrir un archivo antes para copiar su ruta de acceso", + "openFileToReveal": "Abrir un archivo antes para mostrarlo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..6b7926d2bf70 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Mostrar explorador", + "explore": "Explorador", + "view": "Ver", + "textFileEditor": "Editor de archivos de texto", + "binaryFileEditor": "Editor de archivos binarios", + "filesConfigurationTitle": "Archivos", + "exclude": "Configurar los patrones globales para excluir archivos y carpetas. Por ejemplo, el explorador de archivos decide que archivos y carpetas mostrar u ocultar según esta configuración.", + "files.exclude.boolean": "El patrón global con el que se harán coincidir las rutas de acceso de los archivos. Establézcalo en true o false para habilitarlo o deshabilitarlo.", + "files.exclude.when": "Comprobación adicional de los elementos del mismo nivel de un archivo coincidente. Use $(nombreBase) como variable para el nombre de archivo que coincide.", + "associations": "Configure asociaciones de archivo para los lenguajes (por ejemplo, \"*.extension\": \"html\"). Estas asociaciones tienen prioridad sobre las asociaciones predeterminadas de los lenguajes instalados.", + "encoding": "La codificación del juego de caracteres predeterminada que debe utilizarse al leer y escribir archivos. Este ajuste puede configurarse también por idioma.", + "autoGuessEncoding": "Cuando está activada, intentará adivinar la codificación del juego de caracteres al abrir archivos. Este ajuste puede configurarse también por idioma.", + "eol": "Carácter predeterminado de final de línea. Utilice \\n para LF y \\r\\n para CRLF.", + "trimTrailingWhitespace": "Si se habilita, se recortará el espacio final cuando se guarde un archivo.", + "insertFinalNewline": "Si se habilita, inserte una nueva línea final al final del archivo cuando lo guarde.", + "trimFinalNewlines": "Cuando se habilita, recorta todas las nuevas líneas después de la última nueva línea al final del archivo al guardarlo", + "files.autoSave.off": "Un archivo con modificaciones no se guarda nunca automáticamente.", + "files.autoSave.afterDelay": "Un archivo con modificaciones se guarda automáticamente tras la propiedad \"files.autoSaveDelay\" configurada.", + "files.autoSave.onFocusChange": "Un archivo con modificaciones se guarda automáticamente cuando el editor deja de fijarse en él.", + "files.autoSave.onWindowChange": "Un archivo con modificaciones se guarda automáticamente cuando la ventana deja de fijarse en él.", + "autoSave": "Controla el guardado automático de los archivos modificados. Valores aceptados: \"{0}\", \"{1}\", \"{2}\" (el editor pierde el foco), \"{3}\" (la ventana pierde el foco) . Si se establece en \"{4}\", puede configurar el retraso en \"files.autoSaveDelay\".", + "autoSaveDelay": "Controla el retraso en MS tras el cual un archivo con modificaciones se guarda automáticamente. Solo se aplica si \"files.autoSave\" está establecido en \"{0}\"", + "watcherExclude": "Configure patrones globales de las rutas de acceso de archivo que se van a excluir de la inspección de archivos. Los patrones deben coincidir con rutas de acceso absolutas (por ejemplo, prefijo ** o la ruta de acceso completa para que la coincidencia sea correcta). Al cambiar esta configuración, es necesario reiniciar. Si observa que Code consume mucho tiempo de CPU al iniciarse, puede excluir las carpetas grandes para reducir la carga inicial. ", + "hotExit.off": "Deshabilita la salida rápida.", + "hotExit.onExit": "hotExit se desencadena al cerrar la aplicación, es decir, al cerrarse la última ventana en Windows/Linux o cuando se desencadena el comando workbench.action.quit (paleta de comandos, enlace de teclado, menú). Todas las ventanas con copias de seguridad se restaurarán la próxima vez que se inicie.", + "hotExit.onExitAndWindowClose": "La salida rápida se desencadena al cerrar la aplicación, es decir, al cerrarse la última ventana en Windows/Linux o cuando se desencadena el comando workbench.action.quit (paleta de comandos, enlace de teclado, menú), y también para cualquier ventana que tenga una carpeta abierta, independientemente de que sea o no la última ventana. Todas las ventanas sin carpetas abiertas se restaurarán la próxima vez que se inicie. Para restaurar las ventanas con carpetas tal cual estaban antes de cerrarse, establezca \"window.restoreWindows\" a \"all\".", + "hotExit": "Controla si los archivos no guardados se recuerdan entre las sesiones, lo que permite omitir el mensaje para guardar al salir del editor.", + "useExperimentalFileWatcher": "Utilice el nuevo monitor de archivo experimental.", + "defaultLanguage": "El modo de lenguaje predeterminado que se asigna a nuevos archivos.", + "editorConfigurationTitle": "Editor", + "formatOnSave": "Formatea un archivo al guardarlo. Debe haber un formateador disponible, el archivo no debe guardarse automáticamente y el editor no debe estar cerrándose.", + "explorerConfigurationTitle": "Explorador de archivos", + "openEditorsVisible": "Número de editores mostrados en el panel Editores abiertos. Establezca este valor en 0 para ocultar el panel.", + "dynamicHeight": "Controla si la altura de la sección de editores abiertos debería adaptarse o no de forma dinámica al número de elementos.", + "autoReveal": "Controla si el explorador debe mostrar y seleccionar automáticamente los archivos al abrirlos.", + "enableDragAndDrop": "Controla si el explorador debe permitir mover archivos y carpetas mediante la función arrastrar y colocar.", + "confirmDragAndDrop": "Controla si el explorador debe pedir la confirmación al reubicar archivos o carpetas a través de arrastrar y soltar.", + "confirmDelete": "Controla si el explorador debe pedir la confirmación al borrar un archivo utilizando la papelera.", + "sortOrder.default": "Los archivos y las carpetas se ordenan por nombre alfabéticamente. Las carpetas se muestran antes que los archivos.", + "sortOrder.mixed": "Los archivos y las carpetas se ordenan por nombre alfabéticamente. Los archivos se entrelazan con las carpetas.", + "sortOrder.filesFirst": "Los archivos y las carpetas se ordenan por nombre alfabéticamente. Los archivos se muestran antes que las carpetas.", + "sortOrder.type": "Los archivos y las carpetas se ordenan por extensión. Las carpetas se muestran antes que los archivos.", + "sortOrder.modified": "Los archivos y las carpetas se ordenan por fecha de última modificación. Las carpetas se muestran antes que los archivos.", + "sortOrder": "Controla el criterio de ordenación de los archivos y las carpetas en el explorador. Además del orden \"default\", puede establecer el orden en \"mixed\" (los archivos y las carpetas se ordenan combinados), \"type\" (por tipo de archivo), \"modified\" (por fecha de última modificación) o \"filesFirst\" (los archivos se colocan antes que las carpetas).", + "explorer.decorations.colors": "Controla si las decoraciones de archivo deben utilizar colores. ", + "explorer.decorations.badges": "Controla si las decoraciones de archivo deben utilizar insignias" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..186f5cdaa427 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Use las acciones de la barra de herramientas del editor situada a la derecha para **deshacer** los cambios o **sobrescribir** el contenido del disco con sus cambios", + "discard": "Descartar", + "overwrite": "Sobrescribir", + "retry": "Reintentar", + "readonlySaveError": "No se pudo guardar '{0}': El archivo está protegido contra escritura. Seleccione \"Sobrescribir\" para quitar la protección.", + "genericSaveError": "No se pudo guardar '{0}': {1}", + "staleSaveError": "No se pudo guardar '{0}': El contenido del disco es más reciente. Haga clic en **Comparar** para comparar su versión con la que hay en el disco.", + "compareChanges": "Comparar", + "saveConflictDiffLabel": "0} (on disk) ↔ {1} (in {2}) - Resolver conflicto guardado" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..bed30ddc0287 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "No hay ninguna carpeta abierta", + "explorerSection": "Sección del Explorador de archivos", + "noWorkspaceHelp": "Todavía no ha agregado una carpeta al espacio de trabajo.", + "addFolder": "Agregar Carpeta", + "noFolderHelp": "Todavía no ha abierto ninguna carpeta.", + "openFolder": "Abrir carpeta" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..e05ecb0ff0e6 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Explorador", + "canNotResolve": "No se puede resolver la carpeta de trabajo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..3c7ee5abd0c5 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Sección del Explorador de archivos", + "treeAriaLabel": "Explorador de archivos" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..695039c3919b --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Escriba el nombre de archivo. Presione ENTRAR para confirmar o Esc para cancelar", + "filesExplorerViewerAriaLabel": "{0}, Explorador de archivos", + "dropFolders": "¿Quiere agregar las carpetas al área de trabajo?", + "dropFolder": "¿Quiere agregar la carpeta al área de trabajo?", + "addFolders": "&&Agregar carpetas", + "addFolder": "&&Agregar carpeta", + "confirmMove": "¿Está seguro de que desea mover '{0}'?", + "doNotAskAgain": "No volver a preguntarme", + "moveButtonLabel": "&&Mover", + "confirmOverwriteMessage": "'{0}' ya existe en la carpeta de destino. ¿Desea reemplazarlo?", + "irreversible": "Esta acción es irreversible.", + "replaceButtonLabel": "&&Reemplazar" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..b4bad361098c --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Editores abiertos", + "openEditosrSection": "Sección Editores abiertos", + "dirtyCounter": "{0} sin guardar", + "saveAll": "Guardar todos", + "closeAllUnmodified": "Cerrar los que no se han modificado", + "closeAll": "Cerrar todo", + "compareWithSaved": "Comparar con el guardado", + "close": "Cerrar", + "closeOthers": "Cerrar otros" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..f43443fbdd06 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, grupo de editores", + "openEditorAriaLabel": "{0}, abrir editor", + "saveAll": "Guardar todos", + "closeAllUnmodified": "Cerrar los que no se han modificado", + "closeAll": "Cerrar todo", + "compareWithSaved": "Comparar con el guardado", + "close": "Cerrar", + "closeOthers": "Cerrar otros" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..98e543b79753 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "totalProblems": "Total {0} Problemas", + "filteredProblems": "Mostrando {0} de {1} problemas" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/common/messages.i18n.json index 967a2c1221bd..a028050eafbc 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,7 @@ { "viewCategory": "Ver", "problems.view.toggle.label": "Alternar Problemas ", - "problems.view.show.label": "Mostrar problemas", - "problems.view.hide.label": "Ocultar problemas", + "problems.view.focus.label": "Problemas de enfoque", "problems.panel.configuration.title": "Vista Problemas", "problems.panel.configuration.autoreveal": "Controla si la vista Problemas debe revelar automáticamente los archivos cuando los abre", "markers.panel.title.problems": "Problemas", diff --git a/i18n/esn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/esn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..8aa6eb775bed --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "Los perfiles se crearon correctamente.", + "prof.detail": "Cree un problema y asóciele manualmente los siguientes archivos: {0}", + "prof.restartAndFileIssue": "Crear problema y reiniciar", + "prof.restart": "Reiniciar", + "prof.thanks": "Gracias por ayudarnos.", + "prof.detail.restart": "Se necesita un reinicio final para continuar utilizando '{0}'. De nuevo, gracias por su aportación." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index ebc1493ef92c..e52d04db2eae 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "Presione la combinación de teclas que desee y después ENTRAR. Presione ESCAPE para cancelar.", + "defineKeybinding.initial": "Presione la combinación de teclas deseada y ENTRAR", "defineKeybinding.chordsTo": "chord to" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 4d507416fe8f..a8c228e21360 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "Cambiar enlace de teclado", "addKeybindingLabelWithKey": "Agregar enlace de teclado {0}", "addKeybindingLabel": "Agregar enlace de teclado", + "title": "{0} ({1})", "commandAriaLabel": "El comando es {0}.", "keybindingAriaLabel": "El enlace de teclado es {0}.", "noKeybinding": "No se ha asignado ningún enlace de teclado.", diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 402cc5d581e9..bfc605b3a917 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openRawDefaultSettings": "Abrir Configuración Predeterminada Raw", "openGlobalSettings": "Abrir configuración de usuario", "openGlobalKeybindings": "Abrir métodos abreviados de teclado", "openGlobalKeybindingsFile": "Abrir el archivo de métodos abreviados de teclado", diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 35264ae0434c..d4ccc7af05b1 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Configuración predeterminada", "SearchSettingsWidget.AriaLabel": "Buscar configuración", "SearchSettingsWidget.Placeholder": "Buscar configuración", - "totalSettingsMessage": "{0} configuraciones en total", "noSettingsFound": "Sin resultados", "oneSettingFound": "Coincide 1 configuración", "settingsFound": "{0} configuraciones coincidentes", - "fileEditorWithInputAriaLabel": "{0}. Editor de archivos de texto.", - "fileEditorAriaLabel": "Editor de archivos de texto.", + "totalSettingsMessage": "{0} configuraciones en total", + "defaultSettings": "Configuración predeterminada", + "defaultFolderSettings": "Configuración de carpeta predeterminada", "defaultEditorReadonly": "Editar en el editor de lado de mano derecha para reemplazar valores predeterminados.", "preferencesAriaLabel": "Preferencias predeterminadas. Editor de texto de solo lectura." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index c1606c5e1a9e..7ed7ff160244 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Coloque aquí su configuración para sobrescribir la configuración predeterminada.", "emptyWorkspaceSettingsHeader": "Coloque aquí su configuración para sobrescribir la configuración de usuario.", "emptyFolderSettingsHeader": "Coloque aquí su configuración de carpeta para sobrescribir la que se especifica en la configuración de área de trabajo.", - "defaultFolderSettingsTitle": "Configuración de carpeta predeterminada", - "defaultSettingsTitle": "Configuración predeterminada", "editTtile": "Editar", "replaceDefaultValue": "Reemplazar en Configuración", "copyDefaultValue": "Copiar en Configuración", diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 41053cf2b5e3..b720c2b8a572 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Pruebe la búsqueda parcial", + "defaultSettingsFuzzyPrompt": "¡Intentar la búsqueda del lenguaje natural!", "defaultSettings": "Colocar la configuración en el editor de lado de mano derecha para anular.", "noSettingsFound": "No se encontró ninguna configuración.", - "folderSettingsDetails": "Configuración de carpeta", - "enableFuzzySearch": "Habilitar búsqueda parcial experimental" + "settingsSwitcherBarAriaLabel": "Conmutador de configuración", + "userSettings": "Configuración de usuario", + "workspaceSettings": "Configuración de área de trabajo", + "folderSettings": "Configuración de Carpeta", + "enableFuzzySearch": "Habilitar búsqueda en lenguaje natural" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..dd7480cb5342 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Editor de preferencias predeterminado", + "keybindingsEditor": "Editor de enlaces de teclado", + "preferences": "Preferencias" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 6b08e43a2919..7f679305c9e3 100644 --- a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Proveedores de Control de Código fuente", "hideRepository": "Ocultar", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Instalar proveedores adicionales de SCM...", "no open repo": "No hay proveedores de control de código fuente activos.", "source control": "Control de código fuente", diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 38a5525c74ad..906114aeb5e4 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "entrada", - "useIgnoreFilesDescription": "Usar archivos ignore", - "useExcludeSettingsDescription": "Usar Excluir configuración" + "useExcludesAndIgnoreFilesDescription": "Usar la Configuración de Exclusión e Ignorar Archivos" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 1a0bd6edd0f5..ffd95f2732da 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "El patrón global con el que se harán coincidir las rutas de acceso de los archivos. Establézcalo en true o false para habilitarlo o deshabilitarlo.", "exclude.when": "Comprobación adicional de los elementos del mismo nivel de un archivo coincidente. Use $(nombreBase) como variable para el nombre de archivo que coincide.", "useRipgrep": "Controla si se utiliza ripgrep en la búsqueda de texto y ficheros", - "useIgnoreFilesByDefault": "Controla si se utilizan los archivos .gitignore e .ignore de forma predeterminada al buscar en una nueva área de trabajo.", "useIgnoreFiles": "Controla si se utilizan los archivos .gitignore e .ignore al buscar archivos.", "search.quickOpen.includeSymbols": "Configurar para incluir los resultados de una búsqueda global de símbolos en los resultados de archivos de Quick Open.", "search.followSymlinks": "Controla si va a seguir enlaces simbólicos durante la búsqueda." diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 7d28af93190c..bcfc62d19060 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Mostrar búsqueda anterior de patrón exclude ", "nextSearchTerm": "Mostrar siguiente término de búsqueda", "previousSearchTerm": "Mostrar anterior término de búsqueda", - "focusNextInputBox": "Centrarse en el siguiente cuadro de entrada", - "focusPreviousInputBox": "Centrarse en el anterior cuadro de entrada", "showSearchViewlet": "Mostrar búsqueda", "findInFiles": "Buscar en archivos", "findInFilesWithSelectedText": "Buscar en ficheros de texto seleccionado", "replaceInFiles": "Reemplazar en archivos", "replaceInFilesWithSelectedText": "Reemplazar en archivos con el texto seleccionado", - "findInWorkspace": "Buscar en área de trabajo...", - "findInFolder": "Buscar en carpeta...", "RefreshAction.label": "Actualizar", - "ClearSearchResultsAction.label": "Borrar resultados de la búsqueda", + "CollapseDeepestExpandedLevelAction.label": "Contraer todo", + "ClearSearchResultsAction.label": "Borrar", "FocusNextSearchResult.label": "Centrarse en el siguiente resultado de la búsqueda", "FocusPreviousSearchResult.label": "Centrarse en el anterior resultado de la búsqueda", "RemoveAction.label": "Despedir", diff --git a/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..fe7e74dbe334 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Ir al símbolo en el área de trabajo...", + "name": "Buscar", + "search": "Buscar", + "view": "Ver", + "openAnythingHandlerDescription": "Ir al archivo", + "openSymbolDescriptionNormal": "Ir al símbolo en el área de trabajo", + "searchOutputChannelTitle": "Buscar", + "searchConfigurationTitle": "Buscar", + "exclude": "Configure patrones globales para excluir archivos y carpetas de las búsquedas. Hereda todos los patrones globales de la configuración files.exclude.", + "exclude.boolean": "El patrón global con el que se harán coincidir las rutas de acceso de los archivos. Establézcalo en true o false para habilitarlo o deshabilitarlo.", + "exclude.when": "Comprobación adicional de los elementos del mismo nivel de un archivo coincidente. Use $(nombreBase) como variable para el nombre de archivo que coincide.", + "useRipgrep": "Controla si se utiliza ripgrep en la búsqueda de texto y ficheros", + "useIgnoreFiles": "Controla si se utilizan los archivos .gitignore e .ignore al buscar archivos.", + "search.quickOpen.includeSymbols": "Configurar para incluir los resultados de una búsqueda global de símbolos en los resultados de archivos de Quick Open.", + "search.followSymlinks": "Controla si debe seguir enlaces simbólicos durante la búsqueda." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/esn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..824168d9089b --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "Buscar en carpeta...", + "findInWorkspace": "Buscar en área de trabajo..." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 26d019052c58..aeb9febd9fc7 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "Tareas", "ConfigureTaskRunnerAction.label": "Configurar tarea", - "ConfigureBuildTaskAction.label": "Configurar tarea de compilación", "CloseMessageAction.label": "Cerrar", - "ShowTerminalAction.label": "Ver terminal", "problems": "Problemas", + "building": "Compilando...", "manyMarkers": "Más de 99", "runningTasks": "Mostrar tareas en ejecución", "tasks": "Tareas", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "No se encontraron tareas para ejecutar. Configurar tareas...", "TaskService.fetchingBuildTasks": "Obteniendo tareas de compilación...", "TaskService.pickBuildTask": "Seleccione la tarea de compilación para ejecutar", - "TaskService.noBuildTask": "No se encontraron tareas de compilación para ejecutar. Configurar tareas...", + "TaskService.noBuildTask": "No se encontraron tareas de compilación para ejecutar. Configurar tareas de compilación...", "TaskService.fetchingTestTasks": "Capturando tareas de prueba...", "TaskService.pickTestTask": "Seleccione la tarea de prueba para ejecutar", "TaskService.noTestTaskTerminal": "No se encontraron tareas de prueba para ejecutar. Configurar tareas...", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index a3bf48c132eb..46ceb4b72313 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "Error desconocido durante la ejecución de una tarea. Vea el registro de resultados de la tarea para obtener más detalles.", "dependencyFailed": "No se pudo resolver la tarea dependiente '{0}' en la carpeta del área de trabajo '{1}'", "TerminalTaskSystem.terminalName": "Tarea - {0}", + "closeTerminal": "Pulse cualquier tecla para cerrar el terminal", "reuseTerminal": "Las tareas reutilizarán el terminal, presione cualquier tecla para cerrarlo.", "TerminalTaskSystem": "No se puede ejecutar un comando shell en una unidad UNC.", "unkownProblemMatcher": "No puede resolver el comprobador de problemas {0}. Será omitido." diff --git a/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index f6279ef66059..abc8b42466a7 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,8 @@ "ConfigurationParser.noTypeDefinition": "Error: No hay ningún tipo de tarea \"{0}\" registrado. ¿Omitió la instalación de una extensión que proporciona un proveedor de tareas correspondiente?", "ConfigurationParser.missingRequiredProperty": "Error: la configuración de la tarea '{0}' no contiene la propiedad requerida '{1}'. Se omitirá la configuración de la tarea.", "ConfigurationParser.notCustom": "Error: Las tareas no se declaran como una tarea personalizada. La configuración se omitirá.\n{0}\n", - "ConfigurationParser.noTaskName": "Error: Las tareas deben proporcionar una propiedad taskName. La tarea se ignorará. {0}", - "taskConfiguration.shellArgs": "Advertencia: La tarea \"{0}\" es un comando de shell y su nombre de comando o uno de sus argumentos tiene espacios sin escape. Para asegurarse de que la línea de comandos se cite correctamente, combine mediante fusión los argumentos en el comando.", + "ConfigurationParser.noTaskName": "Error: Las tareas deben proporcionar una propiedad label. La tarea se ignorará.\n{0}\n", + "taskConfiguration.shellArgs": "Advertencia: La tarea '{0}' es un comando de shell y uno de sus argumentos podría tener espacios sin escape. Para asegurarse de que la línea de comandos se cite correctamente, fusione mediante combinación los argumentos en el comando.", "taskConfiguration.noCommandOrDependsOn": "Error: La tarea \"{0}\" no especifica un comando ni una propiedad dependsOn. La tarea se ignorará. Su definición es: \n{1}", "taskConfiguration.noCommand": "Error: La tarea \"{0}\" no define un comando. La tarea se ignorará. Su definición es: {1}", "TaskParse.noOsSpecificGlobalTasks": "La versión de tarea 2.0.0 no admite tareas específicas de SO globales. Conviértalas en una tarea con un comando específico de SO. Estas son las tareas afectadas:\n{0}" diff --git a/i18n/esn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index 34f865d0af23..e86ad1697c17 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,6 @@ { "termEntryAriaLabel": "{0}, selector de terminal", "termCreateEntryAriaLabel": "{0}, crear nueva terminal", - "'workbench.action.terminal.newplus": "$(plus) crear nueva Terminal integrada", "noTerminalsMatching": "No hay terminales coincidentes", "noTerminalsFound": "No hay terminales abiertos" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 107a0eecf8ae..dad0465be35e 100644 --- a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,14 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "Tema de color", + "themes.category.light": "temas claros", + "themes.category.dark": "temas oscuros", "installColorThemes": "Instalar temas de color adicionales...", "themes.selectTheme": "Seleccione el tema de color (flecha arriba/abajo para vista previa)", "selectIconTheme.label": "Tema de icono de archivo", - "installIconThemes": "Instalar temas de icono de archivo adicionles...", "noIconThemeLabel": "Ninguno", "noIconThemeDesc": "Deshabilitar iconos de archivo", - "problemChangingIconTheme": "Problema al configurar el tema de icono: {0}", + "installIconThemes": "Instalar temas de icono de archivo adicionles...", "themes.selectIconTheme": "Seleccionar tema de icono de archivo", "generateColorTheme.label": "General el tema de color desde la configuración actual", "preferences": "Preferencias", diff --git a/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 9461c69f6889..caa5ba374139 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Configuración específica para ventanas, que se puede definir en la configuración de usuario o de área de trabajo.", "scope.resource.description": "Configuración específica para recursos, que se puede definir en la configuración de usuario, de área de trabajo o de carpeta.", "scope.description": "Ámbito donde es aplicable la configuración. Los ámbitos disponibles son \"window\" y \"resource\".", + "vscode.extension.contributes.defaultConfiguration": "Contribuye a la configuración de los parámetros del editor predeterminados por lenguaje.", "vscode.extension.contributes.configuration": "Aporta opciones de configuración.", "invalid.title": "configuration.title debe ser una cadena", - "vscode.extension.contributes.defaultConfiguration": "Contribuye a la configuración de los parámetros del editor predeterminados por lenguaje.", "invalid.properties": "configuration.properties debe ser un objeto", "invalid.allOf": "'configuration.allOf' está en desuso y ya no debe ser utilizado. En cambio, pase varias secciones de configuración como un arreglo al punto de contribución 'configuration'.", "workspaceConfig.folders.description": "Lista de carpetas para cargar en el área de trabajo. ", diff --git a/i18n/esn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/esn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..fb3b052d7b4b --- /dev/null +++ b/i18n/esn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetría", + "telemetry.enableCrashReporting": "Habilite los informes de bloqueo para enviarlos a Microsoft. Esta opción requiere reiniciar para que tenga efecto." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/esn/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 74a0358730f2..134d1d486280 100644 --- a/i18n/esn/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "bubbleTitle": "contiene elementos resaltados" + "bubbleTitle": "Contiene elementos resaltados" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 0e9ec06b1bfa..1e7e9507ab33 100644 --- a/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -9,5 +9,6 @@ "extensionHostProcess.crash": "El host de extensiones finalizó inesperadamente.", "extensionHostProcess.unresponsiveCrash": "Se terminó el host de extensiones porque no respondía.", "overwritingExtension": "Sobrescribiendo la extensión {0} con {1}.", - "extensionUnderDevelopment": "Cargando la extensión de desarrollo en {0}" + "extensionUnderDevelopment": "Cargando la extensión de desarrollo en {0}", + "extensionCache.invalid": "Las extensiones han sido modificadas en disco. Por favor, vuelva a cargar la ventana." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/esn/src/vs/workbench/services/files/node/fileService.i18n.json index 32802572ad8b..35eecc941834 100644 --- a/i18n/esn/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "Archivo es el directorio", "fileNotModifiedError": "Archivo no modificado desde", "fileTooLargeError": "Archivo demasiado grande para abrirlo", - "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto", "fileNotFoundError": "Archivo no encontrado ({0})", + "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto", "fileExists": "El archivo a crear ya existe ({0})", "fileMoveConflict": "No se puede mover o copiar. El archivo ya existe en la ubicación de destino. ", "unableToMoveCopyError": "No se puede mover o copiar. El archivo reemplazaría a la carpeta que lo contiene.", diff --git a/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 3c4bba8db16d..c94ca02c9334 100644 --- a/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -22,5 +22,5 @@ "keybindings.json.when": "Condición cuando la tecla está activa.", "keybindings.json.args": "Argumentos que se pasan al comando para ejecutar.", "keyboardConfigurationTitle": "Teclado", - "dispatch": "Controla la lógica de distribución de las pulsaciones de teclas para usar `keydown.code` (recomendado) o `keydown.keyCode`." + "dispatch": "Controla la lógica de distribución de las pulsaciones de teclas para usar `code` (recomendado) o `keyCode`." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/esn/src/vs/workbench/services/textfile/common/textFileService.i18n.json index ab812aaa0987..671c3c1b0601 100644 --- a/i18n/esn/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "files.backup.failSave": "No se pudo hacer una copia de seguridad de los archivos (Error: {0}). Intente guardar los archivos para salir." + "files.backup.failSave": "No se pudo hacer una copia de seguridad de los archivos con modificaciones pendientes (Error: {0}). Intente guardar los archivos antes de salir." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index cb85af9d3cdf..302c7ed170b6 100644 --- a/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "Se han agregado nuevos valores de tema a la configuración de usuario. Hay una copia de seguridad disponible en {0}.", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "Specifies the color theme used in the workbench.", "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Especifica el tema de icono utilizado en el área de trabajo o \"null\" para no mostrar ningún icono de archivo.", diff --git a/i18n/fra/extensions/css/client/out/cssMain.i18n.json b/i18n/fra/extensions/css/client/out/cssMain.i18n.json index b21ec04c2536..d82cbdd1b348 100644 --- a/i18n/fra/extensions/css/client/out/cssMain.i18n.json +++ b/i18n/fra/extensions/css/client/out/cssMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "cssserver.name": "Serveur de langage CSS" + "cssserver.name": "Serveur de langage CSS", + "folding.start": "Début de la région repliable", + "folding.end": "Fin de la région repliable" } \ No newline at end of file diff --git a/i18n/fra/extensions/git/out/autofetch.i18n.json b/i18n/fra/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..c7e1b61f3ec5 --- /dev/null +++ b/i18n/fra/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Oui", + "no": "Non", + "not now": "Pas maintenant", + "suggest auto fetch": "Voulez-vous activer la rappatriement automatique des dépôts Git ?" +} \ No newline at end of file diff --git a/i18n/fra/extensions/git/out/commands.i18n.json b/i18n/fra/extensions/git/out/commands.i18n.json index e0dab3e5a124..ec8efb3f0d7c 100644 --- a/i18n/fra/extensions/git/out/commands.i18n.json +++ b/i18n/fra/extensions/git/out/commands.i18n.json @@ -9,9 +9,12 @@ "create branch": "$(plus) Créer nouvelle branche", "repourl": "URL du dépôt", "parent": "Répertoire parent", + "cancel": "$(sync~spin) Clonage du dépôt... Cliquer pour annuler", + "cancel tooltip": "Annuler le clonage", "cloning": "Clonage du dépôt git...", "openrepo": "Ouvrir le dépôt", "proposeopen": "Voulez-vous ouvrir le dépôt cloné ?", + "init": "Choisir le dossier d’espace de travail dans lequel initialiser le dépôt git", "init repo": "Initialiser le dépôt", "create repo": "Initialiser le dépôt", "are you sure": "Ceci va créer un dépôt Git dans '{0}'. Êtes-vous sûr de vouloir continuer ?", @@ -49,12 +52,15 @@ "select branch to delete": "Sélectionner une branche à supprimer", "confirm force delete branch": "La branche '{0}' n'est pas complètement fusionnée. Supprimer quand même ?", "delete branch": "Supprimer la branche", + "invalid branch name": "Nom de la branche non valide", + "branch already exists": "Une branche nommée '0}' existe déjà", "select a branch to merge from": "Sélectionner une branche à fusionner", "merge conflicts": "Il existe des conflits de fusion. Corrigez-les avant la validation.", "tag name": "Nom de la balise", "provide tag name": "Spécifiez un nom de balise", "tag message": "Message", "provide tag message": "Spécifiez un message pour annoter la balise", + "no remotes to fetch": "Ce dépôt n'a aucun dépôt distant configuré pour rappatrier.", "no remotes to pull": "Votre dépôt n'a aucun dépôt distant configuré pour un Pull.", "pick remote pull repo": "Choisir un dépôt distant duquel extraire la branche", "no remotes to push": "Votre dépôt n'a aucun dépôt distant configuré pour un Push.", @@ -71,7 +77,7 @@ "no stashes": "Aucune remise (stash) à restaurer.", "pick stash to pop": "Choisir une remise (stash) à appliquer et supprimer", "clean repo": "Nettoyez l'arborescence de travail de votre dépôt avant l'extraction.", - "cant push": "Push impossible des références vers la branche distante. Exécutez d'abord 'Extraire' pour intégrer vos modifications.", + "cant push": "impossible de pousser les références vers la branche distante. Exécutez d'abord 'Récupérer' pour intégrer vos modifications.", "git error details": "Git : {0}", "git error": "Erreur Git", "open git log": "Ouvrir le journal Git" diff --git a/i18n/fra/extensions/git/out/main.i18n.json b/i18n/fra/extensions/git/out/main.i18n.json index 7ce7bde078c2..87c8761c8f5f 100644 --- a/i18n/fra/extensions/git/out/main.i18n.json +++ b/i18n/fra/extensions/git/out/main.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Recherche de git dans : {0}", "using git": "Utilisation de git {0} à partir de {1}", - "updateGit": "Mettre à jour Git", + "downloadgit": "Télécharger Git", "neverShowAgain": "Ne plus afficher", + "notfound": "Git non trouvé. Installez-le et configurez-le en utilisant le paramètre 'git.path'.", + "updateGit": "Mettre à jour Git", "git20": "Git {0} semble installé. Le code fonctionne mieux avec git >= 2" } \ No newline at end of file diff --git a/i18n/fra/extensions/git/out/repository.i18n.json b/i18n/fra/extensions/git/out/repository.i18n.json index 75b81935d063..e53c292db108 100644 --- a/i18n/fra/extensions/git/out/repository.i18n.json +++ b/i18n/fra/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Supprimé par nos soins", "both added": "Tous deux ajoutés", "both modified": "Tous deux modifiés", + "commitMessage": "Message (press {0} to commit)", "commit": "Commit", "merge changes": "Fusionner les modifications", "staged changes": "Modifications en zone de transit", diff --git a/i18n/fra/extensions/git/package.i18n.json b/i18n/fra/extensions/git/package.i18n.json index f21d3ba66f70..188e2b5ba4a3 100644 --- a/i18n/fra/extensions/git/package.i18n.json +++ b/i18n/fra/extensions/git/package.i18n.json @@ -33,18 +33,22 @@ "command.checkout": "Extraire vers...", "command.branch": "Créer une branche...", "command.deleteBranch": "Supprimer la branche...", + "command.renameBranch": "Renommer la branche...", "command.merge": "Fusionner la branche...", "command.createTag": "Créer une étiquette", + "command.fetch": "Rappatrier", "command.pull": "Pull", "command.pullRebase": "Pull (rebaser)", "command.pullFrom": "Extraire de...", "command.push": "Push", "command.pushTo": "Transfert (Push) vers...", - "command.pushWithTags": "Transférer (Push) avec les étiquettes", + "command.pushWithTags": "Envoyer avec les Tags", "command.sync": "Synchroniser", + "command.syncRebase": "Synchroniser (Rebase)", "command.publish": "Publier la branche", "command.showOutput": "Afficher la sortie Git", "command.ignore": "Ajouter un fichier à .gitignore", + "command.stashIncludeUntracked": "Remiser (Inclure les non-tracés)", "command.stash": "Remiser (stash)", "command.stashPop": "Appliquer et supprimer la remise...", "command.stashPopLatest": "Appliquer et supprimer la dernière remise", @@ -57,6 +61,7 @@ "config.countBadge": "Contrôle le compteur de badges Git. La valeur 'toutes' compte toutes les modifications. La valeur 'suivies' compte uniquement les modifications suivies. La valeur 'désactivé' désactive le compteur.", "config.checkoutType": "Contrôle le type des branches répertoriées pendant l'exécution de 'Extraire vers...'. La valeur 'toutes' montre toutes les références, la valeur 'locales' montre uniquement les branches locales, la valeur 'balises' montre uniquement les balises et la valeur 'distantes' montre uniquement les branches distantes.", "config.ignoreLegacyWarning": "Ignore l'avertissement Git hérité", + "config.ignoreMissingGitWarning": "Ignore l'avertissement quand Git est manquant", "config.ignoreLimitWarning": "Ignore l'avertissement quand il y a trop de modifications dans un dépôt", "config.defaultCloneDirectory": "Emplacement par défaut où cloner un dépôt git", "config.enableSmartCommit": "Validez toutes les modifications en l'absence de modifications en attente.", diff --git a/i18n/fra/extensions/html/client/out/htmlMain.i18n.json b/i18n/fra/extensions/html/client/out/htmlMain.i18n.json index 22aacfce94f9..5db379fe3bec 100644 --- a/i18n/fra/extensions/html/client/out/htmlMain.i18n.json +++ b/i18n/fra/extensions/html/client/out/htmlMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "htmlserver.name": "Serveur de langage HTML" + "htmlserver.name": "Serveur de langage HTML", + "folding.start": "Début de la région repliable", + "folding.end": "Fin de la région repliable" } \ No newline at end of file diff --git a/i18n/fra/extensions/markdown/out/commands.i18n.json b/i18n/fra/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..10a62fe5396f --- /dev/null +++ b/i18n/fra/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "Prévisualiser {0}", + "onPreviewStyleLoadError": "Impossible de charger 'markdown.styles' : {0}" +} \ No newline at end of file diff --git a/i18n/fra/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/fra/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..2eb7c81389dc --- /dev/null +++ b/i18n/fra/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Du contenu a été désactivé dans ce document", + "preview.securityMessage.title": "Le contenu potentiellement dangereux ou précaire a été désactivé dans l’aperçu du format markdown. Modifier le paramètre de sécurité Aperçu Markdown afin d’autoriser les contenus non sécurisés ou activer les scripts", + "preview.securityMessage.label": "Avertissement de sécurité de contenu désactivé" +} \ No newline at end of file diff --git a/i18n/fra/extensions/markdown/out/security.i18n.json b/i18n/fra/extensions/markdown/out/security.i18n.json index 3dbb7ee43fd8..6c5b965cc1ad 100644 --- a/i18n/fra/extensions/markdown/out/security.i18n.json +++ b/i18n/fra/extensions/markdown/out/security.i18n.json @@ -11,5 +11,8 @@ "disable.title": "Désactiver", "disable.description": "Autorisez tout le contenu et l’exécution des scripts. Non recommandé", "moreInfo.title": "Informations", + "enableSecurityWarning.title": "Activer l'aperçu d'avertissements de sécurité pour cet espace de travail", + "disableSecurityWarning.title": "Désactiver l'aperçu d'avertissements de sécurité pour cet espace de travail", + "toggleSecurityWarning.description": "N'affecte pas le niveau de sécurité du contenu", "preview.showPreviewSecuritySelector.title": "Sélectionner les paramètres de sécurité pour les aperçus Markdown dans cet espace de travail" } \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/package.i18n.json b/i18n/fra/extensions/merge-conflict/package.i18n.json index 6f812b18e76d..6e17d649390f 100644 --- a/i18n/fra/extensions/merge-conflict/package.i18n.json +++ b/i18n/fra/extensions/merge-conflict/package.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "command.category": "Conflit de fusion", + "command.accept.all-current": "Accepter les modifications actuelles", "command.accept.all-incoming": "Accepter toutes les modifications entrantes", "command.accept.all-both": "Accepter les deux", "command.accept.current": "Accepter les modifications actuelles", diff --git a/i18n/fra/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/fra/extensions/typescript/out/features/completionItemProvider.i18n.json index 91434ab1cb27..c0bfc8799c1f 100644 --- a/i18n/fra/extensions/typescript/out/features/completionItemProvider.i18n.json +++ b/i18n/fra/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "selectCodeAction": "Sélectionner l'action de code à appliquer", "acquiringTypingsLabel": "Acquisition des typings...", "acquiringTypingsDetail": "Acquisition des définitions typings pour IntelliSense.", "autoImportLabel": "Importation automatique de {0}" diff --git a/i18n/fra/extensions/typescript/package.i18n.json b/i18n/fra/extensions/typescript/package.i18n.json index 48b0d5d17dcb..08f12636ad6f 100644 --- a/i18n/fra/extensions/typescript/package.i18n.json +++ b/i18n/fra/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "Ouvrir le journal du serveur TS", "typescript.restartTsServer": "Redémarrer le serveur TS", "typescript.selectTypeScriptVersion.title": "Sélectionner la version de TypeScript", + "typescript.reportStyleChecksAsWarnings": "Rapporter les vérifications de style comme des avertissements", "jsDocCompletion.enabled": "Activer/désactiver les commentaires JSDoc automatiques", "javascript.implicitProjectConfig.checkJs": "Activer/désactiver la vérification sémantique des fichiers JavaScript. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >=2.3.1.", "typescript.npm": "Spécifie le chemin de l'exécutable NPM utilisé pour l'acquisition de type automatique. Nécessite TypeScript >= 2.3.4.", diff --git a/i18n/fra/src/vs/base/common/errorMessage.i18n.json b/i18n/fra/src/vs/base/common/errorMessage.i18n.json index 0276e51a4a05..6e282a92f0c0 100644 --- a/i18n/fra/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/fra/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. Code d'erreur : {1}", - "error.permission.verbose": "Autorisation refusée (HTTP {0})", - "error.permission": "Autorisation refusée", - "error.http.verbose": "{0} (HTTP {1} : {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Erreur de connexion inconnue ({0})", - "error.connection.unknown": "Une erreur de connexion inconnue s'est produite. Soit vous n'êtes plus connecté à Internet, soit le serveur auquel vous êtes connecté est hors connexion.", "stackTrace.format": "{0} : {1}", "error.defaultMessage": "Une erreur inconnue s’est produite. Veuillez consulter le journal pour plus de détails.", "nodeExceptionMessage": "Une erreur système s'est produite ({0})", diff --git a/i18n/fra/src/vs/code/electron-main/main.i18n.json b/i18n/fra/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..ad6ce07850ef --- /dev/null +++ b/i18n/fra/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "Une autre instance de {0} est déjà en cours d'exécution mais ne répond pas", + "secondInstanceNoResponseDetail": "Veuillez s'il vous plaît fermer toutes les autres instances et réessayer à nouveau.", + "secondInstanceAdmin": "Une seconde instance de {0} est déjà en cours d'exécution en tant qu'administrateur.", + "secondInstanceAdminDetail": "Veuillez s'il vous plaît fermer l'autre instance et réessayer à nouveau.", + "close": "&&Fermer" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-main/menus.i18n.json b/i18n/fra/src/vs/code/electron-main/menus.i18n.json index 58e75c2db364..7fc9b17d5caa 100644 --- a/i18n/fra/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/fra/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,12 @@ "miQuit": "Quitter {0}", "miNewFile": "&&Nouveau fichier", "miOpen": "&&Ouvrir...", - "miOpenWorkspace": "&&Ouvrir un espace de travail...", + "miOpenWorkspace": "Ouvrir l'espace de travail...", "miOpenFolder": "Ouvrir le &&dossier", "miOpenFile": "&&Ouvrir un fichier...", "miOpenRecent": "Ouvrir les éléments &&récents", - "miSaveWorkspaceAs": "&&Enregistrer l’espace de travail sous...", - "miAddFolderToWorkspace": "&&Ajouter un dossier à l'espace de travail...", + "miSaveWorkspaceAs": "Enregistrer l’espace de travail sous...", + "miAddFolderToWorkspace": "Ajouter un dossier à l'espace de travail...", "miSave": "&&Enregistrer", "miSaveAs": "Enregistrer &&sous...", "miSaveAll": "Enregistrer to&&ut", @@ -157,7 +157,7 @@ "mMergeAllWindows": "Fusionner toutes les fenêtres", "miToggleDevTools": "Activer/désactiver les ou&&tils de développement", "miAccessibilityOptions": "&&Options d'accessibilité", - "miReportIssues": "S&&ignaler les problèmes", + "miReportIssue": "Signaler un problème", "miWelcome": "&&Bienvenue", "miInteractivePlayground": "Terrain de jeu &&interactif", "miDocumentation": "&&Documentation", @@ -184,6 +184,7 @@ "miDownloadingUpdate": "Téléchargement de la mise à jour...", "miInstallingUpdate": "Installation de la mise à jour...", "miCheckForUpdates": "Rechercher les mises à jour...", - "aboutDetail": "\nVersion {0}\nCommit {1}\nDate {2}\nShell {3}\nRenderer {4}\nNode {5}\nArchitecture {6}", - "okButton": "OK" + "aboutDetail": "Version {0}\nCommit {1}\nDate {2}\nShell {3}\nRenderer {4}\nNode {5}\nArchitecture {6}", + "okButton": "OK", + "copy": "&&Copier" } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/fra/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..9a1e91ba2a5c --- /dev/null +++ b/i18n/fra/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Ces fichiers ont changé pendant ce temps : {0}", + "summary.0": "Aucune modification effectuée", + "summary.nm": "{0} modifications de texte effectuées dans {1} fichiers", + "summary.n0": "{0} modifications de texte effectuées dans un fichier" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index 27e0dbdef639..f74e6c1fbc06 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,16 @@ "fontSize": "Contrôle la taille de police en pixels.", "lineHeight": "Contrôle la hauteur de ligne. Utilisez 0 pour calculer lineHeight à partir de fontSize.", "letterSpacing": "Définit l'espacement des caractères en pixels.", - "lineNumbers": "Contrôle l'affichage des numéros de ligne. Les valeurs possibles sont 'activé', 'désactivé' et 'relatif'. La valeur 'relatif' indique le numéro de ligne à partir de la position actuelle du curseur.", + "lineNumbers.off": "Les numéros de ligne ne sont pas affichés.", + "lineNumbers.on": "Les numéros de ligne sont affichés en nombre absolu.", + "lineNumbers.relative": "Les numéros de ligne sont affichés sous la forme de distance en lignes à la position du curseur.", + "lineNumbers.interval": "Les numéros de ligne sont affichés toutes les 10 lignes.", + "lineNumbers": "Contrôle l’affichage des numéros de ligne. Les valeurs possibles sont 'on', 'off', et 'relative'.", "rulers": "Afficher les règles verticales après un certain nombre de caractères à espacement fixe. Utiliser plusieurs valeurs pour plusieurs règles. Aucune règle n'est dessinée si le tableau est vide", "wordSeparators": "Caractères utilisés comme séparateurs de mots durant la navigation ou les opérations basées sur les mots", - "tabSize": "Nombre d'espaces correspondant à une tabulation. Ce paramètre est remplacé en fonction du contenu du fichier quand 'editor.detectIndentation' est activé.", + "tabSize": "Le nombre d'espaces correspondant à une tabulation. Ce paramètre est remplacé en fonction du contenu du fichier quand 'editor.detectIndentation' est activé.", "tabSize.errorMessage": "'number' attendu. Notez que la valeur \"auto\" a été remplacée par le paramètre 'editor.detectIndentation'.", - "insertSpaces": "Des espaces sont insérés quand vous appuyez sur la touche Tab. Ce paramètre est remplacé en fonction du contenu du fichier quand 'editor.detectIndentation' est activé.", + "insertSpaces": "Espaces insérés quand vous appuyez sur la touche Tab. Ce paramètre est remplacé en fonction du contenu du fichier quand 'editor.detectIndentation' est activé.", "insertSpaces.errorMessage": "'boolean' attendu. Notez que la valeur \"auto\" a été remplacée par le paramètre 'editor.detectIndentation'.", "detectIndentation": "Quand vous ouvrez un fichier, 'editor.tabSize' et 'editor.insertSpaces' sont détectés en fonction du contenu du fichier.", "roundedSelection": "Contrôle si les sélections ont des angles arrondis", @@ -89,8 +93,8 @@ "links": "Contrôle si l'éditeur doit détecter les liens et les rendre cliquables", "colorDecorators": "Contrôle si l'éditeur doit afficher les éléments décoratifs de couleurs inline et le sélecteur de couleurs.", "codeActions": "Active l'ampoule d'action de code", + "selectionClipboard": "Contrôle si le presse-papiers primaire Linux doit être pris en charge.", "sideBySide": "Contrôle si l'éditeur de différences affiche les différences en mode côte à côte ou inline", "ignoreTrimWhitespace": "Contrôle si l'éditeur de différences affiche les changements liés aux espaces blancs de début ou de fin comme des différences", - "renderIndicators": "Contrôle si l'éditeur de différences affiche les indicateurs +/- pour les modifications ajoutées/supprimées", - "selectionClipboard": "Contrôle si le presse-papiers primaire Linux doit être pris en charge." + "renderIndicators": "Contrôle si l'éditeur de différences affiche les indicateurs +/- pour les modifications ajoutées/supprimées" } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/fra/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..69adc4467971 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Atteindre le crochet" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/fra/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..7bc2bb19f597 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Déplacer le point d'insertion vers la gauche", + "caret.moveRight": "Déplacer le point d'insertion vers la droite" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/fra/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..9eefe4333b55 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Transposer les lettres" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/fra/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..80310013902f --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Couper", + "actions.clipboard.copyLabel": "Copier", + "actions.clipboard.pasteLabel": "Coller", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Copier avec la coloration syntaxique" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/fra/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..d8e23e4d0d76 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Activer/désactiver le commentaire de ligne", + "comment.line.add": "Ajouter le commentaire de ligne", + "comment.line.remove": "Supprimer le commentaire de ligne", + "comment.block": "Activer/désactiver le commentaire de bloc" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/fra/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..305f92b19f78 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Afficher le menu contextuel de l'éditeur" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json b/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..21889b4123e3 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Rechercher", + "findNextMatchAction": "Rechercher suivant", + "findPreviousMatchAction": "Rechercher précédent", + "nextSelectionMatchFindAction": "Sélection suivante", + "previousSelectionMatchFindAction": "Sélection précédente", + "startReplace": "Remplacer", + "showNextFindTermAction": "Afficher le terme de recherche suivant", + "showPreviousFindTermAction": "Afficher le terme de recherche précédent" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..b38c8823721a --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Rechercher", + "placeholder.find": "Rechercher", + "label.previousMatchButton": "Correspondance précédente", + "label.nextMatchButton": "Correspondance suivante", + "label.toggleSelectionFind": "Rechercher dans la sélection", + "label.closeButton": "Fermer", + "label.replace": "Remplacer", + "placeholder.replace": "Remplacer", + "label.replaceButton": "Remplacer", + "label.replaceAllButton": "Tout remplacer", + "label.toggleReplaceButton": "Changer le mode de remplacement", + "title.matchesCountLimit": "Seuls les {0} premiers résultats sont mis en évidence, mais toutes les opérations de recherche fonctionnent sur l’ensemble du texte.", + "label.matchesLocation": "{0} sur {1}", + "label.noResults": "Aucun résultat" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..6183484b59ca --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Rechercher", + "placeholder.find": "Rechercher", + "label.previousMatchButton": "Correspondance précédente", + "label.nextMatchButton": "Correspondance suivante", + "label.closeButton": "Fermer" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/fra/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..a019089db96d --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Déplier", + "unFoldRecursivelyAction.label": "Déplier de manière récursive", + "foldAction.label": "Plier", + "foldRecursivelyAction.label": "Plier de manière récursive", + "foldAllBlockComments.label": "Replier tous les commentaires de bloc", + "foldAllAction.label": "Plier tout", + "unfoldAllAction.label": "Déplier tout", + "foldLevelAction.label": "Niveau de pliage {0}" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..5d10d9569e4c --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "1 modification de format effectuée à la ligne {0}", + "hintn1": "{0} modifications de format effectuées à la ligne {1}", + "hint1n": "1 modification de format effectuée entre les lignes {0} et {1}", + "hintnn": "{0} modifications de format effectuées entre les lignes {1} et {2}", + "no.provider": "Désolé, mais il n’y a aucun formateur installé pour les fichiers '{0}'.", + "formatDocument.label": "Mettre en forme le document", + "formatSelection.label": "Mettre en forme la sélection" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..bdf5cc7e4256 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Définition introuvable pour '{0}'", + "generic.noResults": "Définition introuvable", + "meta.title": " – {0} définitions", + "actions.goToDecl.label": "Atteindre la définition", + "actions.goToDeclToSide.label": "Ouvrir la définition sur le côté", + "actions.previewDecl.label": "Aperçu de définition", + "goToImplementation.noResultWord": "Implémentation introuvable pour '{0}'", + "goToImplementation.generic.noResults": "Implémentation introuvable", + "meta.implementations.title": "– Implémentations {0}", + "actions.goToImplementation.label": "Accéder à l'implémentation", + "actions.peekImplementation.label": "Aperçu de l'implémentation", + "goToTypeDefinition.noResultWord": "Définition de type introuvable pour '{0}'", + "goToTypeDefinition.generic.noResults": "Définition de type introuvable", + "meta.typeDefinitions.title": " – Définitions de type {0}", + "actions.goToTypeDefinition.label": "Atteindre la définition de type", + "actions.peekTypeDefinition.label": "Aperçu de la définition du type" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..247bd9d24da5 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Cliquez pour afficher {0} définitions." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..2e7dbc5e1ee0 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Accéder à l'erreur ou l'avertissement suivant", + "markerAction.previous.label": "Accéder à l'erreur ou l'avertissement précédent", + "editorMarkerNavigationError": "Couleur d'erreur du widget de navigation dans les marqueurs de l'éditeur.", + "editorMarkerNavigationWarning": "Couleur d'avertissement du widget de navigation dans les marqueurs de l'éditeur.", + "editorMarkerNavigationInfo": "Couleur d’information du widget de navigation du marqueur de l'éditeur.", + "editorMarkerNavigationBackground": "Arrière-plan du widget de navigation dans les marqueurs de l'éditeur." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/fra/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..f2c7ed175601 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Afficher par pointage" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/fra/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..237cac764d0b --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Chargement..." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/fra/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..ec882a2ca36d --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Remplacer par la valeur précédente", + "InPlaceReplaceAction.next.label": "Remplacer par la valeur suivante" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..d9fe670d9f5f --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Convertir les retraits en espaces", + "indentationToTabs": "Convertir les retraits en tabulations", + "configuredTabSize": "Taille des tabulations configurée", + "selectTabWidth": "Sélectionner la taille des tabulations pour le fichier actuel", + "indentUsingTabs": "Mettre en retrait avec des tabulations", + "indentUsingSpaces": "Mettre en retrait avec des espaces", + "detectIndentation": "Détecter la mise en retrait à partir du contenu", + "editor.reindentlines": "Remettre en retrait les lignes" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/fra/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..ed7fa212566d --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Copier la ligne en haut", + "lines.copyDown": "Copier la ligne en bas", + "lines.moveUp": "Déplacer la ligne vers le haut", + "lines.moveDown": "Déplacer la ligne vers le bas", + "lines.sortAscending": "Trier les lignes dans l'ordre croissant", + "lines.sortDescending": "Trier les lignes dans l'ordre décroissant", + "lines.trimTrailingWhitespace": "Découper l'espace blanc de fin", + "lines.delete": "Supprimer la ligne", + "lines.indent": "Mettre en retrait la ligne", + "lines.outdent": "Ajouter un retrait négatif à la ligne", + "lines.insertBefore": "Insérer une ligne au-dessus", + "lines.insertAfter": "Insérer une ligne sous", + "lines.deleteAllLeft": "Supprimer tout ce qui est à gauche", + "lines.deleteAllRight": "Supprimer tout ce qui est à droite", + "lines.joinLines": "Joindre les lignes", + "editor.transpose": "Transposer les caractères autour du curseur", + "editor.transformToUppercase": "Transformer en majuscule", + "editor.transformToLowercase": "Transformer en minuscule" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/links/links.i18n.json b/i18n/fra/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..d2926b0f956e --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Commande + clic pour suivre le lien", + "links.navigate": "Ctrl + clic pour suivre le lien", + "links.command.mac": "Cmd + clic pour exécuter la commande", + "links.command": "Ctrl + clic pour exécuter la commande", + "links.navigate.al": "Alt + clic pour suivre le lien", + "links.command.al": "Alt + clic pour exécuter la commande", + "invalid.url": "Échec de l'ouverture de ce lien, car il n'est pas bien formé : {0}", + "missing.url": "Échec de l'ouverture de ce lien, car sa cible est manquante.", + "label": "Ouvrir le lien" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/fra/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..04e943155dab --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Ajouter un curseur au-dessus", + "mutlicursor.insertBelow": "Ajouter un curseur en dessous", + "mutlicursor.insertAtEndOfEachLineSelected": "Ajouter des curseurs à la fin des lignes", + "addSelectionToNextFindMatch": "Ajouter la sélection à la correspondance de recherche suivante", + "addSelectionToPreviousFindMatch": "Ajouter la sélection à la correspondance de recherche précédente", + "moveSelectionToNextFindMatch": "Déplacer la dernière sélection vers la correspondance de recherche suivante", + "moveSelectionToPreviousFindMatch": "Déplacer la dernière sélection à la correspondance de recherche précédente", + "selectAllOccurrencesOfFindMatch": "Sélectionner toutes les occurrences des correspondances de la recherche", + "changeAll.label": "Modifier toutes les occurrences" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/fra/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..b2cdf5bab5ea --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Indicateurs des paramètres Trigger" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..6161b759db10 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, conseil" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/fra/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..d48220f8b635 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Afficher les correctifs ({0})", + "quickFix": "Afficher les correctifs", + "quickfix.trigger.label": "Correctif rapide" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..e7284c958c2a --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Fermer" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..e46a38e9ef2b --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " – {0} références", + "references.action.label": "Rechercher toutes les références" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..6aa118389802 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Chargement..." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..909371612545 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "symbole dans {0} sur la ligne {1}, colonne {2}", + "aria.fileReferences.1": "1 symbole dans {0}, chemin complet {1}", + "aria.fileReferences.N": "{0} symboles dans {1}, chemin complet {2}", + "aria.result.0": "Résultats introuvables", + "aria.result.1": "1 symbole dans {0}", + "aria.result.n1": "{0} symboles dans {1}", + "aria.result.nm": "{0} symboles dans {1} fichiers" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..498b3551c287 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Échec de la résolution du fichier.", + "referencesCount": "{0} références", + "referenceCount": "{0} référence", + "missingPreviewMessage": "aperçu non disponible", + "treeAriaLabel": "Références", + "noResults": "Aucun résultat", + "peekView.alternateTitle": "Références", + "peekViewTitleBackground": "Couleur d'arrière-plan de la zone de titre de l'affichage d'aperçu.", + "peekViewTitleForeground": "Couleur du titre de l'affichage d'aperçu.", + "peekViewTitleInfoForeground": "Couleur des informations sur le titre de l'affichage d'aperçu.", + "peekViewBorder": "Couleur des bordures et de la flèche de l'affichage d'aperçu.", + "peekViewResultsBackground": "Couleur d'arrière-plan de la liste des résultats de l'affichage d'aperçu.", + "peekViewResultsMatchForeground": "Couleur de premier plan des noeuds de lignes dans la liste des résultats de l'affichage d'aperçu.", + "peekViewResultsFileForeground": "Couleur de premier plan des noeuds de fichiers dans la liste des résultats de l'affichage d'aperçu.", + "peekViewResultsSelectionBackground": "Couleur d'arrière-plan de l'entrée sélectionnée dans la liste des résultats de l'affichage d'aperçu.", + "peekViewResultsSelectionForeground": "Couleur de premier plan de l'entrée sélectionnée dans la liste des résultats de l'affichage d'aperçu.", + "peekViewEditorBackground": "Couleur d'arrière-plan de l'éditeur d'affichage d'aperçu.", + "peekViewEditorGutterBackground": "Couleur d'arrière-plan de la bordure de l'éditeur d'affichage d'aperçu.", + "peekViewResultsMatchHighlight": "Couleur de mise en surbrillance d'une correspondance dans la liste des résultats de l'affichage d'aperçu.", + "peekViewEditorMatchHighlight": "Couleur de mise en surbrillance d'une correspondance dans l'éditeur de l'affichage d'aperçu." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/fra/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..d6f02080b63a --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Aucun résultat.", + "aria": "'{0}' renommé en '{1}'. Récapitulatif : {2}", + "rename.failed": "Échec de l'exécution du renommage.", + "rename.label": "Renommer le symbole" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/fra/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..171924e9bf26 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Renommez l'entrée. Tapez le nouveau nom et appuyez sur Entrée pour valider." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/fra/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..d815e36cd812 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Développer la sélection", + "smartSelect.shrink": "Réduire la sélection" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/fra/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..6715662ea09e --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "L'acceptation de '{0}' a inséré le texte suivant : {1}", + "suggest.trigger.label": "Suggestions pour Trigger" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..75285eb257ef --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Couleur d'arrière-plan du widget de suggestion.", + "editorSuggestWidgetBorder": "Couleur de bordure du widget de suggestion.", + "editorSuggestWidgetForeground": "Couleur de premier plan du widget de suggestion.", + "editorSuggestWidgetSelectedBackground": "Couleur d'arrière-plan de l'entrée sélectionnée dans le widget de suggestion.", + "editorSuggestWidgetHighlightForeground": "Couleur de la surbrillance des correspondances dans le widget de suggestion.", + "readMore": "En savoir plus...{0}", + "suggestionWithDetailsAriaLabel": "{0}, suggestion, avec détails", + "suggestionAriaLabel": "{0}, suggestion", + "readLess": "En savoir moins...{0}", + "suggestWidget.loading": "Chargement...", + "suggestWidget.noSuggestions": "Pas de suggestions.", + "suggestionAriaAccepted": "{0}, accepté", + "ariaCurrentSuggestionWithDetails": "{0}, suggestion, avec détails", + "ariaCurrentSuggestion": "{0}, suggestion" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/fra/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..e8ac83f2da87 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Activer/désactiver l'utilisation de la touche Tab pour déplacer le focus" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/fra/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..45974daea0a3 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Couleur d'arrière-plan d'un symbole durant l'accès en lecture, par exemple la lecture d'une variable.", + "wordHighlightStrong": "Couleur d'arrière-plan d'un symbole durant l'accès en écriture, par exemple l'écriture dans une variable.", + "overviewRulerWordHighlightForeground": "Couleur du marqueur de la règle d'aperçu pour la mise en évidence de symbole.", + "overviewRulerWordHighlightStrongForeground": "Couleur du marqueur de la règle d'aperçu la mise en évidence de symbole d’accès en écriture.", + "wordHighlight.next.label": "Aller à la prochaine mise en évidence de symbole", + "wordHighlight.previous.label": "Aller à la mise en évidence de symbole précédente" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json index 2f3ab9040099..f1c7f8375eb1 100644 --- a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json @@ -12,6 +12,8 @@ "newWindow": "Forcez l'utilisation d'une nouvelle instance de Code.", "performance": "Démarrez avec la commande 'Développeur : performance de démarrage' activée.", "prof-startup": "Exécuter le profileur d'UC au démarrage", + "inspect-extensions": "Autorise le débogage et le profilage des extensions. Vérifier les outils de développements pour l'uri de connexion.", + "inspect-brk-extensions": "Autorise le débogage et le profilage des extensions avec l'hôte d'extensions en pause après le démarrage. Vérifier les outils de développement pour l'uri de connexion.", "reuseWindow": "Forcez l'ouverture d'un fichier ou dossier dans la dernière fenêtre active.", "userDataDir": "Spécifie le répertoire où sont conservées les données des utilisateurs. S'avère utile pour une exécution en tant que root.", "verbose": "Affichez la sortie détaillée (implique --wait).", @@ -24,6 +26,7 @@ "experimentalApis": "Active les fonctionnalités d'API proposées pour une extension.", "disableExtensions": "Désactivez toutes les extensions installées.", "disableGPU": "Désactivez l'accélération matérielle du GPU.", + "status": "Imprimer l'utilisation de processus et l'information des diagnostics.", "version": "Affichez la version.", "help": "Affichez le mode d'utilisation.", "usage": "Utilisation", diff --git a/i18n/fra/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/fra/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index 539973960445..928cf0f78859 100644 --- a/i18n/fra/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/fra/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "Extension introuvable", - "noCompatible": "Version compatible de {0} introuvable avec cette version de Code." + "notCompatibleDownload": "Téléchargement impossible car l'extension compatible avec la version actuelle '{0}' de VS Code est introuvable." } \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index e6693aebb79e..620e2694e2a1 100644 --- a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "Extension non valide : package.json n'est pas un fichier JSON.", "restartCodeLocal": "Redémarrez Code avant de réinstaller {0}.", - "restartCodeGallery": "Veuillez s’il vous plaît redémarrer Code avant la réinstallation.", + "installingOutdatedExtension": "Une version plus récente de cette extension est déjà installée. Voulez-vous remplacer celle-ci avec l'ancienne version ?", + "override": "Remplacer", + "cancel": "Annuler", + "notFoundCompatible": "Installation impossible car l'extension '{0}' compatible avec la version actuelle '{1}' de VS Code est introuvable.", + "quitCode": "Installation impossible car une instance obsolète de l'extension est en cours d'exécution. Veuillez quitter et redémarrer VS Code avant de réinstaller.", + "exitCode": "Installation impossible car une instance obsolète de l'extension est en cours d'exécution. Veuillez sortir et redémarrer VS Code avant de réinstaller.", + "notFoundCompatibleDependency": "Installation impossible car l'extension dépendante '{0}' compatible avec la version actuelle '{1}' de VS Code est introuvable.", "uninstallDependeciesConfirmation": "Voulez-vous désinstaller uniquement '{0}' ou également ses dépendances ?", "uninstallOnly": "Uniquement", "uninstallAll": "Tout", - "cancel": "Annuler", "uninstallConfirmation": "Voulez-vous vraiment désinstaller '{0}' ?", "ok": "OK", "singleDependentError": "Impossible de désinstaller l'extension '{0}'. L'extension '{1}' en dépend.", diff --git a/i18n/fra/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/fra/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index 77c19000246e..08ad6cc708d0 100644 --- a/i18n/fra/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -17,6 +17,8 @@ "vscode.extension.activationEvents.onLanguage": "Événement d'activation envoyé quand un fichier résolu dans le langage spécifié est ouvert.", "vscode.extension.activationEvents.onCommand": "Événement d'activation envoyé quand la commande spécifiée est appelée.", "vscode.extension.activationEvents.onDebug": "Un événement d’activation émis chaque fois qu’un utilisateur est sur le point de démarrer le débogage ou sur le point de la déboguer des configurations.", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "Événement d'activation envoyé chaque fois qu’un \"launch.json\" doit être créé (et toutes les méthodes de provideDebugConfigurations doivent être appelées).", + "vscode.extension.activationEvents.onDebugResolve": "Événement d'activation envoyé quand une session de débogage du type spécifié est sur le point d’être lancée (et une méthode resolveDebugConfiguration correspondante doit être appelée).", "vscode.extension.activationEvents.workspaceContains": "Événement d'activation envoyé quand un dossier ouvert contient au moins un fichier correspondant au modèle glob spécifié.", "vscode.extension.activationEvents.onView": "Événement d'activation envoyé quand la vue spécifiée est développée.", "vscode.extension.activationEvents.star": "Événement d'activation envoyé au démarrage de VS Code. Pour garantir la qualité de l'expérience utilisateur, utilisez cet événement d'activation dans votre extension uniquement quand aucune autre combinaison d'événements d'activation ne fonctionne dans votre cas d'utilisation.", diff --git a/i18n/fra/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/fra/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..7c3c7d795675 --- /dev/null +++ b/i18n/fra/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "Activer/désactiver la visibilité de l'onglet", + "view": "Affichage" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json index ee22c640dbd2..9bb7cebd0ec5 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "largeNumberBadge": "10k+", "badgeTitle": "{0} - {1}", "additionalViews": "Vues supplémentaires", "numberBadge": "{0} ({1})", diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index a7e573548293..19586632ac85 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Ouvrir l'éditeur précédent", "nextEditorInGroup": "Ouvrir l'éditeur suivant du groupe", "openPreviousEditorInGroup": "Ouvrir l'éditeur précédent du groupe", + "lastEditorInGroup": "Ouvrir le dernier éditeur du groupe", "navigateNext": "Suivant", "navigatePrevious": "Précédent", "navigateLast": "Aller au dernier", diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index 36d4757c43d8..be96f08df0d6 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "Déplacer l'éditeur actif par onglets ou par groupes", "editorCommand.activeEditorMove.arg.name": "Argument de déplacement de l'éditeur actif", - "editorCommand.activeEditorMove.arg.description": "Propriétés de l'argument :\n\\t\\t\\t\\t\\t\\t* 'to' : valeur de chaîne indiquant la direction du déplacement.\n\\t\\t\\t\\t\\t\\t* 'by' : valeur de chaîne indiquant l'unité de déplacement. Par onglet ou par groupe.\n\\t\\t\\t\\t\\t\\t* 'value' : valeur numérique indiquant le nombre de positions ou la position absolue du déplacement.\n\\t\\t\\t\\t\\t", + "editorCommand.activeEditorMove.arg.description": "Propriétés d’argument : * 'to' : Valeur de chaîne spécifiant où aller.\n\t* 'by' : Valeur de chaîne spécifiant l'unité à déplacer. Par tabulation ou par groupe.\n\t* 'value' : Valeur numérique spécifiant combien de positions ou une position absolue à déplacer.", "commandDeprecated": "La commande **{0}** a été supprimée. Vous pouvez utiliser **{1}** à la place", "openKeybindings": "Configurer les raccourcis clavier" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index dc585654a467..debaa4e32a92 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "Oui", "screenReaderDetectedExplanation.answerNo": "Non", "screenReaderDetectedExplanation.body1": "VS Code est maintenant optimisé pour une utilisation avec un lecteur d’écran.", - "screenReaderDetectedExplanation.body2": "Certaines fonctionnalités de l’éditeur auront des comportements différents : par exemple l'encapsulation, le repliage, l'auto-fermeture des parenthèses, etc..." + "screenReaderDetectedExplanation.body2": "Certaines fonctionnalités de l’éditeur auront des comportements différents : par exemple encapsulation, repliage, etc.." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/quickopen.i18n.json b/i18n/fra/src/vs/workbench/browser/quickopen.i18n.json index 6c5413c9c047..4ddbb4197101 100644 --- a/i18n/fra/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "Aucun résultat correspondant", - "noResultsFound2": "Résultats introuvables", - "entryAriaLabel": "{0}, commande" + "noResultsFound2": "Résultats introuvables" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json index fc7be7db9209..0e453c54e870 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Ouvrir les éléments récents...", "quickOpenRecent": "Ouverture rapide des éléments récents...", "closeMessages": "Fermer les messages de notification", - "reportIssues": "Signaler des problèmes", + "reportIssueInEnglish": "Signaler un problème", "reportPerformanceIssue": "Signaler un problème de performance", "keybindingsReference": "Référence des raccourcis clavier", "openDocumentationUrl": "Documentation", @@ -47,5 +47,25 @@ "showNextWindowTab": "Afficher l’onglet de la fenêtre suivante", "moveWindowTabToNewWindow": "Déplacer l’onglet de la fenêtre vers la nouvelle fenêtre", "mergeAllWindowTabs": "Fusionner toutes les fenêtres", - "toggleWindowTabsBar": "Activer/désactiver la barre de fenêtres d’onglets" + "toggleWindowTabsBar": "Activer/désactiver la barre de fenêtres d’onglets", + "configureLocale": "Configurer la langue", + "displayLanguage": "Définit le langage affiché par VSCode.", + "doc": "Consultez {0} pour connaître la liste des langues prises en charge.", + "restart": "Le changement de la valeur nécessite le redémarrage de VS Code.", + "fail.createSettings": "Impossible de créer '{0}' ({1}).", + "openLogsFolder": "Ouvrir le dossier des journaux", + "showLogs": "Afficher les journaux...", + "mainProcess": "Principal", + "sharedProcess": "Partagé", + "rendererProcess": "Renderer", + "extensionHost": "Hôte de l’extension", + "selectProcess": "Sélectionner le processus", + "setLogLevel": "Définir le niveau de journalisation (log)", + "trace": "Trace", + "debug": "Déboguer", + "info": "Informations", + "warn": "Avertissement", + "err": "Erreur", + "critical": "Critique", + "off": "Désactivé" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json index f1f2a6fc8a0f..7c7573087ca8 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Affichage", "help": "Aide", "file": "Fichier", - "workspaces": "Espaces de travail", "developer": "Développeur", + "workspaces": "Espaces de travail", "showEditorTabs": "Contrôle si les éditeurs ouverts doivent s'afficher ou non sous des onglets.", "workbench.editor.labelFormat.default": "Afficher le nom du fichier. Lorsque les onglets sont activés et que deux fichiers portent le même nom dans un groupe, les sections distinctes du chemin de chaque fichier sont ajoutées. Lorsque les onglets sont désactivées, le chemin d’accès relatif au dossier de l'espace de travail est affiché si l’éditeur est actif.", "workbench.editor.labelFormat.short": "Indiquer le nom du fichier suivi de son nom de répertoire.", @@ -16,6 +16,7 @@ "workbench.editor.labelFormat.long": "Indiquer le nom du fichier suivi de son chemin d’accès absolu.", "tabDescription": "Contrôle le format de l’étiquette d’un éditeur. La modification de ce paramètre peut par exemple rendre plus facile la compréhension de l’emplacement d’un fichier :\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent', quand un autre onglet partage le même titre, ou la chemin d’accès relatif à l'espace de travail si les onglets sont désactivés", "editorTabCloseButton": "Contrôle la position des boutons de fermeture des onglets de l'éditeur, ou les désactive quand le paramètre a la valeur 'off'.", + "tabSizing": "Contrôle la taille des onglets de l'éditeur. Mettre à 'fit' pour garder les onglets toujours assez larges pour afficher le libellé complet de l'éditeur. Mettre à 'shrink' pour autoriser les onglets à être plus peties quand l'espace n'est pas suffisant pur afficher tous les onglets en même temps.", "showIcons": "Contrôle si les éditeurs ouverts doivent s'afficher ou non avec une icône. Cela implique notamment l'activation d'un thème d'icône.", "enablePreview": "Contrôle si les éditeurs ouverts s'affichent en mode aperçu. Les éditeurs en mode aperçu sont réutilisés jusqu'à ce qu'ils soient conservés (par exemple, après un double-clic ou une modification) et apparaissent avec un style de police en italique.", "enablePreviewFromQuickOpen": "Contrôle si les éditeurs de Quick Open s'affichent en mode aperçu. Les éditeurs en mode aperçu sont réutilisés jusqu'à ce qu'ils soient conservés (par exemple, après un double-clic ou une modification).", @@ -26,18 +27,17 @@ "closeOnFocusLost": "Contrôle si Quick Open doit se fermer automatiquement, une fois qu'il a perdu le focus.", "openDefaultSettings": "Contrôle si l'ouverture des paramètres entraîne également l'ouverture d'un éditeur qui affiche tous les paramètres par défaut.", "sideBarLocation": "Contrôle l'emplacement de la barre latérale. Elle peut s'afficher à gauche ou à droite du banc d'essai.", - "panelLocation": "Contrôle l’emplacement du panneau. Il peut soit être affiché en bas ou à droite du banc d'essai.", "statusBarVisibility": "Contrôle la visibilité de la barre d'état au bas du banc d'essai.", "activityBarVisibility": "Contrôle la visibilité de la barre d'activités dans le banc d'essai.", "closeOnFileDelete": "Contrôle si les éditeurs qui affichent un fichier doivent se fermer automatiquement quand ce fichier est supprimé ou renommé par un autre processus. Si vous désactivez cette option, l'éditeur reste ouvert dans un état indiquant une intégrité compromise. Notez que la suppression de fichiers à partir de l'application entraîne toujours la fermeture de l'éditeur, et que les fichiers à l'intégrité compromise ne sont jamais fermés pour permettre la conservation de vos données.", - "experimentalFuzzySearchEndpoint": "Indique le point de terminaison à utiliser pour la recherche des paramètres expérimentaux.", - "experimentalFuzzySearchKey": "Indique la clé à utiliser pour la recherche des paramètres expérimentaux.", + "enableNaturalLanguageSettingsSearch": "Contrôle s’il faut activer le mode de recherche en langage naturel pour les paramètres.", "fontAliasing": "Contrôle la méthode de font aliasing dans le workbench.\n- par défaut : Lissage des polices de sous-pixel. Sur la plupart des affichages non-ratina, cela vous donnera le texte le plus vif\n- crénelées : Lisse les polices au niveau du pixel, plutôt que les sous-pixels. Peut faire en sorte que la police apparaisse plus légère dans l’ensemble \n- none : désactive le lissage des polices. Le texte s'affichera avec des bordures dentelées", "workbench.fontAliasing.default": "Lissage de sous-pixel des polices. Sur la plupart des affichages non-retina, cela vous donnera le texte le plus vif.", "workbench.fontAliasing.antialiased": "Lisser les polices au niveau du pixel, plutôt que les sous-pixels. Peut faire en sorte que la police apparaisse plus légère dans l’ensemble.", "workbench.fontAliasing.none": "Désactive le lissage des polices. Le texte s'affichera avec des bordures dentelées.", "swipeToNavigate": "Parcourez les fichiers ouverts en faisant glisser trois doigts horizontalement. ", "workbenchConfigurationTitle": "Banc d'essai", + "windowConfigurationTitle": "Fenêtre", "window.openFilesInNewWindow.on": "Les fichiers s'ouvrent dans une nouvelle fenêtre", "window.openFilesInNewWindow.off": "Les fichiers s'ouvrent dans la fenêtre du dossier conteneur ouvert ou dans la dernière fenêtre active", "window.openFilesInNewWindow.default": "Les fichiers s'ouvrent dans la fenêtre du dossier conteneur ouvert ou dans la dernière fenêtre active, sauf s'ils sont ouverts via le Dock ou depuis le Finder (macOS uniquement)", @@ -69,11 +69,11 @@ "autoDetectHighContrast": "Si cette option est activée, le thème à contraste élevé est automatiquement choisi quand Windows utilise un thème à contraste élevé. À l'inverse, le thème sombre est automatiquement choisi quand Windows n'utilise plus le thème à contraste élevé.", "titleBarStyle": "Ajustez l'apparence de la barre de titre de la fenêtre. Vous devez effectuer un redémarrage complet pour que les changements soient appliqués.", "window.nativeTabs": "Active les onglets macOS Sierra. Notez que vous devez redémarrer l'ordinateur pour appliquer les modifications et que les onglets natifs désactivent tout style de barre de titre personnalisé configuré, le cas échéant.", - "windowConfigurationTitle": "Fenêtre", "zenModeConfigurationTitle": "Mode Zen", "zenMode.fullScreen": "Contrôle si l'activation de Zen Mode met également le banc d'essai en mode plein écran.", "zenMode.hideTabs": "Contrôle si l'activation du mode Zen masque également les onglets du banc d'essai.", "zenMode.hideStatusBar": "Contrôle si l'activation du mode Zen masque également la barre d'état au bas du banc d'essai.", "zenMode.hideActivityBar": "Contrôle si l'activation du mode Zen masque également la barre d'activités à gauche du banc d'essai.", - "zenMode.restore": "Contrôle si une fenêtre doit être restaurée en mode zen, si elle a été fermée en mode zen." + "zenMode.restore": "Contrôle si une fenêtre doit être restaurée en mode zen, si elle a été fermée en mode zen.", + "JsonSchema.locale": "Langue d'interface utilisateur (IU) à utiliser." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index fd1a330f1c0a..e221bc52477f 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Désactiver les points d'arrêt", "reapplyAllBreakpoints": "Réappliquer tous les points d'arrêt", "addFunctionBreakpoint": "Ajouter un point d'arrêt sur fonction", - "renameFunctionBreakpoint": "Renommer un point d'arrêt sur fonction", "addConditionalBreakpoint": "Ajouter un point d'arrêt conditionnel...", "editConditionalBreakpoint": "Modifier un point d'arrêt...", "setValue": "Définir la valeur", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..e495538d546d --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Modifier un point d'arrêt...", + "functionBreakpointsNotSupported": "Les points d'arrêt de fonction ne sont pas pris en charge par ce type de débogage", + "functionBreakpointPlaceholder": "Fonction où effectuer un point d'arrêt", + "functionBreakPointInputAriaLabel": "Point d'arrêt sur fonction de type" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..ebffa8d54011 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Section de pile des appels", + "debugStopped": "En pause sur {0}", + "callStackAriaLabel": "Déboguer la pile des appels", + "process": "Processus", + "paused": "Suspendu", + "running": "En cours d'exécution", + "thread": "Thread", + "pausedOn": "En pause sur {0}", + "loadMoreStackFrames": "Charger plus de frames de pile", + "threadAriaLabel": "Thread {0}, pile des appels, débogage", + "stackFrameAriaLabel": "Frame de pile {0}, ligne {1} {2}, pile des appels, débogage" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index f2f505f2adf0..39634cf91c3b 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,10 @@ "openExplorerOnEnd": "Ouvrir automatiquement le mode explorateur à la fin d'une session de débogage", "inlineValues": "Afficher les valeurs des variables inline dans l'éditeur pendant le débogage", "hideActionBar": "Contrôle si la barre d'action de débogage flottante doit être masquée", + "never": "Ne jamais afficher debug dans la barre d'état", + "always": "Toujours afficher debug dans la barre d’état", + "onFirstSessionStart": "Afficher debug dans seule la barre d’état après que le débogage a été lancé pour la première fois", + "showInStatusBar": "Contrôle quand la barre d’état de débogage doit être visible", + "openDebug": "Contrôle si les Viewlets de débogage doivent être ouverts au démarrage d’une session de débogage.", "launch": "Configuration du lancement du débogage global. Doit être utilisée comme alternative à 'launch.json' qui est partagé entre les espaces de travail" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 15ea2e4fc11b..3aa861894070 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "Point d'arrêt ajouté, ligne {0}, fichier {1}", "breakpointRemoved": "Point d'arrêt supprimé, ligne {0}, fichier {1}", "compoundMustHaveConfigurations": "L'attribut \"configurations\" du composé doit être défini pour permettre le démarrage de plusieurs configurations.", - "configMissing": "Il manque la configuration '{0}' dans 'launch.json'.", "debugRequestNotSupported": "L’attribut '{0}' a une valeur '{1}' non prise en charge dans la configuration de débogage sélectionnée.", "debugRequesMissing": "L’attribut '{0}' est introuvable dans la configuration de débogage choisie.", "debugTypeNotSupported": "Le type de débogage '{0}' configuré n'est pas pris en charge.", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..81e53e50a6f7 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Section des variables", + "variablesAriaTreeLabel": "Déboguer les variables", + "variableValueAriaLabel": "Tapez une nouvelle valeur de variable", + "variableScopeAriaLabel": "Portée {0}, variables, débogage", + "variableAriaLabel": "{0} valeur {1}, variables, débogage" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..0b8adc593c5f --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "Section des expressions", + "watchAriaTreeLabel": "Déboguer les expressions espionnées", + "watchExpressionPlaceholder": "Expression à espionner", + "watchExpressionInputAriaLabel": "Tapez l'expression à espionner", + "watchExpressionAriaLabel": "{0} valeur {1}, espion, débogage", + "watchVariableAriaLabel": "{0} valeur {1}, espion, débogage" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index d2552c4f0ca8..65ddc1367208 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "Nom de l'extension", "extension id": "Identificateur d'extension", + "preview": "Aperçu", "publisher": "Nom de l'éditeur", "install count": "Nombre d'installations", "rating": "Évaluation", + "repository": "Dépôt", "license": "Licence", "details": "Détails", "contributions": "Contributions", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 2320626a88fa..3911d6e4075f 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Désinstallation en cours", "updateAction": "Mettre à jour", "updateTo": "Mettre à jour vers {0}", - "enableForWorkspaceAction.label": "Activer (espace de travail)", - "enableAlwaysAction.label": "Activer (toujours)", - "disableForWorkspaceAction.label": "Désactiver (espace de travail)", - "disableAlwaysAction.label": "Désactiver (toujours)", "ManageExtensionAction.uninstallingTooltip": "Désinstallation en cours", - "enableForWorkspaceAction": "Espace de travail", - "enableGloballyAction": "Toujours", + "enableForWorkspaceAction": "Activer (espace de travail)", + "enableGloballyAction": "Activer", "enableAction": "Activer", - "disableForWorkspaceAction": "Espace de travail", - "disableGloballyAction": "Toujours", + "disableForWorkspaceAction": "Désactiver (espace de travail)", + "disableGloballyAction": "Désactiver", "disableAction": "Désactiver", "checkForUpdates": "Rechercher les mises à jour", "enableAutoUpdate": "Activer la mise à jour automatique des extensions", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Toutes les extensions recommandées pour cet espace de travail ont déjà été installées", "installRecommendedExtension": "Installer l'Extension Recommandée", "extensionInstalled": "L’extension recommandée est déjà installée", - "showRecommendedKeymapExtensions": "Afficher les mappages de touches recommandés", "showRecommendedKeymapExtensionsShort": "Mappages de touches", - "showLanguageExtensions": "Afficher les extensions de langage", "showLanguageExtensionsShort": "Extensions de langage", - "showAzureExtensions": "Afficher les Extensions Azure", "showAzureExtensionsShort": "Extensions Azure", "OpenExtensionsFile.failed": "Impossible de créer le fichier 'extensions.json' dans le dossier '.vscode' ({0}).", "configureWorkspaceRecommendedExtensions": "Configurer les extensions recommandées (espace de travail)", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..e686f1aac701 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ratedByUsers": "Évaluée par {0} utilisateurs" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..0974c3fd446e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectAndStartDebug": "Cliquer pour arrêter le profilage" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index be819e14deb6..ffe15b6fcfb3 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -7,9 +7,11 @@ "extensionsCommands": "Gérer les extensions", "galleryExtensionsCommands": "Installer les extensions de la galerie", "extension": "Extension", + "runtimeExtension": "Extensions en cours d’exécution", "extensions": "Extensions", "view": "Affichage", + "developer": "Développeur", "extensionsConfigurationTitle": "Extensions", "extensionsAutoUpdate": "Mettre à jour automatiquement les extensions", - "extensionsIgnoreRecommendations": "Ignorer les recommandations d'extension" + "extensionsIgnoreRecommendations": "Si la valeur est à true, les notifications de recommandations d'extension cessera d'apparaître." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..d16b6835b894 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "starActivation": "Activées au démarrage", + "workspaceContainsGlobActivation": "Activées parce qu'il existe un fichier correspondant à {0} dans votre espace de travail", + "workspaceContainsFileActivation": "Activées parce que un fichier {0} existe dans votre espace de travail", + "languageActivation": "Activées parce que vous avez ouvert un fichier {0}", + "workspaceGenericActivation": "Activée le {0}", + "errors": " {0} erreurs non détectées", + "extensionsInputName": "Extensions en cours d’exécution", + "showRuntimeExtensions": "Afficher les extensions en cours d'exécution", + "reportExtensionIssue": "Signaler un problème", + "extensionHostProfileStart": "Démarrer le profilage d'hôte d'extension", + "extensionHostProfileStop": "Arrêter le profilage d'hôte d'extension", + "saveExtensionHostProfile": "Enregistrer le profilage d'hôte d'extension" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/fra/src/vs/workbench/parts/files/browser/fileActions.i18n.json index 3aa8d0485de9..ca93414c3797 100644 --- a/i18n/fra/src/vs/workbench/parts/files/browser/fileActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -69,5 +69,7 @@ "invalidFileNameError": "Le nom **{0}** est non valide en tant que nom de fichier ou de dossier. Choisissez un autre nom.", "filePathTooLongError": "Le nom **{0}** correspond à un chemin d'accès trop long. Choisissez un nom plus court.", "compareWithSaved": "Compare le fichier actif avec celui enregistré", - "modifiedLabel": "{0} (sur le disque) ↔ {1}" + "modifiedLabel": "{0} (sur le disque) ↔ {1}", + "compareWithClipboard": "Comparer le fichier actif avec le presse-papier", + "clipboardComparisonLabel": "Presse-papier ↔ {0}" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..0e07c8f0ec81 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Dossiers" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..54a25f75ec00 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Fichier", + "revealInSideBar": "Afficher dans la barre latérale", + "acceptLocalChanges": "Utiliser vos modifications et écraser les contenus du disque", + "revertLocalChanges": "Ignorer les modifications locales et restaurer le contenu sur disque" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..002c86e7daa1 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Réessayer", + "rename": "Renommer", + "newFile": "Nouveau fichier", + "newFolder": "Nouveau dossier", + "openFolderFirst": "Ouvrez d'abord un dossier pour y créer des fichiers ou des dossiers.", + "newUntitledFile": "Nouveau fichier sans titre", + "createNewFile": "Nouveau fichier", + "createNewFolder": "Nouveau dossier", + "deleteButtonLabelRecycleBin": "&&Déplacer vers la Corbeille", + "deleteButtonLabelTrash": "&&Déplacer vers la Poubelle", + "deleteButtonLabel": "S&&upprimer", + "dirtyMessageFolderOneDelete": "Vous supprimez un dossier contenant 1 fichier dont les changements n'ont pas été enregistrés. Voulez-vous continuer ?", + "dirtyMessageFolderDelete": "Vous supprimez un dossier contenant {0} fichiers dont les changements n'ont pas été enregistrés. Voulez-vous continuer ?", + "dirtyMessageFileDelete": "Vous supprimez un fichier dont les changements n'ont pas été enregistrés. Voulez-vous continuer ?", + "dirtyWarning": "Vous perdrez vos modifications, si vous ne les enregistrez pas.", + "confirmMoveTrashMessageFolder": "Voulez-vous vraiment supprimer '{0}' et son contenu ?", + "confirmMoveTrashMessageFile": "Voulez-vous vraiment supprimer '{0}' ?", + "undoBin": "Vous pouvez effectuer une restauration à partir de la Corbeille.", + "undoTrash": "Vous pouvez effectuer une restauration à partir de la Poubelle.", + "doNotAskAgain": "Ne plus me demander", + "confirmDeleteMessageFolder": "Voulez-vous vraiment supprimer définitivement '{0}' et son contenu ?", + "confirmDeleteMessageFile": "Voulez-vous vraiment supprimer définitivement '{0}' ?", + "irreversible": "Cette action est irréversible !", + "permDelete": "Supprimer définitivement", + "delete": "Supprimer", + "importFiles": "Importer des fichiers", + "confirmOverwrite": "Un fichier ou dossier portant le même nom existe déjà dans le dossier de destination. Voulez-vous le remplacer ?", + "replaceButtonLabel": "&&Remplacer", + "copyFile": "Copier", + "pasteFile": "Coller", + "duplicateFile": "Doublon", + "openToSide": "Ouvrir sur le côté", + "compareSource": "Sélectionner pour comparer", + "globalCompareFile": "Comparer le fichier actif à...", + "openFileToCompare": "Ouvrez d'abord un fichier pour le comparer à un autre fichier.", + "compareWith": "Comparer '{0}' à '{1}'", + "compareFiles": "Comparer des fichiers", + "refresh": "Actualiser", + "save": "Enregistrer", + "saveAs": "Enregistrer sous...", + "saveAll": "Enregistrer tout", + "saveAllInGroup": "Enregistrer tout dans le groupe", + "saveFiles": "Enregistrer tous les fichiers", + "revert": "Rétablir le fichier", + "focusOpenEditors": "Mettre le focus sur la vue des éditeurs ouverts", + "focusFilesExplorer": "Focus sur l'Explorateur de fichiers", + "showInExplorer": "Révéler le fichier actif dans la barre latérale", + "openFileToShow": "Ouvrir d'abord un fichier pour l'afficher dans l'Explorateur", + "collapseExplorerFolders": "Réduire les dossiers dans l'explorateur", + "refreshExplorer": "Actualiser l'explorateur", + "openFileInNewWindow": "Ouvrir le fichier actif dans une nouvelle fenêtre", + "openFileToShowInNewWindow": "Ouvrir d'abord un fichier à ouvrir dans une nouvelle fenêtre", + "revealInWindows": "Révéler dans l'Explorateur", + "revealInMac": "Révéler dans le Finder", + "openContainer": "Ouvrir le dossier contenant", + "revealActiveFileInWindows": "Révéler le fichier actif dans l'Explorateur Windows", + "revealActiveFileInMac": "Révéler le fichier actif dans le Finder", + "openActiveFileContainer": "Ouvrir le dossier contenant le fichier actif", + "copyPath": "Copier le chemin", + "copyPathOfActive": "Copier le chemin du fichier actif", + "emptyFileNameError": "Un nom de fichier ou de dossier doit être fourni.", + "fileNameExistsError": "Un fichier ou dossier **{0}** existe déjà à cet emplacement. Choisissez un autre nom.", + "invalidFileNameError": "Le nom **{0}** est non valide en tant que nom de fichier ou de dossier. Choisissez un autre nom.", + "filePathTooLongError": "Le nom **{0}** correspond à un chemin d'accès trop long. Choisissez un nom plus court.", + "compareWithSaved": "Compare le fichier actif avec celui enregistré", + "modifiedLabel": "{0} (sur le disque) ↔ {1}", + "compareWithClipboard": "Compare le fichier actif avec le presse-papiers", + "clipboardComparisonLabel": "Presse-papier ↔ {0}" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..ee5d441071a6 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Ouvrir d'abord un fichier pour copier son chemin", + "openFileToReveal": "Ouvrir d'abord un fichier à révéler" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..9693ca31c509 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Afficher l'Explorateur", + "explore": "Explorateur", + "view": "Affichage", + "textFileEditor": "Éditeur de fichier texte", + "binaryFileEditor": "Éditeur de fichier binaire", + "filesConfigurationTitle": "Fichiers", + "exclude": "Configurer des modèles glob pour exclure des fichiers et dossiers. Par exemple, l’explorateur de fichiers décide quels fichiers et dossiers afficher ou masquer en fonction de ce paramètre.", + "files.exclude.boolean": "Modèle Glob auquel les chemins de fichiers doivent correspondre. Affectez la valeur true ou false pour activer ou désactiver le modèle.", + "files.exclude.when": "Vérification supplémentaire des frères d'un fichier correspondant. Utilisez $(basename) comme variable pour le nom de fichier correspondant.", + "associations": "Configurez les associations entre les fichiers et les langages (par exemple, \"*.extension\": \"html\"). Celles-ci ont priorité sur les associations par défaut des langages installés.", + "encoding": "L'encodage du jeu de caractères par défaut à utiliser durant la lecture et l'écriture des fichiers. Ce paramètre peut également être configuré par langage.", + "autoGuessEncoding": "Quand cette option est activée, tente de deviner l'encodage du jeu de caractères à l'ouverture des fichiers. Ce paramètre peut également être configuré par langage.", + "eol": "Caractère de fin de ligne par défaut. Utilisez \\n pour LF et \\r\\n pour CRLF.", + "trimTrailingWhitespace": "Si l'option est activée, l'espace blanc de fin est supprimé au moment de l'enregistrement d'un fichier.", + "insertFinalNewline": "Quand l'option est activée, une nouvelle ligne finale est insérée à la fin du fichier au moment de son enregistrement.", + "trimFinalNewlines": "Si l'option est activée, va supprimer toutes les nouvelles lignes après la dernière ligne à la fin du fichier lors de l’enregistrement.", + "files.autoSave.off": "Un fichier dont l'intégrité est compromise n'est jamais enregistré automatiquement.", + "files.autoSave.afterDelay": "Un fichier dont l'intégrité est compromise est automatiquement enregistré après la configuration de 'files.autoSaveDelay'.", + "files.autoSave.onFocusChange": "Un fichier dont l'intégrité est compromise est automatiquement enregistré quand l'éditeur perd le focus.", + "files.autoSave.onWindowChange": "Un fichier dont l'intégrité est compromise est automatiquement enregistré quand la fenêtre perd le focus.", + "autoSave": "Contrôle l'enregistrement automatique des fichiers dont l'intégrité est compromise. Valeurs acceptées : '{0}', '{1}', '{2}' (l'éditeur perd le focus), '{3}' (la fenêtre perd le focus). Si la valeur est '{4}', vous pouvez configurer le délai dans 'files.autoSaveDelay'.", + "autoSaveDelay": "Contrôle le délai en ms au bout duquel un fichier à l'intégrité compromise est enregistré automatiquement. S'applique uniquement quand 'files.autoSave' a la valeur '{0}'", + "watcherExclude": "Configurez les modèles Glob des chemins de fichier à exclure de la surveillance des fichiers. Les modèles doivent correspondre à des chemins absolus (par ex., utilisez le préfixe ** ou le chemin complet pour une correspondance appropriée). Le changement de ce paramètre nécessite un redémarrage. Si vous constatez que le code consomme beaucoup de temps processeur au démarrage, excluez les dossiers volumineux pour réduire la charge initiale.", + "hotExit.off": "Désactivez la sortie à chaud.", + "hotExit.onExit": "La sortie à chaud se déclenche à la fermeture de l'application, c'est-à-dire quand la dernière fenêtre est fermée dans Windows/Linux, ou quand la commande workbench.action.quit est déclenchée (palette de commandes, combinaison de touches, menu). Toutes les fenêtres avec des sauvegardes sont restaurées au prochain lancement.", + "hotExit.onExitAndWindowClose": "La sortie à chaud est déclenchée à la fermeture de l'application, c'est-à-dire quand la dernière fenêtre est fermée sous Windows/Linux ou quand la commande workbench.action.quit est déclenchée (palette de commandes, combinaison de touches, menu), ainsi que pour toute fenêtre avec un dossier ouvert, qu'il s'agisse de la dernière fenêtre ou non. Toutes les fenêtres sans dossier ouvert sont restaurées au prochain lancement. Pour restaurer une fenêtre de dossiers telle qu'elle était avant l'arrêt, définissez \"window.restoreWindows\" sur \"all\".", + "hotExit": "Contrôle si les fichiers non enregistrés sont mémorisés entre les sessions, ce qui permet d'ignorer la demande d'enregistrement à la sortie de l'éditeur.", + "useExperimentalFileWatcher": "Utilisez le nouvel observateur de fichiers expérimental.", + "defaultLanguage": "Mode de langage par défaut affecté aux nouveaux fichiers.", + "editorConfigurationTitle": "Éditeur", + "formatOnSave": "Met en forme un fichier au moment de l'enregistrement. Un formateur doit être disponible, le fichier ne doit pas être enregistré automatiquement, et l'éditeur ne doit pas être en cours d'arrêt.", + "explorerConfigurationTitle": "Explorateur de fichiers", + "openEditorsVisible": "Nombre d'éditeurs affichés dans le volet Éditeurs ouverts. Définissez la valeur 0 pour masquer le volet.", + "dynamicHeight": "Contrôle si la hauteur de la section des éditeurs ouverts doit s'adapter dynamiquement ou non au nombre d'éléments.", + "autoReveal": "Contrôle si l'Explorateur doit automatiquement afficher et sélectionner les fichiers à l'ouverture.", + "enableDragAndDrop": "Contrôle si l'explorateur doit autoriser le déplacement de fichiers et de dossiers par glisser-déplacer.", + "confirmDragAndDrop": "Contrôle si l’Explorateur doit demander confirmation lors du déplacement de fichiers ou de dossiers via glisser-déposer.", + "confirmDelete": "Contrôle si l’explorateur doit demander confirmation lorsque vous supprimez un fichier via la corbeille.", + "sortOrder.default": "Les fichiers et dossiers sont triés par nom, dans l’ordre alphabétique. Les dossiers sont affichés avant les fichiers.", + "sortOrder.mixed": "Les fichiers et dossiers sont triés par nom, dans l’ordre alphabétique. Les fichiers sont imbriqués dans les dossiers.", + "sortOrder.filesFirst": "Les fichiers et dossiers sont triés par nom, dans l’ordre alphabétique. Les fichiers sont affichés avant les dossiers.", + "sortOrder.type": "Les fichiers et dossiers sont triés par extension, dans l’ordre alphabétique. Les dossiers sont affichés avant les fichiers.", + "sortOrder.modified": "Les fichiers et dossiers sont triés par date de dernière modification, dans l’ordre décroissant. Les dossiers sont affichés avant les fichiers.", + "sortOrder": "Contrôle l'ordre de tri des fichiers et dossiers dans l'explorateur. En plus du tri par défaut, vous pouvez définir l'ordre sur 'mixed' (fichiers et dossiers triés combinés), 'type' (par type de fichier), 'modified' (par date de dernière modification) ou 'fileFirst' (trier les fichiers avant les dossiers).", + "explorer.decorations.colors": "Contrôle si les décorations de fichier doivent utiliser des couleurs.", + "explorer.decorations.badges": "Contrôle si les décorations de fichier doivent utiliser des badges." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..f944e7fc14ff --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Utiliser les actions dans la barre d’outils de l’éditeur vers la droite pour soit **annuler** vos modifications ou **écraser** le contenu sur le disque avec vos modifications", + "discard": "Abandonner", + "overwrite": "Remplacer", + "retry": "Réessayer", + "readonlySaveError": "Échec de l'enregistrement de '{0}' : le fichier est protégé en écriture. Sélectionnez 'Remplacer' pour supprimer la protection.", + "genericSaveError": "Échec d'enregistrement de '{0}' ({1}).", + "staleSaveError": "Échec de l'enregistrement de '{0}' : le contenu sur disque est plus récent. Cliquez sur **Comparer** pour comparer votre version à celle située sur le disque.", + "compareChanges": "Comparer", + "saveConflictDiffLabel": "{0} (sur le disque) ↔ {1} (dans {2}) - Résoudre le conflit d'enregistrement" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..edae5effece3 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Aucun dossier ouvert", + "explorerSection": "Section de l'Explorateur de fichiers", + "noWorkspaceHelp": "Vous n'avez pas encore ajouter un dossier à l'espace de travail.", + "addFolder": "Ajouter un dossier", + "noFolderHelp": "Vous n'avez pas encore ouvert de dossier.", + "openFolder": "Ouvrir le dossier" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..6881d56fd1c8 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Explorateur", + "canNotResolve": "Impossible de résoudre le dossier de l'espace de travail" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..0e3d37245db3 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Section de l'Explorateur de fichiers", + "treeAriaLabel": "Explorateur de fichiers" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..631a14a1cef8 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Tapez le nom du fichier. Appuyez sur Entrée pour confirmer ou sur Échap pour annuler.", + "filesExplorerViewerAriaLabel": "{0}, Explorateur de fichiers", + "dropFolders": "Voulez-vous ajouter les dossiers à l’espace de travail ?", + "dropFolder": "Voulez-vous ajouter le dossier à l’espace de travail ?", + "addFolders": "&&Ajouter les dossiers", + "addFolder": "&&Ajouter le dossier", + "confirmMove": "Êtes-vous certain de vouloir déplacer '{0}' ?", + "doNotAskAgain": "Ne plus me demander", + "moveButtonLabel": "&&Déplacer", + "confirmOverwriteMessage": "{0}' existe déjà dans le dossier de destination. Voulez-vous le remplacer ?", + "irreversible": "Cette action est irréversible !", + "replaceButtonLabel": "&&Remplacer" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..c536ea46a5d8 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Éditeurs ouverts", + "openEditosrSection": "Section des éditeurs ouverts", + "dirtyCounter": "{0} non enregistré(s)", + "saveAll": "Enregistrer tout", + "closeAllUnmodified": "Fermer les éléments non modifiés", + "closeAll": "Tout fermer", + "compareWithSaved": "Comparer avec celui enregistré", + "close": "Fermer", + "closeOthers": "Fermer les autres" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..22721e1c8bce --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, groupe d'éditeurs", + "openEditorAriaLabel": "{0}, Ouvrir l'éditeur", + "saveAll": "Enregistrer tout", + "closeAllUnmodified": "Fermer les éléments non modifiés", + "closeAll": "Tout fermer", + "compareWithSaved": "Comparer avec celui enregistré", + "close": "Fermer", + "closeOthers": "Fermer les autres" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..854836303c03 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "totalProblems": "Total de {0} problèmes", + "filteredProblems": "Affichage de {0} sur {1} problèmes" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/common/messages.i18n.json index 3e60b2ce7d8a..de7f944af493 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,7 @@ { "viewCategory": "Affichage", "problems.view.toggle.label": "Activer/désactiver les problèmes", - "problems.view.show.label": "Afficher les problèmes", - "problems.view.hide.label": "Masquer les problèmes", + "problems.view.focus.label": "Problèmes de focus", "problems.panel.configuration.title": "Affichage des problèmes", "problems.panel.configuration.autoreveal": "Contrôle si l'affichage des problèmes doit automatiquement montrer les fichiers quand il les ouvre", "markers.panel.title.problems": "Problèmes", diff --git a/i18n/fra/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/fra/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..0a6aa85c9e2b --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "Création réussie des profils.", + "prof.detail": "Créez un problème et joignez manuellement les fichiers suivants :\n{0}", + "prof.restartAndFileIssue": "Créer le problème et redémarrer", + "prof.restart": "Redémarrer", + "prof.thanks": "Merci de votre aide.", + "prof.detail.restart": "Un redémarrage final est nécessaire pour continuer à utiliser '{0}'. Nous vous remercions une fois de plus pour votre contribution." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 727bb5eea95a..720e637a9196 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "Appuyez sur la combinaison de touches souhaitée, puis sur Entrée. Appuyez sur Échap pour annuler.", + "defineKeybinding.initial": "Appuyez sur la combinaison de touches souhaitée puis appuyez sur Entrée", "defineKeybinding.chordsTo": "pression simultanée avec" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 7d18aea5f66e..6ef622da0602 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "Changer de combinaison de touches", "addKeybindingLabelWithKey": "Ajouter une combinaison de touches {0}", "addKeybindingLabel": "Ajouter une combinaison de touches", + "title": "{0} ({1})", "commandAriaLabel": "Commande : {0}.", "keybindingAriaLabel": "Combinaison de touches : {0}.", "noKeybinding": "Aucune combinaison de touches n'est affectée.", diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 740f133866ca..01cb125f57cb 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openRawDefaultSettings": "Ouvrir les paramètres bruts par défaut", "openGlobalSettings": "Ouvrir les paramètres utilisateur", "openGlobalKeybindings": "Ouvrir les raccourcis clavier", "openGlobalKeybindingsFile": "Ouvrir le fichier des raccourcis clavier", diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 627070bf2700..c7b2dfd5e8a1 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Paramètres par défaut", "SearchSettingsWidget.AriaLabel": "Paramètres de recherche", "SearchSettingsWidget.Placeholder": "Paramètres de recherche", - "totalSettingsMessage": "Total de {0} paramètres", "noSettingsFound": "Aucun résultat", "oneSettingFound": "1 paramètre correspondant", "settingsFound": "{0} paramètres correspondants", - "fileEditorWithInputAriaLabel": "{0}. Éditeur de fichier texte.", - "fileEditorAriaLabel": "Éditeur de fichier texte.", + "totalSettingsMessage": "Total de {0} paramètres", + "defaultSettings": "Paramètres par défaut", + "defaultFolderSettings": "Paramètres de dossier par défaut", "defaultEditorReadonly": "Modifier dans l’éditeur du côté droit pour substituer les valeurs par défaut.", "preferencesAriaLabel": "Préférences par défaut. Éditeur de texte en lecture seule." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 12d172be7b12..91649fe2d5ee 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Placer vos paramètres ici pour remplacer les paramètres par défaut.", "emptyWorkspaceSettingsHeader": "Placer vos paramètres ici pour remplacer les paramètres utilisateur.", "emptyFolderSettingsHeader": "Placer les paramètres de votre dossier ici pour remplacer ceux des paramètres de l’espace de travail.", - "defaultFolderSettingsTitle": "Paramètres de dossier par défaut", - "defaultSettingsTitle": "Paramètres par défaut", "editTtile": "Modifier", "replaceDefaultValue": "Remplacer dans les paramètres", "copyDefaultValue": "Copier dans Paramètres", diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index b35025c24ae0..89aaca94b7b0 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Essayez la recherche vague (fuzzy) !", + "defaultSettingsFuzzyPrompt": "Essayez la recherche en langage naturel !", "defaultSettings": "Placez vos paramètres dans l’éditeur du côté droit pour substituer.", "noSettingsFound": "Aucun paramètre.", - "folderSettingsDetails": "Paramètres de dossier", - "enableFuzzySearch": "Activer la recherche vague (fuzzy) expérimentale" + "settingsSwitcherBarAriaLabel": "Sélecteur de paramètres", + "userSettings": "Paramètres utilisateur", + "workspaceSettings": "Paramètres de l'espace de travail", + "folderSettings": "Paramètres de dossier", + "enableFuzzySearch": "Activer la recherche en langage naturel" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..b2640dffe871 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Éditeur de préférences par défaut", + "keybindingsEditor": "Éditeur de combinaisons de touches", + "preferences": "Préférences" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 81a1f8080239..4852691d7f05 100644 --- a/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Fournisseurs de contrôle de code source", "hideRepository": "Masquer", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Installer des fournisseurs SCM supplémentaires...", "no open repo": "Il n’y a aucun fournisseur de contrôle de code source actif.", "source control": "Contrôle de code source", diff --git a/i18n/fra/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/fra/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index d5d4ff5f9b54..0701eeba6169 100644 --- a/i18n/fra/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "entrée", - "useIgnoreFilesDescription": "Utiliser Ignorer les fichiers", - "useExcludeSettingsDescription": "Utiliser Exclure les paramètres" + "useExcludesAndIgnoreFilesDescription": "Utiliser les paramètres d'exclusion et ignorer les fichiers" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 891ac2e5d786..e89ff759730a 100644 --- a/i18n/fra/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "Modèle Glob auquel les chemins de fichiers doivent correspondre. Affectez la valeur true ou false pour activer ou désactiver le modèle.", "exclude.when": "Vérification supplémentaire des frères d'un fichier correspondant. Utilisez $(basename) comme variable pour le nom de fichier correspondant.", "useRipgrep": "Contrôle si ripgrep doit être utilisé dans la recherche de texte et de fichier", - "useIgnoreFilesByDefault": "Contrôle s'il faut utiliser les fichiers .gitignore et .ignore par défaut en cas de recherche dans un nouvel espace de travail.", "useIgnoreFiles": "Contrôle s'il faut utiliser les fichiers .gitignore et .ignore par défaut pendant la recherche de fichiers.", "search.quickOpen.includeSymbols": "Configurez l'ajout des résultats d'une recherche de symboles globale dans le fichier de résultats pour Quick Open.", "search.followSymlinks": "Détermine s’il faut suivre les liens symboliques lors de la recherche." diff --git a/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json index e723b18fb059..72ef3e89f83b 100644 --- a/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Afficher le précédent Exclude Pattern de recherche", "nextSearchTerm": "Afficher le terme de recherche suivant", "previousSearchTerm": "Afficher le terme de recherche précédent", - "focusNextInputBox": "Focus sur la zone d'entrée suivante", - "focusPreviousInputBox": "Focus sur la zone d'entrée précédente", "showSearchViewlet": "Afficher la zone de recherche", "findInFiles": "Chercher dans les fichiers", "findInFilesWithSelectedText": "Rechercher dans les fichiers avec le texte sélectionné", "replaceInFiles": "Remplacer dans les fichiers", "replaceInFilesWithSelectedText": "Remplacer dans les fichiers avec le texte sélectionné", - "findInWorkspace": "Trouver dans l’espace de travail...", - "findInFolder": "Trouver dans le dossier...", "RefreshAction.label": "Actualiser", - "ClearSearchResultsAction.label": "Effacer les résultats de la recherche", + "CollapseDeepestExpandedLevelAction.label": "Réduire tout", + "ClearSearchResultsAction.label": "Effacer", "FocusNextSearchResult.label": "Focus sur le résultat de la recherche suivant", "FocusPreviousSearchResult.label": "Focus sur le résultat de la recherche précédent", "RemoveAction.label": "Rejeter", diff --git a/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..727436ac8ed3 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Atteindre le symbole dans l'espace de travail...", + "name": "Rechercher", + "search": "Rechercher", + "view": "Affichage", + "openAnythingHandlerDescription": "Accéder au fichier", + "openSymbolDescriptionNormal": "Atteindre le symbole dans l'espace de travail", + "searchOutputChannelTitle": "Rechercher", + "searchConfigurationTitle": "Rechercher", + "exclude": "Configurez les modèles Glob pour exclure les fichiers et les dossiers des recherches. Hérite de tous les modèles Glob à partir du paramètre files.exclude.", + "exclude.boolean": "Modèle Glob auquel les chemins de fichiers doivent correspondre. Affectez la valeur true ou false pour activer ou désactiver le modèle.", + "exclude.when": "Vérification supplémentaire des frères d'un fichier correspondant. Utilisez $(basename) comme variable pour le nom de fichier correspondant.", + "useRipgrep": "Contrôle si ripgrep doit être utilisé dans la recherche de texte et de fichier", + "useIgnoreFiles": "Contrôle s'il faut utiliser les fichiers .gitignore et .ignore par défaut pendant la recherche de fichiers.", + "search.quickOpen.includeSymbols": "Configurez l'ajout des résultats d'une recherche de symboles globale dans le fichier de résultats pour Quick Open.", + "search.followSymlinks": "Contrôle s'il faut suivre les symlinks pendant la recherche." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/fra/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..d98861f7c9f0 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "Rechercher dans le dossier...", + "findInWorkspace": "Trouver dans l’espace de travail..." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index abe24c7ec4d7..bd3914070b3a 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "Tâches", "ConfigureTaskRunnerAction.label": "Configurer une tâche", - "ConfigureBuildTaskAction.label": "Configurer une tâche de build", "CloseMessageAction.label": "Fermer", - "ShowTerminalAction.label": "Afficher le terminal", "problems": "Problèmes", + "building": "Génération...", "manyMarkers": "99", "runningTasks": "Afficher les tâches en cours d'exécution", "tasks": "Tâches", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "Aucune tâche à exécuter n'a été trouvée. Configurer les tâches...", "TaskService.fetchingBuildTasks": "Récupération des tâches de génération...", "TaskService.pickBuildTask": "Sélectionner la tâche de génération à exécuter", - "TaskService.noBuildTask": "Aucune tâche de génération à exécuter n'a été trouvée. Configurer les tâches...", + "TaskService.noBuildTask": "Aucune tâche de génération à exécuter n'a été trouvée. Configurer la tâche de génération...", "TaskService.fetchingTestTasks": "Récupération des tâches de test...", "TaskService.pickTestTask": "Sélectionner la tâche de test à exécuter", "TaskService.noTestTaskTerminal": "Aucune tâche de test à exécuter n'a été trouvée. Configurer les tâches...", diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 2265e06f9f3a..ae04c4513f3a 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "Une erreur inconnue s'est produite durant l'exécution d'une tâche. Pour plus d'informations, consultez le journal de sortie des tâches.", "dependencyFailed": "Impossible de résoudre la tâche dépendante '{0}' dans le dossier de l’espace de travail '{1}'", "TerminalTaskSystem.terminalName": "Tâche - {0}", + "closeTerminal": "Appuyez sur n’importe quelle touche pour fermer le terminal.", "reuseTerminal": "Le terminal sera réutilisé par les tâches, appuyez sur une touche pour le fermer.", "TerminalTaskSystem": "Impossible d'exécuter une commande d'interpréteur de commandes sur un lecteur UNC.", "unkownProblemMatcher": "Impossible de résoudre le détecteur de problèmes {0}. Le détecteur est ignoré" diff --git a/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 14d05c09fde6..83cc6d42c12e 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,8 @@ "ConfigurationParser.noTypeDefinition": "Erreur : aucun type de tâche '{0}' enregistré. Avez-vous oublié d'installer une extension incluant le fournisseur de tâches correspondant ?", "ConfigurationParser.missingRequiredProperty": "Erreur : la configuration de la tâche '{0}' a besoin de la propriété '{1}'. La configuration de la tâche sera ignorée.", "ConfigurationParser.notCustom": "Erreur : la tâche n'est pas déclarée comme une tâche personnalisée. La configuration est ignorée.\n{0}\n", - "ConfigurationParser.noTaskName": "Erreur : les tâches doivent fournir une propriété taskName. La tâche va être ignorée.\n{0}\n", - "taskConfiguration.shellArgs": "Avertissement : La tâche '{0}' est une commande d'interpréteur de commandes, et le nom de la commande ou l'un de ses arguments contient des espaces non précédés d'un caractère d'échappement. Pour garantir une ligne de commande correcte, fusionnez les arguments dans la commande.", + "ConfigurationParser.noTaskName": "Erreur : un tâche doit fournir une propriété label. La tâche va être ignorée.\n{0}\n", + "taskConfiguration.shellArgs": "Avertissement : la tâche '{0}' est une commande shell et un de ses arguments peut avoir des espaces non échappés. Afin d’assurer un échappement correct des guillemets dans la ligne de commande, veuillez fusionner les arguments dans la commande.", "taskConfiguration.noCommandOrDependsOn": "Erreur : La tâche '{0}' ne spécifie ni une commande, ni une propriété dependsOn. La tâche est ignorée. Sa définition est :\n{1}", "taskConfiguration.noCommand": "Erreur : La tâche '{0}' ne définit aucune commande. La tâche va être ignorée. Sa définition est :\n{1}", "TaskParse.noOsSpecificGlobalTasks": "Task Version 2.0.0 ne supporte pas les tâches spécifiques globales du système d'exploitation. Convertissez-les en une tâche en une commande spécifique du système d'exploitation. Les tâches concernées sont : {0}" diff --git a/i18n/fra/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index f680d69a958d..54e21c2597d8 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, sélecteur de terminaux", "termCreateEntryAriaLabel": "{0}, créer un terminal", - "'workbench.action.terminal.newplus": "$(plus) Créer un terminal intégré", + "workbench.action.terminal.newplus": "$(plus) Créer un terminal intégré", "noTerminalsMatching": "Aucun terminal correspondant", "noTerminalsFound": "Aucun terminal ouvert" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index ae4ba496061e..adc1c3337797 100644 --- a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,15 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "Thème de couleur", + "themes.category.light": "thèmes clairs", + "themes.category.dark": "thèmes sombres", + "themes.category.hc": "thèmes à contraste élevé", "installColorThemes": "Installer des thèmes de couleurs supplémentaires...", "themes.selectTheme": "Sélectionner un thème de couleur (flèches bas/haut pour afficher l'aperçu)", "selectIconTheme.label": "Thème d'icône de fichier", - "installIconThemes": "Installer des thèmes d'icônes de fichiers supplémentaires...", "noIconThemeLabel": "Aucun", "noIconThemeDesc": "Désactiver les icônes de fichiers", - "problemChangingIconTheme": "Problème de définition du thème d'icône : {0}", + "installIconThemes": "Installer des thèmes d'icônes de fichiers supplémentaires...", "themes.selectIconTheme": "Sélectionner un thème d'icône de fichier", "generateColorTheme.label": "Générer le thème de couleur à partir des paramètres actuels", "preferences": "Préférences", diff --git a/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 10bbc7a9e967..215683ddac1f 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Configuration spécifique de la fenêtre, qui peut être configurée dans les paramètres utilisateur ou de l'espace de travail.", "scope.resource.description": "Configuration spécifique de la ressource, qui peut être configurée dans les paramètres utilisateur, de l'espace de travail ou du dossier.", "scope.description": "Portée dans laquelle la configuration s’applique. Les portées disponibles sont `window` et `resource`.", + "vscode.extension.contributes.defaultConfiguration": "Contribue aux paramètres de configuration d'éditeur par défaut en fonction du langage.", "vscode.extension.contributes.configuration": "Ajoute des paramètres de configuration.", "invalid.title": "'configuration.title' doit être une chaîne", - "vscode.extension.contributes.defaultConfiguration": "Contribue aux paramètres de configuration d'éditeur par défaut en fonction du langage.", "invalid.properties": "'configuration.properties' doit être un objet", "invalid.allOf": "'configuration.allOf' est obsolète et ne doit plus être utilisé. Au lieu de cela, passez plusieurs sections de configuration sous forme de tableau au point de contribution 'configuration'.", "workspaceConfig.folders.description": "Liste des dossiers à être chargés dans l’espace de travail.", diff --git a/i18n/fra/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/fra/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..42bafb09091b --- /dev/null +++ b/i18n/fra/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Télémétrie", + "telemetry.enableCrashReporting": "Activez l'envoi de rapports d'incidents à Microsoft.\nCette option nécessite un redémarrage pour être prise en compte." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/fra/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 2355522c31cb..e23749d0ab92 100644 --- a/i18n/fra/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "bubbleTitle": "contient des éléments soulignés" + "bubbleTitle": "Contient des éléments soulignés" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..431845e652c0 --- /dev/null +++ b/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "message": "$(zap) Profilage de l'hôte d'extension..." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 2056c501ce05..3d53454a9a70 100644 --- a/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -9,5 +9,6 @@ "extensionHostProcess.crash": "L'hôte d’extension s'est arrêté de manière inattendue.", "extensionHostProcess.unresponsiveCrash": "L'hôte d'extension s'est arrêté, car il ne répondait pas.", "overwritingExtension": "Remplacement de l'extension {0} par {1}.", - "extensionUnderDevelopment": "Chargement de l'extension de développement sur {0}" + "extensionUnderDevelopment": "Chargement de l'extension de développement sur {0}", + "extensionCache.invalid": "Des extensions ont été modifiées sur le disque. Veuillez recharger la fenêtre." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/fra/src/vs/workbench/services/files/node/fileService.i18n.json index e5bf54a3941e..6ba63445dd27 100644 --- a/i18n/fra/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "Le fichier est un répertoire", "fileNotModifiedError": "Fichier non modifié depuis", "fileTooLargeError": "Fichier trop volumineux pour être ouvert", - "fileBinaryError": "Il semble que le fichier soit binaire. Impossible de l'ouvrir en tant que texte", "fileNotFoundError": "Fichier introuvable ({0})", + "fileBinaryError": "Il semble que le fichier soit binaire. Impossible de l'ouvrir en tant que texte", "fileExists": "Le fichier à créer existe déjà ({0})", "fileMoveConflict": "Déplacement/copie impossible. Le fichier existe déjà dans la destination.", "unableToMoveCopyError": "Impossible de déplacer/copier. Le fichier remplace le dossier qui le contient.", diff --git a/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 9d1662c1388d..232203467df5 100644 --- a/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -22,5 +22,5 @@ "keybindings.json.when": "Condition quand la touche est active.", "keybindings.json.args": "Arguments à passer à la commande à exécuter.", "keyboardConfigurationTitle": "Clavier", - "dispatch": "Spécifie l'utilisation de `keydown.code` (recommandé) ou de `keydown.keyCode` dans le cadre de la logique de dispatch associée aux appuis sur les touches." + "dispatch": "Contrôle la logique de distribution des appuis sur les touches pour utiliser soit 'code' (recommandé), soit 'keyCode'." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/fra/src/vs/workbench/services/textfile/common/textFileService.i18n.json index 53fb4332f21e..2614ff28252f 100644 --- a/i18n/fra/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "files.backup.failSave": "Les fichiers n'ont pas pu être sauvegardés (Erreur : {0}), essayez d'enregistrer vos fichiers pour quitter." + "files.backup.failSave": "Les fichiers qui sont modifiés ne peuvent pas être écrits à l’emplacement de sauvegarde (erreur : {0}). Essayez d’enregistrer vos fichiers d’abord, puis sortez." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 234d5fb5a0ee..46a345fad2d7 100644 --- a/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "De nouveaux paramètres de thème ont été ajoutés aux paramètres utilisateur. Sauvegarde disponible sur {0}.", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "Specifies the color theme used in the workbench.", "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Spécifie le thème d'icône utilisé dans le banc d'essai ou 'null' pour n'afficher aucune icône de fichier.", diff --git a/i18n/hun/extensions/git/out/autofetch.i18n.json b/i18n/hun/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..fe69406ef37c --- /dev/null +++ b/i18n/hun/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Igen", + "no": "Nem", + "not now": "Most nem", + "suggest auto fetch": "Szeretné engedélyezni a Git-forráskódtárhelyek automatikus lekérését (fetch)?" +} \ No newline at end of file diff --git a/i18n/hun/extensions/git/out/commands.i18n.json b/i18n/hun/extensions/git/out/commands.i18n.json index ed82f751b7f6..75a82e6ba00d 100644 --- a/i18n/hun/extensions/git/out/commands.i18n.json +++ b/i18n/hun/extensions/git/out/commands.i18n.json @@ -9,6 +9,8 @@ "create branch": "$(plus) Új ág létrehozása", "repourl": "Forráskódtár URL-címe", "parent": "Szülőkönyvtár", + "cancel": "$(sync~spin) Forráskódtár klónozása... Kattintson ide a megszakításhoz", + "cancel tooltip": "Klónozás megszakítása", "cloning": "Git-forráskódtár klónozása...", "openrepo": "Forráskódtár megnyitása", "proposeopen": "Szeretné megnyitni a klónozott forráskódtárat?", @@ -49,12 +51,15 @@ "select branch to delete": "Válassza ki a törlendő ágat", "confirm force delete branch": "A(z) '{0}' ág nincs teljesen beolvasztva. Mégis törli?", "delete branch": "Ág törlése", + "invalid branch name": "Az ág neve érvénytelen", + "branch already exists": "Már van '{0}' nevű ág", "select a branch to merge from": "Válassza ki az ágat, amit olvasztani szeretne", "merge conflicts": "Összeolvasztási konfliktusok keletkeztek. Oldja fel őket a beadás (commit) előtt!", "tag name": "Címke neve", "provide tag name": "Adja meg a címke nevét", "tag message": "Üzenet", "provide tag message": "Adja meg a címke leírását tartalmazó üzenetet", + "no remotes to fetch": "A forráskódtárhoz nincsenek távoli szerverek konfigurálva, ahonnan le lehetne kérni.", "no remotes to pull": "A forráskódtárhoz nincsenek távoli szerverek konfigurálva, ahonnan pullozni lehetne.", "pick remote pull repo": "Válassza ki a távoli szervert, ahonnan pullozni szeretné az ágat", "no remotes to push": "A forráskódtárhoz nincsenek távoli szerverek konfigurálva, ahová pusholni lehetne.", @@ -71,7 +76,7 @@ "no stashes": "Nincs visszaállítható stash.", "pick stash to pop": "Válassza ki a visszaállítandó stash-t", "clean repo": "Takarítsa ki a forráskódtár munkafáját, mielőtt checkoutolna!", - "cant push": "Nem lehet pusholni a távoli szerverre. Futtassa a 'Pull' parancsot a módosításai integrálásához!", + "cant push": "Nem lehet pusholni a távoli szerverre. Először próbálja meg futtatni a 'Pull' parancsot a módosításai integrálásához!", "git error details": "Git: {0}", "git error": "Git-hiba", "open git log": "Git-napló megnyitása" diff --git a/i18n/hun/extensions/git/out/main.i18n.json b/i18n/hun/extensions/git/out/main.i18n.json index 914f704e3d8c..ab59b50cfc78 100644 --- a/i18n/hun/extensions/git/out/main.i18n.json +++ b/i18n/hun/extensions/git/out/main.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Git keresése a következő helyen: {0}", "using git": "Git {0} használata a következő helyről: {1}", - "updateGit": "Git frissítése", + "downloadgit": "Git letöltése", "neverShowAgain": "Ne jelenjen meg újra", + "notfound": "A Git nem található. Telepítse vagy állítsa be az elérési útját a 'git.path' beállítással.", + "updateGit": "Git frissítése", "git20": "Úgy tűnik, hogy a git {0} van telepítve. A Code a git >= 2 verzióival működik együtt a legjobban." } \ No newline at end of file diff --git a/i18n/hun/extensions/git/out/repository.i18n.json b/i18n/hun/extensions/git/out/repository.i18n.json index 360a4435ac67..234abfc4470a 100644 --- a/i18n/hun/extensions/git/out/repository.i18n.json +++ b/i18n/hun/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Általunk törölt", "both added": "Mindkettő hozzáadta", "both modified": "Mindkettő módosította", + "commitMessage": "Üzenet (nyomja meg a következőt a commithoz: {0})", "commit": "Commit", "merge changes": "Módosítások összeolvasztása", "staged changes": "Beadásra előjegyzett módosítások", diff --git a/i18n/hun/extensions/git/package.i18n.json b/i18n/hun/extensions/git/package.i18n.json index d0c5339fa18f..150ac02318b8 100644 --- a/i18n/hun/extensions/git/package.i18n.json +++ b/i18n/hun/extensions/git/package.i18n.json @@ -33,8 +33,10 @@ "command.checkout": "Checkout adott helyre...", "command.branch": "Ág létrehozása...", "command.deleteBranch": "Új ág létrehozása", + "command.renameBranch": "Ág átnevezése...", "command.merge": "Ág beolvasztása...", "command.createTag": "Címke létrehozása", + "command.fetch": "Lekérés (fetch)", "command.pull": "Pull", "command.pullRebase": "Pull (Rebase)", "command.pullFrom": "Pullozás...", @@ -42,9 +44,11 @@ "command.pushTo": "Push adott helyre...", "command.pushWithTags": "Push címkékkel", "command.sync": "Szinkronizálás", + "command.syncRebase": "Szinkronizálás (rebase)", "command.publish": "Ág publikálása", "command.showOutput": "Git-kimenet megjelenítése", "command.ignore": "Fájl hozzáadása a .gitignore-hoz", + "command.stashIncludeUntracked": "Stash (a nem követett fájlokkal együtt)", "command.stash": "Stash", "command.stashPop": "Stash visszaállítása...", "command.stashPopLatest": "Legutóbbi stash visszaállítása", @@ -57,6 +61,7 @@ "config.countBadge": "Meghatározza a git jelvényen megjelenő számláló működését. Az `all` minden módosítást számol, a `tracked` csak a követkett változtatásokat. Az `off` kikapcsolja a jelvényt.", "config.checkoutType": "Meghatározza, hogy milyen típusú ágak jelenjenek meg a `Checkout adott helyről... ` parancs futtatása esetén. Az `all` esetén az összes ref megjelenik, `local` esetén csak a helyi ágak, `tags` esetén csak a címkék, `remote` esetén pedig csak a távoli ágak.", "config.ignoreLegacyWarning": "Régi gittel kapcsolatos figyelmeztetés figyelmen kívül hagyása", + "config.ignoreMissingGitWarning": "Figyelmeztetés figyelmen kívül hagyása, ha a Git hiányzik", "config.ignoreLimitWarning": "Túl sok módosítás esetén megjelenő figyelmeztetés figyelmen kívül hagyása", "config.defaultCloneDirectory": "Git-forráskódtárak klónozásának alapértelmezett helye.", "config.enableSmartCommit": "Összes módosítás beadása (commit), ha nincsenek előjegyzett módosítások.", diff --git a/i18n/hun/extensions/markdown/out/commands.i18n.json b/i18n/hun/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..4d7844c4529f --- /dev/null +++ b/i18n/hun/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "{0} előnézete", + "onPreviewStyleLoadError": "A 'markdown.styles' nem tölthető be: {0}" +} \ No newline at end of file diff --git a/i18n/hun/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/hun/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..a99e02434195 --- /dev/null +++ b/i18n/hun/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "A tartalom egy része le van tiltva az aktuális dokumentumban", + "preview.securityMessage.title": "Potencionálisan veszélyes vagy nem biztonságos tartalom lett letiltva a markdown-előnézetben. Módosítsa a markdown-előnézet biztonsági beállításait a nem biztonságos tartalmak vagy parancsfájlok engedélyezéséhez!", + "preview.securityMessage.label": "Biztonsági figyelmeztetés: tartalom le van tiltva" +} \ No newline at end of file diff --git a/i18n/hun/extensions/markdown/out/security.i18n.json b/i18n/hun/extensions/markdown/out/security.i18n.json index 17e3cdb8d755..dc2803d33294 100644 --- a/i18n/hun/extensions/markdown/out/security.i18n.json +++ b/i18n/hun/extensions/markdown/out/security.i18n.json @@ -11,5 +11,8 @@ "disable.title": "Letiltás", "disable.description": "Minden tartalom és parancsfájl futtatásának engedélyezése. Nem ajánlott.", "moreInfo.title": "További információ", + "enableSecurityWarning.title": "Előnézettel kapcsolatos biztonsági figyelmeztetések engedélyezése ezen a munkaterületen", + "disableSecurityWarning.title": "Előnézettel kapcsolatos biztonsági figyelmeztetések letiltása ezen a munkaterületen", + "toggleSecurityWarning.description": "Nem befolyásolja a tartalom biztonsági szintjét", "preview.showPreviewSecuritySelector.title": "Válassza ki a munkaterület Markdown-előnézeteinek biztonsági beállítását!" } \ No newline at end of file diff --git a/i18n/hun/extensions/merge-conflict/package.i18n.json b/i18n/hun/extensions/merge-conflict/package.i18n.json index b3814f8d7e63..0fc1ea6b49ca 100644 --- a/i18n/hun/extensions/merge-conflict/package.i18n.json +++ b/i18n/hun/extensions/merge-conflict/package.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "command.category": "Összeolvasztási konfliktus", + "command.accept.all-current": "Összes aktuális elfogadása", "command.accept.all-incoming": "Összes beérkező változás elfogadása", "command.accept.all-both": "Változások elfogadása mindkét oldalról", "command.accept.current": "Helyi változtatás elfogadása", diff --git a/i18n/hun/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/hun/extensions/typescript/out/features/completionItemProvider.i18n.json index 74dcbbe0b6ce..09e699cf41e3 100644 --- a/i18n/hun/extensions/typescript/out/features/completionItemProvider.i18n.json +++ b/i18n/hun/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "selectCodeAction": "Válasszon végrehajtandó kódműveletet!", "acquiringTypingsLabel": "Típusdefiníciók letöltése...", "acquiringTypingsDetail": "Típusdefiníciók letöltése az IntelliSense-hez.", "autoImportLabel": "Automatikus importálás a következő helyről: {0}" diff --git a/i18n/hun/extensions/typescript/package.i18n.json b/i18n/hun/extensions/typescript/package.i18n.json index e6fbadc27982..6c0766a467e2 100644 --- a/i18n/hun/extensions/typescript/package.i18n.json +++ b/i18n/hun/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "TS-szervernapló megnyitása", "typescript.restartTsServer": "TS-szerver újraindítása", "typescript.selectTypeScriptVersion.title": "TypeScript-verzió kiválasztása", + "typescript.reportStyleChecksAsWarnings": "Stílusellenőrzés során talált esetek figyelmeztetésként legyenek jelentve", "jsDocCompletion.enabled": "Automatikus JSDoc-megjegyzések engedélyezése vagy letiltása", "javascript.implicitProjectConfig.checkJs": "JavaScript-fájlok szemantikai ellenőrzésének engedélyezése vagy letiltása. A meglévő jsconfig.json vagy tsconfig.json fájlok felülírják ezt a beállítást. TypeScript >= 2.3.1-et igényel.", "typescript.npm": "Az automatikus típusdefiníció-letöltéshez használt NPM végrehajtható fájl elérési útja. TypeScript 2.3.4-et igényel.", diff --git a/i18n/hun/src/vs/base/common/errorMessage.i18n.json b/i18n/hun/src/vs/base/common/errorMessage.i18n.json index adc4bbc9fdd2..c664a35d8d25 100644 --- a/i18n/hun/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/hun/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}: {1}", - "error.permission.verbose": "Engedélyhiány (HTTP {0})", - "error.permission": "Engedélyhiány", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Ismeretlen csatlakozási hiba ({0})", - "error.connection.unknown": "Ismeretlen csatlakozási hiba történt. Vagy megszakadt az internetkapcsolat, vagy a kiszolgáló vált offline-ná.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "Ismeretlen hiba történt. Részletek a naplóban.", "nodeExceptionMessage": "Rendszerhiba történt ({0})", diff --git a/i18n/hun/src/vs/code/electron-main/main.i18n.json b/i18n/hun/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..295fec83c2af --- /dev/null +++ b/i18n/hun/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "Már fut a(z) {0} másik példánya, de nem válaszol.", + "secondInstanceNoResponseDetail": "Zárja be az összes példányt, majd próbálja újra!", + "secondInstanceAdmin": "Már fut a(z) {0} másik példánya adminisztrátorként.", + "secondInstanceAdminDetail": "Zárja be az összes példányt, majd próbálja újra!", + "close": "&&Bezárás" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-main/menus.i18n.json b/i18n/hun/src/vs/code/electron-main/menus.i18n.json index 62fae0da1974..c93d0756a233 100644 --- a/i18n/hun/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/hun/src/vs/code/electron-main/menus.i18n.json @@ -26,8 +26,8 @@ "miOpenFolder": "Ma&&ppa megnyitása", "miOpenFile": "&&Fájl megnyitása", "miOpenRecent": "&&Legutóbbi megnyitása", - "miSaveWorkspaceAs": "Munkaterület menté&&se másként...", - "miAddFolderToWorkspace": "&&Mappa hozzáadása a munkaterülethez...", + "miSaveWorkspaceAs": "Munkaterület mentése másként...", + "miAddFolderToWorkspace": "Mappa hozzáa&&dása a munkaterülethez...", "miSave": "Menté&&s", "miSaveAs": "M&&entés másként", "miSaveAll": "Összes men&&tése", @@ -157,7 +157,7 @@ "mMergeAllWindows": "Összes ablak összeolvasztása", "miToggleDevTools": "&&Fejlesztői eszközök be- és kikapcsolása", "miAccessibilityOptions": "&&Kisegítő lehetőségek", - "miReportIssues": "&&Problémák jelentése", + "miReportIssue": "H&&iba jelentése", "miWelcome": "Üdvözlő&&oldal", "miInteractivePlayground": "&&Interaktív játszótér", "miDocumentation": "&&Dokumentáció", @@ -184,6 +184,7 @@ "miDownloadingUpdate": "Frissítés letöltése...", "miInstallingUpdate": "Frissítés telepítése...", "miCheckForUpdates": "Frissítések keresése...", - "aboutDetail": "\nVerzió: {0}\nCommit: {1}\nDátum: {2}\nShell: {3}\nRendelő: {4}\nNode: {5}\nArchitektúra: {6}", - "okButton": "OK" + "aboutDetail": "Verzió: {0}\nCommit: {1}\nDátum: {2}\nShell: {3}\nRendelő: {4}\nNode: {5}\nArchitektúra: {6}", + "okButton": "OK", + "copy": "&&Másolás" } \ No newline at end of file diff --git a/i18n/hun/src/vs/code/node/cliProcessMain.i18n.json b/i18n/hun/src/vs/code/node/cliProcessMain.i18n.json index fe8c039d35fd..84a30118cd75 100644 --- a/i18n/hun/src/vs/code/node/cliProcessMain.i18n.json +++ b/i18n/hun/src/vs/code/node/cliProcessMain.i18n.json @@ -8,6 +8,7 @@ "notInstalled": "A(z) '{0}' kiegészítő nincs telepítve.", "useId": "Bizonyosodjon meg róla, hogy a kiegészítő teljes azonosítóját használja, beleértve a kiadót, pl.: {0}", "successVsixInstall": "A(z) '{0}' kiegszítő sikeresen telepítve lett.", + "cancelVsixInstall": "A(z) '{0}' kiegészítő telepítése meg lett szakítva.", "alreadyInstalled": "A(z) '{0}' kiegészítő már telepítve van.", "foundExtension": "A(z) '{0}' kiegészítő megtalálva a piactéren.", "installing": "Telepítés...", diff --git a/i18n/hun/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/hun/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..b0bbd29edb05 --- /dev/null +++ b/i18n/hun/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "A következő fájlok módosultak időközben: {0}", + "summary.0": "Nem történtek változtatások", + "summary.nm": "{0} változtatást végzett {0} fájlban", + "summary.n0": "{0} változtatást végzett egy fájlban" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json index a441d84a33a6..48b15939e90b 100644 --- a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,16 @@ "fontSize": "Meghatározza a betű méretét, pixelekben.", "lineHeight": "Meghatározza a sormagasságot. A 0 érték használata esetén a sormagasság a fontSize értékéből van számolva.", "letterSpacing": "Meghatározza a betűközt, pixelekben.", - "lineNumbers": "Meghatározza, hogy megjelenjenek-e a sorszámok. A lehetséges értékek 'on', 'off' és 'relative'. A 'relative' érték használata esetén a kurzor aktuális pozíciójához képest számított sorszám jelenik meg.", + "lineNumbers.off": "A sorszámok nem jelennek meg.", + "lineNumbers.on": "A sorszámok abszolút értékként jelennek meg.", + "lineNumbers.relative": "A sorszámok a kurzortól való távolságuk alapján jelennek meg.", + "lineNumbers.interval": "A sorszámok minden 10. sorban jelennek meg.", + "lineNumbers": "Meghatározza a sorszámok megjelenését. A lehetséges értékek: 'on', 'off' és 'relative'.", "rulers": "Függőleges vonalzók kirajzolása bizonyos számú fix szélességű karakter után. Több vonalzó használatához adjon meg több értéket. Nincs kirajzolva semmi, ha a tömb üres.", "wordSeparators": "Azon karakterek listája, amelyek szóelválasztónak vannak tekintve szavakkal kapcsolatos navigáció vagy műveletek során.", - "tabSize": "Egy tabulátor hány szóköznek felel meg. Ez a beállítás felülírásra kerül a fájl tartalma alapján, ha az 'editor.detectIndentation' beállítás aktív.", + "tabSize": "Egy tabulátor hány szóköznek felel meg. Ez a beállítás felülírásra kerül a fájl tartalma alapján, ha az `editor.detectIndentation` beállítás aktív.", "tabSize.errorMessage": "A várt érték 'number' típusú. Megjegyzés: az \"auto\" értéket az 'editor.detectIndentation' beállítás helyettesíti.", - "insertSpaces": "Tabulátor billentyű lenyomásánál szóközök legyenek-e beszúrva. Ez a beállítás felülírásra kerül a fájl tartalma alapján, ha az 'editor.detectIndentation' beállítás aktív.", + "insertSpaces": "Szóközök beszúrása a tabulátor billentyű lenyomása esetén. Ez a beállítás felülíródik a fájl tartalma alapján, ha az `editor.detectIndentation` beállítás aktív.", "insertSpaces.errorMessage": "A várt érték 'boolean' típusú. Megjegyzés: az \"auto\" értéket az 'editor.detectIndentation' beállítás helyettesíti.", "detectIndentation": "Fájl megnyitásakor az `editor.tabSize` és az `editor.insertSpaces` értéke a fájl tartalma alapján lesz meghatározva.", "roundedSelection": "Itt adható meg, hogy a kijelölt elemek sarkai lekerekítettek legyenek-e", @@ -27,6 +31,7 @@ "minimap.maxColumn": "Meghatározza, hogy a kódtérképen legfeljebb hány oszlop legyen kirajzolva.", "find.seedSearchStringFromSelection": "Meghatározza, hogy a keresés modulba automatikusan bekerüljön-e a szerkesztőablakban kiválasztott szöveg.", "find.autoFindInSelection": "Meghatározza, hogy a keresés a kijelölésben beállítás be van-e kapcsolva, ha több karakternyi vagy sornyi szöveg ki van jelölve a szerkesztőablakban.", + "find.globalFindClipboard": "Meghatározza, hogy a keresőmodul olvassa és módosítsa-e a megosztott keresési vágólapot macOS-en.", "wordWrap.off": "A sorok soha nem lesznek tördelve.", "wordWrap.on": "A sorok tördelve lesznek a nézetablak szélességénél.", "wordWrap.wordWrapColumn": "A sorok tördelve lesznek az `editor.wordWrapColumn` oszlopnál.", @@ -89,8 +94,8 @@ "links": "Meghatározza, hogy a szerkesztőablak érzékelje-e a hivatkozásokat, és kattinthatóvá tegye-e őket.", "colorDecorators": "Meghatározza, hogy a szerkesztőablakban ki legyenek-e rajzolva a színdekorátorok és színválasztók.", "codeActions": "Engedélyezi a kódműveletek végrehajtásához használható villanykörtét", + "selectionClipboard": "Meghatározza-e, hogy támogatva van-e az elsődleges vágólap Linux alatt", "sideBySide": "Meghatározza, hogy a differenciaszerkesztő ablakban egymás mellett vagy a sorban jelenjenek meg az eltérések", "ignoreTrimWhitespace": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a sor elején vagy végén a szóközökben talált különbségek", - "renderIndicators": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a +/- jelzők az hozzáadott/eltávolított változásoknál", - "selectionClipboard": "Meghatározza-e, hogy támogatva van-e az elsődleges vágólap Linux alatt" + "renderIndicators": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a +/- jelzők az hozzáadott/eltávolított változásoknál" } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/hun/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..647a263affcf --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Ugrás a zárójelre" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/hun/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..1fc37d076840 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Kurzor mozgatása balra", + "caret.moveRight": "Kurzor mozgatása jobbra" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/hun/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..e8cbbca5cf4d --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Betűk megcserélése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/hun/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..09439c237cb3 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Kivágás", + "actions.clipboard.copyLabel": "Másolás", + "actions.clipboard.pasteLabel": "Beillesztés", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Másolás szintaktikai kiemeléssel" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/hun/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..219553bdc4e1 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Egysoros megjegyzés ki-/bekapcsolása", + "comment.line.add": "Egysoros megjegyzés hozzáadása", + "comment.line.remove": "Egysoros megjegyzés eltávolítása", + "comment.block": "Megjegyzésblokk ki-/bekapcsolása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/hun/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..78d9a20aae1c --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Szerkesztőablak helyi menüjének megjelenítése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/find/findController.i18n.json b/i18n/hun/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..6e1f33bcedab --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Keresés", + "findNextMatchAction": "Következő találat", + "findPreviousMatchAction": "Előző találat", + "nextSelectionMatchFindAction": "Következő kijelölés", + "previousSelectionMatchFindAction": "Előző kijelölés", + "startReplace": "Csere", + "showNextFindTermAction": "Következő keresési kifejezés megjelenítése", + "showPreviousFindTermAction": "Előző keresési kifejezés megjelenítése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/hun/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..21f944c42631 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Keresés", + "placeholder.find": "Keresés", + "label.previousMatchButton": "Előző találat", + "label.nextMatchButton": "Következő találat", + "label.toggleSelectionFind": "Keresés kijelölésben", + "label.closeButton": "Bezárás", + "label.replace": "Csere", + "placeholder.replace": "Csere", + "label.replaceButton": "Csere", + "label.replaceAllButton": "Összes cseréje", + "label.toggleReplaceButton": "Váltás csere módra", + "title.matchesCountLimit": "Csak az első {0} találat van kiemelve, de minden keresési művelet a teljes szöveggel dolgozik.", + "label.matchesLocation": "{0} (összesen {1})", + "label.noResults": "Nincs eredmény" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/hun/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..2d5b3af7ef7b --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Keresés", + "placeholder.find": "Keresés", + "label.previousMatchButton": "Előző találat", + "label.nextMatchButton": "Következő találat", + "label.closeButton": "Bezárás" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/hun/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..ffe920fbb793 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Kibontás", + "unFoldRecursivelyAction.label": "Kibontás rekurzívan", + "foldAction.label": "Bezárás", + "foldRecursivelyAction.label": "Bezárás rekurzívan", + "foldAllBlockComments.label": "Összes megjegyzésblokk bezárása", + "foldAllMarkerRegions.label": "Összes régió bezárása", + "unfoldAllMarkerRegions.label": "Összes régió kinyitása", + "foldAllAction.label": "Az összes bezárása", + "unfoldAllAction.label": "Az összes kinyitása", + "foldLevelAction.label": "{0} szintű blokkok bezárása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..7b8c9186b0f1 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "Egy formázást végzett a(z) {0}. sorban", + "hintn1": "{0} formázást végzett a(z) {1}. sorban", + "hint1n": "Egy formázást végzett a(z) {0}. és {1}. sorok között", + "hintnn": "{0} formázást végzett a(z) {1}. és {2}. sorok között", + "no.provider": "Sajnáljuk, de nincs formázó telepítve a(z) '{0}' típusú fájlokhoz.", + "formatDocument.label": "Dokumentum formázása", + "formatSelection.label": "Kijelölt tartalom formázása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..50e0679aba90 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Nem található a(z) '{0}' definíciója", + "generic.noResults": "Definíció nem található", + "meta.title": " – {0} definíció", + "actions.goToDecl.label": "Ugrás a definícióra", + "actions.goToDeclToSide.label": "Definíció megnyitása oldalt", + "actions.previewDecl.label": "Betekintés a definícióba", + "goToImplementation.noResultWord": "Nem található a(z) '{0}' implementációja", + "goToImplementation.generic.noResults": "Implementáció nem található", + "meta.implementations.title": " – {0} implementáció", + "actions.goToImplementation.label": "Ugrás az implementációra", + "actions.peekImplementation.label": "Betekintés az implementációba", + "goToTypeDefinition.noResultWord": "Nem található a(z) '{0}' típusdefiníciója", + "goToTypeDefinition.generic.noResults": "Típusdefiníció nem található", + "meta.typeDefinitions.title": " – {0} típusdefiníció", + "actions.goToTypeDefinition.label": "Ugrás a típusdefinícióra", + "actions.peekTypeDefinition.label": "Betekintés a típusdefinícióba" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..782190fef044 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Kattintson {0} definíció megjelenítéséhez." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..e3ec625549ef --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Következő hiba vagy figyelmeztetés", + "markerAction.previous.label": "Előző hiba vagy figyelmeztetés", + "editorMarkerNavigationError": "A szerkesztőablak jelzőnavigációs moduljának színe hiba esetén.", + "editorMarkerNavigationWarning": "A szerkesztőablak jelzőnavigációs moduljának színe figyelmeztetés esetén.", + "editorMarkerNavigationInfo": "A szerkesztőablak jelzőnavigációs moduljának színe információ esetén.", + "editorMarkerNavigationBackground": "A szerkesztőablak jelzőnavigációs moduljának háttérszíne." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/hun/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..e9de48281ee8 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Súgószöveg megjelenítése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/hun/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..a9cab1dd0d55 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Betöltés..." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/hun/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..0339e509b33a --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Csere az előző értékre", + "InPlaceReplaceAction.next.label": "Csere a következő értékre" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..4b8870d20ac8 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Indentálások átalakítása szóközökké", + "indentationToTabs": "Indentálások átalakítása tabulátorokká", + "configuredTabSize": "Beállított tabulátorméret", + "selectTabWidth": "Tabulátorméret kiválasztása az aktuális fájlhoz", + "indentUsingTabs": "Indentálás tabulátorral", + "indentUsingSpaces": "Indentálás szóközzel", + "detectIndentation": "Indentálás felismerése a tartalom alapján", + "editor.reindentlines": "Sorok újraindentálása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/hun/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..d5c935359b07 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Sor másolása eggyel feljebb", + "lines.copyDown": "Sor másolása eggyel lejjebb", + "lines.moveUp": "Sor feljebb helyezése", + "lines.moveDown": "Sor lejjebb helyezése", + "lines.sortAscending": "Rendezés növekvő sorrendben", + "lines.sortDescending": "Rendezés csökkenő sorrendben", + "lines.trimTrailingWhitespace": "Sor végén található szóközök levágása", + "lines.delete": "Sor törlése", + "lines.indent": "Sor behúzása", + "lines.outdent": "Sor kihúzása", + "lines.insertBefore": "Sor beszúrása eggyel feljebb", + "lines.insertAfter": "Sor beszúrása eggyel lejjebb", + "lines.deleteAllLeft": "Balra lévő tartalom törlése", + "lines.deleteAllRight": "Jobbra lévő tartalom törlése", + "lines.joinLines": "Sorok egyesítése", + "editor.transpose": "A kurzor körüli karakterek felcserélése", + "editor.transformToUppercase": "Átalakítás nagybetűssé", + "editor.transformToLowercase": "Átalakítás kisbetűssé" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/links/links.i18n.json b/i18n/hun/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..543b55fd2ed0 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Hivatkozott oldal megnyitása Cmd + kattintás paranccsal", + "links.navigate": "Hivatkozott oldal megnyitása Ctrl + kattintás paranccsal", + "links.command.mac": "Cmd + kattintás a parancs végrehajtásához", + "links.command": "Ctrl + kattintás a parancs végrehajtásához", + "links.navigate.al": "Hivatkozás megnyitása Alt + kattintás paranccsal", + "links.command.al": "Alt + kattintás a parancs végrehajtásához", + "invalid.url": "A hivatkozást nem sikerült megnyitni, mert nem jól formázott: {0}", + "missing.url": "A hivatkozást nem sikerült megnyitni, hiányzik a célja.", + "label": "Hivatkozás megnyitása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/hun/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..f50dc975843b --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Kurzor beszúrása egy sorral feljebb", + "mutlicursor.insertBelow": "Kurzor beszúrása egy sorral lejjebb", + "mutlicursor.insertAtEndOfEachLineSelected": "Kurzor beszúrása a sorok végére", + "addSelectionToNextFindMatch": "Kijelölés hozzáadása a következő keresési találathoz", + "addSelectionToPreviousFindMatch": "Kijelölés hozzáadása az előző keresési találathoz", + "moveSelectionToNextFindMatch": "Utolsó kijelölés áthelyezése a következő keresési találatra", + "moveSelectionToPreviousFindMatch": "Utolsó kijelölés áthelyezése az előző keresési találatra", + "selectAllOccurrencesOfFindMatch": "Az összes keresési találat kijelölése", + "changeAll.label": "Minden előfordulás módosítása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/hun/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..973e6d7ae912 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Paraméterinformációk megjelenítése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/hun/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..f05a169d614f --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, információ" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/hun/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..1fef02c03eb5 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Javítások megjelenítése ({0})", + "quickFix": "Javítások megjelenítése", + "quickfix.trigger.label": "Gyorsjavítás" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/hun/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..a40829f1ae60 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Bezárás" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/hun/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..bc4f4f5abd63 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " – {0} referencia", + "references.action.label": "Minden hivatkozás megkeresése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..b93a507d5d9b --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Betöltés..." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..4ab9002859c9 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "szimbólum a következő helyen: {0}, sor: {1}, oszlop: {2}", + "aria.fileReferences.1": "Egy szimbólum a következő helyen: {0}, teljes elérési út: {1}", + "aria.fileReferences.N": "{0} szimbólum a következő helyen: {1}, teljes elérési út: {2}", + "aria.result.0": "Nincs találat", + "aria.result.1": "Egy szimbólum a következő helyen: {0}", + "aria.result.n1": "{0} szimbólum a következő helyen: {1}", + "aria.result.nm": "{0} szimbólum {1} fájlban" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..2701fadac42d --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Nem sikerült feloldani a fájlt.", + "referencesCount": "{0} referencia", + "referenceCount": "{0} referencia", + "missingPreviewMessage": "előnézet nem érhető el", + "treeAriaLabel": "Referenciák", + "noResults": "Nincs eredmény", + "peekView.alternateTitle": "Referenciák", + "peekViewTitleBackground": "A betekintőablak címsorának háttérszíne.", + "peekViewTitleForeground": "A betekintőablak címének színe.", + "peekViewTitleInfoForeground": "A betekintőablak címsorában található információ színe.", + "peekViewBorder": "A betekintőablak keretének és nyilainak színe.", + "peekViewResultsBackground": "A betekintőablak eredménylistájának háttérszíne.", + "peekViewResultsMatchForeground": "A betekintőablak eredménylistájában található sorhivatkozások előtérszíne.", + "peekViewResultsFileForeground": "A betekintőablak eredménylistájában található fájlhivatkozások előtérszíne.", + "peekViewResultsSelectionBackground": "A betekintőablak eredménylistájában kiválaszott elem háttérszíne.", + "peekViewResultsSelectionForeground": "A betekintőablak eredménylistájában kiválaszott elem előtérszíne.", + "peekViewEditorBackground": "A betekintőablak szerkesztőablakának háttérszíne.", + "peekViewEditorGutterBackground": "A betekintőablak szerkesztőablakában található margó háttérszíne.", + "peekViewResultsMatchHighlight": "Kiemelt keresési eredmények színe a betekintőablak eredménylistájában.", + "peekViewEditorMatchHighlight": "Kiemelt keresési eredmények színe a betekintőablak szerkesztőablakában." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/hun/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..c6eac10add61 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Nincs eredmény.", + "aria": "'{0}' sikeresen át lett nevezve a következőre: '{1}'. Összefoglaló: {2}", + "rename.failed": "Az átnevezést nem sikerült végrehajtani.", + "rename.label": "Szimbólum átnevezése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/hun/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..cd26c078ae05 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Átnevezésre szolgáló beviteli mező. Adja meg az új nevet, majd nyomja meg az Enter gombot a változtatások elvégzéséhez." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/hun/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..463be33cb03f --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Kijelölés bővítése", + "smartSelect.shrink": "Kijelölés szűkítése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/hun/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..d7050253ff13 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "A(z) '{0}' elfogadása a következő szöveg beszúrását eredményezte: {1}", + "suggest.trigger.label": "Javaslatok megjelenítése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/hun/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..1ea907a2db03 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "A javaslatokat tartalmazó modul háttérszíne.", + "editorSuggestWidgetBorder": "A javaslatokat tartalmazó modul keretszíne.", + "editorSuggestWidgetForeground": "A javaslatokat tartalmazó modul előtérszíne.", + "editorSuggestWidgetSelectedBackground": "A javaslatokat tartalmazó modulban kiválasztott elem háttérszíne.", + "editorSuggestWidgetHighlightForeground": "Az illeszkedő szövegrészletek kiemelése a javaslatok modulban.", + "readMore": "További információk megjelenítése...{0}", + "suggestionWithDetailsAriaLabel": "{0}, javaslat, részletekkel", + "suggestionAriaLabel": "{0}, javaslat", + "readLess": "Kevesebb információ megjelenítése...{0}", + "suggestWidget.loading": "Betöltés...", + "suggestWidget.noSuggestions": "Nincsenek javaslatok.", + "suggestionAriaAccepted": "{0}, elfogadva", + "ariaCurrentSuggestionWithDetails": "{0}, javaslat, részletekkel", + "ariaCurrentSuggestion": "{0}, javaslat" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/hun/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..dc4360652cbf --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Tab billentyűvel mozgatott fókusz ki- és bekapcsolása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/hun/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..fa7c33590751 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Szimbólumok háttérszíne olvasási hozzáférés, páldául változó olvasása esetén.", + "wordHighlightStrong": "Szimbólumok háttérszíne írási hozzáférés, páldául változó írása esetén.", + "overviewRulerWordHighlightForeground": "A kiemelt szimbólumokat jelölő jelzések színe az áttekintősávon.", + "overviewRulerWordHighlightStrongForeground": "A kiemelt, írási hozzáférésű szimbólumokat jelölő jelzések színe az áttekintősávon.", + "wordHighlight.next.label": "Ugrás a következő kiemelt szimbólumhoz", + "wordHighlight.previous.label": "Ugrás az előző kiemelt szimbólumhoz" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/environment/node/argv.i18n.json b/i18n/hun/src/vs/platform/environment/node/argv.i18n.json index bce6090ca243..0346bdf35893 100644 --- a/i18n/hun/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/hun/src/vs/platform/environment/node/argv.i18n.json @@ -12,8 +12,11 @@ "newWindow": "Mindenképp induljon új példány a Code-ból.", "performance": "Indítás a 'Developer: Startup Performance' parancs engedélyezésével.", "prof-startup": "Processzorhasználat profilozása induláskor", + "inspect-extensions": "Hibakeresés és profilozás engedélyezése a kiegészítőkben. Ellenőrizze a fejlesztői eszközöket a csatlakozási URI-hoz.", + "inspect-brk-extensions": "Hibakeresés és profilozás engedélyezése a kiegészítőkben, úgy, hogy a kiegészítő gazdafolyamata szüneteltetve lesz az indítás után. Ellenőrizze a fejlesztői eszközöket a csatlakozási URI-hoz. ", "reuseWindow": "Fájl vagy mappa megnyitása a legutoljára aktív ablakban.", "userDataDir": "Meghatározza a könyvtárat, ahol a felhasználói adatok vannak tárolva. Hasznás, ha rootként van futtatva.", + "log": "A naplózott események szintje. Lehetséges értékek: 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "verbose": "Részletes kimenet kiírása (magába foglalja a --wait kapcsolót)", "wait": "Várjon a fájlok bezárására a visszatérés előtt.", "extensionHomePath": "A kiegészítők gyökérkönyvtárának beállítása.", @@ -24,6 +27,7 @@ "experimentalApis": "Tervezett API-funkciók engedélyezése egy kiegészítő számára.", "disableExtensions": "Összes telepített kiegészítő letiltása.", "disableGPU": "Hardveres gyorsítás letiltása.", + "status": "Folyamatok erőforrás-használati és diagnosztikai adatinak kiíratása.", "version": "Verzió kiírása.", "help": "Használati útmutató kiírása.", "usage": "Használat", diff --git a/i18n/hun/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/hun/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index 62fa385ee048..7ae85dde971c 100644 --- a/i18n/hun/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/hun/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "Kiegészítő nem található", - "noCompatible": "A(z) {0} kiegészítőnek nincs ezzel a Code-verzióval kompatibilis változata." + "notCompatibleDownload": "A letöltés nem sikerült, mert a kiegészítő VS Code '{0}' verziójával kompatibilis változata nem található. " } \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 339d7b60e787..8788d40a469b 100644 --- a/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "A kiegészítő érvénytelen: a package.json nem egy JSON-fájl.", "restartCodeLocal": "Indítsa újra a Code-ot a(z) {0} újratelepítése előtt.", - "restartCodeGallery": "Indítsa újra a Code-ot az újratelepítés előtt!", + "installingOutdatedExtension": "A kiegészítő egy újabb verziója már telepítve van. Szeretné felülírni a régebbi verzióval?", + "override": "Felülírás", + "cancel": "Mégse", + "notFoundCompatible": "A telepítés nem sikerült, mert a(z) '{0}' kiegészítő VS Code '{1}' verziójával kompatibilis változata nem található.", + "quitCode": "A telepítés nem sikerült, mert a kiegészítő elavult példánya még mindig fut. Lépjen ki a VS Code-ból, és indítsa újra az újratelepítés előtt.", + "exitCode": "A telepítés nem sikerült, mert a kiegészítő elavult példánya még mindig fut. Lépjen ki a VS Code-ból, és indítsa újra az újratelepítés előtt.", + "notFoundCompatibleDependency": "A telepítés nem sikerült, mert a(z) '{0}' kiegészítő függőség VS Code '{1}' verziójával kompatibilis változata nem található. ", "uninstallDependeciesConfirmation": "Csak a(z) '{0}' kiegészítőt szeretné eltávolítani vagy annak függőségeit is?", "uninstallOnly": "Csak ezt", "uninstallAll": "Mindent", - "cancel": "Mégse", "uninstallConfirmation": "Biztosan szeretné eltávolítani a(z) '{0}' kiegészítőt?", "ok": "OK", "singleDependentError": "Nem sikerült eltávolítani a(z) '{0}' kiegészítőt: a(z) '{1}' kiegészítő függ tőle.", diff --git a/i18n/hun/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/hun/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index 5b5fef0ea323..a060a2640bb2 100644 --- a/i18n/hun/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/hun/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -17,6 +17,8 @@ "vscode.extension.activationEvents.onLanguage": "Aktiváló esemény, ami akkor fut le, ha az adott nyelvhez társított fájl kerül megnyitásra.", "vscode.extension.activationEvents.onCommand": "Aktiváló esemény, ami akkor fut le, amikor a megadott parancsot meghívják.", "vscode.extension.activationEvents.onDebug": "Aktiváló esemény, ami akkor fut le, ha a felhasználó hibakeresést indít el vagy beállítani készül a hibakeresési konfigurációt.", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "Aktivációs esemény, ami minden esetben kiváltódik, ha \"launch.json\"-t kell létrehozni (és az összes provideDebugConfigurations metódusokat meg kell hívni).", + "vscode.extension.activationEvents.onDebugResolve": "Aktiváló esemény, ami akkor fut, ha a megadott típusú hibakeresési munkamenetnek el kell indulnia (és a megfelelő resolveDebugConfiguration metódusokat meg kell hívni).", "vscode.extension.activationEvents.workspaceContains": "Aktiváló esemény, ami akkor fut le, ha egy olyan mappa kerül megnyitásra, amiben legalább egy olyan fájl van, amely illeszkedik a megadott globális mintára.", "vscode.extension.activationEvents.onView": "Aktiváló esemény, ami akkor fut le, amikor a megadott nézetet kiterjesztik.", "vscode.extension.activationEvents.star": "Aktiváló esemény, ami a VS Code indításakor fut le. A jó felhasználói élmény érdekében csak akkor használja ezt az eseményt, ha más aktiváló események nem alkalmasak az adott kiegészítő esetében.", diff --git a/i18n/hun/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/hun/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..62b0055aa42b --- /dev/null +++ b/i18n/hun/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "Fül láthatóságának ki- és bekapcsolása", + "view": "Nézet" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json index 215e7d12e87a..dfc290b2f8bc 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "largeNumberBadge": "10k+", "badgeTitle": "{0} – {1}", "additionalViews": "További nézetek", "numberBadge": "{0} ({1})", diff --git a/i18n/hun/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 505c556c227c..c82ab6ff2a23 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Előző szerkesztőablak megnyitása", "nextEditorInGroup": "A csoport következő szerkesztőablakának megnyitása", "openPreviousEditorInGroup": "A csoport előző szerkesztőablakának megnyitása", + "lastEditorInGroup": "Csoport utolsó szerkesztőablakának megnyitása", "navigateNext": "Ugrás előre", "navigatePrevious": "Ugrás vissza", "navigateLast": "Ugrás az utolsóra", diff --git a/i18n/hun/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index 6e6ffe92dbd1..b15ee093f22c 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "Aktív szerkesztőablak mozgatása fülek vagy csoportok között", "editorCommand.activeEditorMove.arg.name": "Aktív szerkesztőablak mozgatási argumentum", - "editorCommand.activeEditorMove.arg.description": "Argumentumtulajdonságok:\n\t\t\t\t\t\t* 'to': karakterlánc, a mozgatás célpontja.\n\t\t\t\t\t\t* 'by': karakterlánc, a mozgatás egysége. Fülek (tab) vagy csoportok (group) alapján.\n\t\t\t\t\t\t* 'value': szám, ami meghatározza, hogy hány pozíciót kell mozgatni, vagy egy abszolút pozíciót, ahová mozgatni kell.\n\t\t\t\t\t", + "editorCommand.activeEditorMove.arg.description": "Argumentumtulajdonságok:\n\t* 'to': karakterlánc, a mozgatás célpontja.\n\t* 'by': karakterlánc, a mozgatás egysége. Fülek (tab) vagy csoportok (group) alapján.\n\t* 'value': szám, ami meghatározza, hogy hány pozíciót kell mozgatni, vagy egy abszolút pozíciót, ahová mozgatni kell.", "commandDeprecated": "A(z) **{0}** parancs el lett távolítva. A(z) **{1}** használható helyette", "openKeybindings": "Billentyűparancsok beállítása" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 7f3902b99cff..3ae2a89812f2 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "Igen", "screenReaderDetectedExplanation.answerNo": "Nem", "screenReaderDetectedExplanation.body1": "A VS Code most már optimalizálva van képernyőolvasóval való használathoz.", - "screenReaderDetectedExplanation.body2": "Néhány funkció másképp működik. Például a sortörés, kódrészletek bezárása, automatikus záró zárójelek beszúrása stb." + "screenReaderDetectedExplanation.body2": "A szerkesztőablakban néhány funkció, például a sortörés, kódrészletek bezárása stb. másképp működik." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/quickopen.i18n.json b/i18n/hun/src/vs/workbench/browser/quickopen.i18n.json index 3f67d6f3e139..37f059a94c4c 100644 --- a/i18n/hun/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "Nincs eredmény", - "noResultsFound2": "Nincs találat", - "entryAriaLabel": "{0}, parancs" + "noResultsFound2": "Nincs találat" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json index b81dfc62fd32..8fa88c8859b2 100644 --- a/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Legutóbbi megnyitása...", "quickOpenRecent": "Legutóbbi gyors megnyitása...", "closeMessages": "Értesítések törlése", - "reportIssues": "Problémák jelentése", + "reportIssueInEnglish": "Probléma jelentése", "reportPerformanceIssue": "Teljesítményproblémák jelentése", "keybindingsReference": "Billentyűparancs-referencia", "openDocumentationUrl": "Dokumentáció", @@ -47,5 +47,26 @@ "showNextWindowTab": "Következő ablakfül megjelenítése", "moveWindowTabToNewWindow": "Ablakfül átmozgatása új ablakba", "mergeAllWindowTabs": "Összes ablak összeolvasztása", - "toggleWindowTabsBar": "Ablakfülsáv be- és kikapcsolása" + "toggleWindowTabsBar": "Ablakfülsáv be- és kikapcsolása", + "configureLocale": "Nyelv beállítása", + "displayLanguage": "Meghatározza a VSCode felületének nyelvét.", + "doc": "Az elérhető nyelvek listája a következő címen tekinthető meg: {0}", + "restart": "Az érték módosítása után újra kell indítani a VSCode-ot.", + "fail.createSettings": "Nem sikerült a(z) '{0}' létrehozás ({1}).", + "openLogsFolder": "Naplómappa megnyitása", + "showLogs": "Naplók megjelenítése...", + "mainProcess": "Fő", + "sharedProcess": "Megosztott", + "rendererProcess": "Megjelenítő", + "extensionHost": "Kiegészítő gazdafolyamata", + "selectProcess": "Válasszon folyamatot!", + "setLogLevel": "Naplózási szint beállítása", + "trace": "Nyomkövetés", + "debug": "Hibakeresés", + "info": "Információ", + "warn": "Figyelmeztetés", + "err": "Hiba", + "critical": "Kritikus", + "off": "Kikapcsolva", + "selectLogLevel": "Naplózási szint beállítása" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json index 9d6119695808..ffdce8089b56 100644 --- a/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Nézet", "help": "Súgó", "file": "Fájl", - "workspaces": "Munkaterületek", "developer": "Fejlesztői", + "workspaces": "Munkaterületek", "showEditorTabs": "Meghatározza, hogy a megnyitott szerkesztőablakok telején megjelenjenek-e a fülek", "workbench.editor.labelFormat.default": "Fájl nevének megjelenítése. Ha a fülek engedélyezve vannak, és két egyező nevű fájl van egy csoportban, az elérési útjuk eltérő része lesz hozzáfűzve a névhez. Ha a fülek le vannak tiltva, a fájl munkaterület könyvtárához képest relatív elérési útja jelenik meg, ha a szerkesztőablak aktív.", "workbench.editor.labelFormat.short": "A fájl nevének megjelenítése a könyvtár nevével együtt.", @@ -16,6 +16,7 @@ "workbench.editor.labelFormat.long": "Fájl nevének megjelenítése a fájl abszolút elérési útjával együtt.", "tabDescription": "Meghatározza a szerkesztőablakok címkéje formáját. A beállítás módosítása könnyebbé teheti a fájl helyének kiderítését:\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent', ha egy másik fülnek ugyanaz a címe, vagy a relatív elérési út, ha a fülek le vannak tiltva", "editorTabCloseButton": "Meghatározza a szerkesztőablakok fülein található bezárógomb pozícióját vagy eltávolítja őket, ha a beállítás értéke 'off'.", + "tabSizing": "Meghatározza a szerkesztőablak-fülek méretezését. Állítsa 'fit'-re, hogy mindig elég nagyok legyenek a szerkesztőablak teljes címének megjelenítéséhez. Állítsa 'shrink'-re, hogy a fülek mérete csökkenhessen abban az esetben, ha a rendelkezésre álló hely nem elég az összes fül megjelenítéséhez.", "showIcons": "Meghatározza, hogy a megnyitott szerkesztőablakok ikonnal együtt jelenjenek-e meg. A működéshez szükséges egy ikontéma engedélyezése is.", "enablePreview": "Meghatározza, hogy a megnyitott szerkesztőablakok előnézetként jelenjenek-e meg. Az előnézetként használt szerkesztőablakok újra vannak hasznosítva, amíg meg nem tartja őket a felhasználó (pl. dupla kattintás vagy szerkesztés esetén), és dőlt betűvel jelenik meg a címsoruk.", "enablePreviewFromQuickOpen": "Meghatározza, hogy a gyors megnyitás során megnyitott szerkesztőablakok előnézetként jelenjenek-e meg. Az előnézetként használt szerkesztőablakok újra vannak hasznosítva, amíg meg nem tartja őket a felhasználó (pl. dupla kattintás vagy szerkesztés esetén).", @@ -26,18 +27,17 @@ "closeOnFocusLost": "Meghatározza, hogy a gyors megnyitás automatikusan bezáródjon-e amint elveszíti a fókuszt.", "openDefaultSettings": "Meghatározza, hogy a beállítások megnyitásakor megnyíljon-e egy szerkesztő az összes alapértelmezett beállítással.", "sideBarLocation": "Meghatározza az oldalsáv helyét. Az oldalsáv megjelenhet a munkaterület bal vagy jobb oldalán.", - "panelLocation": "Meghatározza a panel pozícióját. Megjelenhet a munkaterület alján vagy jobb oldalon.", "statusBarVisibility": "Meghatározza, hogy megjelenjen-e az állapotsor a munkaterület alján.", "activityBarVisibility": "Meghatározza, hogy megjelenjen-e a tevékenységsáv a munkaterületen.", "closeOnFileDelete": "Meghatározza, hogy bezáródjanak-e azok a szerkesztőablakok, melyekben olyan fájl van megnyitva, amelyet töröl vagy átnevez egy másik folyamat. A beállítás letiltása esetén a szerkesztőablak nyitva marad módosított állapotban ilyen esemény után. Megjegyzés: az alkalmazáson belüli törlések esetén mindig bezáródik a szerkesztőablakok, a módosított fájlok pedig soha nem záródnak be, hogy az adatok megmaradjanak.", - "experimentalFuzzySearchEndpoint": "Meghatározza a kísérleti beállításkeresőben használt végpontot.", - "experimentalFuzzySearchKey": "Meghatározza a kísérleti beállításkeresőben használt kulcsot.", + "enableNaturalLanguageSettingsSearch": "Meghatározza, hogy engedélyezve van-e a természetes nyelvi keresési mód a beállításoknál.", "fontAliasing": "Meghatározza a munkaterületen megjelenő betűtípusok élsimítási módszerét.\n- default: Szubpixeles betűsimítás. A legtöbb nem-retina típusú kijelzőn ez adja a legélesebb szöveget.\n- antialiased: A betűket pixelek, és nem szubpixelek szintjén simítja. A betűtípus vékonyabbnak tűnhet összességében.\n- none: Letiltja a betűtípusok élsimítését. A szövegek egyenetlen, éles szélekkel jelennek meg.", "workbench.fontAliasing.default": "Szubpixeles betűsimítás. A legtöbb nem-retina típusú kijelzőn ez adja a legélesebb szöveget.", "workbench.fontAliasing.antialiased": "A betűket pixelek, és nem szubpixelek szintjén simítja. A betűtípus vékonyabbnak tűnhet összességében.", "workbench.fontAliasing.none": "Letiltja a betűtípusok élsimítését. A szövegek egyenetlen, éles szélekkel jelennek meg.", "swipeToNavigate": "Navigálás a nyitott fájlok között háromujjas, vízszintes húzással.", "workbenchConfigurationTitle": "Munkaterület", + "windowConfigurationTitle": "Ablak", "window.openFilesInNewWindow.on": "A fájlok új ablakban nyílnak meg", "window.openFilesInNewWindow.off": "A fájlok abban az ablakban nyílnak meg, ahol a mappájuk meg van nyitva vagy a legutoljára aktív ablakban", "window.openFilesInNewWindow.default": "A fájlok abban az ablakban nyílnak meg, ahol a mappájuk meg van nyitva vagy a legutoljára aktív ablakban, kivéve, ha a dokkról vagy a Finderből lettek megnyitva (csak macOS-en)", @@ -69,11 +69,11 @@ "autoDetectHighContrast": "Ha engedélyezve van, az alkalmazás automatikusan átvált a nagy kontrasztos témára, ha a WIndows a nagy kontrasztos témát használ, és a sötét témára, ha a Windows átvált a nagy kontrasztos témáról.", "titleBarStyle": "Módosítja az ablak címsorának megjelenését. A változtatás teljes újraindítást igényel.", "window.nativeTabs": "Engedélyezi a macOS Sierra ablakfüleket. Megjegyzés: a változtatás teljes újraindítást igényel, és a natív fülek letiltják az egyedi címsorstílust, ha azok be vannak konfigurálva.", - "windowConfigurationTitle": "Ablak", "zenModeConfigurationTitle": "Zen-mód", "zenMode.fullScreen": "Meghatározza, hogy zen-módban a munakterület teljes képernyős módba vált-e.", "zenMode.hideTabs": "Meghatározza, hogy zen-módban el vannak-e rejtve a munkaterület fülei.", "zenMode.hideStatusBar": "Meghatározza, hogy zen-módban el van-e rejtve a munkaterület alján található állapotsor.", "zenMode.hideActivityBar": "Meghatározza, hogy zen-módban el van-e rejtve a munkaterület bal oldalán található tevékenységsáv.", - "zenMode.restore": "Meghatározza, hogy az ablak zen-módban induljon-e, ha kilépéskor zen-módban volt." + "zenMode.restore": "Meghatározza, hogy az ablak zen-módban induljon-e, ha kilépéskor zen-módban volt.", + "JsonSchema.locale": "A felhasználói felületen használt nyelv." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index e98acd71fa15..f57bf5403316 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Töréspontok deaktiválása", "reapplyAllBreakpoints": "Töréspontok felvétele ismét", "addFunctionBreakpoint": "Függvénytöréspont hozzáadása", - "renameFunctionBreakpoint": "Függvénytöréspont átnevezése", "addConditionalBreakpoint": "Feltételes töréspont hozzáadása...", "editConditionalBreakpoint": "Töréspont szerkesztése...", "setValue": "Érték beállítása", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..de0485a7202e --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Töréspont szerkesztése...", + "functionBreakpointsNotSupported": "Ez a hibakereső nem támogatja a függvénytöréspontokat", + "functionBreakpointPlaceholder": "A függvény, amin meg kell állni", + "functionBreakPointInputAriaLabel": "Adja meg a függvénytöréspontot" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..2e3c27c4d1b0 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Hívási verem szakasz", + "debugStopped": "Szüneteltetve a következő helyen: {0}", + "callStackAriaLabel": "Hibakeresési hívási verem", + "process": "Folyamat", + "paused": "Szüneteltetve", + "running": "Fut", + "thread": "Szál", + "pausedOn": "Szüneteltetve a következő helyen: {0}", + "loadMoreStackFrames": "További veremkeretek betöltése", + "threadAriaLabel": "Szál: {0}, hívási verem, hibakeresés", + "stackFrameAriaLabel": "{0} veremkeret, {0}. sor {1} {2}, hívási verem, hibakeresés" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 564ebdd017fd..b95dd7c02f73 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,10 @@ "openExplorerOnEnd": "Hibakeresési munkamenet végén automatikusan nyíljon meg a fájlkezelő nézet", "inlineValues": "Változók értékének megjelenítése a sorok között hibakeresés közben", "hideActionBar": "Meghatározza, hogy megjelenjen-e a lebegő hibakeresési műveletsáv", + "never": "Soha ne jelenjen meg a hibakeresés az állapotsoron", + "always": "Mindig jelenjen meg a hibakeresés az állapotsoron", + "onFirstSessionStart": "A hibakeresés csak akkor jelenjen meg az állapotsoron, miután először el lett indítva a hibakeresés", + "showInStatusBar": "Meghatározza, hogy megjelenjen-e a hibakeresési állapotsáv", + "openDebug": "Meghatározza, hogy megnyíljon-e a hibakeresési panel a hibakeresési munkamenet indulásakor.", "launch": "Globális hibakeresés indítási konfiguráció. Használható a 'launch.json' alternatívájaként, ami meg van osztva több munkaterület között" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index e3d15de5db5e..99cb4104dec6 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,7 @@ "breakpointAdded": "Töréspont hozzáadva, {0}. sor, fájl: {1}", "breakpointRemoved": "Töréspont eltávoíltva, {0}. sor, fájl: {1}", "compoundMustHaveConfigurations": "A kombinációk \"configurations\" tulajdonságát be kell állítani több konfiguráció elindításához.", - "configMissing": "A(z) '{0}' konfiguráció hiányzik a 'launch.json'-ból.", + "launchJsonDoesNotExist": "A 'launch.json' nem létezik.", "debugRequestNotSupported": "A(z) `{0}` attribútumnak nem támogatott értéke van ('{1}') a kiválasztott hibakeresési konfigurációban.", "debugRequesMissing": "A(z) '{0}' attribútum hiányzik a kiválasztott hibakeresési konfigurációból.", "debugTypeNotSupported": "A megadott hibakeresési típus ('{0}') nem támogatott.", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..e152cc64aa86 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Változók szakasz", + "variablesAriaTreeLabel": "Hibakeresési változók", + "variableValueAriaLabel": "Adja meg a változó új nevét", + "variableScopeAriaLabel": "{0} hatókör, változók, hibakeresés", + "variableAriaLabel": "{0} értéke {1}, változók, hibakeresés" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..8d7086c2802e --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "Kifejezések szaszasz", + "watchAriaTreeLabel": "Hibakeresési figyelőkifejezések", + "watchExpressionPlaceholder": "Figyelendő kifejezés", + "watchExpressionInputAriaLabel": "Adja meg a figyelendő kifejezést", + "watchExpressionAriaLabel": "{0} értéke {1}, figyelt, hibakeresés", + "watchVariableAriaLabel": "{0} értéke {1}, figyelt, hibakeresés" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index 806ae8197d4f..767a32daee03 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "Kiegészítő neve", "extension id": "Kiegészítő azonosítója", + "preview": "Betekintő", "publisher": "Kiadó neve", "install count": "Telepítések száma", "rating": "Értékelés", + "repository": "Forráskódtár", "license": "Licenc", "details": "Részletek", "contributions": "Szolgáltatások", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 831e0dd3d1d1..09888fd024af 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Eltávolítás...", "updateAction": "Frissítés", "updateTo": "Frissítés ({0})", - "enableForWorkspaceAction.label": "Engedélyezés a munkaterületen", - "enableAlwaysAction.label": "Engedélyezés mindig", - "disableForWorkspaceAction.label": "Letiltás a munkaterületen", - "disableAlwaysAction.label": "Letiltás mindig", "ManageExtensionAction.uninstallingTooltip": "Eltávolítás", - "enableForWorkspaceAction": "Munkaterület", - "enableGloballyAction": "Mindig", + "enableForWorkspaceAction": "Engedélyezés a munkaterületen", + "enableGloballyAction": "Engedélyezés", "enableAction": "Engedélyezés", - "disableForWorkspaceAction": "Munkaterület", - "disableGloballyAction": "Mindig", + "disableForWorkspaceAction": "Letiltás a munkaterületen", + "disableGloballyAction": "Letiltás", "disableAction": "Letiltás", "checkForUpdates": "Frissítések keresése", "enableAutoUpdate": "Kiegészítők automatikus frissítésének engedélyezése", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Már az összes, munkaterülethez ajánlott kiegészítő telepítve van", "installRecommendedExtension": "Ajánlott kiegészítő telepítése", "extensionInstalled": "Ez az ajánlott kiegészítő már telepítve van.", - "showRecommendedKeymapExtensions": "Ajánlott billentyűkonfigurációk megjelenítése", "showRecommendedKeymapExtensionsShort": "Billentyűkonfigurációk", - "showLanguageExtensions": "Nyelvi kiegészítők megjelenítése", "showLanguageExtensionsShort": "Nyelvi kiegészítők", - "showAzureExtensions": "Azure-kiegészítők megjelenítése", "showAzureExtensionsShort": "Azure-kiegészítők", "OpenExtensionsFile.failed": "Nem sikerült létrehozni az 'extensions.json' fájlt a '.vscode' mappánan ({0}).", "configureWorkspaceRecommendedExtensions": "Ajánlott kiegészítők konfigurálása (munkaterületre vonatkozóan)", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 45b78dc0d375..a03a32613a60 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -7,8 +7,8 @@ "fileBasedRecommendation": "Ez a kiegészítő a közelmúltban megnyitott fájlok alapján ajánlott.", "workspaceRecommendation": "Ez a kiegészítő az aktuális munkaterület felhasználói által ajánlott.", "exeBasedRecommendation": "Ez a kiegészítő azért ajánlott, mert a következő telepítve van: {0}.", - "reallyRecommended2": "Ehhez a fájltípushoz ajánlott a(z) '{0}' kiegészítő.", - "reallyRecommendedExtensionPack": "Ehhez a fájltípushoz ajánlott a(z) '{0}' kiegészítőcsomag.", + "reallyRecommended2": "Ehhez a fájltípushoz a(z) '{0}' kiegészítő ajánlott.", + "reallyRecommendedExtensionPack": "Ehhez a fájltípushoz a(z) '{0}' kiegészítőcsomag ajánlott.", "showRecommendations": "Ajánlatok megjelenítése", "install": "Telepítés", "neverShowAgain": "Ne jelenítse meg újra", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index 61b346af2edf..661261d0b488 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -9,7 +9,7 @@ "extension": "Kiegészítő", "extensions": "Kiegészítők", "view": "Nézet", + "developer": "Fejlesztői", "extensionsConfigurationTitle": "Kiegészítők", - "extensionsAutoUpdate": "Kiegészítők automatikus frissítése", - "extensionsIgnoreRecommendations": "Ajánlott kiegészítők figyelmen kívül hagyása" + "extensionsAutoUpdate": "Kiegészítők automatikus frissítése" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..89b9332aaf7c --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reportExtensionIssue": "Probléma jelentése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..f5098b1e4b77 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Mappák" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..d032a29e6848 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Fájl", + "revealInSideBar": "Megjelenítés az oldalsávon", + "acceptLocalChanges": "A lemezen lévő tartalom felülírása a saját módosításokkal", + "revertLocalChanges": "Saját módosítások elvetése és a lemezen lévő tartalom visszaállítása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..559fe056a7de --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Újrapróbálkozás", + "rename": "Átnevezés", + "newFile": "Új fájl", + "newFolder": "Új mappa", + "openFolderFirst": "Mappák vagy fájlok létrehozásához először nyisson meg egy mappát!", + "newUntitledFile": "Új, névtelen fájl", + "createNewFile": "Új fájl", + "createNewFolder": "Új mappa", + "deleteButtonLabelRecycleBin": "Áthelyezés a lo&&mtárba", + "deleteButtonLabelTrash": "Áthelyezés a &&kukába", + "deleteButtonLabel": "&&Törlés", + "dirtyMessageFolderOneDelete": "Törölni készül egy olyan mappát, melyben egy nem mentett változtatásokat tartalmazó fájl van. Folytatja?", + "dirtyMessageFolderDelete": "Törölni készül egy olyan mappát, melyben {0} nem mentett változtatásokat tartalmazó fájl van. Folytatja?", + "dirtyMessageFileDelete": "Törölni készül egy olyan fájlt, amely nem mentett változtatásokat tartalmaz. Folytatja?", + "dirtyWarning": "A módosítások elvesznek, ha nem menti őket.", + "confirmMoveTrashMessageFolder": "Törli a(z) '{0}' nevű mappát és a teljes tartalmát?", + "confirmMoveTrashMessageFile": "Törli a(z) '{0}' nevű fájlt?", + "undoBin": "Helyreállíthatja a lomtárból.", + "undoTrash": "Helyreállíthatja a kukából.", + "doNotAskAgain": "Ne kérdezze meg újra", + "confirmDeleteMessageFolder": "Törli a(z) {0} mappát és a teljes tartalmát?", + "confirmDeleteMessageFile": "Véglegesen törli a következőt: {0}?", + "irreversible": "A művelet nem vonható vissza!", + "permDelete": "Végleges törlés", + "delete": "Törlés", + "importFiles": "Fájlok importálása", + "confirmOverwrite": "A célmappában már van ilyen nevű mappa vagy fájl. Le szeretné cserélni?", + "replaceButtonLabel": "&&Csere", + "copyFile": "Másolás", + "pasteFile": "Beillesztés", + "duplicateFile": "Duplikálás", + "openToSide": "Megnyitás oldalt", + "compareSource": "Kijelölés összehasonlításhoz", + "globalCompareFile": "Aktív fájl összehasonlítása...", + "openFileToCompare": "Fájlok összehasonlításához elősször nyisson meg egy fájlt.", + "compareWith": "'{0}' összehasonlítása a következővel: '{1}'", + "compareFiles": "Fájlok összehasonlítása", + "refresh": "Frissítés", + "save": "Mentés", + "saveAs": "Mentés másként...", + "saveAll": "Összes mentése", + "saveAllInGroup": "Összes mentése a csoportban", + "saveFiles": "Összes fájl mentése", + "revert": "Fájl visszaállítása", + "focusOpenEditors": "Váltás a megnyitott szerkesztőablakok nézetre", + "focusFilesExplorer": "Váltás a fájlkezelőre", + "showInExplorer": "Aktív fájl megjelenítése az oldalsávon", + "openFileToShow": "Fájl fájlkezelőben történő megjelenítéséhez először nyisson meg egy fájlt", + "collapseExplorerFolders": "Mappák összecsukása a fájlkezelőben", + "refreshExplorer": "Fájlkezelő frissítése", + "openFileInNewWindow": "Aktív fájl megnyitása új ablakban", + "openFileToShowInNewWindow": "Fájl új ablakban történő megnyitásához először nyisson meg egy fájlt", + "revealInWindows": "Megjelenítés a fájlkezelőben", + "revealInMac": "Megjelenítés a Finderben", + "openContainer": "Tartalmazó mappa megnyitása", + "revealActiveFileInWindows": "Aktív fájl megjelenítése a Windows Intézőben", + "revealActiveFileInMac": "Aktív fájl megjelenítése a Finderben", + "openActiveFileContainer": "Aktív fájlt tartalmazó mappa megnyitása", + "copyPath": "Elérési út másolása", + "copyPathOfActive": "Aktív fájl elérési útjának másolása", + "emptyFileNameError": "Meg kell adni egy fájl vagy mappa nevét.", + "fileNameExistsError": "Már létezik **{0}** nevű fájl vagy mappa ezen a helyszínen. Adjon meg egy másik nevet!", + "invalidFileNameError": "A(z) **{0}** név nem érvényes fájl- vagy mappanév. Adjon meg egy másik nevet!", + "filePathTooLongError": "A(z) **{0}** név egy olyan elérési utat eredményez, ami túl hosszú. Adjon meg egy másik nevet!", + "compareWithSaved": "Aktív fájl összehasonlítása a mentett változattal", + "modifiedLabel": "{0} (a lemezen) ↔ {1}", + "compareWithClipboard": "Aktív fájl összehasonlítása a vágólap tartalmával", + "clipboardComparisonLabel": "Vágólap ↔ {0}" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..dd9057b1fa4b --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Fájlok elérési útjának másolásához elősször nyisson meg egy fájlt", + "openFileToReveal": "Fájlok felfedéséhez elősször nyisson meg egy fájlt" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..22341f239a22 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Fájlkezelő megjelenítése", + "explore": "Fájlkezelő", + "view": "Nézet", + "textFileEditor": "Szövegfájlszerkesztő", + "binaryFileEditor": "Bináris fájlszerkesztő", + "filesConfigurationTitle": "Fájlok", + "exclude": "Globális minták konfigurálása fájlok és mappák kizárásához. A fájlkezelő például ezen beállítás alapján dönti el, hogy mely fájlokat és mappákat jelenítsen meg vagy rejtsen el.", + "files.exclude.boolean": "A globális minta, amire illesztve lesznek a fájlok elérési útjai. A minta engedélyezéséhez vagy letiltásához állítsa igaz vagy hamis értékre.", + "files.exclude.when": "További ellenőrzés elvégzése az illeszkedő fájlok testvérein. Az illeszkedő fájl nevéhez használja a $(basename) változót!", + "associations": "Rendeljen nyelveket a fájlokhoz (pl: \"*.kiterjesztés\": \"html\"). Ezek a hozzárendelések elsőbbséget élveznek a telepített nyelvek által definiált alapértelmezett beállításokkal szemben.", + "encoding": "A fájlok írásánál és olvasásánál használt alapértelmezett karakterkészlet. A beállítás nyelvenként is konfigurálható.", + "autoGuessEncoding": "Ha engedélyezve van, fájlok megnyitásakor megpróbálja kitalálni a karakterkészletüket. A beállítás nyelvenként is konfigurálható.", + "eol": "Az alapértelmezett sorvégjel. LF-hez használjon \\n-t, CRLF-hez pedig \\r\\n-t.", + "trimTrailingWhitespace": "Ha engedélyezve van, a fájl mentésekor levágja a sor végén található szóközöket.", + "insertFinalNewline": "Ha engedélyezve van, mentéskor beszúr egy záró újsort a fájl végére.", + "trimFinalNewlines": "Ha engedélyezve van, mentéskor levágja a fájl végérő az összes újsort az utolsó újsor után.", + "files.autoSave.off": "A módosított fájlok soha nincsenek automatikusan mentve.", + "files.autoSave.afterDelay": "A módosított fájlok automatikusan mentésre kerülnek a 'files.autoSaveDelay' beállításban meghatározott időközönként.", + "files.autoSave.onFocusChange": "A módosított fájlok automatikusan mentésre kerülnek, ha a szerkesztőablak elveszíti a fókuszt.", + "files.autoSave.onWindowChange": "A módosított fájlok automatikusan mentésre kerülnek, ha az ablak elveszíti a fókuszt.", + "autoSave": "Meghatározza a módosított fájlok automatikus mentési stratégiáját. Elfogadott értékek: '{0}', '{1}', '{2}' (a szerkesztőablak elveszíti a fókuszt), '{3}' (az ablak elveszíti a fókuszt). Ha az értéke '{4}', megadható a késleltetés a 'files.autoSaveDelay' beállításban.", + "autoSaveDelay": "Meghatározza ezredmásodpercben a késleltetést, ami után a módosított fájlok automatikusan mentésre kerülnek. Csak akkor van hatása, ha a 'files.autoSave' beállítás értéke '{0}'.", + "watcherExclude": "Globális minta, ami meghatározza azoknak a fájloknak a listáját, amelyek ki vannak szűrve a figyelésből. A mintáknak abszolút elérési utakra kell illeszkedniük (azaz előtagként adja hozzá a **-t vagy a teljes elérési utat a megfelelő illeszkedéshez). A beállítás módosítása újraindítást igényel. Ha úgy észleli, hogy a Code túl sok processzort használ indításnál, ki tudja szűrni a nagy mappákat a kezdeti terhelés csökkentés érdekében.", + "hotExit.off": "Gyors kilépés letiltása.", + "hotExit.onExit": "Gyors kilépésről akkor van szó, ha az utolsó ablakot bezárják Windowson és Linuxon, vagy ha a workbench.action.quit parancs van futtatva (a parancskatalógusból, billentyűkombinációval vagy a menüből). Az összes biztonsági mentéssel rendelkező ablak helyre lesz állítva a következő indítás során.", + "hotExit.onExitAndWindowClose": "Gyors kilépésről akkor van szó, ha az utolsó ablakot bezárják Windowson és Linuxon, ha a workbench.action.quit parancs van futtatva (a parancskatalógusból, billentyűkombinációval vagy a menüből), vagy bármely ablak, amelyben mappa van megnyitva, függetlenül attól, hogy az az utolsó ablak-e. Az összes megnyitott, mappa nélküli ablak helyre lesz állítva a következő indítás során. A megnyitott mappát tartalmazó ablakok helyreállításához állítsa a \"window.restoreWindows\" értékét \"all\"-ra.", + "hotExit": "Meghatározza, hogy a nem mentett fájlokra emlékezzen-e az alkalmazás a munkamenetek között, így ki lehet hagyni a mentéssel kapcsolatos felugró ablakokat kilépésnél.", + "useExperimentalFileWatcher": "Új, kísérleti fájlfigyelő használata.", + "defaultLanguage": "Az új fájlokhoz alapértelmezetten hozzárendelt nyelv.", + "editorConfigurationTitle": "Szerkesztőablak", + "formatOnSave": "Fájlok formázása mentéskor. Az adott nyelvhez rendelkezésre kell állni formázónak, nem lehet beállítva automatikus mentés, és a szerkesztő nem állhat éppen lefelé.", + "explorerConfigurationTitle": "Fájlkezelő", + "openEditorsVisible": "A megnyitott szerkesztőablakok panelen megjelenített szerkesztőablakok száma. Állítsa 0-ra, ha el szeretné rejteni a panelt.", + "dynamicHeight": "Meghatározza, hogy a megnyitott szerkesztőablakok szakasz magassága automatikusan illeszkedjen a megnyitott elemek számához vagy sem.", + "autoReveal": "Meghatározza, hogy a fájlkezelőben automatikusan fel legyenek fedve és ki legyenek jelölve a fájlok, amikor megnyitják őket.", + "enableDragAndDrop": "Meghatározza, hogy a fájlkezelőben áthelyezhetők-e a fájlok és mappák húzással.", + "confirmDragAndDrop": "Meghatározza, hogy a fájlkezelő kérjen-e megerősítést fájlok és mappák húzással történő áthelyezése esetén.", + "confirmDelete": "Meghatározza, hogy a fájlkezelő kérjen-e megerősítést a fájlok lomtárba történő helyezése esetén.", + "sortOrder.default": "A fájlok és mappák név szerint vannak rendezve, ABC-sorrendben. A mappák a fájlok előtt vannak listázva.", + "sortOrder.mixed": "A fájlok és mappák név szerint vannak rendezve, ABC-sorrendben. A fájlok és a mappák közösen vannak rendezve.", + "sortOrder.filesFirst": "A fájlok és mappák név szerint vannak rendezve, ABC-sorrendben. A fájlok a mappák előtt vannak listázva.", + "sortOrder.type": "A fájlok és mappák a kiterjesztésük szerint vannak rendezve, ABC-sorrendben. A mappák a fájlok előtt vannak listázva.", + "sortOrder.modified": "A fájlok és mappák a legutolsó módosítás dátuma szerint vannak rendezve, csökkenő sorrendben. A mappák a fájlok előtt vannak listázva.", + "sortOrder": "Meghatározza a fájlok és mappák rendezési módját a fájlkezelőben. Az alapértelmezett rendezésen túl beállítható 'mixed' (a fájlok és mappák közösen vannak rendezve), 'type' (rendezés fájltípus szerint), 'modified' (rendezés utolsó módosítási dátum szerint) vagy 'filesFirst' (fájlok a mappák elé vannak rendezve) is.", + "explorer.decorations.colors": "Meghatározza, hogy a fájldekorációk használjanak-e színeket.", + "explorer.decorations.badges": "Meghatározza, hogy a fájldekorációk használjanak-e jelvényeket." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..0bb33fdc6288 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Használja a jobbra lévő szerkesztői eszköztáron található műveleteket a saját módosítások **visszavonására** vagy **írja felül** a lemezen lévő tartalmat a változtatásokkal", + "discard": "Elvetés", + "overwrite": "Felülírás", + "retry": "Újrapróbálkozás", + "readonlySaveError": "Nem sikerült menteni a(z) '{0}' fájlt: a fájl írásvédett. Válassza a 'Felülírás' lehetőséget a védelem eltávolításához.", + "genericSaveError": "Hiba a(z) '{0}' mentése közben: {1}", + "staleSaveError": "Nem sikerült menteni a(z) '{0}' fájlt: a lemezen lévő tartalom újabb. Kattintson az **Összehasonlítás*** gombra a helyi és a lemezen lévő változat összehasonlításához.", + "compareChanges": "Összehasonlítás", + "saveConflictDiffLabel": "{0} (a lemezen) ↔ {1} ({2}) – Mentési konfliktus feloldása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..30d6d3091428 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Nincs mappa megnyitva", + "explorerSection": "Fájlkezelő szakasz", + "noWorkspaceHelp": "Még nem adott mappát a munkaterülethez.", + "addFolder": "Mappa hozzáadása", + "noFolderHelp": "Még nem nyitott meg mappát", + "openFolder": "Mappa megnyitása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..e8e887279e88 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Fájlkezelő", + "canNotResolve": "Nem sikerült feloldani a munkaterület-mappát" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..d5015512419d --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Fájlkezelő szakasz", + "treeAriaLabel": "Fájlkezelő" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..e00a7141ecf9 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Adja meg a fájl nevét. Nyomjon 'Enter'-t a megerősítéshez vagy 'Escape'-et a megszakításhoz.", + "filesExplorerViewerAriaLabel": "{0}, Fájlkezelő", + "dropFolders": "Szeretné hozzáadni a mappákat a munkaterülethez?", + "dropFolder": "Szeretné hozzáadni a mappát a munkaterülethez?", + "addFolders": "Mappák hozzá&&adása", + "addFolder": "Mappa hozzá&&adása", + "confirmMove": "Biztosan át szeretné helyezni a következőt: '{0}'?", + "doNotAskAgain": "Ne kérdezze meg újra", + "moveButtonLabel": "&&Áthelyezés", + "confirmOverwriteMessage": "A célmappában már létezik '{0}' nevű elem. Le szeretné cserélni?", + "irreversible": "A művelet nem vonható vissza!", + "replaceButtonLabel": "&&Csere" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..99cf9cb13e7c --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Megnyitott szerkesztőablakok", + "openEditosrSection": "Megnyitott szerkesztőablakok szakasz", + "dirtyCounter": "{0} nincs mentve", + "saveAll": "Összes mentése", + "closeAllUnmodified": "Nem módosultak bezárása", + "closeAll": "Összes bezárása", + "compareWithSaved": "Összehasonlítás a mentett változattal", + "close": "Bezárás", + "closeOthers": "Többi bezárása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..41a3029037ed --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, Szerkesztőcsoport", + "openEditorAriaLabel": "{0}, megnyitott szerkesztőablak", + "saveAll": "Összes mentése", + "closeAllUnmodified": "Nem módosultak bezárása", + "closeAll": "Összes bezárása", + "compareWithSaved": "Összehasonlítás a mentett változattal", + "close": "Bezárás", + "closeOthers": "Többi bezárása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..44e82c9a64b5 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "totalProblems": "Összesen {0} probléma", + "filteredProblems": "{0} probléma megjelenítve (összesen: {1})" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/common/messages.i18n.json index 5600d4626b54..1ecd95e356c4 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,7 @@ { "viewCategory": "Nézet", "problems.view.toggle.label": "Problémák be- és kikapcsolása", - "problems.view.show.label": "Problémák megjelenítése", - "problems.view.hide.label": "Problémák elrejtése", + "problems.view.focus.label": "Váltás a problémákra", "problems.panel.configuration.title": "Problémák-nézet", "problems.panel.configuration.autoreveal": "Meghatározza, hogy a problémák nézet automatikusan felfedje-e a fájlokat, amikor megnyitja őket.", "markers.panel.title.problems": "Problémák", diff --git a/i18n/hun/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/hun/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..bf91ad5e3b56 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "Profil sikeresen elkészítve.", + "prof.detail": "Készítsen egy hibajelentést, és manuálisan csatolja a következő fájlokat:\n{0}", + "prof.restartAndFileIssue": "Hibajelentés létrehozása és újraindítás", + "prof.restart": "Újraindítás", + "prof.thanks": "Köszönjük a segítséget!", + "prof.detail.restart": "Egy utolsó újraindítás szükséges a(z) '{0}' használatához. Ismételten köszönjük a közreműködését!" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index f660711dc6b6..6e07a23b3878 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "Üsse le a kívánt billentyűkombinációt, majd nyomjon ENTER-t. ESCAPE a megszakításhoz.", + "defineKeybinding.initial": "Üsse le a kívánt billentyűkombinációt, majd nyomja meg az ENTER-t.", "defineKeybinding.chordsTo": "kombináció a következőhöz:" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 1e432a804192..5f23e1e85aa7 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -8,7 +8,7 @@ "SearchKeybindings.AriaLabel": "Billentyűparancsok keresése", "SearchKeybindings.Placeholder": "Billentyűparancsok keresése", "sortByPrecedene": "Rendezés precedencia szerint", - "header-message": "Haladó beállításokhoz nyissa meg és szerkessze a következőt:", + "header-message": "További, haladó testreszabáshoz nyissa meg és szerkessze a következő fájlt:", "keybindings-file-name": "keybindings.json", "keybindingsLabel": "Billentyűparancsok", "changeLabel": "Billentyűparancs módosítása", @@ -26,6 +26,7 @@ "editKeybindingLabel": "Billentyűparancs módosítása", "addKeybindingLabelWithKey": "{0} billentyűparancs hozzáadása", "addKeybindingLabel": "Billentyűparancs hozzáadása", + "title": "{0} ({1})", "commandAriaLabel": "Parancs: {0}.", "keybindingAriaLabel": "Billentyűparancs: {0}.", "noKeybinding": "Nincs billentyűparancs hozzárendelve.", diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 4d1cfca9683e..daaa36415890 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openRawDefaultSettings": "Nyers alapértelmezett beállítások megnyitása", "openGlobalSettings": "Felhasználói beállítások megnyitása", "openGlobalKeybindings": "Billentyűparancsok megnyitása", "openGlobalKeybindingsFile": "Billentyűparancsfájl megnyitása", diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index c61dba726c16..9b9670df23c7 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Alapértelmezett beállítások", "SearchSettingsWidget.AriaLabel": "Beállítások keresése", "SearchSettingsWidget.Placeholder": "Beállítások keresése", - "totalSettingsMessage": "Összesen {0} beállítás", "noSettingsFound": "Nincs eredmény", "oneSettingFound": "1 illeszkedő beállítás", "settingsFound": "{0} illeszkedő beállítás", - "fileEditorWithInputAriaLabel": "{0}. Szövegfájlszerkesztő.", - "fileEditorAriaLabel": "Szövegfájlszerkesztő", + "totalSettingsMessage": "Összesen {0} beállítás", + "defaultSettings": "Alapértelmezett beállítások", + "defaultFolderSettings": "Alapértelmezett mappabeállítások", "defaultEditorReadonly": "A jobb oldalon lévő szerkesztőablak tartalmának módosításával írhatja felül az alapértelmezett beállításokat.", "preferencesAriaLabel": "Az alapértelmezett beállítások. Írásvédett szerkesztőablak." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 856d458a7098..cc4a2d305d9c 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Az ebben a fájlban elhelyezett beállítások felülírják az alapértelmezett beállításokat.", "emptyWorkspaceSettingsHeader": "Az ebben a fájlban elhelyezett beállítások felülírják a felhasználói beállításokat.", "emptyFolderSettingsHeader": "Az ebben a fájlban elhelyezett beállítások felülírják a munkaterületre vonatkozó beállításokat.", - "defaultFolderSettingsTitle": "Alapértelmezett mappabeállítások", - "defaultSettingsTitle": "Alapértelmezett beállítások", "editTtile": "Szerkesztés", "replaceDefaultValue": "Csere a beállításokban", "copyDefaultValue": "Másolás a beállításokba", diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 1da42b0222af..ef9a96afe7b5 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Próbálja ki a fuzzy keresést!", + "defaultSettingsFuzzyPrompt": "Próbálja ki a természetes nyelvi keresést!", "defaultSettings": "A jobb oldalon lévő szerkesztőablakban elhelyezett beállítások felülírják az alapértelmezett beállításokat.", "noSettingsFound": "Beállítás nem található.", - "folderSettingsDetails": "Mappabeállítások", - "enableFuzzySearch": "Kísérleti fuzzy keresés engedélyezése" + "settingsSwitcherBarAriaLabel": "Beállításkapcsoló", + "userSettings": "Felhasználói beállítások", + "workspaceSettings": "Munkaterület-beállítások", + "folderSettings": "Mappabeálíltások", + "enableFuzzySearch": "Természetes nyelvi keresés engedélyezése" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..b2ceafc3869a --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Alapértelmezett beállításszerkesztő", + "keybindingsEditor": "Billentyűparancs-szerkesztő", + "preferences": "Beállítások" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json b/i18n/hun/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json index 949b0eb4dcf7..5792eefef534 100644 --- a/i18n/hun/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showTriggerActions": "Minden parancs megjelenítése", + "showTriggerActions": "Összes parancs megjelenítése", "clearCommandHistory": "Parancselőzmények törlése", "showCommands.label": "Parancskatalógus...", "entryAriaLabelWithKey": "{0}, {1}, parancsok", diff --git a/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 023886324b75..821a91e9b573 100644 --- a/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Verziókezelő rendszerek", "hideRepository": "Elrejtés", - "commitMessage": "Üzenet (nyomja meg a következőt a commithoz: {0})", "installAdditionalSCMProviders": "További verziókezelő rendszerek telepítése...", "no open repo": "Nincs aktív verziókezelő rendszer.", "source control": "Verziókezelő rendszer", diff --git a/i18n/hun/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/hun/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 63a2c8a4fe8e..37ee1f5cac34 100644 --- a/i18n/hun/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "bemeneti adat", - "useIgnoreFilesDescription": "Ignore-fájlok használata", - "useExcludeSettingsDescription": "Kizárási beállítások használata" + "useExcludesAndIgnoreFilesDescription": "Kizárási beállítások és ignore-fájlok használata" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 4d6c563c176b..e1fb57e6aa62 100644 --- a/i18n/hun/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "A globális minta, amire illesztve lesznek a fájlok elérési útjai. A minta engedélyezéséhez vagy letiltásához állítsa igaz vagy hamis értékre.", "exclude.when": "További ellenőrzés elvégzése az illeszkedő fájlok testvérein. Az illeszkedő fájl nevéhez használja a $(basename) változót!", "useRipgrep": "Meghatározza, hogy a szövegben és fájlokban való kereséshez a ripgrep van-e használva.", - "useIgnoreFilesByDefault": "Meghatározza, hogy a .gitignore és .ignore fájlok alapértelmezés szerint használva legyenek-e egy új munkaterületen a kereséshez.", "useIgnoreFiles": "Meghatározza, hogy a .gitignore és .ignore fájlok használva legyenek-e a kereséshez.", "search.quickOpen.includeSymbols": "Meghatározza, hogy a fájlok gyors megnyitásánál megjelenjenek-e a globális szimbólumkereső találatai.", "search.followSymlinks": "Meghatározza, hogy keresés során követve legyenek-e a szimbolikus linkek." diff --git a/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json index a98705779e94..9f5f0bf4d8bf 100644 --- a/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Előző kizáró keresési minta megjelenítése", "nextSearchTerm": "Következő keresőkifejezés megjelenítése", "previousSearchTerm": "Előző keresőkifejezés megjelenítése", - "focusNextInputBox": "Váltás a következő beviteli mezőre", - "focusPreviousInputBox": "Váltás az előző beviteli mezőre", "showSearchViewlet": "Keresés megjelenítése", "findInFiles": "Keresés a fájlokban", "findInFilesWithSelectedText": "Keresés a fájlokban a kijelölt szöveg alapján", "replaceInFiles": "Csere a fájlokban", "replaceInFilesWithSelectedText": "Csere a fájlokban a kijelölt szöveg alapján", - "findInWorkspace": "Keresés a munkaterületen...", - "findInFolder": "Keresés mappában...", "RefreshAction.label": "Frissítés", - "ClearSearchResultsAction.label": "Keresési eredmények törlése", + "CollapseDeepestExpandedLevelAction.label": "Összes bezárása", + "ClearSearchResultsAction.label": "Törlés", "FocusNextSearchResult.label": "Váltás a következő keresési eredményre", "FocusPreviousSearchResult.label": "Váltás az előző keresési eredményre", "RemoveAction.label": "Elvetés", diff --git a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..e1fb57e6aa62 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Szimbólum megkeresése a munkaterületen...", + "name": "Keresés", + "search": "Keresés", + "view": "Nézet", + "openAnythingHandlerDescription": "Fájl megkeresése", + "openSymbolDescriptionNormal": "Szimbólum megkeresése a munkaterületen", + "searchOutputChannelTitle": "Keresés", + "searchConfigurationTitle": "Keresés", + "exclude": "Globális minták konfigurálása fájlok és mappák keresésből való kizárásához. Örökli az összes globális mintát a fliex.exclude beállításból.", + "exclude.boolean": "A globális minta, amire illesztve lesznek a fájlok elérési útjai. A minta engedélyezéséhez vagy letiltásához állítsa igaz vagy hamis értékre.", + "exclude.when": "További ellenőrzés elvégzése az illeszkedő fájlok testvérein. Az illeszkedő fájl nevéhez használja a $(basename) változót!", + "useRipgrep": "Meghatározza, hogy a szövegben és fájlokban való kereséshez a ripgrep van-e használva.", + "useIgnoreFiles": "Meghatározza, hogy a .gitignore és .ignore fájlok használva legyenek-e a kereséshez.", + "search.quickOpen.includeSymbols": "Meghatározza, hogy a fájlok gyors megnyitásánál megjelenjenek-e a globális szimbólumkereső találatai.", + "search.followSymlinks": "Meghatározza, hogy keresés során követve legyenek-e a szimbolikus linkek." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/hun/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..3f73a581190c --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "Keresés mappában...", + "findInWorkspace": "Keresés a munkaterületen..." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index ad07b544ef3c..314fee22b0ff 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "Feladatok", "ConfigureTaskRunnerAction.label": "Feladat beállítása", - "ConfigureBuildTaskAction.label": "Buildelési feladat beállítása", "CloseMessageAction.label": "Bezárás", - "ShowTerminalAction.label": "Terminál megtekintése", "problems": "Problémák", + "building": "Buildelés...", "manyMarkers": "99+", "runningTasks": "Futó feladatok megjelenítése", "tasks": "Feladatok", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "Nincs futtatandó feladat. Feladatok konfigurálása...", "TaskService.fetchingBuildTasks": "Buildelési feladatok lekérése...", "TaskService.pickBuildTask": "Válassza ki a futtatandó buildelési feladatot!", - "TaskService.noBuildTask": "Nincs futtatandó buildelési feladat. Feladatok konfigurálása...", + "TaskService.noBuildTask": "Nincs futtatandó buildelési feladat. Buildelési feladatok konfigurálása...", "TaskService.fetchingTestTasks": "Tesztelési feladatok lekérése...", "TaskService.pickTestTask": "Válassza ki a futtatandó tesztelési feladatot", "TaskService.noTestTaskTerminal": "Nincs futtatandó tesztelési feladat. Feladatok konfigurálása...", diff --git a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 496170af36e0..24cb8d6017c7 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "Ismeretlen hiba történt a feladat végrehajtása közben. Részletek a feladat kimeneti naplójában találhatók.", "dependencyFailed": "Nem sikerült feloldani a(z) '{0}' függő feladatot a(z) '{1}' munkaterületi mappában", "TerminalTaskSystem.terminalName": "Feladat – {0}", + "closeTerminal": "A folytatáshoz nyomjon meg egy billentyűt.", "reuseTerminal": "A terminál újra lesz hasznosítva a feladatok által. Nyomjon meg egy billentyűt a bezáráshoz.", "TerminalTaskSystem": "Rendszerparancsok nem hajthatók végre UNC-meghajtókon.", "unkownProblemMatcher": "A(z) {0} problémaillesztő nem található. Az illesztő figyelmen kívül lesz hagyva." diff --git a/i18n/hun/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 45e04c9c1fca..2bca27a1d0d2 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,8 @@ "ConfigurationParser.noTypeDefinition": "Hiba: nincs '{0}' azonosítójú feladattípus regisztrálva. Elfelejtett telepíteni egy kiegészítőt, ami a feladat szolgáltatásáért felelős?", "ConfigurationParser.missingRequiredProperty": "Hiba: a(z) '{0}' feladatkonfigurációból hiányzik a kötelező '{1}' tulajdonság. A feladatkonfiguráció figyelmen kívül lesz hagyva.", "ConfigurationParser.notCustom": "Hiba: a feladat nem egyedi feladatként van definiálva. A konfiguráció figyelmen kívül lesz hagyva.\n{0}\n", - "ConfigurationParser.noTaskName": "Hiba: a feladathoz meg kell adni a taskName tulajdonságot. A feladat figyelmen kívül lesz hagyva.\n{0}\n", - "taskConfiguration.shellArgs": "Figyelmeztetés: a(z) '{0}' feladat egy rendszerparancs, és vagy a parancs nevében vagy az argumentumok egyikében escape nélküli szóköz található. A megfelelő idézőjelezés érdekében olvassza bele az argumentumokat a parancsba.", + "ConfigurationParser.noTaskName": "Hiba: a feladatnak rendelkeznie kell adni taskName tulajdonsággal. A feladat figyelmen kívül lesz hagyva.\n{0}\n", + "taskConfiguration.shellArgs": "Figyelmeztetés: a(z) '{0}' feladat egy rendszerparancs, és az argumentumok egyikében escape-elés nélküli szóköz található. A megfelelő idézőjelezés érdekében olvassza bele az argumentumokat a parancsba.", "taskConfiguration.noCommandOrDependsOn": "Hiba: a(z) '{0}' feladat nem ad meg parancsot, és nem definiálja a dependsOn tulajdonságot sem. A feladat figyelmen kívül lesz hagyva. A definíciója:\n{1}", "taskConfiguration.noCommand": "Hiba: a(z) '{0}' feladathoz nincs definiálva a parancs. A feladat figyelmen kívül lesz hagyva. A definíciója:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "A feladatok 2.0.0-s verziója nem támogatja a globális, operációs rendszer-specifikus feladatokat. Alakítsa át őket operációs rendszer-specifikus parancsot tartalmazó feladattá. Az érintett feladatok:\n{0}" diff --git a/i18n/hun/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index d2b84accaac6..851dfd973f4a 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, terminálválasztó", "termCreateEntryAriaLabel": "{0}, új terminál létrehozása", - "'workbench.action.terminal.newplus": "$(plus) Új integrált terminál létrehozása", + "workbench.action.terminal.newplus": "$(plus) Új integrált terminál létrehozása", "noTerminalsMatching": "Nincs ilyen terminál", "noTerminalsFound": "Nincs megnyitott terminál" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 9abe5fcaf6f0..4d4b7d5d7cf9 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,7 @@ "terminal.integrated.rightClickCopyPaste": "Ha be van állítva, megakadályozza a helyi menü megjelenését a terminálon történő jobb kattintás esetén. Helyette másol, ha van kijelölés, és beilleszt, ha nincs.", "terminal.integrated.fontFamily": "Meghatározza a terminál betűtípusát. Alapértelmezett értéke az editor.fontFamily értéke.", "terminal.integrated.fontSize": "Meghatározza a terminálban használt betű méretét, pixelekben.", - "terminal.integrated.lineHeight": "Meghatározza a sormagasságot a terminálban. A tényleges méret a megadott szám és a terminál betűméretének szorzatából jön ki.", + "terminal.integrated.lineHeight": "Meghatározza a terminál sormagasságát. A tényleges méret a megadott szám és a terminál betűméretének szorzatából jön ki.", "terminal.integrated.enableBold": "Engedélyezve van-e a félkövér szöveg a terminálban. A működéshez szükséges, hogy a terminál shell támogassa a félkövér betűket.", "terminal.integrated.cursorBlinking": "Meghatározza, hogy a terminál kurzora villog-e.", "terminal.integrated.cursorStyle": "Meghatározza a terminál kurzorának stílusát.", diff --git a/i18n/hun/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index e8ad512ade14..b4c839776a99 100644 --- a/i18n/hun/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,14 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "Színtéma", + "themes.category.light": "világos témák", + "themes.category.dark": "sötét témák", "installColorThemes": "További színtémák telepítése...", "themes.selectTheme": "Válasszon színtémát! (Előnézet a fel/le billentyűvel.)", "selectIconTheme.label": "Fájlikontéma", - "installIconThemes": "További fájlikontémák telepítése...", "noIconThemeLabel": "Nincs", "noIconThemeDesc": "Fájlikonok letiltása", - "problemChangingIconTheme": "Hiba történt az ikontéma beállítása közben: {0}", + "installIconThemes": "További fájlikontémák telepítése...", "themes.selectIconTheme": "Válasszon fájlikontémát!", "generateColorTheme.label": "Színtéma generálása az aktuális beállítások alapján", "preferences": "Beállítások", diff --git a/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json index f6ca0fc99347..96a92bfb530d 100644 --- a/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "watermark.showCommands": "Minden parancs megjelenítése", + "watermark.showCommands": "Összes parancs megjelenítése ", "watermark.quickOpen": "Fájl megkeresése", "watermark.openFile": "Fájl megnyitása", "watermark.openFolder": "Mappa megnyitása", diff --git a/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 209303272b75..02c79dcdff83 100644 --- a/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Ablakspecifikus beállítás, ami konfigurálható a felhasználói vagy munkaterületi beállításokban.", "scope.resource.description": "Erőforrásspecifikus beállítás, ami beállítható a felhasználói, munkaterületi és mappaszintű beállításokban.", "scope.description": "A hatókör, amire a beállítás vonatkozik. Az elérhető hatókörök: `window` és `resource`.", + "vscode.extension.contributes.defaultConfiguration": "Adott nyelvre vonatkozóan szerkesztőbeállításokat szolgáltat.", "vscode.extension.contributes.configuration": "Konfigurációs beállításokat szolgáltat.", "invalid.title": "a 'configuration.title' értékét karakterláncként kell megadni", - "vscode.extension.contributes.defaultConfiguration": "Adott nyelvre vonatkozóan szerkesztőbeállításokat szolgáltat.", "invalid.properties": "A 'configuration.properties' értékét egy objektumként kell megadni", "invalid.allOf": "A 'configuration.allOf' elavult, és használata nem javasolt. Helyette több konfigurációs szakaszt kell átadni tömbként a 'configuration' értékeként.", "workspaceConfig.folders.description": "A munkaterületre betöltött mappák listája.", diff --git a/i18n/hun/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/hun/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..afdabd01421b --- /dev/null +++ b/i18n/hun/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetria", + "telemetry.enableCrashReporting": "Összeomlási jelentések küldésének engedélyezése a Microsofthoz.\nA beállítás érvénybe lépéséhez újraindítás szükséges." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/hun/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 55c4947973b0..ccdbb2f20bcd 100644 --- a/i18n/hun/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "bubbleTitle": "kiemelt elemeket tartalmaz" + "bubbleTitle": "Kiemelt elemeket tartalmaz" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/hun/src/vs/workbench/services/files/node/fileService.i18n.json index 5dbccfabb8d6..91ce4d8f7507 100644 --- a/i18n/hun/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "A fájl egy könyvtár", "fileNotModifiedError": "A fájl azóta nem módosult", "fileTooLargeError": "A fájl túl nagy a megnyitáshoz", - "fileBinaryError": "A fájl binárisnak tűnik és nem nyitható meg szövegként", "fileNotFoundError": "Fájl nem található ({0})", + "fileBinaryError": "A fájl binárisnak tűnik és nem nyitható meg szövegként", "fileExists": "A létrehozandó fájl már létezik ({0})", "fileMoveConflict": "Nem lehet áthelyezni vagy másolni. A fájl már létezik a célhelyen.", "unableToMoveCopyError": "Nem lehet áthelyezni vagy másolni. A fájl felülírná a mappát, amiben található.", diff --git a/i18n/hun/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/hun/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index df3dd16f4631..6928f2f1935e 100644 --- a/i18n/hun/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -22,5 +22,5 @@ "keybindings.json.when": "A billentyűparancs aktiválási feltétele.", "keybindings.json.args": "A végrehajtandó parancs számára átadott argumentumok", "keyboardConfigurationTitle": "Billentyűzet", - "dispatch": "Meghatározza, hogy a billentyűleütések észleléséhez a `keydown.code` (ajánlott) vagy `keydown.keyCode` esemény legyen használva." + "dispatch": "Meghatározza, hogy a billentyűleütések észleléséhez a `code` (ajánlott) vagy `keyCode` esemény legyen használva." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/hun/src/vs/workbench/services/textfile/common/textFileService.i18n.json index 53a5c4f1246c..ce232b1ad255 100644 --- a/i18n/hun/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "files.backup.failSave": "A fájlokról nem sikerült biztonsági másolatot készíteni (Hiba: {0}). Próbálja meg menteni a fájlokat a kilépéshez." + "files.backup.failSave": "A módosított fájlokat nem sikerült kiírni a biztonsági mentéseket tartalmazó tárhelyre (Hiba: {0}). Próbálja meg menteni a fájlokat, majd lépjen ki!" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/hun/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index f65a2da76bc9..d67776bc4335 100644 --- a/i18n/hun/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "Új témabeállítások lettek hozzáadva a felhasználói beállításokhoz. Biztonsági mentés a következő helyen érhető el: {0}.", "error.cannotloadtheme": "Nem sikerült betölteni a(z) '{0}' témát: {1}.", - "error.cannotloadicontheme": "Nem sikerült megnyitni a(z) '{0}' témát", "colorTheme": "Meghatározza a munkaterületen használt színtémát.", "colorThemeError": "A téma ismeretlen vagy nincs telepítve.", "iconTheme": "Meghatározza a munkaterületen használt ikontémát. 'null' érték esetén nem jelenik meg egyetlen fájlikon sem.", diff --git a/i18n/ita/extensions/git/out/autofetch.i18n.json b/i18n/ita/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..93fbf7a8a395 --- /dev/null +++ b/i18n/ita/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Sì", + "no": "No" +} \ No newline at end of file diff --git a/i18n/ita/extensions/git/out/commands.i18n.json b/i18n/ita/extensions/git/out/commands.i18n.json index 09e5850f8cd8..3d1d3e71eaee 100644 --- a/i18n/ita/extensions/git/out/commands.i18n.json +++ b/i18n/ita/extensions/git/out/commands.i18n.json @@ -9,6 +9,8 @@ "create branch": "$(plus) Crea nuovo branch", "repourl": "URL del repository", "parent": "Directory padre", + "cancel": "$(sync~spin) Clonazione di repository in corso... Clicca per annullare", + "cancel tooltip": "Annulla l'operazione di clonazione", "cloning": "Clonazione del repository GIT...", "openrepo": "Apri repository", "proposeopen": "Aprire il repository clonato?", @@ -49,6 +51,8 @@ "select branch to delete": "Seleziona un ramo da cancellare", "confirm force delete branch": "Il merge del ramo '{0}' non è completo. Elimina comunque?", "delete branch": "Elimina ramo", + "invalid branch name": "Nome di branch non valido", + "branch already exists": "La branch denominata '{0}' esiste già", "select a branch to merge from": "Selezionare un ramo da cui eseguire il merge", "merge conflicts": "Ci sono conflitti di merge. Risolverli prima di eseguire commit.", "tag name": "Nome del tag", @@ -71,7 +75,6 @@ "no stashes": "Non ci sono accantonamenti da ripristinare.", "pick stash to pop": "Scegli un accantonamento da prelevare", "clean repo": "Pulire l'albero di lavoro del repository prima dell'estrazione.", - "cant push": "Impossibile effettuare il push in remoto. Effettua prima un 'pull' per integrare le tue modifiche.", "git error details": "GIT: {0}", "git error": "Errore GIT", "open git log": "Apri log GIT" diff --git a/i18n/ita/extensions/git/out/main.i18n.json b/i18n/ita/extensions/git/out/main.i18n.json index b29ecda1f340..7fc7257ad8ee 100644 --- a/i18n/ita/extensions/git/out/main.i18n.json +++ b/i18n/ita/extensions/git/out/main.i18n.json @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Ricerca di git in: {0}", "using git": "Uso di GIT {0} da {1}", - "updateGit": "Aggiorna GIT", "neverShowAgain": "Non visualizzare più questo messaggio", + "updateGit": "Aggiorna GIT", "git20": "La versione installata di GIT è la {0}. Per il corretto funzionamento di Code è consigliabile usare una versione di GIT non inferiore alla 2." } \ No newline at end of file diff --git a/i18n/ita/extensions/git/out/repository.i18n.json b/i18n/ita/extensions/git/out/repository.i18n.json index 0b2210016a05..b6420fa4c980 100644 --- a/i18n/ita/extensions/git/out/repository.i18n.json +++ b/i18n/ita/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Eliminato da noi", "both added": "Entrambi aggiunti", "both modified": "Entrambi modificati", + "commitMessage": "Message (press {0} to commit)", "commit": "Esegui commit", "merge changes": "Esegui merge delle modifiche", "staged changes": "Modifiche preparate per il commit", diff --git a/i18n/ita/extensions/git/package.i18n.json b/i18n/ita/extensions/git/package.i18n.json index 7fe36b9539a8..4c23aba5a2e3 100644 --- a/i18n/ita/extensions/git/package.i18n.json +++ b/i18n/ita/extensions/git/package.i18n.json @@ -33,6 +33,7 @@ "command.checkout": "Estrai in...", "command.branch": "Crea ramo...", "command.deleteBranch": "Elimina ramo...", + "command.renameBranch": "Rinomina Branch...", "command.merge": "Merge ramo...", "command.createTag": "Crea tag", "command.pull": "Esegui pull", @@ -42,9 +43,11 @@ "command.pushTo": "Esegui push in...", "command.pushWithTags": "Esegui push con tag", "command.sync": "Sincronizza", + "command.syncRebase": "Sincronizza (Rebase)", "command.publish": "Pubblica ramo", "command.showOutput": "Mostra output GIT", "command.ignore": "Aggiungi file a .gitignore", + "command.stashIncludeUntracked": "Stash (includi non tracciate)", "command.stash": "Accantona", "command.stashPop": "Preleva accantonamento...", "command.stashPopLatest": "Preleva accantonamento più recente", diff --git a/i18n/ita/extensions/markdown/out/commands.i18n.json b/i18n/ita/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..2448cc1f0e07 --- /dev/null +++ b/i18n/ita/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "onPreviewStyleLoadError": "Impossibile caricare 'markdown.styles': {0}" +} \ No newline at end of file diff --git a/i18n/ita/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/ita/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..9207358bc4d4 --- /dev/null +++ b/i18n/ita/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Alcuni contenuti sono stati disabilitati in questo documento", + "preview.securityMessage.title": "Contenuti potenzialmente non sicuri sono stati disattivati nell'anteprima del Markdown. Modificare l'impostazione di protezione dell'anteprima del Markdown per consentire la visualizzazione di contenuto insicuro o abilitare gli script", + "preview.securityMessage.label": "Avviso di sicurezza contenuto disabilitato" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/package.i18n.json b/i18n/ita/extensions/typescript/package.i18n.json index 54540ff71f90..6d92cc735320 100644 --- a/i18n/ita/extensions/typescript/package.i18n.json +++ b/i18n/ita/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "Apri il log del server TypeScript", "typescript.restartTsServer": "Riavvia server TS", "typescript.selectTypeScriptVersion.title": "Seleziona la versione di TypeScript", + "typescript.reportStyleChecksAsWarnings": "Evidenzia i controlli di stile come warning", "jsDocCompletion.enabled": "Abilita/Disabilita commenti automatici JSDoc", "javascript.implicitProjectConfig.checkJs": "Abilita/disabilita il controllo semantico di file JavaScript. File jsconfig.json o tsconfig.json esistenti sovrascrivono su questa impostazione. Richiede TypeScript >= 2.3.1.", "typescript.npm": "Specifica il percorso dell'eseguibile NPM utilizzato per l'acquisizione automatica delle definizioni di tipi. Richiede TypeScript >= 2.3.4.", diff --git a/i18n/ita/src/vs/base/common/errorMessage.i18n.json b/i18n/ita/src/vs/base/common/errorMessage.i18n.json index 820510827291..606ed71c6b42 100644 --- a/i18n/ita/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/ita/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. Codice errore: {1}", - "error.permission.verbose": "Autorizzazione negata (HTTP {0})", - "error.permission": "Autorizzazione negata", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Errore di connessione sconosciuto ({0})", - "error.connection.unknown": "Si è verificato un errore di connessione sconosciuto. La connessione a Internet è stata interrotta oppure il server al quale si è connessi è offline.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "Si è verificato un errore sconosciuto. Per altri dettagli, vedere il log.", "nodeExceptionMessage": "Si è verificato un errore di sistema ({0})", diff --git a/i18n/ita/src/vs/code/electron-main/main.i18n.json b/i18n/ita/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..90fdc6f7bc0f --- /dev/null +++ b/i18n/ita/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "&&Chiudi" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-main/menus.i18n.json b/i18n/ita/src/vs/code/electron-main/menus.i18n.json index 17fd875af6f3..d476d47bdc57 100644 --- a/i18n/ita/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,11 @@ "miQuit": "Chiudi {0}", "miNewFile": "&&Nuovo file", "miOpen": "&&Apri...", - "miOpenWorkspace": "&&Apri area di lavoro...", + "miOpenWorkspace": "Aprire Wor&&kspace...", "miOpenFolder": "Apri &&cartella...", "miOpenFile": "&&Apri file...", "miOpenRecent": "Apri &&recenti", - "miSaveWorkspaceAs": "&&Salva area di lavoro con nome...", - "miAddFolderToWorkspace": "&&Aggiungi cartella all'area di lavoro...", + "miAddFolderToWorkspace": "A&&ggiungere cartella all'area di lavoro...", "miSave": "&&Salva", "miSaveAs": "Salva con nome...", "miSaveAll": "Salva &&tutto", @@ -157,7 +156,6 @@ "mMergeAllWindows": "Unisci tutte le finestre", "miToggleDevTools": "&&Attiva/Disattiva strumenti di sviluppo", "miAccessibilityOptions": "&&Opzioni accessibilità", - "miReportIssues": "&&Segnala problemi", "miWelcome": "&&Benvenuti", "miInteractivePlayground": "Playground &&interattivo", "miDocumentation": "&&Documentazione", @@ -184,6 +182,6 @@ "miDownloadingUpdate": "Download dell'aggiornamento...", "miInstallingUpdate": "Installazione dell'aggiornamento...", "miCheckForUpdates": "Verifica disponibilità aggiornamenti...", - "aboutDetail": "\nVersione {0}\nCommit {1}\nData {2}\nShell {3}\nRenderer {4}\nNodo {5}\nArchitettura {6}", - "okButton": "OK" + "okButton": "OK", + "copy": "&&Copia" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/ita/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..10ea73bb963c --- /dev/null +++ b/i18n/ita/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Nel frattempo questi file sono stati modificati: {0}", + "summary.0": "Non sono state effettuate modifiche", + "summary.nm": "Effettuate {0} modifiche al testo in {1} file", + "summary.n0": "Effettuate {0} modifiche al testo in un file" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index 0b12d0bdf2d3..1c04d1c06aef 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,14 @@ "fontSize": "Controlla le dimensioni del carattere in pixel.", "lineHeight": "Controlla l'altezza della riga. Usare 0 per calcolare l'altezza della riga dalle dimensioni del carattere.", "letterSpacing": "Controlla la spaziatura tra le lettere in pixel.", - "lineNumbers": "Consente di controllare la visualizzazione dei numeri di riga. I valori possibili sono 'on', 'off' e 'relative'. Con 'relative' viene visualizzato il conteggio delle righe a partire dalla posizione corrente del cursore.", + "lineNumbers.off": "I numeri di riga non vengono visualizzati.", + "lineNumbers.on": "I numeri di riga vengono visualizzati come numeri assoluti.", + "lineNumbers.relative": "I numeri di riga vengono visualizzati come distanza in linee alla posizione del cursore.", + "lineNumbers.interval": "I numeri di riga vengono visualizzati ogni 10 righe.", + "lineNumbers": "Controlla la visualizzazione dei numeri di riga. I valori possibili sono 'on', 'off' e 'relativi'.", "rulers": "Mostra righelli verticali dopo un certo numero di caratteri a spaziatura fissa. Utilizza più valori per più righelli. Nessun righello viene disegnati se la matrice è vuota", "wordSeparators": "Caratteri che verranno usati come separatori di parola quando si eseguono operazioni o spostamenti correlati a parole", - "tabSize": "Numero di spazi a cui equivale una tabulazione. Quando `editor.detectIndentation` è attivo, questa impostazione viene sostituita in base al contenuto del file.", "tabSize.errorMessage": "È previsto 'number'. Nota: il valore \"auto\" è stato sostituito dall'impostazione `editor.detectIndentation`.", - "insertSpaces": "Inserisce spazi quando viene premuto TAB. Quando `editor.detectIndentation` è attivo, questa impostazione viene sostituita in base al contenuto del file.", "insertSpaces.errorMessage": "È previsto 'boolean'. Nota: il valore \"auto\" è stato sostituito dall'impostazione `editor.detectIndentation`.", "detectIndentation": "All'apertura di un file, `editor.tabSize` e `editor.insertSpaces` verranno rilevati in base al contenuto del file.", "roundedSelection": "Controlla se gli angoli delle selezioni sono arrotondati", @@ -89,8 +91,8 @@ "links": "Controlla se l'editor deve individuare i collegamenti e renderli cliccabili", "colorDecorators": "Controlla se l'editor deve eseguire il rendering del selettore di colore e degli elementi Decorator di tipo colore inline.", "codeActions": "Abilita il codice azione lightbulb", + "selectionClipboard": "Controlla se gli appunti primari di Linux devono essere supportati.", "sideBySide": "Controlla se l'editor diff mostra le differenze affiancate o incorporate", "ignoreTrimWhitespace": "Controlla se l'editor diff mostra come differenze le modifiche relative a spazi vuoti iniziali e finali", - "renderIndicators": "Consente di controllare se l'editor diff mostra gli indicatori +/- per le modifiche aggiunte/rimosse", - "selectionClipboard": "Controlla se gli appunti primari di Linux devono essere supportati." + "renderIndicators": "Consente di controllare se l'editor diff mostra gli indicatori +/- per le modifiche aggiunte/rimosse" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/ita/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..2e610be7babb --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Vai alla parentesi" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/ita/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..6b90ea0ccd25 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Sposta il punto di inserimento a sinistra", + "caret.moveRight": "Sposta il punto di inserimento a destra" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/ita/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..7e7a9ec35254 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Trasponi lettere" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/ita/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..b99c88a4ae14 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Taglia", + "actions.clipboard.copyLabel": "Copia", + "actions.clipboard.pasteLabel": "Incolla", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Copia con evidenziazione sintassi" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/ita/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..846cfb504433 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Attiva/Disattiva commento per la riga", + "comment.line.add": "Aggiungi commento per la riga", + "comment.line.remove": "Rimuovi commento per la riga", + "comment.block": "Attiva/Disattiva commento per il blocco" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/ita/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..fc0acd1195a9 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Mostra il menu di scelta rapida editor" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json b/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..753c08a072ab --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Trova", + "findNextMatchAction": "Trova successivo", + "findPreviousMatchAction": "Trova precedente", + "nextSelectionMatchFindAction": "Trova selezione successiva", + "previousSelectionMatchFindAction": "Trova selezione precedente", + "startReplace": "Sostituisci", + "showNextFindTermAction": "Mostra il termine di ricerca successivo", + "showPreviousFindTermAction": "Mostra il termine di ricerca precedente" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..f8b42e279766 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Trova", + "placeholder.find": "Trova", + "label.previousMatchButton": "Risultato precedente", + "label.nextMatchButton": "Risultato successivo", + "label.toggleSelectionFind": "Trova nella selezione", + "label.closeButton": "Chiudi", + "label.replace": "Sostituisci", + "placeholder.replace": "Sostituisci", + "label.replaceButton": "Sostituisci", + "label.replaceAllButton": "Sostituisci tutto", + "label.toggleReplaceButton": "Attiva/Disattiva modalità sostituzione", + "title.matchesCountLimit": "Solo i primi {0} risultati vengono evidenziati, ma tutte le operazioni di ricerca funzionano su tutto il testo.", + "label.matchesLocation": "{0} di {1}", + "label.noResults": "Nessun risultato" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..a930fde7ffb7 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Trova", + "placeholder.find": "Trova", + "label.previousMatchButton": "Risultato precedente", + "label.nextMatchButton": "Risultato successivo", + "label.closeButton": "Chiudi" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/ita/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..cebd48ad3bd5 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Espandi", + "unFoldRecursivelyAction.label": "Espandi in modo ricorsivo", + "foldAction.label": "Riduci", + "foldRecursivelyAction.label": "Riduci in modo ricorsivo", + "foldAllAction.label": "Riduci tutto", + "unfoldAllAction.label": "Espandi tutto", + "foldLevelAction.label": "Livello riduzione {0}" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..1232d4a3bb36 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "È stata apportata 1 modifica di formattazione a riga {0}", + "hintn1": "Sono state apportate {0} modifiche di formattazione a riga {1}", + "hint1n": "È stata apportata 1 modifica di formattazione tra le righe {0} e {1}", + "hintnn": "Sono state apportate {0} modifiche di formattazione tra le righe {1} e {2}", + "no.provider": "Ci dispiace, ma non c'è alcun formattatore per i file '{0}' installati.", + "formatDocument.label": "Formatta documento", + "formatSelection.label": "Formatta selezione" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..9df481ec1b5e --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Non è stata trovata alcuna definizione per '{0}'", + "generic.noResults": "Non è stata trovata alcuna definizione", + "meta.title": " - Definizioni di {0}", + "actions.goToDecl.label": "Vai alla definizione", + "actions.goToDeclToSide.label": "Apri definizione lateralmente", + "actions.previewDecl.label": "Visualizza la definizione", + "goToImplementation.noResultWord": "Non sono state trovate implementazioni per '{0}'", + "goToImplementation.generic.noResults": "Non sono state trovate implementazioni", + "meta.implementations.title": "- {0} implementazioni", + "actions.goToImplementation.label": "Vai all'implementazione", + "actions.peekImplementation.label": "Anteprima implementazione", + "goToTypeDefinition.noResultWord": "Non sono state trovate definizioni di tipi per '{0}'", + "goToTypeDefinition.generic.noResults": "Non sono state trovate definizioni di tipi", + "meta.typeDefinitions.title": " - {0} definizioni di tipo", + "actions.goToTypeDefinition.label": "Vai alla definizione di tipo", + "actions.peekTypeDefinition.label": "Anteprima definizione di tipo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..fa526a1f9e6c --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Fare clic per visualizzare {0} definizioni." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..2d24c4f96eaf --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Vai a errore o avviso successivo", + "markerAction.previous.label": "Vai a errore o avviso precedente", + "editorMarkerNavigationError": "Colore per gli errori del widget di spostamento tra marcatori dell'editor.", + "editorMarkerNavigationWarning": "Colore per gli avvisi del widget di spostamento tra marcatori dell'editor.", + "editorMarkerNavigationInfo": "Colore delle informazioni del widget di navigazione marcatori dell'editor.", + "editorMarkerNavigationBackground": "Sfondo del widget di spostamento tra marcatori dell'editor." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/ita/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..385b42e52905 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Visualizza passaggio del mouse" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/ita/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..607247a8c493 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Caricamento..." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/ita/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..ce39cfca3134 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Sostituisci con il valore precedente", + "InPlaceReplaceAction.next.label": "Sostituisci con il valore successivo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..2617ceedc290 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Converti rientro in spazi", + "indentationToTabs": "Converti rientro in tabulazioni", + "configuredTabSize": "Dimensione tabulazione configurata", + "selectTabWidth": "Seleziona dimensione tabulazione per il file corrente", + "indentUsingTabs": "Imposta rientro con tabulazioni", + "indentUsingSpaces": "Imposta rientro con spazi", + "detectIndentation": "Rileva rientro dal contenuto", + "editor.reindentlines": "Imposta nuovo rientro per righe" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/ita/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..6f27a9a47e0a --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Copia la riga in alto", + "lines.copyDown": "Copia la riga in basso", + "lines.moveUp": "Sposta la riga in alto", + "lines.moveDown": "Sposta la riga in basso", + "lines.sortAscending": "Ordinamento righe crescente", + "lines.sortDescending": "Ordinamento righe decrescente", + "lines.trimTrailingWhitespace": "Taglia spazio vuoto finale", + "lines.delete": "Elimina la riga", + "lines.indent": "Imposta un rientro per la riga", + "lines.outdent": "Riduci il rientro per la riga", + "lines.insertBefore": "Inserisci la riga sopra", + "lines.insertAfter": "Inserisci la riga sotto", + "lines.deleteAllLeft": "Elimina tutto a sinistra", + "lines.deleteAllRight": "Elimina tutto a destra", + "lines.joinLines": "Unisci righe", + "editor.transpose": "Trasponi caratteri intorno al cursore", + "editor.transformToUppercase": "Converti in maiuscolo", + "editor.transformToLowercase": "Converti in minuscolo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/links/links.i18n.json b/i18n/ita/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..bb29675d5062 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Cmd + clic per seguire il collegamento", + "links.navigate": "CTRL + clic per seguire il collegamento", + "links.command.mac": "Cmd + click per eseguire il comando", + "links.command": "Ctrl + clic per eseguire il comando", + "links.navigate.al": "Alt + clic per seguire il collegamento", + "links.command.al": "Alt + clic per eseguire il comando", + "invalid.url": "Non è stato possibile aprire questo collegamento perché il formato non è valido: {0}", + "missing.url": "Non è stato possibile aprire questo collegamento perché manca la destinazione.", + "label": "Apri il collegamento" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/ita/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..af2b081d4538 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Aggiungi cursore sopra", + "mutlicursor.insertBelow": "Aggiungi cursore sotto", + "mutlicursor.insertAtEndOfEachLineSelected": "Aggiungi cursore alla fine delle righe", + "addSelectionToNextFindMatch": "Aggiungi selezione a risultato ricerca successivo", + "addSelectionToPreviousFindMatch": "Aggiungi selezione a risultato ricerca precedente", + "moveSelectionToNextFindMatch": "Sposta ultima selezione a risultato ricerca successivo", + "moveSelectionToPreviousFindMatch": "Sposta ultima selezione a risultato ricerca precedente", + "selectAllOccurrencesOfFindMatch": "Seleziona tutte le occorrenze del risultato ricerca", + "changeAll.label": "Cambia tutte le occorrenze" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/ita/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..27a96b2c54f3 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Attiva i suggerimenti per i parametri" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..f5613ad126f3 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, suggerimento" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/ita/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..29a73e519d03 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Mostra correzioni ({0})", + "quickFix": "Mostra correzioni", + "quickfix.trigger.label": "Correzione rapida" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..fe8e7a6d6535 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Chiudi" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..a9e04aae3bbc --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " - Riferimenti di {0}", + "references.action.label": "Trova tutti i riferimenti" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..af8f531bdc2c --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Caricamento..." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..d9f668ac458c --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "simbolo in {0} alla riga {1} colonna {2}", + "aria.fileReferences.1": "1 simbolo in {0}, percorso completo {1}", + "aria.fileReferences.N": "{0} simboli in {1}, percorso completo {2}", + "aria.result.0": "Non sono stati trovati risultati", + "aria.result.1": "Trovato 1 simbolo in {0}", + "aria.result.n1": "Trovati {0} simboli in {1}", + "aria.result.nm": "Trovati {0} simboli in {1} file" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..1b3c14ffa2f4 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Non è stato possibile risolvere il file.", + "referencesCount": "{0} riferimenti", + "referenceCount": "{0} riferimento", + "missingPreviewMessage": "anteprima non disponibile", + "treeAriaLabel": "Riferimenti", + "noResults": "Nessun risultato", + "peekView.alternateTitle": "Riferimenti", + "peekViewTitleBackground": "Colore di sfondo dell'area del titolo della visualizzazione rapida.", + "peekViewTitleForeground": "Colore del titolo della visualizzazione rapida.", + "peekViewTitleInfoForeground": "Colore delle informazioni del titolo della visualizzazione rapida.", + "peekViewBorder": "Colore dei bordi e della freccia della visualizzazione rapida.", + "peekViewResultsBackground": "Colore di sfondo dell'elenco risultati della visualizzazione rapida.", + "peekViewResultsMatchForeground": "Colore primo piano dei nodi riga nell'elenco risultati della visualizzazione rapida.", + "peekViewResultsFileForeground": "Colore primo piano dei nodi file nell'elenco risultati della visualizzazione rapida.", + "peekViewResultsSelectionBackground": "Colore di sfondo della voce selezionata nell'elenco risultati della visualizzazione rapida.", + "peekViewResultsSelectionForeground": "Colore primo piano della voce selezionata nell'elenco risultati della visualizzazione rapida.", + "peekViewEditorBackground": "Colore di sfondo dell'editor di visualizzazioni rapide.", + "peekViewEditorGutterBackground": "Colore di sfondo della barra di navigazione nell'editor visualizzazione rapida.", + "peekViewResultsMatchHighlight": "Colore dell'evidenziazione delle corrispondenze nell'elenco risultati della visualizzazione rapida.", + "peekViewEditorMatchHighlight": "Colore dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/ita/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..c1a735fcca6a --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Nessun risultato.", + "aria": "Correttamente rinominato '{0}' in '{1}'. Sommario: {2}", + "rename.failed": "L'esecuzione dell'operazione di ridenominazione non è riuscita.", + "rename.label": "Rinomina simbolo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/ita/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..8d3c8a03d06b --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Consente di rinominare l'input. Digitare il nuovo nome e premere INVIO per eseguire il commit." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/ita/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..e50cd06027c6 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Espandi SELECT", + "smartSelect.shrink": "Comprimi SELECT" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/ita/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..a68bd5b22dfb --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "L'accettazione di '{0}' ha inserito il seguente testo: {1}", + "suggest.trigger.label": "Attiva suggerimento" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..eb519f2c5dd1 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Colore di sfondo del widget dei suggerimenti.", + "editorSuggestWidgetBorder": "Colore del bordo del widget dei suggerimenti.", + "editorSuggestWidgetForeground": "Colore primo piano del widget dei suggerimenti.", + "editorSuggestWidgetSelectedBackground": "Colore di sfondo della voce selezionata del widget dei suggerimenti.", + "editorSuggestWidgetHighlightForeground": "Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti.", + "readMore": "Altre informazioni...{0}", + "suggestionWithDetailsAriaLabel": "{0}, suggerimento, con dettagli", + "suggestionAriaLabel": "{0}, suggerimento", + "readLess": "Meno informazioni... {0}", + "suggestWidget.loading": "Caricamento...", + "suggestWidget.noSuggestions": "Non ci sono suggerimenti.", + "suggestionAriaAccepted": "{0}, accettato", + "ariaCurrentSuggestionWithDetails": "{0}, suggerimento, con dettagli", + "ariaCurrentSuggestion": "{0}, suggerimento" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/ita/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..3994298789f6 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Attiva/Disattiva l'uso di TAB per spostare lo stato attivo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..d57627a559aa --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Colore di sfondo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile.", + "wordHighlightStrong": "Colore di sfondo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile.", + "overviewRulerWordHighlightForeground": "Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli.", + "overviewRulerWordHighlightStrongForeground": "Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli di accesso in scrittura.", + "wordHighlight.next.label": "Vai al prossimo simbolo evidenziato", + "wordHighlight.previous.label": "Vai al precedente simbolo evidenziato" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/ita/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index 18fcd600d7a3..8b6ad71cd4e6 100644 --- a/i18n/ita/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/ita/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -3,7 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "notFound": "L'estensione non è stata trovata", - "noCompatible": "Non è stata trovata una versione di {0} compatibile con questa versione di Visual Studio Code." -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index e76a4c1b8b19..39a1c28e54ec 100644 --- a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,10 @@ { "invalidManifest": "Estensione non valida: package.json non è un file JSON.", "restartCodeLocal": "Riavviare Code prima di reinstallare {0}.", - "restartCodeGallery": "Si prega di riavviare Code prima di reinstallare.", + "cancel": "Annulla", "uninstallDependeciesConfirmation": "Disinstallare solo '{0}' o anche le relative dipendenze?", "uninstallOnly": "Solo", "uninstallAll": "Tutto", - "cancel": "Annulla", "uninstallConfirmation": "Disinstallare '{0}'?", "ok": "OK", "singleDependentError": "Non è possibile disinstallare l'estensione '{0}'. L'estensione '{1}' dipende da tale estensione.", diff --git a/i18n/ita/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/ita/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..2e88c81fa0df --- /dev/null +++ b/i18n/ita/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "Attiva/disattiva visibilità delle schede", + "view": "Visualizza" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 089f3a4202c4..00de0aab7d64 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Apri editor precedente", "nextEditorInGroup": "Apri editor successivo del gruppo", "openPreviousEditorInGroup": "Apri editor precedente del gruppo", + "lastEditorInGroup": "Apri ultimo editor del gruppo", "navigateNext": "Avanti", "navigatePrevious": "Indietro", "navigateLast": "Vai all'ultima", diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index 6a2e3d36941c..29413ba4c6c2 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,6 @@ { "editorCommand.activeEditorMove.description": "Consente di spostare l'editor attivo per schede o gruppi", "editorCommand.activeEditorMove.arg.name": "Argomento per spostamento editor attivo", - "editorCommand.activeEditorMove.arg.description": "Proprietà degli argomenti:\n\t\t\t\t\t\t* 'to': valore stringa che specifica dove eseguire lo spostamento.\n\t\t\t\t\t\t* 'by': valore stringa che specifica l'unità per lo spostamento, ovvero per scheda o per gruppo.\n\t\t\t\t\t\t* 'value': valore numerico che specifica il numero di posizioni o una posizione assoluta per lo spostamento.\n\t\t\t\t\t", "commandDeprecated": "Il comando **{0}** è stato rimosso. In alternativa, usare **{1}**", "openKeybindings": "Configura tasti di scelta rapida" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index c8ef35020707..77162d4939ab 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "Sì", "screenReaderDetectedExplanation.answerNo": "No", "screenReaderDetectedExplanation.body1": "VS Code è ora ottimizzato per l'utilizzo con un'utilità per la lettura dello schermo.", - "screenReaderDetectedExplanation.body2": "Il comportamento di alcune funzionalità dell'editor sarà diverso, ad esempio a capo automatico, riduzione del codice, chiusura automatica delle parentesi e così via." + "screenReaderDetectedExplanation.body2": "Alcune funzionalità dell'editor avranno un comportamento differente: ad esempio a capo automatico, folding, ecc." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/quickopen.i18n.json b/i18n/ita/src/vs/workbench/browser/quickopen.i18n.json index 4419620dddd1..01c4862b44e7 100644 --- a/i18n/ita/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "Non ci sono risultati corrispondenti", - "noResultsFound2": "Non sono stati trovati risultati", - "entryAriaLabel": "{0}, comando" + "noResultsFound2": "Non sono stati trovati risultati" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json index 4a97354ad492..702864ad03ae 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Apri recenti...", "quickOpenRecent": "Apertura rapida recenti...", "closeMessages": "Chiudi messaggi di notifica", - "reportIssues": "Segnala problemi", + "reportIssueInEnglish": "Segnala problema", "reportPerformanceIssue": "Segnala problema di prestazioni", "keybindingsReference": "Riferimento per tasti di scelta rapida", "openDocumentationUrl": "Documentazione", @@ -47,5 +47,14 @@ "showNextWindowTab": "Visualizza scheda della finestra successiva", "moveWindowTabToNewWindow": "Sposta scheda della finestra in una nuova finestra", "mergeAllWindowTabs": "Unisci tutte le finestre", - "toggleWindowTabsBar": "Attiva/Disattiva barra delle schede delle finestre" + "toggleWindowTabsBar": "Attiva/Disattiva barra delle schede delle finestre", + "configureLocale": "Configura lingua", + "displayLanguage": "Definisce la lingua visualizzata di VSCode.", + "doc": "Per un elenco delle lingue supportate, vedere {0}.", + "restart": "Se si modifica il valore, è necessario riavviare VSCode.", + "fail.createSettings": "Non è possibile creare '{0}' ({1}).", + "debug": "Debug", + "info": "Informazioni", + "warn": "Avviso", + "err": "Errore" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index 527e50d39f69..0f9e509d30ba 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Visualizza", "help": "Guida", "file": "File", - "workspaces": "Aree di lavoro", "developer": "Sviluppatore", + "workspaces": "Aree di lavoro", "showEditorTabs": "Controlla se visualizzare o meno gli editor aperti in schede.", "workbench.editor.labelFormat.default": "Visualizza il nome del file. Quando le schede sono abilitate e due file hanno lo stesso nome in un unico gruppo, vengono aggiunte le sezioni distintive del percorso di ciascun file. Quando le schede sono disabilitate, se l'editor è attivo, viene visualizzato il percorso relativo alla radice dell'area di lavoro.", "workbench.editor.labelFormat.short": "Visualizza il nome del file seguito dal relativo nome di directory.", @@ -26,18 +26,16 @@ "closeOnFocusLost": "Controlla se Quick Open deve essere chiuso automaticamente quando perde lo stato attivo.", "openDefaultSettings": "Controlla se all'apertura delle impostazioni viene aperto anche un editor che mostra tutte le impostazioni predefinite.", "sideBarLocation": "Controlla la posizione della barra laterale. Può essere visualizzata a sinistra o a destra del workbench.", - "panelLocation": "Controlla la posizione del pannello. Può essere visualizzato in basso o a destra del Workbench.", "statusBarVisibility": "Controlla la visibilità della barra di stato nella parte inferiore del workbench.", "activityBarVisibility": "Controlla la visibilità della barra attività nel workbench.", "closeOnFileDelete": "Controlla se gli editor che visualizzano un file devono chiudersi automaticamente quando il file viene eliminato o rinominato da un altro processo. Se si disabilita questa opzione, in una simile circostanza l'editor verrà aperto e i file risulteranno modificati ma non salvati. Nota: se si elimina il file dall'interno dell'applicazione, l'editor verrà sempre chiuso e i file modificati ma non salvati non verranno mai chiusi allo scopo di salvaguardare i dati.", - "experimentalFuzzySearchEndpoint": "Indica l'endpoint da utilizzare per la ricerca di impostazioni sperimentali.", - "experimentalFuzzySearchKey": "Indica la chiave da utilizzare per la ricerca di impostazioni sperimentali.", "fontAliasing": "Controlla il metodo di aliasing dei caratteri nell'area di lavoro.\n- impostazione predefinita: anti-aliasing dei caratteri a livello di sub-pixel. Nella maggior parte delle visualizzazioni non retina consentirà di ottenere un testo con il massimo contrasto.\n- anti-aliasing: anti-aliasing dei caratteri a livello di pixel, invece che a livello di sub-pixel. Consente di visualizzare i caratteri più chiari.\n- nessuno: disabilita l'anti-aliasing dei caratteri. Il testo verrà visualizzato con contorni irregolari.", "workbench.fontAliasing.default": "Anti-aliasing dei caratteri a livello di sub-pixel. Nella maggior parte delle visualizzazioni non retina consentirà di ottenere un testo con il massimo contrasto.", "workbench.fontAliasing.antialiased": "Anti-aliasing dei caratteri a livello di pixel, invece che a livello di sub-pixel. Consente di visualizzare i caratteri più chiari.", "workbench.fontAliasing.none": "Disabilita l'anti-aliasing dei caratteri. Il testo verrà visualizzato con contorni irregolari. ", "swipeToNavigate": "Scorrere orizzontalmente con tre dita per spostarsi tra i file aperti.", "workbenchConfigurationTitle": "Area di lavoro", + "windowConfigurationTitle": "Finestra", "window.openFilesInNewWindow.on": "I file verranno aperti in una nuova finestra", "window.openFilesInNewWindow.off": "I file verranno aperti nella finestra con la cartella dei file aperta o nell'ultima finestra attiva", "window.openFilesInNewWindow.default": "I file verranno aperti nella finestra con la cartella dei file aperta o nell'ultima finestra attiva a meno che non vengano aperti tramite il pannello Dock o da Finder (solo MacOS)", @@ -69,11 +67,11 @@ "autoDetectHighContrast": "Se è abilitata, passa automaticamente a un tema a contrasto elevato se Windows usa un tema di questo tipo e al tipo scuro quando non si usa più un tema a contrasto elevato Windows.", "titleBarStyle": "Consente di modificare l'aspetto della barra del titolo della finestra. Per applicare le modifiche, è necessario un riavvio completo.", "window.nativeTabs": "Abilita le finestre di tab per macOS Sierra. La modifica richiede un riavvio. Eventuali personalizzazioni della barra del titolo verranno disabilitate", - "windowConfigurationTitle": "Finestra", "zenModeConfigurationTitle": "Modalità Zen", "zenMode.fullScreen": "Consente di controllare se attivando la modalità Zen anche l'area di lavoro passa alla modalità schermo intero.", "zenMode.hideTabs": "Controlla se attivando la modalità Zen vengono nascoste anche le schede del workbench.", "zenMode.hideStatusBar": "Controlla se attivando la modalità Zen viene nascosta anche la barra di stato nella parte inferiore del workbench.", "zenMode.hideActivityBar": "Controlla se attivando la modalità Zen viene nascosta anche la barra di stato alla sinistra del workbench", - "zenMode.restore": "Controlla se una finestra deve essere ripristinata nella modalità Zen se è stata chiusa in questa modalità." + "zenMode.restore": "Controlla se una finestra deve essere ripristinata nella modalità Zen se è stata chiusa in questa modalità.", + "JsonSchema.locale": "Linguaggio dell'interfaccia utente da usare." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index dbac73dc76fe..217058d67fe8 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Disattiva punti di interruzione", "reapplyAllBreakpoints": "Riapplica tutti i punti di interruzione", "addFunctionBreakpoint": "Aggiungi punto di interruzione della funzione", - "renameFunctionBreakpoint": "Rinomina punto di interruzione della funzione", "addConditionalBreakpoint": "Aggiungi punto di interruzione condizionale...", "editConditionalBreakpoint": "Modifica punto di interruzione...", "setValue": "Imposta valore", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..9f6d476a6114 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Modifica punto di interruzione...", + "functionBreakpointsNotSupported": "Punti di interruzione delle funzioni non sono supportati da questo tipo di debug", + "functionBreakpointPlaceholder": "Funzione per cui inserire il punto di interruzione", + "functionBreakPointInputAriaLabel": "Digitare il punto di interruzione della funzione" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..33ed0232266c --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Sezione Stack di chiamate", + "debugStopped": "In pausa su {0}", + "callStackAriaLabel": "Stack di chiamate di debug", + "process": "Processo", + "paused": "In pausa", + "running": "In esecuzione", + "thread": "Thread", + "pausedOn": "In pausa su {0}", + "loadMoreStackFrames": "Carica altri stack frame", + "threadAriaLabel": "Thread {0}, stack di chiamate, debug", + "stackFrameAriaLabel": "Riga{1} {2} dello stack frame {0}, stack di chiamate, debug" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index accd0baa3c6e..7a0c9c59e957 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,6 @@ "openExplorerOnEnd": "Apre automaticamente la visualizzazione di esplorazione al termine di una sessione di debug", "inlineValues": "Mostra i valori delle variabili inline nell'editor durante il debug", "hideActionBar": "Controlla se nascondere la barra delle azioni mobile di debug", + "openDebug": "Controlla se la viewlet di debug debba essere aperta all'avvio della sessione di debug.", "launch": "Configurazione globale per l'esecuzione del debug. Può essere usata come un'alternativa a \"launch.json\" " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 9d3c04442353..c4da42088b54 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "Aggiunto un punto di interruzione a riga {0} del file {1}", "breakpointRemoved": "Rimosso un punto di interruzione a riga {0} del file {1}", "compoundMustHaveConfigurations": "Per avviare più configurazioni, deve essere impostato l'attributo \"configurations\" dell'elemento compounds.", - "configMissing": "In 'launch.json' manca la configurazione '{0}'.", "debugRequestNotSupported": "Nella configurazione di debug scelta l'attributo '{0}' ha un valore non supportato '{1}'.", "debugRequesMissing": "Nella configurazione di debug scelta manca l'attributo '{0}'.", "debugTypeNotSupported": "Il tipo di debug configurato '{0}' non è supportato.", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..e93a0904c394 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Sezione Variabili", + "variablesAriaTreeLabel": "Esegui debug variabili", + "variableValueAriaLabel": "Digitare il nuovo valore della variabile", + "variableScopeAriaLabel": "Ambito {0}, variabili, debug", + "variableAriaLabel": "Valore {1} di {0}, variabili, debug" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..63dbd8b4596d --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "Sezione Espressioni", + "watchAriaTreeLabel": "Esegui debug espressioni di controllo", + "watchExpressionPlaceholder": "Espressione da controllare", + "watchExpressionInputAriaLabel": "Digitare l'espressione di controllo", + "watchExpressionAriaLabel": "Valore {1} di {0}, espressione di controllo, debug", + "watchVariableAriaLabel": "Valore {1} di {0}, espressione di controllo, debug" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 9dc95614a882..aaef1bf10d21 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Disinstallazione", "updateAction": "Aggiorna", "updateTo": "Aggiorna a {0}", - "enableForWorkspaceAction.label": "Abilita (area di lavoro)", - "enableAlwaysAction.label": "Abilita (sempre)", - "disableForWorkspaceAction.label": "Disabilita (area di lavoro)", - "disableAlwaysAction.label": "Disabilita (sempre)", "ManageExtensionAction.uninstallingTooltip": "Disinstallazione", - "enableForWorkspaceAction": "Area di lavoro", - "enableGloballyAction": "Sempre", + "enableForWorkspaceAction": "Abilita (area di lavoro)", + "enableGloballyAction": "Abilita", "enableAction": "Abilita", - "disableForWorkspaceAction": "Area di lavoro", - "disableGloballyAction": "Sempre", + "disableForWorkspaceAction": "Disabilita (area di lavoro)", + "disableGloballyAction": "Disabilita", "disableAction": "Disabilita", "checkForUpdates": "Controlla la disponibilità di aggiornamenti", "enableAutoUpdate": "Abilita l'aggiornamento automatico delle estensioni", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Tutte le estensioni consigliate per questa area di lavoro sono già state installate", "installRecommendedExtension": "Installa l'estensione consigliata", "extensionInstalled": "L'estensione consigliata è già stata installata", - "showRecommendedKeymapExtensions": "Mostra mappature tastiera consigliate", "showRecommendedKeymapExtensionsShort": "Mappature tastiera", - "showLanguageExtensions": "Mostra estensioni del linguaggio", "showLanguageExtensionsShort": "Estensioni del linguaggio", - "showAzureExtensions": "Mostra estensioni di Azure", "showAzureExtensionsShort": "Estensioni di Azure", "OpenExtensionsFile.failed": "Non è possibile creare il file 'extensions.json' all'interno della cartella '.vscode' ({0}).", "configureWorkspaceRecommendedExtensions": "Configura estensioni consigliate (area di lavoro)", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index 12c0b28e83db..ada39f95c93c 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -9,7 +9,7 @@ "extension": "Estensione", "extensions": "Estensioni", "view": "Visualizza", + "developer": "Sviluppatore", "extensionsConfigurationTitle": "Estensioni", - "extensionsAutoUpdate": "Aggiorna automaticamente le estensioni", - "extensionsIgnoreRecommendations": "Ignora le raccomandazioni di estensioni" + "extensionsAutoUpdate": "Aggiorna automaticamente le estensioni" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..d7a84eb6e65a --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reportExtensionIssue": "Segnala problema" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/ita/src/vs/workbench/parts/files/browser/fileActions.i18n.json index 3b0fcf88e988..7d23a38e7034 100644 --- a/i18n/ita/src/vs/workbench/parts/files/browser/fileActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -69,5 +69,7 @@ "invalidFileNameError": "Il nome **{0}** non è valido per un nome file o un nome di cartella. Scegliere un nome diverso.", "filePathTooLongError": "Con il nome **{0}** il percorso diventa troppo lungo. Scegliere un nome più breve.", "compareWithSaved": "Confronta file attivo con file salvato", - "modifiedLabel": "{0} (su disco) ↔ {1}" + "modifiedLabel": "{0} (su disco) ↔ {1}", + "compareWithClipboard": "Confronta il file attivo con gli appunti", + "clipboardComparisonLabel": "Appunti ↔ {0}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..4133fa4bc3c9 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Cartelle" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..08176692fa73 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "File", + "revealInSideBar": "Visualizza nella barra laterale" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..976c0a1a9f7a --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,72 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Riprova", + "rename": "Rinomina", + "newFile": "Nuovo file", + "newFolder": "Nuova cartella", + "openFolderFirst": "Aprire prima di tutto una cartella per creare file o cartelle al suo interno.", + "newUntitledFile": "Nuovo file senza nome", + "createNewFile": "Nuovo file", + "createNewFolder": "Nuova cartella", + "deleteButtonLabelRecycleBin": "&&Sposta nel Cestino", + "deleteButtonLabelTrash": "&&Sposta nel cestino", + "deleteButtonLabel": "&&Elimina", + "dirtyMessageFolderOneDelete": "Si sta per eliminare una cartella con modifiche non salvate in un file. Continuare?", + "dirtyMessageFolderDelete": "Si sta per eliminare una cartella con modifiche non salvate in {0} file. Continuare?", + "dirtyMessageFileDelete": "Si sta per eliminare un file con modifiche non salvate. Continuare?", + "dirtyWarning": "Le modifiche apportate andranno perse se non vengono salvate.", + "confirmMoveTrashMessageFolder": "Eliminare '{0}' e il relativo contenuto?", + "confirmMoveTrashMessageFile": "Eliminare '{0}'?", + "undoBin": "È possibile ripristinare dal Cestino.", + "undoTrash": "È possibile ripristinare dal cestino.", + "doNotAskAgain": "Non chiedermelo di nuovo", + "confirmDeleteMessageFolder": "Eliminare definitivamente '{0}' e il relativo contenuto?", + "confirmDeleteMessageFile": "Eliminare definitivamente '{0}'?", + "irreversible": "Questa azione è irreversibile.", + "permDelete": "Elimina definitivamente", + "delete": "Elimina", + "importFiles": "Importa file", + "confirmOverwrite": "Nella cartella di destinazione esiste già un file o una cartella con lo stesso nome. Sovrascrivere?", + "replaceButtonLabel": "&&Sostituisci", + "copyFile": "Copia", + "pasteFile": "Incolla", + "duplicateFile": "Duplicato", + "openToSide": "Apri lateralmente", + "compareSource": "Seleziona per il confronto", + "globalCompareFile": "Confronta file attivo con...", + "openFileToCompare": "Aprire prima un file per confrontarlo con un altro file.", + "compareFiles": "Confronta file", + "refresh": "Aggiorna", + "save": "Salva", + "saveAs": "Salva con nome...", + "saveAll": "Salva tutto", + "saveAllInGroup": "Salva tutto nel gruppo", + "saveFiles": "Salva tutti i file", + "revert": "Ripristina file", + "focusOpenEditors": "Stato attivo su visualizzazione editor aperti", + "focusFilesExplorer": "Stato attivo su Esplora file", + "showInExplorer": "Visualizza file attivo nella barra laterale", + "openFileToShow": "Aprire prima di tutto un file per visualizzarlo in Esplora risorse", + "collapseExplorerFolders": "Comprimi cartelle in Explorer", + "refreshExplorer": "Aggiorna Explorer", + "openFileInNewWindow": "Apri file attivo in un'altra finestra", + "openFileToShowInNewWindow": "Aprire prima un file per visualizzarlo in un'altra finestra", + "revealInWindows": "Visualizza in Esplora risorse", + "revealInMac": "Visualizza in Finder", + "openContainer": "Apri cartella superiore", + "revealActiveFileInWindows": "Visualizza file attivo in Esplora risorse", + "revealActiveFileInMac": "Visualizza file attivo in Finder", + "openActiveFileContainer": "Apri cartella che contiene il file attivo", + "copyPath": "Copia percorso", + "copyPathOfActive": "Copia percorso del file attivo", + "emptyFileNameError": "È necessario specificare un nome file o un nome di cartella.", + "fileNameExistsError": "In questo percorso esiste già un file o una cartella **{0}**. Scegliere un nome diverso.", + "invalidFileNameError": "Il nome **{0}** non è valido per un nome file o un nome di cartella. Scegliere un nome diverso.", + "filePathTooLongError": "Con il nome **{0}** il percorso diventa troppo lungo. Scegliere un nome più breve.", + "compareWithSaved": "Confronta file attivo con file salvato", + "compareWithClipboard": "Confronta il file attivo con gli appunti" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..a02c62cce4f7 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Aprire prima un file per copiarne il percorso", + "openFileToReveal": "Aprire prima un file per visualizzarlo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..d240e8fc0752 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,52 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Mostra Esplora risorse", + "explore": "Esplora risorse", + "view": "Visualizza", + "textFileEditor": "Editor file di testo", + "binaryFileEditor": "Editor file binari", + "filesConfigurationTitle": "File", + "exclude": "Consente di configurare i criteri GLOB per escludere file e cartelle. Ad esempio, la funzionalità Esplora file stabilisce quali file e cartelle mostrare o nascondere in base a questa impostazione.", + "files.exclude.boolean": "Criterio GLOB da usare per trovare percorsi file. Impostare su True o False per abilitare o disabilitare il criterio.", + "files.exclude.when": "Controllo aggiuntivo sugli elementi di pari livello di un file corrispondente. Usare $(basename) come variabile del nome file corrispondente.", + "associations": "Consente di configurare le associazioni tra file e linguaggi, ad esempio \"*.extension\": \"html\". Queste hanno la precedenza sulle associazioni predefinite dei linguaggi installate.", + "encoding": "Codifica del set di caratteri predefinita da usare durante la lettura e la scrittura di file. È possibile configurare questa impostazione anche in base alla lingua.", + "autoGuessEncoding": "Quando questa opzione è abilitata, la codifica del set di caratteri viene ipotizzata all'apertura dei file. È possibile configurare questa impostazione anche in base alla lingua.", + "eol": "Il carattere di fine riga predefinito. Utilizzare \\n per LF e \\r\\n per CRLF.", + "trimTrailingWhitespace": "Se è abilitato, taglierà lo spazio vuoto quando si salva un file.", + "insertFinalNewline": "Se è abilitato, inserisce un carattere di nuova riga finale alla fine del file durante il salvataggio.", + "trimFinalNewlines": "Se è abilitato, taglia tutte le nuove righe dopo il carattere di nuova riga finale alla fine del file durante il salvataggio.", + "files.autoSave.off": "Un file dirty non viene mai salvato automaticamente.", + "files.autoSave.afterDelay": "Un file dirty viene salvato automaticamente in base al valore configurato di 'files.autoSaveDelay'.", + "files.autoSave.onFocusChange": "Un file dirty viene salvato automaticamente quando l'editor perde lo stato attivo.", + "files.autoSave.onWindowChange": "Un file dirty viene salvato automaticamente quando la finestra perde lo stato attivo.", + "autoSave": "Controlla il salvataggio automatico dei file dirty. Valori accettati: '{0}', '{1}', '{2}' (l'editor perde lo stato attivo), '{3}' (la finestra perde lo stato attivo). Se è impostato su '{4}', è possibile configurare il ritardo in 'files.autoSaveDelay'.", + "autoSaveDelay": "Controlla il ritardo in ms dopo il quale un file dirty viene salvato automaticamente. Si applica solo quando 'files.autoSave' è impostato su '{0}'", + "watcherExclude": "Consente di configurare i criteri GLOB dei percorsi file da escludere dal controllo dei file. I criteri devono corrispondere in percorsi assoluti (per una corretta corrispondenza aggiungere come prefisso ** il percorso completo). Se si modifica questa impostazione, è necessario riavviare. Quando si nota che Code consuma troppo tempo della CPU all'avvio, è possibile escludere le cartelle di grandi dimensioni per ridurre il carico iniziale.", + "hotExit.off": "Disabilita Hot Exit.", + "hotExit.onExit": "La funzionalità Hot Exit verrà attivata alla chiusura dell'applicazione, ovvero quando si chiude l'ultima finestra in Windows/Linux o quando si attiva il comando workbench.action.quit (riquadro comandi, tasto di scelta rapida, menu). Tutte le finestre con backup verranno ripristinate al successivo avvio.", + "hotExit.onExitAndWindowClose": "La funzionalità Hot Exit verrà attivata alla chiusura dell'applicazione, ovvero quando si chiude l'ultima finestra in Windows/Linux o quando si attiva il comando workbench.action.quit (riquadro comandi, tasto di scelta rapida, menu), nonché per qualsiasi finestra con una cartella aperta indipendentemente dal fatto che sia l'ultima. Tutte le finestre senza cartelle aperte verranno ripristinate al successivo avvio. Per riportare le finestre di cartelle allo stato in cui si trovavano prima dell'arresto, impostare \"window.restoreFolders\" su \"all\".", + "hotExit": "Controlla se i file non salvati verranno memorizzati tra una sessione e l'altra, consentendo di ignorare il prompt di salvataggio alla chiusura dell'editor.", + "useExperimentalFileWatcher": "Usa il nuovo watcher di file sperimentale.", + "defaultLanguage": "Modalità linguaggio predefinita assegnata ai nuovi file.", + "editorConfigurationTitle": "Editor", + "formatOnSave": "Formatta un file durante il salvataggio. Deve essere disponibile un formattatore, il file non deve essere salvato automaticamente e l'editor non deve essere in fase di chiusura.", + "explorerConfigurationTitle": "Esplora file", + "openEditorsVisible": "Numero di editor visualizzati nel riquadro degli editor aperti. Impostarlo su 0 per nascondere il riquadro.", + "dynamicHeight": "Controlla se l'altezza della sezione degli editor aperti deve essere adattata o meno dinamicamente al numero di elementi.", + "autoReveal": "Controlla se Esplora risorse deve rivelare automaticamente e selezionare i file durante l'apertura.", + "enableDragAndDrop": "Controlla se Esplora risorse deve consentire lo spostamento di file e cartelle tramite trascinamento della selezione.", + "confirmDragAndDrop": "Controlla se Esplora risorse deve chiedere conferma prima di spostare file e cartelle tramite trascinamento della selezione.", + "confirmDelete": "Controlla se Esplora risorse deve chiedere una conferma quando si elimina file tramite il cestino.", + "sortOrder.default": "I file e le cartelle vengono ordinati in ordine alfabetico in base al nome. Le cartelle vengono visualizzate prima dei file.", + "sortOrder.mixed": "I file e le cartelle vengono ordinati ordine alfabetico in base al nome, in un unico elenco ordinato.", + "sortOrder.filesFirst": "I file e le cartelle vengono ordinati in ordine alfabetico in base al nome. I file vengono visualizzati prima delle cartelle.", + "sortOrder.type": "I file e le cartelle vengono ordinati in ordine alfabetico in base all'estensione. Le cartelle vengono visualizzate prima dei file.", + "sortOrder.modified": "I file e le cartelle vengono ordinati in ordine decrescente in base alla data dell'ultima modifica. Le cartelle vengono visualizzate prima dei file.", + "sortOrder": "Controlla l'ordinamento di file e cartelle in Esplora risorse. Oltre all'ordinamento predefinito, è possibile impostare l'ordine su 'mixed' (file e cartelle vengono ordinati insieme), 'type' (in base al tipo di file), 'modified' (in base alla data dell'ultima modifica) o 'filesFirst' (i file vengono ordinati prima delle cartelle).", + "explorer.decorations.badges": "Controlli se decorazioni file devono utilizzare badge." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..49ebceb9611a --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Usare le azioni della barra degli strumenti dell'editor a destra per **annullare** le modifiche o per **sovrascrivere** il contenuto su disco con le modifiche", + "discard": "Rimuovi", + "overwrite": "Sovrascrivi", + "retry": "Riprova", + "readonlySaveError": "Non è stato possibile salvare '{0}': il file è protetto da scrittura. Selezionare 'Sovrascrivi' per rimuovere la protezione.", + "genericSaveError": "Non è stato possibile salvare '{0}': {1}", + "staleSaveError": "Non è stato possibile salvare '{0}': il contenuto sul disco è più recente. Fare clic su **Confronta** per confrontare la versione corrente con quella sul disco.", + "compareChanges": "Confronta", + "saveConflictDiffLabel": "{0} (su disco) ↔ {1} (in {2}) - Risolvere conflitto in fase di salvataggio" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..4427bde01efb --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Nessuna cartella aperta", + "explorerSection": "Sezione Esplora file", + "noWorkspaceHelp": "Non hai ancora aggiunto cartelle nell'area di lavoro", + "noFolderHelp": "Non ci sono ancora cartelle aperte.", + "openFolder": "Apri cartella" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..e0b8c74653bb --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Esplora risorse" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..43fcd8d45a7a --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Sezione Esplora file", + "treeAriaLabel": "Esplora file" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..e1c70dabccae --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Digitare il nome file. Premere INVIO per confermare oppure ESC per annullare.", + "filesExplorerViewerAriaLabel": "{0}, Esplora file", + "dropFolders": "Aggiungere le cartelle all'area di lavoro?", + "dropFolder": "Aggiungere la cartella all'area di lavoro?", + "addFolders": "&& Aggiungi cartelle", + "addFolder": "&&Aggiungi cartella", + "confirmMove": "Sei sicuro di voler spostare '{0}'?", + "doNotAskAgain": "Non chiedermelo di nuovo", + "moveButtonLabel": "&&Sposta", + "confirmOverwriteMessage": "'{0}' esiste già nella cartella di destinazione. Sostituirlo?", + "irreversible": "Questa azione è irreversibile.", + "replaceButtonLabel": "&&Sostituisci" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..5627c56823f1 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Editor aperti", + "openEditosrSection": "Sezione Editor aperti", + "dirtyCounter": "{0} non salvati", + "saveAll": "Salva tutto", + "closeAllUnmodified": "Chiudi non modificati", + "closeAll": "Chiudi tutto", + "compareWithSaved": "Confronta con file salvato", + "close": "Chiudi", + "closeOthers": "Chiudi altri" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..4ca857f227ae --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, Gruppo di editor", + "openEditorAriaLabel": "{0}, Apri editor", + "saveAll": "Salva tutto", + "closeAllUnmodified": "Chiudi non modificati", + "closeAll": "Chiudi tutto", + "compareWithSaved": "Confronta con file salvato", + "close": "Chiudi", + "closeOthers": "Chiudi altri" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/common/messages.i18n.json index ec1b923160e3..e60e5ecc0521 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,6 @@ { "viewCategory": "Visualizza", "problems.view.toggle.label": "Attiva/disattiva problemi", - "problems.view.show.label": "Mostra problemi", - "problems.view.hide.label": "Nascondi problemi", "problems.panel.configuration.title": "Visualizzazione Problemi", "problems.panel.configuration.autoreveal": "Controlla se la visualizzazione Problemi deve visualizzare automaticamente i file durante l'apertura", "markers.panel.title.problems": "Problemi", diff --git a/i18n/ita/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/ita/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..a4bad776c265 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "I profili sono stati creati.", + "prof.detail": "Creare un problema e allegare manualmente i file seguenti:\n{0}", + "prof.restartAndFileIssue": "Crea problema e riavvia", + "prof.restart": "Riavvia", + "prof.thanks": "Grazie per l'aiuto.", + "prof.detail.restart": "È necessario un riavvio alla fine per continuare a utilizzare '{0}'. Ancora una volta, grazie per il vostro contributo." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 90b8531e6347..4d00ef4a8632 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "Premere la combinazione di tasti desiderata e INVIO. Premere ESC per annullare.", "defineKeybinding.chordsTo": "premi contemporaneamente per" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 52ab13aa8f8a..f9bb96299920 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "Cambia tasto di scelta rapida", "addKeybindingLabelWithKey": "Aggiungi tasto di scelta rapida {0}", "addKeybindingLabel": "Aggiungi tasto di scelta rapida", + "title": "{0} ({1})", "commandAriaLabel": "Il comando è {0}.", "keybindingAriaLabel": "Il tasto di scelta rapida è {0}.", "noKeybinding": "Non è stato assegnato alcun tasto di scelta rapida.", diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 7d41a6f73512..9968a08e4f37 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Impostazioni predefinite", "SearchSettingsWidget.AriaLabel": "Cerca impostazioni", "SearchSettingsWidget.Placeholder": "Cerca impostazioni", - "totalSettingsMessage": "{0} impostazioni in totale", "noSettingsFound": "Nessun risultato", "oneSettingFound": "1 impostazione corrispondente", "settingsFound": "{0} impostazioni corrispondenti", - "fileEditorWithInputAriaLabel": "{0}. Editor file di testo.", - "fileEditorAriaLabel": "Editor file di testo.", + "totalSettingsMessage": "{0} impostazioni in totale", + "defaultSettings": "Impostazioni predefinite", + "defaultFolderSettings": "Impostazioni cartella predefinite", "defaultEditorReadonly": "Modificare nell'editor a destra per ignorare le impostazioni predefinite.", "preferencesAriaLabel": "Preferenze predefinite. Editor di testo di sola lettura." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 55d6b99c4086..268c28632dd7 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Inserire le impostazioni qui per sovrascrivere quelle predefinite.", "emptyWorkspaceSettingsHeader": "Inserire le impostazioni qui per sovrascrivere le impostazioni utente.", "emptyFolderSettingsHeader": "Inserire le impostazioni cartella qui per sovrascrivere quelle dell'area di lavoro.", - "defaultFolderSettingsTitle": "Impostazioni cartella predefinite", - "defaultSettingsTitle": "Impostazioni predefinite", "editTtile": "Modifica", "replaceDefaultValue": "Sostituisci nelle impostazioni", "copyDefaultValue": "Copia nelle impostazioni", diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index a440b0eccc07..4669fa3cd569 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Prova la ricerca fuzzy!", "defaultSettings": "Inserire le impostazioni nell'editor di lato destro per eseguire l'override.", "noSettingsFound": "Non sono state trovate impostazioni.", - "folderSettingsDetails": "Impostazioni cartella", - "enableFuzzySearch": "Attivare la ricerca fuzzy sperimentale" + "settingsSwitcherBarAriaLabel": "Selezione impostazioni", + "userSettings": "Impostazioni utente", + "workspaceSettings": "Impostazioni area di lavoro", + "folderSettings": "Impostazioni cartella" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..5cc9af3d7736 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Editor preferenze predefinite", + "keybindingsEditor": "Editor tasti di scelta rapida", + "preferences": "Preferenze" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 8bc8834c5e78..d0a197a727b5 100644 --- a/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Provider di controllo del codice sorgente", "hideRepository": "Nascondi", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Installa ulteriori provider SCM ...", "no open repo": "Non esistono provider di controllo codice sorgente attivi.", "source control": "Controllo del codice sorgente", diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index db97a1723f45..e8eab9367a64 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "input", - "useIgnoreFilesDescription": "Usa file ignorati", - "useExcludeSettingsDescription": "Utilizza impostazioni di esclusione" + "useExcludesAndIgnoreFilesDescription": "Utilizzare le impostazioni di esclusione e ignorare i file" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index a5096d19095d..25315a7f99ea 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "Criterio GLOB da usare per trovare percorsi file. Impostare su True o False per abilitare o disabilitare il criterio.", "exclude.when": "Controllo aggiuntivo sugli elementi di pari livello di un file corrispondente. Usare $(basename) come variabile del nome file corrispondente.", "useRipgrep": "Controlla l'utilizzo di ripgrep nelle ricerche su testo e file", - "useIgnoreFilesByDefault": "Controlla se utilizzare i file .gitignore e .ignore come impostazione predefinita durante la ricerca testuale in una nuova area di lavoro.", "useIgnoreFiles": "Controlla se utilizzare i file .gitignore e .ignore durante la ricerca di file", "search.quickOpen.includeSymbols": "Configurare questa opzione per includere i risultati di una ricerca di simboli globale nei risultati dei file per Quick Open.", "search.followSymlinks": "Controlla se seguire i collegamenti simbolici durante la ricerca." diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json index a7900586404c..ebff6e3002a3 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Mostra i criteri di esclusione per la ricerca precedenti", "nextSearchTerm": "Mostra il termine di ricerca successivo", "previousSearchTerm": "Mostra il termine di ricerca precedente", - "focusNextInputBox": "Sposta lo stato attivo sulla casella di input successiva", - "focusPreviousInputBox": "Sposta lo stato attivo sulla casella di input precedente", "showSearchViewlet": "Mostra Cerca", "findInFiles": "Cerca nei file", "findInFilesWithSelectedText": "Cerca nei file con il testo selezionato", "replaceInFiles": "Sostituisci nei file", "replaceInFilesWithSelectedText": "Sostituisci nei file con il testo selezionato", - "findInWorkspace": "Trova nell'area di lavoro...", - "findInFolder": "Trova nella cartella...", "RefreshAction.label": "Aggiorna", - "ClearSearchResultsAction.label": "Cancella risultati della ricerca", + "CollapseDeepestExpandedLevelAction.label": "Comprimi tutto", + "ClearSearchResultsAction.label": "Cancella", "FocusNextSearchResult.label": "Sposta lo stato attivo sul risultato della ricerca successivo", "FocusPreviousSearchResult.label": "Sposta lo stato attivo sul risultato della ricerca precedente", "RemoveAction.label": "Chiudi", diff --git a/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..25315a7f99ea --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Vai al simbolo nell'area di lavoro...", + "name": "Cerca", + "search": "Cerca", + "view": "Visualizza", + "openAnythingHandlerDescription": "Vai al file", + "openSymbolDescriptionNormal": "Vai al simbolo nell'area di lavoro", + "searchOutputChannelTitle": "Cerca", + "searchConfigurationTitle": "Cerca", + "exclude": "Consente di configurare i criteri GLOB per escludere file e cartelle nelle ricerche. Eredita tutti i criteri GLOB dall'impostazione files.exclude.", + "exclude.boolean": "Criterio GLOB da usare per trovare percorsi file. Impostare su True o False per abilitare o disabilitare il criterio.", + "exclude.when": "Controllo aggiuntivo sugli elementi di pari livello di un file corrispondente. Usare $(basename) come variabile del nome file corrispondente.", + "useRipgrep": "Controlla l'utilizzo di ripgrep nelle ricerche su testo e file", + "useIgnoreFiles": "Controlla se utilizzare i file .gitignore e .ignore durante la ricerca di file", + "search.quickOpen.includeSymbols": "Configurare questa opzione per includere i risultati di una ricerca di simboli globale nei risultati dei file per Quick Open.", + "search.followSymlinks": "Controlla se seguire i collegamenti simbolici durante la ricerca." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/ita/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..dd91e701081b --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "Trova nella cartella...", + "findInWorkspace": "Trova nell'area di lavoro..." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 4f1a6c0fc9a0..7defa5c4be7a 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "Attività", "ConfigureTaskRunnerAction.label": "Configura attività", - "ConfigureBuildTaskAction.label": "Configura attività di compilazione", "CloseMessageAction.label": "Chiudi", - "ShowTerminalAction.label": "Visualizza terminale", "problems": "Problemi", + "building": "Compilazione in corso...", "manyMarkers": "Più di 99", "runningTasks": "Visualizza attività in esecuzione", "tasks": "Attività", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "Non è stata trovata alcuna attività da eseguire. Configurare le attività...", "TaskService.fetchingBuildTasks": "Recupero delle attività di compilazione...", "TaskService.pickBuildTask": "Selezionare l'attività di compilazione da eseguire", - "TaskService.noBuildTask": "Non è stata trovata alcuna attività di compilazione da eseguire. Configurare le attività...", + "TaskService.noBuildTask": "Nessuna attività di compilazione da eseguire trovato. Configurare l'attività di compilazione...", "TaskService.fetchingTestTasks": "Recupero delle attività di test...", "TaskService.pickTestTask": "Selezionare l'attività di test da eseguire", "TaskService.noTestTaskTerminal": "Non è stata trovata alcuna attività di test da eseguire. Configurare le attività...", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index acc06bc45a53..281f55cd8214 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "Si è verificato un errore sconosciuto durante l'esecuzione di un'attività. Per dettagli, vedere il log di output dell'attività.", "dependencyFailed": "Non è stato possibile risolvere l'attività dipendente '{0}' nella cartella dell'area di lavoro '{1}'", "TerminalTaskSystem.terminalName": "Attività - {0}", + "closeTerminal": "Premere un tasto qualsiasi per chiudere il terminale.", "reuseTerminal": "Terminale verrà riutilizzato dalle attività, premere un tasto qualsiasi per chiuderlo.", "TerminalTaskSystem": "Non è possibile eseguire un comando della shell su un'unità UNC.", "unkownProblemMatcher": "Il matcher problemi {0} non può essere risolto. il matcher verrà ignorato" diff --git a/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 5adc56a7ea07..6022523a4a4e 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,7 @@ "ConfigurationParser.noTypeDefinition": "Errore: non ci sono attività registrate di tipo '{0}'. Non è stata installata un'estensione che fornisce un provider di task corrispondente?", "ConfigurationParser.missingRequiredProperty": "Errore: nella configurazione di attività '{0}' manca la proprietà obbligatoria '{1}'. La configurazione dell'attività verrà ignorata.", "ConfigurationParser.notCustom": "Errore: tasks non è dichiarato come un'attività personalizzata. La configurazione verrà ignorata.\n{0}\n", - "ConfigurationParser.noTaskName": "Errore: le attività devono specificare una proprietà taskName. L'attività verrà ignorata.\n{0}\n", - "taskConfiguration.shellArgs": "Avviso: l'attività '{0}' è un comando della shell e il nome del comando o uno dei relativi argomenti contiene spazi senza codice di escape. Per garantire la corretta indicazione della riga di comando, unire gli argomenti nel comando.", + "taskConfiguration.shellArgs": "Avviso: l'attività '{0}' è un comando di shell e uno dei suoi argomenti potrebbe avere spazi indesiderati. Per garantire la correttezza della riga di comando unire args nel comando stesso.", "taskConfiguration.noCommandOrDependsOn": "Errore: l'attività '{0}' non specifica un comando né una proprietà dependsOn. L'attività verrà ignorata. La sua definizione è:\n{1}", "taskConfiguration.noCommand": "Errore: l'attività '{0}' non definisce un comando. L'attività verrà ignorata. Definizione dell'attività:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "L'attività versione 2.0.0 non supporta attività specifiche globali del sistema operativo. Convertirle in un'attività con un comando specifico del sistema operativo. Attività interessate:\n{0}" diff --git a/i18n/ita/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index 606a321e648d..7dc41d5b700c 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, selettore terminale", "termCreateEntryAriaLabel": "{0}, crea un nuovo terminale", - "'workbench.action.terminal.newplus": "$(plus) Crea nuovo terminale integrato", + "workbench.action.terminal.newplus": "$(plus) Crea nuovo terminale integrato", "noTerminalsMatching": "Nessun terminale corrispondente", "noTerminalsFound": "Nessun terminale aperto" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index fe866565bf0a..f823b4b682f4 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,6 @@ "terminal.integrated.rightClickCopyPaste": "Se impostata, impedirà la visualizzazione del menu di scelta rapida quando si fa clic con il pulsante destro del mouse all'interno del terminale, ma eseguirà il comando Copia in presenza di una selezione e il comando Incolla in assenza di una selezione.", "terminal.integrated.fontFamily": "Controlla la famiglia di caratteri del terminale. L'impostazione predefinita è il valore di editor.fontFamily.", "terminal.integrated.fontSize": "Consente di controllare le dimensioni del carattere in pixel del terminale.", - "terminal.integrated.lineHeight": "Controlla l'altezza della riga del terminale. Questo numero è moltiplicato dalle dimensioni del carattere del terminale per ottenere l'altezza di riga effettiva in pixel.", "terminal.integrated.enableBold": "Per abilitare il grassetto del testo all'interno del terminale, è necessario il supporto della shell del terminale.", "terminal.integrated.cursorBlinking": "Controlla se il cursore del terminale è intermittente o meno.", "terminal.integrated.cursorStyle": "Controlla lo stile del cursore del terminale.", diff --git a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 7801fc1c4368..551ccc06ba28 100644 --- a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,14 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "Tema colori", + "themes.category.light": "temi chiari", + "themes.category.dark": "temi scuri", "installColorThemes": "Installa temi colori aggiuntivi...", "themes.selectTheme": "Selezionare il Tema colori (tasti su/giù per anteprima)", "selectIconTheme.label": "Tema icona file", - "installIconThemes": "Installa temi dell'icona file aggiuntivi...", "noIconThemeLabel": "Nessuno", "noIconThemeDesc": "Disabilita le icone dei file", - "problemChangingIconTheme": "Problema durante l'impostazione del tema dell'icona: {0}", + "installIconThemes": "Installa temi dell'icona file aggiuntivi...", "themes.selectIconTheme": "Seleziona il tema dell'icona file", "generateColorTheme.label": "Genera tema colore da impostazioni correnti", "preferences": "Preferenze", diff --git a/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 39e782467df2..ff8f2cb89013 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Configurazione specifica della finestra, che può essere configurata nelle impostazioni dell'utente o dell'area di lavoro.", "scope.resource.description": "Configurazione specifica di risorse, che possono essere configurate nelle impostazioni utente, in quelle dell'area di lavoro o di una cartella.", "scope.description": "Ambito in cui la configurazione è applicabile. Gli ambiti disponibili sono 'finestra' e 'risorsa'.", + "vscode.extension.contributes.defaultConfiguration": "Aggiunge come contributo le impostazioni di configurazione predefinite dell'editor in base al linguaggio.", "vscode.extension.contributes.configuration": "Impostazioni di configurazione di contributes.", "invalid.title": "'configuration.title' deve essere una stringa", - "vscode.extension.contributes.defaultConfiguration": "Aggiunge come contributo le impostazioni di configurazione predefinite dell'editor in base al linguaggio.", "invalid.properties": "'configuration.properties' deve essere un oggetto", "invalid.allOf": "'configuration.allOf' è deprecato e non deve più essere usato. Passare invece una matrice di sezioni di configurazione al punto di aggiunta contributo 'configuration'.", "workspaceConfig.folders.description": "Elenco di cartelle da caricare nell'area di lavoro.", diff --git a/i18n/ita/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/ita/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..f3982be9f88e --- /dev/null +++ b/i18n/ita/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetria", + "telemetry.enableCrashReporting": "Consente l'invio di segnalazioni di arresto anomalo del sistema a Microsoft.\nPer rendere effettiva questa opzione, è necessario riavviare." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/ita/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 4f75b36a6364..6c6578e82614 100644 --- a/i18n/ita/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "bubbleTitle": "contiene elementi sottolineati" + "bubbleTitle": "Contiene elementi enfatizzati" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json index 158f28c3a3e1..d4608f63401c 100644 --- a/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "Il File è una Directory", "fileNotModifiedError": "File non modificato dal giorno", "fileTooLargeError": "File troppo grande per essere aperto", - "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo", "fileNotFoundError": "Il file non è stato trovato ({0})", + "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo", "fileExists": "Il file da creare esiste già ({0})", "fileMoveConflict": "Non è possibile eseguire operazioni di spostamento/copia. Il file esiste già nella destinazione.", "unableToMoveCopyError": "Non è possibile eseguire operazioni di spostamento/copia. Il file sostituirebbe la cartella in cui è contenuto.", diff --git a/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 61103acf9b13..3f4aae3a6f02 100644 --- a/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -21,6 +21,5 @@ "keybindings.json.command": "Nome del comando da eseguire", "keybindings.json.when": "Condizione quando il tasto è attivo.", "keybindings.json.args": "Argomenti da passare al comando da eseguire.", - "keyboardConfigurationTitle": "Tastiera", - "dispatch": "Controlla la logica di invio delle pressioni di tasti da usare, tra `keydown.code` (scelta consigliata) e `keydown.keyCode`." + "keyboardConfigurationTitle": "Tastiera" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/ita/src/vs/workbench/services/textfile/common/textFileService.i18n.json index 5586632023b8..8b6ad71cd4e6 100644 --- a/i18n/ita/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "files.backup.failSave": "Non è stato possibile eseguire il backup dei file (errore {0}). Per chiudere, provare a salvare i file." -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 97d1cdc17540..c8e3f4e44d82 100644 --- a/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "Sono state aggiunte nuove impostazioni tema alle impostazioni utente. Backup disponibile in {0}.", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "Specifies the color theme used in the workbench.", "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifica il tema dell'icona usato nell'area di lavoro oppure 'null' se non viene visualizzato alcun icona di file.", diff --git a/i18n/jpn/extensions/css/client/out/cssMain.i18n.json b/i18n/jpn/extensions/css/client/out/cssMain.i18n.json index fefe07e15fa4..29ef8e73dad8 100644 --- a/i18n/jpn/extensions/css/client/out/cssMain.i18n.json +++ b/i18n/jpn/extensions/css/client/out/cssMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "cssserver.name": "CSS 言語サーバー" + "cssserver.name": "CSS 言語サーバー", + "folding.start": "折りたたみ領域の開始", + "folding.end": "折りたたみ領域の終了" } \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/autofetch.i18n.json b/i18n/jpn/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..a4b33109cea1 --- /dev/null +++ b/i18n/jpn/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "はい", + "no": "いいえ", + "not now": "あとで", + "suggest auto fetch": "Git リポジトリの自動フェッチを有効にしますか?" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index e825de0716d1..e73b6d879f2f 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -9,9 +9,12 @@ "create branch": "$(plus) 新しいブランチを作成", "repourl": "リポジトリ URL", "parent": "親ディレクトリ", + "cancel": "$(sync~spin) リポジトリのクローン中... キャンセルをクリックしてください", + "cancel tooltip": "クローンのキャンセル", "cloning": "Git リポジトリを複製しています...", "openrepo": "リポジトリを開く", "proposeopen": "複製したリポジトリを開きますか?", + "init": "Git リポジトリを初期化するワークスペース フォルダーを選択してください", "init repo": "リポジトリの初期化", "create repo": "リポジトリの初期化", "are you sure": "'{0}' に Git リポジトリを作成します。続行してもよろしいですか?", @@ -49,12 +52,15 @@ "select branch to delete": "削除するブランチの選択", "confirm force delete branch": "ブランチ '{0}' はマージされていません。それでも削除しますか?", "delete branch": "ブランチの削除", + "invalid branch name": "無効なブランチ名", + "branch already exists": "ブランチ名 '{0}' は既に存在します", "select a branch to merge from": "マージ元のブランチを選択", "merge conflicts": "マージの競合があります。コミットする前にこれを解決してください。", "tag name": "タグ名", "provide tag name": "タグ名を入力してください。", "tag message": "メッセージ", "provide tag message": "注釈付きタグにつけるメッセージを入力してください", + "no remotes to fetch": "リポジトリには、フェッチ元として構成されているリモートがありません。", "no remotes to pull": "リポジトリには、プル元として構成されているリモートがありません。", "pick remote pull repo": "リモートを選んで、ブランチを次からプルします:", "no remotes to push": "リポジトリには、プッシュ先として構成されているリモートがありません。", @@ -71,7 +77,7 @@ "no stashes": "復元するスタッシュがありません。", "pick stash to pop": "適用するスタッシュを選択してください", "clean repo": "チェックアウトの前に、リポジトリの作業ツリーを消去してください。", - "cant push": "参照仕様をリモートにプッシュできません。最初に 'Pull' を実行して変更を統合してください。", + "cant push": "参照仕様をリモートにプッシュできません。最初に 'Pull' を実行して変更を統合してください。", "git error details": "Git: {0}", "git error": "Git エラー", "open git log": "Git ログを開く" diff --git a/i18n/jpn/extensions/git/out/main.i18n.json b/i18n/jpn/extensions/git/out/main.i18n.json index 6bb5e4d40461..4af1f0fc9d92 100644 --- a/i18n/jpn/extensions/git/out/main.i18n.json +++ b/i18n/jpn/extensions/git/out/main.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Git を探しています: {0}", "using git": "{1} から Git {0} を使用しています", - "updateGit": "Git の更新", + "downloadgit": "Git のダウンロード", "neverShowAgain": "今後は表示しない", + "notfound": "Git が見つかりません。Git をインストールするか 'git.path' 設定でパスを構成してください。", + "updateGit": "Git の更新", "git20": "git {0} がインストールされているようです。Code は Git 2 以上で最適に動作します" } \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/repository.i18n.json b/i18n/jpn/extensions/git/out/repository.i18n.json index 553e8a8277f8..230222eb69b6 100644 --- a/i18n/jpn/extensions/git/out/repository.i18n.json +++ b/i18n/jpn/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "こちら側による削除", "both added": "双方とも追加", "both modified": "双方とも変更", + "commitMessage": "Message (press {0} to commit)", "commit": "コミット", "merge changes": "変更のマージ", "staged changes": "ステージング済みの変更", diff --git a/i18n/jpn/extensions/git/package.i18n.json b/i18n/jpn/extensions/git/package.i18n.json index 84c7a81f400e..1574014e89e8 100644 --- a/i18n/jpn/extensions/git/package.i18n.json +++ b/i18n/jpn/extensions/git/package.i18n.json @@ -33,8 +33,10 @@ "command.checkout": "チェックアウト先...", "command.branch": "ブランチを作成...", "command.deleteBranch": "ブランチの削除...", + "command.renameBranch": "ブランチ名の変更...", "command.merge": "ブランチをマージ...", "command.createTag": "タグを作成", + "command.fetch": "フェッチ", "command.pull": "プル", "command.pullRebase": "プル (リベース)", "command.pullFrom": "指定元からプル...", @@ -42,9 +44,11 @@ "command.pushTo": "プッシュ先...", "command.pushWithTags": "タグをつけてプッシュ", "command.sync": "同期", + "command.syncRebase": "同期 (リベース)", "command.publish": "ブランチの発行", "command.showOutput": "Git 出力の表示", "command.ignore": "ファイルを .gitignore に追加", + "command.stashIncludeUntracked": "スタッシュ (未追跡ファイルを含む)", "command.stash": "スタッシュ", "command.stashPop": "スタッシュを適用して削除...", "command.stashPopLatest": "最新のスタッシュを適用して削除", @@ -57,6 +61,7 @@ "config.countBadge": "Git バッジ カウンターを制御します。`all` はすべての変更をカウントします。 `tracked` は追跡している変更のみカウントします。 `off` はカウントをオフします。", "config.checkoutType": "`Checkout to...` を実行するときに表示されるブランチの種類を制御します。`all` はすべての参照を表示します。`local` はローカル ブランチのみ、`tags` はタグのみ、`remote` はリモート ブランチのみを表示します。 ", "config.ignoreLegacyWarning": "旧 Git の警告を無視します", + "config.ignoreMissingGitWarning": "Git が見つからない場合の警告を無視します", "config.ignoreLimitWarning": "リポジトリ内に変更が多い場合は警告を無視します", "config.defaultCloneDirectory": "Git リポジトリをクローンする既定の場所", "config.enableSmartCommit": "ステージされた変更がない場合はすべての変更をコミットします。", diff --git a/i18n/jpn/extensions/html/client/out/htmlMain.i18n.json b/i18n/jpn/extensions/html/client/out/htmlMain.i18n.json index d3ca6c5500c0..bcf35d4b14f3 100644 --- a/i18n/jpn/extensions/html/client/out/htmlMain.i18n.json +++ b/i18n/jpn/extensions/html/client/out/htmlMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "htmlserver.name": "HTML 言語サーバー" + "htmlserver.name": "HTML 言語サーバー", + "folding.start": "折りたたみ領域の開始", + "folding.end": "折りたたみ領域の終了" } \ No newline at end of file diff --git a/i18n/jpn/extensions/markdown/out/commands.i18n.json b/i18n/jpn/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..bc7b2057e454 --- /dev/null +++ b/i18n/jpn/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "プレビュー {0}", + "onPreviewStyleLoadError": "'markdown.styles' を読み込むことができません: {0}" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/jpn/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..6d4c8918e8f0 --- /dev/null +++ b/i18n/jpn/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "このドキュメントで一部のコンテンツが無効になっています", + "preview.securityMessage.title": "安全でない可能性があるか保護されていないコンテンツは、マークダウン プレビューで無効化されています。保護されていないコンテンツやスクリプトを有効にするには、マークダウン プレビューのセキュリティ設定を変更してください", + "preview.securityMessage.label": "セキュリティが無効なコンテンツの警告" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/markdown/out/security.i18n.json b/i18n/jpn/extensions/markdown/out/security.i18n.json index 4ef933fbf913..40f48a3d2fdd 100644 --- a/i18n/jpn/extensions/markdown/out/security.i18n.json +++ b/i18n/jpn/extensions/markdown/out/security.i18n.json @@ -11,5 +11,8 @@ "disable.title": "無効にする", "disable.description": "すべてのコンテンツとスクリプトの実行を許可します。推奨されません。", "moreInfo.title": "詳細情報", + "enableSecurityWarning.title": "このワークスペースでプレビューのセキュリティ警告を有効にする", + "disableSecurityWarning.title": "このワークスペースでプレビューのセキュリティ警告を有効にする", + "toggleSecurityWarning.description": "コンテンツのセキュリティ レベルに影響しません", "preview.showPreviewSecuritySelector.title": "ワークスペースのマークダウン プレビューに関するセキュリティ設定を選択 " } \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/package.i18n.json b/i18n/jpn/extensions/merge-conflict/package.i18n.json index 3a6930d38af3..e87fbfc30b0f 100644 --- a/i18n/jpn/extensions/merge-conflict/package.i18n.json +++ b/i18n/jpn/extensions/merge-conflict/package.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "command.category": "マージの競合", + "command.accept.all-current": "現在の方をすべて取り込む", "command.accept.all-incoming": "入力側のすべてを取り込む", "command.accept.all-both": "両方をすべて取り込む", "command.accept.current": "現在の方を取り込む", diff --git a/i18n/jpn/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/jpn/extensions/typescript/out/features/completionItemProvider.i18n.json index 98c4b9af2450..e974f31a54e0 100644 --- a/i18n/jpn/extensions/typescript/out/features/completionItemProvider.i18n.json +++ b/i18n/jpn/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "selectCodeAction": "適用するコード アクションを選択", "acquiringTypingsLabel": "Typings の定義ファイルを取得中...", "acquiringTypingsDetail": "IntelliSense の Typings の定義ファイルを取得しています。", "autoImportLabel": "{0} から自動インポート" diff --git a/i18n/jpn/extensions/typescript/package.i18n.json b/i18n/jpn/extensions/typescript/package.i18n.json index b8035031298a..837e11b29720 100644 --- a/i18n/jpn/extensions/typescript/package.i18n.json +++ b/i18n/jpn/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "TS サーバーのログを開く", "typescript.restartTsServer": "TS サーバーを再起動する", "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", + "typescript.reportStyleChecksAsWarnings": "スタイルチェックレポートを警告扱いとする", "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", "typescript.npm": "型定義の自動取得に使用される NPM 実行可能ファイルへのパスを指定します。TypeScript 2.3.4 以上が必要です。", diff --git a/i18n/jpn/src/vs/base/common/errorMessage.i18n.json b/i18n/jpn/src/vs/base/common/errorMessage.i18n.json index d233c4458225..d496d4a7f81f 100644 --- a/i18n/jpn/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/jpn/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}。エラー コード: {1}", - "error.permission.verbose": "アクセス許可が拒否されました (HTTP {0})", - "error.permission": "アクセス許可が拒否されました", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "不明な接続エラー ({0})", - "error.connection.unknown": "不明な接続エラーが発生しました。インターネット接続が切れたか、接続先のサーバーがオフラインです。", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "不明なエラーが発生しました。ログで詳細を確認してください。", "nodeExceptionMessage": "システム エラーが発生しました ({0})", diff --git a/i18n/jpn/src/vs/code/electron-main/main.i18n.json b/i18n/jpn/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..a56e5d2c7c30 --- /dev/null +++ b/i18n/jpn/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "{0} の別のインスタンスが実行中ですが応答していません", + "secondInstanceNoResponseDetail": "他すべてのインスタンスを閉じてからもう一度お試しください。", + "secondInstanceAdmin": "{0} の 2 つ目のインスタンスが既に管理者として実行されています。", + "secondInstanceAdminDetail": "他すべてのインスタンスを閉じてからもう一度お試しください。", + "close": "閉じる(&&C)" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index 776dd81e3327..8a7dad6df22e 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,12 @@ "miQuit": "{0} を終了", "miNewFile": "新規ファイル(&&N)", "miOpen": "開く(&&O)...", - "miOpenWorkspace": "ワークスペースを開く(&&O)...", + "miOpenWorkspace": "ワークスペースを開く(&&K)...", "miOpenFolder": "フォルダーを開く(&&F)...", "miOpenFile": "ファイルを開く(&&O)...", "miOpenRecent": "最近使用した項目を開く(&&R)", - "miSaveWorkspaceAs": "名前を付けてワークスペースを保存(&&S)...", - "miAddFolderToWorkspace": "ワークスペースにフォルダーを追加(&&A)...", + "miSaveWorkspaceAs": "名前を付けてワークスペースを保存...", + "miAddFolderToWorkspace": "ワークスペースにフォルダーを追加(&&D)...", "miSave": "保存(&&S)", "miSaveAs": "名前を付けて保存(&&A)...", "miSaveAll": "すべて保存(&&L)", @@ -157,7 +157,7 @@ "mMergeAllWindows": "すべてのウィンドウを統合", "miToggleDevTools": "開発者ツールの切り替え(&&T)", "miAccessibilityOptions": "ユーザー補助オプション(&&O)", - "miReportIssues": "問題の報告(&&I)", + "miReportIssue": "問題の報告(&&I)", "miWelcome": "ようこそ(&&W)", "miInteractivePlayground": "対話型プレイグラウンド(&&I)", "miDocumentation": "参照資料(&&D)", @@ -184,6 +184,7 @@ "miDownloadingUpdate": "更新をダウンロードしています...", "miInstallingUpdate": "更新プログラムをインストールしています...", "miCheckForUpdates": "更新の確認...", - "aboutDetail": "\nバージョン {0}\nコミット {1}\n日付 {2}\nシェル {3}\nレンダラー {4}\nNode {5}\nアーキテクチャ {6}", - "okButton": "OK" + "aboutDetail": "バージョン {0}\nコミット {1}\n日付 {2}\nシェル {3}\nレンダラー {4}\nNode {5}\nアーキテクチャ {6}", + "okButton": "OK", + "copy": "コピー (&&C)" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/jpn/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..4c84c291c572 --- /dev/null +++ b/i18n/jpn/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "この間に次のファイルが変更されました: {0}", + "summary.0": "編集は行われませんでした", + "summary.nm": "{1} 個のファイルで {0} 件のテキスト編集を実行", + "summary.n0": "1 つのファイルで {0} 個のテキストを編集" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 1d383dff2bb9..f8dc120d025d 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,7 +10,11 @@ "fontSize": "フォント サイズをピクセル単位で制御します。", "lineHeight": "行の高さを制御します。fontSize に基づいて lineHeight を計算する場合には、0 を使用します。", "letterSpacing": "文字の間隔をピクセル単位で制御します。", - "lineNumbers": "行番号の表示を制御します。使用可能な値は、'on'、'off'、および 'relative' です。'relative' は現在のカーソル位置からの行数を示します。", + "lineNumbers.off": "行番号は表示されません。", + "lineNumbers.on": "行番号は、絶対数として表示されます。", + "lineNumbers.relative": "行番号は、カーソル位置までの行数として表示されます。", + "lineNumbers.interval": "行番号は 10 行ごとに表示されます。", + "lineNumbers": "行番号の表示を制御します。使用可能な値は、'on'、'off'、および 'relative' です。", "rulers": "等幅フォントの特定番号の後ろに垂直ルーラーを表示します。複数のルーラーには複数の値を使用します。配列が空の場合はルーラーを表示しません。", "wordSeparators": "単語に関連したナビゲーションまたは操作を実行するときに、単語の区切り文字として使用される文字", "tabSize": "1 つのタブに相当するスペースの数。`editor.detectIndentation` がオンの場合、この設定はファイル コンテンツに基づいて上書きされます。", @@ -89,8 +93,8 @@ "links": "エディターがリンクを検出してクリック可能な状態にするかどうかを制御します", "colorDecorators": "エディターでインライン カラー デコレーターと色の選択を表示する必要があるかどうかを制御します。", "codeActions": "コード アクション (lightbulb) を有効にする", + "selectionClipboard": "Linux の PRIMARY クリップボードをサポートするかどうかを制御します。", "sideBySide": "差分エディターが差分を横に並べて表示するか、行内に表示するかを制御します", "ignoreTrimWhitespace": "差分エディターが、先頭または末尾の空白の変更を差分として表示するかどうかを制御します。", - "renderIndicators": "差分エディターが追加/削除された変更に +/- インジケーターを示すかどうかを制御します", - "selectionClipboard": "Linux の PRIMARY クリップボードをサポートするかどうかを制御します。" + "renderIndicators": "差分エディターが追加/削除された変更に +/- インジケーターを示すかどうかを制御します" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/jpn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..f800170e7d30 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "ブラケットへ移動" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/jpn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..ba2310b3ed55 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "キャレットを左に移動", + "caret.moveRight": "キャレットを右に移動" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/jpn/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..22876b64d425 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "文字の入れ替え" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/jpn/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..d52c3575c45a --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "切り取り", + "actions.clipboard.copyLabel": "コピー", + "actions.clipboard.pasteLabel": "貼り付け", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "構文を強調表示してコピー" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/jpn/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..dbb6b93c0b6d --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "行コメントの切り替え", + "comment.line.add": "行コメントの追加", + "comment.line.remove": "行コメントの削除", + "comment.block": "ブロック コメントの切り替え" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/jpn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..070e2831f8a7 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "エディターのコンテキスト メニューの表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json b/i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..93947cdf9cec --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "検索", + "findNextMatchAction": "次を検索", + "findPreviousMatchAction": "前を検索", + "nextSelectionMatchFindAction": "次の選択項目を検索", + "previousSelectionMatchFindAction": "前の選択項目を検索", + "startReplace": "置換", + "showNextFindTermAction": "次の検索語句を表示", + "showPreviousFindTermAction": "前の検索語句を表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..4dc327d6de82 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "検索", + "placeholder.find": "検索", + "label.previousMatchButton": "前の一致項目", + "label.nextMatchButton": "次の一致項目", + "label.toggleSelectionFind": "選択範囲を検索", + "label.closeButton": "閉じる", + "label.replace": "置換", + "placeholder.replace": "置換", + "label.replaceButton": "置換", + "label.replaceAllButton": "すべて置換", + "label.toggleReplaceButton": "置換モードの切り替え", + "title.matchesCountLimit": "最初の {0} 件の結果だけが強調表示されますが、すべての検索操作はテキスト全体で機能します。", + "label.matchesLocation": "{0} / {1} 件", + "label.noResults": "結果なし" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..19f4b3b0c2de --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "検索", + "placeholder.find": "検索", + "label.previousMatchButton": "前の一致項目", + "label.nextMatchButton": "次の一致項目", + "label.closeButton": "閉じる" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/jpn/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..9d34d92b9263 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "展開", + "unFoldRecursivelyAction.label": "再帰的に展開", + "foldAction.label": "折りたたみ", + "foldRecursivelyAction.label": "再帰的に折りたたむ", + "foldAllBlockComments.label": "すべてのブロック コメントの折りたたみ", + "foldAllAction.label": "すべて折りたたみ", + "unfoldAllAction.label": "すべて展開", + "foldLevelAction.label": "折りたたみレベル {0}" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..077fe93a291e --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "行 {0} で 1 つの書式設定を編集", + "hintn1": "行 {1} で {0} 個の書式設定を編集", + "hint1n": "行 {0} と {1} の間で 1 つの書式設定を編集", + "hintnn": "行 {1} と {2} の間で {0} 個の書式設定を編集", + "no.provider": "申し訳ありません。インストールされた '{0}'ファイル用のフォーマッターが存在しません。", + "formatDocument.label": "ドキュメントのフォーマット", + "formatSelection.label": "選択範囲のフォーマット" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..624f9b7af703 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "'{0}' の定義は見つかりません", + "generic.noResults": "定義が見つかりません", + "meta.title": " – {0} 個の定義", + "actions.goToDecl.label": "定義へ移動", + "actions.goToDeclToSide.label": "定義を横に開く", + "actions.previewDecl.label": "定義をここに表示", + "goToImplementation.noResultWord": "'{0}' の実装が見つかりません", + "goToImplementation.generic.noResults": "実装が見つかりません", + "meta.implementations.title": "– {0} 個の実装", + "actions.goToImplementation.label": "実装に移動", + "actions.peekImplementation.label": "実装のプレビュー", + "goToTypeDefinition.noResultWord": "'{0}' の型定義が見つかりません", + "goToTypeDefinition.generic.noResults": "型定義が見つかりません", + "meta.typeDefinitions.title": " – {0} 個の型定義", + "actions.goToTypeDefinition.label": "型定義へ移動", + "actions.peekTypeDefinition.label": "型定義を表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..f918ba9f96d5 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "クリックして、{0} の定義を表示します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..53ea71a9d4e2 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "次のエラーまたは警告へ移動", + "markerAction.previous.label": "前のエラーまたは警告へ移動", + "editorMarkerNavigationError": "エディターのマーカー ナビゲーション ウィジェットのエラーの色。", + "editorMarkerNavigationWarning": "エディターのマーカー ナビゲーション ウィジェットの警告の色。", + "editorMarkerNavigationInfo": "エディターのマーカー ナビゲーション ウィジェットの情報の色。", + "editorMarkerNavigationBackground": "エディターのマーカー ナビゲーション ウィジェットの背景。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/jpn/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..13ad71627195 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "ホバーの表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/jpn/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..7606a08044a1 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "読み込んでいます..." +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/jpn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..2136e47678d6 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "前の値に置換", + "InPlaceReplaceAction.next.label": "次の値に置換" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..94408494ff62 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "インデントをスペースに変換", + "indentationToTabs": "インデントをタブに変換", + "configuredTabSize": "構成されたタブのサイズ", + "selectTabWidth": "現在のファイルのタブのサイズを選択", + "indentUsingTabs": "タブによるインデント", + "indentUsingSpaces": "スペースによるインデント", + "detectIndentation": "内容からインデントを検出", + "editor.reindentlines": "行の再インデント" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/jpn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..a9fd8094ec7c --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "行を上へコピー", + "lines.copyDown": "行を下へコピー", + "lines.moveUp": "行を上へ移動", + "lines.moveDown": "行を下へ移動", + "lines.sortAscending": "行を昇順に並べ替え", + "lines.sortDescending": "行を降順に並べ替え", + "lines.trimTrailingWhitespace": "末尾の空白のトリミング", + "lines.delete": "行の削除", + "lines.indent": "行のインデント", + "lines.outdent": "行のインデント解除", + "lines.insertBefore": "行を上に挿入", + "lines.insertAfter": "行を下に挿入", + "lines.deleteAllLeft": "左側をすべて削除", + "lines.deleteAllRight": "右側をすべて削除", + "lines.joinLines": "行をつなげる", + "editor.transpose": "カーソルの周囲の文字を入れ替える", + "editor.transformToUppercase": "大文字に変換", + "editor.transformToLowercase": "小文字に変換" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/links/links.i18n.json b/i18n/jpn/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..e00353168e9a --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "command キーを押しながらクリックしてリンク先を表示", + "links.navigate": "Ctrl キーを押しながらクリックしてリンク先を表示", + "links.command.mac": "command キーを押しながらクリックしてコマンドを実行", + "links.command": "Ctrl キーを押しながらクリックしてコマンドを実行", + "links.navigate.al": "Altl キーを押しながらクリックしてリンク先を表示", + "links.command.al": "Alt キーを押しながらクリックしてコマンドを実行", + "invalid.url": "申し訳ありません。このリンクは形式が正しくないため開くことができませんでした: {0}", + "missing.url": "申し訳ありません。このリンクはターゲットが存在しないため開くことができませんでした。", + "label": "リンクを開く" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/jpn/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..0df6dca88c6c --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "カーソルを上に挿入", + "mutlicursor.insertBelow": "カーソルを下に挿入", + "mutlicursor.insertAtEndOfEachLineSelected": "カーソルを行末に挿入", + "addSelectionToNextFindMatch": "選択した項目を次の一致項目に追加", + "addSelectionToPreviousFindMatch": "選んだ項目を前の一致項目に追加する", + "moveSelectionToNextFindMatch": "最後に選択した項目を次の一致項目に移動", + "moveSelectionToPreviousFindMatch": "最後に選んだ項目を前の一致項目に移動する", + "selectAllOccurrencesOfFindMatch": "一致するすべての出現箇所を選択します", + "changeAll.label": "すべての出現箇所を変更" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..64d3d836869c --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "パラメーター ヒントをトリガー" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..4ea56b2c8da6 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}、ヒント" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/jpn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..14dcd69b4a6e --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "修正プログラム ({0}) を表示する", + "quickFix": "修正プログラムを表示する", + "quickfix.trigger.label": "クイック修正" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..e6139bff3490 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "閉じる" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..0040e3675d81 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": "– {0} 個の参照", + "references.action.label": "すべての参照の検索" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..b31a080bc820 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "読み込んでいます..." +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..00407b4d7e34 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "列 {2} の {1} 行目に {0} つのシンボル", + "aria.fileReferences.1": "{0} に 1 個のシンボル、完全なパス {1}", + "aria.fileReferences.N": "{1} に {0} 個のシンボル、完全なパス {2}", + "aria.result.0": "一致する項目はありません", + "aria.result.1": "{0} に 1 個のシンボルが見つかりました", + "aria.result.n1": "{1} に {0} 個のシンボルが見つかりました", + "aria.result.nm": "{1} 個のファイルに {0} 個のシンボルが見つかりました" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..8fedf2e46b02 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "ファイルを解決できませんでした。", + "referencesCount": "{0} 個の参照", + "referenceCount": "{0} 個の参照", + "missingPreviewMessage": "プレビューを表示できません", + "treeAriaLabel": "参照", + "noResults": "結果がありません", + "peekView.alternateTitle": "参照", + "peekViewTitleBackground": "ピーク ビューのタイトル領域の背景色。", + "peekViewTitleForeground": "ピーク ビュー タイトルの色。", + "peekViewTitleInfoForeground": "ピーク ビューのタイトル情報の色。", + "peekViewBorder": "ピーク ビューの境界と矢印の色。", + "peekViewResultsBackground": "ピーク ビュー結果リストの背景色。", + "peekViewResultsMatchForeground": "ピーク ビュー結果リストのライン ノードの前景色。", + "peekViewResultsFileForeground": "ピーク ビュー結果リストのファイル ノードの前景色。", + "peekViewResultsSelectionBackground": "ピーク ビュー結果リストの選択済みエントリの背景色。", + "peekViewResultsSelectionForeground": "ピーク ビュー結果リストの選択済みエントリの前景色。", + "peekViewEditorBackground": "ピーク ビュー エディターの背景色。", + "peekViewEditorGutterBackground": "ピーク ビュー エディターの余白の背景色。", + "peekViewResultsMatchHighlight": "ピーク ビュー結果リストの一致した強調表示色。", + "peekViewEditorMatchHighlight": "ピーク ビュー エディターの一致した強調表示色。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/jpn/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..65225095897b --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "結果がありません。", + "aria": "'{0}' から '{1}' への名前変更が正常に完了しました。概要: {2}", + "rename.failed": "申し訳ありません。名前の変更を実行できませんでした。", + "rename.label": "シンボルの名前を変更" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/jpn/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..3978f544c8bc --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "名前変更入力。新しい名前を入力し、Enter キーを押してコミットしてください。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/jpn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..381a45a7bda1 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "選択範囲を拡大", + "smartSelect.shrink": "選択範囲を縮小" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/jpn/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..1c7707699b8b --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "'{0}' が次のテキストを挿入したことを承認しています: {1}", + "suggest.trigger.label": "候補をトリガー" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..65e2583d291f --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "候補のウィジェットの背景色。", + "editorSuggestWidgetBorder": "候補ウィジェットの境界線色。", + "editorSuggestWidgetForeground": "候補ウィジェットの前景色。", + "editorSuggestWidgetSelectedBackground": "候補ウィジェット内で選択済みエントリの背景色。", + "editorSuggestWidgetHighlightForeground": "候補のウィジェット内で一致したハイライトの色。", + "readMore": "詳細を表示...{0}", + "suggestionWithDetailsAriaLabel": "{0}、候補、詳細あり", + "suggestionAriaLabel": "{0}、候補", + "readLess": "詳細を隠す...{0}", + "suggestWidget.loading": "読み込んでいます...", + "suggestWidget.noSuggestions": "候補はありません。", + "suggestionAriaAccepted": "{0}、受け入れ済み", + "ariaCurrentSuggestionWithDetails": "{0}、候補、詳細あり", + "ariaCurrentSuggestion": "{0}、候補" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/jpn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..63cb60134963 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Tab キーを切り替えるとフォーカスが移動します" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/jpn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..8eac21c6979b --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "変数の読み取りなど読み取りアクセス中のシンボルの背景色。", + "wordHighlightStrong": "変数への書き込みなど書き込みアクセス中のシンボルの背景色。", + "overviewRulerWordHighlightForeground": "シンボルを強調表示するときの概要ルーラーのマーカー色。", + "overviewRulerWordHighlightStrongForeground": "書き込みアクセス シンボルを強調表示するときの概要ルーラーのマーカー色。", + "wordHighlight.next.label": "次のシンボル ハイライトに移動", + "wordHighlight.previous.label": "前のシンボル ハイライトに移動" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json index 1545142948e8..f118af6afc07 100644 --- a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json @@ -12,6 +12,8 @@ "newWindow": "新しい Code のインスタンスを強制します。", "performance": "'Developer: Startup Performance' コマンドを有効にして開始します。", "prof-startup": "起動中に CPU プロファイラーを実行する", + "inspect-extensions": "拡張機能のデバッグとプロファイリングを許可します。接続 URI を開発者ツールでチェックします。", + "inspect-brk-extensions": "起動後に一時停止されている拡張ホストとの拡張機能のデバッグとプロファイリングを許可します。接続 URI を開発者ツールでチェックします。", "reuseWindow": "最後のアクティブ ウィンドウにファイルまたはフォルダーを強制的に開きます。", "userDataDir": "ユーザー データを保持するディレクトリを指定します。ルートで実行している場合に役立ちます。", "verbose": "詳細出力を表示します (--wait を含みます)。", @@ -24,6 +26,7 @@ "experimentalApis": "拡張機能に対して Proposed API 機能を有効にします。", "disableExtensions": "インストールされたすべての拡張機能を無効にします。", "disableGPU": "GPU ハードウェア アクセラレータを無効にします。", + "status": "プロセスの使用状況や診断情報を印刷します。", "version": "バージョンを表示します。", "help": "使用法を表示します。", "usage": "使用法", diff --git a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index a05edf2d3269..825d9775739a 100644 --- a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "拡張子が見つかりません", - "noCompatible": "Code のこのバージョンと互換性のある {0} のバージョンが見つかりませんでした。" + "notCompatibleDownload": "VS Code の現在のバージョン '{0}' と互換性を持つ拡張機能が見つからないため、ダウンロードできません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index c6bfbf6288ec..9901a3c82e48 100644 --- a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "正しくない拡張機能: package.json は JSON ファイルではありません。", "restartCodeLocal": "{0} を再インストールする前に、Code を再起動してください。", - "restartCodeGallery": "再インストールする前に Code を再起動してください。", + "installingOutdatedExtension": "この拡張機能の新しいバージョンが既にインストールされています。古いバージョンでこれを上書きしますか?", + "override": "上書き", + "cancel": "キャンセル", + "notFoundCompatible": "VS Code の現在のバージョン '{1}' と互換性を持つ拡張機能 '{0}' が見つからないため、インストールできません。", + "quitCode": "拡張機能の古いインスタンスがまだ実行中であるため、インストールできません。再インストール前に VS Code の終了と起動を実施してください。", + "exitCode": "拡張機能の古いインスタンスがまだ実行中であるため、インストールできません。再インストール前に VS Code の終了と起動を実施してください。", + "notFoundCompatibleDependency": "VS Code の現在のバージョン '{1}' と互換性を持つ、依存関係がある拡張機能 '{0}' が見つからないため、インストールできません。", "uninstallDependeciesConfirmation": "'{0}' のみをアンインストールしますか、または依存関係もアンインストールしますか?", "uninstallOnly": "限定", "uninstallAll": "すべて", - "cancel": "キャンセル", "uninstallConfirmation": "'{0}' をアンインストールしてもよろしいですか?", "ok": "OK", "singleDependentError": "拡張機能 '{0}' をアンインストールできません。拡張機能 '{1}' がこの拡張機能に依存しています。", diff --git a/i18n/jpn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/jpn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index ebcd92b7c614..5697bde4907f 100644 --- a/i18n/jpn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -17,6 +17,8 @@ "vscode.extension.activationEvents.onLanguage": "指定された言語を解決するファイルが開かれるたびにアクティブ化イベントが発行されます。", "vscode.extension.activationEvents.onCommand": "指定したコマンドが呼び出されるたびにアクティブ化イベントが発行されます。", "vscode.extension.activationEvents.onDebug": "デバッグの開始またはデバッグ構成がセットアップされるたびにアクティブ化イベントが発行されます。", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "\"launch.json\" を作成する必要があるたびに (または、すべての provideDebugConfiguration メソッドを呼び出す必要があるたびに) アクティブ化イベントを発行します。", + "vscode.extension.activationEvents.onDebugResolve": "特定のタイプのデバッグ セッションが起動されるたびに(または、対応する resolveDebugConfiguration メソッドを呼び出す必要があるたびに)、アクティブ化イベントを発行します。", "vscode.extension.activationEvents.workspaceContains": "指定した glob パターンに一致するファイルを少なくとも 1 つ以上含むフォルダーを開くたびにアクティブ化イベントが発行されます。", "vscode.extension.activationEvents.onView": "指定したビューを展開するたびにアクティブ化イベントが発行されます。", "vscode.extension.activationEvents.star": "VS Code 起動時にアクティブ化イベントを発行します。優れたエンドユーザー エクスペリエンスを確保するために、他のアクティブ化イベントの組み合わせでは望む動作にならないときのみ使用してください。", diff --git a/i18n/jpn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/jpn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..1b05e7b19899 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "タブ表示の切り替え", + "view": "表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json index eb0a55347139..07c224802d68 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "largeNumberBadge": "10k+", "badgeTitle": "{0} - {1}", "additionalViews": "その他のビュー", "numberBadge": "{0} ({1})", diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 5c802777acf6..9e1f0ccd5c36 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "以前のエディターを開く", "nextEditorInGroup": "グループ内で次のエディターを開く", "openPreviousEditorInGroup": "グループ内で前のエディターを開く", + "lastEditorInGroup": "グループ内の最後のエディターを開く", "navigateNext": "次に進む", "navigatePrevious": "前に戻る", "navigateLast": "戻る", diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index fe4cd3037246..31949627cfd9 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "タブまたはグループ別にアクティブ エディターを移動する", "editorCommand.activeEditorMove.arg.name": "アクティブ エディターの Move 引数", - "editorCommand.activeEditorMove.arg.description": "引数プロパティ:\n\t\t\t\t\t\t* 'to': 引数プロパティ\n\t\t\t\t\t\t* 'by': 移動に使用する単位を指定する文字列値。タブ別またはグループ別。\n\t\t\t\t\t\t* 'value': 移動する位置数と絶対位置を指定する数値。\n\t\t\t\t\t", + "editorCommand.activeEditorMove.arg.description": "引数プロパティ:\n\t* 'to': 移動先を指定する文字列値。\n\t* 'by': 移動の単位を指定する文字列値。タブ別またはグループ別。\n\t* 'value': 移動の位置数もしくは絶対位置を指定する数値。", "commandDeprecated": "コマンド **{0}** は削除されました。代わりに **{1}** を使用できます", "openKeybindings": "ショートカット キーの構成" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 9a2136e7640b..805958bc01f5 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "はい", "screenReaderDetectedExplanation.answerNo": "いいえ", "screenReaderDetectedExplanation.body1": "VS Codeは現在スクリーンリーダーの使用状況に最適化されています。", - "screenReaderDetectedExplanation.body2": "いくつかのエディター機能が通常と異なる動作をします。例: 折り返し、折りたたみ、かっこの自動閉じなど" + "screenReaderDetectedExplanation.body2": "いくつかのエディター機能が通常と異なる動作をします。例: 折り返し、折りたたみなど" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/quickopen.i18n.json b/i18n/jpn/src/vs/workbench/browser/quickopen.i18n.json index b598142bc87f..6d4bf4f79fac 100644 --- a/i18n/jpn/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "一致する結果はありません", - "noResultsFound2": "一致する項目はありません", - "entryAriaLabel": "{0}、コマンド" + "noResultsFound2": "一致する項目はありません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json index a31924013b26..2da6de5555b6 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "最近開いた項目…", "quickOpenRecent": "最近使用したものを開く...", "closeMessages": "通知メッセージを閉じる", - "reportIssues": "問題の報告", + "reportIssueInEnglish": "問題の報告", "reportPerformanceIssue": "パフォーマンスの問題のレポート", "keybindingsReference": "キーボード ショートカットの参照", "openDocumentationUrl": "ドキュメント", @@ -47,5 +47,25 @@ "showNextWindowTab": "次のウィンドウ タブを表示", "moveWindowTabToNewWindow": "ウィンドウ タブを新しいウィンドウに移動", "mergeAllWindowTabs": "すべてのウィンドウを統合", - "toggleWindowTabsBar": "ウィンドウ タブ バーの切り替え" + "toggleWindowTabsBar": "ウィンドウ タブ バーの切り替え", + "configureLocale": "言語を構成する", + "displayLanguage": "VSCode の表示言語を定義します。", + "doc": "サポートされている言語の一覧については、{0} をご覧ください。", + "restart": "値を変更するには VS Code の再起動が必要です。", + "fail.createSettings": "'{0}' ({1}) を作成できません。", + "openLogsFolder": "ログ フォルダーを開く", + "showLogs": "ログの表示...", + "mainProcess": "メイン", + "sharedProcess": "共有", + "rendererProcess": "レンダラー", + "extensionHost": "拡張機能ホスト", + "selectProcess": "プロセスの選択", + "setLogLevel": "ログ レベルの設定", + "trace": "トレース", + "debug": "デバッグ", + "info": "情報", + "warn": "警告", + "err": "エラー", + "critical": "重大", + "off": "オフ" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 2601b1510630..2f2b510b284b 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "表示", "help": "ヘルプ", "file": "ファイル", - "workspaces": "ワークスペース", "developer": "開発者", + "workspaces": "ワークスペース", "showEditorTabs": "開いているエディターをタブに表示するかどうかを制御します。", "workbench.editor.labelFormat.default": "ファイルの名前を表示します。タブが有効かつ 1 つのグループ内の 2 つの同名ファイルがあるときに各ファイルのパスの区切り記号が追加されます。タブを無効にすると、エディターがアクティブな時にワークスペース フォルダーの相対パスが表示されます。", "workbench.editor.labelFormat.short": "ディレクトリ名に続けてファイル名を表示します。", @@ -16,6 +16,7 @@ "workbench.editor.labelFormat.long": "絶対パスに続けてファイル名を表示します。", "tabDescription": "エディターのラベルの書式を制御します。例としてこの設定を変更することでファイルの場所を理解しやすくなります:\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent',  別タブで、同じタイトルを共有する場合や、相対的なワークスペース パス タブが無効になっている場合", "editorTabCloseButton": "エディター タブの閉じるボタンの位置を制御するか、[off] に設定した場合に無効にします。", + "tabSizing": "エディターのタブの大きさを制御します。常に完全なエディター ラベルを表示するのに足りるタブの大きさを維持するには 'fit' を設定します。すべてのタブを一度に表示するには利用可能なスペースが足りない場合に、タブを縮小可能にするには 'shrink' を設定します。", "showIcons": "開いているエディターをアイコンで表示するかどうかを制御します。これには、アイコンのテーマを有効にする必要もあります。", "enablePreview": "開かれるエディターをプレビューとして表示するかどうかを制御します。プレビュー エディターは (例: ダブル クリックまたは編集などによって) 変更される時まで再利用し、斜体で表示します。", "enablePreviewFromQuickOpen": "Quick Open で開いたエディターをプレビューとして表示するかどうかを制御します。プレビュー エディターは、保持されている間、再利用されます (ダブルクリックまたは編集などによって)。", @@ -26,18 +27,17 @@ "closeOnFocusLost": "フォーカスを失ったときに Quick Open を自動的に閉じるかどうかを制御します。", "openDefaultSettings": "設定を開くとすべての既定の設定を表示するエディターも開くかどうかを制御します。", "sideBarLocation": "サイド バーの位置を制御します。ワークベンチの左右のいずれかに表示できます。", - "panelLocation": "パネルの位置を制御します。ワークベンチの下部または右のいずれかに表示できます。", "statusBarVisibility": "ワークベンチの下部にステータス バーを表示するかどうかを制御します。", "activityBarVisibility": "ワークベンチでのアクティビティ バーの表示をコントロールします。", "closeOnFileDelete": "ファイルを表示しているエディターを、ファイルが削除されるかその他のプロセスによって名前を変更された場合に、自動的に閉じるかどうかを制御します。これを無効にすると、このような場合にエディターはダーティで開かれたままになります。アプリケーション内で削除すると、必ずエディターは閉じられ、ダーティ ファイルは閉じられることがなく、データは保存されませんのでご注意ください。", - "experimentalFuzzySearchEndpoint": "試験的な設定検索で使用するエンドポイントを指定します。", - "experimentalFuzzySearchKey": "試験的な設定検索で使用するキーを指定します。", + "enableNaturalLanguageSettingsSearch": "設定で自然文検索モードを有効にするかどうかを制御します。", "fontAliasing": "ワークベンチのフォント エイリアシング方法を制御します。\n- default: サブピクセル方式でフォントを滑らかにします。ほとんどの非 Retina ディスプレイでもっとも鮮明なテキストを提供します\n- antialiased: サブピクセルとは対照的に、ピクセルのレベルでフォントを滑らかにします。フォント全体がより細く見えます\n- none: フォントのスムージングを無効にします。テキストをぎざぎざな尖ったエッジで表示します", "workbench.fontAliasing.default": "サブピクセル方式でフォントを滑らかにします。ほとんどの非 Retina ディスプレイでもっとも鮮明なテキストを提供します。", "workbench.fontAliasing.antialiased": "サブピクセルとは対照的に、ピクセルのレベルでフォントを滑らかにします。フォント全体がより細く見えるようになります。", "workbench.fontAliasing.none": "フォントのスムージングを無効にします。テキストをぎざぎざな尖ったエッジで表示します。", "swipeToNavigate": "3 本の指で横方向にスワイプすると、開いているファイル間を移動できます。", "workbenchConfigurationTitle": "ワークベンチ", + "windowConfigurationTitle": "ウィンドウ", "window.openFilesInNewWindow.on": "新しいウィンドウでファイルを開きます", "window.openFilesInNewWindow.off": "ファイルのフォルダーが開かれていたウィンドウまたは最後のアクティブ ウィンドウでファイルを開きます", "window.openFilesInNewWindow.default": "ファイルのフォルダーが開かれていたウィンドウでファイルを開くか、Dock または Finder を使用して開く場合以外は最後のアクティブ ウィンドウでファイルを開きます (macOS のみ)", @@ -69,11 +69,11 @@ "autoDetectHighContrast": "有効にすると、Windows でハイ コントラスト テーマが使用されている場合にはハイ コントラスト テーマに自動的に変更され、Windows のハイ コントラスト テーマから切り替えられている場合にはダーク テーマに自動的に変更されます。", "titleBarStyle": "ウィンドウのタイトル バーの外観を調整します。変更を適用するには、完全に再起動する必要があります。", "window.nativeTabs": "macOS Sierra ウィンドウ タブを有効にします。この変更を適用するには完全な再起動が必要であり、ネイティブ タブでカスタムのタイトル バー スタイルが構成されていた場合はそれが無効になることに注意してください。", - "windowConfigurationTitle": "ウィンドウ", "zenModeConfigurationTitle": "Zen Mode", "zenMode.fullScreen": "Zen Mode をオンにするとワークベンチを自動的に全画面モードに切り替えるかどうかを制御します。", "zenMode.hideTabs": "Zen Mode をオンにしたときにワークベンチ タブも非表示にするかどうかを制御します。", "zenMode.hideStatusBar": "Zen Mode をオンにするとワークベンチの下部にあるステータス バーを非表示にするかどうかを制御します。", "zenMode.hideActivityBar": "Zen Mode をオンにするとワークベンチの左側にあるアクティビティ バーを非表示にするかを制御します。", - "zenMode.restore": "Zen Mode で終了したウィンドウを Zen Mode に復元するかどうかを制御します。" + "zenMode.restore": "Zen Mode で終了したウィンドウを Zen Mode に復元するかどうかを制御します。", + "JsonSchema.locale": "使用する UI 言語。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 7e7505788b62..57ba460378dd 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "ブレークポイントの非アクティブ化", "reapplyAllBreakpoints": "すべてのブレークポイントを再適用する", "addFunctionBreakpoint": "関数ブレークポイントの追加", - "renameFunctionBreakpoint": "関数ブレークポイントの名前変更", "addConditionalBreakpoint": "条件付きブレークポイントの追加...", "editConditionalBreakpoint": "ブレークポイントの編集...", "setValue": "値の設定", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..69243c770fa6 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "ブレークポイントの編集...", + "functionBreakpointsNotSupported": "このデバッグの種類では関数ブレークポイントはサポートされていません", + "functionBreakpointPlaceholder": "中断対象の関数", + "functionBreakPointInputAriaLabel": "関数ブレークポイントを入力します" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..9151cc827386 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "コール スタック セクション", + "debugStopped": "{0} で一時停止", + "callStackAriaLabel": "コール スタックのデバッグ", + "process": "プロセス", + "paused": "一時停止", + "running": "実行しています", + "thread": "スレッド", + "pausedOn": "{0} で一時停止", + "loadMoreStackFrames": "スタック フレームをさらに読み込む", + "threadAriaLabel": "スレッド {0}、呼び出しスタック、デバッグ", + "stackFrameAriaLabel": "スタック フレーム {0} 行 {1} {2}、呼び出しスタック、デバッグ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 5a3751ca8837..355c26ee0394 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,10 @@ "openExplorerOnEnd": "デバッグ セッションの終わりにエクスプローラ ビューを自動的に開きます", "inlineValues": "デバッグ中にエディターの行内に変数値を表示します", "hideActionBar": "浮動デバッグ操作バーを非表示にするかどうかを制御します", + "never": "今後ステータス バーにデバッグを表示しない", + "always": "ステータス バーにデバッグを常に表示する", + "onFirstSessionStart": "初めてデバッグが開始されたときのみステータス バーにデバッグを表示する", + "showInStatusBar": "デバッグのステータス バーが表示されるタイミングを制御", + "openDebug": "デバッグ ビューレットを開くか、デバッグ セッションを開始するかを制御します。", "launch": "グローバル デバッグ起動構成。ワークスペース間で共有される 'launch.json' の代わりとして使用する必要があります" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index e158385ba5c3..2c8374a39990 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "ブレークポイントを追加しました。行 {0}、ファイル {1}", "breakpointRemoved": "ブレークポイントを削除しました。行 {0}、ファイル {1}", "compoundMustHaveConfigurations": "複合構成を開始するには、複合に \"configurations\" 属性が設定されている必要があります。", - "configMissing": "構成 '{0}' が 'launch.json' 内にありません。", "debugRequestNotSupported": "選択しているデバッグ構成で `{0}` 属性はサポートされない値 '{1}' を指定しています。", "debugRequesMissing": "選択しているデバッグ構成に属性 '{0}' が含まれていません。", "debugTypeNotSupported": "構成されているデバッグの種類 '{0}' はサポートされていません。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..b9fef75377e3 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "変数セクション", + "variablesAriaTreeLabel": "変数のデバッグ", + "variableValueAriaLabel": "新しい変数値を入力する", + "variableScopeAriaLabel": "範囲 {0}、変数、デバッグ", + "variableAriaLabel": "{0} 値 {1}、変数、デバッグ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..0a37345b7ff0 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "式セクション", + "watchAriaTreeLabel": "ウォッチ式のデバッグ", + "watchExpressionPlaceholder": "ウォッチ対象の式", + "watchExpressionInputAriaLabel": "ウォッチ式を入力します", + "watchExpressionAriaLabel": "{0} 値 {1}、ウォッチ、デバッグ", + "watchVariableAriaLabel": "{0} 値 {1}、ウォッチ、デバッグ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index 16b98008acb1..ef96b090eca9 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "拡張機能名", "extension id": "拡張機能の識別子", + "preview": "プレビュー", "publisher": "発行者名", "install count": "インストール数", "rating": "評価", + "repository": "リポジトリ", "license": "ライセンス", "details": "詳細", "contributions": "コントリビューション", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index f9111aed1949..9c5f174d8ac6 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "アンインストールしています", "updateAction": "更新", "updateTo": "{0} に更新します", - "enableForWorkspaceAction.label": "有効にする (ワークスペース)", - "enableAlwaysAction.label": "常に有効にする", - "disableForWorkspaceAction.label": "無効にする (ワークスペース)", - "disableAlwaysAction.label": "常に無効にする", "ManageExtensionAction.uninstallingTooltip": "アンインストールしています", - "enableForWorkspaceAction": "ワークスペース", - "enableGloballyAction": "常に行う", + "enableForWorkspaceAction": "有効にする (ワークスペース)", + "enableGloballyAction": "有効", "enableAction": "有効", - "disableForWorkspaceAction": "ワークスペース", - "disableGloballyAction": "常に行う", + "disableForWorkspaceAction": "無効にする (ワークスペース)", + "disableGloballyAction": "無効にする", "disableAction": "無効にする", "checkForUpdates": "更新の確認", "enableAutoUpdate": "拡張機能の自動更新を有効にする", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "このワークスペースに推奨されているすべての拡張機能はすでにインストールされています", "installRecommendedExtension": "おすすめの拡張機能のインストール", "extensionInstalled": "推奨された拡張機能がすでにインストールされています", - "showRecommendedKeymapExtensions": "推奨のキーマップを表示する", "showRecommendedKeymapExtensionsShort": "キーマップ", - "showLanguageExtensions": "言語の拡張機能を表示", "showLanguageExtensionsShort": "言語の拡張機能", - "showAzureExtensions": "Azure 拡張機能の表示", "showAzureExtensionsShort": "Azure 拡張機能", "OpenExtensionsFile.failed": "'.vscode' ファルダー ({0}) 内に 'extensions.json' ファイルを作成できません。", "configureWorkspaceRecommendedExtensions": "推奨事項の拡張機能を構成 (ワークスペース)", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..2fd0e4b1fd47 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ratedByUsers": "{0} 人が評価" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..157e34cb4b64 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectAndStartDebug": "クリックしてプロファイリングを停止します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index e9f31ea4af64..58fdc20d9168 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -7,9 +7,11 @@ "extensionsCommands": "拡張機能の管理", "galleryExtensionsCommands": "ギャラリー拡張機能のインストール", "extension": "拡張機能", + "runtimeExtension": "実行中の拡張機能", "extensions": "拡張機能", "view": "表示", + "developer": "開発者", "extensionsConfigurationTitle": "拡張機能", "extensionsAutoUpdate": "拡張機能を自動的に更新します", - "extensionsIgnoreRecommendations": "拡張機能の推奨事項を無視する" + "extensionsIgnoreRecommendations": "true に設定した場合、拡張機能の推奨事項の通知を表示しません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..d3fc13a15e05 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "starActivation": "起動時にアクティブ化", + "workspaceContainsGlobActivation": "ワークスペースで {0} に一致するファイルが存在するとアクティブ化", + "workspaceContainsFileActivation": "ワークスペースに {0} ファイルが存在するとアクティブ化", + "languageActivation": "{0} ファイルが開かれるとアクティブ化", + "workspaceGenericActivation": "{0} 上でアクティブ化", + "errors": "{0} 個の未検出のエラー", + "extensionsInputName": "実行中の拡張機能", + "showRuntimeExtensions": "実行中の拡張機能の表示", + "reportExtensionIssue": "問題の報告", + "extensionHostProfileStart": "拡張機能ホストのプロファイルを開始", + "extensionHostProfileStop": "拡張機能ホストのプロファイルを停止", + "saveExtensionHostProfile": "拡張機能ホストのプロファイルを保存" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/browser/fileActions.i18n.json index a17a249ed455..2ef009f9c59c 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/browser/fileActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -69,5 +69,7 @@ "invalidFileNameError": "名前 **{0}** がファイル名またはフォルダー名として無効です。別の名前を指定してください。", "filePathTooLongError": "名前 **{0}** のパスが長すぎます。名前を短くしてください。", "compareWithSaved": "保存済みファイルと作業中のファイルを比較", - "modifiedLabel": "{0} (ローカル) ↔ {1}" + "modifiedLabel": "{0} (ローカル) ↔ {1}", + "compareWithClipboard": "クリップボードとアクティブ ファイルを比較", + "clipboardComparisonLabel": "クリップボード ↔ {0}" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..7b7ea0200a00 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "フォルダー" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..763061599559 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "ファイル", + "revealInSideBar": "サイド バーに表示", + "acceptLocalChanges": "変更を使用してディスクの内容を上書き", + "revertLocalChanges": "変更を破棄してディスク上の内容に戻る" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..2ef009f9c59c --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "再試行", + "rename": "名前変更", + "newFile": "新しいファイル", + "newFolder": "新しいフォルダー", + "openFolderFirst": "フォルダー内にファイルやフォルダーを作成するには、フォルダーをまず開く必要があります。", + "newUntitledFile": "無題の新規ファイル", + "createNewFile": "新しいファイル", + "createNewFolder": "新しいフォルダー", + "deleteButtonLabelRecycleBin": "ごみ箱に移動(&&M)", + "deleteButtonLabelTrash": "ゴミ箱に移動(&&M)", + "deleteButtonLabel": "削除(&&D)", + "dirtyMessageFolderOneDelete": "保存されていない変更がある 1 個のファイルを含むフォルダーを削除します。続行しますか?", + "dirtyMessageFolderDelete": "保存されていない変更があるファイルを {0} 個含むフォルダーを削除します。続行しますか?", + "dirtyMessageFileDelete": "保存されていない変更があるファイルを削除します。続行しますか?", + "dirtyWarning": "保存しないと変更内容が失われます。", + "confirmMoveTrashMessageFolder": "'{0}' とその内容を削除しますか?", + "confirmMoveTrashMessageFile": "'{0}' を削除しますか?", + "undoBin": "ごみ箱から復元できます。", + "undoTrash": "ゴミ箱から復元できます。", + "doNotAskAgain": "再度表示しない", + "confirmDeleteMessageFolder": "'{0}' とその内容を完全に削除してもよろしいですか?", + "confirmDeleteMessageFile": "'{0}' を完全に削除してもよろしいですか?", + "irreversible": "このアクションは元に戻すことができません。", + "permDelete": "完全に削除", + "delete": "削除", + "importFiles": "ファイルのインポート", + "confirmOverwrite": "保存先のフォルダーに同じ名前のファイルまたはフォルダーが既に存在します。置き換えてもよろしいですか?", + "replaceButtonLabel": "置換(&&R)", + "copyFile": "コピー", + "pasteFile": "貼り付け", + "duplicateFile": "重複", + "openToSide": "横に並べて開く", + "compareSource": "比較対象の選択", + "globalCompareFile": "アクティブ ファイルを比較しています...", + "openFileToCompare": "まずファイルを開いてから別のファイルと比較してください", + "compareWith": "'{0}' と '{1}' を比較", + "compareFiles": "ファイルの比較", + "refresh": "最新の情報に更新", + "save": "保存", + "saveAs": "名前を付けて保存...", + "saveAll": "すべて保存", + "saveAllInGroup": "グループ内のすべてを保存する", + "saveFiles": "すべてのファイルを保存", + "revert": "ファイルを元に戻す", + "focusOpenEditors": "開いているエディターのビューにフォーカスする", + "focusFilesExplorer": "ファイル エクスプローラーにフォーカスを置く", + "showInExplorer": "アクティブ ファイルをサイド バーに表示", + "openFileToShow": "エクスプローラーでファイルを表示するには、ファイルをまず開く必要があります", + "collapseExplorerFolders": "エクスプローラーのフォルダーを折りたたむ", + "refreshExplorer": "エクスプローラーを最新表示する", + "openFileInNewWindow": "新しいウィンドウでアクティブ ファイルを開く", + "openFileToShowInNewWindow": "まずファイルを開いてから新しいウィンドウで開きます", + "revealInWindows": "エクスプローラーで表示", + "revealInMac": "Finder で表示します", + "openContainer": "このアイテムのフォルダーを開く", + "revealActiveFileInWindows": "Windows エクスプローラーでアクティブ ファイルを表示する", + "revealActiveFileInMac": "Finder でアクティブ ファイルを表示する", + "openActiveFileContainer": "アクティブ ファイルを含んでいるフォルダーを開く", + "copyPath": "パスのコピー", + "copyPathOfActive": "アクティブ ファイルのパスのコピー", + "emptyFileNameError": "ファイルまたはフォルダーの名前を指定する必要があります。", + "fileNameExistsError": "**{0}** というファイルまたはフォルダーはこの場所に既に存在します。別の名前を指定してください。", + "invalidFileNameError": "名前 **{0}** がファイル名またはフォルダー名として無効です。別の名前を指定してください。", + "filePathTooLongError": "名前 **{0}** のパスが長すぎます。名前を短くしてください。", + "compareWithSaved": "保存済みファイルと作業中のファイルを比較", + "modifiedLabel": "{0} (ローカル) ↔ {1}", + "compareWithClipboard": "クリップボードとアクティブ ファイルを比較", + "clipboardComparisonLabel": "クリップボード ↔ {0}" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..4f2a963e3591 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "まずファイルを開いてからそのパスをコピーします", + "openFileToReveal": "まずファイルを開いてから表示します" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..5461c0b3fa90 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "エクスプローラーを表示", + "explore": "エクスプローラー", + "view": "表示", + "textFileEditor": "テキスト ファイル エディター", + "binaryFileEditor": "バイナリ ファイル エディター", + "filesConfigurationTitle": "ファイル", + "exclude": "ファイルとフォルダーを除外するための glob パターンを構成します。たとえば、ファイル エクスプローラーではこの設定に基づいてファイルとフォルダーの表示や非表示を決定します。", + "files.exclude.boolean": "ファイル パスの照合基準となる glob パターン。これを true または false に設定すると、パターンがそれぞれ有効/無効になります。", + "files.exclude.when": "一致するファイルの兄弟をさらにチェックします。一致するファイル名の変数として $(basename) を使用します。", + "associations": "言語に対するファイルの関連付け (例 \"*.extension\": \"html\") を構成します。これらの関連付けは、インストールされている言語の既定の関連付けより優先されます。", + "encoding": "ファイルの読み取り/書き込みで使用する既定の文字セット エンコーディング。言語ごとに構成することも可能です。", + "autoGuessEncoding": "有効な場合、ファイルを開くときに文字セット エンコードを推測します。言語ごとに構成することも可能です。", + "eol": "既定の改行文字。LF の場合には \\n を CRLF の場合には \\r\\n を使用してください。", + "trimTrailingWhitespace": "有効にすると、ファイルの保存時に末尾の空白をトリミングします。", + "insertFinalNewline": "有効にすると、ファイルの保存時に最新の行を末尾に挿入します。", + "trimFinalNewlines": "有効にすると、ファイルの保存時に最終行以降の新しい行をトリミングします。", + "files.autoSave.off": "ダーティ ファイルを自動的に保存することはしません。", + "files.autoSave.afterDelay": "'files.autoSaveDelay' で構成された時間の経過後に、ダーティ ファイルを自動的に保存します。", + "files.autoSave.onFocusChange": "エディターがフォーカスを失った時点で、ダーティ ファイルを自動的に保存します。", + "files.autoSave.onWindowChange": "ウィンドウがフォーカスを失った時点で、ダーティ ファイルを自動的に保存します。", + "autoSave": "ダーティ ファイルの自動保存を制御します。有効な値: '{0}'、'{1}'、'{2}' (エディターがフォーカスを失います)、'{3}' (ウィンドウがフォーカスを失います)。'{4}' に設定すると、'files.autoSaveDelay' で遅延を構成できます。", + "autoSaveDelay": "ダーティ ファイルの自動保存の遅延をミリ秒単位で制御します。'files.autoSave' が '{0}' に設定されている場合のみ適用されます", + "watcherExclude": "ファイル監視から除外するファイル パスの glob パターンを設定します。パターンは絶対パスで一致する必要があります (つまり、適切に一致するには、プレフィックス ** を指定するか、完全パスを指定します\n)。この設定を変更した場合は、再起動が必要になります。始動時に Code が消費する CPU 時間が多い場合は、大きいフォルダーを除外すれば初期の負荷を減らすことができます。", + "hotExit.off": "Hot Exit を無効にします。", + "hotExit.onExit": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーされるとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。バックアップされているすべてのウィンドウは、次の起動時に復元されます。", + "hotExit.onExitAndWindowClose": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーするとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。また、フォルダーが開かれているウィンドウについても、それが最後のウィンドウかどうかに関係なく、Hot Exit がトリガーされます。フォルダーが開かれていないウィンドウはすべて、次回の起動時に復元されます。フォルダーのウィンドウをシャットダウン前と同じ状態に復元するには、\"window.restoreWindows\" を \"all\" に設定します。", + "hotExit": "エディターを終了するときに保存を確認するダイアログを省略し、保存されていないファイルをセッション後も保持するかどうかを制御します。", + "useExperimentalFileWatcher": "新しい試験的な File Watcher を使用します。", + "defaultLanguage": "新しいファイルに割り当てられる既定の言語モード。", + "editorConfigurationTitle": "エディター", + "formatOnSave": "ファイルを保存するときにフォーマットしてください。フォーマッタを使用可能にして、ファイルを自動保存せず、エディターをシャットダウンしないでください。", + "explorerConfigurationTitle": "エクスプローラー", + "openEditorsVisible": "[開いているエディター] ウィンドウに表示されているエディターの数。0 に設定するとウィンドウが非表示になります。", + "dynamicHeight": "開いているエディターのセクションの高さを要素の数に合わせて動的に調整するかどうかを制御します。", + "autoReveal": "エクスプローラーでファイルを開くとき、自動的にファイルの内容を表示して選択するかどうかを制御します。", + "enableDragAndDrop": "ドラッグ アンド ドロップを使用したファイルとフォルダーの移動をエクスプローラーが許可するかどうかを制御します。", + "confirmDragAndDrop": "ドラッグ アンド ドロップを使用したファイルやフォルダーの移動時にエクスプローラーが確認を求めるかどうかを制御します。", + "confirmDelete": "ごみ箱を経由したファイル削除時にエクスプローラーが確認を求めるかどうかを制御します。", + "sortOrder.default": "ファイルとフォルダーをアルファベット順に名前で並び替えます。フォルダーはファイルの前に表示されます。", + "sortOrder.mixed": "ファイルとフォルダーをアルファベット順に名前で並び替えます。ファイルはフォルダーと混交して表示されます。", + "sortOrder.filesFirst": "ファイルとフォルダーをアルファベット順に名前で並び替えます。ファイルはフォルダーの前に表示されます。", + "sortOrder.type": "ファイルとフォルダーをアルファベット順に拡張子で並び替えます。フォルダーはファイルの前に表示されます。", + "sortOrder.modified": "ファイルとフォルダーを降順に最終更新日で並び替えます。フォルダーはファイルの前に表示されます。", + "sortOrder": "エクスプローラー内のファイルとフォルダーの並び順を制御します。既定の並び順に加えて、'mixed' (ファイルとフォルダーを混交した並び順)、' type' (ファイルの種類順)、' modified' (最終更新日時順)、または 'filesFirst' (フォルダーの前にファイルを並べる) のいずれかの並び順に設定できます。 ", + "explorer.decorations.colors": "ファイルの装飾に配色を使用するかどうかを制御します。", + "explorer.decorations.badges": "ファイルの装飾にバッジを使用するかどうかを制御します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..a11f1cb6ffcf --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "右側のエディター ツール バーの操作で、変更を [元に戻す] か、ディスクの内容を変更内容で [上書き] します", + "discard": "破棄", + "overwrite": "上書き", + "retry": "再試行", + "readonlySaveError": "'{0}' の保存に失敗しました。ファイルが書き込み禁止になっています。[上書き] を選択して保護を解除してください。", + "genericSaveError": "'{0}' の保存に失敗しました: {1}", + "staleSaveError": "'{0} の保存に失敗しました。ディスクの内容の方が新しくなっています。[比較] をクリックしてご使用のバージョンをディスク上のバージョンと比較してください。", + "compareChanges": "比較", + "saveConflictDiffLabel": "{0} (ディスク上) ↔ {1} ({2} 内) - 保存の競合を解決" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..ac152686d08f --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "開いているフォルダーがありません", + "explorerSection": "ファイル エクスプローラー セクション", + "noWorkspaceHelp": "まだフォルダーをワークスペースに追加していません。", + "addFolder": "フォルダーの追加", + "noFolderHelp": "まだフォルダーを開いていません。", + "openFolder": "フォルダーを開く" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..44e1e67ff1c7 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "エクスプローラー", + "canNotResolve": "ワークスペース フォルダーを解決できません" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..2397d9a49b42 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "ファイル エクスプローラー セクション", + "treeAriaLabel": "ファイル エクスプローラー" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..f9c3565a125a --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "ファイル名を入力します。Enter キーを押して確認するか、Esc キーを押して取り消します。", + "filesExplorerViewerAriaLabel": "{0}、ファイル エクスプローラー", + "dropFolders": "ワークスペースにフォルダーを追加しますか?", + "dropFolder": "ワークスペースにフォルダーを追加しますか?", + "addFolders": "フォルダーの追加(&&A)", + "addFolder": "フォルダーの追加(&&A)", + "confirmMove": "'{0}' を移動しますか?", + "doNotAskAgain": "再度表示しない", + "moveButtonLabel": "移動(&&M)", + "confirmOverwriteMessage": "'{0}' は保存先フォルダーに既に存在します。置き換えてもよろしいですか。", + "irreversible": "このアクションは元に戻すことができません。", + "replaceButtonLabel": "置換(&&R)" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..b798b662ed0b --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "開いているエディター", + "openEditosrSection": "[開いているエディター] セクション", + "dirtyCounter": "未保存 ({0})", + "saveAll": "すべて保存", + "closeAllUnmodified": "未変更を閉じる", + "closeAll": "すべて閉じる", + "compareWithSaved": "保存済みと比較", + "close": "閉じる", + "closeOthers": "その他を閉じる" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..838a289ecd9f --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}、エディター グループ", + "openEditorAriaLabel": "{0}、開いているエディター", + "saveAll": "すべて保存", + "closeAllUnmodified": "未変更を閉じる", + "closeAll": "すべて閉じる", + "compareWithSaved": "保存済みと比較", + "close": "閉じる", + "closeOthers": "その他を閉じる" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..335a111c7ab4 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "totalProblems": "合計 {0} 個の問題", + "filteredProblems": "{1} 個中 {0} 個の問題を表示しています" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/common/messages.i18n.json index 9a17f323ff95..efe22d017f68 100644 --- a/i18n/jpn/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,7 @@ { "viewCategory": "表示", "problems.view.toggle.label": "問題の切り替え", - "problems.view.show.label": "問題を表示する", - "problems.view.hide.label": "問題の非表示", + "problems.view.focus.label": "問題にフォーカス", "problems.panel.configuration.title": "問題ビュー", "problems.panel.configuration.autoreveal": "ファイルを開くときに問題ビューに自動的にそのファイルを表示するかどうかを制御します", "markers.panel.title.problems": "問題", diff --git a/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..bc5d929551c2 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "プロファイルが正常に作成されました。", + "prof.detail": "案件を作成し、手動で次のファイルを添付してください:\\n{0}", + "prof.restartAndFileIssue": "問題を作成して再起動", + "prof.restart": "再起動", + "prof.thanks": "ご協力いただき、ありがとうございます。", + "prof.detail.restart": "'{0}' を引き続き使用するには、最後の再起動が必要です。 改めてあなたの貢献に感謝します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index c99a48b4e763..efdc6c41cac4 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "任意のキーの組み合わせを押し、Enter キーを押します。キャンセルするには Esc キーを押してください。", + "defineKeybinding.initial": "任意のキーの組み合わせを押し、ENTER キーを押します。", "defineKeybinding.chordsTo": "次へのコード:" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 9b0f4ce7178a..d963a2915fea 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "キー バインドの変更", "addKeybindingLabelWithKey": "キー バインドの追加 {0}", "addKeybindingLabel": "キー バインドの追加", + "title": "{0} ({1})", "commandAriaLabel": "コマンドは {0} です。", "keybindingAriaLabel": "キー バインドは {0} です。", "noKeybinding": "キー バインドが割り当てられていません。", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 3257770db154..8d64e3969929 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openRawDefaultSettings": "既定の設定を Raw で開く", "openGlobalSettings": "ユーザー設定を開く", "openGlobalKeybindings": "キーボード ショートカットを開く", "openGlobalKeybindingsFile": "キーボード ショートカット ファイルを開く", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 4df3bbb8de64..dacdf6ccd9d1 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "既定の設定", "SearchSettingsWidget.AriaLabel": "設定の検索", "SearchSettingsWidget.Placeholder": "設定の検索", - "totalSettingsMessage": "合計 {0} 個の設定", "noSettingsFound": "結果なし", "oneSettingFound": "1 つの設定が一致します", "settingsFound": "{0} 個の設定が一致します", - "fileEditorWithInputAriaLabel": "{0}。テキスト ファイル エディター。", - "fileEditorAriaLabel": "テキスト ファイル エディター。", + "totalSettingsMessage": "合計 {0} 個の設定", + "defaultSettings": "既定の設定", + "defaultFolderSettings": "既定のフォルダー設定", "defaultEditorReadonly": "既定値を上書きするには、右側のエディターを編集します。", "preferencesAriaLabel": "既定の基本設定。読み取り専用のテキスト エディター。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 77e44623852f..726fb894b045 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "既定の設定を上書きするには、このファイル内に設定を挿入します。", "emptyWorkspaceSettingsHeader": "ユーザー設定を上書きするには、このファイル内に設定を挿入します。", "emptyFolderSettingsHeader": "ワークスペースの設定を上書きするには、このファイル内にフォルダーの設定を挿入します。", - "defaultFolderSettingsTitle": "既定のフォルダー設定", - "defaultSettingsTitle": "既定の設定", "editTtile": "編集", "replaceDefaultValue": "設定を置換", "copyDefaultValue": "設定にコピー", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 3997e1202fd8..dbb463d13245 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "あいまい検索をお試しください!", + "defaultSettingsFuzzyPrompt": "自然文検索 (natural language search) を試し下さい!", "defaultSettings": "上書きするには、右側のエディターに設定を入力します。", "noSettingsFound": "設定が見つかりません。", - "folderSettingsDetails": "フォルダーの設定", - "enableFuzzySearch": "試験的なあいまい検索を有効にする" + "settingsSwitcherBarAriaLabel": "設定切り替え", + "userSettings": "ユーザー設定", + "workspaceSettings": "ワークスペースの設定", + "folderSettings": "フォルダーの設定", + "enableFuzzySearch": "自然文検索を有効にする" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..10d2433b22a4 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "既定の基本設定エディター", + "keybindingsEditor": "キー バインド エディター", + "preferences": "基本設定" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 8f9dfe270023..2cd7ee76d8f0 100644 --- a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "ソース管理プロバイダー", "hideRepository": "非表示", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "その他の SCM プロバイダーをインストール...", "no open repo": "有効なソース管理プロバイダーがありません。", "source control": "ソース管理", diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 4957ca3db7ea..1fa2626c490d 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "入力", - "useIgnoreFilesDescription": "無視設ファイルを使用します", - "useExcludeSettingsDescription": "除外設定を使用する" + "useExcludesAndIgnoreFilesDescription": "除外設定を使用して、ファイルを無視します。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 7d61d0b13e65..cea0aca33034 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "ファイル パスの照合基準となる glob パターン。これを true または false に設定すると、パターンがそれぞれ有効/無効になります。", "exclude.when": "一致するファイルの兄弟をさらにチェックします。一致するファイル名の変数として $(basename) を使用します。", "useRipgrep": "テキストとファイル検索で ripgrep を使用するかどうかを制御します", - "useIgnoreFilesByDefault": "新しいワークスペースでテキストを検索するときに、既定で .gitignore ファイルと .ignore ファイルを使用するかどうかを制御します。", "useIgnoreFiles": "ファイルを検索するときに、.gitignore ファイルを使用するか .ignore ファイルを使用するかを制御します。", "search.quickOpen.includeSymbols": "グローバル シンボル検索の結果を、Quick Open の結果ファイルに含めるように構成します。", "search.followSymlinks": "検索中にシンボリック リンクを追跡するかどうかを制御します。" diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 7f6464f3a56a..d07e4c94a3f3 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "前の検索除外パターンを表示", "nextSearchTerm": "次の検索語句を表示", "previousSearchTerm": "前の検索語句を表示", - "focusNextInputBox": "次の入力ボックスにフォーカス", - "focusPreviousInputBox": "前の入力ボックスにフォーカス", "showSearchViewlet": "検索の表示", "findInFiles": "フォルダーを指定して検索", "findInFilesWithSelectedText": "選択したテキストを含むファイルを検索", "replaceInFiles": "複数のファイルで置換", "replaceInFilesWithSelectedText": "選択したテキストを含むファイルの置換", - "findInWorkspace": "ワークスペース内を検索...", - "findInFolder": "フォルダー内を検索...", "RefreshAction.label": "最新の情報に更新", - "ClearSearchResultsAction.label": "検索結果のクリア", + "CollapseDeepestExpandedLevelAction.label": "すべて折りたたむ", + "ClearSearchResultsAction.label": "クリア", "FocusNextSearchResult.label": "次の検索結果にフォーカス", "FocusPreviousSearchResult.label": "前の検索結果にフォーカス", "RemoveAction.label": "却下", diff --git a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..e266c4b0298d --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "ワークスペース内のシンボルへ移動...", + "name": "検索", + "search": "検索", + "view": "表示", + "openAnythingHandlerDescription": "ファイルに移動する", + "openSymbolDescriptionNormal": "ワークスペース内のシンボルへ移動", + "searchOutputChannelTitle": "検索", + "searchConfigurationTitle": "検索", + "exclude": "検索でファイルとフォルダーを除外するために glob パターンを構成します。files.exclude 設定からすべての glob パターンを継承します。", + "exclude.boolean": "ファイル パスの照合基準となる glob パターン。これを true または false に設定すると、パターンがそれぞれ有効/無効になります。", + "exclude.when": "一致するファイルの兄弟をさらにチェックします。一致するファイル名の変数として $(basename) を使用します。", + "useRipgrep": "テキストとファイル検索で ripgrep を使用するかどうかを制御します", + "useIgnoreFiles": "ファイルを検索するときに、.gitignore ファイルを使用するか .ignore ファイルを使用するかを制御します。", + "search.quickOpen.includeSymbols": "グローバル シンボル検索の結果を、Quick Open の結果ファイルに含めるように構成します。", + "search.followSymlinks": "検索中にシンボリック リンクをたどるかどうかを制御します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..379fc84bf34d --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "フォルダー内を検索...", + "findInWorkspace": "ワークスペース内を検索..." +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index ec353f855bfc..312bf5688b35 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "タスク", "ConfigureTaskRunnerAction.label": "タスクの構成", - "ConfigureBuildTaskAction.label": "ビルド タスクを構成します", "CloseMessageAction.label": "閉じる", - "ShowTerminalAction.label": "ターミナルの表示", "problems": "問題", + "building": "ビルド中...", "manyMarkers": "99+", "runningTasks": "実行中のタスクを表示", "tasks": "タスク", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "実行するタスクがありません。タスクを構成する...", "TaskService.fetchingBuildTasks": "ビルド タスクをフェッチしています...", "TaskService.pickBuildTask": "実行するビルド タスクを選択", - "TaskService.noBuildTask": "実行するビルド タスクがありません。タスクを構成する... ", + "TaskService.noBuildTask": "実行するビルド タスクがありません。ビルド タスクを構成する...", "TaskService.fetchingTestTasks": "テスト タスクをフェッチしています...", "TaskService.pickTestTask": "実行するテスト タスクを選択してください", "TaskService.noTestTaskTerminal": "実行するテスト タスクがありません。タスクを構成する... ", diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 0fe8ccee4c61..38c25f4c1c3f 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "タスクの実行中に不明なエラーが発生しました。詳細については、タスク出力ログを参照してください。", "dependencyFailed": "ワークスペース フォルダー '{1}' 内で依存タスクの '{0}' を解決できませんでした", "TerminalTaskSystem.terminalName": "タスク - {0}", + "closeTerminal": "任意のキーを押してターミナルを終了します。", "reuseTerminal": "ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。", "TerminalTaskSystem": "UNC ドライブでシェル コマンドを実行できません。", "unkownProblemMatcher": "問題マッチャー {0} は解決できませんでした。マッチャーは無視されます" diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index ac618cfa97a8..c33b85b3dfe1 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,8 @@ "ConfigurationParser.noTypeDefinition": "Error: タスク タイプ '{0}' は登録されていません。対応するタスク プロバイダーを提供する拡張機能をインストールしましたか?", "ConfigurationParser.missingRequiredProperty": "エラー: タスク構成 '{0}' に必要な '{1}' プロパティがありません。構成は無視されます。 ", "ConfigurationParser.notCustom": "エラー: タスクがカスタム タスクとして定義されていません。この構成は無視されます。\n{0}\n", - "ConfigurationParser.noTaskName": "エラー: タスクが taskName プロパティを提供しなければなりません。このタスクは無視されます。\n{0}\n", - "taskConfiguration.shellArgs": "警告: タスク '{0}' はシェル コマンドです。コマンド名または引数の 1 つに、エスケープされていないスペースが含まれています。コマンド ラインの引用が正しく解釈されるように、引数をコマンドにマージしてください。", + "ConfigurationParser.noTaskName": "エラー: タスクが label プロパティを提供しなければなりません。このタスクは無視されます。\n{0}\n", + "taskConfiguration.shellArgs": "警告: タスク '{0}' はシェル コマンドであり、その引数の 1 つにエスケープされていないスペースが含まれている可能性があります。コマンド ラインの引用が正しく解釈されるように、引数をコマンドにマージしてください。", "taskConfiguration.noCommandOrDependsOn": "エラー: タスク '{0}' は、コマンドも dependsOn プロパティも指定していません。このタスクは無視されます。定義は次のとおりです:\n{1}", "taskConfiguration.noCommand": "エラー: タスク '{0}' はコマンドを定義していません。このタスクは無視されます。定義は次のとおりです:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "バージョン 2.0.0 のタスクでは、OS に固有のグローバル タスクはサポートされません。OS に固有のコマンドを使用したタスクに変換してください。影響を受けるタスクは次のとおりです。\n{0}" diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index f4845c96a75c..daa7ef1a9ed7 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}、ターミナル ピッカー", "termCreateEntryAriaLabel": "{0} 、新しいターミナルの作成", - "'workbench.action.terminal.newplus": "$(plus) 新しい統合ターミナルの作成", + "workbench.action.terminal.newplus": "$(plus) 新しい統合ターミナルの作成", "noTerminalsMatching": "一致するターミナルがありません", "noTerminalsFound": "開いているターミナルがありません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 7592dde26b53..ffdf047f3bc9 100644 --- a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,15 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "配色テーマ", + "themes.category.light": "ライト テーマ", + "themes.category.dark": "ダーク テーマ", + "themes.category.hc": "ハイ コントラスト テーマ", "installColorThemes": "その他の配色テーマをインストール...", "themes.selectTheme": "配色テーマの選択 (上/下キーでプレビュー可能)", "selectIconTheme.label": "ファイル アイコンのテーマ", - "installIconThemes": "その他のファイル アイコンのテーマをインストール...", "noIconThemeLabel": "なし", "noIconThemeDesc": "ファイル アイコンを無効にする", - "problemChangingIconTheme": "アイコン テーマの設定で問題が発生しました: {0}", + "installIconThemes": "その他のファイル アイコンのテーマをインストール...", "themes.selectIconTheme": "ファイル アイコンのテーマを選択します", "generateColorTheme.label": "現在の設定から配色テーマを生成する", "preferences": "基本設定", diff --git a/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 76c3f968a642..799b42b9fae6 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "ウィンドウ固有の構成。ユーザーまたはワークスペースの設定で構成できます。", "scope.resource.description": "リソース固有の構成。ユーザー、ワークスペース、またはフォルダーの設定で構成できます。", "scope.description": "構成が適用される範囲。 使用可能なスコープは `window` と ` resource` です。", + "vscode.extension.contributes.defaultConfiguration": "言語ごとに既定のエディター構成の設定を提供します。", "vscode.extension.contributes.configuration": "構成の設定を提供します。", "invalid.title": "'configuration.title' は、文字列である必要があります", - "vscode.extension.contributes.defaultConfiguration": "言語ごとに既定のエディター構成の設定を提供します。", "invalid.properties": "'configuration.properties' は、オブジェクトである必要があります", "invalid.allOf": "'configuration.allOf' は非推奨で使用できなくなります。代わりに 'configuration' コントリビューション ポイントに複数の構成セクションを配列として渡します。", "workspaceConfig.folders.description": "ワークスペースで読み込まれるフォルダーのリスト。", diff --git a/i18n/jpn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/jpn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..7df1ec40941a --- /dev/null +++ b/i18n/jpn/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "テレメトリ", + "telemetry.enableCrashReporting": "クラッシュ レポートを Microsoft に送信するように設定します。\nこのオプションを有効にするには、再起動が必要です。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..24243ff33ad7 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "message": "$(zap) 拡張機能ホストのプロファイリング..." +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index a4d588df685c..e2aef1055ae3 100644 --- a/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -9,5 +9,6 @@ "extensionHostProcess.crash": "拡張機能のホストが予期せずに終了しました。", "extensionHostProcess.unresponsiveCrash": "拡張機能のホストが応答しないため終了しました。", "overwritingExtension": "拡張機能 {0} を {1} で上書きしています。", - "extensionUnderDevelopment": "開発の拡張機能を {0} に読み込んでいます" + "extensionUnderDevelopment": "開発の拡張機能を {0} に読み込んでいます", + "extensionCache.invalid": "拡張機能がディスク上で変更されています。ウィンドウを再度読み込んでください。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/jpn/src/vs/workbench/services/files/node/fileService.i18n.json index af58e0c5a886..104db33f6337 100644 --- a/i18n/jpn/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "ファイルはディレクトリです", "fileNotModifiedError": "ファイルは次の時点以後に変更されていません:", "fileTooLargeError": "開くファイルが大きすぎます", - "fileBinaryError": "ファイルはバイナリのようなので、テキストとして開くことができません", "fileNotFoundError": "ファイルが見つかりません ({0})", + "fileBinaryError": "ファイルはバイナリのようなので、テキストとして開くことができません", "fileExists": "生成しようとしているファイル ({0}) は既に存在しています", "fileMoveConflict": "移動/コピーできません。移動/コピー先にファイルが既に存在します。", "unableToMoveCopyError": "移動/コピーできません。ファイルが含まれるフォルダーが置き換わることになります。", diff --git a/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 2da1f235eddf..4845e670df11 100644 --- a/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -22,5 +22,5 @@ "keybindings.json.when": "キーがアクティブの場合の条件。", "keybindings.json.args": "実行するコマンドに渡す引数。", "keyboardConfigurationTitle": "キーボード", - "dispatch": "`keydown.code` (推奨) または `keydown.keyCode` のいずれかを使用するキー操作のディスパッチ ロジックを制御します。" + "dispatch": "`code` (推奨) または `keyCode` のいずれかを使用するキー操作のディスパッチ ロジックを制御します。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/jpn/src/vs/workbench/services/textfile/common/textFileService.i18n.json index 28f71f4b4417..047c6f1369b0 100644 --- a/i18n/jpn/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "files.backup.failSave": "ファイルをバックアップできませんでした (エラー: {0})。ファイルを保存しなおして終了してください。" + "files.backup.failSave": "変更されたファイルをバックアップ場所に書き込めませんでした (エラー: {0})。ファイルを保存しなおして終了してください。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index db40a8ef3c1d..b1fd1a9b69e9 100644 --- a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "ユーザー設定に新しいテーマの設定が追加されました。{0} に利用可能なバックアップがあります。", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "ワークベンチで使用する配色テーマを指定します。", "colorThemeError": "テーマが不明、またはインストールされていません。", "iconTheme": "ワークベンチで使用するアイコンのテーマを指定します。'null' を指定するとファイル アイコンが表示されなくなります。", diff --git a/i18n/kor/extensions/git/out/autofetch.i18n.json b/i18n/kor/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..9ecba0491931 --- /dev/null +++ b/i18n/kor/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "예", + "no": "아니요" +} \ No newline at end of file diff --git a/i18n/kor/extensions/git/out/commands.i18n.json b/i18n/kor/extensions/git/out/commands.i18n.json index bb03f6a56472..2dc481e046b1 100644 --- a/i18n/kor/extensions/git/out/commands.i18n.json +++ b/i18n/kor/extensions/git/out/commands.i18n.json @@ -71,7 +71,6 @@ "no stashes": "복원할 스태시가 없습니다.", "pick stash to pop": "표시할 스태시 선택", "clean repo": "체크 아웃하기 전에 리포지토리 작업 트리를 정리하세요.", - "cant push": "참조를 원격에 푸시할 수 없습니다. 먼저 '풀'을 실행하여 변경 내용을 통합하세요.", "git error details": "Git: {0}", "git error": "Git 오류", "open git log": "Git 로그 열기" diff --git a/i18n/kor/extensions/git/out/main.i18n.json b/i18n/kor/extensions/git/out/main.i18n.json index 5f6b712cb7e9..1d7b6e3355cd 100644 --- a/i18n/kor/extensions/git/out/main.i18n.json +++ b/i18n/kor/extensions/git/out/main.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "using git": "{1}에서 git {0}을(를) 사용하는 중", - "updateGit": "Git 업데이트", "neverShowAgain": "다시 표시 안 함", + "updateGit": "Git 업데이트", "git20": "Git {0}이(가) 설치된 것 같습니다. 코드는 2 이하의 Git에서 최적으로 작동합니다." } \ No newline at end of file diff --git a/i18n/kor/extensions/git/out/repository.i18n.json b/i18n/kor/extensions/git/out/repository.i18n.json index c5c45af0062c..c8d7793b7310 100644 --- a/i18n/kor/extensions/git/out/repository.i18n.json +++ b/i18n/kor/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "본인이 삭제함", "both added": "둘 다 추가됨", "both modified": "둘 다 수정됨", + "commitMessage": "메시지(커밋하려면 {0} 누르기)", "commit": "커밋", "merge changes": "변경 내용 병합", "staged changes": "스테이징된 변경 내용", diff --git a/i18n/kor/extensions/markdown/out/commands.i18n.json b/i18n/kor/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..f38833da5da5 --- /dev/null +++ b/i18n/kor/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "onPreviewStyleLoadError": "'markdown.styles': {0}을 불러올 수 없음" +} \ No newline at end of file diff --git a/i18n/kor/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/kor/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..966b7d5fad18 --- /dev/null +++ b/i18n/kor/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "이 문서에서 일부 콘텐츠가 사용하지 않도록 설정되었습니다.", + "preview.securityMessage.title": "Markdown 미리 보기에서 잠재적으로 안전하지 않거나 보안되지 않은 콘텐츠가 사용하지 않도록 설정되어 있습니다. 이 콘텐츠나 스크립트를 허용하려면 Markdown 미리 보기 보안 설정을 변경하세요.", + "preview.securityMessage.label": "콘텐츠 사용할 수 없음 보안 경고" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/base/common/errorMessage.i18n.json b/i18n/kor/src/vs/base/common/errorMessage.i18n.json index a1079b639599..5f42a2d8f30d 100644 --- a/i18n/kor/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/kor/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. 오류 코드: {1}", - "error.permission.verbose": "사용 권한이 거부되었습니다(HTTP {0}).", - "error.permission": "사용 권한이 거부되었습니다.", - "error.http.verbose": "{0}(HTTP {1}: {2})", - "error.http": "{0}(HTTP {1})", - "error.connection.unknown.verbose": "알 수 없는 연결 오류({0})", - "error.connection.unknown": "알 수 없는 연결 오류가 발생했습니다. 인터넷에 연결되지 않았거나 연결된 서버가 오프라인 상태입니다.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조하세요.", "nodeExceptionMessage": "시스템 오류가 발생했습니다({0}).", diff --git a/i18n/kor/src/vs/code/electron-main/main.i18n.json b/i18n/kor/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..d259f7872ca7 --- /dev/null +++ b/i18n/kor/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "닫기(&&C)" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-main/menus.i18n.json b/i18n/kor/src/vs/code/electron-main/menus.i18n.json index 2e942d1252d9..08a780b6810b 100644 --- a/i18n/kor/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/kor/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,10 @@ "miQuit": "{0} 종료", "miNewFile": "새 파일(&&N)", "miOpen": "열기(&&O)...", - "miOpenWorkspace": "작업 영역 열기(&O)...", "miOpenFolder": "폴더 열기(&&F)...", "miOpenFile": "파일 열기(&&O)...", "miOpenRecent": "최근 항목 열기(&&R)", - "miSaveWorkspaceAs": "다른 이름으로 작업 영역 저장(&S)...", - "miAddFolderToWorkspace": "작업 영역에 폴더 추가(&&A)", + "miSaveWorkspaceAs": "작업 영역을 다른 이름으로 저장", "miSave": "저장(&&S)", "miSaveAs": "다른 이름으로 저장(&&A)...", "miSaveAll": "모두 저장(&&L)", @@ -157,7 +155,6 @@ "mMergeAllWindows": "모든 창 병합", "miToggleDevTools": "개발자 도구 설정/해제(&&T)", "miAccessibilityOptions": "접근성 옵션(&&O)", - "miReportIssues": "문제 보고(&&I)", "miWelcome": "시작(&&W)", "miInteractivePlayground": "대화형 실습(&&I)", "miDocumentation": "설명서(&&D)", @@ -184,6 +181,6 @@ "miDownloadingUpdate": "업데이트를 다운로드하는 중...", "miInstallingUpdate": "업데이트를 설치하는 중...", "miCheckForUpdates": "업데이트 확인...", - "aboutDetail": "\n버전 {0}\n커밋 {1}\n날짜 {2}\n셸 {3}\n렌더러 {4}\n노드 {5}\n아키텍처 {6}", - "okButton": "확인" + "okButton": "확인", + "copy": "복사(&&C)" } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/kor/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..e75053c8837c --- /dev/null +++ b/i18n/kor/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "이러한 파일이 동시에 변경되었습니다. {0}", + "summary.0": "편집하지 않음", + "summary.nm": "{1}개 파일에서 {0}개 텍스트 편집을 수행함", + "summary.n0": "1개 파일에서 {0}개 텍스트 편집을 수행함" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json index ca3b604fcad2..a5e25a8bb9a5 100644 --- a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,16 @@ "fontSize": "글꼴 크기(픽셀)를 제어합니다.", "lineHeight": "줄 높이를 제어합니다. fontSize의 lineHeight를 계산하려면 0을 사용합니다.", "letterSpacing": "글자 간격을 픽셀 단위로 조정합니다.", - "lineNumbers": "줄 번호의 표시 여부를 제어합니다. 가능한 값은 'on', 'off', 'relative'입니다. 'relative'는 현재 커서 위치에서 줄 수를 표시합니다.", + "lineNumbers.off": "줄 번호는 렌더링 되지 않습니다.", + "lineNumbers.on": "줄 번호는 절대값으로 렌더링 됩니다.", + "lineNumbers.relative": "줄 번호는 커서 위치에서 줄 간격 거리로 렌더링 됩니다.", + "lineNumbers.interval": "줄 번호는 매 10 줄마다 렌더링이 이루어집니다.", + "lineNumbers": "줄 번호의 표시 여부를 제어합니다. 가능한 값은 'on', 'off', 'relative'입니다.", "rulers": "특정 수의 고정 폭 문자 뒤에 세로 눈금자를 렌더링합니다. 여러 눈금자의 경우 여러 값을 사용합니다. 배열이 비어 있는 경우 눈금자가 그려져 있지 않습니다.", "wordSeparators": "단어 관련 탐색 또는 작업을 수행할 때 단어 구분 기호로 사용되는 문자입니다.", "tabSize": "탭 한 개에 해당하는 공백 수입니다. `editor.detectIndentation`이 켜져 있는 경우 이 설정은 파일 콘텐츠에 따라 재정의됩니다.", "tabSize.errorMessage": "'number'가 필요합니다. 값 \"auto\"는 `editor.detectIndentation` 설정에 의해 바뀌었습니다.", - "insertSpaces": " 키를 누를 때 공백을 삽입합니다. `editor.detectIndentation`이 켜져 있는 경우 이 설정은 파일 콘텐츠에 따라 재정의됩니다.", + "insertSpaces": "탭 키를 누를 때 공백을 삽입합니다. `editor.detectIndentation`이 켜져 있는 경우 이 설정은 파일 콘텐츠에 따라 재정의됩니다.", "insertSpaces.errorMessage": "'boolean'이 필요합니다. 값 \"auto\"는 `editor.detectIndentation` 설정에 의해 바뀌었습니다.", "detectIndentation": "파일을 열면 파일 콘텐츠를 기반으로 하여 'editor.tabSize'와 'editor.insertSpaces'가 검색됩니다.", "roundedSelection": "선택 항목의 모서리를 둥글게 할지 여부를 제어합니다.", @@ -89,8 +93,8 @@ "links": "편집기에서 링크를 감지하고 클릭할 수 있게 만들지 결정합니다.", "colorDecorators": "편집기에서 인라인 색 데코레이터 및 색 선택을 렌더링할지를 제어합니다.", "codeActions": "코드 동작 전구를 사용합니다.", + "selectionClipboard": "Linux 주 클립보드의 지원 여부를 제어합니다.", "sideBySide": "diff 편집기에서 diff를 나란히 표시할지 인라인으로 표시할지 여부를 제어합니다.", "ignoreTrimWhitespace": "diff 편집기에서 선행 공백 또는 후행 공백 변경을 diffs로 표시할지 여부를 제어합니다.", - "renderIndicators": "diff 편집기에서 추가/제거된 변경 내용에 대해 +/- 표시기를 표시하는지 여부를 제어합니다.", - "selectionClipboard": "Linux 주 클립보드의 지원 여부를 제어합니다." + "renderIndicators": "diff 편집기에서 추가/제거된 변경 내용에 대해 +/- 표시기를 표시하는지 여부를 제어합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/kor/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..4bf58092c969 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "대괄호로 이동" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/kor/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..27cec366d1a9 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "캐럿을 왼쪽으로 이동", + "caret.moveRight": "캐럿을 오른쪽으로 이동" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/kor/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..71fd84232aab --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "문자 바꾸기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/kor/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..1e6e7c17e217 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "잘라내기", + "actions.clipboard.copyLabel": "복사", + "actions.clipboard.pasteLabel": "붙여넣기", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "구문을 강조 표시하여 복사" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/kor/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..5b5b2cac857c --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "줄 주석 설정/해제", + "comment.line.add": "줄 주석 추가", + "comment.line.remove": "줄 주석 제거", + "comment.block": "블록 주석 설정/해제" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/kor/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..cee5d91a1b7e --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "편집기 상황에 맞는 메뉴 표시" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/find/findController.i18n.json b/i18n/kor/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..7201d1ab08fc --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "찾기", + "findNextMatchAction": "다음 찾기", + "findPreviousMatchAction": "이전 찾기", + "nextSelectionMatchFindAction": "다음 선택 찾기", + "previousSelectionMatchFindAction": "이전 선택 찾기", + "startReplace": "바꾸기", + "showNextFindTermAction": "다음 검색어 표시", + "showPreviousFindTermAction": "이전 검색어 표시" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..f820392132e8 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "찾기", + "placeholder.find": "찾기", + "label.previousMatchButton": "이전 검색 결과", + "label.nextMatchButton": "다음 검색 결과", + "label.toggleSelectionFind": "선택 항목에서 찾기", + "label.closeButton": "닫기", + "label.replace": "바꾸기", + "placeholder.replace": "바꾸기", + "label.replaceButton": "바꾸기", + "label.replaceAllButton": "모두 바꾸기", + "label.toggleReplaceButton": "바꾸기 모드 설정/해제", + "title.matchesCountLimit": "처음 {0}개의 결과가 강조 표시되지만 모든 찾기 작업은 전체 텍스트에 대해 수행됩니다.", + "label.matchesLocation": "{0}/{1}", + "label.noResults": "결과 없음" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..c45550055e9c --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "찾기", + "placeholder.find": "찾기", + "label.previousMatchButton": "이전 검색 결과", + "label.nextMatchButton": "다음 검색 결과", + "label.closeButton": "닫기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/kor/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..0d8ac009a871 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "펼치기", + "unFoldRecursivelyAction.label": "재귀적으로 펼치기", + "foldAction.label": "접기", + "foldRecursivelyAction.label": "재귀적으로 접기", + "foldAllBlockComments.label": "모든 블록 코멘트를 접기", + "foldAllAction.label": "모두 접기", + "unfoldAllAction.label": "모두 펼치기", + "foldLevelAction.label": "수준 {0} 접기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..8811618c869d --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "줄 {0}에서 1개 서식 편집을 수행했습니다.", + "hintn1": "줄 {1}에서 {0}개 서식 편집을 수행했습니다.", + "hint1n": "줄 {0}과(와) {1} 사이에서 1개 서식 편집을 수행했습니다.", + "hintnn": "줄 {1}과(와) {2} 사이에서 {0}개 서식 편집을 수행했습니다.", + "no.provider": "죄송 합니다, 하지만 ' {0} '파일에 대 한 포맷터가 존재 하지 않습니다..", + "formatDocument.label": "문서 서식", + "formatSelection.label": "선택 영역 서식" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..eb7148607bda --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "'{0}'에 대한 정의를 찾을 수 없습니다.", + "generic.noResults": "정의를 찾을 수 없음", + "meta.title": "– {0} 정의", + "actions.goToDecl.label": "정의로 이동", + "actions.goToDeclToSide.label": "측면에서 정의 열기", + "actions.previewDecl.label": "정의 피킹(Peeking)", + "goToImplementation.noResultWord": "'{0}'에 대한 구현을 찾을 수 없습니다.", + "goToImplementation.generic.noResults": "구현을 찾을 수 없습니다.", + "meta.implementations.title": " – {0} 개 구현", + "actions.goToImplementation.label": "구현으로 이동", + "actions.peekImplementation.label": "구현 미리 보기", + "goToTypeDefinition.noResultWord": "'{0}'에 대한 형식 정의를 찾을 수 없습니다.", + "goToTypeDefinition.generic.noResults": "형식 정의를 찾을 수 없습니다.", + "meta.typeDefinitions.title": "– {0} 형식 정의", + "actions.goToTypeDefinition.label": "형식 정의로 이동", + "actions.peekTypeDefinition.label": "형식 정의 미리 보기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..57b4929798ff --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "{0}개 정의를 표시하려면 클릭하세요." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..58029e4cfcd5 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "다음 오류 또는 경고로 이동", + "markerAction.previous.label": "이전 오류 또는 경고로 이동", + "editorMarkerNavigationError": "편집기 표식 탐색 위젯 오류 색입니다.", + "editorMarkerNavigationWarning": "편집기 표식 탐색 위젯 경고 색입니다.", + "editorMarkerNavigationInfo": "편집기 표식 탐색 위젯 정보 색입니다.", + "editorMarkerNavigationBackground": "편집기 표식 탐색 위젯 배경입니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/kor/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..af972da445ac --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "가리키기 표시" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/kor/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..9e3147cdd15d --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "로드 중..." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/kor/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..8c88e6b0caa8 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "이전 값으로 바꾸기", + "InPlaceReplaceAction.next.label": "다음 값으로 바꾸기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..0e91b461922e --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "들여쓰기를 공백으로 변환", + "indentationToTabs": "들여쓰기를 탭으로 변환", + "configuredTabSize": "구성된 탭 크기", + "selectTabWidth": "현재 파일의 탭 크기 선택", + "indentUsingTabs": "탭을 사용한 들여쓰기", + "indentUsingSpaces": "공백을 사용한 들여쓰기", + "detectIndentation": "콘텐츠에서 들여쓰기 감지", + "editor.reindentlines": "줄 다시 들여쓰기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/kor/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..7e12706f9909 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "위에 줄 복사", + "lines.copyDown": "아래에 줄 복사", + "lines.moveUp": "줄 위로 이동", + "lines.moveDown": "줄 아래로 이동", + "lines.sortAscending": "줄을 오름차순 정렬", + "lines.sortDescending": "줄을 내림차순으로 정렬", + "lines.trimTrailingWhitespace": "후행 공백 자르기", + "lines.delete": "줄 삭제", + "lines.indent": "줄 들여쓰기", + "lines.outdent": "줄 내어쓰기", + "lines.insertBefore": "위에 줄 삽입", + "lines.insertAfter": "아래에 줄 삽입", + "lines.deleteAllLeft": "왼쪽 모두 삭제", + "lines.deleteAllRight": "우측에 있는 항목 삭제", + "lines.joinLines": "줄 연결", + "editor.transpose": "커서 주위 문자 바꾸기", + "editor.transformToUppercase": "대문자로 변환", + "editor.transformToLowercase": "소문자로 변환" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/links/links.i18n.json b/i18n/kor/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..2bc3afdb9fc2 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Cmd 키를 누르고 클릭하여 링크로 이동", + "links.navigate": "Ctrl 키를 누르고 클릭하여 링크로 이동", + "links.command.mac": "명령을 실행하려면 Cmd+클릭", + "links.command": "명령을 실행하려면 Ctrl+클릭", + "links.navigate.al": "Alt 키를 누르고 클릭하여 링크로 이동", + "links.command.al": "명령을 실행하려면 Alt+클릭", + "invalid.url": "죄송합니다. 이 링크는 형식이 올바르지 않으므로 열지 못했습니다. {0}", + "missing.url": "죄송합니다. 대상이 없으므로 이 링크를 열지 못했습니다.", + "label": "링크 열기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/kor/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..af6f5d6235c5 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "위에 커서 추가", + "mutlicursor.insertBelow": "아래에 커서 추가", + "mutlicursor.insertAtEndOfEachLineSelected": "줄 끝에 커서 추가", + "addSelectionToNextFindMatch": "다음 일치 항목 찾기에 선택 항목 추가", + "addSelectionToPreviousFindMatch": "이전 일치 항목 찾기에 선택 항목 추가", + "moveSelectionToNextFindMatch": "다음 일치 항목 찾기로 마지막 선택 항목 이동", + "moveSelectionToPreviousFindMatch": "마지막 선택 항목을 이전 일치 항목 찾기로 이동", + "selectAllOccurrencesOfFindMatch": "일치 항목 찾기의 모든 항목 선택", + "changeAll.label": "모든 항목 변경" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/kor/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..884202c9ab9c --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "매개 변수 힌트 트리거" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..83d04f35bc4a --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, 힌트" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/kor/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..d4430bc088db --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "수정 사항 표시({0})", + "quickFix": "수정 사항 표시", + "quickfix.trigger.label": "빠른 수정" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..9befc5560b17 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "닫기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/kor/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..199f308fdda7 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": "–참조 {0}개", + "references.action.label": "모든 참조 찾기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..519c07a8e60c --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "로드 중..." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..48d188666181 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "{2}열, {1}줄, {0}의 기호", + "aria.fileReferences.1": "{0}의 기호 1개, 전체 경로 {1}", + "aria.fileReferences.N": "{1}의 기호 {0}개, 전체 경로 {2}", + "aria.result.0": "결과 없음", + "aria.result.1": "{0}에서 기호 1개를 찾았습니다.", + "aria.result.n1": "{1}에서 기호 {0}개를 찾았습니다.", + "aria.result.nm": "{1}개 파일에서 기호 {0}개를 찾았습니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..bebeacf63465 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "파일을 확인하지 못했습니다.", + "referencesCount": "참조 {0}개", + "referenceCount": "참조 {0}개", + "missingPreviewMessage": "미리 보기를 사용할 수 없음", + "treeAriaLabel": "참조", + "noResults": "결과 없음", + "peekView.alternateTitle": "참조", + "peekViewTitleBackground": "Peek 뷰 제목 영역의 배경색입니다.", + "peekViewTitleForeground": "Peek 뷰 제목 색입니다.", + "peekViewTitleInfoForeground": "Peek 뷰 제목 정보 색입니다.", + "peekViewBorder": "Peek 뷰 테두리 및 화살표 색입니다.", + "peekViewResultsBackground": "Peek 뷰 결과 목록의 배경색입니다.", + "peekViewResultsMatchForeground": "Peek 뷰 결과 목록에서 라인 노드의 전경색입니다.", + "peekViewResultsFileForeground": "Peek 뷰 결과 목록에서 파일 노드의 전경색입니다.", + "peekViewResultsSelectionBackground": "Peek 뷰 결과 목록에서 선택된 항목의 배경색입니다.", + "peekViewResultsSelectionForeground": "Peek 뷰 결과 목록에서 선택된 항목의 전경색입니다.", + "peekViewEditorBackground": "Peek 뷰 편집기의 배경색입니다.", + "peekViewEditorGutterBackground": "Peek 뷰 편집기의 거터 배경색입니다.", + "peekViewResultsMatchHighlight": "Peek 뷰 결과 목록의 일치 항목 강조 표시 색입니다.", + "peekViewEditorMatchHighlight": "Peek 뷰 편집기의 일치 항목 강조 표시 색입니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/kor/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..623526b74324 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "결과가 없습니다.", + "aria": "'{0}'을(를) '{1}'(으)로 이름을 변경했습니다. 요약: {2}", + "rename.failed": "죄송합니다. 이름 바꾸기를 실행하지 못했습니다.", + "rename.label": "기호 이름 바꾸기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/kor/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..8e16d0a05f7c --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "입력 이름을 바꾸세요. 새 이름을 입력한 다음 [Enter] 키를 눌러 커밋하세요." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/kor/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..127400173af2 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "선택 확장", + "smartSelect.shrink": "선택 축소" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/kor/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..c9232c0a95d1 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "'{0}'을(를) 적용하여 다음 텍스트가 삽입되었습니다.\n {1}", + "suggest.trigger.label": "제안 항목 트리거" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..db8bbbe66702 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "제안 위젯의 배경색입니다.", + "editorSuggestWidgetBorder": "제안 위젯의 테두리 색입니다.", + "editorSuggestWidgetForeground": "제안 위젯의 전경색입니다.", + "editorSuggestWidgetSelectedBackground": "제한 위젯에서 선택된 항목의 배경색입니다.", + "editorSuggestWidgetHighlightForeground": "제안 위젯의 일치 항목 강조 표시 색입니다.", + "readMore": "자세히 알아보기...{0}", + "suggestionWithDetailsAriaLabel": "{0}, 제안, 세부 정보 있음", + "suggestionAriaLabel": "{0}, 제안", + "readLess": "간단히 보기...{0}", + "suggestWidget.loading": "로드 중...", + "suggestWidget.noSuggestions": "제안 항목이 없습니다.", + "suggestionAriaAccepted": "{0}, 수락됨", + "ariaCurrentSuggestionWithDetails": "{0}, 제안, 세부 정보 있음", + "ariaCurrentSuggestion": "{0}, 제안" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/kor/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..71b2a67ea6a5 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": " 키로 포커스 이동 설정/해제" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..ab340d73f19e --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "변수 읽기와 같은 읽기 액세스 중 기호의 배경색입니다.", + "wordHighlightStrong": "변수에 쓰기와 같은 쓰기 액세스 중 기호의 배경색입니다.", + "overviewRulerWordHighlightForeground": "기호 강조 표시의 개요 눈금자 마커 색입니다.", + "overviewRulerWordHighlightStrongForeground": "쓰기 권한 기호 강조 표시의 개요 눈금자 마커 색입니다.", + "wordHighlight.next.label": "다음 강조 기호로 이동", + "wordHighlight.previous.label": "이전 강조 기호로 이동" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/kor/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index 80dddd1b0c51..8b6ad71cd4e6 100644 --- a/i18n/kor/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/kor/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -3,7 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "notFound": "확장을 찾을 수 없습니다.", - "noCompatible": "이 버전의 Code에서 {0}의 호환 버전을 찾을 수 없습니다." -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index a346e007e1c0..1f9083afa001 100644 --- a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,10 @@ { "invalidManifest": "잘못된 확장: package.json이 JSON 파일이 아닙니다.", "restartCodeLocal": "{0}을(를) 다시 설치하기 전에 Code를 다시 시작하세요.", - "restartCodeGallery": "다시 설치하기 전에 Code를 다시 시작하세요.", + "cancel": "취소", "uninstallDependeciesConfirmation": "'{0}'만 제거할까요, 아니면 종속성도 제거할까요?", "uninstallOnly": "만", "uninstallAll": "모두", - "cancel": "취소", "uninstallConfirmation": "'{0}'을(를) 제거할까요?", "ok": "확인", "singleDependentError": "확장 '{0}'을(를) 제거할 수 없습니다. 확장 '{1}'이(가) 이 확장에 종속됩니다.", diff --git a/i18n/kor/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/kor/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..091e1d884137 --- /dev/null +++ b/i18n/kor/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "view": "보기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index d5bda0aa7911..ed6d0f43e211 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "이전 편집기 열기", "nextEditorInGroup": "그룹에서 다음 편집기 열기", "openPreviousEditorInGroup": "그룹에서 이전 편집기 열기", + "lastEditorInGroup": "그룹의 마지막 편집기 열기", "navigateNext": "앞으로 이동", "navigatePrevious": "뒤로 이동", "navigateLast": "마지막으로 이동", diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index ea611dbaba20..9b3b3941512c 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,6 @@ { "editorCommand.activeEditorMove.description": "활성 편집기를 탭 또는 그룹 단위로 이동", "editorCommand.activeEditorMove.arg.name": "활성 편집기 이동 인수", - "editorCommand.activeEditorMove.arg.description": "인수 속성:\n\t\t\t\t\t\t* 'to': 이동할 위치를 지정하는 문자열 값입니다.\n\t\t\t\t\t\t* 'by': 이동할 단위를 지정하는 문자열 값입니다. 탭 단위 또는 그룹 단위입니다\n\t\t\t\t\t\t* 'value': 이동할 위치 수 또는 절대 위치를 지정하는 숫자 값입니다.\n\t\t\t\t\t", "commandDeprecated": "**{0}** 명령이 제거되었습니다. 대신 **{1}** 명령을 사용할 수 있습니다.", "openKeybindings": "바로 가기 키 구성" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 3c0b9b984d4c..8c2c5a8883cc 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -52,6 +52,5 @@ "screenReaderDetectedExplanation.question": "VS Code를 작동하기 위해 화면 읽기 프로그램을 사용하십니까?", "screenReaderDetectedExplanation.answerYes": "예", "screenReaderDetectedExplanation.answerNo": "아니요", - "screenReaderDetectedExplanation.body1": "VS Code가 이제 화면 읽기 프로그램과 사용하는 데 최적화되었습니다.", - "screenReaderDetectedExplanation.body2": "일부 편집기 기능에는 자동 줄바꿈, 접기, 자동 닫는 대괄호 등 여러 가지 동작이 있습니다. " + "screenReaderDetectedExplanation.body1": "VS Code가 이제 화면 읽기 프로그램과 사용하는 데 최적화되었습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/quickopen.i18n.json b/i18n/kor/src/vs/workbench/browser/quickopen.i18n.json index 15bbb282f525..828c5a496b5c 100644 --- a/i18n/kor/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "일치하는 결과 없음", - "noResultsFound2": "결과 없음", - "entryAriaLabel": "{0}, 명령" + "noResultsFound2": "결과 없음" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json index f652392a3976..248d9a802264 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "최근 항목 열기...", "quickOpenRecent": "빠른 최근 항목 열기...", "closeMessages": "알림 메시지 닫기", - "reportIssues": "문제 보고", + "reportIssueInEnglish": "문제 보고", "reportPerformanceIssue": "성능 문제 보고", "keybindingsReference": "바로 가기 키 참조", "openDocumentationUrl": "설명서", @@ -47,5 +47,14 @@ "showNextWindowTab": "다음 창 탭 표시", "moveWindowTabToNewWindow": "창 탭을 새 창으로 이동", "mergeAllWindowTabs": "모든 창 병합", - "toggleWindowTabsBar": "창 탭 모음 설정/해제" + "toggleWindowTabsBar": "창 탭 모음 설정/해제", + "configureLocale": "언어 구성", + "displayLanguage": "VSCode의 표시 언어를 정의합니다.", + "doc": "지원되는 언어 목록은 {0} 을(를) 참조하세요.", + "restart": "값을 변경하려면 VSCode를 다시 시작해야 합니다.", + "fail.createSettings": "{0}'({1})을(를) 만들 수 없습니다.", + "debug": "디버그", + "info": "정보", + "warn": "경고", + "err": "오류" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json index 767f6d6d93c3..a78356cadf93 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "보기", "help": "도움말", "file": "파일", - "workspaces": "작업 영역", "developer": "개발자", + "workspaces": "작업 영역", "showEditorTabs": "열려 있는 편집기를 탭에서 표시할지 여부를 제어합니다.", "workbench.editor.labelFormat.default": "파일 이름을 표시합니다. 탭이 사용하도록 설정되어 있고 하나의 그룹에서 파일 2개의 이름이 동일하면, 각 파일 경로의 특정 섹션이 추가됩니다. 탭이 사용하도록 설정되어 있지 않으면, 작업 영역 폴더에 대한 경로는 편집기가 활성 상태일 때 표시됩니다.", "workbench.editor.labelFormat.short": "디렉터리 이름 앞에 오는 파일의 이름을 표시합니다.", @@ -26,18 +26,16 @@ "closeOnFocusLost": "Quick Open가 포커스를 잃으면 자동으로 닫을지 여부를 제어합니다.", "openDefaultSettings": "설정을 열면 모든 기본 설정을 표시하는 편집기도 열리는지 여부를 제어합니다.", "sideBarLocation": "사이드바의 위치를 제어합니다. 워크벤치의 왼쪽이나 오른쪽에 표시될 수 있습니다.", - "panelLocation": "패널의 위치를 제어합니다. 워크벤치의 아래 또는 오른쪽에 표시될 수 있습니다.", "statusBarVisibility": "워크벤치 아래쪽에서 상태 표시줄의 표시 유형을 제어합니다.", "activityBarVisibility": "워크벤치에서 작업 막대의 표시 유형을 제어합니다.", "closeOnFileDelete": "일부 다른 프로세스에서 파일을 삭제하거나 이름을 바꿀 때 파일을 표시하는 편집기를 자동으로 닫을지 여부를 제어합니다. 사용하지 않도록 설정하는 경우 이러한 이벤트가 발생하면 편집기가 더티 상태로 계속 열려 있습니다. 응용 프로그램 내에서 삭제하면 항상 편집기가 닫히고 데이터를 유지하기 위해 더티 파일은 닫히지 않습니다.", - "experimentalFuzzySearchEndpoint": "실험 설정 검색에 사용할 끝점을 나타냅니다.", - "experimentalFuzzySearchKey": "실험 설정 검색에 사용할 키를 나타냅니다.", "fontAliasing": "워크벤치에서 글꼴 앨리어싱 방식을 제어합니다.\n- 기본: 서브 픽셀 글꼴 다듬기. 대부분의 일반 디스플레이에서 가장 선명한 글꼴 제공\n- 안티앨리어싱: 서브 픽셀이 아닌 픽셀 단위에서 글꼴 다듬기. 전반적으로 더 밝은 느낌을 줄 수 있음\n- 없음: 글꼴 다듬기 사용 안 함. 텍스트 모서리가 각지게 표시됨", "workbench.fontAliasing.default": "서브 픽셀 글꼴 다듬기. 대부분의 일반 디스플레이에서 가장 선명한 텍스트를 제공합니다. ", "workbench.fontAliasing.antialiased": "서브 픽셀이 아닌 픽셀 수준에서 글꼴을 다듬습니다. 전반적으로 글꼴이 더 밝게 표시됩니다.", "workbench.fontAliasing.none": "글꼴 다듬기를 사용하지 않습니다. 텍스트 가장자리가 각지게 표시됩니다.", "swipeToNavigate": "세 손가락으로 가로로 살짝 밀어 열려 있는 파일 간을 이동합니다.", "workbenchConfigurationTitle": "워크벤치", + "windowConfigurationTitle": "창", "window.openFilesInNewWindow.on": "파일이 새 창에서 열립니다.", "window.openFilesInNewWindow.off": "파일이 파일의 폴더가 열려 있는 창 또는 마지막 활성 창에서 열립니다.", "window.openFilesInNewWindow.default": "Dock 또는 Finder(macOS 전용)를 통해 파일을 연 경우를 제외하고 파일이 파일의 폴더가 열린 창 또는 마지막 활성 창에서 열립니다.", @@ -69,11 +67,11 @@ "autoDetectHighContrast": "사용하도록 설정한 경우 Windows에서 고대비 테마를 사용 중이면 고대비 테마로 자동으로 변경되고 Windows 고대비 테마를 해제하면 어두운 테마로 변경됩니다.", "titleBarStyle": "창 제목 표시줄의 모양을 조정합니다. 변경 내용을 적용하려면 전체 다시 시작해야 합니다.", "window.nativeTabs": "macOS Sierra 창 탭을 사용하도록 설정합니다. 변경\n 내용을 적용하려면 전체 다시 시작해야 하고, 기본 탭에서\n 사용자 지정 제목 표시줄 스타일(구성된 경우)을 비활성화합니다.", - "windowConfigurationTitle": "창", "zenModeConfigurationTitle": "Zen 모드", "zenMode.fullScreen": "Zen 모드를 켜면 워크벤치도 전체 화면 모드로 전환되는지 여부를 제어합니다.", "zenMode.hideTabs": "Zen 모드를 켜면 워크벤치 탭도 숨길지를 제어합니다.", "zenMode.hideStatusBar": "Zen 모드를 켜면 워크벤치 하단에서 상태 표시줄도 숨길지를 제어합니다.", "zenMode.hideActivityBar": "Zen 모드를 켜면 워크벤치의 왼쪽에 있는 작업 막대도 숨길지\n 여부를 제어합니다.", - "zenMode.restore": "창이 Zen 모드에서 종료된 경우 Zen 모드로 복원할지 제어합니다." + "zenMode.restore": "창이 Zen 모드에서 종료된 경우 Zen 모드로 복원할지 제어합니다.", + "JsonSchema.locale": "사용할 UI 언어입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 46ca3defb9b7..4565e411057f 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "중단점 비활성화", "reapplyAllBreakpoints": "모든 중단점 다시 적용", "addFunctionBreakpoint": "함수 중단점 추가", - "renameFunctionBreakpoint": "함수 중단점 이름 바꾸기", "addConditionalBreakpoint": "조건부 중단점 추가...", "editConditionalBreakpoint": "중단점 편집...", "setValue": "값 설정", diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..cbbc468180a0 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "중단점 편집...", + "functionBreakpointsNotSupported": "이 디버그 형식은 함수 중단점을 지원하지 않습니다.", + "functionBreakpointPlaceholder": "중단할 함수", + "functionBreakPointInputAriaLabel": "함수 중단점 입력" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..a01e9bbdce1d --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "호출 스택 섹션", + "debugStopped": "{0}에서 일시 중지됨", + "callStackAriaLabel": "호출 스택 디버그", + "process": "프로세스", + "paused": "일시 중지됨", + "running": "실행 중", + "thread": "스레드", + "pausedOn": "{0}에서 일시 중지됨", + "loadMoreStackFrames": "더 많은 스택 프레임 로드", + "threadAriaLabel": "스레드 {0}, 호출 스택, 디버그", + "stackFrameAriaLabel": "스택 프레임 {0} 줄 {1} {2}, 호출 스택, 디버그" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 345e2691e987..9b138b5c5854 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "파일 {1}, 줄 {0}에 중단점이 추가되었습니다.", "breakpointRemoved": "파일 {1}, 줄 {0}에서 중단점이 제거되었습니다.", "compoundMustHaveConfigurations": "여러 구성을 시작하려면 복합에 \"configurations\" 특성 집합이 있어야 합니다.", - "configMissing": "'{0}' 구성이 'launch.json'에 없습니다.", "debugRequestNotSupported": "선택한 디버그 구성에서 특성 '{0}'에 지원되지 않는 값 '{1}'이(가) 있습니다.", "debugRequesMissing": "선택한 디버그 구성에 특성 '{0}'이(가) 없습니다.", "debugTypeNotSupported": "구성된 디버그 형식 '{0}'은(는) 지원되지 않습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..2cf507937118 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "변수 섹션", + "variablesAriaTreeLabel": "변수 디버그", + "variableValueAriaLabel": "새 변수 값 입력", + "variableScopeAriaLabel": "{0} 범위, 변수, 디버그", + "variableAriaLabel": "{0} 값 {1}, 변수, 디버그" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..c15eef204055 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "식 섹션", + "watchAriaTreeLabel": "조사식 디버그", + "watchExpressionPlaceholder": "조사할 식", + "watchExpressionInputAriaLabel": "조사식 입력", + "watchExpressionAriaLabel": "{0} 값 {1}, 조사식, 디버그", + "watchVariableAriaLabel": "{0} 값 {1}, 조사식, 디버그" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 0a9211f6a129..68a9c95c957f 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "제거하는 중", "updateAction": "업데이트", "updateTo": "{0}(으)로 업데이트", - "enableForWorkspaceAction.label": "사용(작업 영역)", - "enableAlwaysAction.label": "사용(항상)", - "disableForWorkspaceAction.label": "사용 안 함(작업 영역)", - "disableAlwaysAction.label": "사용 안 함(항상)", "ManageExtensionAction.uninstallingTooltip": "제거하는 중", - "enableForWorkspaceAction": "작업 영역", - "enableGloballyAction": "항상", + "enableForWorkspaceAction": "사용(작업 영역)", + "enableGloballyAction": "사용", "enableAction": "사용", - "disableForWorkspaceAction": "작업 영역", - "disableGloballyAction": "항상", + "disableForWorkspaceAction": "사용 안 함(작업 영역)", + "disableGloballyAction": "사용 안 함", "disableAction": "사용 안 함", "checkForUpdates": "업데이트 확인", "enableAutoUpdate": "확장 자동 업데이트 사용", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "이 작업 영역에 권장되는 확장이 모두 이미 설치되었습니다.", "installRecommendedExtension": "권장되는 확장 설치", "extensionInstalled": "권장되는 확장이 이미 설치되어 있습니다.", - "showRecommendedKeymapExtensions": "권장되는 키 맵 표시", "showRecommendedKeymapExtensionsShort": "키 맵", - "showLanguageExtensions": "언어 확장 표시", "showLanguageExtensionsShort": "언어 확장", - "showAzureExtensions": "Azure 확장 표시", "showAzureExtensionsShort": "Azure 확장", "OpenExtensionsFile.failed": "'.vscode' 폴더({0}) 내에 'extensions.json' 파일을 만들 수 없습니다.", "configureWorkspaceRecommendedExtensions": "권장 확장 구성(작업 영역)", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index ef99dee28ef1..9742da493727 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -9,7 +9,7 @@ "extension": "확장", "extensions": "확장", "view": "보기", + "developer": "개발자", "extensionsConfigurationTitle": "확장", - "extensionsAutoUpdate": "자동으로 확장 업데이트", - "extensionsIgnoreRecommendations": "확장 권장 사항 무시" + "extensionsAutoUpdate": "자동으로 확장 업데이트" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..4b0a8e8d0463 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reportExtensionIssue": "문제 보고" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..11ed628ff541 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "폴더" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..70dd81693214 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "파일", + "revealInSideBar": "세로 막대에 표시", + "acceptLocalChanges": "변경을 적용하고 디스크 콘텐츠 덮어쓰기", + "revertLocalChanges": "변경 내용을 취소하고 디스크의 콘텐츠로 되돌리기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..b962da52ed96 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "다시 시도", + "rename": "이름 바꾸기", + "newFile": "새 파일", + "newFolder": "새 폴더", + "openFolderFirst": "안에 파일이나 폴더를 만들려면 먼저 폴더를 엽니다.", + "newUntitledFile": "제목이 없는 새 파일", + "createNewFile": "새 파일", + "createNewFolder": "새 폴더", + "deleteButtonLabelRecycleBin": "휴지통으로 이동(&&M)", + "deleteButtonLabelTrash": "휴지통으로 이동(&&M)", + "deleteButtonLabel": "삭제(&&D)", + "dirtyMessageFolderOneDelete": "1개 파일에 저장되지 않은 변경 내용이 있는 폴더를 삭제하려고 합니다. 계속하시겠습니까?", + "dirtyMessageFolderDelete": "{0}개 파일에 저장되지 않은 변경 내용이 있는 폴더를 삭제하려고 합니다. 계속하시겠습니까?", + "dirtyMessageFileDelete": "저장되지 않은 변경 내용이 있는 파일을 삭제하려고 합니다. 계속하시겠습니까?", + "dirtyWarning": "변경 내용을 저장하지 않은 경우 변경 내용이 손실됩니다.", + "confirmMoveTrashMessageFolder": "'{0}'과(와) 해당 내용을 삭제할까요?", + "confirmMoveTrashMessageFile": "'{0}'을(를) 삭제할까요?", + "undoBin": "휴지통에서 복원할 수 있습니다.", + "undoTrash": "휴지통에서 복원할 수 있습니다.", + "doNotAskAgain": "이 메시지를 다시 표시 안 함", + "confirmDeleteMessageFolder": "'{0}'과(와) 해당 내용을 영구히 삭제할까요?", + "confirmDeleteMessageFile": "'{0}'을(를) 영구히 삭제할까요?", + "irreversible": "이 작업은 취소할 수 없습니다.", + "permDelete": "영구히 삭제", + "delete": "삭제", + "importFiles": "파일 가져오기", + "confirmOverwrite": "이름이 같은 파일 또는 폴더가 대상 폴더에 이미 있습니다. 덮어쓸까요?", + "replaceButtonLabel": "바꾸기(&&R)", + "copyFile": "복사", + "pasteFile": "붙여넣기", + "duplicateFile": "중복", + "openToSide": "측면에서 열기", + "compareSource": "비교를 위해 선택", + "globalCompareFile": "활성 파일을 다음과 비교...", + "openFileToCompare": "첫 번째 파일을 열어서 다른 파일과 비교합니다.", + "compareWith": "'{0}'과(와) '{1}' 비교", + "compareFiles": "파일 비교", + "refresh": "새로 고침", + "save": "저장", + "saveAs": "다른 이름으로 저장...", + "saveAll": "모두 저장", + "saveAllInGroup": "그룹의 모든 항목 저장", + "saveFiles": "파일 모두 저장", + "revert": "파일 되돌리기", + "focusOpenEditors": "열려 있는 편집기 뷰에 포커스", + "focusFilesExplorer": "파일 탐색기에 포커스", + "showInExplorer": "세로 막대에서 활성 파일 표시", + "openFileToShow": "탐색기에 표시하려면 먼저 파일을 엽니다.", + "collapseExplorerFolders": "탐색기에서 폴더 축소", + "refreshExplorer": "탐색기 새로 고침", + "openFileInNewWindow": "새 창에서 활성 파일 열기", + "openFileToShowInNewWindow": "먼저 파일 한 개를 새 창에서 엽니다.", + "revealInWindows": "탐색기에 표시", + "revealInMac": "Finder에 표시", + "openContainer": "상위 폴더 열기", + "revealActiveFileInWindows": "Windows 탐색기에 활성 파일 표시", + "revealActiveFileInMac": "Finder에 활성 파일 표시", + "openActiveFileContainer": "활성 파일의 상위 폴더 열기", + "copyPath": "경로 복사", + "copyPathOfActive": "활성 파일의 경로 복사", + "emptyFileNameError": "파일 또는 폴더 이름을 입력해야 합니다.", + "fileNameExistsError": "파일 또는 폴더 **{0}**이(가) 이 위치에 이미 있습니다. 다른 이름을 선택하세요.", + "invalidFileNameError": "**{0}**(이)라는 이름은 파일 또는 폴더 이름으로 올바르지 않습니다. 다른 이름을 선택하세요.", + "filePathTooLongError": "**{0}**(이)라는 이름을 사용하면 경로가 너무 길어집니다. 짧은 이름을 선택하세요.", + "compareWithSaved": "활성 파일을 저장된 파일과 비교", + "modifiedLabel": "{0}(디스크) ↔ {1}" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..f77f75c50138 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "첫 번째 파일을 열어서 경로를 복사합니다.", + "openFileToReveal": "첫 번째 파일을 열어서 나타냅니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..64e3a748c1d3 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "탐색기 표시", + "explore": "탐색기", + "view": "보기", + "textFileEditor": "텍스트 파일 편집기", + "binaryFileEditor": "이진 파일 편집기", + "filesConfigurationTitle": "파일", + "exclude": "파일 및 폴더를 제외하도록 GLOB 패턴을 구성합니다. 예를 들어 파일 탐색기는 이 설정에 따라 표시하거나 숨길 파일 및 폴더를 결정합니다.", + "files.exclude.boolean": "파일 경로를 일치시킬 GLOB 패턴입니다. 패턴을 사용하거나 사용하지 않도록 설정하려면 true 또는 false로 설정하세요.", + "files.exclude.when": "일치하는 파일의 형제에 대한 추가 검사입니다. $(basename)을 일치하는 파일 이름에 대한 변수로 사용하세요.", + "associations": "파일과 언어의 연결을 구성하세요(예: \"*.extension\": \"html\"). 이러한 구성은 설치된 언어의 기본 연결보다 우선 순위가 높습니다.", + "encoding": "파일을 읽고 쓸 때 사용할 기본 문자 집합 인코딩입니다. 이 설정은 언어별로 구성할 수도 있습니다.", + "autoGuessEncoding": "사용하도록 설정하는 경우 파일을 열 때 문자 집합 인코딩을 추측합니다. 이 설정은 언어별로 구성할 수도 있습니다.", + "eol": "줄 바꿈 문자의 기본 끝입니다. LF에는 \\n, CRLF에는 \\r\\n을 사용하세요.", + "trimTrailingWhitespace": "사용하도록 설정되면 파일을 저장할 때 후행 공백이 잘립니다.", + "insertFinalNewline": "사용하도록 설정되면 저장할 때 파일 끝에 마지막 줄바꿈을 삽입합니다.", + "trimFinalNewlines": "사용하도록 설정되면 저장할 때 파일 끝에 마지막 줄 바꿈 이후의 모든 줄 바꿈이 잘립니다.", + "files.autoSave.off": "더티 파일이 자동으로 저장되지 않습니다.", + "files.autoSave.afterDelay": "'files.autoSaveDelay' 구성 후 더티 파일이 자동으로 저장됩니다.", + "files.autoSave.onFocusChange": "편집기가 포커스를 잃으면 더티 파일이 자동으로 저장됩니다.", + "files.autoSave.onWindowChange": "창이 포커스를 잃으면 더티 파일이 자동으로 저장됩니다.", + "autoSave": "더티 파일 자동 저장을 제어합니다. 허용되는 값은 '{0}', '{1}', '{2}'(편집기가 포커스를 잃음), '{3}'(창이 포커스를 잃음)입니다. '{4}'(으)로 설정하는 경우 'files.autoSaveDelay'에서 지연을 구성할 수 있습니다.", + "autoSaveDelay": "더티 파일을 자동으로 저장할 때까지의 지연(밀리초)을 제어합니다. 'files.autoSave'를 '{0}'(으)로 설정한 경우에만 적용됩니다.", + "watcherExclude": "파일 감시에서 제외할 파일 경로의 GLOB 패턴을 구성하세요. 패턴은 절대 경로(**접두사가 있는 경로 또는 전체 경로)여야 합니다. 이 설정을 변경하려면 다시 시작해야 합니다. 시작 시 Code에서 CPU 시간을 많이 차지하면 대용량 폴더를 제외하여 초기 로드를 줄일 수 있습니다.", + "hotExit.off": "핫 종료를 사용하지 않습니다.", + "hotExit.onExit": "핫 종료는 응용 프로그램을 닫을 때 트리거됩니다. 즉 Windows/Linux에서 마지막 창을 닫을 때나 workbench.action.quit 명령이 트리거될 때(명령 팔레트, 키 바인딩, 메뉴)입니다. 다음 실행 시 백업을 포함한 모든 창이 복원됩니다.", + "hotExit.onExitAndWindowClose": "핫 종료는 응용 프로그램을 닫을 때 트리거됩니다. 즉 Windows/Linux에서 마지막 창을 닫을 때나 workbench.action.quit 명령이 트리거될 때(명령 팔레트, 키 바인딩, 메뉴), 또한 마지막 창인지 여부에 상관없이 폴더가 열린 모든 창의 경우입니다. 열린 폴더가 없는 모든 창은 다음 실행 시 복원됩니다. 종료되기 전 상태로 폴더 창을 복원하려면 \"window.restoreWindows\"를 \"all\"로 설정합니다.", + "hotExit": "저장하지 않은 파일을 세션 간에 기억하여, 편집기를 종료할 때 저장할지 묻는 메시지를 건너뛸지 여부를 제어합니다.", + "useExperimentalFileWatcher": "새로운 실험 파일 감시자를 사용하세요.", + "defaultLanguage": "새 파일에 할당되는 기본 언어 모드입니다.", + "editorConfigurationTitle": "편집기", + "formatOnSave": "파일 저장 시 서식을 지정합니다. 포맷터를 사용할 수 있어야 하며, 파일이 자동으로 저장되지 않아야 하고, 편집기가 종료되지 않아야 합니다.", + "explorerConfigurationTitle": "파일 탐색기", + "openEditorsVisible": "열려 있는 편집기 창에 표시되는 편집기 수입니다. 창을 숨기려면 0으로 설정합니다.", + "dynamicHeight": "열려 있는 편집기 섹션의 높이가 요소 수에 따라 동적으로 조정되는지 여부를 제어합니다.", + "autoReveal": "탐색기에서 파일을 열 때 자동으로 표시하고 선택할지를 제어합니다.", + "enableDragAndDrop": "탐색기에서 끌어서 놓기를 통한 파일 및 폴더 이동을 허용하는지를 제어합니다.", + "confirmDragAndDrop": "끌어서 놓기를 사용하여 파일 및 폴더를 이동하기 위해 탐색기에서 확인을 요청해야 하는지 제어합니다.", + "confirmDelete": "파일을 휴지통에서 삭제할 때 탐색기에서 확인을 요청해야 하는지 제어합니다.", + "sortOrder.default": "파일 및 폴더가 이름을 기준으로 사전순으로 정렬됩니다. 폴더가 파일 앞에 표시됩니다.", + "sortOrder.mixed": "파일 및 폴더가 이름을 기준으로 사전순으로 정렬됩니다. 파일이 폴더와 결합됩니다.", + "sortOrder.filesFirst": "파일 및 폴더가 이름을 기준으로 사전순으로 정렬됩니다. 파일이 폴더 앞에 표시됩니다.", + "sortOrder.type": "파일 및 폴더가 확장명을 기준으로 사전순으로 정렬됩니다. 폴더가 파일 앞에 표시됩니다.", + "sortOrder.modified": "파일 및 폴더가 마지막으로 수정한 날짜를 기준으로 내림차순 정렬됩니다. 폴더가 파일 앞에 표시됩니다.", + "sortOrder": "탐색기에서 파일 및 폴더의 정렬 순서를 제어합니다. 기본 정렬 외에 순서를 'mixed'(파일 및 폴더가 결합되어 정렬), 'type'(파일 형식 기준), 'modified'(마지막으로 수정한 날짜 기준) 또는 'filesFirst'(파일을 폴더 앞에 정렬)로 설정할 수 있습니다.", + "explorer.decorations.colors": "파일 장식에 색을 사용해야 하는지 제어합니다.", + "explorer.decorations.badges": "파일 장식에 배지를 사용해야 하는지 제어합니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..6cf353ae7129 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "오른쪽 편집기 도구 모음의 작업을 사용하여 변경 내용을 **실행 취소**하거나 디스크의 콘텐츠를 변경 내용으로 **덮어쓰기**", + "discard": "삭제", + "overwrite": "덮어쓰기", + "retry": "다시 시도", + "readonlySaveError": "'{0}'을(를) 저장하지 못했습니다. 파일이 쓰기 보호되어 있습니다. 보호를 제거하려면 '덮어쓰기'를 선택하세요.", + "genericSaveError": "'{0}'을(를) 저장하지 못했습니다. {1}", + "staleSaveError": "'{0}'을(를) 저장하지 못했습니다. 디스크의 내용이 최신 버전입니다. 버전을 디스크에 있는 버전과 비교하려면 **비교**를 클릭하세요.", + "compareChanges": "비교", + "saveConflictDiffLabel": "{0}(디스크에 있음) ↔ {1}({2}에 있음) - 저장 충돌 해결" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..4ce15b3e32b3 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "열린 폴더 없음", + "explorerSection": "파일 탐색기 섹션", + "noWorkspaceHelp": "작업 영역에 아직 폴더를 추가하지 않았습니다.", + "noFolderHelp": "아직 폴더를 열지 않았습니다.", + "openFolder": "폴더 열기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..89eb88bfbfeb --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "탐색기", + "canNotResolve": "작업 영역 폴더를 확인할 수 없습니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..e98c63b21c89 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "파일 탐색기 섹션", + "treeAriaLabel": "파일 탐색기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..249d7018e6a3 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "파일 이름을 입력합니다. 확인하려면 Enter 키를 누르고, 취소하려면 Esc 키를 누릅니다.", + "filesExplorerViewerAriaLabel": "{0}, 파일 탐색기", + "dropFolders": "작업 영역에 폴더를 추가하시겠습니까?", + "dropFolder": "작업 영역에 폴더를 추가하시겠습니까?", + "addFolders": "폴더 추가(&&A)", + "addFolder": "폴더 추가(&&A)", + "confirmMove": "'{0}'을(를) 이동하시겠습니까?", + "doNotAskAgain": "이 메시지를 다시 표시 안 함", + "moveButtonLabel": "이동(&&M)", + "confirmOverwriteMessage": "'{0}'이(가) 대상 폴더에 이미 있습니다. 바꿀까요?", + "irreversible": "이 작업은 취소할 수 없습니다.", + "replaceButtonLabel": "바꾸기(&&R)" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..56030126c946 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "열려 있는 편집기", + "openEditosrSection": "열려 있는 편집기 섹션", + "dirtyCounter": "{0}이(가) 저장되지 않음", + "saveAll": "모두 저장", + "closeAllUnmodified": "미수정 항목 닫기", + "closeAll": "모두 닫기", + "compareWithSaved": "저장된 항목과 비교", + "close": "닫기", + "closeOthers": "기타 항목 닫기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..4946bd4745ce --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, 편집기 그룹", + "openEditorAriaLabel": "{0}, 편집기 열기", + "saveAll": "모두 저장", + "closeAllUnmodified": "미수정 항목 닫기", + "closeAll": "모두 닫기", + "compareWithSaved": "저장된 항목과 비교", + "close": "닫기", + "closeOthers": "기타 항목 닫기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/kor/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/kor/src/vs/workbench/parts/markers/common/messages.i18n.json index 08ea34ce594a..fb8699cf20f2 100644 --- a/i18n/kor/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,6 @@ { "viewCategory": "보기", "problems.view.toggle.label": "설정/해제 문제", - "problems.view.show.label": "문제 표시", - "problems.view.hide.label": "숨기기 문제", "problems.panel.configuration.title": "문제 보기", "problems.panel.configuration.autoreveal": "문제 보기를 열 때 문제 보기에 자동으로 파일이 표시되어야 하는지를 제어합니다.", "markers.panel.title.problems": "문제", diff --git a/i18n/kor/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/kor/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..d0885df52551 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "프로필을 만들었습니다.", + "prof.detail": "문제를 발생시키고 다음 파일을 수동으로 첨부하세요.\n{0}", + "prof.restartAndFileIssue": "문제 만들기 및 다시 시작", + "prof.restart": "다시 시작", + "prof.thanks": "도움을 주셔서 감사합니다.", + "prof.detail.restart": "계속 '{0}'을(를) 사용하려면 마지막으로 다시 시작해야 합니다. 기여해 주셔서 다시 한번 감사드립니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 667bd135979e..edf361223f66 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "원하는 키 조합을 입력하고 키를 누릅니다. 취소하려면 키를 누릅니다.", "defineKeybinding.chordsTo": "현" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index f6f3684850fb..adf5c1ee8583 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "키 바인딩 변경", "addKeybindingLabelWithKey": "키 바인딩 {0} 추가", "addKeybindingLabel": "키 바인딩 추가", + "title": "{0}({1})", "commandAriaLabel": "명령은 {0}입니다.", "keybindingAriaLabel": "키 바인딩은 {0}입니다.", "noKeybinding": "키 바인딩이 할당되지 않았습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index ff68e7246b74..0356863191a9 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,11 @@ "settingsEditorName": "기본 설정", "SearchSettingsWidget.AriaLabel": "설정 검색", "SearchSettingsWidget.Placeholder": "설정 검색", - "totalSettingsMessage": "총 {0}개 설정", "noSettingsFound": "결과 없음", "oneSettingFound": "1개 설정 일치함", "settingsFound": "{0}개 설정 일치함", - "fileEditorWithInputAriaLabel": "{0}. 텍스트 파일 편집기입니다.", - "fileEditorAriaLabel": "텍스트 파일 편집기입니다.", + "totalSettingsMessage": "총 {0}개 설정", + "defaultSettings": "기본 설정", "defaultEditorReadonly": "기본값을 재정의하려면 오른쪽 편집기를 편집하세요.", "preferencesAriaLabel": "기본 설정. 읽기 전용 텍스트 편집기입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 7a02526e6fae..c9e560bb0ca1 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "설정을 여기에 넣어서 기본 설정을 덮어씁니다.", "emptyWorkspaceSettingsHeader": "설정을 여기에 넣어서 사용자 설정을 덮어씁니다.", "emptyFolderSettingsHeader": "폴더 설정을 여기에 넣어서 작업 영역 설정을 덮어씁니다.", - "defaultFolderSettingsTitle": "기본 폴더 설정", - "defaultSettingsTitle": "기본 설정", "editTtile": "편집", "replaceDefaultValue": "설정에서 바꾸기", "copyDefaultValue": "설정에 복사", diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index dad1ce0c9be2..7a4c308d03cc 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "유사 항목 검색을 사용해보세요!", "defaultSettings": "설정을 오른쪽 편집기에 넣어서 덮어씁니다.", "noSettingsFound": "설정을 찾을 수 없습니다.", - "folderSettingsDetails": "폴더 설정", - "enableFuzzySearch": "실험 유사 항목 검색 사용" + "settingsSwitcherBarAriaLabel": "설정 전환기", + "userSettings": "사용자 설정", + "workspaceSettings": "작업 영역 설정" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..c37bd69f7318 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "기본 설정 편집기", + "keybindingsEditor": "키 바인딩 편집기", + "preferences": "기본 설정" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 7706711508b2..f5dbc3eb3181 100644 --- a/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "소스 제어 공급자", "hideRepository": "숨기기", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "추가 SCM 공급자 설치...", "no open repo": "활성 소스 제어 공급자가 없습니다.", "source control": "소스 제어", diff --git a/i18n/kor/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/kor/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 70914be26488..25d60399f44f 100644 --- a/i18n/kor/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -4,7 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultLabel": "입력", - "useIgnoreFilesDescription": "파일 무시 사용", - "useExcludeSettingsDescription": "제외 설정 사용" + "defaultLabel": "입력" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 2d787a2e21c9..9b239f6fd5f9 100644 --- a/i18n/kor/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "파일 경로를 일치시킬 GLOB 패턴입니다. 패턴을 사용하거나 사용하지 않도록 설정하려면 true 또는 false로 설정하세요.", "exclude.when": "일치하는 파일의 형제에 대한 추가 검사입니다. $(basename)을 일치하는 파일 이름에 대한 변수로 사용하세요.", "useRipgrep": "텍스트 및 파일 검색에서 ripgrep 사용 여부를 제어합니다.", - "useIgnoreFilesByDefault": "새 작업 영역에서 검색할 때 기본적으로 .gitignore 파일 및 .ignore 파일을 사용할지 여부를 제어합니다.", "useIgnoreFiles": "파일을 검색할 때 .gitignore 파일 및 .ignore 파일을 사용할지 여부를 제어합니다.", "search.quickOpen.includeSymbols": "Quick Open에 대한 파일 결과에 전역 기호 검색 결과를 포함하도록 구성합니다.", "search.followSymlinks": "검색하는 동안 symlink를 누를지 여부를 제어합니다." diff --git a/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 2feb55cb593c..b045a022b272 100644 --- a/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "이전 검색 제외 패턴 표시", "nextSearchTerm": "다음 검색어 표시", "previousSearchTerm": "이전 검색어 표시", - "focusNextInputBox": "다음 입력 상자에 포커스", - "focusPreviousInputBox": "이전 입력 상자에 포커스", "showSearchViewlet": "검색 표시", "findInFiles": "파일에서 찾기", "findInFilesWithSelectedText": "선택한 텍스트가 있는 파일에서 찾기", "replaceInFiles": "파일에서 바꾸기", "replaceInFilesWithSelectedText": "선택한 텍스트가 있는 파일에서 바꾸기", - "findInWorkspace": "작업 영역에서 찾기...", - "findInFolder": "폴더에서 찾기...", "RefreshAction.label": "새로 고침", - "ClearSearchResultsAction.label": "검색 결과 지우기", + "CollapseDeepestExpandedLevelAction.label": "모두 축소", + "ClearSearchResultsAction.label": "지우기", "FocusNextSearchResult.label": "다음 검색 결과에 포커스", "FocusPreviousSearchResult.label": "이전 검색 결과에 포커스", "RemoveAction.label": "해제", diff --git a/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..9b239f6fd5f9 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "작업 영역에서 기호로 이동...", + "name": "검색", + "search": "검색", + "view": "보기", + "openAnythingHandlerDescription": "파일로 이동", + "openSymbolDescriptionNormal": "작업 영역에서 기호로 이동", + "searchOutputChannelTitle": "검색", + "searchConfigurationTitle": "검색", + "exclude": "검색에서 파일 및 폴더를 제외하도록 GLOB 패턴을 구성합니다. files.exclude 설정에서 모든 GLOB 패턴을 상속합니다.", + "exclude.boolean": "파일 경로를 일치시킬 GLOB 패턴입니다. 패턴을 사용하거나 사용하지 않도록 설정하려면 true 또는 false로 설정하세요.", + "exclude.when": "일치하는 파일의 형제에 대한 추가 검사입니다. $(basename)을 일치하는 파일 이름에 대한 변수로 사용하세요.", + "useRipgrep": "텍스트 및 파일 검색에서 ripgrep 사용 여부를 제어합니다.", + "useIgnoreFiles": "파일을 검색할 때 .gitignore 파일 및 .ignore 파일을 사용할지 여부를 제어합니다.", + "search.quickOpen.includeSymbols": "Quick Open에 대한 파일 결과에 전역 기호 검색 결과를 포함하도록 구성합니다.", + "search.followSymlinks": "검색하는 동안 symlink를 누를지 여부를 제어합니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/kor/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 56b330a8ddb3..e0344b0285be 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,9 +6,7 @@ { "tasksCategory": "작업", "ConfigureTaskRunnerAction.label": "작업 구성", - "ConfigureBuildTaskAction.label": "빌드 작업 구성", "CloseMessageAction.label": "닫기", - "ShowTerminalAction.label": "터미널 보기", "problems": "문제", "manyMarkers": "99+", "runningTasks": "실행 중인 작업 표시", @@ -52,7 +50,6 @@ "TaslService.noEntryToRun": "실행할 작업이 없습니다. 작업 구성...", "TaskService.fetchingBuildTasks": "빌드 작업을 페치하는 중...", "TaskService.pickBuildTask": "실행할 빌드 작업 선택", - "TaskService.noBuildTask": "실행할 빌드 작업이 없습니다. 작업 구성...", "TaskService.fetchingTestTasks": "테스트 작업을 페치하는 중...", "TaskService.pickTestTask": "실행할 테스트 작업 선택", "TaskService.noTestTaskTerminal": "실행할 테스트 작업이 없습니다. 작업 구성...", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index d676ae23acbe..7638704dea1e 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,6 @@ "ConfigurationParser.noTypeDefinition": "오류: 등록된 작업 형식 '{0}'이(가) 없습니다. 해당하는 작업 공급자를 제공하는 확장을 설치하지 않으셨습니까?", "ConfigurationParser.missingRequiredProperty": "오류: 작업 구성 '{0}'에 필요한 속성 '{1}'이(가) 없습니다. 작업 구성이 무시됩니다.", "ConfigurationParser.notCustom": "오류: 작업이 사용자 지정 작업으로 선언되지 않았습니다. 이 구성은 무시됩니다.\n{0}\n", - "ConfigurationParser.noTaskName": "오류: 작업에서 taskName 속성을 제공해야 합니다. 이 작업은 무시됩니다.\n{0}\n", - "taskConfiguration.shellArgs": "경고: 작업 '{0}'은(는) 셸 명령이며, 명령 이름이나 인수 중 하나에 이스케이프되지 않은 공백이 있습니다. 명령줄 인용을 올바르게 하려면 인수를 명령으로 병합하세요.", "taskConfiguration.noCommandOrDependsOn": "오류: 작업 '{0}'에서 명령이나 dependsOn 속성을 지정하지 않습니다. 이 작업은 무시됩니다. 해당 작업의 정의는 {1}입니다.", "taskConfiguration.noCommand": "오류: 작업 '{0}'에서 명령을 정의하지 않습니다. 이 작업은 무시됩니다. 해당 작업의 정의는\n{1}입니다.", "TaskParse.noOsSpecificGlobalTasks": "작업 버전 2.0.0은 글로벌 OS별 작업을 지원하지 않습니다. OS별 명령을 사용하여 작업으로 변환하세요. 영향을 받는 작업::\n{0}" diff --git a/i18n/kor/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index 0c1970cb3cfe..456b167f15a6 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, 터미널 선택기", "termCreateEntryAriaLabel": "{0}, 새 터미널 만들기", - "'workbench.action.terminal.newplus": "$(plus) 새 통합 터미널 만들기", + "workbench.action.terminal.newplus": "$(plus) 새 통합 터미널 만들기", "noTerminalsMatching": "일치하는 터미널 없음", "noTerminalsFound": "열린 터미널 없음" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 1b4f36cd6712..1a66c6cd5375 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,6 @@ "terminal.integrated.rightClickCopyPaste": "설정하는 경우 터미널 내에서 마우스 오른쪽 단추를 클릭할 때 상황에 맞는 메뉴가 표시되지 않고 대신 선택 항목이 있으면 복사하고 선택 항목이 없으면 붙여넣습니다.", "terminal.integrated.fontFamily": "터미널의 글꼴 패밀리를 제어하며, 기본값은 editor.fontFamily의 값입니다.", "terminal.integrated.fontSize": "터미널의 글꼴 크기(픽셀)를 제어합니다.", - "terminal.integrated.lineHeight": "터미널의 줄 높이를 제어하며, 이 숫자는 터미널 글꼴 크기를 곱하여 실제 줄 높이(픽셀)를 얻습니다.", "terminal.integrated.enableBold": "터미널 내에서 굵은 텍스트를 사용하도록 설정할지 여부이며, 터미널 셸의 지원이 필요합니다.", "terminal.integrated.cursorBlinking": "터미널 커서 깜박임 여부를 제어합니다.", "terminal.integrated.cursorStyle": "터미널 커서의 스타일을 제어합니다.", diff --git a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index b3a4598456f7..43a0bba1a526 100644 --- a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -8,10 +8,9 @@ "installColorThemes": "추가 색 테마 설치...", "themes.selectTheme": "색 테마 선택(미리 보려면 위로/아래로 키 사용)", "selectIconTheme.label": "파일 아이콘 테마", - "installIconThemes": "추가 파일 아이콘 테마 설치...", "noIconThemeLabel": "없음", "noIconThemeDesc": "파일 아이콘 사용 안 함", - "problemChangingIconTheme": "아이콘 테마를 설정하는 동안 문제 발생: {0}", + "installIconThemes": "추가 파일 아이콘 테마 설치...", "themes.selectIconTheme": "파일 아이콘 테마 선택", "generateColorTheme.label": "현재 설정에서 색 테마 생성", "preferences": "기본 설정", diff --git a/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index c3734d9997df..a790ec1d90c5 100644 --- a/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "[사용자] 설정 또는 [작업 영역] 설정에서 구성할 수 있는 창 특정 구성입니다.", "scope.resource.description": "사용자, 작업 영역 또는 폴더 설정에서 구성할 수 있는 리소스 특정 구성", "scope.description": "구성이 적용되는 범위입니다. 사용 가능 범위는 '창'과 '리소스'입니다.", + "vscode.extension.contributes.defaultConfiguration": "언어별로 기본 편집기 구성 설정을 적용합니다.", "vscode.extension.contributes.configuration": "구성 설정을 적용합니다.", "invalid.title": "'configuration.title'은 문자열이어야 합니다.", - "vscode.extension.contributes.defaultConfiguration": "언어별로 기본 편집기 구성 설정을 적용합니다.", "invalid.properties": "'configuration.properties'는 개체여야 합니다.", "invalid.allOf": "'configuration.allOf'는 사용되지 않으며 더 이상 사용해서는 안됩니다. 대신 여러 구성 섹션을 배열로 'configuration' 기여 지점에 전달하세요.", "workspaceConfig.folders.description": "작업 영역에 로드되는 폴더 목록입니다.", diff --git a/i18n/kor/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/kor/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..cff423b1f3bf --- /dev/null +++ b/i18n/kor/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "원격 분석", + "telemetry.enableCrashReporting": "충돌 보고서를 Microsoft에 전송할 수 있도록 설정합니다.\n이 옵션을 적용하려면 다시 시작해야 합니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/kor/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index ba22c381c7dc..8b6ad71cd4e6 100644 --- a/i18n/kor/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "bubbleTitle": "강조된 항목 포함" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json index 28c96c9fb3d9..0ad83956b0f9 100644 --- a/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "파일이 디렉터리입니다.", "fileNotModifiedError": "파일 수정 안 됨", "fileTooLargeError": "파일이 너무 커서 열 수 없음", - "fileBinaryError": "파일이 이진인 것 같으므로 테스트로 열 수 없습니다.", "fileNotFoundError": "파일을 찾을 수 없습니다({0}).", + "fileBinaryError": "파일이 이진인 것 같으므로 테스트로 열 수 없습니다.", "fileExists": "만드려는 파일이 이미 있음({0})", "fileMoveConflict": "이동/복사할 수 없습니다. 대상에 파일이 이미 있습니다.", "unableToMoveCopyError": "이동/복사할 수 없습니다. 파일이 포함된 폴더를 파일로 대체합니다.", diff --git a/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 1d3e36aa30f3..10bf5a9ef4f0 100644 --- a/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -21,6 +21,5 @@ "keybindings.json.command": "실행할 명령의 이름", "keybindings.json.when": "키가 활성화되는 조건입니다.", "keybindings.json.args": "실행할 명령에 전달할 인수입니다.", - "keyboardConfigurationTitle": "키보드", - "dispatch": "`keydown.code`(권장) 또는 `keydown.keyCode`를 사용하는 키 누름에 대한 디스패치 논리를 제어합니다." + "keyboardConfigurationTitle": "키보드" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/kor/src/vs/workbench/services/textfile/common/textFileService.i18n.json index 71888705e2c8..8b6ad71cd4e6 100644 --- a/i18n/kor/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "files.backup.failSave": "파일을 백업할 수 없습니다(오류: {0}). 종료하려면 파일을 저장해 보세요." -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index c7ed3a3fe46a..d365ddcbff53 100644 --- a/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "새 테마 설정이 사용자 설정에 추가되었습니다. {0}에서 백업을 사용할 수 있습니다.", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "Specifies the color theme used in the workbench.", "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "워크벤치에서 사용되는 아이콘 테마를 지정합니다. 'null'로 지정하면 파일 아이콘을 표시하지 않습니다.", diff --git a/i18n/ptb/extensions/css/client/out/cssMain.i18n.json b/i18n/ptb/extensions/css/client/out/cssMain.i18n.json index a649796227bd..4eeecc57ff2a 100644 --- a/i18n/ptb/extensions/css/client/out/cssMain.i18n.json +++ b/i18n/ptb/extensions/css/client/out/cssMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "cssserver.name": "Servidor de linguagem CSS" + "cssserver.name": "Servidor de linguagem CSS", + "folding.start": "Início da Região Expansível", + "folding.end": "Fim da Região Expansível" } \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/autofetch.i18n.json b/i18n/ptb/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..1c3c1cf318da --- /dev/null +++ b/i18n/ptb/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Sim", + "no": "Não", + "not now": "Agora Não", + "suggest auto fetch": "Deseja habilitar o autopreenchimento dos repositórios Git?" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/commands.i18n.json b/i18n/ptb/extensions/git/out/commands.i18n.json index d3e314a0e151..03a6223ad1dc 100644 --- a/i18n/ptb/extensions/git/out/commands.i18n.json +++ b/i18n/ptb/extensions/git/out/commands.i18n.json @@ -9,9 +9,12 @@ "create branch": "$(plus) criar nova ramificação", "repourl": "URL do repositório", "parent": "Diretório pai", + "cancel": "$(sync~spin) Clonando o repositório... Clique para cancelar", + "cancel tooltip": "Cancelar o clone", "cloning": "Clonando repositório do Git...", "openrepo": "Abrir Repositório", "proposeopen": "Gostaria de abrir o repositório clonado?", + "init": "Escolher a pasta de trabalho para inicializar o git repo", "init repo": "Inicializar Repositório", "create repo": "Inicializar Repositório", "are you sure": "Isto irá criar um repositório Git em '{0}'. Tem certeza que deseja continuar?", @@ -49,12 +52,15 @@ "select branch to delete": "Selecione uma ramificação para excluir", "confirm force delete branch": "A ramificação '{0}' não foi totalmente mesclada. Excluir mesmo assim?", "delete branch": "Excluir ramificação", + "invalid branch name": "Nome da ramificação inválido.", + "branch already exists": "Um ramo chamado '{0}' já existe", "select a branch to merge from": "Selecione uma ramificação para mesclar", "merge conflicts": "Existem conflitos de mesclagem. Resolva-os antes de confirmar.", "tag name": "Nome do rótulo", "provide tag name": "Por favor, forneça um nome de Tag", "tag message": "Mensagem", "provide tag message": "Por favor, forneça uma mensagem para comentar o rótulo", + "no remotes to fetch": "Este repositório não possui remotos configurados para buscar algo", "no remotes to pull": "O seu repositório não possui remotos configurados para efetuar pull.", "pick remote pull repo": "Selecione um remoto para efeutar o pull da ramificação", "no remotes to push": "O seu repositório não possui remotos configurados para efetuar push.", @@ -71,7 +77,7 @@ "no stashes": "Não há esconderijos para restaurar.", "pick stash to pop": "Escolher um esconderijo de pop", "clean repo": "Por favor, limpe sua árvore de trabalho do repositório antes de fazer check-out.", - "cant push": "Não pode empurrar referências para remoto. Execute 'Pull' primeiro para integrar suas alterações.", + "cant push": "Não foi possível enviar referências para ramoto. Tente executar primeiro o 'Pull' para integrar com suas modificações.", "git error details": "Git: {0}", "git error": "Erro de Git", "open git log": "Abrir Histórico do Git" diff --git a/i18n/ptb/extensions/git/out/main.i18n.json b/i18n/ptb/extensions/git/out/main.i18n.json index ae1dee260329..9991e6dc5e92 100644 --- a/i18n/ptb/extensions/git/out/main.i18n.json +++ b/i18n/ptb/extensions/git/out/main.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Procurando por git em: {0}", "using git": "Usando git {0} de {1}", - "updateGit": "Atualizar o Git", + "downloadgit": "Baixar o Git", "neverShowAgain": "Não mostrar novamente", + "notfound": "Git não encontrado. Instale ou configure usando a configuração 'git.path'.", + "updateGit": "Atualizar o Git", "git20": "Você parece ter o git {0} instalado. Code funciona melhor com git > = 2" } \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/repository.i18n.json b/i18n/ptb/extensions/git/out/repository.i18n.json index d9855ba9df28..214c9e1d36f0 100644 --- a/i18n/ptb/extensions/git/out/repository.i18n.json +++ b/i18n/ptb/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Excluído por nós", "both added": "Ambos adicionados", "both modified": "Ambos modificados", + "commitMessage": "Mensagem (tecle {0} para confirmar)", "commit": "Confirmar", "merge changes": "Mesclar Alterações", "staged changes": "Alterações em Etapas", diff --git a/i18n/ptb/extensions/git/package.i18n.json b/i18n/ptb/extensions/git/package.i18n.json index 99f6aa755f8f..81db50ac04f6 100644 --- a/i18n/ptb/extensions/git/package.i18n.json +++ b/i18n/ptb/extensions/git/package.i18n.json @@ -33,8 +33,10 @@ "command.checkout": "Fazer checkout para...", "command.branch": "Criar Ramificação...", "command.deleteBranch": "Excluir Ramificação...", + "command.renameBranch": "Renomear o Branch", "command.merge": "Mesclar ramificação...", "command.createTag": "Criar Tag", + "command.fetch": "Buscar", "command.pull": "Efetuar pull", "command.pullRebase": "Efetuar pull (Rebase)", "command.pullFrom": "Fazer pull de...", @@ -42,9 +44,11 @@ "command.pushTo": "Enviar por push para...", "command.pushWithTags": "Mover com Tags", "command.sync": "Sincronizar", + "command.syncRebase": "Sincronização (Rebase)", "command.publish": "Publicar Ramo", "command.showOutput": "Mostrar Saída do Git", "command.ignore": "Adicionar arquivo ao .gitignore", + "command.stashIncludeUntracked": "Estoque (incluir não controlados)", "command.stash": "Esconder", "command.stashPop": "Pop Stash...", "command.stashPopLatest": "Pop mais recente Stash", @@ -57,6 +61,7 @@ "config.countBadge": "Controla o contador de distintivos do git. 'todos' considera todas as alterações. 'rastreado' considera apenas as alterações controladas. 'desligado' desliga o contador.", "config.checkoutType": "Controla quais tipos de ramos são listados quando executando `Checkout para... `. `todos` mostra todas as referências, `local` mostra apenas os ramos locais, `etiqueta` mostra apenas etiquetas e `remoto` mostra apenas os ramos remotos.", "config.ignoreLegacyWarning": "Ignora o aviso de Git legado", + "config.ignoreMissingGitWarning": "Ignora o aviso quando Git não existir.", "config.ignoreLimitWarning": "Ignora o aviso quando houver muitas alterações em um repositório", "config.defaultCloneDirectory": "O local padrão onde clonar um repositório git", "config.enableSmartCommit": "Confirme todas as alterações quando não há modificações planejadas.", diff --git a/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json b/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json index 314d1e5c58ac..30700d15da1e 100644 --- a/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json +++ b/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "htmlserver.name": "Servidor de Linguagem HTML" + "htmlserver.name": "Servidor de Linguagem HTML", + "folding.start": "Início da Região Expansível", + "folding.end": "Fim da Região Expansível" } \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/commands.i18n.json b/i18n/ptb/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..2396a32ab231 --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "Visualização {0}", + "onPreviewStyleLoadError": "Não foi possível carregar o 'markdown.styles': {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/ptb/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..b8fe23c62622 --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Algum conteúdo foi desativado neste documento", + "preview.securityMessage.title": "Conteúdo potencialmente inseguro foi desativado na visualização de remarcação. Altere a configuração de segurança de visualização do Markdown para permitir conteúdo inseguro ou habilitar scripts", + "preview.securityMessage.label": "Conteúdo do aviso de segurança desativado" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/security.i18n.json b/i18n/ptb/extensions/markdown/out/security.i18n.json index c0b18587a31f..3d066b17ee30 100644 --- a/i18n/ptb/extensions/markdown/out/security.i18n.json +++ b/i18n/ptb/extensions/markdown/out/security.i18n.json @@ -11,5 +11,8 @@ "disable.title": "Desabilitar", "disable.description": "Permitir a execução de conteúdo e scripts. Não recomendado", "moreInfo.title": "Mais informações", + "enableSecurityWarning.title": "Habilitar a visualização de avisos de segurança neste espaço de trabalho", + "disableSecurityWarning.title": "Desabilitar a visualização de avisos de segurança neste espaço de trabalho", + "toggleSecurityWarning.description": "Não afeta o nível de segurança do conteúdo", "preview.showPreviewSecuritySelector.title": "Selecione as configurações de segurança para visualizações de Markdown neste espaço de trabalho" } \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/package.i18n.json b/i18n/ptb/extensions/merge-conflict/package.i18n.json index ad47caacee95..bef36d2bc579 100644 --- a/i18n/ptb/extensions/merge-conflict/package.i18n.json +++ b/i18n/ptb/extensions/merge-conflict/package.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "command.category": "Conflito de Mesclagem", + "command.accept.all-current": "Aceitar Todos os Atuais", "command.accept.all-incoming": "Aceitar todas entradas", "command.accept.all-both": "Aceitar todas as duas", "command.accept.current": "Aceitar a corrente", diff --git a/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json index 861ace441d38..2da5a12a9ffe 100644 --- a/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json +++ b/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "selectCodeAction": "Selecione uma ação de código para aplicar", "acquiringTypingsLabel": "Adquirindo digitações...", "acquiringTypingsDetail": "Adquirindo definições de digitações para o Intellisense.", "autoImportLabel": "Importação automática de {0}" diff --git a/i18n/ptb/extensions/typescript/package.i18n.json b/i18n/ptb/extensions/typescript/package.i18n.json index 0884bfdaa437..7ca623d773bb 100644 --- a/i18n/ptb/extensions/typescript/package.i18n.json +++ b/i18n/ptb/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "Abrir arquivo de log do servidor TS", "typescript.restartTsServer": "Reiniciar o servidor TS", "typescript.selectTypeScriptVersion.title": "Selecionar a versão do JavaScript", + "typescript.reportStyleChecksAsWarnings": "Relatório de verificações de estilo como avisos", "jsDocCompletion.enabled": "Habilitar/Desabilitar comentários JSDoc automáticos.", "javascript.implicitProjectConfig.checkJs": "Habilitar/desabilitar verificação semântica de arquivos JavaScript. Os arquivos existentes jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript > = 2.3.1.", "typescript.npm": "Especifica o caminho para o executável do NPM usado para Aquisição de Tipo Automático. Requer TypeScript > = 2.3.4.", diff --git a/i18n/ptb/src/vs/base/common/errorMessage.i18n.json b/i18n/ptb/src/vs/base/common/errorMessage.i18n.json index 257ffd9e14c1..400654b9c389 100644 --- a/i18n/ptb/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/ptb/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. Código de erro: {1}", - "error.permission.verbose": "Permissão Negada (HTTP {0})", - "error.permission": "Permissão Negada", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Erro de Conexão Desconhecido ({0})", - "error.connection.unknown": "Ocorreu um erro de conexão desconhecido. Você não está mais conectado à Internet ou o servidor que você está conectado está offline.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "Ocorreu um erro desconhecido. Consulte o log para obter mais detalhes.", "nodeExceptionMessage": "Ocorreu um erro de sistema ({0})", diff --git a/i18n/ptb/src/vs/code/electron-main/main.i18n.json b/i18n/ptb/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..ed5f54197e54 --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "Outra instância de {0} está sendo executada, mas não está respondendo", + "secondInstanceNoResponseDetail": "Por favor, feche todas as outras instãncias e tente novamente.", + "secondInstanceAdmin": "Uma segunda instãncia de {0} já está sendo executada como administrador.", + "secondInstanceAdminDetail": "Por favor, feche a outra instãncia e tente novamente.", + "close": "&&Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json index fa5680aff39b..cf26e0d0a73b 100644 --- a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,12 @@ "miQuit": "Sair de {0}", "miNewFile": "&&Novo Arquivo", "miOpen": "&&Abrir", - "miOpenWorkspace": "&&Abrir espaço de trabalho...", + "miOpenWorkspace": "Abrir &&Espaço de Trabalho...", "miOpenFolder": "Abrir &&Pasta", "miOpenFile": "&&Abrir Arquivo", "miOpenRecent": "Abrir &&Recente", - "miSaveWorkspaceAs": "&& Salvar o espaço de trabalho como...", - "miAddFolderToWorkspace": "&&Adicionar pasta para área de trabalho...", + "miSaveWorkspaceAs": "Salvar Espaço de Trabalho Como...", + "miAddFolderToWorkspace": "A&&dicionar Pasta para o Espaço de Trabalho...", "miSave": "&&Salvar", "miSaveAs": "Salvar &&Como...", "miSaveAll": "Salvar &&Tudo", @@ -157,7 +157,7 @@ "mMergeAllWindows": "Mesclar todas as janelas", "miToggleDevTools": "&&Alternar Ferramentas do Desenvolvedor", "miAccessibilityOptions": "&&Opções de Acessibilidade", - "miReportIssues": "Relatar &&Problemas", + "miReportIssue": "Reportar &&Problema", "miWelcome": "&&Bem-vindo", "miInteractivePlayground": "Playground &&Interativo", "miDocumentation": "&&Documentação", @@ -184,6 +184,7 @@ "miDownloadingUpdate": "Baixando Atualização...", "miInstallingUpdate": "Instalando Atualização...", "miCheckForUpdates": "Verificar Atualizações...", - "aboutDetail": "\nVersão {0}\nConfirmação {1}\nData {2}\nShell {3}\nRenderizador {4}\nNó {5}\nArquitetura {6}", - "okButton": "OK" + "aboutDetail": "Versão {0}\nConfirmação {1}\nData {2}\nShell {3}\nRenderizador {4}\nNó {5}\nArquitetura {6}", + "okButton": "OK", + "copy": "&&Copiar" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/ptb/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..3fada6ebf537 --- /dev/null +++ b/i18n/ptb/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Estes arquivos foram alterados nesse meio tempo: {0}", + "summary.0": "Não foram feitas edições", + "summary.nm": "Feitas {0} edições de texto em {1} arquivos", + "summary.n0": "Feitas {0} edições de texto em um arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json index 52d56cf1cda9..db6da099ec40 100644 --- a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,10 +10,14 @@ "fontSize": "Controla o tamanho da fonte em pixels.", "lineHeight": "Controla a altura da linha. Use 0 para computar a altura da linha a partir do tamanho da fonte.", "letterSpacing": "Controla o espaçamento da letra em pixels.", - "lineNumbers": "Controla a exibição de números de linha. Valores possíveis são 'on', 'off' e 'relative'. 'relative' mostra a contagem de linhas a partir da posição atual do cursor.", + "lineNumbers.off": "Números de linhas não são renderizados.", + "lineNumbers.on": "Números de linhas são renderizados em números absolutos.", + "lineNumbers.relative": "Números de linhas são renderizadas como distância em linhas até a posição do cursor.", + "lineNumbers.interval": "Números de linhas são renderizados a cada 10 linhas.", + "lineNumbers": "Controla a exibição dos números de linha. Os valores possíveis são 'on', 'off' e 'relative'.", "rulers": "Renderiza réguas verticais após um certo número de caracteres de espaço. Use vários valores para várias réguas. Réguas não serão desenhadas se a matriz estiver vazia", "wordSeparators": "Caracteres que serão usados como separadores de palavras ao fazer navegação relacionada a palavras ou operações", - "tabSize": "O número de espaços equivalentes a uma tabulação. Esta configuração é sobreposta no conteúdo do arquivo quando `editor.detectIndentation` está ligado.", + "tabSize": "O número de espaços equivalentes a uma tabulação. Esta configuração é sobreposta com base no conteúdo do arquivo quando `editor.detectIndentation` está ligado.", "tabSize.errorMessage": "Esperado 'número'. Note que o valor \"auto\" foi alterado pela configuração 'editor.detectIndentation'.", "insertSpaces": "Insere espaços quanto pressionado Tab. Esta configuração é sobrescrita com base no conteúdo do arquivo quando 'editor.detectIndentation' está habilitado.", "insertSpaces.errorMessage": "Esperado 'booleano'. Note que o valor \"auto\" foi alterado pela configuração 'editor.detectIndentation'.", @@ -89,8 +93,8 @@ "links": "Controla se o editor deve detectar links e torná-los clicáveis", "colorDecorators": "Controla se o editor deve processar os decoradores de cor inline e o seletor de cores.", "codeActions": "Habilita a ação de código lightbulb", + "selectionClipboard": "Controla se a área primária de transferência Linux deve ser suportada.", "sideBySide": "Controla se o editor de diff mostra as diff lado a lado ou inline.", "ignoreTrimWhitespace": "Controla se o editor de diff mostra alterações nos espaços iniciais ou finais como diferenças", - "renderIndicators": "Controla se o editor de diff mostra indicadores +/- para alterações adicionadas/removidas", - "selectionClipboard": "Controla se a área primária de transferência Linux deve ser suportada." + "renderIndicators": "Controla se o editor de diff mostra indicadores +/- para alterações adicionadas/removidas" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/ptb/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..4af1753636d6 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Ir para colchete" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/ptb/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..157105c4a358 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Mover cursor para a esquerda", + "caret.moveRight": "Mover cursor para a direita" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/ptb/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..c1d3083b1985 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Transport letras" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/ptb/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..903f9fc1086f --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Recortar", + "actions.clipboard.copyLabel": "Copiar", + "actions.clipboard.pasteLabel": "Colar", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Copiar com realce de sintaxe" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/ptb/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..ff1ba569c0c9 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Alternar Comentário de Linha", + "comment.line.add": "Adicionar Comentário de Linha", + "comment.line.remove": "Remover Comentário de Linha", + "comment.block": "Alternar Comentário de Bloco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/ptb/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..e2b1d946bee1 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Mostrar o menu de contexto do editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..ce656c20f367 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Localizar", + "findNextMatchAction": "Localizar Próximo", + "findPreviousMatchAction": "Localizar anterior", + "nextSelectionMatchFindAction": "Localizar Próxima Seleção", + "previousSelectionMatchFindAction": "Localizar Seleção Anterior", + "startReplace": "Substituir", + "showNextFindTermAction": "Mostrar Próximo Termo de Busca", + "showPreviousFindTermAction": "Mostrar Termo de Busca Anterior" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..1f4f15c55625 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Localizar", + "placeholder.find": "Localizar", + "label.previousMatchButton": "Correspondência anterior", + "label.nextMatchButton": "Próxima correspondência", + "label.toggleSelectionFind": "Localizar na seleção", + "label.closeButton": "Fechar", + "label.replace": "Substituir", + "placeholder.replace": "Substituir", + "label.replaceButton": "Substituir", + "label.replaceAllButton": "Substituir Tudo", + "label.toggleReplaceButton": "Ativar/desativar modo Substituir", + "title.matchesCountLimit": "Apenas os primeiros {0} resultados serão destacados, mas todas as operações de busca funcionam em todo o texto.", + "label.matchesLocation": "{0} de {1}", + "label.noResults": "Nenhum resultado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..9172767f7708 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Localizar", + "placeholder.find": "Localizar", + "label.previousMatchButton": "Correspondência anterior", + "label.nextMatchButton": "Próxima correspondência", + "label.closeButton": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/ptb/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..eb3341e2a4dc --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Abrir", + "unFoldRecursivelyAction.label": "Abrir recursivamente", + "foldAction.label": "Colapsar", + "foldRecursivelyAction.label": "Colapsar recursivamente", + "foldAllBlockComments.label": "Fechar Todos os Comentários de Bloco", + "foldAllAction.label": "Colapsar tudo", + "unfoldAllAction.label": "Abrir tudo", + "foldLevelAction.label": "Nível de colapsamento {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/ptb/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..71cbf2723a63 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "1 edição de formatação feita na linha {0}", + "hintn1": "{0} edições de formatação feitas na linha {1}", + "hint1n": "Feita 1 edição de formatação entre as linhas {0} e {1}", + "hintnn": "Feitas {0} edições de formatação entre as linhas {1} e {2}", + "no.provider": "Desculpe-nos, mas não há formatador instalado para '{0}'-arquivos.", + "formatDocument.label": "Formatar Documento", + "formatSelection.label": "Formatar Seleção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..01753366bca1 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Não foi encontrada definição para '{0}'", + "generic.noResults": "Nenhuma definição encontrada", + "meta.title": "- {0} definições", + "actions.goToDecl.label": "Ir para Definição", + "actions.goToDeclToSide.label": "Abrir definição ao lado", + "actions.previewDecl.label": "Inspecionar definição", + "goToImplementation.noResultWord": "Nenhuma implementação encontrada para '{0}'", + "goToImplementation.generic.noResults": "Nenhuma implementação encontrada", + "meta.implementations.title": "– {0} implementações", + "actions.goToImplementation.label": "Ir para a implementação", + "actions.peekImplementation.label": "Inspecionar implementação", + "goToTypeDefinition.noResultWord": "Nenhuma definição encontrada para '{0}'", + "goToTypeDefinition.generic.noResults": "Nenhuma definição de tipo encontrada", + "meta.typeDefinitions.title": "– {0} definições de tipos", + "actions.goToTypeDefinition.label": "Ir para a definição de tipo", + "actions.peekTypeDefinition.label": "Inspecionar definição de tipo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..675cbe29ae19 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Clique para mostrar {0} definições." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..d05aeee6c34a --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Ir para o Próximo Erro ou Aviso", + "markerAction.previous.label": "Ir para o Erro ou Aviso Anterior", + "editorMarkerNavigationError": "Ferramenta de marcação de edição apresentando error na cor ", + "editorMarkerNavigationWarning": "Ferramenta de marcação de edição apresentando adventência na cor", + "editorMarkerNavigationInfo": "Cor de informação da ferramenta de navegação do marcador do editor.", + "editorMarkerNavigationBackground": "Cor de fundo da ferramenta de marcação de navegação do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/ptb/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..196a8fb2bb0a --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Mostrar Item Flutuante" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/ptb/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..2c74cf6f1ec3 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..fbbfbd021610 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Substituir pelo valor anterior", + "InPlaceReplaceAction.next.label": "Substituir pelo próximo valor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/ptb/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..8edeaaf81040 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Converter indentação em espaços.", + "indentationToTabs": "Coverter Indentação a Tabulações.", + "configuredTabSize": "Tamanho de Tabulação Configurado", + "selectTabWidth": "Selecione o Tamanho de Tabulação para o Arquivo Atual", + "indentUsingTabs": "Indentar Usando Tabulações", + "indentUsingSpaces": "Indentar Usando Espaços", + "detectIndentation": "Detectar Indentação a Partir do Conteúdo", + "editor.reindentlines": "Reindentar Linhas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/ptb/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..8a368ab368da --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Copiar linha acima", + "lines.copyDown": "Copiar linha abaixo", + "lines.moveUp": "Mover linha para cima", + "lines.moveDown": "Mover linha para baixo", + "lines.sortAscending": "Classificar Linhas Ascendentemente", + "lines.sortDescending": "Classificar Linhas Descendentemente", + "lines.trimTrailingWhitespace": "Cortar Espaço em Branco à Direita", + "lines.delete": "Excluir linha", + "lines.indent": "Recuar linha", + "lines.outdent": "Recuar linha para a esquerda", + "lines.insertBefore": "Inserir linha acima", + "lines.insertAfter": "Inserir linha abaixo", + "lines.deleteAllLeft": "Excluir tudo à Esquerda", + "lines.deleteAllRight": "Excluir Tudo à Direita", + "lines.joinLines": "Unir Linhas", + "editor.transpose": "Transpor caracteres ao redor do cursor", + "editor.transformToUppercase": "Transformar para maiúsculas", + "editor.transformToLowercase": "Transformar para minúsculas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/links/links.i18n.json b/i18n/ptb/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..d37606739d85 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Cmd + clique para seguir o link", + "links.navigate": "Ctrl + clique para seguir o link", + "links.command.mac": "Cmd + clique para executar o comando", + "links.command": "Ctrl + clique para executar o comando", + "links.navigate.al": "Alt + clique para seguir o link", + "links.command.al": "Alt + clique para executar o comando", + "invalid.url": "Desculpe, falha ao abrir este link porque ele não está bem formatado: {0}", + "missing.url": "Desculpe, falha ao abrir este link porque seu destino está faltando.", + "label": "Abrir link" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/ptb/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..790c737c8eb7 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Inserir cursor acima", + "mutlicursor.insertBelow": "Inserir cursor abaixo", + "mutlicursor.insertAtEndOfEachLineSelected": "Adicionar Cursores ao Final das Linhas", + "addSelectionToNextFindMatch": "Adicionar Seleção ao Próximo Localizar Correspondência", + "addSelectionToPreviousFindMatch": "Adicionar Seleção à Correspondência de Localização Anterior", + "moveSelectionToNextFindMatch": "Mover Última Seleção para Próximo Localizar Correspondência", + "moveSelectionToPreviousFindMatch": "Mover Última Seleção para Correspondência de Localização Anterior", + "selectAllOccurrencesOfFindMatch": "Selecionar Todas as Ocorrências de Localizar Correspondência", + "changeAll.label": "Alterar todas as ocorrências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..f0450d3f4de4 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Dicas de parâmetro de gatilho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..0f8237adbb3f --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, dica" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..01ae8d7aff8a --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Mostrar correções ({0})", + "quickFix": "Mostrar correções", + "quickfix.trigger.label": "Correção Rápida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..41ad7313b7de --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..9d557535df61 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": "- {0} referências", + "references.action.label": "Localizar Todas as Referências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..65217d2ace88 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..2e25322d32c0 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "símbolo em {0} na linha {1} e coluna {2}", + "aria.fileReferences.1": "1 símbolo em {0}, caminho completo {1}", + "aria.fileReferences.N": "{0} símbolos em {1}, caminho completo {2}", + "aria.result.0": "Nenhum resultado encontrado", + "aria.result.1": "Encontrado 1 símbolo em {0}", + "aria.result.n1": "Encontrados {0} símbolos em {1}", + "aria.result.nm": "Encontrados {0} símbolos em {1} arquivos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..72f61eeaf832 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Falha ao resolver arquivo.", + "referencesCount": "{0} referências", + "referenceCount": "{0} referência", + "missingPreviewMessage": "nenhuma visualização disponível", + "treeAriaLabel": "Referências", + "noResults": "Nenhum resultado", + "peekView.alternateTitle": "Referências", + "peekViewTitleBackground": "Cor de fundo da área de visualização do título.", + "peekViewTitleForeground": "Cor de visualização do título.", + "peekViewTitleInfoForeground": "Cor da visualização de informações do título.", + "peekViewBorder": "Cor das bordas e seta da área de visualização", + "peekViewResultsBackground": "Cor de fundo da área de visualização da lista de resultados.", + "peekViewResultsMatchForeground": "Cor de primeiro plano para nós de linha na lista de resultados visualizados.", + "peekViewResultsFileForeground": "Cor de primeiro plano para nós de arquivos na lista de resultados visualizados.", + "peekViewResultsSelectionBackground": "Cor de fundo da entrada selecionada na visualização da lista de resultados.", + "peekViewResultsSelectionForeground": "Cor da entrada selecionada na visualização da lista de resultados.", + "peekViewEditorBackground": "Cor de fundo da visualização do editor.", + "peekViewEditorGutterBackground": "Cor de fundo da separação na visualização rápida do editor.", + "peekViewResultsMatchHighlight": "Corresponder cor de realce com visualização da lista de resultados.", + "peekViewEditorMatchHighlight": "Corresponder cor de realce com visualização do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/ptb/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..a56535f6241c --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Nenhum resultado.", + "aria": "Renomeado '{0}' para '{1}'com sucesso. Resumo: {2}", + "rename.failed": "Desculpe, falha na execução de renomear.", + "rename.label": "Renomear Símbolo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/ptb/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..49eba92fa449 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Renomear entrada. Digite o novo nome e tecle Enter para gravar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/ptb/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..89319f9a2669 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Expandir seleção", + "smartSelect.shrink": "Reduzir seleção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/ptb/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..b064152c8be9 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "Ao aceitar '{0}' foi inserido o seguinte texto: {1}", + "suggest.trigger.label": "Sugestão de gatilho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..c9da4793d67a --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Cor de fundo para a ferramenta de sugestão.", + "editorSuggestWidgetBorder": "Cor da borda para a ferramenta de sugestão.", + "editorSuggestWidgetForeground": "Cor de primeiro plano para a ferramenta de sugestão.", + "editorSuggestWidgetSelectedBackground": "Cor de fundo da entrada selecionada da ferramenta de sugestões.", + "editorSuggestWidgetHighlightForeground": "Cor de realce da correspondência na ferramenta de sugestão.", + "readMore": "Ler Mais...{0}", + "suggestionWithDetailsAriaLabel": "{0}, sugestão, tem detalhes", + "suggestionAriaLabel": "{0}, sugestão", + "readLess": "Ler menos... {0}", + "suggestWidget.loading": "Carregando...", + "suggestWidget.noSuggestions": "Nenhuma sugestão.", + "suggestionAriaAccepted": "{0}, aceito", + "ariaCurrentSuggestionWithDetails": "{0}, sugestão, tem detalhes", + "ariaCurrentSuggestion": "{0}, sugestão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..0f3dd0680954 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Alterne o uso da tecla Tab para mover o foco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..6ccc873b02c5 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Cor de fundo de um símbolo durante acesso de leitura, como ao ler uma variável.", + "wordHighlightStrong": "Cor de fundo de um símbolo durante acesso de escrita, como ao escrever uma variável.", + "overviewRulerWordHighlightForeground": "Visão geral da cor do marcador da régua para destaques de símbolos.", + "overviewRulerWordHighlightStrongForeground": "Visão geral da cor do marcador da régua para gravação de destaques de símbolos.", + "wordHighlight.next.label": "Ir para o próximo símbolo em destaque", + "wordHighlight.previous.label": "Ir para o símbolo de destaque anterior" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json index 0aa4f21b3ddc..eb886a026f79 100644 --- a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json @@ -12,6 +12,8 @@ "newWindow": "Força uma nova instância do Código.", "performance": "Comece com o 'Desenvolvedor: Desempenho de inicialização' comando habilitado.", "prof-startup": "Rodar o CPU profiler durante a inicialização", + "inspect-extensions": "Permite depuração e criação de perfis de extensões. Verifique as ferramentas de desenvolvimento para a conexão uri.", + "inspect-brk-extensions": "Permitir depuração e criação de perfil de extensões com o host de extensão em pausa após o início. Verifique as ferramentas do desenvolvedor para a conexão uri.", "reuseWindow": "Forçar a abertura de um arquivo ou pasta na última janela ativa", "userDataDir": "Especifica o diretório que os dados do usuário serão mantidos, útil quando estiver rodando como root.", "verbose": "Imprimir a saída detalhada (Implica -- esperar).", @@ -24,6 +26,7 @@ "experimentalApis": "Permite recursos de api propostos para uma extensão.", "disableExtensions": "Desabilita todas as extensões instaladas.", "disableGPU": "Desabilita aceleração de hardware da GPU.", + "status": "Utilização do processo de impressão e informações de diagnóstico.", "version": "Versão de impressão", "help": "Uso de impressão.", "usage": "Uso", diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index 76dc4cf48f3d..4d844ce5278d 100644 --- a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "Extensão não encontrada", - "noCompatible": "Não foi possível econtrar uma versão de {0} com esta versão do Code." + "notCompatibleDownload": "Não foi possível baixar porque a extensão compatível com a versão atual '{0}' do VS Code não foi encontrada." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index e90957df5d73..98c0be5cdcba 100644 --- a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "Extensão inválida: pacote.json nao é um arquivo JSON válido", "restartCodeLocal": "Por favor reinicie Code antes de reinstalar {0}.", - "restartCodeGallery": "Por favor reinicie o Code antes de reinstalar.", + "installingOutdatedExtension": "Uma nova versão desta extensão já está instalada. Você deseja sobrescrever esta instalação com a versão mais antiga?", + "override": "Sobrescrever", + "cancel": "Cancelar", + "notFoundCompatible": "Não foi possível instalar porque a extensão '{0}' compatível com a versão atual '{1}' do VS Code não foi encontrada.", + "quitCode": "Não foi possível instalar porque uma instância obsoleta da extensão ainda está em execução. Por favor, pare e inicie o VS Code antes de reinstalar.", + "exitCode": "Não foi possível instalar porque uma instância obsoleta da extensão ainda está em execução. Por favor, pare e inicie o VS Code antes de reinstalar.", + "notFoundCompatibleDependency": "Não foi possível instalar porque a extensão dependente '{0}' compatível com a versão atual '{1}' do VS Code não foi encontrada.", "uninstallDependeciesConfirmation": "Gostaria de desinstalar '{0}' somente, ou suas dependências também?", "uninstallOnly": "Apenas", "uninstallAll": "Todos", - "cancel": "Cancelar", "uninstallConfirmation": "Tem certeza que deseja desinstalar '{0}'?", "ok": "OK", "singleDependentError": "Não foi possível desinstalar a extensão '{0}'. A extensão '{1}' depende dela.", diff --git a/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index 3f6e49c05ce0..4b66b9a4cb64 100644 --- a/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -17,6 +17,8 @@ "vscode.extension.activationEvents.onLanguage": "Um evento de ativação emitido sempre que um arquivo que resolve para a linguagem especificada é aberto.", "vscode.extension.activationEvents.onCommand": "Um evento de ativação emitido sempre que o comando especificado for invocado.", "vscode.extension.activationEvents.onDebug": "Um evento de ativação emitido sempre que um usuário está prestes a iniciar a depuração ou a definir as configurações de depuração.", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "Um evento de ativação é emitido sempre que um \"launch.json\" precisa ser criado (e todos os métodos provideDebugConfigurations precisam ser chamados).", + "vscode.extension.activationEvents.onDebugResolve": "Um evento de ativação emitido quando uma sessão de debug com um tipo específico está para ser iniciada (e um método resolveDebugConfiguration correspondente precisa ser chamado).", "vscode.extension.activationEvents.workspaceContains": "Um evento de ativação emitido quando uma pasta que contém pelo menos um arquivo correspondente ao padrão global especificado é aberta.", "vscode.extension.activationEvents.onView": "Um evento de ativação emitido sempre que o modo de visualização especificado é expandido.", "vscode.extension.activationEvents.star": "Um evento de ativação emitido na inicialização do VS Code. Para garantir uma ótima experiência de usuário, por favor, use este evento de ativação em sua extensão somente quando nenhuma outra combinação de eventos de ativação funcionar em seu caso de uso.", diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..fb0582dbfe99 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "Alternar Visibilidade da Aba", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json index d64f23c4102a..74ea809120e1 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "largeNumberBadge": "+ de 10k", "badgeTitle": "{0} - {1}", "additionalViews": "Visualizações Adicionais", "numberBadge": "{0} ({1})", diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 7c10c0e60fd0..5035a541040c 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Abrir editor anterior", "nextEditorInGroup": "Abrir próximo editor no grupo", "openPreviousEditorInGroup": "Abrir editor anterior no grupo", + "lastEditorInGroup": "Abrir Último Editor do Grupo", "navigateNext": "Avançar", "navigatePrevious": "Voltar", "navigateLast": "Ir para o último", diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index f42c45c02f55..4b701929e85a 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "Mover o editor ativo por guias ou grupos", "editorCommand.activeEditorMove.arg.name": "Argumento de movimento do editor ativo", - "editorCommand.activeEditorMove.arg.description": "Propriedades do argumento: \n\t\t\t\t\t\t- 'para': sequência de valor fornecendo para onde mover.\n\t\t\t\t\t\t- 'por': sequência de valor, fornecendo a unidade para o movimento. Por guia ou por grupo.\n\t\t\t\t\t\t- 'valor': valor numérico, fornecendo quantas posições ou uma posição absoluta para mover.\n\t\t\t\t\t", + "editorCommand.activeEditorMove.arg.description": "Propriedades do argumento:\n* 'to': Valor do tipo sequencia de caracteres fornecendo onde se mover.\n\t* 'by': sequência de valor, proporcionando a unidade para o movimento. Por guia ou por grupo.\n\t* 'value': valor numérico, fornecendo quantas posições ou uma posição absoluta para mover.", "commandDeprecated": "Comando **{0}** foi removido. Você pode usar **{1}** em vez disso", "openKeybindings": "Configurar os atalhos de teclado" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index fd2c0fd6d01f..3d74847e2abd 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "Sim", "screenReaderDetectedExplanation.answerNo": "Não", "screenReaderDetectedExplanation.body1": "O VS Code agora está otimizado para uso com um leitor de tela.", - "screenReaderDetectedExplanation.body2": "Alguns recursos do editor terão comportamento diferente: por exemplo, a palavra envoltura, dobradura, auto fechamento de colchetes, etc." + "screenReaderDetectedExplanation.body2": "Alguns recursos do editor terão comportamento diferente: por exemplo, quebra de linha, cruzamento, etc." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json b/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json index 098ead453d82..cacc3f119b77 100644 --- a/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "Nenhum resultado encontrado", - "noResultsFound2": "Nenhum resultado encontrado", - "entryAriaLabel": "{0}, comando" + "noResultsFound2": "Nenhum resultado encontrado" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json index ac9c586bc147..04de1ce8ceff 100644 --- a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Abrir Recente...", "quickOpenRecent": "Abertura Rápida de Recente...", "closeMessages": "Fechar mensagens de notificação", - "reportIssues": "Reportar Problemas", + "reportIssueInEnglish": "Reportar Problema", "reportPerformanceIssue": "Reportar Problema de Desempenho", "keybindingsReference": "Referência de Atalhos de Teclado", "openDocumentationUrl": "Documentação", @@ -47,5 +47,25 @@ "showNextWindowTab": "Mostrar guia da próxima janela", "moveWindowTabToNewWindow": "Mover a guia da janela para a nova janela", "mergeAllWindowTabs": "Mesclar todas as janelas", - "toggleWindowTabsBar": "Alternar a Barra de Guias da Janela" + "toggleWindowTabsBar": "Alternar a Barra de Guias da Janela", + "configureLocale": "Configurar Idioma", + "displayLanguage": "Define o idioma de exibição do VSCode.", + "doc": "Veja {0} para obter uma lista dos idiomas suportados.", + "restart": "Modificar o valor requer reinicialização do VSCode.", + "fail.createSettings": "Não foi possível criar '{0}' ({1}).", + "openLogsFolder": "Abrir Pasta de Logs", + "showLogs": "Exibir Logs...", + "mainProcess": "Principal", + "sharedProcess": "Compartilhado", + "rendererProcess": "Renderizador", + "extensionHost": "Host de Extensão", + "selectProcess": "Selecionar processo", + "setLogLevel": "Definir Nível de Log", + "trace": "Rastreamento", + "debug": "Depurar", + "info": "Informações", + "warn": "Aviso", + "err": "Erro", + "critical": "Crítico", + "off": "Desligado" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json index 797652bab422..06f44d416ff2 100644 --- a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Exibir", "help": "Ajuda", "file": "Arquivo", - "workspaces": "Espaços de trabalho", "developer": "Desenvolvedor", + "workspaces": "Espaços de trabalho", "showEditorTabs": "Controla se os editores abertos devem ou não serem exibidos em abas.", "workbench.editor.labelFormat.default": "Mostra o nome do arquivo. Quando guias estiverem ativadas e dois arquivos em um grupo tiverem o mesmo nome, a seção de distinção para cada caminho de arquivo é adicionada. Quando guias estiverem desativadas, o caminho relativo para a pasta do espaço de trabalho é exibida se o editor estiver ativo.", "workbench.editor.labelFormat.short": "Mostrar o nome do arquivo seguido pelo nome do diretório.", @@ -16,6 +16,7 @@ "workbench.editor.labelFormat.long": "Mostrar o nome do arquivo seguido pelo seu caminho absoluto.", "tabDescription": "Controla o formato do rótulo para um editor. Alterar essa configuração pode por exemplo tornar mais fácil entender a localização de um arquivo:\n- curto: 'parent'\n- médio: 'workspace/src/parent'\n- longa: '/ home/user/workspace/src/parent'\n- padrão: '... /parent, quando outra guia compartilha o mesmo título, ou o caminho relativo do espaço de trabalho se as guias estão desabilitadas", "editorTabCloseButton": "Controla a posição dos botões de fechar das abas do editor ou os desabilita quando configurados para 'desligado'.", + "tabSizing": "Controla o tamanho das guias do editor. Configure para 'fit' para manter as guias sempre com o tamanho suficiente para mostrar o rótulo do editor completo. Configure para 'shrink' para permitir que as guias sejam menores quando o espaço disponível não seja suficiente para mostrar todas as guias juntas.", "showIcons": "Controla se os editores abertos devem ou não ser exibidos com um ícone. Requer um tema de ícone para ser habilitado. ", "enablePreview": "Controla se editores abertos mostram uma visualização. Editores de visualização são reutilizados até que eles sejam mantidos (por exemplo, através do duplo clique ou edição) e aparecerem com um estilo de fonte em itálico.", "enablePreviewFromQuickOpen": "Controla se os editores abertos da Abertura Rápida são exibidos como visualização. Os editores de visualização são reutilizados até serem preservados (por exemplo, através de um duplo clique ou edição).", @@ -26,18 +27,17 @@ "closeOnFocusLost": "Controla se Abertura Rápida deve fechar automaticamente caso perca o foco.", "openDefaultSettings": "Controla se a abertura de configurações também abre um editor mostrando todas as configurações padrão.", "sideBarLocation": "Controla a localização da barra lateral. Ele pode ser exibido à esquerda ou à direita da área de trabalho.", - "panelLocation": "Painle de controle de localização. Pode também ser visualizado na parte inferior ou a direita da área de trabalho.", "statusBarVisibility": "Controla a visibilidade da barra de status na parte inferior da área de trabalho.", "activityBarVisibility": "Controla a visibilidade da barra de atividades na área de trabalho.", "closeOnFileDelete": "Controla se os editores que mostram um arquivo devem fechar automaticamente quanto o arquivo é apagado ou renomeado por algum outro processo. Desativar isso manterá o editor aberto como sujo neste evento. Note que apagar do aplicativo sempre fechará o editor e os arquivos sujos nunca fecharão para preservar seus dados.", - "experimentalFuzzySearchEndpoint": "Indica o ponto de extremidade usar para a busca de definições experimental.", - "experimentalFuzzySearchKey": "Indica a chave a ser usada para a busca experimental de configurações.", + "enableNaturalLanguageSettingsSearch": "Controla se deve habilitar o modo de busca de linguagem natural para as configurações.", "fontAliasing": "Controla o método de identificação de fonte no espaço de trabalho.\n- padrão: Suavização de fonte subpixel. Na maioria dos monitores não-retina isto mostrará o texto mais nítido\n- antialiased: Suaviza a fonte no nível do pixel, em oposição a subpixel. Pode fazer a fonte aparecer mais clara de um modo geral \n- nenhum: Desabilita a suavização de fonte. Texto será mostrado com bordas irregulares", "workbench.fontAliasing.default": "Suavização de fonte subpixel. Na maioria dos monitores não-retina isto mostrará o texto mais nítido.", "workbench.fontAliasing.antialiased": "Suavizar a fonte no nível do pixel, em oposição a subpixel. Pode fazer com que a fonte apareça mais clara de uma forma geral.", "workbench.fontAliasing.none": "Desabilita a suavização de fonte. Texto será mostrado com bordas irregulares.", "swipeToNavigate": "Navegue entre arquivos abertos usando o deslizamento horizontal de três dedos.", "workbenchConfigurationTitle": "Área de Trabalho", + "windowConfigurationTitle": "Janela", "window.openFilesInNewWindow.on": "Arquivos serão abertos em uma nova janela", "window.openFilesInNewWindow.off": "Arquivos serão abertos em uma nova janela com a pasta de arquivos aberta ou com a última janela ativa.", "window.openFilesInNewWindow.default": "Os arquivos serão abertos na janela com a pasta de arquivos aberta ou a última janela ativa, a menos que seja aberto através do dock ou do finder (somente macOS)", @@ -69,11 +69,11 @@ "autoDetectHighContrast": "Se habilitado, irá mudar automaticamente para o tema de alto contraste se o Windows estiver utilizando um tema de alto contraste, e para o tema escuro ao mudar de um tema de alto contraste do Windows.", "titleBarStyle": "Ajusta a aparência da barra de título da janela. As alterações exigem um reinício completo.", "window.nativeTabs": "Habilita as abas da janela do macOS Sierra. Note que as alterações exigem um reinício completo e que as abas nativas desabilitarão um estilo de barra de título customizado, se configurado.", - "windowConfigurationTitle": "Janela", "zenModeConfigurationTitle": "Modo Zen", "zenMode.fullScreen": "Controla se a ativação do modo Zen também coloca o espaço de trabalho em modo de tela cheia.", "zenMode.hideTabs": "Controla se a ativação do modo Zen também oculta as abas do espaço de trabalho.", "zenMode.hideStatusBar": "Controla se a ativação do modo Zen também oculta a barra de status no rodapé do espaço de trabalho.", "zenMode.hideActivityBar": "Controla se a ativação do modo Zen também oculta a barra de atividades à esquerda do espaço de trabalho.", - "zenMode.restore": "Controla se uma janela deve ser restaurada para o modo zen se ela foi finalizada no modo zen." + "zenMode.restore": "Controla se uma janela deve ser restaurada para o modo zen se ela foi finalizada no modo zen.", + "JsonSchema.locale": "O idioma da interface do usuário a ser usada." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 1bc052297a12..5e018e07d5fb 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Desativar Pontos de Parada", "reapplyAllBreakpoints": "Reaplicar Todos os Pontos de Parada", "addFunctionBreakpoint": "Adicionar Ponto de Parada de Função", - "renameFunctionBreakpoint": "Renomeie o Ponto de Parada de Função", "addConditionalBreakpoint": "Adicionar Ponto de Parada Condicional...", "editConditionalBreakpoint": "Editar o Ponto de Parada...", "setValue": "Definir Valor", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..b263f4f0c2bf --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Editar o Ponto de Parada...", + "functionBreakpointsNotSupported": "Pontos de parada de função não são suportados por este tipo de depuração", + "functionBreakpointPlaceholder": "Função de parada", + "functionBreakPointInputAriaLabel": "Digitar Ponto de Parada de Função" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..2802e46ce447 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Seção de Pilha de Chamada", + "debugStopped": "Pausado em {0}", + "callStackAriaLabel": "Depurar a Pilha de Chamadas", + "process": "Processar", + "paused": "Em pausa", + "running": "Em execução", + "thread": "Thread", + "pausedOn": "Pausado em {0}", + "loadMoreStackFrames": "Carregar mais segmentos de pilha", + "threadAriaLabel": "Thread {0}, pilha de chamadas, depuração", + "stackFrameAriaLabel": "Segmento de Pilha {0} linha {1} {2}, pilha de chamadas, depuração" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index c13b5cafe99b..b576d0807c89 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,8 @@ "openExplorerOnEnd": "Automaticamente abre a visualização do explorador no final de uma sessão de depuração", "inlineValues": "Mostrar valores de variáveis em linha no editor durante a depuração", "hideActionBar": "Controlar se a barra de ação flutuante do depurador deve ser ocultada", + "never": "Nunca mostrar debug na barra de status", + "showInStatusBar": "Controla quando a barra de status de depuração deve ser visível", + "openDebug": "Controla se o depurador viewlet deve ser aberto no início de sessão de depuração.", "launch": "Configuração global do lançamento do depurador. Deve ser usado como uma alternativa para o arquivo 'launch.json' que é compartilhado entre os espaços de trabalho" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 8232f470b367..9d0ec3a464bf 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "Adicionado ponto de interrupção, linha {0}, arquivo {1}", "breakpointRemoved": "Ponto de interrupção removido, linha {0}, arquivo {1}", "compoundMustHaveConfigurations": "Composição deve ter o atributo \"configurations\" definido para iniciar várias configurações.", - "configMissing": "Configuração '{0}' não tem 'launch.json'.", "debugRequestNotSupported": "Atributo '{0}' tem um valor sem suporte '{1}' na configuração de depuração escolhida.", "debugRequesMissing": "Atributo '{0}' está faltando para a configuração de depuração escolhida.", "debugTypeNotSupported": "Tipo de depuração configurado '{0}' não é suportado.", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..3392c862aaa1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Seção de variáveis", + "variablesAriaTreeLabel": "Variáveis de Depuração", + "variableValueAriaLabel": "Digite o novo valor da variável", + "variableScopeAriaLabel": "Escopo {0}, variáveis, depuração", + "variableAriaLabel": "{0} valor {1}, variáveis, depuração" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..70a43f8f1c82 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "Seção de Expressões", + "watchAriaTreeLabel": "Depurar Expressões Monitoradas", + "watchExpressionPlaceholder": "Expressão para monitorar", + "watchExpressionInputAriaLabel": "Digitar expressão a monitorar", + "watchExpressionAriaLabel": "{0} valor {1}, monitorar, depuração", + "watchVariableAriaLabel": "{0} valor {1}, monitorar, depuração" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index dfd7672ae26f..f9a8f5b8629f 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "Nome da extensão", "extension id": "Identificador da extensão", + "preview": "Visualizar", "publisher": "Nome do editor", "install count": "Quantidade de Instalações", "rating": "Avaliação", + "repository": "Repositório", "license": "Licença", "details": "Detalhes", "contributions": "Contribuições", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 3e15ba649f8c..3899c2952907 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Desinstalando", "updateAction": "Atualizar", "updateTo": "Atualizar para {0}", - "enableForWorkspaceAction.label": "Habilitar (Espaço de Trabalho)", - "enableAlwaysAction.label": "Habilitar (Sempre)", - "disableForWorkspaceAction.label": "Desabilitar (Espaço de Trabalho)", - "disableAlwaysAction.label": "Desabilitar (Sempre)", "ManageExtensionAction.uninstallingTooltip": "Desinstalando", - "enableForWorkspaceAction": "Espaço de trabalho", - "enableGloballyAction": "Sempre", + "enableForWorkspaceAction": "Habilitar (Espaço de Trabalho)", + "enableGloballyAction": "Habilitar", "enableAction": "Habilitar", - "disableForWorkspaceAction": "Espaço de trabalho", - "disableGloballyAction": "Sempre", + "disableForWorkspaceAction": "Desabilitar (Espaço de Trabalho)", + "disableGloballyAction": "Desabilitar", "disableAction": "Desabilitar", "checkForUpdates": "Verificar Atualizações", "enableAutoUpdate": "Habilitar Extensões Auto-Atualizáveis", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Todas as extensões recomendadas para este espaço de trabalho já foram instaladas", "installRecommendedExtension": "Instalar a extensão recomendada", "extensionInstalled": "A extensão recomendada já foi instalada", - "showRecommendedKeymapExtensions": "Mostrar Mapeamentos de Teclado Recomendados", "showRecommendedKeymapExtensionsShort": "Mapeamentos de Teclado", - "showLanguageExtensions": "Mostrar Extensões de Linguagem", "showLanguageExtensionsShort": "Extensões de Linguagem", - "showAzureExtensions": "Mostrar extensões para o Azure", "showAzureExtensionsShort": "Extensões do Azure", "OpenExtensionsFile.failed": "Não foi possível criar o arquivo 'extensions.json' na pasta '.vscode' ({0}).", "configureWorkspaceRecommendedExtensions": "Configurar Extensões Recomendadas (Espaço de Trabalho)", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..d82c863fc27a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ratedByUsers": "Avaliado por {0} usuários" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..7cc618600b36 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectAndStartDebug": "Clique para parar a perfilação." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index 76bf03794815..77e6de1fbbca 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -7,9 +7,10 @@ "extensionsCommands": "Gerenciar Extensões", "galleryExtensionsCommands": "Instalar Extensões da Galeria", "extension": "Extensão", + "runtimeExtension": "Extensões em Execução", "extensions": "Extensões", "view": "Exibir", + "developer": "Desenvolvedor", "extensionsConfigurationTitle": "Extensões", - "extensionsAutoUpdate": "Atualizar extensões automaticamente", - "extensionsIgnoreRecommendations": "Ignorar recomendações de extensão" + "extensionsAutoUpdate": "Atualizar extensões automaticamente" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..bec798884ffa --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "starActivation": "Ativado ao iniciar", + "workspaceContainsGlobActivation": "Ativado porque existe um arquivo {0} correspondente em seu espaço de trabalho", + "workspaceContainsFileActivation": "Ativado porque o arquivo {0} existe no seu espaço de trabalho", + "languageActivation": "Ativado porque você abriu um arquivo {0}", + "workspaceGenericActivation": "Ativado em {0}", + "errors": "{0} erros não capturados", + "extensionsInputName": "Executando extensões", + "showRuntimeExtensions": "Mostrar extensões em execução", + "reportExtensionIssue": "Reportar Problema" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json index 7c51e1cc24ff..7c8e3e05c0a9 100644 --- a/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -69,5 +69,7 @@ "invalidFileNameError": "O nome **{0}** não é válido como um nome de arquivo ou pasta. Por favor, escolha um nome diferente.", "filePathTooLongError": "O nome **{0}** resulta em um caminho muito longo. Escolha um nome mais curto.", "compareWithSaved": "Comparar arquivo ativo com salvo", - "modifiedLabel": "{0} (em disco) ↔ {1}" + "modifiedLabel": "{0} (em disco) ↔ {1}", + "compareWithClipboard": "Compare o Arquivo Ativo com a Área de Transferência", + "clipboardComparisonLabel": "Área de transferência ↔ {0}" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..18b7465dc08b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Pastas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..464da97e4e94 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Arquivo", + "revealInSideBar": "Revelar na Barra Lateral", + "acceptLocalChanges": "Usar suas alterações e substituir o conteúdo do disco", + "revertLocalChanges": "Descartar as alterações e reverter para o conteúdo no disco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..18ed68af70c5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Tentar novamente", + "rename": "Renomear", + "newFile": "Novo Arquivo", + "newFolder": "Nova Pasta", + "openFolderFirst": "Abrir uma pasta primeiro para criar arquivos ou pastas dentro dele.", + "newUntitledFile": "Novo Arquivo Sem Título", + "createNewFile": "Novo Arquivo", + "createNewFolder": "Nova Pasta", + "deleteButtonLabelRecycleBin": "&&Mover para Lixeira", + "deleteButtonLabelTrash": "&&Mover para o Lixo", + "deleteButtonLabel": "&&Excluir", + "dirtyMessageFolderOneDelete": "Você está excluindo uma pasta com alterações não salvas em 1 arquivo. Você quer continuar?", + "dirtyMessageFolderDelete": "Você está excluindo uma pasta com alterações não salvas em {0} arquivos. Você quer continuar?", + "dirtyMessageFileDelete": "Você está excluindo um arquivo com alterações não salvas. Você quer continuar?", + "dirtyWarning": "Suas alterações serão perdidas se você não salvá-las.", + "confirmMoveTrashMessageFolder": "Tem certeza de que deseja excluir '{0}' e seu conteúdo?", + "confirmMoveTrashMessageFile": "Tem certeza de que deseja excluir '{0}'?", + "undoBin": "Você pode restaurar da lixeira.", + "undoTrash": "Você pode restaurar a partir do lixo.", + "doNotAskAgain": "Não me pergunte novamente", + "confirmDeleteMessageFolder": "Tem certeza de que deseja excluir permanentemente '{0}' e seu conteúdo?", + "confirmDeleteMessageFile": "Tem certeza de que deseja excluir permanentemente '{0}'?", + "irreversible": "Esta ação é irreversível!", + "permDelete": "Excluir permanentemente", + "delete": "Excluir", + "importFiles": "Importar Arquivos", + "confirmOverwrite": "Um arquivo ou pasta com o mesmo nome já existe na pasta de destino. Você quer substituí-lo?", + "replaceButtonLabel": "&&Substituir", + "copyFile": "Copiar", + "pasteFile": "Colar", + "duplicateFile": "Duplicar", + "openToSide": "Aberto para o lado", + "compareSource": "Selecione para comparar", + "globalCompareFile": "Compare o Arquivo Ativo Com...", + "openFileToCompare": "Abrir um arquivo primeiro para compará-lo com outro arquivo.", + "compareWith": "Comparar '{0}' com '{1}'", + "compareFiles": "Comparar Arquivos", + "refresh": "Atualizar", + "save": "Salvar", + "saveAs": "Salvar como...", + "saveAll": "Salvar Todos", + "saveAllInGroup": "Salvar Todos no Grupo", + "saveFiles": "Salvar todos os arquivos", + "revert": "Reverter Arquivo", + "focusOpenEditors": "Foco na Visualização dos Editores Abertos", + "focusFilesExplorer": "Foco no Explorador de Arquivos", + "showInExplorer": "Revelar o Arquivo Ativo na Barra Lateral", + "openFileToShow": "Abrir um arquivo primeiro para mostrá-lo no explorer", + "collapseExplorerFolders": "Esconder Pastas no Explorador", + "refreshExplorer": "Atualizar Explorador", + "openFileInNewWindow": "Abrir o Arquivo Ativo em uma Nova Janela", + "openFileToShowInNewWindow": "Abrir um arquivo primeiro para abrir em uma nova janela", + "revealInWindows": "Revelar no Explorer", + "revealInMac": "Revelar no Finder", + "openContainer": "Abrir a Pasta", + "revealActiveFileInWindows": "Revelar Arquivo Ativo no Windows Explorer", + "revealActiveFileInMac": "Revelar Arquivo Ativo no Finder", + "openActiveFileContainer": "Abrir a Pasta do Arquivo Ativo.", + "copyPath": "Copiar Caminho", + "copyPathOfActive": "Copiar Caminho do Arquivo Ativo", + "emptyFileNameError": "Um nome de arquivo ou pasta deve ser fornecido.", + "fileNameExistsError": "Um arquivo ou pasta **{0}** já existe neste local. Escolha um nome diferente.", + "invalidFileNameError": "O nome **{0}** não é válido como um nome de arquivo ou pasta. Por favor, escolha um nome diferente.", + "filePathTooLongError": "O nome **{0}** resulta em um caminho muito longo. Escolha um nome mais curto.", + "compareWithSaved": "Comparar o Arquivo Ativo com o Arquivo Salvo", + "modifiedLabel": "{0} (em disco) ↔ {1}", + "compareWithClipboard": "Compare o Arquivo Ativo com a Área de Transferência", + "clipboardComparisonLabel": "Área de Transferência ↔ {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..2e61a1656c80 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Abrir um arquivo primeiro para copiar seu caminho", + "openFileToReveal": "Abrir um arquivo primeiro para revelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..0e95d2262537 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Mostrar Explorer", + "explore": "Explorador", + "view": "Exibir", + "textFileEditor": "Editor de Arquivo de Texto", + "binaryFileEditor": "Editor de Arquivo Binário", + "filesConfigurationTitle": "Arquivos", + "exclude": "Configure padrões glob para excluir os arquivos e pastas. Por exemplo, o explorador de arquivos decide quais arquivos e pastas mostrar ou ocultar baseado nessa configuração.", + "files.exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", + "files.exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", + "associations": "Configurar as associações de arquivo para linguagens (por exemplo, \"* Extension\": \"html\"). Estas têm precedência sobre as associações padrão das linguagens instaladas.", + "encoding": "O conjunto de codificação de caracteres padrão a ser usado ao ler e gravar arquivos. Essa configuração também pode ser configurada por linguagem.", + "autoGuessEncoding": "Quando habilitado, tentará adivinhar o conjunto de codificação de caracteres ao abrir arquivos. Essa configuração também pode ser configurada por linguagem.", + "eol": "O caractere padrão de fim de linha. Use \\n para LF e \\r\\n para CRLF.", + "trimTrailingWhitespace": "Quando habilitado, removerá espaços em branco à direita ao salvar um arquivo.", + "insertFinalNewline": "Quando habilitado, inseririrá uma nova linha no final do arquivo quando salvá-lo.", + "trimFinalNewlines": "Quando habilitado, removerá todas as novas linhas após a nova linha no final do arquivo ao salvá-lo.", + "files.autoSave.off": "Um arquivo sujo nunca é automaticamente salvo.", + "files.autoSave.afterDelay": "Um arquivo sujo é salvo automaticamente após configurado em 'files.autoSaveDelay'.", + "files.autoSave.onFocusChange": "Um arquivo sujo é salvo automaticamente quando o editor perde o foco.", + "files.autoSave.onWindowChange": "Um arquivo sujo é salvo automaticamente quando a janela perde o foco.", + "autoSave": "Controla o auto-salvamento de arquivos sujos. Aceita os valores: '{0}', '{1}', '{2}' (editor perde o foco), '{3}' (janela perde o foco). Se definido como '{4}', você pode configurar o atraso em 'files.autoSaveDelay'.", + "autoSaveDelay": "Controla o atraso em milissegundos depois que um arquivo sujo é salvo automaticamente. Só se aplica quando 'files.autoSave' for definida como '{0}'", + "watcherExclude": "Configure padrões glob de caminhos de arquivo para excluir do monitoramento de arquivo. Padrões devem corresponder a caminhos absolutos (ou seja, prefixo com ** ou o caminho completo para combinar corretamente). Alterar essa configuração requer uma reinicialização. Quando o Code estiver consumindo muito tempo de cpu na inicialização, você pode excluir pastas grandes para reduzir a carga inicial.", + "hotExit.off": "Desabilitar a saída à quente.", + "hotExit.onExit": "Saída à quente será acionada quando o aplicativo for fechado, ou seja, quando a última janela é fechada no Windows/Linux ou quando o comando workbench.action.quit é acionado (paleta de comandos, keybinding, menu). Todas as janelas com backups serão restauradas na próxima execução.", + "hotExit.onExitAndWindowClose": "Saída à quente será acionada quando o aplicativo for fechado, ou seja, quando a última janela é fechada no Windows/Linux ou quando o comando workbench.action.quit é acionado (paleta de comando, keybinding, menu), e também para qualquer janela com uma pasta aberta independentemente se é a última janela. Todas as janelas sem pastas abertas serão restauradas no próximo lançamento. Para restaurar janelas de pastas como eram antes do desligamento configure \"window.restoreWindows\" para \"todos\".", + "hotExit": "Controla se os arquivos não salvos são lembrados entre as sessões, permitindo salvar alerta ao sair do editor seja ignorada.", + "useExperimentalFileWatcher": "Usar o novo monitor experimental de arquivo.", + "defaultLanguage": "O modo de linguagem padrão que é atribuída para novos arquivos.", + "editorConfigurationTitle": "Editor", + "formatOnSave": "Formata um arquivo no salvamento. Um formatador deve estar disponível, o arquivo não deve ser salvo automaticamente e editor não deve ser desligado.", + "explorerConfigurationTitle": "Explorador de arquivos", + "openEditorsVisible": "Número de editores mostrado no painel Abrir Editores. Configurá-lo para 0 irá ocultar o painel.", + "dynamicHeight": "Controla se a altura da seção de editores abertos deve adaptar-se dinamicamente para o número de elementos ou não.", + "autoReveal": "Controla se o explorador deve automaticamente revelar e selecionar arquivos ao abri-los.", + "enableDragAndDrop": "Controla se o explorador deve permitir mover arquivos e pastas através de arrastar e soltar.", + "confirmDragAndDrop": "Controla se o explorer deve pedir a confirmação ao mover arquivos ou pastas através de arrastar e soltar.", + "confirmDelete": "Controla se o explorador deve pedir a confirmação ao excluir um arquivo por meio do lixo.", + "sortOrder.default": "Arquivos e pastas são classificadas por seus nomes, em ordem alfabética. Pastas são exibidas acima dos arquivos.", + "sortOrder.mixed": "Arquivos e pastas são classificadas por seus nomes, em ordem alfabética. Arquivos são misturados com pastas.", + "sortOrder.filesFirst": "Arquivos e pastas são classificadas por seus nomes, em ordem alfabética. Os arquivos são exibidos acima das pastas.", + "sortOrder.type": "Arquivos e pastas são classificadas de acordo com suas extensões, em ordem alfabética. Pastas são exibidas acima dos arquivos.", + "sortOrder.modified": "Arquivos e pastas são classificados de acordo com a data da última modificação, em ordem decrescente. Pastas são exibidas acima dos arquivos.", + "sortOrder": "Controla a ordem de classificação dos arquivos e pastas no explorador. Além da classificação padrão, você pode definir a ordem para 'mixed' (arquivos e pastas misturados), 'type' (por tipo de arquivo), 'modified' (pela data da última modificação) ou 'filesFirst' (exibe os arquivos acima das pastas).", + "explorer.decorations.colors": "Controles se as decorações de arquivo devem usar cores.", + "explorer.decorations.badges": "Controles se as decorações de arquivo devem usar identificações." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..09a298946434 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Use as ações na barra de ferramentas de editor para a direita para **desfazer** suas alterações ou **substituir** o conteúdo no disco com as alterações", + "discard": "Descartar", + "overwrite": "Sobrescrever", + "retry": "Tentar novamente", + "readonlySaveError": "Falha ao salvar '{0}': O arquivo está protegido contra gravação. Selecione 'Substituir' para remover a proteção.", + "genericSaveError": "Erro ao salvar '{0}': {1}", + "staleSaveError": "Falha ao salvar '{0}': O conteúdo no disco é mais recente. Clique em **Comparar** para comparar a sua versão com a do disco.", + "compareChanges": "Comparar", + "saveConflictDiffLabel": "{0} (no disco) ↔ {1} (em {2}) - Resolver conflitos de salvamento" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..ca0724076d8a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Nenhuma Pasta Aberta", + "explorerSection": "Seção de Explorador de Arquivos", + "noWorkspaceHelp": "Você ainda não adicionou uma pasta ao espaço de trabalho.", + "addFolder": "Adicionar Pasta", + "noFolderHelp": "Você ainda não abriu uma pasta.", + "openFolder": "Abrir Pasta" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..36d4c36aa75e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Explorador", + "canNotResolve": "Não foi possível resolver a pasta da área de trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..4753a88bd4c9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Seção de Explorador de Arquivos", + "treeAriaLabel": "Explorador de Arquivos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..02afd8f004f4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Digite o Nome do arquivo. Pressione Enter para confirmar ou Escape para cancelar.", + "filesExplorerViewerAriaLabel": "{0}, Explorador de Arquivos", + "dropFolders": "Você deseja adicionar as pastas ao espaço de trabalho?", + "dropFolder": "Você quer adicionar a pasta no espaço de trabalho?", + "addFolders": "&&Adicionar Pastas", + "addFolder": "&&Adicionar Pasta", + "confirmMove": "Tem certeza que deseja mover '{0}'?", + "doNotAskAgain": "Não me pergunte novamente", + "moveButtonLabel": "&&Mover", + "confirmOverwriteMessage": "'{0}' já existe na pasta de destino. Deseja substituí-lo?", + "irreversible": "Esta ação é irreversível!", + "replaceButtonLabel": "&&Substituir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..83f2a510196a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Abrir Editores", + "openEditosrSection": "Abrir Seção de Editores", + "dirtyCounter": "{0} não salvos", + "saveAll": "Salvar Todos", + "closeAllUnmodified": "Fechar Não Modificados", + "closeAll": "Fechar todos", + "compareWithSaved": "Comparar com o salvo", + "close": "Fechar", + "closeOthers": "Fechar Outros" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..5564dee7aea9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, Agrupar Editor", + "openEditorAriaLabel": "{0}, Abrir Editor", + "saveAll": "Salvar Todos", + "closeAllUnmodified": "Fechar Não Modificados", + "closeAll": "Fechar todos", + "compareWithSaved": "Comparar com o salvo", + "close": "Fechar", + "closeOthers": "Fechar Outros" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..9daea31f4af2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "totalProblems": "Total {0} Problemas", + "filteredProblems": "Mostrando {0} de {1} Problemas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json index a753fe413e86..ad1f8b439c54 100644 --- a/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,7 @@ { "viewCategory": "Exibir", "problems.view.toggle.label": "Alternar Problemas", - "problems.view.show.label": "Mostrar Problemas", - "problems.view.hide.label": "Esconder problemas", + "problems.view.focus.label": "Problemas de foco", "problems.panel.configuration.title": "Visualização de Problemas", "problems.panel.configuration.autoreveal": "Controla se a visaulização de problemas evela os arquivos automaticamente ao abri-los", "markers.panel.title.problems": "Problemas", diff --git a/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..886f4120ac93 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "Perfis criados com sucesso.", + "prof.detail": "Por favor, crie um problema e anexe manualmente os seguintes arquivos:\n{0}", + "prof.restartAndFileIssue": "Criar Problema e Reiniciar", + "prof.restart": "Reiniciar", + "prof.thanks": "Obrigado por nos ajudar.", + "prof.detail.restart": "É necessário um reinício final para continuar a usar '{0}'. Novamente, obrigado pela sua contribuição." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 279307d4b875..63c74c150537 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "Pressionar a combinação de teclas desejada e ENTER. ESCAPE para cancelar.", + "defineKeybinding.initial": "Pressione a combinação de teclas desejada e pressione ENTER.", "defineKeybinding.chordsTo": "Acorde para" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 1cb6541687c6..4027814e08da 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "Alterar Keybinding", "addKeybindingLabelWithKey": "Adicionar Keybinding {0}", "addKeybindingLabel": "Adicionar Keybinding", + "title": "{0} ({1})", "commandAriaLabel": "Comando é {0}.", "keybindingAriaLabel": "KeyBinding é {0}.", "noKeybinding": "Nenhum Keybinding atribuído.", diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 0abf761f3b58..50c13e912594 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openRawDefaultSettings": "Abrir Configurações Padrão Raw", "openGlobalSettings": "Abra as Configurações de Usuário", "openGlobalKeybindings": "Abrir Atalhos de Teclado", "openGlobalKeybindingsFile": "Abrir Arquivo de Atalhos de Teclado", diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 406b00bf2d0e..49fd2fe9bd82 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Configurações Padrão", "SearchSettingsWidget.AriaLabel": "Configurações de Pesquisa", "SearchSettingsWidget.Placeholder": "Configurações de Pesquisa", - "totalSettingsMessage": "Total {0} Configurações", "noSettingsFound": "Nenhum resultado", "oneSettingFound": "1 Configuração correspondente", "settingsFound": "{0} Configurações correspondentes", - "fileEditorWithInputAriaLabel": "{0}. Editor de Arquivo de Texto.", - "fileEditorAriaLabel": "Editor de Arquivo de Texto", + "totalSettingsMessage": "Total {0} Configurações", + "defaultSettings": "Configurações Padrão", + "defaultFolderSettings": "Configuração Padrão da Pasta", "defaultEditorReadonly": "Editar no editor do lado direito para substituir os padrões.", "preferencesAriaLabel": "Preferências padrão. Editor de texto somente leitura." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 136d71cc546e..619b08fd936d 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Coloque as suas configurações aqui para substituir as configurações padrão.", "emptyWorkspaceSettingsHeader": "Coloque as suas configurações aqui para substituir as configurações de usuário.", "emptyFolderSettingsHeader": "Coloque as suas configurações de pasta aqui para substituir aqueles das configurações do espaço de trabalho.", - "defaultFolderSettingsTitle": "Configurações de pasta padrão", - "defaultSettingsTitle": "Configurações Padrão", "editTtile": "Editar", "replaceDefaultValue": "Substituir nas Configurações", "copyDefaultValue": "Copiar para Configurações", diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 77e307a5580a..800b9bf18e2a 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Tente pesquisa fuzzy!", + "defaultSettingsFuzzyPrompt": "Tente a busca de linguagem natural!", "defaultSettings": "Coloque suas configurações no editor do lado direito para substituir.", "noSettingsFound": "Não há configurações encontradas.", - "folderSettingsDetails": "Configurações de pasta", - "enableFuzzySearch": "Ative a pesquisa fuzzy experimental" + "settingsSwitcherBarAriaLabel": "Chave de Configurações", + "userSettings": "Configurações de Usuário", + "workspaceSettings": "Configurações de Espaço de Trabalho", + "folderSettings": "Configurações da Pasta", + "enableFuzzySearch": "Habilitar busca de linguagem natural" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..40e6d0841da3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Editor de Preferências Padrão", + "keybindingsEditor": "Editor de Keybindings", + "preferences": "Preferências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 4b9c688e07f8..fc4f8f903118 100644 --- a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Provedores de Controle de Código Fonte", "hideRepository": "Ocultar", - "commitMessage": "Mensagem (tecle {0} para confirmar)", "installAdditionalSCMProviders": "Instalar provedores de SCM adicionais...", "no open repo": "Não existem provedores controle de código fonte ativos.", "source control": "Controle de código-fonte", diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index b4db95bce097..17f6fb93d528 100644 --- a/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "entrada", - "useIgnoreFilesDescription": "Usar Ignorar Arquivos", - "useExcludeSettingsDescription": "Usar Configurações de Exclusão" + "useExcludesAndIgnoreFilesDescription": "Usar excluir configurações e ignorar arquivos" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index e3cabff1118f..b7b7494e9e4b 100644 --- a/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", "exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", "useRipgrep": "Controla se utiliza ripgrep em buscas de texto e de arquivo", - "useIgnoreFilesByDefault": "Controla se utiliza arquivos .gitignore e .ignore por padrão ao fazer pesquisas de texto em um novo espaço de trabalho.", "useIgnoreFiles": "Controla se utiliza arquivos .gitignore e .ignore por padrão ao fazer pesquisas de arquivos.", "search.quickOpen.includeSymbols": "Configurar para incluir resultados de uma pesquisa símbolo global nos resultados do arquivo para Abertura Rápida.", "search.followSymlinks": "Controla quando seguir symlinks ao realizar uma busca." diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 18c5fd1a3c43..34ded87a2673 100644 --- a/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Mostrar a Busca Anterior Excluindo Padrões", "nextSearchTerm": "Mostrar o Próximo Termo de Pesquisa", "previousSearchTerm": "Mostrar Termo de Pesquisa Anterior", - "focusNextInputBox": "Focalizar a Próxima Caixa de Entrada", - "focusPreviousInputBox": "Focalizar a Caixa de Entrada Anterior", "showSearchViewlet": "Mostrar Busca", "findInFiles": "Localizar nos Arquivos", "findInFilesWithSelectedText": "Localizar nos Arquivos Com o Texto Selecionado", "replaceInFiles": "Substituir nos Arquivos", "replaceInFilesWithSelectedText": "Substituir nos Arquivos Com o Texto Selecionado", - "findInWorkspace": "Procurar no Espaço de Trabalho...", - "findInFolder": "Procurar na pasta...", "RefreshAction.label": "Atualizar", - "ClearSearchResultsAction.label": "Limpar os Resultados da Pesquisa", + "CollapseDeepestExpandedLevelAction.label": "Recolher tudo", + "ClearSearchResultsAction.label": "Limpar", "FocusNextSearchResult.label": "Focalizar o Próximo Resultado da Pesquisa", "FocusPreviousSearchResult.label": "Focalizar o Resultado da Pesquisa Anterior", "RemoveAction.label": "Ignorar", diff --git a/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..b7b7494e9e4b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Ir para Símbolo no Espaço de Trabalho...", + "name": "Pesquisar", + "search": "Pesquisar", + "view": "Exibir", + "openAnythingHandlerDescription": "Ir para o Arquivo", + "openSymbolDescriptionNormal": "Ir para o Símbolo em Área de Trabalho", + "searchOutputChannelTitle": "Pesquisar", + "searchConfigurationTitle": "Pesquisar", + "exclude": "Configure os padrões glob para excluir arquivos e pastas nas pesquisas. Herda todos os padrões glob da configuração files.exclude.", + "exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", + "exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", + "useRipgrep": "Controla se utiliza ripgrep em buscas de texto e de arquivo", + "useIgnoreFiles": "Controla se utiliza arquivos .gitignore e .ignore por padrão ao fazer pesquisas de arquivos.", + "search.quickOpen.includeSymbols": "Configurar para incluir resultados de uma pesquisa símbolo global nos resultados do arquivo para Abertura Rápida.", + "search.followSymlinks": "Controla quando seguir symlinks ao realizar uma busca." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..a25c73a96fae --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "Procurar na pasta...", + "findInWorkspace": "Procurar no Espaço de Trabalho..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 7841731c4352..524583772245 100644 --- a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "Tarefas", "ConfigureTaskRunnerAction.label": "Configurar a tarefa", - "ConfigureBuildTaskAction.label": "Configurar Tarefa de Compilação", "CloseMessageAction.label": "Fechar", - "ShowTerminalAction.label": "Terminal Visualização", "problems": "Problemas", + "building": "Compilando...", "manyMarkers": "99+", "runningTasks": "Mostrar tarefas em execução", "tasks": "Tarefas", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "Nenhuma tarefa para executar foi encontrada. Configure Tarefas...", "TaskService.fetchingBuildTasks": "Buscando tarefas de compilação...", "TaskService.pickBuildTask": "Selecione a tarefa de compilação para executar", - "TaskService.noBuildTask": "Nenhuma tarefa de compilação para executar foi encontrada. Configure Tarefas...", + "TaskService.noBuildTask": "Nenhuma tarefa de compilação para executar foi encontrada. Configure a tarefa de compilação... \n", "TaskService.fetchingTestTasks": "Buscando tarefas de teste...", "TaskService.pickTestTask": "Selecione a tarefa de teste para executar", "TaskService.noTestTaskTerminal": "Nenhuma tarefa de teste para executar foi encontrada. Configure Tarefas...", diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index f258ad63adf6..207ef35291c9 100644 --- a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "Um erro desconhecido ocorreu durante a execução de uma tarefa. Consulte o log de saída de tarefa para obter detalhes.", "dependencyFailed": "Não foi possível resolver a tarefa dependente '{0}' na pasta de espaço de trabalho '{1}'", "TerminalTaskSystem.terminalName": "Tarefa - {0}", + "closeTerminal": "Pressione qualquer tecla para fechar o terminal.", "reuseTerminal": "Terminal será reutilizado pelas tarefas, pressione qualquer tecla para fechar.", "TerminalTaskSystem": "Não é possível executar um comando shell em uma unidade UNC.", "unkownProblemMatcher": "Problem matcher {0} não pode ser resolvido. O matcher será ignorado" diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index ada7842e7965..ae90ef5cf646 100644 --- a/i18n/ptb/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,8 @@ "ConfigurationParser.noTypeDefinition": "Erro: não há nenhum tipo de tarefa registrado '{0}'. Você esqueceu de instalar uma extensão que fornece um provedor de tarefa correspondente?", "ConfigurationParser.missingRequiredProperty": "Erro: a configuração de tarefa '{0}' não possui a propriedade obrigatória '{1}'. A configuração de tarefa será ignorada.", "ConfigurationParser.notCustom": "Erro: tarefas não está declarada como uma tarefa personalizada. A configuração será ignorada.\n{0}\n", - "ConfigurationParser.noTaskName": "Erro: tarefas devem fornecer uma propriedade taskName. A tarefa será ignorada.\n{0}\n", - "taskConfiguration.shellArgs": "Aviso: a tarefa '{0}' é um comando do shell e o nome de comando ou um dos seus argumentos tem espaços sem escape. Para garantir a linha de comando correta por favor mesclar argumentos no comando.", + "ConfigurationParser.noTaskName": "Erro: uma tarefa deve fornecer uma propriedade de rótulo. A tarefa será ignorada.\n{0}\n", + "taskConfiguration.shellArgs": "Aviso: a tarefa '{0}' é um comando shell e um dos seus argumentos pode ter espaços sem escape. Para garantir a citação da linha de comando correta por favor mesclar args ao comando.", "taskConfiguration.noCommandOrDependsOn": "Erro: a tarefa '{0}' não especifica nem um comando nem uma propriedade dependsOn. A tarefa será ignorada. Sua definição é: \n{1}", "taskConfiguration.noCommand": "Erro: a tarefa '{0}' não define um comando. A tarefa será ignorada. Sua definição é: {1}", "TaskParse.noOsSpecificGlobalTasks": "Tarefa versão 2.0.0 não oferece suporte a tarefas globais específicas do sistema operacional. Converta-as em uma tarefa com um comando específico do sistema operacional. Tarefas afetadas:\n{0}" diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index 44762cc06d3b..62b6ee547fbb 100644 --- a/i18n/ptb/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, seletor de terminal", "termCreateEntryAriaLabel": "{0}, criar novo terminal", - "'workbench.action.terminal.newplus": "$(plus) criar novo Terminal Integrado", + "workbench.action.terminal.newplus": "$(plus) criar novo Terminal Integrado", "noTerminalsMatching": "Não há terminais correspondentes", "noTerminalsFound": "Não há terminais abertos" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index f4a78b8d461f..d97a515c6ead 100644 --- a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,7 @@ "terminal.integrated.rightClickCopyPaste": "Quando configurado, isto evitará que o menu de contexto apareça quando pressionado o botão direito do mouse dentro do terminal, em vez disso vai copiar quando há uma seleção e colar quando não há nenhuma seleção.", "terminal.integrated.fontFamily": "Controla a família de fontes do terminal, este padrão é o valor do editor.fontFamily.", "terminal.integrated.fontSize": "Controla o tamanho da fonte em pixels do terminal.", - "terminal.integrated.lineHeight": "Controles a altura da linha do terminal, este número é multiplicada pelo tamanho da fonte terminal para obter a altura real da linha em pixels.", + "terminal.integrated.lineHeight": "Controla a altura da linha do terminal, este número é multiplicado pelo tamanho da fonte do terminal para obter a altura real da linha em pixels.", "terminal.integrated.enableBold": "Se deseja habilitar o texto em negrito dentro do terminal, note que isso requer o apoio do shell do terminal.", "terminal.integrated.cursorBlinking": "Controla se o cursor do terminal pisca.", "terminal.integrated.cursorStyle": "Controla o estilo do cursor do terminal.", diff --git a/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 9968bf0b9b1e..36e908bf1eea 100644 --- a/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,15 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "Tema de Cores", + "themes.category.light": "temas claros", + "themes.category.dark": "temas escuros", + "themes.category.hc": "temas de alto contraste", "installColorThemes": "Instalar temas de cor adicionais...", "themes.selectTheme": "Selecione o tema de cor (teclas cima/baixo para visualização)", "selectIconTheme.label": "Arquivo de Ícone do Tema", - "installIconThemes": "Instalar Temas de Ícones de Arquivos Adicionais...", "noIconThemeLabel": "Nenhum", "noIconThemeDesc": "Desabilitar ícones de arquivos", - "problemChangingIconTheme": "Problema configurando tema de ícones: {0}", + "installIconThemes": "Instalar Temas de Ícones de Arquivos Adicionais...", "themes.selectIconTheme": "Selecionar Tema de Ícones de Arquivos", "generateColorTheme.label": "Gerar Tema de Cores a Partir das Configurações Atuais", "preferences": "Preferências", diff --git a/i18n/ptb/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index e274edfe6f18..0ff71be7ea47 100644 --- a/i18n/ptb/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Janela de configuração específica que pode ser configurada nas configurações do usuário ou área de trabalho.", "scope.resource.description": "Configuração específica do recurso que pode ser configurada nas configurações do usuário, espaço de trabalho ou pasta.", "scope.description": "Escopo em que a configuração é aplicável. Escopos disponíveis são 'window' e 'resource'.", + "vscode.extension.contributes.defaultConfiguration": "Contribui às definições de configuração padrão do editor por linguagem.", "vscode.extension.contributes.configuration": "Contribui às definições de configuração.", "invalid.title": "'configuration.title' deve ser um string", - "vscode.extension.contributes.defaultConfiguration": "Contribui às definições de configuração padrão do editor por linguagem.", "invalid.properties": "'configuration.properties' deve ser um objeto", "invalid.allOf": "'configuration.allOf' está obsoleto e não deve ser usado. Em vez disso, passe várias seções de configuração como uma matriz para o ponto de contribuição 'configuration'.", "workspaceConfig.folders.description": "Lista de pastas a serem carregadas no espaço de trabalho.", diff --git a/i18n/ptb/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/ptb/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..63fd1d1955da --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetria", + "telemetry.enableCrashReporting": "Ativar o envio de relatórios de incidentes à Microsoft. Esta opção requer reinicialização para ser efetiva." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/ptb/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index f0518e7f98ec..b24908e55972 100644 --- a/i18n/ptb/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "bubbleTitle": "contém itens enfatizados" + "bubbleTitle": "Contém itens enfatizados" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 8b5f44c434ac..fc90af28527c 100644 --- a/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -9,5 +9,6 @@ "extensionHostProcess.crash": "Host de extensão foi encerrado inesperadamente.", "extensionHostProcess.unresponsiveCrash": "Host de extensão encerrado porque não foi responsivo.", "overwritingExtension": "Sobrescrevendo extensão {0} por {1}.", - "extensionUnderDevelopment": "Carregando extensão de desenvolvimento em {0}" + "extensionUnderDevelopment": "Carregando extensão de desenvolvimento em {0}", + "extensionCache.invalid": "Extensões foram modificadas no disco. Por favor atualize a janela." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json index e6423a5b25c7..ae4ae7187430 100644 --- a/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "Arquivo é um diretório", "fileNotModifiedError": "Arquivo não modificado desde", "fileTooLargeError": "Arquivo muito grande para abrir", - "fileBinaryError": "Arquivo parece ser binário e não pode ser aberto como texto", "fileNotFoundError": "Arquivo não encontrado ({0})", + "fileBinaryError": "Arquivo parece ser binário e não pode ser aberto como texto", "fileExists": "Arquivo a ser criado já existe ({0})", "fileMoveConflict": "Não é possível mover/copiar. Arquivo já existe no destino.", "unableToMoveCopyError": "Não é possível mover/copiar. Arquivo poderia substituir a pasta em que está contida.", diff --git a/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index b890aa49bd7e..fedfd5457f0d 100644 --- a/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -22,5 +22,5 @@ "keybindings.json.when": "Condição quando a chave está ativa.", "keybindings.json.args": "Argumentos a serem passados para o comando para executar.", "keyboardConfigurationTitle": "Teclado", - "dispatch": "Controla a lógica de expedição para pressionamentos de teclas para usar `keydown.code` (recomendado) ou 'keydown.keyCode'." + "dispatch": "Controla a lógica de pressionamentos de teclas a ser usada para envio, se será 'code' (recomendado) ou 'keyCode'." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json index 9fe74ad26f3a..ca08dc13ff6a 100644 --- a/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "files.backup.failSave": "Arquivos não poderiam ser backupeados (erro: {0}), tente salvar seus arquivos para sair." + "files.backup.failSave": "Arquivos que estão com problemas não podem ser escritos na localização de backup (erro: {0}). Tente salvar seus arquivos primeiro e depois sair." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index d27ccd6f4abf..15017c071573 100644 --- a/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "Foram adicionadas novas configurações de tema para as configurações de usuário. Backup está disponível em {0}.", "error.cannotloadtheme": "Não é possível carregar {0}: {1}", - "error.cannotloadicontheme": "Não é possível carregar {0}", "colorTheme": "Especifica o tema de cores usado no espaço de trabalho.", "colorThemeError": "Tema é desconhecido ou não está instalado.", "iconTheme": "Especifica o tema de ícones usado no espaço de trabalho ou 'null' para não mostrar qualquer arquivo de ícones.", diff --git a/i18n/rus/extensions/git/out/autofetch.i18n.json b/i18n/rus/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..0f8fdf4d3aab --- /dev/null +++ b/i18n/rus/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Да", + "no": "Нет" +} \ No newline at end of file diff --git a/i18n/rus/extensions/git/out/commands.i18n.json b/i18n/rus/extensions/git/out/commands.i18n.json index 58ec5f6da208..149e1af6b097 100644 --- a/i18n/rus/extensions/git/out/commands.i18n.json +++ b/i18n/rus/extensions/git/out/commands.i18n.json @@ -71,7 +71,6 @@ "no stashes": "Отсутствуют спрятанные изменения, которые необходимо восстановить.", "pick stash to pop": "Выберите спрятанное изменение для отображения", "clean repo": "Очистите рабочее дерево репозитория перед извлечением.", - "cant push": "Не удается отправить ссылки в удаленную ветвь. Сначала выберите \"Извлечь\", чтобы интегрировать изменения.", "git error details": "Git: {0}", "git error": "Ошибка Git", "open git log": "Открыть журнал GIT" diff --git a/i18n/rus/extensions/git/out/main.i18n.json b/i18n/rus/extensions/git/out/main.i18n.json index 175b7f3a7cc3..85416c1538ab 100644 --- a/i18n/rus/extensions/git/out/main.i18n.json +++ b/i18n/rus/extensions/git/out/main.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "using git": "Использование GIT {0} из {1}", - "updateGit": "Обновить Git", "neverShowAgain": "Больше не показывать", + "updateGit": "Обновить Git", "git20": "У вас установлен Git {0}. Код лучше всего работает с Git >= 2." } \ No newline at end of file diff --git a/i18n/rus/extensions/git/out/repository.i18n.json b/i18n/rus/extensions/git/out/repository.i18n.json index 053f8f8b45f9..beb3198e7429 100644 --- a/i18n/rus/extensions/git/out/repository.i18n.json +++ b/i18n/rus/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Удалено нами", "both added": "Добавлено обеими сторонами", "both modified": "Изменено обеими сторонами", + "commitMessage": "Сообщение (чтобы зафиксировать, нажмите кнопку {0})", "commit": "Commit", "merge changes": "Объединить изменения", "staged changes": "Промежуточно сохраненные изменения", diff --git a/i18n/rus/extensions/markdown/out/commands.i18n.json b/i18n/rus/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..5c5b3690dc66 --- /dev/null +++ b/i18n/rus/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "onPreviewStyleLoadError": "Не удалось загрузить 'markdown.styles': {0}" +} \ No newline at end of file diff --git a/i18n/rus/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/rus/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..62ff186c8583 --- /dev/null +++ b/i18n/rus/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Некоторое содержимое в этом документе было отключено", + "preview.securityMessage.title": "В предварительном просмотре Markdown было отключено потенциально опасное или ненадежное содержимое. Чтобы разрешить ненадежное содержимое или включить сценарии, измените параметры безопасности предварительного просмотра Markdown.", + "preview.securityMessage.label": "Предупреждение безопасности об отключении содержимого" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/base/common/errorMessage.i18n.json b/i18n/rus/src/vs/base/common/errorMessage.i18n.json index d3403f4afa54..5edc47447239 100644 --- a/i18n/rus/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/rus/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. Код ошибки: {1}", - "error.permission.verbose": "Отказано в разрешении (HTTP {0})", - "error.permission": "Отказано в разрешении", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Произошла неизвестная ошибка подключения ({0})", - "error.connection.unknown": "Произошла неизвестная ошибка подключения. Утеряно подключение к Интернету, либо сервер, к которому вы подключены, перешел в автономный режим.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "Произошла неизвестная ошибка. Подробные сведения см. в журнале.", "nodeExceptionMessage": "Произошла системная ошибка ({0})", diff --git a/i18n/rus/src/vs/code/electron-main/main.i18n.json b/i18n/rus/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..3a698517ea1d --- /dev/null +++ b/i18n/rus/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "&&Закрыть" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index 683007474d8d..194c4240f258 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -22,12 +22,9 @@ "miQuit": "Выйти из {0}", "miNewFile": "&&Новый файл", "miOpen": "Открыть...", - "miOpenWorkspace": "&&Открыть рабочую область...", "miOpenFolder": "Открыть &&папку...", "miOpenFile": "&&Открыть файл...", "miOpenRecent": "Открыть &&последние", - "miSaveWorkspaceAs": "&&Сохранить рабочую область как...", - "miAddFolderToWorkspace": "&& Добавить папку в рабочую область...", "miSave": "Сохранить", "miSaveAs": "Сохранить &&как...", "miSaveAll": "Сохранить &&все", @@ -157,7 +154,6 @@ "mMergeAllWindows": "Объединить все окна", "miToggleDevTools": "&&Показать/скрыть средства разработчика", "miAccessibilityOptions": "Специальные &&возможности", - "miReportIssues": "&&Сообщить о проблемах", "miWelcome": "&&Приветствие", "miInteractivePlayground": "&&Интерактивная площадка", "miDocumentation": "&&Документация", @@ -184,6 +180,6 @@ "miDownloadingUpdate": "Скачивается обновление...", "miInstallingUpdate": "Идет установка обновления...", "miCheckForUpdates": "Проверить наличие обновлений...", - "aboutDetail": "\nВерсия {0}\nФиксация {1}\nДата {2}\nОблочка {3}\nОтрисовщик {4}\nУзел {5}\nАрхитектура {6}", - "okButton": "ОК" + "okButton": "ОК", + "copy": "Копировать" } \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/rus/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..fc197d1c5c6b --- /dev/null +++ b/i18n/rus/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Следующие файлы были изменены: {0}", + "summary.0": "Нет изменений", + "summary.nm": "Сделано изменений {0} в {1} файлах", + "summary.n0": "Сделано изменений {0} в одном файле" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json index 4d615e7f9cf3..83b7b87dd665 100644 --- a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,12 +10,9 @@ "fontSize": "Управляет размером шрифта в пикселях.", "lineHeight": "Управляет высотой строк. Укажите 0 для вычисления высоты строки по размеру шрифта.", "letterSpacing": "Управляет интервалом между буквами в пикселях.", - "lineNumbers": "Управляет видимостью номеров строк. Возможные значения: \"on\", \"off\" и \"relative\". Значение \"relative\" показывает количество строк, начиная с текущего положения курсора.", "rulers": "Отображать вертикальные линейки после определенного числа моноширинных символов. Для отображения нескольких линеек укажите несколько значений. Если не указано ни одного значения, вертикальные линейки отображаться не будут.", "wordSeparators": "Символы, которые будут использоваться как разделители слов при выполнении навигации или других операций, связанных со словами.", - "tabSize": "Число пробелов в табуляции. Эта настройка переопределяется на основании содержимого файла, когда включен параметр \"editor.detectIndentation\".", "tabSize.errorMessage": "Ожидается число. Обратите внимание, что значение auto заменено параметром editor.detectIndentation.", - "insertSpaces": "Вставлять пробелы при нажатии клавиши TAB. Эта настройка переопределяется на основании содержимого файла, когда включен параметр \"editor.detectIndentation\".", "insertSpaces.errorMessage": "Ожидается логическое значение. Обратите внимание, что значение auto заменено параметром editor.detectIndentation.", "detectIndentation": "При открытии файла editor.tabSize и editor.insertSpaces будут определяться на основе содержимого файла.", "roundedSelection": "Определяет, будут ли выделения иметь скругленные углы.", @@ -89,8 +86,8 @@ "links": "Определяет, должен ли редактор определять ссылки и делать их доступными для щелчка", "colorDecorators": "Определяет, должны ли в редакторе отображаться внутренние декораторы цвета и средство выбора цвета.", "codeActions": "Включает индикатор действия кода", + "selectionClipboard": "Контролирует, следует ли поддерживать первичный буфер обмена Linux.", "sideBySide": "Определяет, как редактор несовпадений отображает отличия: рядом или в тексте.", "ignoreTrimWhitespace": "Определяет, должен ли редактор несовпадений трактовать несовпадения символов-разделителей как различия.", - "renderIndicators": "Определяет отображение редактором несовпадений индикаторов +/- для добавленных или удаленных изменений", - "selectionClipboard": "Контролирует, следует ли поддерживать первичный буфер обмена Linux." + "renderIndicators": "Определяет отображение редактором несовпадений индикаторов +/- для добавленных или удаленных изменений" } \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/rus/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..b1e1079e98b8 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Перейти к скобке" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/rus/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..75a9728d2c7f --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Переместить курсор влево", + "caret.moveRight": "Переместить курсор вправо" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/rus/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..f747bcfde4da --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Транспортировать буквы" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/rus/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..390f04f8581a --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Вырезать", + "actions.clipboard.copyLabel": "Копировать", + "actions.clipboard.pasteLabel": "Вставить", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Копировать с выделением синтаксиса" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/rus/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..58b80b36af4f --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Закомментировать или раскомментировать строку", + "comment.line.add": "Закомментировать строку", + "comment.line.remove": "Раскомментировать строку", + "comment.block": "Закомментировать или раскомментировать блок" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/rus/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..1d813732e528 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Показать контекстное меню редактора" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/find/findController.i18n.json b/i18n/rus/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..5c6f87afd29e --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Найти", + "findNextMatchAction": "Найти далее", + "findPreviousMatchAction": "Найти ранее", + "nextSelectionMatchFindAction": "Найти следующее выделение", + "previousSelectionMatchFindAction": "Найти предыдущее выделение", + "startReplace": "Заменить", + "showNextFindTermAction": "Показать следующий найденный термин", + "showPreviousFindTermAction": "Показать предыдущий найденный термин" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..42b7cc3e8eab --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Найти", + "placeholder.find": "Найти", + "label.previousMatchButton": "Предыдущее соответствие", + "label.nextMatchButton": "Следующее соответствие", + "label.toggleSelectionFind": "Найти в выделении", + "label.closeButton": "Закрыть", + "label.replace": "Заменить", + "placeholder.replace": "Заменить", + "label.replaceButton": "Заменить", + "label.replaceAllButton": "Заменить все", + "label.toggleReplaceButton": "Режим \"Переключение замены\"", + "title.matchesCountLimit": "Отображаются только первые {0} результатов, но все операции поиска выполняются со всем текстом.", + "label.matchesLocation": "{0} из {1}", + "label.noResults": "Нет результатов" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..e03b15626d2d --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Найти", + "placeholder.find": "Найти", + "label.previousMatchButton": "Предыдущее соответствие", + "label.nextMatchButton": "Следующее соответствие", + "label.closeButton": "Закрыть" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/rus/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..5fe065ae0dc4 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Развернуть", + "unFoldRecursivelyAction.label": "Развернуть рекурсивно", + "foldAction.label": "Свернуть", + "foldRecursivelyAction.label": "Свернуть рекурсивно", + "foldAllAction.label": "Свернуть все", + "unfoldAllAction.label": "Развернуть все", + "foldLevelAction.label": "Уровень папки {0}" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/rus/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..5ff5028a8fbf --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "Внесена одна правка форматирования в строке {0}.", + "hintn1": "Внесены правки форматирования ({0}) в строке {1}.", + "hint1n": "Внесена одна правка форматирования между строками {0} и {1}.", + "hintnn": "Внесены правки форматирования ({0}) между строками {1} и {2}.", + "no.provider": "К сожалению, модуль форматирования для файлов '{0}' не установлен.", + "formatDocument.label": "Форматировать документ", + "formatSelection.label": "Форматировать выбранный фрагмент" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..e61942e5d18e --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Определение для \"{0}\" не найдено.", + "generic.noResults": "Определения не найдены.", + "meta.title": " — определения {0}", + "actions.goToDecl.label": "Перейти к определению", + "actions.goToDeclToSide.label": "Открыть определение сбоку", + "actions.previewDecl.label": "Показать определение", + "goToImplementation.noResultWord": "Не найдена реализация для \"{0}\".", + "goToImplementation.generic.noResults": "Не найдена реализация.", + "meta.implementations.title": "— {0} реализаций", + "actions.goToImplementation.label": "Перейти к реализации", + "actions.peekImplementation.label": "Показать реализацию", + "goToTypeDefinition.noResultWord": "Не найдено определение типа для \"{0}\".", + "goToTypeDefinition.generic.noResults": "Не найдено определение типа.", + "meta.typeDefinitions.title": "— {0} определений типов", + "actions.goToTypeDefinition.label": "Перейти к определению типа", + "actions.peekTypeDefinition.label": "Показать определение типа" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..a403ef380f2f --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Щелкните, чтобы отобразить определения ({0})." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..5ca181d11bd7 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Перейти к следующей ошибке или предупреждению", + "markerAction.previous.label": "Перейти к предыдущей ошибке или предупреждению", + "editorMarkerNavigationError": "Цвет ошибки в мини-приложении навигации по меткам редактора.", + "editorMarkerNavigationWarning": "Цвет предупреждения в мини-приложении навигации по меткам редактора.", + "editorMarkerNavigationInfo": "Цвет информационного сообщения в мини-приложении навигации по меткам редактора.", + "editorMarkerNavigationBackground": "Фон мини-приложения навигации по меткам редактора." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/rus/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..61fdcdb90de9 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Показать при наведении" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/rus/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..afb4cd39d722 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Идет загрузка..." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/rus/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..49cfabc01487 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Заменить предыдущим значением", + "InPlaceReplaceAction.next.label": "Заменить следующим значением" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..6f61e0491566 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Преобразовать отступ в пробелы", + "indentationToTabs": "Преобразовать отступ в шаги табуляции", + "configuredTabSize": "Настроенный размер шага табуляции", + "selectTabWidth": "Выбрать размер шага табуляции для текущего файла", + "indentUsingTabs": "Отступ с использованием табуляции", + "indentUsingSpaces": "Отступ с использованием пробелов", + "detectIndentation": "Определение отступа от содержимого", + "editor.reindentlines": "Повторно расставить отступы строк" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/rus/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..26b632bbca28 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Копировать строку сверху", + "lines.copyDown": "Копировать строку снизу", + "lines.moveUp": "Переместить строку вверх", + "lines.moveDown": "Переместить строку вниз", + "lines.sortAscending": "Сортировка строк по возрастанию", + "lines.sortDescending": "Сортировка строк по убыванию", + "lines.trimTrailingWhitespace": "Удалить конечные символы-разделители", + "lines.delete": "Удалить строку", + "lines.indent": "Увеличить отступ", + "lines.outdent": "Уменьшить отступ", + "lines.insertBefore": "Вставить строку выше", + "lines.insertAfter": "Вставить строку ниже", + "lines.deleteAllLeft": "Удалить все слева", + "lines.deleteAllRight": "Удалить все справа", + "lines.joinLines": "_Объединить строки", + "editor.transpose": "Транспонировать символы вокруг курсора", + "editor.transformToUppercase": "Преобразовать в верхний регистр", + "editor.transformToLowercase": "Преобразовать в нижний регистр" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/links/links.i18n.json b/i18n/rus/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..0e2b04db3734 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Щелкните с нажатой клавишей Cmd, чтобы перейти по ссылке", + "links.navigate": "Щелкните с нажатой клавишей Ctrl, чтобы перейти по ссылке", + "links.command.mac": "Для выполнения команды щелкните ее, удерживая нажатой клавишу CMD", + "links.command": "Для выполнения команды щелкните ее, удерживая нажатой клавишу CTRL", + "links.navigate.al": "Щелкните с нажатой клавишей ALT, чтобы перейти по ссылке.", + "links.command.al": "Для выполнения команды щелкните ее, удерживая нажатой клавишу ALT", + "invalid.url": "Не удалось открыть ссылку, так как она имеет неправильный формат: {0}", + "missing.url": "Не удалось открыть ссылку, у нее отсутствует целевой объект.", + "label": "Открыть ссылку" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/rus/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..660193a943e6 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Добавить курсор выше", + "mutlicursor.insertBelow": "Добавить курсор ниже", + "mutlicursor.insertAtEndOfEachLineSelected": "Добавить курсоры к окончаниям строк", + "addSelectionToNextFindMatch": "Добавить выделение в следующее найденное совпадение", + "addSelectionToPreviousFindMatch": "Добавить выделенный фрагмент в предыдущее найденное совпадение", + "moveSelectionToNextFindMatch": "Переместить последнее выделение в следующее найденное совпадение", + "moveSelectionToPreviousFindMatch": "Переместить последний выделенный фрагмент в предыдущее найденное совпадение", + "selectAllOccurrencesOfFindMatch": "Выбрать все вхождения найденных совпадений", + "changeAll.label": "Изменить все вхождения" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/rus/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..cd5e78cf6b80 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Переключить подсказки к параметрам" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..c4092de0c2f1 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, подсказка" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/rus/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..f12b3174d4c1 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Показать исправления ({0})", + "quickFix": "Показать исправления", + "quickfix.trigger.label": "Быстрое исправление" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..6f6dde161df8 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Закрыть" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/rus/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..32ab4f7dea8b --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": " — ссылки {0}", + "references.action.label": "Найти все ссылки" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..bc424e9b7e3e --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Идет загрузка..." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..88bbf8539040 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "ссылка в {0} в строке {1} и символе {2}", + "aria.fileReferences.1": "1 символ в {0}, полный путь: {1}", + "aria.fileReferences.N": "{0} символов в {1}, полный путь: {2} ", + "aria.result.0": "Результаты не найдены", + "aria.result.1": "Обнаружен 1 символ в {0}", + "aria.result.n1": "Обнаружено {0} символов в {1}", + "aria.result.nm": "Обнаружено {0} символов в {1} файлах" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..9b523c27fc1c --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Не удалось разрешить файл.", + "referencesCount": "Ссылок: {0}", + "referenceCount": "{0} ссылка", + "missingPreviewMessage": "предварительный просмотр недоступен", + "treeAriaLabel": "Ссылки", + "noResults": "Результаты отсутствуют", + "peekView.alternateTitle": "Ссылки", + "peekViewTitleBackground": "Цвет фона области заголовка быстрого редактора.", + "peekViewTitleForeground": "Цвет заголовка быстрого редактора.", + "peekViewTitleInfoForeground": "Цвет сведений о заголовке быстрого редактора.", + "peekViewBorder": "Цвет границ быстрого редактора и массива.", + "peekViewResultsBackground": "Цвет фона в списке результатов представления быстрого редактора.", + "peekViewResultsMatchForeground": "Цвет переднего плана узлов строки в списке результатов быстрого редактора.", + "peekViewResultsFileForeground": "Цвет переднего плана узлов файла в списке результатов быстрого редактора.", + "peekViewResultsSelectionBackground": "Цвет фона выбранной записи в списке результатов быстрого редактора.", + "peekViewResultsSelectionForeground": "Цвет переднего плана выбранной записи в списке результатов быстрого редактора.", + "peekViewEditorBackground": "Цвет фона быстрого редактора.", + "peekViewEditorGutterBackground": "Цвет фона поля в окне быстрого редактора.", + "peekViewResultsMatchHighlight": "Цвет выделения совпадений в списке результатов быстрого редактора.", + "peekViewEditorMatchHighlight": "Цвет выделения совпадений в быстром редакторе." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/rus/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..10cdfc7238dc --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Результаты отсутствуют.", + "aria": "«{0}» успешно переименован в «{1}». Сводка: {2}", + "rename.failed": "Не удалось переименовать.", + "rename.label": "Переименовать символ" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/rus/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..8d52949bcbbe --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Введите новое имя для входных данных и нажмите клавишу ВВОД для подтверждения." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/rus/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..937d51a9e11c --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Развернуть выделение", + "smartSelect.shrink": "Сжать выделение" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/rus/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..b93db54e42c9 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "При принятии \"{0}\" был добавлен следующий текст: \"{1}\"", + "suggest.trigger.label": "Переключить предложение" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..ef1bb257b470 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Цвет фона виджета подсказок.", + "editorSuggestWidgetBorder": "Цвет границ виджета подсказок.", + "editorSuggestWidgetForeground": "Цвет переднего плана мини-приложения предложений.", + "editorSuggestWidgetSelectedBackground": "Фоновый цвет выбранной записи в мини-приложении предложений.", + "editorSuggestWidgetHighlightForeground": "Цвет выделения соответствия в мини-приложении предложений.", + "readMore": "Подробнее...{0}", + "suggestionWithDetailsAriaLabel": "{0}, предложение, содержит данные", + "suggestionAriaLabel": "{0}, предложение", + "readLess": "Кратко...{0}", + "suggestWidget.loading": "Идет загрузка...", + "suggestWidget.noSuggestions": "Предложения отсутствуют.", + "suggestionAriaAccepted": "{0}, принято", + "ariaCurrentSuggestionWithDetails": "{0}, предложение, содержит данные", + "ariaCurrentSuggestion": "{0}, предложение" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/rus/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..f9af35190193 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Переключение клавиши TAB перемещает фокус." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..ab058cc24db7 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Цвет фона символа при доступе на чтение, например считывании переменной.", + "wordHighlightStrong": "Цвет фона символа при доступе на запись, например записи переменной.", + "overviewRulerWordHighlightForeground": "Цвет метки линейки в окне просмотра для выделений символов.", + "overviewRulerWordHighlightStrongForeground": "Цвет метки линейки в окне просмотра для выделений символов, доступных для записи. ", + "wordHighlight.next.label": "Перейти к следующему выделению символов", + "wordHighlight.previous.label": "Перейти к предыдущему выделению символов" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/rus/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index a06745572517..8b6ad71cd4e6 100644 --- a/i18n/rus/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/rus/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -3,7 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "notFound": "Расширение не найдено", - "noCompatible": "Не удалось найти версию {0}, совместимую с этой версией кода." -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 16024062ff71..44292b6a1ded 100644 --- a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,10 @@ { "invalidManifest": "Недопустимое расширение: package.json не является файлом JSON.", "restartCodeLocal": "Перезапустите код перед переустановкой {0}.", - "restartCodeGallery": "Перезапустите Code перед повторной установкой.", + "cancel": "Отмена", "uninstallDependeciesConfirmation": "Вы хотите удалить \"{0}\" отдельно или вместе с зависимостями?", "uninstallOnly": "Только", "uninstallAll": "Все", - "cancel": "Отмена", "uninstallConfirmation": "Вы действительно хотите удалить \"{0}\"?", "ok": "ОК", "singleDependentError": "Не удается удалить расширение \"{0}\". От него зависит расширение \"{1}\".", diff --git a/i18n/rus/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/rus/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..305c47b7195c --- /dev/null +++ b/i18n/rus/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "view": "Просмотр" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 86a745f5204d..4dba80c961de 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Открыть предыдущий редактор", "nextEditorInGroup": "Открыть следующий редактор в группе", "openPreviousEditorInGroup": "Открыть предыдущий редактор в группе", + "lastEditorInGroup": "Открыть последний редактор в группе", "navigateNext": "Далее", "navigatePrevious": "Назад", "navigateLast": "Перейти к последнему", diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index c2081565e8fe..769c14c870b0 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,6 @@ { "editorCommand.activeEditorMove.description": "Перемещение активного редактора по вкладкам или группам", "editorCommand.activeEditorMove.arg.name": "Аргумент перемещения активного редактора", - "editorCommand.activeEditorMove.arg.description": "Свойства аргумента:\n\t\t\t\t\t\t* 'to': строковое значение, указывающее направление перемещения.\n\t\t\t\t\t\t* 'by': строковое значение, указывающее единицу перемещения (вкладка или группа).\n\t\t\t\t\t\t* 'value': числовое значение, указывающее количество позиций перемещения или абсолютную позицию, на которую необходимо переместить.\n\t\t\t\t\t", "commandDeprecated": "Команда **{0}** удалена. Вместо нее можно использовать **{1}**", "openKeybindings": "Настройка сочетаний клавиш" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index c38e7f9a12a3..b72594a677cd 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -52,6 +52,5 @@ "screenReaderDetectedExplanation.question": "Вы используете средство чтения с экрана в VS Code?", "screenReaderDetectedExplanation.answerYes": "Да", "screenReaderDetectedExplanation.answerNo": "Нет", - "screenReaderDetectedExplanation.body1": "Теперь среда VS Code оптимизирована для средства чтения с экрана.", - "screenReaderDetectedExplanation.body2": "Некоторые функции редактора (например, перенос слов, сворачивание, автоматическая вставка закрывающих скобок и т.д.) будут работать по-другому." + "screenReaderDetectedExplanation.body1": "Теперь среда VS Code оптимизирована для средства чтения с экрана." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/quickopen.i18n.json b/i18n/rus/src/vs/workbench/browser/quickopen.i18n.json index b1992b59c50f..2ef796eee29e 100644 --- a/i18n/rus/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "Нет соответствующих результатов", - "noResultsFound2": "Результаты не найдены", - "entryAriaLabel": "{0}, команда" + "noResultsFound2": "Результаты не найдены" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json index be259940bc0d..0af36ba16b24 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Открыть последние...", "quickOpenRecent": "Быстро открыть последние...", "closeMessages": "Закрыть уведомления", - "reportIssues": "Сообщить о проблемах", + "reportIssueInEnglish": "Сообщить об ошибке", "reportPerformanceIssue": "Сообщать о проблемах производительности", "keybindingsReference": "Справочник по сочетаниям клавиш", "openDocumentationUrl": "Документация", @@ -47,5 +47,14 @@ "showNextWindowTab": "Показать следующую вкладку в окне", "moveWindowTabToNewWindow": "Переместить вкладку окна в новое окно", "mergeAllWindowTabs": "Объединить все окна", - "toggleWindowTabsBar": "Переключить панель вкладок окна" + "toggleWindowTabsBar": "Переключить панель вкладок окна", + "configureLocale": "Настроить язык", + "displayLanguage": "Определяет язык интерфейса VSCode.", + "doc": "Список поддерживаемых языков см. в {0}.", + "restart": "Для изменения значения требуется перезапуск VSCode.", + "fail.createSettings": "Невозможно создать \"{0}\" ({1}).", + "debug": "Отладка", + "info": "Сведения", + "warn": "Предупреждение", + "err": "Ошибка" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json index 62c0bd218133..fc3f719ff282 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Просмотреть", "help": "Справка", "file": "Файл", - "workspaces": "Рабочие области", "developer": "Разработчик", + "workspaces": "Рабочие области", "showEditorTabs": "Определяет, должны ли открытые редакторы отображаться на вкладках или нет.", "workbench.editor.labelFormat.default": "Отображать имя файла. Если вкладки включены и в одной группе есть два файла с одинаковыми именами, то к имени каждого из этих файлов будут добавлены различающиеся части пути. Если вкладки отключены, то для активного редактора отображается путь по отношению к папке рабочей области.", "workbench.editor.labelFormat.short": "Отображать имя файла и имя каталога.", @@ -26,18 +26,16 @@ "closeOnFocusLost": "Управляет автоматическим закрытием Quick Open при потере фокуса.", "openDefaultSettings": "Управляет открытием редактора с отображением всех настроек по умолчанию при открытии настроек.", "sideBarLocation": "Определяет расположение боковой панели: слева или справа от рабочего места.", - "panelLocation": "Определяет расположение панели: снизу или справа от рабочего места.", "statusBarVisibility": "Управляет видимостью строки состояния в нижней части рабочего места.", "activityBarVisibility": "Управляет видимостью панели действий на рабочем месте.", "closeOnFileDelete": "Определяет, следует ли автоматически закрывать редакторы, когда отображаемый в них файл удален или переименован другим процессом. При отключении этой функции редактор остается открытым в качестве черновика. Обратите внимание, что при удалении из приложения редактор закрывается всегда и что файлы черновиков никогда не закрываются для сохранения данных.", - "experimentalFuzzySearchEndpoint": "Указывает конечную точку, которая будет использоваться для поиска с экспериментальными параметрами.", - "experimentalFuzzySearchKey": "Указывает ключ, используемый для поиска с экспериментальными параметрами.", "fontAliasing": "Управляет методом сглаживания шрифтов в рабочей области.-по умолчанию: субпиксельное сглаживание шрифтов; позволит добиться максимальной четкости текста на большинстве дисплеев за исключением Retina - сглаживание: сглаживание шрифтов на уровне пикселей, в отличие от субпиксельного сглаживания; позволит сделать шрифт более светлым в целом - нет: сглаживание шрифтов отключено; текст будет отображаться с неровными острыми краями ", "workbench.fontAliasing.default": "Субпиксельное сглаживание шрифтов; позволит добиться максимальной четкости текста на большинстве дисплеев за исключением Retina.", "workbench.fontAliasing.antialiased": "Сглаживание шрифтов на уровне пикселей, в отличие от субпиксельного сглаживания. Может сделать шрифт светлее в целом.", "workbench.fontAliasing.none": "Отключает сглаживание шрифтов; текст будет отображаться с неровными острыми краями.", "swipeToNavigate": "Переключайтесь между открытыми файлами, проводя по экрану по горизонтали тремя пальцами.", "workbenchConfigurationTitle": "Workbench", + "windowConfigurationTitle": "Окно", "window.openFilesInNewWindow.on": "Файлы будут открываться в новом окне.", "window.openFilesInNewWindow.off": "Файлы будут открываться в окне с открытой папкой файлов или последнем активном окне.", "window.openFilesInNewWindow.default": "Файлы будут открываться в окне с открытой папкой файлов или последнем активном окне, если они не открываются из панели Dock или системы поиска (только macOS).", @@ -69,11 +67,11 @@ "autoDetectHighContrast": "Если включено, будет выполняться автоматический переход к высококонтрастной теме, если в Windows используется тема высокой контрастности, или к темной теме при выходе из темы высокой контрастности Windows.", "titleBarStyle": "Настройка внешнего вида заголовка окна. Чтобы применить изменения, потребуется полный перезапуск.", "window.nativeTabs": "Включает вкладки окна macOS Sierra. Обратите внимание, что для применения этих изменений потребуется полная перезагрузка, и что для всех внутренних вкладок будет отключен пользовательский стиль заголовка, если он был настроен.", - "windowConfigurationTitle": "Окно", "zenModeConfigurationTitle": "Режим Zen", "zenMode.fullScreen": "Определяет, будет ли переключение в режим Zen переключать рабочее пространство в полноэкранный режим.", "zenMode.hideTabs": "Определяет, будет ли включение режима Zen также скрывать вкладки рабочего места.", "zenMode.hideStatusBar": "Определяет, будет ли включение режима Zen также скрывать строку состояния в нижней части рабочего места.", "zenMode.hideActivityBar": "Определяет, будет ли при включении режима Zen скрыта панель действий в левой части рабочей области.", - "zenMode.restore": "Определяет, должно ли окно восстанавливаться в режиме Zen, если закрылось в режиме Zen." + "zenMode.restore": "Определяет, должно ли окно восстанавливаться в режиме Zen, если закрылось в режиме Zen.", + "JsonSchema.locale": "Язык пользовательского интерфейса." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index fca987ec8032..1378489d2760 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Отключить точки останова", "reapplyAllBreakpoints": "Повторно применить все точки останова", "addFunctionBreakpoint": "Добавить точку останова в функции", - "renameFunctionBreakpoint": "Переименовать точку останова в функции", "addConditionalBreakpoint": "Добавить условную точку останова…", "editConditionalBreakpoint": "Изменить точку останова…", "setValue": "Задать значение", diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..9d0545aa3087 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Изменить точку останова…", + "functionBreakpointsNotSupported": "Точки останова функций не поддерживаются в этом типе отладки", + "functionBreakpointPlaceholder": "Функция, в которой производится останов", + "functionBreakPointInputAriaLabel": "Введите точку останова в функции" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..4cec9f05c1ed --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Раздел стека вызовов", + "debugStopped": "Приостановлено на {0}", + "callStackAriaLabel": "Отладка стека вызовов", + "process": "Процесс", + "paused": "Приостановлено", + "running": "Работает", + "thread": "Поток", + "pausedOn": "Приостановлено на {0}", + "loadMoreStackFrames": "Загрузить больше кадров стека", + "threadAriaLabel": "Поток {0}, стек вызовов, отладка", + "stackFrameAriaLabel": "Кадр стека {0}, строка {1} {2}, стек вызовов, отладка" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index cae64165643d..1f995f9f60b2 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,6 @@ "breakpointAdded": "Добавлена точка останова: строка {0}, файл {1}", "breakpointRemoved": "Удалена точка останова: строка {0}, файл {1}", "compoundMustHaveConfigurations": "Для составного элемента должен быть задан атрибут configurations для запуска нескольких конфигураций.", - "configMissing": "Конфигурация \"{0}\" отсутствует в launch.json.", "debugRequestNotSupported": "Атрибут '{0}' имеет неподдерживаемое значение '{1}' в выбранной конфигурации отладки.", "debugRequesMissing": "В выбранной конфигурации отладки отсутствует атрибут '{0}'.", "debugTypeNotSupported": "Настроенный тип отладки \"{0}\" не поддерживается.", diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..3eb2647fe990 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Раздел переменных", + "variablesAriaTreeLabel": "Отладка переменных", + "variableValueAriaLabel": "Введите новое значение переменной", + "variableScopeAriaLabel": "Область {0}, переменные, отладка", + "variableAriaLabel": "{0} значение {1}, переменные, отладка" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..10eba1355551 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "Раздел выражений", + "watchAriaTreeLabel": "Отладка выражений контрольных значений", + "watchExpressionPlaceholder": "Выражение с контрольным значением", + "watchExpressionInputAriaLabel": "Введите выражение контрольного значения", + "watchExpressionAriaLabel": "{0} значение {1}, контрольное значение, отладка", + "watchVariableAriaLabel": "{0} значение {1}, контрольное значение, отладка" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 18a5d06c06b4..c0c171b628c2 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Идет удаление", "updateAction": "Обновить", "updateTo": "Обновить до {0}", - "enableForWorkspaceAction.label": "Включить (рабочая область)", - "enableAlwaysAction.label": "Включать (всегда)", - "disableForWorkspaceAction.label": "Отключить (рабочая область)", - "disableAlwaysAction.label": "Отключать (всегда)", "ManageExtensionAction.uninstallingTooltip": "Идет удаление", - "enableForWorkspaceAction": "Рабочая область", - "enableGloballyAction": "Всегда", + "enableForWorkspaceAction": "Включить (рабочая область)", + "enableGloballyAction": "Включить", "enableAction": "Включить", - "disableForWorkspaceAction": "Рабочая область", - "disableGloballyAction": "Всегда", + "disableForWorkspaceAction": "Отключить (рабочая область)", + "disableGloballyAction": "Отключить", "disableAction": "Отключить", "checkForUpdates": "Проверка обновлений", "enableAutoUpdate": "Включить автоматическое обновление расширений", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Все рекомендуемые расширения для этой рабочей области уже установлены", "installRecommendedExtension": "Установить рекомендуемое расширение", "extensionInstalled": "Рекомендуемое расширение уже установлено", - "showRecommendedKeymapExtensions": "Показать рекомендуемые раскладки клавиатуры", "showRecommendedKeymapExtensionsShort": "Раскладки клавиатуры", - "showLanguageExtensions": "Показать расширения языка", "showLanguageExtensionsShort": "Расширения языка", - "showAzureExtensions": "Показать расширения Azure", "showAzureExtensionsShort": "Расширения Azure", "OpenExtensionsFile.failed": "Не удается создать файл \"extensions.json\" в папке \".vscode\" ({0}).", "configureWorkspaceRecommendedExtensions": "Настроить рекомендуемые расширения (рабочая область)", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index 957fb1a214bb..ecf997900518 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -9,7 +9,7 @@ "extension": "Расширение", "extensions": "Расширения", "view": "Просмотреть", + "developer": "Разработчик", "extensionsConfigurationTitle": "Расширения", - "extensionsAutoUpdate": "Автоматически обновлять расширения", - "extensionsIgnoreRecommendations": "Игнорировать рекомендации по расширениям" + "extensionsAutoUpdate": "Автоматически обновлять расширения" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..d813ae7a27e2 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reportExtensionIssue": "Сообщить об ошибке" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..a01d559fbf10 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Папки" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..821930bfc879 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Файл", + "revealInSideBar": "Показать в боковой панели", + "acceptLocalChanges": "Использовать изменения и перезаписать содержимое диска", + "revertLocalChanges": "Отменить изменения и вернуться к содержимому на диске" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..c601c781bde1 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,72 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Повторить попытку", + "rename": "Переименовать", + "newFile": "Создать файл", + "newFolder": "Создать папку", + "openFolderFirst": "Сначала откройте папку, в которой будут созданы файлы и папки.", + "newUntitledFile": "Новый файл без имени", + "createNewFile": "Создать файл", + "createNewFolder": "Создать папку", + "deleteButtonLabelRecycleBin": "&&Переместить в корзину", + "deleteButtonLabelTrash": "&&Переместить в удаленные", + "deleteButtonLabel": "&&Удалить", + "dirtyMessageFolderOneDelete": "Вы удаляете папку с несохраненными изменениями в одном файле. Вы хотите продолжить?", + "dirtyMessageFolderDelete": "Вы удаляете папку с несохраненными изменениями в нескольких файлах ({0}). Вы хотите продолжить?", + "dirtyMessageFileDelete": "Вы удаляете файл с несохраненными изменениями. Вы хотите продолжить?", + "dirtyWarning": "Если не сохранить изменения, они будут утеряны.", + "confirmMoveTrashMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое?", + "confirmMoveTrashMessageFile": "Вы действительно хотите удалить \"{0}\"?", + "undoBin": "Вы можете выполнить восстановление из корзины.", + "undoTrash": "Вы можете выполнить восстановление из корзины.", + "doNotAskAgain": "Больше не спрашивать", + "confirmDeleteMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое без возможности восстановления?", + "confirmDeleteMessageFile": "Вы действительно хотите удалить \"{0}\" без возможности восстановления?", + "irreversible": "Это действие необратимо.", + "permDelete": "Удалить навсегда", + "delete": "Удалить", + "importFiles": "Импорт файлов", + "confirmOverwrite": "Файл или папка с таким именем уже существует в конечной папке. Заменить их?", + "replaceButtonLabel": "Заменить", + "copyFile": "Копировать", + "pasteFile": "Вставить", + "duplicateFile": "Дублировать", + "openToSide": "Открыть сбоку", + "compareSource": "Выбрать для сравнения", + "globalCompareFile": "Сравнить активный файл с...", + "openFileToCompare": "Чтобы сравнить файл с другим файлом, сначала откройте его.", + "compareWith": "Сравнить '{0}' с '{1}'", + "compareFiles": "Сравнить файлы", + "refresh": "Обновить", + "save": "Сохранить", + "saveAs": "Сохранить как...", + "saveAll": "Сохранить все", + "saveAllInGroup": "Сохранить все в группе", + "revert": "Отменить изменения в файле", + "focusOpenEditors": "Фокус на представлении открытых редакторов", + "focusFilesExplorer": "Фокус на проводнике", + "showInExplorer": "Показать активный файл в боковой панели", + "openFileToShow": "Сначала откройте файл для отображения в обозревателе.", + "collapseExplorerFolders": "Свернуть папки в проводнике", + "refreshExplorer": "Обновить окно проводника", + "openFileInNewWindow": "Открыть активный файл в новом окне", + "openFileToShowInNewWindow": "Чтобы открыть файл в новом окне, сначала откройте его.", + "revealInWindows": "Отобразить в проводнике", + "revealInMac": "Отобразить в Finder", + "openContainer": "Открыть содержащую папку", + "revealActiveFileInWindows": "Отобразить активный файл в проводнике", + "revealActiveFileInMac": "Отобразить активный файл в Finder", + "openActiveFileContainer": "Открыть папку, содержащую активный файл", + "copyPath": "Скопировать путь", + "copyPathOfActive": "Копировать путь к активному файлу", + "emptyFileNameError": "Необходимо указать имя файла или папки.", + "fileNameExistsError": "Файл или папка **{0}** уже существует в данном расположении. Выберите другое имя.", + "invalidFileNameError": "Имя **{0}** недопустимо для файла или папки. Выберите другое имя.", + "filePathTooLongError": "Из-за использования имени **{0}** путь слишком длинный. Выберите более короткое имя.", + "compareWithSaved": "Сравнить активный файл с сохраненным", + "modifiedLabel": "{0} (на диске) ↔ {1}" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..f51fb88b34b0 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Чтобы скопировать путь к файлу, сначала откройте его", + "openFileToReveal": "Чтобы отобразить файл, сначала откройте его" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..d0ffe58b0f9e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Показать проводник", + "explore": "Проводник", + "view": "Просмотр", + "textFileEditor": "Редактор текстовых файлов", + "binaryFileEditor": "Редактор двоичных файлов", + "filesConfigurationTitle": "Файлы", + "exclude": "Настройте стандартные маски для исключения файлов и папок. Этот параметр влияет, например, на скрытые и отображаемые файлы в проводнике.", + "files.exclude.boolean": "Стандартная маска, соответствующая путям к файлам. Задайте значение true или false, чтобы включить или отключить маску.", + "files.exclude.when": "Дополнительная проверка элементов того же уровня соответствующего файла. Используйте $(basename) в качестве переменной для соответствующего имени файла.", + "associations": "Настройте сопоставления файлов с языками (например, \"*.extension\": \"html\"). У них будет приоритет перед заданными по умолчанию сопоставлениями установленных языков.", + "encoding": "Кодировка по умолчанию, используемая при чтении и записи файлов. Этот параметр также можно настроить для отдельных языков.", + "autoGuessEncoding": "Если этот параметр установлен, то при открытии файла будет предпринята попытка определить кодировку символов. Этот параметр также можно настроить для отдельных языков.", + "eol": "Символ конца строки по умолчанию. Используйте \\n для LF и \\r\\n для CRLF.", + "trimTrailingWhitespace": "Если этот параметр включен, при сохранении файла будут удалены концевые пробелы.", + "insertFinalNewline": "Если этот параметр включен, при сохранении файла в его конец вставляется финальная новая строка.", + "trimFinalNewlines": "Если этот параметр установлен, то при сохранении файла будут удалены все новые строки за последней новой строкой в конце файла.", + "files.autoSave.off": "\"Грязный\" файл не сохраняется автоматически.", + "files.autoSave.afterDelay": "\"Грязный\" файл автоматически сохраняется по истечении срока \"files.autoSaveDelay\".", + "files.autoSave.onFocusChange": "\"Грязный\" файл автоматически сохраняется при потере фокуса редактором.", + "files.autoSave.onWindowChange": "\"Грязный\" файл автоматически сохраняется при потере фокуса окном.", + "autoSave": "Управляет автоматическим сохранением \"грязных\" файлов. Допустимые значения: \"{0}\", \"{1}\", \"{2}\" (редактор теряет фокус) и \"{3}\" (окно теряет фокус). Если задано значение \"{4}\", можно настроить задержку в \"files.autoSaveDelay\".", + "autoSaveDelay": "Определяет задержку в мс, после которой измененный файл сохраняется автоматически. Действует, только если параметр \"files.autoSave\" имеет значение \"{0}\".", + "watcherExclude": "Настройте стандартные маски путей файлов, которые следует исключить из списка отслеживаемых файлов. Пути должны соответствовать полным путям (т.е. для правильного сопоставления необходимо указывать ** в начале неполного пути или указывать полные пути). После изменения этого параметра потребуется перезагрузка. Если отображается сообщение \"Код потребляет большое количество процессорного времени при запуске\" можно исключить большие папки, чтобы уменьшить начальную нагрузку.", + "hotExit.off": "Отключите \"горячий\" выход.", + "hotExit.onExit": "Функция \"горячий выход\" будет активирована при закрытии приложения, то есть при закрытии последнего окна в Windows или Linux или при активации команды workbench.action.quit (палитра команд, настраиваемое сочетание клавиш, меню). Все окна с резервными копиями будут восстановлены при следующем запуске.", + "hotExit.onExitAndWindowClose": "Функция \"горячий выход\" будет активирована при закрытии приложения, то есть при закрытии последнего окна в Windows или Linux или при активации команды workbench.action.quit (с помощью палитры команд, настраиваемого сочетания клавиш или пункта меню), а также для любых окон с открытыми папками независимо от того, является ли это окно последним. Все окна без открытых папок будут восстановлены при следующем запуске. Чтобы восстановить исходное состояние окон с папками, установите параметр \"window.restoreWindows\" в значение \"all\".", + "hotExit": "Определяет, запоминаются ли несохраненные файлы между сеансами. В этом случае приглашение на их сохранение при выходе из редактора не появляется.", + "useExperimentalFileWatcher": "Использовать новое экспериментальное средство наблюдения за файлами.", + "defaultLanguage": "Режим языка по умолчанию, который назначается новым файлам.", + "editorConfigurationTitle": "Редактор", + "formatOnSave": "Форматирование файла при сохранении. Модуль форматирования должен быть доступен, файл не должен сохраняться автоматически, а работа редактора не должна завершаться.", + "explorerConfigurationTitle": "Проводник", + "openEditorsVisible": "Число редакторов, отображаемых на панели открытых редакторов. Задайте значение 0, чтобы скрыть панель.", + "dynamicHeight": "Определяет, будет ли высота раздела открытых редакторов динамически адаптироваться к количеству элементов.", + "autoReveal": "Определяет, будет ли проводник автоматически отображать и выбирать файлы при их открытии.", + "enableDragAndDrop": "Определяет, разрешено ли перемещение файлов и папок перетаскиванием в проводнике.", + "confirmDragAndDrop": "Определяет, должно ли запрашиваться подтверждение при перемещении файлов и папок в проводнике.", + "confirmDelete": "Определяет, должно ли запрашиваться подтверждение при удалении файла в корзину.", + "sortOrder.default": "Файлы и папки сортируются по именам в алфавитном порядке. Папки отображаются перед файлами.", + "sortOrder.mixed": "Файлы и папки сортируются по именам в алфавитном порядке. Файлы чередуются с папками.", + "sortOrder.filesFirst": "Файлы и папки сортируются по именам в алфавитном порядке. Файлы отображаются перед папками. ", + "sortOrder.type": "Файлы и папки сортируются по расширениям в алфавитном порядке. Папки отображаются перед файлами.", + "sortOrder.modified": "Файлы и папки сортируются по дате последнего изменения в порядке убывания. Папки отображаются перед файлами.", + "sortOrder": "Управляет порядком сортировки файлов и папок в проводнике. Наряду с сортировкой по умолчанию можно установить следующие варианты сортировки: 'mixed' (файлы и папки сортируются вместе), 'type' (по типу файла), 'modified' (по дате последнего изменения) и 'filesFirst' (сортировать файлы перед папками).", + "explorer.decorations.colors": "Определяет, следует ли использовать цвета в декораторах файла.", + "explorer.decorations.badges": "Определяет, следует ли использовать эмблемы в декораторах файла. " +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..d5622eec39a1 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Используйте команды на панели инструментов редактора справа для **отмены** изменений или **перезаписи** содержимого на диске с учетом этих изменений", + "discard": "Отмена", + "overwrite": "Перезаписать", + "retry": "Повторить попытку", + "readonlySaveError": "Не удалось сохранить \"{0}\": файл защищен от записи. Чтобы снять защиту, нажмите \"Перезаписать\".", + "genericSaveError": "Не удалось сохранить \"{0}\": {1}", + "staleSaveError": "Не удалось сохранить \"{0}\": содержимое на диске более новое. Чтобы сравнить свою версию с версией на диске, нажмите **Сравнить**.", + "compareChanges": "Сравнить", + "saveConflictDiffLabel": "{0} (на диске) ↔ {1} (в {2}) - Разрешить конфликт сохранения" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..5c9b67b26690 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Нет открытой папки", + "explorerSection": "Раздел проводника", + "noFolderHelp": "Вы еще не открыли папку.", + "openFolder": "Открыть папку" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..3a4c179faa05 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Проводник", + "canNotResolve": "Не удается разрешить папку рабочей области" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..d89fe12ed35a --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Раздел проводника", + "treeAriaLabel": "Проводник" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..620852a6f180 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Введите имя файла. Нажмите клавишу ВВОД, чтобы подтвердить введенные данные, или ESCAPE для отмены.", + "filesExplorerViewerAriaLabel": "{0}, Проводник", + "addFolders": "&&Добавить папки", + "addFolder": "&&Добавить папку", + "confirmMove": "Вы действительно хотите переместить '{0}'?", + "doNotAskAgain": "Больше не спрашивать", + "moveButtonLabel": "&&Переместить", + "confirmOverwriteMessage": "{0} уже существует в целевой папке. Заменить его?", + "irreversible": "Это действие необратимо.", + "replaceButtonLabel": "Заменить" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..ecfb243efe9b --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Открытые редакторы", + "openEditosrSection": "Раздел открытых редакторов", + "dirtyCounter": "Не сохранено: {0}", + "saveAll": "Сохранить все", + "closeAllUnmodified": "Закрыть без изменений", + "closeAll": "Закрыть все", + "compareWithSaved": "Сравнить с сохраненным", + "close": "Закрыть", + "closeOthers": "Закрыть другие" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..863c0a79ec87 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, группа редакторов", + "openEditorAriaLabel": "{0}, открытый редактор", + "saveAll": "Сохранить все", + "closeAllUnmodified": "Закрыть без изменений", + "closeAll": "Закрыть все", + "compareWithSaved": "Сравнить с сохраненным", + "close": "Закрыть", + "closeOthers": "Закрыть другие" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/rus/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/rus/src/vs/workbench/parts/markers/common/messages.i18n.json index df6b024772e0..2729294f21e4 100644 --- a/i18n/rus/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,6 @@ { "viewCategory": "Просмотреть", "problems.view.toggle.label": "Показать/скрыть проблемы", - "problems.view.show.label": "Показать проблемы", - "problems.view.hide.label": "Скрыть проблемы", "problems.panel.configuration.title": "Представление \"Проблемы\"", "problems.panel.configuration.autoreveal": "Определяет, следует ли представлению \"Проблемы\" отображать файлы при их открытии", "markers.panel.title.problems": "Проблемы", diff --git a/i18n/rus/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/rus/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..e53e26469eab --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "Профили успешно созданы.", + "prof.detail": "Создайте проблему и вручную вложите следующие файлы:\n{0}", + "prof.restartAndFileIssue": "Создать проблему и выполнить перезапуск", + "prof.restart": "Перезапустить", + "prof.thanks": "Спасибо за помощь.", + "prof.detail.restart": "Для продолжения работы с '{0}' необходимо еще раз перезагрузить систему. Благодарим вас за участие." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 134c08226bb6..209030a10b23 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "Нажмите нужное сочетание клавиш, а затем — ВВОД. Нажмите клавишу ESC для отмены.", "defineKeybinding.chordsTo": "Аккорд для" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 4338bc61e7b6..e686b8d481f0 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "Изменить настраиваемое сочетание клавиш", "addKeybindingLabelWithKey": "Добавить настраиваемое сочетание клавиш {0}", "addKeybindingLabel": "Добавить настраиваемое сочетание клавиш", + "title": "{0} ({1})", "commandAriaLabel": "Команда: {0}.", "keybindingAriaLabel": "Настраиваемое сочетание клавиш: {0}.", "noKeybinding": "Нет назначенных настраиваемых сочетаний клавиш.", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index de15465f5cd7..329b7f8c4b74 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Параметры по умолчанию", "SearchSettingsWidget.AriaLabel": "Параметры поиска", "SearchSettingsWidget.Placeholder": "Параметры поиска", - "totalSettingsMessage": "Всего параметров: {0}", "noSettingsFound": "Нет результатов", "oneSettingFound": "Один соответствующий параметр", "settingsFound": "Соответствующих параметров: {0}", - "fileEditorWithInputAriaLabel": "{0}. Редактор текстовых файлов.", - "fileEditorAriaLabel": "Редактор текстовых файлов.", + "totalSettingsMessage": "Всего параметров: {0}", + "defaultSettings": "Параметры по умолчанию", + "defaultFolderSettings": "Параметры папок по умолчанию", "defaultEditorReadonly": "Редактировать в правой области редактора, чтобы переопределить значения по умолчанию.", "preferencesAriaLabel": "Параметры по умолчанию. Текстовый редактор только для чтения." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 140a93428bcf..32f4adc90d90 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Укажите параметры здесь, чтобы перезаписать параметры по умолчанию.", "emptyWorkspaceSettingsHeader": "Укажите параметры здесь, чтобы перезаписать параметры пользователей.", "emptyFolderSettingsHeader": "Укажите параметры папок здесь, чтобы перезаписать параметры рабочих областей.", - "defaultFolderSettingsTitle": "Параметры папок по умолчанию", - "defaultSettingsTitle": "Параметры по умолчанию", "editTtile": "Изменить", "replaceDefaultValue": "Заменить в параметрах", "copyDefaultValue": "Копировать в параметры", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index 46adf092d084..ef7dc4d87836 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Попробуйте нечеткий поиск!", "defaultSettings": "Чтобы переопределить параметры по умолчанию, укажите свои параметры в области справа.", "noSettingsFound": "Параметры не найдены.", - "folderSettingsDetails": "Параметры папок", - "enableFuzzySearch": "Включить экспериментальный нечеткий поиск" + "settingsSwitcherBarAriaLabel": "Переключатель параметров", + "userSettings": "Параметры пользователя", + "workspaceSettings": "Параметры рабочей области" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..afbf76af53c8 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Редактор настроек по умолчанию", + "keybindingsEditor": "Редактор настраиваемых сочетаний клавиш", + "preferences": "Параметры" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index d61548e8be2d..dc3203c75ba5 100644 --- a/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Поставщики систем управления версиями", "hideRepository": "Скрыть", - "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Установить дополнительных поставщиков SCM...", "no open repo": "Отсутствуют активные поставщики систем управления версиями.", "source control": "Система управления версиями", diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 0cf1e2835de2..cd29f7f88b8c 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -4,7 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultLabel": "ввод", - "useIgnoreFilesDescription": "Использование пропуска файлов", - "useExcludeSettingsDescription": "Использовать параметры исключения" + "defaultLabel": "ввод" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index 3eafd57dd44f..fb91734ab3bc 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "Стандартная маска, соответствующая путям к файлам. Задайте значение true или false, чтобы включить или отключить маску.", "exclude.when": "Дополнительная проверка элементов того же уровня соответствующего файла. Используйте $(basename) в качестве переменной для соответствующего имени файла.", "useRipgrep": "Определяет, следует ли использовать ripgrep в текстовом поиске и в поиске по файлам", - "useIgnoreFilesByDefault": "Определяет, следует ли использовать GITIGNORE- и IGNORE-файлы по умолчанию при поиске текста в новой рабочей области.", "useIgnoreFiles": "Определяет, следует ли использовать GITIGNORE- и IGNORE-файлы по умолчанию при поиске файлов.", "search.quickOpen.includeSymbols": "Настройте для включения результатов поиска глобальных символов в файлы по запросу для Quick Open.", "search.followSymlinks": "Определяет, нужно ли следовать символическим ссылкам при поиске." diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 3243bdde9a8a..acbdea84856b 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Показать предыдущий шаблон исключения из поиска", "nextSearchTerm": "Показать следующее условие поиска", "previousSearchTerm": "Показать предыдущее условие поиска", - "focusNextInputBox": "Фокус на следующем поле ввода", - "focusPreviousInputBox": "Фокус на предыдущем поле ввода", "showSearchViewlet": "Показать средство поиска", "findInFiles": "Найти в файлах", "findInFilesWithSelectedText": "Найти в файлах с выделенным текстом", "replaceInFiles": "Заменить в файлах", "replaceInFilesWithSelectedText": "Заменить в файлах с выделенным текстом", - "findInWorkspace": "Найти в рабочей области...", - "findInFolder": "Найти в папке...", "RefreshAction.label": "Обновить", - "ClearSearchResultsAction.label": "Очистить результаты поиска", + "CollapseDeepestExpandedLevelAction.label": "Свернуть все", + "ClearSearchResultsAction.label": "Очистить", "FocusNextSearchResult.label": "Перейти к следующему результату поиска.", "FocusPreviousSearchResult.label": "Перейти к предыдущему результату поиска.", "RemoveAction.label": "Отклонить", diff --git a/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..fb91734ab3bc --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Перейти к символу в рабочей области...", + "name": "Поиск", + "search": "Поиск", + "view": "Просмотр", + "openAnythingHandlerDescription": "Перейти к файлу", + "openSymbolDescriptionNormal": "Перейти к символу в рабочей области", + "searchOutputChannelTitle": "Поиск", + "searchConfigurationTitle": "Поиск", + "exclude": "Настройте стандартные маски для исключения файлов и папок при поиске. Все стандартные маски наследуются от параметра file.exclude.", + "exclude.boolean": "Стандартная маска, соответствующая путям к файлам. Задайте значение true или false, чтобы включить или отключить маску.", + "exclude.when": "Дополнительная проверка элементов того же уровня соответствующего файла. Используйте $(basename) в качестве переменной для соответствующего имени файла.", + "useRipgrep": "Определяет, следует ли использовать ripgrep в текстовом поиске и в поиске по файлам", + "useIgnoreFiles": "Определяет, следует ли использовать GITIGNORE- и IGNORE-файлы по умолчанию при поиске файлов.", + "search.quickOpen.includeSymbols": "Настройте для включения результатов поиска глобальных символов в файлы по запросу для Quick Open.", + "search.followSymlinks": "Определяет, нужно ли следовать символическим ссылкам при поиске." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/rus/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 89b6fae2e759..2cba25f0f5ec 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,9 +6,7 @@ { "tasksCategory": "Задачи", "ConfigureTaskRunnerAction.label": "Настроить задачу", - "ConfigureBuildTaskAction.label": "Настроить задачу сборки", "CloseMessageAction.label": "Закрыть", - "ShowTerminalAction.label": "Ознакомиться с терминалом", "problems": "Проблемы", "manyMarkers": "99+", "runningTasks": "Показать выполняемые задачи", @@ -52,7 +50,6 @@ "TaslService.noEntryToRun": "Задача для запуска не найдена. Настройте задачи...", "TaskService.fetchingBuildTasks": "Получение задач сборки...", "TaskService.pickBuildTask": "Выберите задачу сборки для запуска", - "TaskService.noBuildTask": "Задача сборки не найдена. Настройте задачи... ", "TaskService.fetchingTestTasks": "Получение задач тестирования...", "TaskService.pickTestTask": "Выберите задачу тестирования для запуска", "TaskService.noTestTaskTerminal": "Тестовая задача для запуска не найдена. Настройте задачи...", diff --git a/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index a317034d2a3d..1b0a682834e6 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,6 @@ "ConfigurationParser.noTypeDefinition": "Ошибка: тип задачи '{0}' не зарегистрирован. Возможно, вы не установили расширение, которое предоставляет соответствующий поставщик задач.", "ConfigurationParser.missingRequiredProperty": "Ошибка: в конфигурации задачи '{0}' отсутствует необходимое свойство '{1}'. Конфигурация задачи будет проигнорирована.", "ConfigurationParser.notCustom": "Ошибка: задачи не объявлены в качестве пользовательской задачи. Конфигурация будет проигнорирована.\n{0}\n", - "ConfigurationParser.noTaskName": "Ошибка: задачи должны предоставлять свойство taskName. Задача будет проигнорирована.\n{0}\n", - "taskConfiguration.shellArgs": "Предупреждение: задача \"{0}\" является командой оболочки, и имя команды или одного из ее аргументов включает пробелы без escape-последовательности. Чтобы обеспечить правильную расстановку кавычек в командной строке, объедините аргументы в команде.", "taskConfiguration.noCommandOrDependsOn": "Ошибка: в задаче \"{0}\" не указаны ни команда, ни свойство dependsOn. Задача будет проигнорирована. Определение задачи:\n{1}", "taskConfiguration.noCommand": "Ошибка: задача \"{0}\" не определяет команду. Задача будет игнорироваться. Ее определение:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "Версия задач 2.0.0 не поддерживает глобальные задачи для конкретных ОС. Преобразуйте их в задачи с помощью команд для конкретных ОС.\nЗатронутые задачи: {0}" diff --git a/i18n/rus/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index bc758f057049..e321dc23923d 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, средство выбора терминалов", "termCreateEntryAriaLabel": "{0}, создать новый терминал", - "'workbench.action.terminal.newplus": "$(plus) Создать новый интегрированный терминал", + "workbench.action.terminal.newplus": "$(plus) Создать новый интегрированный терминал", "noTerminalsMatching": "Терминалы, соответствующие условию, отсутствуют", "noTerminalsFound": "Открытые терминалы отсутствуют" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 045380be6068..b8da8b233eb4 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,7 +16,6 @@ "terminal.integrated.rightClickCopyPaste": "Если задано, блокирует отображение контекстного меню при щелчке правой кнопкой мыши в терминале. Вместо этого будет выполняться копирование выбранного элемента и вставка в область, в которой нет выбранных элементов.", "terminal.integrated.fontFamily": "Определяет семейство шрифтов терминала, значение по умолчанию — editor.fontFamily.", "terminal.integrated.fontSize": "Определяет размер шрифта (в пикселях) для терминала.", - "terminal.integrated.lineHeight": "Определяет высоту строки терминала; это число умножается на размер шрифта терминала, что дает фактическую высоту строки в пикселях.", "terminal.integrated.enableBold": "Следует ли разрешить полужирный текст в терминале. Эта функция должна поддерживаться оболочкой терминала.", "terminal.integrated.cursorBlinking": "Управляет миганием курсора терминала.", "terminal.integrated.cursorStyle": "Определяет стиль курсора терминала.", diff --git a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index b252e0872aa6..1296713c7243 100644 --- a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -8,10 +8,9 @@ "installColorThemes": "Установить дополнительные цветовые темы...", "themes.selectTheme": "Выберите цветовую тему (используйте клавиши стрелок вверх и вниз для предварительного просмотра)", "selectIconTheme.label": "Тема значков файлов", - "installIconThemes": "Установить дополнительные темы значков файлов...", "noIconThemeLabel": "Нет", "noIconThemeDesc": "Отключить значки файлов", - "problemChangingIconTheme": "Проблема при задании темы значка: {0}", + "installIconThemes": "Установить дополнительные темы значков файлов...", "themes.selectIconTheme": "Выбрать тему значка файла", "generateColorTheme.label": "Создать цветовую тему на основе текущих параметров", "preferences": "Параметры", diff --git a/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 8915524eb9bf..a2c3f05959fe 100644 --- a/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Конфигурация окна, которая может быть задана в параметрах пользователя или рабочей области.", "scope.resource.description": "Конфигурации ресурсов, которые могут быть заданы в параметрах пользователей, рабочих областей или папок.", "scope.description": "Область, в которой применяется конфигурация. Доступные области — 'window' и 'resource'.", + "vscode.extension.contributes.defaultConfiguration": "Предоставляет параметры конфигурации редактора по умолчанию в соответствии с языком.", "vscode.extension.contributes.configuration": "Добавляет параметры конфигурации.", "invalid.title": "configuration.title должно быть строкой", - "vscode.extension.contributes.defaultConfiguration": "Предоставляет параметры конфигурации редактора по умолчанию в соответствии с языком.", "invalid.properties": "configuration.properties должно быть объектом", "invalid.allOf": "Параметр 'configuration.allOf' является устаревшим, и использовать его не рекомендуется. Вместо этого передайте несколько параметров в виде массива в точку вклада 'configuration'.", "workspaceConfig.folders.description": "Список папок, которые будут загружены в рабочую область.", diff --git a/i18n/rus/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/rus/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..b9b24e91bdb0 --- /dev/null +++ b/i18n/rus/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Телеметрия", + "telemetry.enableCrashReporting": "Разрешить отправку отчетов о сбоях в Майкрософт.\nЧтобы этот параметр вступил в силу, требуется перезагрузка." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/rus/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 6e3ff1bf5c17..8b6ad71cd4e6 100644 --- a/i18n/rus/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "bubbleTitle": "содержит выделенные элементы" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json index 6e032cd38749..9363e76f0d56 100644 --- a/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "Файл является каталогом", "fileNotModifiedError": "undefined", "fileTooLargeError": "Не удается открыть файл, так как он имеет слишком большой размер", - "fileBinaryError": "Похоже, файл является двоичным, и его нельзя открыть как текстовый.", "fileNotFoundError": "Файл не найден ({0})", + "fileBinaryError": "Похоже, файл является двоичным, и его нельзя открыть как текстовый.", "fileExists": "Создаваемый файл уже существует ({0})", "fileMoveConflict": "Невозможно переместить или скопировать файл, так как он уже существует в папке назначения.", "unableToMoveCopyError": "Невозможно переместить или скопировать файл, так как он заменил бы папку, в которой содержится.", diff --git a/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index caff4f65c29c..297bca0ac5f1 100644 --- a/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -21,6 +21,5 @@ "keybindings.json.command": "Имя выполняемой команды", "keybindings.json.when": "Условие, когда клавиша нажата.", "keybindings.json.args": "Аргументы, передаваемые в выполняемую команду.", - "keyboardConfigurationTitle": "Клавиатура", - "dispatch": "Управляет логикой диспетчеризации для нажатий клавиш \"keydown.code\" (рекомендуется) или \"keydown.keyCode\"." + "keyboardConfigurationTitle": "Клавиатура" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/rus/src/vs/workbench/services/textfile/common/textFileService.i18n.json index f01fee847aa3..8b6ad71cd4e6 100644 --- a/i18n/rus/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "files.backup.failSave": "Не удалось выполнить резервное копирование файлов (ошибка: {0}). Попробуйте сохранить файлы, чтобы выйти." -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index e2aef412ef5a..9cba5bba5fd0 100644 --- a/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "В параметры пользователя были добавлены новые параметры темы. Резервная копия доступна в {0}.", "error.cannotloadtheme": "Unable to load {0}: {1}", - "error.cannotloadicontheme": "Unable to load {0}", "colorTheme": "Specifies the color theme used in the workbench.", "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Указывает тему значков, используемую в рабочей области. Чтобы значки файлов не отображались, используйте значение 'null'.", diff --git a/i18n/trk/extensions/git/out/autofetch.i18n.json b/i18n/trk/extensions/git/out/autofetch.i18n.json new file mode 100644 index 000000000000..95a3249f5f42 --- /dev/null +++ b/i18n/trk/extensions/git/out/autofetch.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yes": "Evet", + "no": "Hayır", + "not now": "Şu An İstemiyorum", + "suggest auto fetch": "Otomatik Git depoları alımını etkinleştirmek ister misiniz?" +} \ No newline at end of file diff --git a/i18n/trk/extensions/git/out/commands.i18n.json b/i18n/trk/extensions/git/out/commands.i18n.json index 91a6f890483a..fac3c95bae73 100644 --- a/i18n/trk/extensions/git/out/commands.i18n.json +++ b/i18n/trk/extensions/git/out/commands.i18n.json @@ -9,9 +9,12 @@ "create branch": "$(plus) Yeni dal oluştur", "repourl": "Depo URL'si", "parent": "Üst Klasör", + "cancel": "$(sync~spin) Depo kopyalanıyor... İptal etmek için tıklayın", + "cancel tooltip": "Kopyalamayı iptal et", "cloning": "Git deposu kopyalanıyor...", "openrepo": "Depoyu Aç", "proposeopen": "Kopyalanan depoyu açmak ister misiniz?", + "init": "Git deposunun oluşturulacağı çalışma alanı klasörünü seçin", "init repo": "Depo Oluştur", "create repo": "Depo Oluştur", "are you sure": "Bu, '{0}' dizininde bir Git deposu oluşturacak. Devam etmek istediğinizden emin misiniz?", @@ -49,12 +52,15 @@ "select branch to delete": "Silinecek dalı seçin", "confirm force delete branch": "'{0}' dalı tamamen birleştirilmemiş. Yine de silinsin mi?", "delete branch": "Dalı Sil", + "invalid branch name": "Geçersiz dal adı", + "branch already exists": "'{0}' adında bir dal zaten mevcut", "select a branch to merge from": "Birleştirilmesi için bir dal seçin", "merge conflicts": "Birleştirme çakışmaları var. Commit'lemeden önce bunları çözün.", "tag name": "Etiket adı", "provide tag name": "Lütfen bir etiket adı belirtin", "tag message": "Mesaj", "provide tag message": "Lütfen etikete açıklama yapmak için bir mesaj belirtin", + "no remotes to fetch": "Bu depoda alma işleminin yapılacağı hiçbir uzak uçbirim yapılandırılmamış.", "no remotes to pull": "Deponuzda çekme işleminin yapılacağı hiçbir uzak uçbirim yapılandırılmamış.", "pick remote pull repo": "Dalın çekileceği bir uzak uçbirim seçin", "no remotes to push": "Deponuzda gönderimin yapılacağı hiçbir uzak uçbirim yapılandırılmamış.", @@ -71,7 +77,7 @@ "no stashes": "Geri yüklenecek geçici değişiklik yok.", "pick stash to pop": "Geri yüklenecek ögeyi seçin", "clean repo": "Geçiş yapmadan önce deponuzdaki çalışma ağacınızı temizleyin.", - "cant push": "Başvurular uzak uçbirime gönderilemiyor. Değişikliklerinizi entegre etmeden, ilk olarak 'Çek'i çalıştırın. ", + "cant push": "Başvurular uzak uçbirime gönderilemiyor. Değişikliklerinizi entegre etmeden, ilk olarak 'Çek'i çalıştırmayı deneyin. ", "git error details": "Git: {0}", "git error": "Git hatası", "open git log": "Git Günlüğünü Aç" diff --git a/i18n/trk/extensions/git/out/main.i18n.json b/i18n/trk/extensions/git/out/main.i18n.json index eda1b0cc9a93..34a8658c3922 100644 --- a/i18n/trk/extensions/git/out/main.i18n.json +++ b/i18n/trk/extensions/git/out/main.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "looking": "Git, şu konumda aranıyor: {0}", "using git": "{1} yolundaki git {0} kullanılıyor", - "updateGit": "Git'i Güncelle", + "downloadgit": "Git'i İndir", "neverShowAgain": "Tekrar gösterme", + "notfound": "Git bulunamadı. Git'i kurun veya 'git.path' ayarı ile yapılandırın.", + "updateGit": "Git'i Güncelle", "git20": "git {0} yüklemiş olarak görünüyorsunuz. Code, git >= 2 ile en iyi şekilde çalışır" } \ No newline at end of file diff --git a/i18n/trk/extensions/git/out/repository.i18n.json b/i18n/trk/extensions/git/out/repository.i18n.json index 4f0f8a1a395f..793421109b83 100644 --- a/i18n/trk/extensions/git/out/repository.i18n.json +++ b/i18n/trk/extensions/git/out/repository.i18n.json @@ -21,6 +21,7 @@ "deleted by us": "Bizim Tarafımızdan Silindi", "both added": "Her İkimiz de Ekledik", "both modified": "Her İkimiz de Değiştirdik", + "commitMessage": "Mesaj (commit'lemek için {0} tuşlarına basın)", "commit": "Commit'le", "merge changes": "Değişiklikleri Birleştir", "staged changes": "Hazırlanmış Değişiklikler", diff --git a/i18n/trk/extensions/git/package.i18n.json b/i18n/trk/extensions/git/package.i18n.json index fdf41929b4d8..3955baf58a03 100644 --- a/i18n/trk/extensions/git/package.i18n.json +++ b/i18n/trk/extensions/git/package.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "command.clone": "Klonla", + "command.clone": "Kopyala", "command.init": "Depo Oluştur", "command.close": "Depoyu Kapat", "command.refresh": "Yenile", @@ -33,8 +33,10 @@ "command.checkout": "Geçiş yap...", "command.branch": "Dal Oluştur...", "command.deleteBranch": "Dalı Sil...", + "command.renameBranch": "Dalı Yeniden Adlandır...", "command.merge": "Dalı Birleştir...", "command.createTag": "Etiket Oluştur", + "command.fetch": "Al", "command.pull": "Çek", "command.pullRebase": "Çek (Yeniden Adresle)", "command.pullFrom": "Şuradan Çek...", @@ -42,9 +44,11 @@ "command.pushTo": "Gönder...", "command.pushWithTags": "Etiketlerle Gönder", "command.sync": "Senkronize Et", + "command.syncRebase": "Eşitle (Yeniden Adresle)", "command.publish": "Dalı Yayınla", "command.showOutput": "Git Çıktısını Göster", "command.ignore": ".gitignore'a Dosya Ekle", + "command.stashIncludeUntracked": "Geçici Olarak Sakla(İzlenmeyenleri Dahil Et)", "command.stash": "Geçici Olarak Sakla", "command.stashPop": "Geçici Olarak Saklananı Geri Yükle...", "command.stashPopLatest": "En Son Geçici Olarak Saklananı Geri Yükle", @@ -57,6 +61,7 @@ "config.countBadge": "Git gösterge sayacını denetler. `all` tüm değişiklikleri sayar. `tracked` sadece izlenen değişikliklikleri sayar. `off` ise kapatır.", "config.checkoutType": "`Geçiş Yap...` çalıştırılırken listelenecek dal türlerini denetler. `all` tüm başvuruları gösterir, `local` sadece yerel dalları gösterir, `tags` sadece etiketleri gösterir ve `remote` sadece uzak uçbirim dallarını gösterir.", "config.ignoreLegacyWarning": "Eski Git uyarısını görmezden gelir", + "config.ignoreMissingGitWarning": "Git mevcut olmadığında uyarıyı yok sayar", "config.ignoreLimitWarning": "Bir depoda çok fazla değişiklik var uyarısını görmezden gelir", "config.defaultCloneDirectory": "Bir git deposunun kopyalanacağı varsayılan konum", "config.enableSmartCommit": "Hazırlanan değişiklik yoksa tüm değişiklikleri commit'le.", diff --git a/i18n/trk/extensions/markdown/out/commands.i18n.json b/i18n/trk/extensions/markdown/out/commands.i18n.json new file mode 100644 index 000000000000..58734fd8dcfa --- /dev/null +++ b/i18n/trk/extensions/markdown/out/commands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previewTitle": "{0} Önizlemesi", + "onPreviewStyleLoadError": "'markdown.styles' yüklenemedi: {0}" +} \ No newline at end of file diff --git a/i18n/trk/extensions/markdown/out/features/previewContentProvider.i18n.json b/i18n/trk/extensions/markdown/out/features/previewContentProvider.i18n.json new file mode 100644 index 000000000000..04c06b0e2ddd --- /dev/null +++ b/i18n/trk/extensions/markdown/out/features/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Bu belgedeki bazı içerikler devre dışı bırakıldı", + "preview.securityMessage.title": "Markdown önizlemesinde potansiyel olarak tehlikeli veya güvenli olmayan içerik devre dışı bırakıldı. Güvenli olmayan içeriğe izin vermek veya betikleri etkinleştirmek için Markdown önizleme güvenlik ayarını değiştirin", + "preview.securityMessage.label": "İçerik Devre Dışı Güvenlik Uyarısı" +} \ No newline at end of file diff --git a/i18n/trk/extensions/markdown/out/security.i18n.json b/i18n/trk/extensions/markdown/out/security.i18n.json index fa3ecf1c124b..b066062580e2 100644 --- a/i18n/trk/extensions/markdown/out/security.i18n.json +++ b/i18n/trk/extensions/markdown/out/security.i18n.json @@ -11,5 +11,8 @@ "disable.title": "Devre Dışı Bırak", "disable.description": "Tüm içeriğe ve betik yürütmeye izin ver. Tavsiye edilmez", "moreInfo.title": "Daha Fazla Bilgi", + "enableSecurityWarning.title": "Bu çalışma alanında önizleme güvenlik uyarılarını etkinleştir", + "disableSecurityWarning.title": "Bu çalışma alanında önizleme güvenlik uyarılarını devre dışı bırak", + "toggleSecurityWarning.description": "İçerik güvenlik seviyesini etkilemez", "preview.showPreviewSecuritySelector.title": "Bu çalışma alanında Markdown önizlemeleri için güvenlik ayarlarını seçin" } \ No newline at end of file diff --git a/i18n/trk/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/trk/extensions/merge-conflict/out/codelensProvider.i18n.json index 26571af8cf39..0476f24fb1ea 100644 --- a/i18n/trk/extensions/merge-conflict/out/codelensProvider.i18n.json +++ b/i18n/trk/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "acceptCurrentChange": "Geçerli Değişikliği Kabul Et", + "acceptCurrentChange": "Mevcut Değişikliği Kabul Et", "acceptIncomingChange": "Gelen Değişikliği Kabul Et", "acceptBothChanges": "Her İki Değişikliği de Kabul Et", "compareChanges": "Değişiklikleri Karşılaştır" diff --git a/i18n/trk/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/trk/extensions/merge-conflict/out/commandHandler.i18n.json index 3811062c8a33..705fbc5a822f 100644 --- a/i18n/trk/extensions/merge-conflict/out/commandHandler.i18n.json +++ b/i18n/trk/extensions/merge-conflict/out/commandHandler.i18n.json @@ -5,9 +5,9 @@ // Do not edit this file. It is machine generated. { "cursorNotInConflict": "Düzenleyici imleci birleştirme çakışması içinde değil", - "compareChangesTitle": "{0}: Geçerli Değişiklikler ⟷ Gelen Değişiklikler", - "cursorOnCommonAncestorsRange": "Düzenleyici imleci ortak atalar bloğunda, imleci lütfen \"geçerli\" veya \"gelen\" bloğundan birine getirin", - "cursorOnSplitterRange": "Düzenleyici imleci birleştirme çakışması ayırıcısında, imleci lütfen \"geçerli\" veya \"gelen\" bloğundan birine getirin", + "compareChangesTitle": "{0}: Mevcut Değişiklikler ⟷ Gelen Değişiklikler", + "cursorOnCommonAncestorsRange": "Düzenleyici imleci ortak atalar bloğunda, imleci lütfen \"mevcut\" veya \"gelen\" bloğundan birine getirin", + "cursorOnSplitterRange": "Düzenleyici imleci birleştirme çakışması ayırıcısında, imleci lütfen \"mevcut\" veya \"gelen\" bloğundan birine getirin", "noConflicts": "Bu dosyada birleştirme çakışması bulunamadı", "noOtherConflictsInThisFile": "Bu dosyada başka birleştirme çakışması bulunamadı" } \ No newline at end of file diff --git a/i18n/trk/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/trk/extensions/merge-conflict/out/mergeDecorator.i18n.json index 4e7bccae262a..3e7f492fb7dd 100644 --- a/i18n/trk/extensions/merge-conflict/out/mergeDecorator.i18n.json +++ b/i18n/trk/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "currentChange": "(Geçerli Değişiklik)", + "currentChange": "(Mevcut Değişiklik)", "incomingChange": "(Gelen Değişiklik)" } \ No newline at end of file diff --git a/i18n/trk/extensions/merge-conflict/package.i18n.json b/i18n/trk/extensions/merge-conflict/package.i18n.json index 75e7f2cd722e..1752dca0d1b8 100644 --- a/i18n/trk/extensions/merge-conflict/package.i18n.json +++ b/i18n/trk/extensions/merge-conflict/package.i18n.json @@ -5,9 +5,10 @@ // Do not edit this file. It is machine generated. { "command.category": "Birleştirme Çakışması", + "command.accept.all-current": "Mevcut Olan Tümünü Kabul Et", "command.accept.all-incoming": "Gelen Tümünü Kabul Et", "command.accept.all-both": "Tümünü Birden Kabul Et", - "command.accept.current": "Şuan Geçerli Olanı Kabul Et", + "command.accept.current": "Mevcut Olanı Kabul Et", "command.accept.incoming": "Geleni Kabul Et", "command.accept.selection": "Seçimi Kabul Et", "command.accept.both": "Her İkisini de Kabul Et", diff --git a/i18n/trk/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/trk/extensions/typescript/out/features/completionItemProvider.i18n.json index 99dbe99b705b..ee78a27da0a1 100644 --- a/i18n/trk/extensions/typescript/out/features/completionItemProvider.i18n.json +++ b/i18n/trk/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "selectCodeAction": "Uygulanacak kod eylemini seçin", "acquiringTypingsLabel": "Tuşlamalar alınıyor...", "acquiringTypingsDetail": "IntelliSense için tuşlama tanımları alınıyor...", "autoImportLabel": "{0} kaynağından otomatik içe aktar" diff --git a/i18n/trk/extensions/typescript/package.i18n.json b/i18n/trk/extensions/typescript/package.i18n.json index 27309eac0573..6ad268b596e0 100644 --- a/i18n/trk/extensions/typescript/package.i18n.json +++ b/i18n/trk/extensions/typescript/package.i18n.json @@ -39,6 +39,7 @@ "typescript.openTsServerLog.title": "TS Sunucu günlüğünü aç", "typescript.restartTsServer": "TS sunucusunu yeniden başlat", "typescript.selectTypeScriptVersion.title": "TypeScript Sürümünü Seç", + "typescript.reportStyleChecksAsWarnings": "Stil kontrollerini uyarı olarak bildir", "jsDocCompletion.enabled": "Otomatik JSDoc yorumlarını etkinleştir veya devre dışı bırak.", "javascript.implicitProjectConfig.checkJs": "JavaScript dosyalarının anlamsal kontrolünü etkinleştir veya devre dışı bırak. Mevcut jsconfig.json veya tsconfig.json dosyaları bu ayarı geçersiz kılar. TypeScript >= 2.3.1 gerektirir.", "typescript.npm": "Otomatik Tür Kazanımı için kullanılacak NPM yürütülebilir dosyasının yolunu belirtir. TypeScript >= 2.3.4 gerektirir.", diff --git a/i18n/trk/src/vs/base/common/errorMessage.i18n.json b/i18n/trk/src/vs/base/common/errorMessage.i18n.json index e1e685c3ab22..854eb577ebb9 100644 --- a/i18n/trk/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/trk/src/vs/base/common/errorMessage.i18n.json @@ -4,13 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "message": "{0}. Hata kodu: {1}", - "error.permission.verbose": "İzin Verilmedi (HTTP {0})", - "error.permission": "İzin Verilmedi", - "error.http.verbose": "{0} (HTTP {1}: {2})", - "error.http": "{0} (HTTP {1})", - "error.connection.unknown.verbose": "Bilinmeyen Bağlantı Hatası ({0})", - "error.connection.unknown": "Bilinmeyen bir bağlantı hatası oluştu. Artık İnternet'e bağlı değilsiniz veya bağlandığınız sunucu çevrimdışı.", "stackTrace.format": "{0}: {1}", "error.defaultMessage": "Bilinmeyen bir hata oluştu. Daha fazla ayrıntı için lütfen günlüğe başvurun.", "nodeExceptionMessage": "Bir sistem hatası oluştu ({0})", diff --git a/i18n/trk/src/vs/code/electron-main/main.i18n.json b/i18n/trk/src/vs/code/electron-main/main.i18n.json new file mode 100644 index 000000000000..dce3cbffb105 --- /dev/null +++ b/i18n/trk/src/vs/code/electron-main/main.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "secondInstanceNoResponse": "{0}'un başka bir örneği çalışıyor ancak yanıt vermiyor", + "secondInstanceNoResponseDetail": "Lütfen diğer tüm örnekleri kapatın ve tekrar deneyin.", + "secondInstanceAdmin": "{0}'un ikinci bir örneği zaten yönetici olarak çalışıyor.", + "secondInstanceAdminDetail": "Lütfen diğer örneği kapatın ve tekrar deneyin.", + "close": "&&Kapat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/code/electron-main/menus.i18n.json b/i18n/trk/src/vs/code/electron-main/menus.i18n.json index 245e33677c8d..f94d5322c976 100644 --- a/i18n/trk/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/trk/src/vs/code/electron-main/menus.i18n.json @@ -22,11 +22,11 @@ "miQuit": "{0} Öğesinden Çık", "miNewFile": "&&Yeni Dosya", "miOpen": "&&Aç...", - "miOpenWorkspace": "Çalışma Alanı &&Aç...", + "miOpenWorkspace": "Ça&&lışma Alanı Aç...", "miOpenFolder": "&&Klasör Aç...", "miOpenFile": "&&Dosya Aç...", "miOpenRecent": "&&Son Kullanılanları Aç", - "miSaveWorkspaceAs": "Çalışma Alanını &&Farklı Kaydet...", + "miSaveWorkspaceAs": "Çalışma Alanını Farklı Kaydet...", "miAddFolderToWorkspace": "Çalışma Alanına Klasör &&Ekle...", "miSave": "&&Kaydet", "miSaveAs": "&&Farklı Kaydet", @@ -157,7 +157,7 @@ "mMergeAllWindows": "Tüm Pencereleri Birleştir", "miToggleDevTools": "&&Geliştirici Araçlarını Aç/Kapat", "miAccessibilityOptions": "&&Erişilebilirlik Seçenekleri", - "miReportIssues": "So&&run Bildir", + "miReportIssue": "&&Sorun Bildir", "miWelcome": "&&Hoş Geldiniz", "miInteractivePlayground": "&&İnteraktif Oyun Alanı", "miDocumentation": "&&Belgeler", @@ -184,6 +184,7 @@ "miDownloadingUpdate": "Güncelleştirme İndiriliyor...", "miInstallingUpdate": "Güncelleştirme Yükleniyor...", "miCheckForUpdates": "Güncelleştirmeleri Denetle...", - "aboutDetail": "\nSürüm {0}\nCommit {1}\nTarih {2}\nKabuk {3}\nOluşturucu {4}\nNode {5}\nMimari {6}", - "okButton": "Tamam" + "aboutDetail": "Sürüm {0}\nCommit {1}\nTarih {2}\nKabuk {3}\nRender Alan {4}\nNode {5}\nMimari {6}", + "okButton": "Tamam", + "copy": "K&&opyala" } \ No newline at end of file diff --git a/i18n/trk/src/vs/code/node/cliProcessMain.i18n.json b/i18n/trk/src/vs/code/node/cliProcessMain.i18n.json index 8ca0b4fc0b40..5c84d9e6049e 100644 --- a/i18n/trk/src/vs/code/node/cliProcessMain.i18n.json +++ b/i18n/trk/src/vs/code/node/cliProcessMain.i18n.json @@ -8,6 +8,7 @@ "notInstalled": "'{0}' eklentisi yüklü değil.", "useId": "Eklentinin tam ID'sini, yayıncı da dahil olmak üzere kullandığınızdan emin olun, ör: {0}", "successVsixInstall": "'{0}' eklentisi başarıyla yüklendi.", + "cancelVsixInstall": "'{0}' eklentisini yükleme işlemi iptal edildi.", "alreadyInstalled": "'{0}' eklentisi zaten yüklü.", "foundExtension": "'{0}' markette bulundu.", "installing": "Yükleniyor...", diff --git a/i18n/trk/src/vs/editor/browser/services/bulkEdit.i18n.json b/i18n/trk/src/vs/editor/browser/services/bulkEdit.i18n.json new file mode 100644 index 000000000000..b081029e080e --- /dev/null +++ b/i18n/trk/src/vs/editor/browser/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Bu dosyalar bu arada değiştirildi: {0}", + "summary.0": "Düzenleme yapılmadı", + "summary.nm": "{1} dosyada {0} metin düzenlemesi yapıldı", + "summary.n0": "Bir dosyada {0} metin düzenlemesi yapıldı" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json index 8936db413057..33eec63f82e6 100644 --- a/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -10,7 +10,11 @@ "fontSize": "Yazı tipi boyutunu piksel olarak denetler.", "lineHeight": "Satır yüksekliğini denetler. lineHeight değerini, fontSize değeri kullanarak hesaplamak için 0 girin.", "letterSpacing": "Harfler arası boşluğu pixel olarak denetler.", - "lineNumbers": "Satır numaralarının görüntülenmesini denetler. Olası değerler 'on', 'off' ve 'relative'dir. 'relative' satırların geçerli imleç konumundan uzaklıklarını gösterir.", + "lineNumbers.off": "Satır numaraları gösterilmez.", + "lineNumbers.on": "Satır numaraları mutlak sayı olarak gösterilir.", + "lineNumbers.relative": "Satır numaraları imlecin konumuna olan uzaklık olarak gösterilir.", + "lineNumbers.interval": "Satır numaraları her 10 satırda bir gösterilir.", + "lineNumbers": "Satır numaralarının görüntülenmesini denetler. Olası değerler 'on', 'off' ve 'relative'dir.", "rulers": "Belirli bir eşit genişlikli karakterlerden sonra dikey cetveller göster. Birden çok cetvel için birden çok değer kullanın. Dizi boş ise cetvel gösterilmez", "wordSeparators": "Sözcüklerle ilgili gezinti veya işlem yaparken kelime ayırıcı olarak kullanılacak karakterler", "tabSize": "Bir sekmenin eşit olduğu boşluk sayısı. Bu ayar, `editor.detectIndentation` açıkken dosya içeriğine bağlı olarak geçersiz kılınır.", @@ -89,8 +93,8 @@ "links": "Düzenleyicinin bağlantıları otomatik algılayıp, onları tıklanabilir yapıp yapmayacağını denetler", "colorDecorators": "Düzenleyicinin satır içi renk dekoratörlerini ve renk seçiciyi gösterip göstermemesini denetler.", "codeActions": "Kod eylemleri ampulunu etkinleştirir", + "selectionClipboard": "Linux birincil panosunun desteklenip desteklenmeyeceğini denetler.", "sideBySide": "Karşılaştırma düzenleyicisinin farklılıkları yan yana mı yoksa satır içinde mi göstereceğini denetler", "ignoreTrimWhitespace": "Karşılaştırma düzenleyicisinin baştaki veya sondaki boşluklardaki değişmeleri farklılık olarak gösterip göstermemesini denetler", - "renderIndicators": "Karşılaştırma düzenleyicisinin ekleme/çıkarma değişiklikleri için +/- göstergeleri gösterip göstermemesini denetler.", - "selectionClipboard": "Linux birincil panosunun desteklenip desteklenmeyeceğini denetler." + "renderIndicators": "Karşılaştırma düzenleyicisinin ekleme/çıkarma değişiklikleri için +/- göstergeleri gösterip göstermemesini denetler." } \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json b/i18n/trk/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json new file mode 100644 index 000000000000..1c4928f4039c --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/bracketMatching/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Ayraca Git" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json b/i18n/trk/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json new file mode 100644 index 000000000000..c5196837029d --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/caretOperations/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "İmleci Sola Taşı", + "caret.moveRight": "İmleci Sağa Taşı" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/caretOperations/transpose.i18n.json b/i18n/trk/src/vs/editor/contrib/caretOperations/transpose.i18n.json new file mode 100644 index 000000000000..5ee978f2342c --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/caretOperations/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Harfleri Birbirleriyle Değiştir" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/clipboard/clipboard.i18n.json b/i18n/trk/src/vs/editor/contrib/clipboard/clipboard.i18n.json new file mode 100644 index 000000000000..768e8e3511f0 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/clipboard/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Kes", + "actions.clipboard.copyLabel": "Kopyala", + "actions.clipboard.pasteLabel": "Yapıştır", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Sentaks Vurgulaması İle Kopyala" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/comment/comment.i18n.json b/i18n/trk/src/vs/editor/contrib/comment/comment.i18n.json new file mode 100644 index 000000000000..30ac850837c3 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/comment/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Satır Yorumunu Aç/Kapat", + "comment.line.add": "Satır Açıklaması Ekle", + "comment.line.remove": "Satır Açıklamasını Kaldır", + "comment.block": "Yorum Bloğunu Aç/Kapat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json b/i18n/trk/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json new file mode 100644 index 000000000000..fbed23270527 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/contextmenu/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Düzenleyici Bağlam Menüsünü Göster" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/find/findController.i18n.json b/i18n/trk/src/vs/editor/contrib/find/findController.i18n.json new file mode 100644 index 000000000000..d6d3fc6ccf34 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/find/findController.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Bul", + "findNextMatchAction": "Sonrakini Bul", + "findPreviousMatchAction": "Öncekini Bul", + "nextSelectionMatchFindAction": "Sonraki Seçimi Bul", + "previousSelectionMatchFindAction": "Önceki Seçimi Bul", + "startReplace": "Değiştir", + "showNextFindTermAction": "Sonraki Arama Terimini Göster", + "showPreviousFindTermAction": "Önceki Arama Terimini Göster" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/find/findWidget.i18n.json b/i18n/trk/src/vs/editor/contrib/find/findWidget.i18n.json new file mode 100644 index 000000000000..265b74d65a5d --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/find/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Bul", + "placeholder.find": "Bul", + "label.previousMatchButton": "Önceki eşleşme", + "label.nextMatchButton": "Sonraki eşleşme", + "label.toggleSelectionFind": "Seçimde bul", + "label.closeButton": "Kapat", + "label.replace": "Değiştir", + "placeholder.replace": "Değiştir", + "label.replaceButton": "Değiştir", + "label.replaceAllButton": "Tümünü Değiştir", + "label.toggleReplaceButton": "Değiştirme modunu değiştir", + "title.matchesCountLimit": "Sadece ilk {0} sonuç vurgulandı, fakat metnin tamamında tüm arama işlemleri çalışıyor.", + "label.matchesLocation": "{0}/{1}", + "label.noResults": "Sonuç Yok" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/find/simpleFindWidget.i18n.json b/i18n/trk/src/vs/editor/contrib/find/simpleFindWidget.i18n.json new file mode 100644 index 000000000000..baad53fc2a42 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/find/simpleFindWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Bul", + "placeholder.find": "Bul", + "label.previousMatchButton": "Önceki eşleşme", + "label.nextMatchButton": "Sonraki eşleşme", + "label.closeButton": "Kapat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/folding/folding.i18n.json b/i18n/trk/src/vs/editor/contrib/folding/folding.i18n.json new file mode 100644 index 000000000000..ef3c3e89fe60 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/folding/folding.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Katlamayı Aç", + "unFoldRecursivelyAction.label": "Katlamaları Özyinelemeli Olarak Aç", + "foldAction.label": "Katla", + "foldRecursivelyAction.label": "Özyinelemeli Olarak Katla", + "foldAllBlockComments.label": "Tüm Yorum Bloklarını Katla", + "foldAllMarkerRegions.label": "Tüm Bölgeleri Katla", + "unfoldAllMarkerRegions.label": "Tüm Bölgelerdeki Katlamayı Aç", + "foldAllAction.label": "Hepsini Katla", + "unfoldAllAction.label": "Tüm Katlamaları Aç", + "foldLevelAction.label": "{0}. Düzeyi Katla" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/trk/src/vs/editor/contrib/format/formatActions.i18n.json new file mode 100644 index 000000000000..52d2abe3a3de --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/format/formatActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "{0}. satırda 1 biçimlendirme düzenlemesi yapıldı", + "hintn1": "{1}. satırda {0} biçimlendirme düzenlemesi yapıldı", + "hint1n": "{0} ve {1} satırları arasında 1 biçimlendirme düzenlemesi yapıldı", + "hintnn": "{1} ve {2} satırları arasında {0} biçimlendirme düzenlemesi yapıldı", + "no.provider": "Maalesef, '{0}' dosyaları için yüklenmiş bir biçimlendirici yok.", + "formatDocument.label": "Belgeyi Biçimlendir", + "formatSelection.label": "Seçimi Biçimlendir" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json b/i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json new file mode 100644 index 000000000000..fae99c4c772a --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "'{0}' için tanım bulunamadı", + "generic.noResults": "Tanım bulunamadı", + "meta.title": " – {0} tanım", + "actions.goToDecl.label": "Tanıma Git", + "actions.goToDeclToSide.label": "Tanımı Yana Aç", + "actions.previewDecl.label": "Tanıma Göz At", + "goToImplementation.noResultWord": "'{0}' için uygulama bulunamadı", + "goToImplementation.generic.noResults": "Uygulama bulunamadı", + "meta.implementations.title": " – {0} uygulama", + "actions.goToImplementation.label": "Uygulamaya Git", + "actions.peekImplementation.label": "Uygulamaya Göz At", + "goToTypeDefinition.noResultWord": "'{0}' için tür tanımı bulunamadı", + "goToTypeDefinition.generic.noResults": "Tür tanımı bulunamadı", + "meta.typeDefinitions.title": " – {0} tür tanımı", + "actions.goToTypeDefinition.label": "Tür Tanımına Git", + "actions.peekTypeDefinition.label": "Tür Tanımına Göz At" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json b/i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json new file mode 100644 index 000000000000..010de11a57da --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/goToDeclaration/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "{0} tanımı göstermek için tıklayın." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json new file mode 100644 index 000000000000..6bc3935d6f49 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Sonraki Hata veya Uyarıya Git", + "markerAction.previous.label": "Önceki Hata veya Uyarıya Git", + "editorMarkerNavigationError": "Düzenleyicinin işaretçi gezinti aracının hata rengi.", + "editorMarkerNavigationWarning": "Düzenleyicinin işaretçi gezinti aracının uyarı rengi.", + "editorMarkerNavigationInfo": "Düzenleyicinin işaretçi gezinti aracının bilgilendirme rengi.", + "editorMarkerNavigationBackground": "Düzenleyicinin işaretçi gezinti aracının arka planı." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/hover/hover.i18n.json b/i18n/trk/src/vs/editor/contrib/hover/hover.i18n.json new file mode 100644 index 000000000000..e1a331227025 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/hover/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Bağlantı Vurgusunu Göster" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/hover/modesContentHover.i18n.json b/i18n/trk/src/vs/editor/contrib/hover/modesContentHover.i18n.json new file mode 100644 index 000000000000..1b70c63296f7 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/hover/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Yükleniyor..." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json b/i18n/trk/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json new file mode 100644 index 000000000000..bb4caacacb19 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Önceki Değerle Değiştir", + "InPlaceReplaceAction.next.label": "Sonraki Değerle Değiştir" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json new file mode 100644 index 000000000000..76b8b3c83916 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Girintiyi Boşluklara Dönüştür", + "indentationToTabs": "Girintiyi Sekmelere Dönüştür", + "configuredTabSize": "Yapılandırılmış Sekme Boyutu", + "selectTabWidth": "Geçerli Dosya İçin Sekme Boyutunu Seç", + "indentUsingTabs": "Sekme Kullanarak Girintile", + "indentUsingSpaces": "Boşluk Kullanarak Girintile", + "detectIndentation": "Girintiyi, İçeriği Kontrol Ederek Algıla", + "editor.reindentlines": "Satır Girintilerini Yeniden Ayarla" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json b/i18n/trk/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json new file mode 100644 index 000000000000..4ae7163c50c3 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/linesOperations/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Satırı Yukarı Kopyala", + "lines.copyDown": "Satırı Aşağı Kopyala", + "lines.moveUp": "Satırı Yukarı Taşı", + "lines.moveDown": "Satırı Aşağı Taşı", + "lines.sortAscending": "Satırları Artan Şekilde Sırala", + "lines.sortDescending": "Satırları Azalan Şekilde Sırala", + "lines.trimTrailingWhitespace": "Sondaki Boşluğu Kırp", + "lines.delete": "Satırı Sil", + "lines.indent": "Satırı Girintile", + "lines.outdent": "Satırın Girintisini Azalt", + "lines.insertBefore": "Üste Satır Ekle", + "lines.insertAfter": "Alta Satır Ekle", + "lines.deleteAllLeft": "Soldaki Her Şeyi Sil", + "lines.deleteAllRight": "Sağdaki Her Şeyi Sil", + "lines.joinLines": "Satırları Birleştir", + "editor.transpose": "İmlecin etrafındaki karakterleri birbirleriyle değiştir", + "editor.transformToUppercase": "Büyük Harfe Dönüştür", + "editor.transformToLowercase": "Küçük Harfe Dönüştür" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/links/links.i18n.json b/i18n/trk/src/vs/editor/contrib/links/links.i18n.json new file mode 100644 index 000000000000..7f51a75306c6 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/links/links.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Bağlantıyı izlemek için Cmd tuşuna basarak tıklayın", + "links.navigate": "Bağlantıyı izlemek için Ctrl tuşuna basarak tıklayın", + "links.command.mac": "Komutu yürütmek için Cmd + tıklama yapın", + "links.command": "Komutu yürütmek için Ctrl + tıklama yapın", + "links.navigate.al": "Bağlantıyı izlemek için Alt tuşuna basarak tıklayın", + "links.command.al": "Komutu yürütmek için Alt + tıklama yapın", + "invalid.url": "Üzgünüz, bu bağlantı iyi oluşturulmamış olduğu için açılamadı: {0}", + "missing.url": "Üzgünüz; bu bağlantı, hedefi eksik olduğu için açılamadı.", + "label": "Bağlantıyı Aç" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/multicursor/multicursor.i18n.json b/i18n/trk/src/vs/editor/contrib/multicursor/multicursor.i18n.json new file mode 100644 index 000000000000..899e10e4b02a --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/multicursor/multicursor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Yukarıya İmleç Ekle", + "mutlicursor.insertBelow": "Aşağıya İmleç Ekle", + "mutlicursor.insertAtEndOfEachLineSelected": "Satır Sonlarına İmleç Ekle", + "addSelectionToNextFindMatch": "Seçimi Sonraki Bulunan Eşleşmeye Ekle", + "addSelectionToPreviousFindMatch": "Seçimi Önceki Bulunan Eşleşmeye Ekle", + "moveSelectionToNextFindMatch": "Son Seçimi Sonraki Bulunan Eşleşmeye Taşı", + "moveSelectionToPreviousFindMatch": "Son Seçimi Önceki Bulunan Eşleşmeye Taşı", + "selectAllOccurrencesOfFindMatch": "Bulunan Eşleşmenin Tüm Tekrarlamalarını Seç", + "changeAll.label": "Tüm Tekrarlamaları Değiştir" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json b/i18n/trk/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json new file mode 100644 index 000000000000..b7a4e43b2b61 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/parameterHints/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Parametre İpuçlarını Tetikle" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json b/i18n/trk/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json new file mode 100644 index 000000000000..ed56fe64626b --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/parameterHints/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, ipucu" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json b/i18n/trk/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json new file mode 100644 index 000000000000..86586e96e0a7 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/quickFix/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Düzeltmeleri Göster ({0})", + "quickFix": "Düzeltmeleri Göster", + "quickfix.trigger.label": "Hızlı Düzeltme" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json b/i18n/trk/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json new file mode 100644 index 000000000000..8a312782515d --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/referenceSearch/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Kapat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json b/i18n/trk/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json new file mode 100644 index 000000000000..9ddf0e9fbe02 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/referenceSearch/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": "– {0} başvuru", + "references.action.label": "Tüm Başvuruları Bul" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json b/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json new file mode 100644 index 000000000000..14c77e0d6443 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Yükleniyor..." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json b/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json new file mode 100644 index 000000000000..a3b4193dbe7c --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "{0} yolunda, {1}. satır {2}. sütundaki sembol", + "aria.fileReferences.1": "{0} içinde 1 sembol, tam yol {1}", + "aria.fileReferences.N": "{1} içinde {0} sembol, tam yol {2}", + "aria.result.0": "Sonuç bulunamadı", + "aria.result.1": "{0} yolunda 1 sembol bulundu", + "aria.result.n1": "{1} yolunda {0} sembol bulundu", + "aria.result.nm": "{1} dosyada {0} sembol bulundu" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json new file mode 100644 index 000000000000..6165a40b9f90 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Dosya çözümlenemedi.", + "referencesCount": "{0} başvuru", + "referenceCount": "{0} başvuru", + "missingPreviewMessage": "önizleme yok", + "treeAriaLabel": "Başvurular", + "noResults": "Sonuç yok", + "peekView.alternateTitle": "Başvurular", + "peekViewTitleBackground": "Gözetleme görünümü başlık alanının arka plan rengi.", + "peekViewTitleForeground": "Gözetleme görünümü başlığının rengi.", + "peekViewTitleInfoForeground": "Gözetleme görünümü başlık bilgisinin rengi.", + "peekViewBorder": "Gözetleme görünümü kenarlıkları ve ok işaretinin rengi.", + "peekViewResultsBackground": "Gözetleme görünümü sonuç listesinin arka plan rengi.", + "peekViewResultsMatchForeground": "Gözetleme görünümü sonuç listesindeki satır düğümlerinin ön plan rengi.", + "peekViewResultsFileForeground": "Gözetleme görünümü sonuç listesindeki dosya düğümlerinin ön plan rengi.", + "peekViewResultsSelectionBackground": "Gözetleme görünümü sonuç listesindeki seçilen girdinin arka plan rengi.", + "peekViewResultsSelectionForeground": "Gözetleme görünümü sonuç listesindeki seçilen girdinin ön plan rengi.", + "peekViewEditorBackground": "Gözetleme görünümü düzenleyicisinin arka plan rengi.", + "peekViewEditorGutterBackground": "Gözetleme görünümü düzenleyicisindeki oluğun arka plan rengi.", + "peekViewResultsMatchHighlight": "Gözetleme görünümü sonuç listesindeki eşleşme vurgusu rengi.", + "peekViewEditorMatchHighlight": "Gözetleme görünümü düzenleyicisindeki eşleşme vurgusu rengi." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/rename/rename.i18n.json b/i18n/trk/src/vs/editor/contrib/rename/rename.i18n.json new file mode 100644 index 000000000000..4440b96d71b5 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/rename/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Sonuç yok.", + "aria": "'{0}', '{1}' olarak başarıyla yeniden adlandırıldı. Özet: {2}", + "rename.failed": "Üzgünüz, yeniden adlandırma işlemi başarısız oldu.", + "rename.label": "Sembolü Yeniden Adlandır" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/rename/renameInputField.i18n.json b/i18n/trk/src/vs/editor/contrib/rename/renameInputField.i18n.json new file mode 100644 index 000000000000..eea4501c3d80 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/rename/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Girdiyi yeniden adlandır. Yeni adı girin ve işlemek için Enter'a basın." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json b/i18n/trk/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json new file mode 100644 index 000000000000..b63d95ca2714 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/smartSelect/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Seçimi Genişlet", + "smartSelect.shrink": "Seçimi Daralt" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/suggest/suggestController.i18n.json b/i18n/trk/src/vs/editor/contrib/suggest/suggestController.i18n.json new file mode 100644 index 000000000000..d6c0cfacacb9 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/suggest/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "'{0}' kabul edildiği için şu metin eklendi: {1}", + "suggest.trigger.label": "Öneriyi Tetikle" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/suggest/suggestWidget.i18n.json b/i18n/trk/src/vs/editor/contrib/suggest/suggestWidget.i18n.json new file mode 100644 index 000000000000..657260a00490 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/suggest/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Öneri aracının arka plan rengi.", + "editorSuggestWidgetBorder": "Öneri aracının kenarlık rengi.", + "editorSuggestWidgetForeground": "Öneri aracının ön plan rengi.", + "editorSuggestWidgetSelectedBackground": "Öneri aracındaki seçilen girdinin arka plan rengi.", + "editorSuggestWidgetHighlightForeground": "Öneri aracındaki eşleşme vurgularının rengi.", + "readMore": "Devamını Oku...{0}", + "suggestionWithDetailsAriaLabel": "{0}, öneri, detaylı", + "suggestionAriaLabel": "{0}, öneri", + "readLess": "Daha azını oku...{0}", + "suggestWidget.loading": "Yükleniyor...", + "suggestWidget.noSuggestions": "Öneri yok.", + "suggestionAriaAccepted": "{0}, kabul edildi", + "ariaCurrentSuggestionWithDetails": "{0}, öneri, detaylı", + "ariaCurrentSuggestion": "{0}, öneri" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json b/i18n/trk/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json new file mode 100644 index 000000000000..720f500431fd --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Tab Tuşu İle Odak Değiştirmeyi Aç/Kapat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/trk/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json new file mode 100644 index 000000000000..6faf663326db --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Bir değişkeni okumak gibi, okuma-erişimi sırasındaki bir sembolün arka plan rengi.", + "wordHighlightStrong": "Bir değişkene yazmak gibi, yazma-erişimi sırasındaki bir sembolün arka plan rengi.", + "overviewRulerWordHighlightForeground": "Sembol vurguları için genel bakış cetvelinin işaretleyici rengi.", + "overviewRulerWordHighlightStrongForeground": "Yazma erişimli sembol vurguları için genel bakış cetvelinin işaretleyici rengi.", + "wordHighlight.next.label": "Sonraki Sembol Vurgusuna Git", + "wordHighlight.previous.label": "Önceki Sembol Vurgusuna Git" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/platform/environment/node/argv.i18n.json b/i18n/trk/src/vs/platform/environment/node/argv.i18n.json index 0e8cbe0d8509..7d132e007de0 100644 --- a/i18n/trk/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/trk/src/vs/platform/environment/node/argv.i18n.json @@ -12,8 +12,11 @@ "newWindow": "Yeni bir Code örneğini zorla.", "performance": "'Geliştirici: Başlangıç Performansı' komutu etkinleştirilmiş olarak başlat.", "prof-startup": "Başlangıç sırasında CPU profil oluşturucusunu çalıştır", + "inspect-extensions": "Eklentilerde hata ayıklama ve ayrımlamaya izin ver. Bağlantı URI'ı için geliştirici araçlarını kontrol edin.", + "inspect-brk-extensions": "Eklentilerde hata ayıklama ve ayrımlamaya eklenti sunucusu başladıktan hemen sonra duraklatılacak şekilde izin ver. Bağlantı URI'ı için geliştirici araçlarını kontrol edin.", "reuseWindow": "Bir dosya veya klasörü son etkin pencerede açmaya zorlayın.", "userDataDir": "Kullanıcı verilerinin tutulacağı klasörü belirtir, root olarak çalışırken yararlıdır.", + "log": "Kullanılacak günlüğe yazma seviyesi. İzin verilen değerler 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off' şeklindedir.", "verbose": "Ayrıntılı çıktı oluştur (--wait anlamına gelir).", "wait": "Geri dönmeden önce dosyaların kapanmasını bekle.", "extensionHomePath": "Eklentilerin kök dizinini belirle.", @@ -24,6 +27,7 @@ "experimentalApis": "Bir eklenti için önerilen API özelliklerini etkinleştirir.", "disableExtensions": "Yüklü tüm eklentileri devre dışı bırak.", "disableGPU": "GPU donanım hızlandırmasını devre dışı bırak.", + "status": "İşlem kullanımını ve tanılama bilgilerini yazdır.", "version": "Sürümü göster.", "help": "Kullanımı göster.", "usage": "Kullanım", diff --git a/i18n/trk/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/trk/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json index e335acfc388f..c6b46f632c15 100644 --- a/i18n/trk/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json +++ b/i18n/trk/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "notFound": "Eklenti bulunamadı", - "noCompatible": "{0} eklentisinin Code'un bu sürümüyle uyumlu bir sürümü bulunamadı." + "notCompatibleDownload": "İndirme başarısız oldu çünkü, eklentinin uyumlu olduğu VS Code'un '{0}' sürümü bulunamadı." } \ No newline at end of file diff --git a/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index c32c5815cff0..7cf70b2f373b 100644 --- a/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,11 +6,16 @@ { "invalidManifest": "Eklenti geçersiz: package.json bir JSON dosyası değil.", "restartCodeLocal": "{0} eklentisini yeniden yüklemeden önce lütfen Code'u yeniden başlatın.", - "restartCodeGallery": "Yeniden yüklemeden önce lütfen Code'u yeniden başlatın.", + "installingOutdatedExtension": "Bu eklentinin daha yeni bir sürümü zaten yüklü. Bunu, daha eski bir sürümle geçersiz kılmak ister misiniz?", + "override": "Geçersiz Kıl", + "cancel": "İptal", + "notFoundCompatible": "Yükleme başarısız oldu çünkü, '{0}' eklentisinin uyumlu olduğu VS Code'un '{1}' sürümü bulunamadı.", + "quitCode": "Yükleme başarısız oldu çünkü, eklentinin eski bir örneği hâlâ çalışıyor. Yeniden yüklemeden önce lütfen VS Code'dan çıkın ve tekrar açın.", + "exitCode": "Yükleme başarısız oldu çünkü, eklentinin eski bir örneği hâlâ çalışıyor. Yeniden yüklemeden önce lütfen VS Code'dan çıkın ve tekrar açın.", + "notFoundCompatibleDependency": "Yükleme başarısız oldu çünkü, bağımlılığı bulunan '{0}' eklentisinin uyumlu olduğu VS Code'un '{1}' sürümü bulunamadı.", "uninstallDependeciesConfirmation": "Yalnızca '{0}' eklentisini mi yoksa bağımlılıklarını da kaldırmak ister misiniz?", "uninstallOnly": "Sadece Eklenti", "uninstallAll": "Tümü", - "cancel": "İptal", "uninstallConfirmation": "'{0}' eklentisini kaldırmak istediğinizden emin misiniz?", "ok": "Tamam", "singleDependentError": "'{0}' eklentisi kaldırılamıyor. '{1}' eklentisi buna bağlı.", diff --git a/i18n/trk/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/trk/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index bf95a5cb19ea..e1d5347b655f 100644 --- a/i18n/trk/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/trk/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -17,6 +17,8 @@ "vscode.extension.activationEvents.onLanguage": "Belirtilen dilde çözümlenen bir dosya her açıldığında bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.onCommand": "Belirtilen komut her çağrıldığında bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.onDebug": "Bir kullanıcının hata ayıklamaya başlamak veya hata ayıklama yapılandırmasını ayarlamak üzere olduğu her an bir etkinleştirme olayı yayınlanır.", + "vscode.extension.activationEvents.onDebugInitialConfigurations": "Bir \"launch.json\" dosyasının oluşturulması(ve tüm provideDebugConfigurations metodlarının çağrılması) gerektiği zaman etkinleştirme olayı yayınlanır.", + "vscode.extension.activationEvents.onDebugResolve": "Belirtilen türde bir hata ayıklama oturumu başlamaya yaklaştığında (ve buna karşılık gelen bir resolveDebugConfiguration metodunun çağrılması gerektiğinde) bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.workspaceContains": "Belirtilen glob deseni ile eşleşen en az bir dosya içeren bir klasör her açıldığında bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.onView": "Belirtilen görünüm her genişletildiğinde bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.star": "VS Code başlatıldığında yayılan etkinleştirme olayı. Mükemmel bir son kullanıcı deneyimi sağlandığından emin olmak için, lütfen bu etkinleştirme olayını eklentinizde sadece kullanım durumunuzda başka hiçbir aktivasyon olayı kombinasyonu çalışmıyorsa kullanın.", diff --git a/i18n/trk/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json b/i18n/trk/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json new file mode 100644 index 000000000000..3a06d6df8296 --- /dev/null +++ b/i18n/trk/src/vs/workbench/browser/actions/toggleTabsVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleTabs": "Sekme Görünürlüğünü Aç/Kapat", + "view": "Görüntüle" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json index d031a47b23a4..3590178cc87e 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/compositebar/compositeBarActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "largeNumberBadge": "10k+", "badgeTitle": "{0} - {1}", "additionalViews": "Ek Görünümler", "numberBadge": "{0} ({1})", diff --git a/i18n/trk/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index a5fd9ca0033e..b32e97503d97 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -33,6 +33,7 @@ "openPreviousEditor": "Önceki Düzenleyiciyi Aç", "nextEditorInGroup": "Gruptaki Sonraki Düzenleyiciyi Aç", "openPreviousEditorInGroup": "Gruptaki Önceki Düzenleyiciyi Aç", + "lastEditorInGroup": "Gruptaki Son Düzenleyiciyi Aç", "navigateNext": "İleri Git", "navigatePrevious": "Geri Dön", "navigateLast": "Bir Öncekine Git", diff --git a/i18n/trk/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json index ec6a3cb04f0f..4eac419d706d 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -6,7 +6,7 @@ { "editorCommand.activeEditorMove.description": "Aktif düzenleyiciyi sekmeler veya gruplar halinde taşıyın", "editorCommand.activeEditorMove.arg.name": "Aktif düzenleyici taşıma argümanı", - "editorCommand.activeEditorMove.arg.description": "Argüman Özellikleri:\n\t\t\t\t\t\t* 'to': Nereye taşınacağını belirten dize değeri.\n\t\t\t\t\t\t* 'by': Kaç birim taşınacağını belirten dize değeri. Sekme veya grup olarak.\n\t\t\t\t\t\t* 'value': Kaç tane pozisyonun taşınacağını belirten sayı değeri.\n\t\t\t\t\t", + "editorCommand.activeEditorMove.arg.description": "Argüman Özellikleri:\n\t* 'to': Nereye taşınacağını belirten dize değeri.\n\t* 'by': Kaç birim taşınacağını belirten dize değeri. Sekme veya gruba göre.\n\t* 'value': Kaç tane pozisyonun taşınacağını belirten sayı değeri.", "commandDeprecated": "**{0}** komutu kaldırıldı. Onun yerine **{1}** komutunu kullanabilirsiniz", "openKeybindings": "Klavye Kısayollarını Yapılandır" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 915f40523558..af7268f70161 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -53,5 +53,5 @@ "screenReaderDetectedExplanation.answerYes": "Evet", "screenReaderDetectedExplanation.answerNo": "Hayır", "screenReaderDetectedExplanation.body1": "VS Code, ekran okuyucu ile kullanılmak için uygun hale getirilmiştir.", - "screenReaderDetectedExplanation.body2": "Bazı düzenleyici özellikleri farklı bir davranış sergileyecektir: ör. sözcük kaydırma, katlama, ayraçları otomatik kapatma, vb." + "screenReaderDetectedExplanation.body2": "Bazı düzenleyici özellikleri farklı bir davranış sergileyecektir: ör. sözcük kaydırma, katlama, vb." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/quickopen.i18n.json b/i18n/trk/src/vs/workbench/browser/quickopen.i18n.json index a0b7b06168e6..8a54c0548930 100644 --- a/i18n/trk/src/vs/workbench/browser/quickopen.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/quickopen.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "noResultsMatching": "Eşleşen sonuç yok", - "noResultsFound2": "Sonuç bulunamadı", - "entryAriaLabel": "{0}, komut" + "noResultsFound2": "Sonuç bulunamadı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/trk/src/vs/workbench/electron-browser/actions.i18n.json index 84919f4ec14e..7c4352f507ba 100644 --- a/i18n/trk/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/trk/src/vs/workbench/electron-browser/actions.i18n.json @@ -30,7 +30,7 @@ "openRecent": "Son Kullanılanları Aç...", "quickOpenRecent": "Son Kullanılanları Hızlı Aç...", "closeMessages": "Bildirim İletilerini Kapat", - "reportIssues": "Sorunları Bildir", + "reportIssueInEnglish": "Sorun Bildir", "reportPerformanceIssue": "Performans Sorunu Bildir", "keybindingsReference": "Klavye Kısayolları Başvurusu", "openDocumentationUrl": "Belgeler", @@ -47,5 +47,14 @@ "showNextWindowTab": "Sonraki Pencere Sekmesini Göster", "moveWindowTabToNewWindow": "Pencere Sekmesini Yeni Pencereye Taşı", "mergeAllWindowTabs": "Tüm Pencereleri Birleştir", - "toggleWindowTabsBar": "Pencere Sekmeleri Çubuğunu Gizle/Göster" + "toggleWindowTabsBar": "Pencere Sekmeleri Çubuğunu Gizle/Göster", + "configureLocale": "Dili Yapılandır", + "displayLanguage": "VSCode'un görüntüleme dilini tanımlar.", + "doc": "Desteklenen dillerin listesi için göz atın: {0}", + "restart": "Değeri değiştirirseniz VSCode'u yeniden başlatmanız gerekir.", + "fail.createSettings": " '{0}' oluşturulamadı ({1}).", + "debug": "Hata Ayıklama", + "info": "Bilgi", + "warn": "Uyarı", + "err": "Hata" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json index 03dfb498b1e4..8aacc6f4f6e5 100644 --- a/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,8 +7,8 @@ "view": "Görüntüle", "help": "Yardım", "file": "Dosya", - "workspaces": "Çalışma Alanları", "developer": "Geliştirici", + "workspaces": "Çalışma Alanları", "showEditorTabs": "Açık düzenleyicilerin sekmelerde gösterilip gösterilmeyeceğini denetler", "workbench.editor.labelFormat.default": "Dosyanın adını göster. Sekmeler etkinleştirilmiş ve bir grupta iki dosya aynı ada sahiplerse, her dosyanın yolundaki ayırt edici bölümler eklenir. Sekmeler devre dışı ve düzenleyici aktifse, çalışma alanı klasörüne göreli yol gösterilir.", "workbench.editor.labelFormat.short": "Dosyanın adını ve ardından dizin adını göster.", @@ -16,6 +16,7 @@ "workbench.editor.labelFormat.long": "Dosyanın adını ve ardından mutlak yolunu göster.", "tabDescription": "Bir düzenleyici için etiketin biçimini denetler. Bu ayarı değiştirmek; örneğin, bir dosyanın konumunun daha kolay anlaşılmasını sağlar:\n- short: 'ustklasor'\n- medium: 'calismaalani/src/ustklasor'\n- long: '/home/user/calismaalani/src/ustklasor'\n- default: diğer bir sekme aynı başlığı paylaşıyorsa '.../ustklasor' veya sekmeler devre dışı ise göreli çalışma alanı yolu", "editorTabCloseButton": "Düzenleyici sekmelerinin kapat butonlarının konumunu denetler veya 'off' olarak ayarlandığında devre dışı bırakır.", + "tabSizing": "Düzenleyici sekmelerinin boyutlarını denetler. Sekmelerin her zaman tam düzenleyici etiketini gösterecek kadar büyük tutmak için 'fit' olarak ayarlayın. Mevcut alan bir seferde tüm sekmeleri göstermek için yeterli olmadığında sekmelerin küçülmesini sağlamak için 'shrink' olarak ayarlayın.", "showIcons": "Açık düzenleyicilerin bir simge ile gösterilip gösterilmemelerini denetler. Bu, bir simge temasının etkinleştirilmesini de gerektirir.", "enablePreview": "Açık düzenleyicilerin önizleme olarak gösterilip gösterilmeyeceğini denetler. Önizleme düzenleyicileri kalıcı olarak açılana kadar (ör. çift tıklama veya düzenleme ile) tekrar kullanılırlar ve italik yazı tipiyle gösterilirler.", "enablePreviewFromQuickOpen": "Hızlı Aç'taki açık düzenleyicilerin önizleme olarak gösterilip gösterilmeyeceğini denetler. Önizleme düzenleyicileri kalıcı olarak açılana kadar (ör. çift tıklama veya düzenleme ile) tekrar kullanılırlar.", @@ -26,18 +27,17 @@ "closeOnFocusLost": "Hızlı Aç'ın odağını kaybettiğinde otomatik olarak kapanıp kapanmayacağını denetler.", "openDefaultSettings": "Ayarları açmanın ayrıca tüm varsayılan ayarları gösteren bir düzenleyici açıp açmayacağını denetler.", "sideBarLocation": "Kenar çubuğunun konumunu denetler. Çalışma ekranının ya solunda ya da sağında gösterilebilir.", - "panelLocation": "Panelin konumunu denetler. Çalışma ekranının ya altında ya da sağında gösterilebilir.", "statusBarVisibility": "Çalışma ekranının altındaki durum çubuğunun görünürlüğünü denetler.", "activityBarVisibility": "Çalışma ekranındaki etkinlik çubuğunun görünürlüğünü denetler.", "closeOnFileDelete": "Düzenleyicinin gösterdiği bir dosyanın, başka bir işlem tarafından silinmesi veya yeniden adlandırması durumunda dosyayı otomatik olarak kapatıp kapatmamasını denetler. Bunu devre dışı bırakmak, böyle bir durumda düzenleyicinin kaydedilmemiş değişiklikler içeriyor durumunda kalmasını sağlar. Uygulama içinde silmek, düzenleyiciyi her zaman kapatır ve kaydedilmemiş değişiklikler içeren dosyalar, verilerinizin korunması için otomatik olarak kapatılmaz.", - "experimentalFuzzySearchEndpoint": "Deneysel ayar araması için kullanılacak uçbirimi belirtir.", - "experimentalFuzzySearchKey": "Deneysel ayar araması için kullanılacak anahtarı belirtir.", + "enableNaturalLanguageSettingsSearch": "Ayarlar için doğal dil arama modunun etkinleştirilip etkinleştirilmeyeceğini denetler.", "fontAliasing": "Çalışma ekranındaki yazı tipi yumuşatma yöntemini denetler.\n- default: Alt-piksel yazı tipi yumuşatma. Bu, çoğu retina olmayan ekranda en keskin metni verir\n- antialiased: Alt-pikselin tersine, pikselin seviyesine göre yazı tipini yumuşat. Yazı tipinin genel olarak daha açık görünmesini sağlayabilir\n- none: Yazı tipi yumuşatmayı devre dışı bırakır. Metin pürüzlü keskin kenarlarla gösterilir.", "workbench.fontAliasing.default": "Alt-piksel yazı tipi yumuşatma. Bu, çoğu retina olmayan ekranda en keskin metni verir.", "workbench.fontAliasing.antialiased": "Alt-pikselin tersine, pikselin seviyesine göre yazı tipini yumuşat. Yazı tipinin genel olarak daha açık görünmesini sağlayabilir.", "workbench.fontAliasing.none": "Yazı tipi yumuşatmayı devre dışı bırakır. Metin pürüzlü keskin kenarlarla gösterilir.", "swipeToNavigate": "Yatay olarak üç parmakla kaydırma ile açık dosyalar arasında gezinin.", "workbenchConfigurationTitle": "Çalışma Ekranı", + "windowConfigurationTitle": "Pencere", "window.openFilesInNewWindow.on": "Dosyalar yeni bir pencerede açılacak", "window.openFilesInNewWindow.off": "Dosyalar, dosyaların klasörünün olduğu pencerede veya son aktif pencerede açılacak", "window.openFilesInNewWindow.default": "Dosyalar, Dock veya Finder ile açılmadıkça (sadece macOS için) dosyaların klasörünün olduğu pencerede veya son aktif pencerede açılacak", @@ -69,11 +69,11 @@ "autoDetectHighContrast": "Etkinleştirilirse; eğer Windows bir yüksek karşıtlık teması kullanıyorsa, otomatik olarak yüksek karşıtlık temasına geçiş yapılır; ve Windows, yüksek karşıtlık temasını kullanmayı bıraktığında koyu temaya geçiş yapılır.", "titleBarStyle": "Pencere başlık çubuğunun görünümünü ayarlayın. Değişikliklerin uygulanması için tam yeniden başlatma gerekir.", "window.nativeTabs": "macOS Sierra pencere sekmelerini etkinleştirir. Değişikliklerin uygulanması için tam yeniden başlatma gerekeceğini ve yerel sekmelerin, eğer yapılandırılmışsa özel başlık çubuğu stilini devre dışı bıracağını unutmayın.", - "windowConfigurationTitle": "Pencere", "zenModeConfigurationTitle": "Zen Modu", "zenMode.fullScreen": "Zen Moduna geçmenin ayrıca çalışma ekranını tam ekran moduna geçirip geçirmeyeceğini denetler.", "zenMode.hideTabs": "Zen Moduna geçmenin ayrıca çalışma ekranı sekmelerini gizleyip gizlemeyeceğini denetler.", "zenMode.hideStatusBar": "Zen Moduna geçmenin ayrıca çalışma ekranının altındaki durum çubuğunu gizleyip gizlemeyeceğini denetler.", "zenMode.hideActivityBar": "Zen Moduna geçmenin ayrıca çalışma ekranının solundaki etkinlik çubuğunu gizleyip gizlemeyeceğini denetler.", - "zenMode.restore": "Bir pencere Zen modundayken çıkıldıysa, bu pencerenin Zen moduna geri dönüp dönmeyeceğini denetler." + "zenMode.restore": "Bir pencere Zen modundayken çıkıldıysa, bu pencerenin Zen moduna geri dönüp dönmeyeceğini denetler.", + "JsonSchema.locale": "Kullanılacak Kullanıcı Arayüzü Dili." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 3f796ff047d3..d6c708e7602d 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -30,7 +30,6 @@ "deactivateBreakpoints": "Kesme Noktalarını Devre Dışı Bırak", "reapplyAllBreakpoints": "Tüm Kesme Noktalarını Yeniden Uygula", "addFunctionBreakpoint": "Fonksiyon Kesme Noktası Ekle", - "renameFunctionBreakpoint": "Fonksiyon Kesme Noktasını Kaldır", "addConditionalBreakpoint": "Koşullu Kesme Noktası Ekle...", "editConditionalBreakpoint": "Kesme Noktasını Düzenle...", "setValue": "Değeri Ayarla", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json new file mode 100644 index 000000000000..1baa43d65644 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editConditionalBreakpoint": "Kesme Noktasını Düzenle...", + "functionBreakpointsNotSupported": "Fonksiyon kesme noktaları bu hata ayıklama türü tarafından desteklenmiyor", + "functionBreakpointPlaceholder": "Mola verilecek fonksiyon", + "functionBreakPointInputAriaLabel": "Fonksiyon kesme noktasını girin" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json new file mode 100644 index 000000000000..001d372f06a5 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "callstackSection": "Çağrı Yığını Bölümü", + "debugStopped": "{0} Üzerinde Duraklatıldı", + "callStackAriaLabel": "Hata Ayıklama Çağrı Yığını", + "process": "İşlem", + "paused": "Duraklatıldı", + "running": "Çalışıyor", + "thread": "İş Parçacığı", + "pausedOn": "{0} Üzerinde Duraklatıldı", + "loadMoreStackFrames": "Daha Fazla Yığın Çerçevesi Yükleyin", + "threadAriaLabel": "{0} iş parçacığı, çağrı yığını, hata ayıklama", + "stackFrameAriaLabel": "Yığın Çerçevesi {0} satır {1} {2}, çağrı yığını, hata ayıklama" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 21b83c7bc928..8a38e9caf2a6 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -20,5 +20,10 @@ "openExplorerOnEnd": "Bir hata ayıklama oturumunun sonunda otomatik olarak gezgin görünümünü açın", "inlineValues": "Hata ayıklama sırasında değişken değerlerini düzenleyicide satır içinde göster", "hideActionBar": "Dolaştırılabilir hata ayıklama eylem çubuğunun gizlenip gizlenmeyeceğini denetler", + "never": "Hata ayıklamayı durum çubuğunda asla gösterme", + "always": "Hata ayıklamayı durum çubuğunda her zaman göster", + "onFirstSessionStart": "Hata ayıklamayı sadece ilk kez başladıktan sonra durum çubuğunda göster", + "showInStatusBar": "Hata ayıklama durum çubuğunun ne zaman görünür olacağını denetler", + "openDebug": "Hata ayıklama viewlet'ının, hata ayıklama oturumu başlangıcında açılıp açılmayacağını denetler.", "launch": "Global hata ayıklama başlatma yapılandırması. Çalışma alanlarında paylaşılan 'launch.json'a alternatif olarak kullanılmalıdır" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index a72d826faba6..957aae1111b3 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -11,7 +11,8 @@ "breakpointAdded": "Kesme noktası eklendi, {0}. satır, {1} dosyası", "breakpointRemoved": "Kesme noktası kaldırıldı, {0}. satır, {1} dosyası", "compoundMustHaveConfigurations": "Bileşik, birden çok yapılandırmayı başlatmak için \"configurations\" özniteliği bulundurmalıdır.", - "configMissing": "'launch.json' dosyasında '{0}' yapılandırması eksik.", + "configMissing": "'launch.json' mevcut değil veya '{0}' yapılandırmasını içermiyor.", + "launchJsonDoesNotExist": "'launch.json' mevcut değil.", "debugRequestNotSupported": "Seçilen hata ayıklama yapılandırılmasındaki `{0}` özniteliği desteklenmeyen `{1}` değeri içeriyor.", "debugRequesMissing": "'{0}' özniteliği seçilen hata ayıklama yapılandırılmasında eksik.", "debugTypeNotSupported": "Yapılandırılan hata ayıklama türü '{0}', desteklenmiyor.", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json new file mode 100644 index 000000000000..07a5b7d0f7a6 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/variablesView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Değişkenler Bölümü", + "variablesAriaTreeLabel": "Hata Ayıklama Değişkenleri", + "variableValueAriaLabel": "Yeni değişken adını girin", + "variableScopeAriaLabel": "{0} kapsamı, değişkenler, hata ayıklama", + "variableAriaLabel": "{0} değeri {1}, değişkenler, hata ayıklama" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json new file mode 100644 index 000000000000..5c51a9a049bc --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expressionsSection": "İfadeler Bölümü", + "watchAriaTreeLabel": "Hata Ayıklama İzleme İfadeleri", + "watchExpressionPlaceholder": "İzlenecek ifade", + "watchExpressionInputAriaLabel": "İzleme ifadesi girin", + "watchExpressionAriaLabel": "{0} değeri {1}, izleme, hata ayıklama", + "watchVariableAriaLabel": "{0} değeri {1}, izleme, hata ayıklama" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index 4c3d5d2ef5f1..0640208ea528 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -6,9 +6,11 @@ { "name": "Eklenti adı", "extension id": "Eklenti tanımlayıcısı", + "preview": "Önizleme", "publisher": "Yayıncı adı", "install count": "Yüklenme sayısı", "rating": "Derecelendirme", + "repository": "Depo", "license": "Lisans", "details": "Detaylar", "contributions": "Eklemeler", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 14daf8309bdc..e9474bb59f09 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -10,16 +10,12 @@ "Uninstalling": "Kaldırılıyor", "updateAction": "Güncelle", "updateTo": "{0} sürümüne güncelle", - "enableForWorkspaceAction.label": "Etkinleştir (Çalışma Alanı)", - "enableAlwaysAction.label": "Etkinleştir (Daima)", - "disableForWorkspaceAction.label": "Devre Dışı Bırak (Çalışma Alanı)", - "disableAlwaysAction.label": "Devre Dışı Bırak (Daima)", "ManageExtensionAction.uninstallingTooltip": "Kaldırılıyor", - "enableForWorkspaceAction": "Çalışma Alanı", - "enableGloballyAction": "Daima", + "enableForWorkspaceAction": "Etkinleştir (Çalışma Alanı)", + "enableGloballyAction": "Etkinleştir", "enableAction": "Etkinleştir", - "disableForWorkspaceAction": "Çalışma Alanı", - "disableGloballyAction": "Daima", + "disableForWorkspaceAction": "Devre Dışı Bırak (Çalışma Alanı)", + "disableGloballyAction": "Devre Dışı Bırak", "disableAction": "Devre Dışı Bırak", "checkForUpdates": "Güncelleştirmeleri Denetle", "enableAutoUpdate": "Eklentileri Otomatik Olarak Güncelleştirmeyi Etkinleştir", @@ -47,11 +43,8 @@ "allExtensionsInstalled": "Bu çalışma alanı için tavsiye edilen tüm eklentiler zaten yüklü", "installRecommendedExtension": "Tavsiye Edilen Eklentiyi Yükle", "extensionInstalled": "Tavsiye edilen eklenti zaten yüklü", - "showRecommendedKeymapExtensions": "Tavsiye Edilen Tuş Haritalarını Göster", "showRecommendedKeymapExtensionsShort": "Tuş Haritaları", - "showLanguageExtensions": "Dil Eklentilerini Göster", "showLanguageExtensionsShort": "Dil Eklentileri", - "showAzureExtensions": "Azure Eklentilerini Göster", "showAzureExtensionsShort": "Azure Eklentileri", "OpenExtensionsFile.failed": " '.vscode' klasörü içinde 'extensions.json' dosyası oluşturulamıyor ({0}).", "configureWorkspaceRecommendedExtensions": "Tavsiye Edilen Eklentileri Yapılandır (Çalışma Alanı)", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsWidgets.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json new file mode 100644 index 000000000000..8b6ad71cd4e6 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index f6176cf12ddc..31d65218f0e6 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -9,7 +9,7 @@ "extension": "Eklenti", "extensions": "Eklentiler", "view": "Görüntüle", + "developer": "Geliştirici", "extensionsConfigurationTitle": "Eklentiler", - "extensionsAutoUpdate": "Eklentileri otomatik olarak güncelle", - "extensionsIgnoreRecommendations": "Eklenti tavsiyelerini yok say" + "extensionsAutoUpdate": "Eklentileri otomatik olarak güncelle" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json new file mode 100644 index 000000000000..cbbd312d9f34 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reportExtensionIssue": "Sorun Bildir" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json new file mode 100644 index 000000000000..090a30127533 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/explorerViewlet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "folders": "Klasörler" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json new file mode 100644 index 000000000000..09b50f5c8194 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Dosya", + "revealInSideBar": "Kenar Çubuğunda Ortaya Çıkar", + "acceptLocalChanges": "Değişikliklerinizi kullanın ve diskteki içeriklerin üzerine yazın", + "revertLocalChanges": "Değişikliklerinizi göz ardı edin ve diskteki içeriğe geri dönün" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json new file mode 100644 index 000000000000..2be3f4a5668b --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Yeniden Dene", + "rename": "Yeniden Adlandır", + "newFile": "Yeni Dosya", + "newFolder": "Yeni Klasör", + "openFolderFirst": "İçinde dosyalar veya klasörler oluşturmak için ilk olarak bir klasör açın.", + "newUntitledFile": "Yeni İsimsiz Dosya", + "createNewFile": "Yeni Dosya", + "createNewFolder": "Yeni Klasör", + "deleteButtonLabelRecycleBin": "&&Geri Dönüşüm Kutusuna Taşı", + "deleteButtonLabelTrash": "&&Çöp Kutusuna Taşı", + "deleteButtonLabel": "&&Sil", + "dirtyMessageFolderOneDelete": "1 dosyada kaydedilmemiş değişiklik barındıran bir klasörü siliyorsunuz. Devam etmek istiyor musunuz?", + "dirtyMessageFolderDelete": "{0} dosyada kaydedilmemiş değişiklik barındıran bir klasörü siliyorsunuz. Devam etmek istiyor musunuz?", + "dirtyMessageFileDelete": "Kaydedilmemiş değişiklik barındıran bir dosyayı siliyorsunuz. Devam etmek istiyor musunuz?", + "dirtyWarning": "Değişiklikleriniz, kaydetmezseniz kaybolur.", + "confirmMoveTrashMessageFolder": "'{0}' ve içindekileri silmek istediğinizden emin misiniz?", + "confirmMoveTrashMessageFile": "'{0}' öğesini silmek istediğinize emin misiniz?", + "undoBin": "Geri dönüşüm kutusundan geri alabilirsiniz.", + "undoTrash": "Çöp kutusundan geri alabilirsiniz.", + "doNotAskAgain": "Bir daha sorma", + "confirmDeleteMessageFolder": "'{0}' öğesini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", + "confirmDeleteMessageFile": "'{0}' öğesini kalıcı olarak silmek istediğinizden emin misiniz?", + "irreversible": "Bu eylem geri döndürülemez!", + "permDelete": "Kalıcı Olarak Sil", + "delete": "Sil", + "importFiles": "Dosya İçe Aktar", + "confirmOverwrite": "Hedef klasörde aynı ada sahip bir dosya veya klasör zaten var. Değiştirmek istiyor musunuz?", + "replaceButtonLabel": "&&Değiştir", + "copyFile": "Kopyala", + "pasteFile": "Yapıştır", + "duplicateFile": "Çoğalt", + "openToSide": "Yana Aç", + "compareSource": "Karşılaştırma İçin Seç", + "globalCompareFile": "Aktif Dosyayı Karşılaştır...", + "openFileToCompare": "Bir başka dosya ile karşılaştırmak için ilk olarak bir dosya açın.", + "compareWith": "'{0}' dosyasını '{1}' ile karşılaştır", + "compareFiles": "Dosyaları Karşılaştır", + "refresh": "Yenile", + "save": "Kaydet", + "saveAs": "Farklı Kaydet...", + "saveAll": "Tümünü Kaydet", + "saveAllInGroup": "Gruptaki Tümünü Kadet", + "saveFiles": "Tüm Dosyaları Kaydet", + "revert": "Dosyayı Geri Döndür", + "focusOpenEditors": "Açık Düzenleyiciler Görünümüne Odakla", + "focusFilesExplorer": "Dosya Gezginine Odakla", + "showInExplorer": "Aktif Dosyayı Kenar Çubuğunda Ortaya Çıkar", + "openFileToShow": "Gezginde göstermek için ilk olarak bir dosya açın", + "collapseExplorerFolders": "Gezgindeki Klasörleri Daralt", + "refreshExplorer": "Gezgini Yenile", + "openFileInNewWindow": "Aktif Dosyayı Yeni Pencerede Aç", + "openFileToShowInNewWindow": "Yeni pencerede açmak için ilk olarak bir dosya açın", + "revealInWindows": "Gezginde Ortaya Çıkar", + "revealInMac": "Finder'da Ortaya Çıkar", + "openContainer": "İçeren Klasörü Aç", + "revealActiveFileInWindows": "Aktif Dosyayı Windows Gezgini'nde Ortaya Çıkar", + "revealActiveFileInMac": "Aktif Dosyayı Finder'da Ortaya Çıkar", + "openActiveFileContainer": "Aktif Dosyayı İçeren Klasörü Aç", + "copyPath": "Yolu Kopyala", + "copyPathOfActive": "Aktif Dosyanın Yolunu Kopyala", + "emptyFileNameError": "Bir dosya veya klasör adı sağlanması gerekiyor.", + "fileNameExistsError": "Bu konumda bir **{0}** dosyası veya klasörü zaten mevcut. Lütfen başka bir ad seçin.", + "invalidFileNameError": "**{0}** adı, bir dosya veya klasör adı olarak geçerli değildir. Lütfen başka bir ad seçin.", + "filePathTooLongError": "**{0}** adı çok uzun bir yol ile sonuçlanıyor. Lütfen daha kısa bir ad seçin.", + "compareWithSaved": "Aktif Dosyayı Kaydedilenle Karşılaştır", + "modifiedLabel": "{0} (diskte) ↔ {1}", + "compareWithClipboard": "Aktif Dosyayı Panodakiyle Karşılaştır", + "clipboardComparisonLabel": "Pano ↔ {0}" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json new file mode 100644 index 000000000000..699305824d3e --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Yolunu kopyalamak için ilk olarak bir dosya açın", + "openFileToReveal": "Ortaya çıkarmak için ilk olarak bir dosya açın" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json new file mode 100644 index 000000000000..4948cddf5c43 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Gezgini Göster", + "explore": "Gezgin", + "view": "Görüntüle", + "textFileEditor": "Metin Dosyası Düzenleyicisi", + "binaryFileEditor": "İkili Dosya Düzenleyicisi", + "filesConfigurationTitle": "Dosyalar", + "exclude": "Dosyaları ve klasörleri hariç tutmak için glob desenlerini yapılandırın. Örnek olarak, dosya gezgini bu ayara bağlı olarak hangi dosya ve klasörlerin gösterileceğine karar verir.", + "files.exclude.boolean": "Dosya yollarının eşleştirileceği glob deseni. Deseni etkinleştirmek veya devre dışı bırakmak için true veya false olarak ayarlayın.", + "files.exclude.when": "Eşleşen bir dosyanın eşdüzey dosyalarında ek denetim. Eşleşen dosya adı için değişken olarak $(basename) kullanın.", + "associations": "Dillerle dosya ilişkilendirmelerini yapılandırın (ör. \"*.uzanti\": \"html\"). Bunların, kurulu olan dillerin varsayılan ilişkilendirmeleri karşısında önceliği vardır.", + "encoding": "Dosyalar okunurken ve yazılırken kullanılacak varsayılan karakter kümesi kodlaması. Bu ayar her bir dil için de yapılandırılabilir.", + "autoGuessEncoding": "Etkinleştirildiğinde, dosyaları açarken karakter kümesini tahmin etmeye çalışır. Bu ayar her bir dil için de yapılandırılabilir.", + "eol": "Varsayılan satır sonu karakteri. LF için \\n ve CRLF için \\r\\n kullan.", + "trimTrailingWhitespace": "Etkinleştirildiğinde, bir dosyayı kaydettiğinizde sondaki boşluk kırpılır.", + "insertFinalNewline": "Etkinleştirildiğinde, bir dosyayı kaydederken dosya sonuna bir boş satır ekler.", + "trimFinalNewlines": "Etkinleştirildiğinde, bir dosyayı kaydederken dosya sonundaki birden fazla boş satırı kırparak tek boş satıra çevirir", + "files.autoSave.off": "Kaydedilmemiş değişiklikler içeren bir dosya hiçbir zaman otomatik olarak kaydedilmez.", + "files.autoSave.afterDelay": "Kaydedilmemiş değişiklikler içeren bir dosya, 'files.autoSaveDelay' ayarlandıktan sonra otomatik olarak kaydedilir.", + "files.autoSave.onFocusChange": "Kaydedilmemiş değişiklikler içeren bir dosya, düzenleyici odaktan çıktığı an otomatik olarak kaydedilir.", + "files.autoSave.onWindowChange": "Kaydedilmemiş değişiklikler içeren bir dosya, pencere odaktan çıktığı an otomatik olarak kaydedilir.", + "autoSave": "Kaydedilmemiş değişiklikler içeren dosyaların otomatik kaydedilmesini denetler. Kabul edilen değerler: '{0}', '{1}', '{2}' (düzenleyici odaktan çıktığında), '{3}' (pencere odaktan çıktığında). '{4}' olarak ayarlanırsa, gecikmeyi 'files.autoSaveDelay' ile ayarlayabilirsiniz.", + "autoSaveDelay": "Kaydedilmemiş değişiklikler içeren bir dosyanın kaç ms gecikmeli otomatik olarak kaydedileceğini denetler. Sadece 'files.autoSave', '{0}' olarak ayarlandığında uygulanır.", + "watcherExclude": "Dosya izlemeden hariç tutulacak dosya yollarının glob desenlerini yapılandırın. Desenler mutlak yollarla eşleşmelidir (ör. ** ile ön ek veya düzgün eşleştirmek için tam yol). Bu ayar değiştiğinde yeniden başlatma gerektirir. Code'un başlangıçta çok fazla CPU zamanı harcadığını görürseniz, başlangıç yüklemesini azaltmak için büyük klasörleri hariç tutabilirsiniz.", + "hotExit.off": "Hızlı çıkışı devre dışı bırak.", + "hotExit.onExit": "Hızlı çıkış, uygulama kapandığında tetiklenir, yani Windows/Linux'da son pencere kapandığında veya workbench.action.quit komutu tetiklendiği zaman (komut paleti, tuş bağı, menü). Bir sonraki başlatmada tüm pencereler yedekleriyle geri yüklenir.", + "hotExit.onExitAndWindowClose": "Hızlı çıkış, uygulama kapandığında tetiklenir, yani Windows/Linux'da son pencere kapandığında veya workbench.action.quit komutu tetiklendiği zaman (komut paleti, tuş bağı, menü), ve ayrıca son pencere olmasından bağımsız açık bir klasör bulunan herhangi bir pencere varsa. Bir sonraki başlatmada tüm pencereler yedekleriyle geri yüklenir. Klasör pencerelerini kapatılmadan önceki konumlarına geri yüklemek için \"window.restoreWindows\" ögesini \"all\" olarak ayarlayın.", + "hotExit": "Oturumlar arasında kaydedilmemiş dosyaların hatırlanıp hatırlanmayacağını denetler, düzenleyiciden çıkarken kaydetmek için izin istenmesi atlanacaktır.", + "useExperimentalFileWatcher": "Yeni deneysel dosya izleyicisini kullanın.", + "defaultLanguage": "Yeni dosyalara atanan varsayılan dil modu.", + "editorConfigurationTitle": "Düzenleyici", + "formatOnSave": "Dosyayı kaydederken biçimlendir. Bir biçimlendirici mevcut olmalıdır, dosya otomatik olarak kaydedilmemelidir, ve düzenleyici kapanmıyor olmalıdır.", + "explorerConfigurationTitle": "Dosya Gezgini", + "openEditorsVisible": "Açık Editörler bölmesinde gösterilen düzenleyici sayısı. Bölmeyi gizlemek için 0 olarak ayarlayın.", + "dynamicHeight": "Açık düzenleyiciler bölümü yüksekliğinin öge sayısına göre dinamik olarak uyarlanıp uyarlanmayacağını denetler.", + "autoReveal": "Gezginin dosyaları açarken, onları otomatik olarak ortaya çıkartmasını ve seçmesini denetler.", + "enableDragAndDrop": "Gezgeinin sürükle bırak ile dosyaları ve klasörleri taşımaya izin verip vermeyeceğini denetler.", + "confirmDragAndDrop": "Gezginin, sürükle bırak ile dosyalar ve klasörlerin taşındığı zaman onay isteyip istemeyeceğini denetler.", + "confirmDelete": "Gezginin, geri dönüşüm kutusu ile dosya silineceği zaman onay isteyip istemeyeceğini denetler.", + "sortOrder.default": "Dosya ve klasörler adlarına göre, alfabetik olarak sıralanırlar. Klasörler dosyalardan önce görüntülenir.", + "sortOrder.mixed": "Dosya ve klasörler adlarına göre, alfabetik olarak sıralanırlar. Dosyalar ve klasörler iç içe bulunur.", + "sortOrder.filesFirst": "Dosya ve klasörler adlarına göre, alfabetik olarak sıralanırlar. Dosyalar klasörlerden önce görüntülenir.", + "sortOrder.type": "Dosya ve klasörler uzantılarına göre, alfabetik olarak sıralanırlar. Klasörler dosyalardan önce görüntülenir.", + "sortOrder.modified": "Dosya ve klasörler son değiştirilme tarihine göre, azalan düzende sıralanırlar. Klasörler dosyalardan önce görüntülenir.", + "sortOrder": "Gezginde dosya ve klasörlerin sıralamasını denetler. Varsayılan sıralamaya ek olarak, sıralamayı; 'mixed' (dosya ve klasörler karışık olarak sıralanır), 'type' (dosya türüne göre), 'modified' (son düzenlenme tarihine göre) veya 'filesFirst' (dosyaları klasörlerden önce sırala) olarak ayarlayabilirsiniz.", + "explorer.decorations.colors": "Dosya süslemelerinin renkleri kullanıp kullanmayacağını denetler.", + "explorer.decorations.badges": "Dosya süslemelerinin göstergeleri kullanıp kullanmayacağını denetler." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json new file mode 100644 index 000000000000..660d16789d0a --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "userGuide": "Değişikliklerinizi **geri al**mak veya diskteki içeriğin **üzerine yaz**mak için düzenleyicideki araç çubuğunu kullanabilirsiniz", + "discard": "At", + "overwrite": "Üzerine Yaz", + "retry": "Yeniden Dene", + "readonlySaveError": "'{0}' kaydedilemedi: Dosya yazmaya karşı korunuyor. Korumayı kaldırmak için 'Üzerine Yaz'ı seçin.", + "genericSaveError": "'{0}' kaydedilemedi: ({1}).", + "staleSaveError": "'{0}' kaydedilemedi: Diskteki içerik daha yeni. Sizdeki sürüm ile disktekini karşılaştırmak için **Karşılaştır**a tıklayın.", + "compareChanges": "Karşılaştır", + "saveConflictDiffLabel": "{0} (diskte) ↔ {1} ({2} uygulamasında) - Kaydetme çakışmasını çöz" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json new file mode 100644 index 000000000000..78cbb2f07ff9 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/emptyView.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Açık Klasör Yok", + "explorerSection": "Dosya Gezgini Bölümü", + "noWorkspaceHelp": "Çalışma alanına hâlâ bir klasör eklemediniz.", + "addFolder": "Klasör Ekle", + "noFolderHelp": "Henüz bir klasör açmadınız.", + "openFolder": "Klasör Aç" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json new file mode 100644 index 000000000000..5e24e43299f7 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label": "Gezgin", + "canNotResolve": "Çalışma alanı klasörü çözümlenemiyor" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json new file mode 100644 index 000000000000..d8b937fc203b --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Dosya Gezgini Bölümü", + "treeAriaLabel": "Dosya Gezgini" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json new file mode 100644 index 000000000000..f8f351a367f3 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Dosya adı girin. Onaylamak için Enter'a, iptal etmek için Escape tuşuna basın.", + "filesExplorerViewerAriaLabel": "{0}, Dosya Gezgini", + "dropFolders": "Klasörleri çalışma alanına eklemek istiyor musunuz?", + "dropFolder": "Klasörü çalışma alanına eklemek istiyor musunuz?", + "addFolders": "Klasörleri &&Ekle", + "addFolder": "Klasörü &&Ekle", + "confirmMove": "'{0}' ögesini taşımak istediğinizden emin misiniz?", + "doNotAskAgain": "Bir daha sorma", + "moveButtonLabel": "&&Taşı", + "confirmOverwriteMessage": "'{0}' hedef klasörde zaten mevcut. Değiştirmek istiyor musunuz?", + "irreversible": "Bu eylem geri döndürülemez!", + "replaceButtonLabel": "&&Değiştir" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json new file mode 100644 index 000000000000..9f1cee51d987 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditors": "Açık Düzenleyiciler", + "openEditosrSection": "Açık Düzenleyiciler Bölümü", + "dirtyCounter": "{0} kaydedilmemiş", + "saveAll": "Tümünü Kaydet", + "closeAllUnmodified": "Değiştirilmeyenleri Kapat", + "closeAll": "Tümünü Kapat", + "compareWithSaved": "Kaydedilenle Karşılaştır", + "close": "Kapat", + "closeOthers": "Diğerlerini Kapat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json new file mode 100644 index 000000000000..f22af02df4bc --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, Düzenleyici Grubu", + "openEditorAriaLabel": "{0}, Açık Düzenleyici", + "saveAll": "Tümünü Kaydet", + "closeAllUnmodified": "Değiştirilmeyenleri Kapat", + "closeAll": "Tümünü Kapat", + "compareWithSaved": "Kaydedilenle Karşılaştır", + "close": "Kapat", + "closeOthers": "Diğerlerini Kapat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json b/i18n/trk/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json new file mode 100644 index 000000000000..8aeae7211207 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/markers/browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "totalProblems": "Toplam {0} Sorun", + "filteredProblems": "{1} Sorundan {0} Tanesi Gösteriliyor" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/trk/src/vs/workbench/parts/markers/common/messages.i18n.json index 16978d674285..fe543da8a994 100644 --- a/i18n/trk/src/vs/workbench/parts/markers/common/messages.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -6,8 +6,7 @@ { "viewCategory": "Görüntüle", "problems.view.toggle.label": "Sorunları Aç/Kapat", - "problems.view.show.label": "Sorunları Göster", - "problems.view.hide.label": "Sorunları Gizle", + "problems.view.focus.label": "Sorunlara Odakla", "problems.panel.configuration.title": "Sorunlar Görünümü", "problems.panel.configuration.autoreveal": "Sorunlar görünümünün; dosyalar açılırken, dosyaları otomatik olarak ortaya çıkarıp çıkarmayacağını denetler.", "markers.panel.title.problems": "Sorunlar", diff --git a/i18n/trk/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/trk/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json new file mode 100644 index 000000000000..af8637daeca5 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "prof.message": "Profiller başarıyla oluşturuldu.", + "prof.detail": "Lütfen bir sorun (bildirimi) oluşturun ve aşağıdaki dosyaları manuel olarak ekleyin:\n{0}", + "prof.restartAndFileIssue": "Sorun Oluştur ve Yeniden Başlat", + "prof.restart": "Yeniden Başlat", + "prof.thanks": "Bize yardımcı olduğunuz için teşekkürler.", + "prof.detail.restart": "'{0}' uygulamasını kullanmaya devam etmek için son bir yeniden başlatma gerekiyor. Katkılarınız için tekrar teşekkür ederiz." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 68b1055180c5..3078f1cb51e3 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defineKeybinding.initial": "İstenen tuş kombinasyonuna basın ve daha sonra ENTER'a basın. İptal etmek için ESCAPE tuşuna basın.", + "defineKeybinding.initial": "İstenen tuş kombinasyonuna basın ve daha sonra ENTER'a basın.", "defineKeybinding.chordsTo": "ardından" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index db8472465002..1646456ece56 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -26,6 +26,7 @@ "editKeybindingLabel": "Tuş Bağını Değiştir", "addKeybindingLabelWithKey": "{0} Tuş Bağını Ekle", "addKeybindingLabel": "Tuş Bağını Ekle", + "title": "{0} ({1})", "commandAriaLabel": "Komut {0}'dır.", "keybindingAriaLabel": "Tuş bağı {0}'dır.", "noKeybinding": "Tuş bağı atanmamış.", diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index fad9ab4f40b1..a11100c756a1 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openRawDefaultSettings": "Ham Varsayılan Ayarları Aç", "openGlobalSettings": "Kullanıcı Ayarlarını Aç", "openGlobalKeybindings": "Klavye Kısayollarını Aç", "openGlobalKeybindingsFile": "Klavye Kısayolları Dosyasını Aç", diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 5fa332cf96c6..0f7fda7cc49f 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -7,12 +7,12 @@ "settingsEditorName": "Varsayılan Ayarlar", "SearchSettingsWidget.AriaLabel": "Ayarları ara", "SearchSettingsWidget.Placeholder": "Ayarları Ara", - "totalSettingsMessage": "Toplam {0} Ayar", "noSettingsFound": "Sonuç Yok", "oneSettingFound": "1 ayar eşleşti", "settingsFound": "{0} ayar eşleşti", - "fileEditorWithInputAriaLabel": "{0}. Metin dosyası düzenleyici.", - "fileEditorAriaLabel": "Metin dosyası düzenleyici.", + "totalSettingsMessage": "Toplam {0} Ayar", + "defaultSettings": "Varsayılan Ayarlar", + "defaultFolderSettings": "Varsayılan Klasör Ayarları", "defaultEditorReadonly": "Varsayılan ayarları geçersiz kılmak için sağ taraftaki düzeyicide düzenleme yapın.", "preferencesAriaLabel": "Varsayılan tercihler. Salt okunabilir metin editörü." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 94a6b10edb2d..d3014741d724 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -7,8 +7,6 @@ "emptyUserSettingsHeader": "Varsayılan ayarların üzerine yazmak için ayarlarınızı buraya yerleştirin.", "emptyWorkspaceSettingsHeader": "Varsayılan kullanıcı ayarlarının üzerine yazmak için ayarlarınızı buraya yerleştirin.", "emptyFolderSettingsHeader": "Çalışma alanı ayarlarındakilerin üzerine yazmak için klasör ayarlarınızı buraya yerleştirin.", - "defaultFolderSettingsTitle": "Varsayılan Klasör Ayarları", - "defaultSettingsTitle": "Varsayılan Ayarlar", "editTtile": "Düzenle", "replaceDefaultValue": "Ayarlarda Değiştir", "copyDefaultValue": "Ayarlara Kopyala", diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json index e5a6991d06e8..dad393ec3bf0 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "defaultSettingsFuzzyPrompt": "Bulanık aramayı deneyin!", + "defaultSettingsFuzzyPrompt": "Doğal dil aramasını deneyin!", "defaultSettings": "Geçersiz kılmak için ayarlarınızı sağ taraftaki düzeyiciye ekleyin.", "noSettingsFound": "Hiçbir Ayar Bulunamadı.", - "folderSettingsDetails": "Klasör Ayarları", - "enableFuzzySearch": "Deneysel bulanık aramayı etkinleştir" + "settingsSwitcherBarAriaLabel": "Ayar Değiştirici", + "userSettings": "Kullanıcı Ayarları", + "workspaceSettings": "Çalışma Alanı Ayarları", + "folderSettings": "Klasör Ayarları", + "enableFuzzySearch": "Doğal dil aramasını etkinleştir" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json new file mode 100644 index 000000000000..76c311091690 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Varsayılan Tercihler Düzenleyicisi", + "keybindingsEditor": "Tuş Bağları Düzenleyicisi", + "preferences": "Tercihler" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 7d7165d58a61..919a0969127e 100644 --- a/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -6,7 +6,6 @@ { "scm providers": "Kaynak Kontrolü Sağlayıcıları", "hideRepository": "Gizle", - "commitMessage": "Mesaj (commit'lemek için {0} tuşlarına basın)", "installAdditionalSCMProviders": "Ek SCM Sağlayıcıları Yükle...", "no open repo": "Aktif bir kaynak kontrolü sağlayıcısı yok.", "source control": "Kaynak Kontrolü", diff --git a/i18n/trk/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/trk/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json index 138ce93c325c..2f4ab0695026 100644 --- a/i18n/trk/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -5,6 +5,5 @@ // Do not edit this file. It is machine generated. { "defaultLabel": "giriş", - "useIgnoreFilesDescription": "Yok Sayma Dosyalarını Kullan", - "useExcludeSettingsDescription": "Hariç Tutma Ayarlarını Kullan" + "useExcludesAndIgnoreFilesDescription": "Hariç Tutma Ayarlarını ve Yok Sayma Dosyalarını Kullan" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/search/browser/search.contribution.i18n.json index e5f8ce96be93..fd6f32d47d67 100644 --- a/i18n/trk/src/vs/workbench/parts/search/browser/search.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -16,7 +16,6 @@ "exclude.boolean": "Dosya yollarının eşleştirileceği glob deseni. Deseni etkinleştirmek veya devre dışı bırakmak için true veya false olarak ayarlayın.", "exclude.when": "Eşleşen bir dosyanın eşdüzey dosyalarında ek denetim. Eşleşen dosya adı için değişken olarak $(basename) kullanın.", "useRipgrep": "Metin ve dosya aramasında Ripgrep kullanılıp kullanılmayacağını denetler", - "useIgnoreFilesByDefault": "Yeni bir çalışma alanında arama yaparken .gitignore ve .ignore dosyalarının varsayılan olarak kullanılıp kullanılmayacağını denetler.", "useIgnoreFiles": "Dosyaları ararken .gitignore ve .ignore dosyalarının kullanılıp kullanılmayacağını denetler.", "search.quickOpen.includeSymbols": "Dosya sonuçlarındaki bir global sembol aramasının sonuçlarının Hızlı Aç'a dahil edilip edilmeyeceğini yapılandırın.", "search.followSymlinks": "Arama yaparken sembolik linklerin takip edilip edilmeyeceğini denetler." diff --git a/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 416275aedbf3..cf14cf9120f7 100644 --- a/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,17 +10,14 @@ "previousSearchExcludePattern": "Önceki Aramada Hariç Tutulan Kalıbı Göster", "nextSearchTerm": "Sonraki Arama Terimini Göster", "previousSearchTerm": "Önceki Arama Terimini Göster", - "focusNextInputBox": "Sonraki Girdi Kutusuna Odakla", - "focusPreviousInputBox": "Önceki Girdi Kutusuna Odakla", "showSearchViewlet": "Aramayı Göster", "findInFiles": "Dosyalarda Bul", "findInFilesWithSelectedText": "Seçili Metni Dosyalarda Bul", "replaceInFiles": "Dosyalardakileri Değiştir", "replaceInFilesWithSelectedText": "Dosyalardaki Seçili Metni Değiştir", - "findInWorkspace": "Çalışma Alanında Bul...", - "findInFolder": "Klasörde Bul...", "RefreshAction.label": "Yenile", - "ClearSearchResultsAction.label": "Arama Sonuçlarını Temizle", + "CollapseDeepestExpandedLevelAction.label": "Tümünü Daralt", + "ClearSearchResultsAction.label": "Temizle", "FocusNextSearchResult.label": "Sonraki Arama Sonucuna Odakla", "FocusPreviousSearchResult.label": "Önceki Arama Sonucuna Odakla", "RemoveAction.label": "Sonlandır", diff --git a/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json new file mode 100644 index 000000000000..fd6f32d47d67 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Çalışma Alanında Sembole Git...", + "name": "Ara", + "search": "Ara", + "view": "Görüntüle", + "openAnythingHandlerDescription": "Dosyaya Git", + "openSymbolDescriptionNormal": "Çalışma Alanında Sembole Git", + "searchOutputChannelTitle": "Ara", + "searchConfigurationTitle": "Ara", + "exclude": "Aramalarda dosyaları ve klasörleri hariç tutmak için glob desenlerini yapılandırın. files.exclude ayarından, tüm glob desenlerini devralır.", + "exclude.boolean": "Dosya yollarının eşleştirileceği glob deseni. Deseni etkinleştirmek veya devre dışı bırakmak için true veya false olarak ayarlayın.", + "exclude.when": "Eşleşen bir dosyanın eşdüzey dosyalarında ek denetim. Eşleşen dosya adı için değişken olarak $(basename) kullanın.", + "useRipgrep": "Metin ve dosya aramasında Ripgrep kullanılıp kullanılmayacağını denetler", + "useIgnoreFiles": "Dosyaları ararken .gitignore ve .ignore dosyalarının kullanılıp kullanılmayacağını denetler.", + "search.quickOpen.includeSymbols": "Dosya sonuçlarındaki bir global sembol aramasının sonuçlarının Hızlı Aç'a dahil edilip edilmeyeceğini yapılandırın.", + "search.followSymlinks": "Arama yaparken sembolik linklerin takip edilip edilmeyeceğini denetler." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json b/i18n/trk/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json new file mode 100644 index 000000000000..e2063bd2f0ee --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/search/electron-browser/searchActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "findInFolder": "Klasörde Bul...", + "findInWorkspace": "Çalışma Alanında Bul..." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 38414621301c..9719a9bb448b 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -6,10 +6,9 @@ { "tasksCategory": "Görevler", "ConfigureTaskRunnerAction.label": "Görevi Yapılandır", - "ConfigureBuildTaskAction.label": "Derleme Görevini Yapılandır", "CloseMessageAction.label": "Kapat", - "ShowTerminalAction.label": "Terminali Görüntüle", "problems": "Sorunlar", + "building": "Derleniyor...", "manyMarkers": "99+", "runningTasks": "Çalışan Görevleri Göster", "tasks": "Görevler", @@ -52,7 +51,7 @@ "TaslService.noEntryToRun": "Çalıştırılacak hiçbir görev bulunamadı. Görevleri Yapılandır...", "TaskService.fetchingBuildTasks": "Derleme görevleri alınıyor...", "TaskService.pickBuildTask": "Çalıştırılacak derleme görevini seçin", - "TaskService.noBuildTask": "Çalıştırılacak hiçbir derleme görevi bulunamadı. Görevleri Yapılandır...", + "TaskService.noBuildTask": "Çalıştırılacak hiçbir derleme görevi bulunamadı. Derleme Görevini Yapılandır...", "TaskService.fetchingTestTasks": "Test görevleri alınıyor...", "TaskService.pickTestTask": "Çalıştırılacak test görevini seçin", "TaskService.noTestTaskTerminal": "Çalıştırılacak hiçbir test görevi bulunamadı. Görevleri Yapılandır...", diff --git a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 2e339c2d0291..eafabd5ff3c1 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -7,6 +7,7 @@ "TerminalTaskSystem.unknownError": "Görev çalıştırılırken bir hata oluştu. Detaylar için görev çıktısı günlüğüne bakın.", "dependencyFailed": "'{1}' çalışma alanı klasöründe, '{0}' bağımlı görevi çözümlenemiyor", "TerminalTaskSystem.terminalName": "Görev - {0}", + "closeTerminal": "Terminali kapatmak için lütfen bir tuşa basın.", "reuseTerminal": "Terminal görevler tarafından tekrar kullanılacak, kapatmak için herhangi bir tuşa basın.", "TerminalTaskSystem": "UNC sürücüsünde kabuk komutu yürütülemez.", "unkownProblemMatcher": "{0} sorun eşleştirici çözümlenemiyor. Eşleştirici yok sayılacaktır." diff --git a/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index fc4afcade923..c2bd4e04b926 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -14,8 +14,8 @@ "ConfigurationParser.noTypeDefinition": "Hata: '{0}' olarak kayıtlı bir görev türü yok. İlgili görev sağlayıcısını içeren bir eklentiyi yüklemeyi mi unuttunuz?", "ConfigurationParser.missingRequiredProperty": "Hata: ihtiyaç duyulan '{1}' özelliği, '{0}' görev yapılandırmasında eksik. Görev yapılandırması yok sayılacaktır.", "ConfigurationParser.notCustom": "Hata: 'tasks' bir özel görev olarak tanımlanmamış. Yapılandırma yok sayılacaktır.\n{0}\n", - "ConfigurationParser.noTaskName": "Hata: 'tasks' bir 'taskName' özelliği belirtmelidir. Görev yok sayılacaktır.\n{0}\n", - "taskConfiguration.shellArgs": "Uyarı: '{0}' görevi bir kabuk komutudur ve komut adı veya argümanlarından biri kaçış karakteri içermeyen boşluklar içeriyor. Doğru komut satırı alıntılamasını sağlamak için lütfen argümanları komutlarla birleştirin.", + "ConfigurationParser.noTaskName": "Hata: bir görev, bir 'label' özelliği belirtmelidir. Görev yok sayılacaktır.\n{0}\n", + "taskConfiguration.shellArgs": "Uyarı: '{0}' görevi bir kabuk komutudur ve argümanlarından biri kaçış karakteri içermeyen boşluklar içeriyor olabilir. Doğru komut satırı alıntısını sağlamak için lütfen argümanları komutlarla birleştirin.", "taskConfiguration.noCommandOrDependsOn": "Hata: '{0}' görevi bir komut veya dependsOn özelliği belirtmiyor. Görev yok sayılacaktır. Görevin tanımı:\n{1}", "taskConfiguration.noCommand": "Hata: '{0}' görevi bir komut tanımlamıyor. Görev yok sayılacaktır. Görevin tanımı:\n{1}", "TaskParse.noOsSpecificGlobalTasks": "2.0.0 görev sürümü genel işletim sistemi özel görevlerini desteklemiyor. Bunları işletim sistemine özel komut içeren bir göreve çevirin. Etkilenen görevler:\n{0}" diff --git a/i18n/trk/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json b/i18n/trk/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json index 82b1bdbdd460..f2bb55a8b4e0 100644 --- a/i18n/trk/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.i18n.json @@ -6,7 +6,7 @@ { "termEntryAriaLabel": "{0}, terminal seçici", "termCreateEntryAriaLabel": "{0}, yeni terminal oluştur", - "'workbench.action.terminal.newplus": "$(plus) Yeni Entegre Terminal Oluştur", + "workbench.action.terminal.newplus": "$(plus) Yeni Entegre Terminal Oluştur", "noTerminalsMatching": "Eşleşen terminal yok", "noTerminalsFound": "Açık terminal yok" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index ef4e0417b9d6..c6efd8526462 100644 --- a/i18n/trk/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,13 +5,15 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "Renk Teması", + "themes.category.light": "açık temalar", + "themes.category.dark": "koyu temalar", + "themes.category.hc": "yüksek karşıtlık temaları", "installColorThemes": "Ek Renk Temaları Yükle...", "themes.selectTheme": "Bir Renk Teması Seç (Yukarı/Aşağı Tuşlarıyla Önizleme Yap)", "selectIconTheme.label": "Dosya Simgesi Teması", - "installIconThemes": "Ek Dosya Simgesi Temaları Yükle...", "noIconThemeLabel": "Hiçbiri", "noIconThemeDesc": "Dosya simgelerini devre dışı bırak", - "problemChangingIconTheme": "Simge temasını ayarlama sorunu: {0}", + "installIconThemes": "Ek Dosya Simgesi Temaları Yükle...", "themes.selectIconTheme": "Dosya Simgesi Teması Seç", "generateColorTheme.label": "Geçerli Ayarlardan Renk Teması Oluştur", "preferences": "Tercihler", diff --git a/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 4c2ceda75b65..917d84504003 100644 --- a/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -9,9 +9,9 @@ "scope.window.description": "Kullanıcı veya çalışma alanında yapılandırılabilen Windows'a özel yapılandırma.", "scope.resource.description": "Kullanıcı veya çalışma alanında yapılandırılabilen kaynağa özel yapılandırma.", "scope.description": "Yapılandırmanın uygulanabilir olduğu kapsam. Mevcut kapsamlar 'window' ve 'resource'tır.", + "vscode.extension.contributes.defaultConfiguration": "Varsayılan düzenleyici yapılandırma ayarlarına dil bazında ekleme yapar.", "vscode.extension.contributes.configuration": "Yapılandırma ayarlarına ekleme yapar.", "invalid.title": "'configuration.title' bir dize olmalıdır", - "vscode.extension.contributes.defaultConfiguration": "Varsayılan düzenleyici yapılandırma ayarlarına dil bazında ekleme yapar.", "invalid.properties": "'configuration.properties' bir nesne olmalıdır", "invalid.allOf": "'configuration.allOf' kullanım dışıdır ve artık kullanılmamalıdır. Bunun yerine, birden çok yapılandırma bölümlerini bir dizi olarak 'configuration' ekleme noktasına geçirin.", "workspaceConfig.folders.description": "Çalışma alanına yüklenecek klasörler listesi.", diff --git a/i18n/trk/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json b/i18n/trk/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json new file mode 100644 index 000000000000..4289f712979c --- /dev/null +++ b/i18n/trk/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetri", + "telemetry.enableCrashReporting": "Kilitlenme raporlarının Microsoft'a gönderilmesini etkinleştirin.\nBu seçeneğin yürürlüğe girmesi için yeniden başlatma gerekir." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index 778ed05c3e78..24290675b551 100644 --- a/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "bubbleTitle": "vurgulanan öğeler içeriyor" + "bubbleTitle": "Vurgulanan öğeler içeriyor" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json b/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json new file mode 100644 index 000000000000..1c8a872ac883 --- /dev/null +++ b/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "message": "$(zap) Eklenti Sunucusu Ayrımlanıyor..." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index f94d7e7d32f3..305fd56ccc7c 100644 --- a/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -9,5 +9,6 @@ "extensionHostProcess.crash": "Eklenti sunucusu beklenmeyen biçimde sonlandırıldı.", "extensionHostProcess.unresponsiveCrash": "Eklenti sunucusu yanıt vermediğinden sonlandırıldı.", "overwritingExtension": "{0} eklentisinin üzerine {1} yazılıyor.", - "extensionUnderDevelopment": "{0} konumundaki geliştirme eklentisi yükleniyor" + "extensionUnderDevelopment": "{0} konumundaki geliştirme eklentisi yükleniyor", + "extensionCache.invalid": "Eklentiler disk üzerinde değişime uğradı. Lütfen pencereyi yeniden yükleyin." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/trk/src/vs/workbench/services/files/node/fileService.i18n.json index 0c8d70cb473d..4604d836bb64 100644 --- a/i18n/trk/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/files/node/fileService.i18n.json @@ -8,8 +8,8 @@ "fileIsDirectoryError": "Dosya bir dizindir", "fileNotModifiedError": "Dosya şu tarihten beri değiştirilmemiş:", "fileTooLargeError": "Dosya, açmak için çok büyük", - "fileBinaryError": "Dosya ikili olarak görünüyor ve metin olarak açılamıyor", "fileNotFoundError": "Dosya bulunamadı ({0})", + "fileBinaryError": "Dosya ikili olarak görünüyor ve metin olarak açılamıyor", "fileExists": "Oluşturulacak dosya zaten mevcut ({0})", "fileMoveConflict": "Taşıma/kopyalama yapılamadı. Dosya, hedefte zaten mevcut.", "unableToMoveCopyError": "Taşıma/kopyalama yapılamadı. Dosya, içinde bulunduğu klasörü değiştiriyor.", diff --git a/i18n/trk/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/trk/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 2aa6fbc364a6..4a33b67187cb 100644 --- a/i18n/trk/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -22,5 +22,5 @@ "keybindings.json.when": "Tuşun aktif olacağı koşul", "keybindings.json.args": "Yürütülecek komuta iletilecek argümanlar.", "keyboardConfigurationTitle": "Klavye", - "dispatch": "Tuş basımlarının ya `keydown.code` (önerilen) ya da ` keydown.keyCode` kullanarak gönderilmesini denetler." + "dispatch": "Tuş basımlarının ya `code` (önerilen) ya da `keyCode` kullanarak gönderilmesini denetler." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/trk/src/vs/workbench/services/textfile/common/textFileService.i18n.json index d3399a79e656..5b46633251d6 100644 --- a/i18n/trk/src/vs/workbench/services/textfile/common/textFileService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "files.backup.failSave": "Dosyalar yedeklenemedi (Hata: {0}), çıkmak için dosyalarınızı kaydetmeyi deneyin." + "files.backup.failSave": "Kaydedilmemiş değişiklikler içeren dosyalar yedekleme konumuna yazılamadı. (Hata: {0}). Önce dosyalarınızı kaydetmeyi deneyin ve ardından kapatın." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/trk/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 6715de583322..06e828ba73e2 100644 --- a/i18n/trk/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "migration.completed": "Yeni tema ayarları kullanıcı ayarlarına eklendi. Yedek, {0} konumunda mevcuttur.", "error.cannotloadtheme": "{0} yüklenemedi: {1}", - "error.cannotloadicontheme": "{0} yüklenemedi", "colorTheme": "Çalışma ekranında kullanılan renk temasını belirtir.", "colorThemeError": "Tema bilinmiyor veya yüklenmemiş.", "iconTheme": "Çalışma ekranında kullanılan simge temasını veya hiçbir dosya simgesi göstermemek için 'null' belirtir.", diff --git a/package.json b/package.json index d902790fbfe2..8535979bdf1b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", - "version": "1.19.0", - "distro": "11ff877087592418b32fc1b49bb18bc5f77341e1", + "version": "1.20.0", + "distro": "3e04fd7a1141705f5e82fb1175edc03d0d4ddf9c", "author": { "name": "Microsoft Corporation" }, @@ -34,12 +34,13 @@ "minimist": "1.2.0", "native-keymap": "1.2.5", "native-watchdog": "0.3.0", - "node-pty": "0.7.3", + "node-pty": "0.7.4", "nsfw": "1.0.16", "semver": "4.3.6", - "v8-profiler": "jrieken/v8-profiler#vscode", + "spdlog": "0.3.7", + "v8-inspect-profiler": "^0.0.7", "vscode-chokidar": "1.6.2", - "vscode-debugprotocol": "1.25.0-pre.0", + "vscode-debugprotocol": "1.25.0", "vscode-ripgrep": "^0.6.0-patch.0.5", "vscode-textmate": "^3.2.0", "xterm": "Tyriar/xterm.js#vscode-release/1.19", @@ -64,7 +65,7 @@ "flatpak-bundler": "^0.1.1", "glob": "^5.0.13", "gulp": "^3.8.9", - "gulp-atom-electron": "^1.11.0", + "gulp-atom-electron": "1.15.1", "gulp-azure-storage": "^0.7.0", "gulp-bom": "^1.0.0", "gulp-buffer": "0.0.2", diff --git a/resources/linux/bin/code.sh b/resources/linux/bin/code.sh index bb146af861fc..088bcf8b2abb 100755 --- a/resources/linux/bin/code.sh +++ b/resources/linux/bin/code.sh @@ -12,7 +12,7 @@ if [ "$(id -u)" = "0" ]; then fi done if [ -z $DATA_DIR_SET ]; then - echo "It is recommended to start vscode as a normal user. To run as root, you must specify an alternate user data directory with the --user-data-dir argument." 1>&2 + echo "You are trying to start vscode as a super user which is not recommended. If you really want to, you must specify an alternate user data directory using the --user-data-dir argument." 1>&2 exit 1 fi fi diff --git a/src/main.js b/src/main.js index 7b31fc5dcabf..3192f1f086ca 100644 --- a/src/main.js +++ b/src/main.js @@ -5,13 +5,6 @@ 'use strict'; -if (process.argv.indexOf('--prof-startup') >= 0) { - var profiler = require('v8-profiler'); - var prefix = require('crypto').randomBytes(2).toString('hex'); - process.env.VSCODE_PROFILES_PREFIX = prefix; - profiler.startProfiling('main', true); -} - var perf = require('./vs/base/common/performance'); perf.mark('main:started'); @@ -122,6 +115,10 @@ function getNLSConfiguration() { } function getNodeCachedDataDir() { + // flag to disable cached data support + if (process.argv.indexOf('--no-cached-data') > 0) { + return Promise.resolve(undefined); + } // IEnvironmentService.isBuilt if (process.env['VSCODE_DEV']) { diff --git a/src/tsconfig.json b/src/tsconfig.json index 2d516dd23132..e8f68d0088db 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -13,8 +13,9 @@ "noUnusedLocals": true, "noImplicitThis": true, "baseUrl": ".", + "outDir": "../out", "typeRoots": [ "typings" ] } -} \ No newline at end of file +} diff --git a/src/typings/node.d.ts b/src/typings/node.d.ts index 05c02cd26b9f..37db4dd80f0e 100644 --- a/src/typings/node.d.ts +++ b/src/typings/node.d.ts @@ -2718,9 +2718,9 @@ declare module "fs" { export function writeFile(filename: string | number, data: any, encoding: string, callback: (err: NodeJS.ErrnoException) => void): void; export function writeFile(filename: string | number, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; export function writeFile(filename: string | number, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFileSync(filename: string, data: any, encoding: string): void; - export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; - export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; + export function writeFileSync(filename: string | number, data: any, encoding: string): void; + export function writeFileSync(filename: string | number, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; + export function writeFileSync(filename: string | number, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; export function appendFile(filename: string, data: any, encoding: string, callback: (err: NodeJS.ErrnoException) => void): void; export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; diff --git a/src/typings/spdlog.d.ts b/src/typings/spdlog.d.ts new file mode 100644 index 000000000000..ef93a9cf8000 --- /dev/null +++ b/src/typings/spdlog.d.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'spdlog' { + + export const version: string; + export function setAsyncMode(bufferSize: number, flushInterval: number); + + export enum LogLevel { + CRITICAL, + ERROR, + WARN, + INFO, + DEBUG, + TRACE, + OFF + } + + export class RotatingLogger { + constructor(name: string, filename: string, filesize: number, filecount: number); + + trace(message: string); + debug(message: string); + info(message: string); + warn(message: string); + error(message: string); + critical(message: string); + setLevel(level: number); + flush(): void; + drop(): void; + } +} \ No newline at end of file diff --git a/src/typings/v8-inspect-profiler.d.ts b/src/typings/v8-inspect-profiler.d.ts new file mode 100644 index 000000000000..50449c7ae10d --- /dev/null +++ b/src/typings/v8-inspect-profiler.d.ts @@ -0,0 +1,37 @@ +declare module 'v8-inspect-profiler' { + + export interface ProfileResult { + profile: Profile; + } + + export interface Profile { + nodes: ProfileNode[]; + samples?: number[]; + timeDeltas?: number[]; + startTime: number; + endTime: number; + } + + export interface ProfileNode { + id: number; + hitCount?: number; + children?: number[]; + callFrame: { + url: string; + scriptId: string; + functionName: string; + lineNumber: number; + columnNumber: number; + }; + deoptReason?: string; + positionTicks?: { line: number; ticks: number }[]; + } + + export interface ProfilingSession { + stop(afterDelay?: number): PromiseLike; + } + + export function startProfiling(options: { port: number, tries?: number, retyWait?: number }): PromiseLike; + export function writeProfile(profile: ProfileResult, name?: string): PromiseLike; + export function rewriteAbsolutePaths(profile, replaceWith?); +} diff --git a/src/vs/base/browser/builder.ts b/src/vs/base/browser/builder.ts index 48003c5f48c8..1fa18942cf13 100644 --- a/src/vs/base/browser/builder.ts +++ b/src/vs/base/browser/builder.ts @@ -70,30 +70,6 @@ let DATA_BINDING_ID = '__$binding'; let LISTENER_BINDING_ID = '__$listeners'; let VISIBILITY_BINDING_ID = '__$visibility'; -export class Position { - public x: number; - public y: number; - - constructor(x: number, y: number) { - this.x = x; - this.y = y; - } -} - -export class Box { - public top: number; - public right: number; - public bottom: number; - public left: number; - - constructor(top: number, right: number, bottom: number, left: number) { - this.top = top; - this.right = right; - this.bottom = bottom; - this.left = left; - } -} - export class Dimension { public width: number; public height: number; @@ -102,15 +78,6 @@ export class Dimension { this.width = width; this.height = height; } - - public substract(box: Box): Dimension { - return new Dimension(this.width - box.left - box.right, this.height - box.top - box.bottom); - } -} - -export interface IRange { - start: number; - end: number; } function data(element: any): any { @@ -336,18 +303,6 @@ export class Builder implements IDisposable { return this.doElement('ul', attributes, fn); } - /** - * Creates a new element of this kind as child of the current element or parent. - * Accepts an object literal as first parameter that can be used to describe the - * attributes of the element. - * Accepts a function as second parameter that can be used to create child elements - * of the element. The function will be called with a new builder created with the - * provided element. - */ - public ol(attributes?: any, fn?: (builder: Builder) => void): Builder { - return this.doElement('ol', attributes, fn); - } - /** * Creates a new element of this kind as child of the current element or parent. * Accepts an object literal as first parameter that can be used to describe the @@ -396,42 +351,6 @@ export class Builder implements IDisposable { return this.doElement('a', attributes, fn); } - /** - * Creates a new element of this kind as child of the current element or parent. - * Accepts an object literal as first parameter that can be used to describe the - * attributes of the element. - * Accepts a function as second parameter that can be used to create child elements - * of the element. The function will be called with a new builder created with the - * provided element. - */ - public header(attributes?: any, fn?: (builder: Builder) => void): Builder { - return this.doElement('header', attributes, fn); - } - - /** - * Creates a new element of this kind as child of the current element or parent. - * Accepts an object literal as first parameter that can be used to describe the - * attributes of the element. - * Accepts a function as second parameter that can be used to create child elements - * of the element. The function will be called with a new builder created with the - * provided element. - */ - public section(attributes?: any, fn?: (builder: Builder) => void): Builder { - return this.doElement('section', attributes, fn); - } - - /** - * Creates a new element of this kind as child of the current element or parent. - * Accepts an object literal as first parameter that can be used to describe the - * attributes of the element. - * Accepts a function as second parameter that can be used to create child elements - * of the element. The function will be called with a new builder created with the - * provided element. - */ - public footer(attributes?: any, fn?: (builder: Builder) => void): Builder { - return this.doElement('footer', attributes, fn); - } - /** * Creates a new element of given tag name as child of the current element or parent. * Accepts an object literal as first parameter that can be used to describe the @@ -488,30 +407,6 @@ export class Builder implements IDisposable { return this; } - /** - * Returns true if the current element of this builder is the active element. - */ - public hasFocus(): boolean { - let activeElement: Element = document.activeElement; - - return (activeElement === this.currentElement); - } - - /** - * Calls select() on the current HTML element; - */ - public domSelect(range: IRange = null): Builder { - let input = this.currentElement; - - input.select(); - - if (range) { - input.setSelectionRange(range.start, range.end); - } - - return this; - } - /** * Calls blur() on the current HTML element; */ @@ -521,15 +416,6 @@ export class Builder implements IDisposable { return this; } - /** - * Calls click() on the current HTML element; - */ - public domClick(): Builder { - this.currentElement.click(); - - return this; - } - /** * Registers listener on event types on the current element. */ @@ -645,30 +531,6 @@ export class Builder implements IDisposable { return this; } - /** - * Registers listener on event types on the current element and causes - * the event to prevent default execution (e.preventDefault()). If the - * parameter "cancelBubble" is set to true, it will also prevent bubbling - * of the event. - */ - public preventDefault(type: string, cancelBubble: boolean, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder; - public preventDefault(typesArray: string[], cancelBubble: boolean, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder; - public preventDefault(arg1: any, cancelBubble: boolean, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder { - let fn = function (e: Event) { - e.preventDefault(); - - if (cancelBubble) { - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; - } - } - }; - - return this.on(arg1, fn, listenerToUnbindContainer, useCapture); - } - /** * This method has different characteristics based on the parameter provided: * a) a single string passed in as argument will return the attribute value using the @@ -745,24 +607,6 @@ export class Builder implements IDisposable { return this; } - /** - * Sets the src attribute to the value provided for the current HTML element of the builder. - */ - public src(src: string): Builder { - this.currentElement.setAttribute('src', src); - - return this; - } - - /** - * Sets the href attribute to the value provided for the current HTML element of the builder. - */ - public href(href: string): Builder { - this.currentElement.setAttribute('href', href); - - return this; - } - /** * Sets the title attribute to the value provided for the current HTML element of the builder. */ @@ -772,15 +616,6 @@ export class Builder implements IDisposable { return this; } - /** - * Sets the name attribute to the value provided for the current HTML element of the builder. - */ - public name(name: string): Builder { - this.currentElement.setAttribute('name', name); - - return this; - } - /** * Sets the type attribute to the value provided for the current HTML element of the builder. */ @@ -799,24 +634,6 @@ export class Builder implements IDisposable { return this; } - /** - * Sets the alt attribute to the value provided for the current HTML element of the builder. - */ - public alt(alt: string): Builder { - this.currentElement.setAttribute('alt', alt); - - return this; - } - - /** - * Sets the name draggable to the value provided for the current HTML element of the builder. - */ - public draggable(isDraggable: boolean): Builder { - this.currentElement.setAttribute('draggable', isDraggable ? 'true' : 'false'); - - return this; - } - /** * Sets the tabindex attribute to the value provided for the current HTML element of the builder. */ @@ -960,22 +777,6 @@ export class Builder implements IDisposable { return this; } - /** - * Sets the first class to the current HTML element of the builder if the second class is currently set - * and vice versa otherwise. - */ - public swapClass(classA: string, classB: string): Builder { - if (this.hasClass(classA)) { - this.removeClass(classA); - this.addClass(classB); - } else { - this.removeClass(classB); - this.addClass(classA); - } - - return this; - } - /** * Adds or removes the provided className for the current HTML element of the builder. */ @@ -998,15 +799,6 @@ export class Builder implements IDisposable { return this; } - /** - * Sets the CSS property background. - */ - public background(color: string): Builder { - this.currentElement.style.backgroundColor = color; - - return this; - } - /** * Sets the CSS property padding. */ @@ -1169,71 +961,6 @@ export class Builder implements IDisposable { return this; } - /** - * Sets the CSS property float. - */ - public float(float: string): Builder { - this.currentElement.style.cssFloat = float; - - return this; - } - - /** - * Sets the CSS property clear. - */ - public clear(clear: string): Builder { - this.currentElement.style.clear = clear; - - return this; - } - - /** - * Sets the CSS property for fonts back to default. - */ - public normal(): Builder { - this.currentElement.style.fontStyle = 'normal'; - this.currentElement.style.fontWeight = 'normal'; - this.currentElement.style.textDecoration = 'none'; - - return this; - } - - /** - * Sets the CSS property font-style to italic. - */ - public italic(): Builder { - this.currentElement.style.fontStyle = 'italic'; - - return this; - } - - /** - * Sets the CSS property font-weight to bold. - */ - public bold(): Builder { - this.currentElement.style.fontWeight = 'bold'; - - return this; - } - - /** - * Sets the CSS property text-decoration to underline. - */ - public underline(): Builder { - this.currentElement.style.textDecoration = 'underline'; - - return this; - } - - /** - * Sets the CSS property overflow. - */ - public overflow(overflow: string): Builder { - this.currentElement.style.overflow = overflow; - - return this; - } - /** * Sets the CSS property display. */ @@ -1243,18 +970,6 @@ export class Builder implements IDisposable { return this; } - public disable(): Builder { - this.currentElement.setAttribute('disabled', 'disabled'); - - return this; - } - - public enable(): Builder { - this.currentElement.removeAttribute('disabled'); - - return this; - } - /** * Shows the current element of the builder. */ @@ -1439,24 +1154,6 @@ export class Builder implements IDisposable { return this; } - /** - * Sets the CSS property text-align. - */ - public textAlign(textAlign: string): Builder { - this.currentElement.style.textAlign = textAlign; - - return this; - } - - /** - * Sets the CSS property vertical-align. - */ - public verticalAlign(valign: string): Builder { - this.currentElement.style.verticalAlign = valign; - - return this; - } - private toPixel(obj: any): string { if (obj.toString().indexOf('px') === -1) { return obj.toString() + 'px'; @@ -1507,32 +1204,6 @@ export class Builder implements IDisposable { return this.innerHtml(strings.escape(html), append); } - /** - * Adds the provided object as property to the current element. Call getBinding() - * to retrieve it again. - */ - public bind(object: any): Builder { - bindElement(this.currentElement, object); - - return this; - } - - /** - * Removes the binding of the current element. - */ - public unbind(): Builder { - unbindElement(this.currentElement); - - return this; - } - - /** - * Returns the object that was passed into the bind() call. - */ - public getBinding(): any { - return getBindingFromElement(this.currentElement); - } - /** * Allows to store arbritary data into the current element. */ @@ -1560,29 +1231,6 @@ export class Builder implements IDisposable { return this; } - /** - * Returns a new builder with the parent element of the current element of the builder. - */ - public parent(offdom?: boolean): Builder { - assert.ok(!this.offdom, 'Builder was created with offdom = true and thus has no parent set'); - - return withElement(this.currentElement.parentNode, offdom); - } - - /** - * Returns a new builder with all child elements of the current element of the builder. - */ - public children(offdom?: boolean): MultiBuilder { - let children = this.currentElement.children; - - let builders: Builder[] = []; - for (let i = 0; i < children.length; i++) { - builders.push(withElement(children.item(i), offdom)); - } - - return new MultiBuilder(builders); - } - /** * Returns a new builder with the child at the given index. */ @@ -1592,55 +1240,6 @@ export class Builder implements IDisposable { return withElement(children.item(index)); } - /** - * Removes the current HTMLElement from the given builder from this builder if this builders - * current HTMLElement is the direct parent. - */ - public removeChild(builder: Builder): Builder { - if (this.currentElement === builder.parent().getHTMLElement()) { - this.currentElement.removeChild(builder.getHTMLElement()); - } - - return this; - } - - /** - * Returns a new builder with all elements matching the provided selector scoped to the - * current element of the builder. Use Build.withElementsBySelector() to run the selector - * over the entire DOM. - * The returned builder is an instance of array that can have 0 elements if the selector does not match any - * elements. - */ - public select(selector: string, offdom?: boolean): MultiBuilder { - assert.ok(types.isString(selector), 'Expected String as parameter'); - - let elements = this.currentElement.querySelectorAll(selector); - - let builders: Builder[] = []; - for (let i = 0; i < elements.length; i++) { - builders.push(withElement(elements.item(i), offdom)); - } - - return new MultiBuilder(builders); - } - - /** - * Returns true if the current element of the builder matches the given selector and false otherwise. - */ - public matches(selector: string): boolean { - let element = this.currentElement; - let matches = (element).webkitMatchesSelector || (element).mozMatchesSelector || (element).msMatchesSelector || (element).oMatchesSelector; - - return matches && matches.call(element, selector); - } - - /** - * Returns true if the current element of the builder has no children. - */ - public isEmpty(): boolean { - return !this.currentElement.childNodes || this.currentElement.childNodes.length === 0; - } - /** * Recurse through all descendant nodes and remove their data binding. */ @@ -1691,6 +1290,7 @@ export class Builder implements IDisposable { * Removes all HTML elements from the current element of the builder. */ public clearChildren(): Builder { + // Remove Elements if (this.currentElement) { DOM.clearNode(this.currentElement); @@ -1772,16 +1372,6 @@ export class Builder implements IDisposable { return new Dimension(totalWidth, totalHeight); } - /** - * Gets the size (in pixels) of the inside of the element, excluding the border and padding. - */ - public getContentSize(): Dimension { - let contentWidth = DOM.getContentWidth(this.currentElement); - let contentHeight = DOM.getContentHeight(this.currentElement); - - return new Dimension(contentWidth, contentHeight); - } - /** * Another variant of getting the inner dimensions of an element. */ @@ -1910,74 +1500,9 @@ export class MultiBuilder extends Builder { this.length = this.builders.length; } - public pop(): Builder { - let element = this.builders.pop(); - this.length = this.builders.length; - - return element; - } - - public concat(items: Builder[]): Builder[] { - let elements = this.builders.concat(items); - this.length = this.builders.length; - - return elements; - } - - public shift(): Builder { - let element = this.builders.shift(); - this.length = this.builders.length; - - return element; - } - - public unshift(item: Builder): number { - let res = this.builders.unshift(item); - this.length = this.builders.length; - - return res; - } - - public slice(start: number, end?: number): Builder[] { - let elements = this.builders.slice(start, end); - this.length = this.builders.length; - - return elements; - } - - public splice(start: number, deleteCount?: number): Builder[] { - let elements = this.builders.splice(start, deleteCount); - this.length = this.builders.length; - - return elements; - } - public clone(): MultiBuilder { return new MultiBuilder(this); } - - public and(element: HTMLElement): MultiBuilder; - public and(builder: Builder): MultiBuilder; - public and(obj: any): MultiBuilder { - - // Convert HTMLElement to Builder as necessary - if (!(obj instanceof Builder) && !(obj instanceof MultiBuilder)) { - obj = new Builder((obj)); - } - - let builders: Builder[] = []; - if (obj instanceof MultiBuilder) { - for (let i = 0; i < (obj).length; i++) { - builders.push((obj).item(i)); - } - } else { - builders.push(obj); - } - - this.push.apply(this, builders); - - return this; - } } function withBuilder(builder: Builder, offdom?: boolean): Builder { @@ -1988,7 +1513,7 @@ function withBuilder(builder: Builder, offdom?: boolean): Builder { return new Builder(builder.getHTMLElement(), offdom); } -function withElement(element: HTMLElement, offdom?: boolean): Builder { +export function withElement(element: HTMLElement, offdom?: boolean): Builder { return new Builder(element, offdom); } @@ -2019,15 +1544,6 @@ export function getPropertyFromElement(element: HTMLElement, key: string, fallba return fallback; } -/** - * Removes a property from an element. - */ -export function removePropertyFromElement(element: HTMLElement, key: string): void { - if (hasData(element)) { - delete data(element)[key]; - } -} - /** * Adds the provided object as property to the given element. Call getBinding() * to retrieve it again. @@ -2036,29 +1552,6 @@ export function bindElement(element: HTMLElement, object: any): void { setPropertyOnElement(element, DATA_BINDING_ID, object); } -/** - * Removes the binding of the given element. - */ -export function unbindElement(element: HTMLElement): void { - removePropertyFromElement(element, DATA_BINDING_ID); -} - -/** - * Returns the object that was passed into the bind() call for the element. - */ -export function getBindingFromElement(element: HTMLElement): any { - return getPropertyFromElement(element, DATA_BINDING_ID); -} - -export const Binding = { - setPropertyOnElement: setPropertyOnElement, - getPropertyFromElement: getPropertyFromElement, - removePropertyFromElement: removePropertyFromElement, - bindElement: bindElement, - unbindElement: unbindElement, - getBindingFromElement: getBindingFromElement -}; - let SELECTOR_REGEX = /([\w\-]+)?(#([\w\-]+))?((.([\w\-]+))*)/; export const $: QuickBuilder = function (arg?: any): Builder { @@ -2151,10 +1644,6 @@ export const $: QuickBuilder = function (arg?: any): Builder { } }; -($).Box = Box; ($).Dimension = Dimension; -($).Position = Position; ($).Builder = Builder; -($).MultiBuilder = MultiBuilder; ($).Build = Build; -($).Binding = Binding; \ No newline at end of file diff --git a/src/vs/base/browser/dnd.ts b/src/vs/base/browser/dnd.ts index 7ca472fe69eb..b95e397071f3 100644 --- a/src/vs/base/browser/dnd.ts +++ b/src/vs/base/browser/dnd.ts @@ -39,4 +39,23 @@ export class DelayedDragHandler { public dispose(): void { this.clearDragTimeout(); } -} \ No newline at end of file +} + +// Common data transfers +export const DataTransfers = { + + /** + * Application specific resource transfer type. + */ + URL: 'URL', + + /** + * Browser specific transfer type to download. + */ + DOWNLOAD_URL: 'DownloadURL', + + /** + * Typicaly transfer type for copy/paste transfers. + */ + TEXT: 'text/plain' +}; \ No newline at end of file diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index d3a0f38d8c83..8bb4ed5e3316 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -477,22 +477,13 @@ const sizeUtils = { getBorderTopWidth: function (element: HTMLElement): number { return getDimension(element, 'border-top-width', 'borderTopWidth'); }, - getBorderRightWidth: function (element: HTMLElement): number { - return getDimension(element, 'border-right-width', 'borderRightWidth'); - }, getBorderBottomWidth: function (element: HTMLElement): number { return getDimension(element, 'border-bottom-width', 'borderBottomWidth'); }, - getPaddingLeft: function (element: HTMLElement): number { - return getDimension(element, 'padding-left', 'paddingLeft'); - }, getPaddingTop: function (element: HTMLElement): number { return getDimension(element, 'padding-top', 'paddingTop'); }, - getPaddingRight: function (element: HTMLElement): number { - return getDimension(element, 'padding-right', 'paddingRight'); - }, getPaddingBottom: function (element: HTMLElement): number { return getDimension(element, 'padding-bottom', 'paddingBottom'); }, @@ -588,14 +579,6 @@ export const StandardWindow: IStandardWindow = new class { } }; -// Adapted from WinJS -// Gets the width of the content of the specified element. The content width does not include borders or padding. -export function getContentWidth(element: HTMLElement): number { - let border = sizeUtils.getBorderLeftWidth(element) + sizeUtils.getBorderRightWidth(element); - let padding = sizeUtils.getPaddingLeft(element) + sizeUtils.getPaddingRight(element); - return element.offsetWidth - border - padding; -} - // Adapted from WinJS // Gets the width of the element, including margins. export function getTotalWidth(element: HTMLElement): number { diff --git a/src/vs/base/browser/htmlContentRenderer.ts b/src/vs/base/browser/htmlContentRenderer.ts index 1a0097aadf8c..d9cc2348e9c1 100644 --- a/src/vs/base/browser/htmlContentRenderer.ts +++ b/src/vs/base/browser/htmlContentRenderer.ts @@ -8,16 +8,16 @@ import * as DOM from 'vs/base/browser/dom'; import { defaultGenerator } from 'vs/base/common/idGenerator'; import { escape } from 'vs/base/common/strings'; -import { TPromise } from 'vs/base/common/winjs.base'; import { removeMarkdownEscapes, IMarkdownString } from 'vs/base/common/htmlContent'; import { marked } from 'vs/base/common/marked/marked'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { isThenable } from 'vs/base/common/async'; export interface RenderOptions { className?: string; inline?: boolean; actionCallback?: (content: string, event?: IMouseEvent) => void; - codeBlockRenderer?: (modeId: string, value: string) => string | TPromise; + codeBlockRenderer?: (modeId: string, value: string) => string | Thenable; } function createElement(options: RenderOptions): HTMLElement { @@ -53,7 +53,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: RenderOptions // signal to code-block render that the // element has been created let signalInnerHTML: Function; - const withInnerHTML = new TPromise(c => signalInnerHTML = c); + const withInnerHTML = new Promise(c => signalInnerHTML = c); const renderer = new marked.Renderer(); renderer.image = (href: string, title: string, text: string) => { @@ -122,17 +122,17 @@ export function renderMarkdown(markdown: IMarkdownString, options: RenderOptions return value; } - if (TPromise.is(value)) { + if (isThenable(value)) { // when code-block rendering is async we return sync // but update the node with the real result later. const id = defaultGenerator.nextId(); - TPromise.join([value, withInnerHTML]).done(values => { + Promise.all([value, withInnerHTML]).then(values => { const strValue = values[0] as string; const span = element.querySelector(`div[data-code="${id}"]`); if (span) { span.innerHTML = strValue; } - }, err => { + }).catch(err => { // ignore }); return `
${escape(code)}
`; diff --git a/src/vs/base/browser/touch.ts b/src/vs/base/browser/touch.ts index 27b3fb546bfb..57c603edcbb8 100644 --- a/src/vs/base/browser/touch.ts +++ b/src/vs/base/browser/touch.ts @@ -7,6 +7,7 @@ import arrays = require('vs/base/common/arrays'); import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import DomUtils = require('vs/base/browser/dom'); +import { memoize } from 'vs/base/common/decorators'; export namespace EventType { export const Tap = '-monaco-gesturetap'; @@ -35,8 +36,6 @@ export interface GestureEvent extends MouseEvent { pageY: number; } -export const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0 || window.navigator.msMaxTouchPoints > 0; - interface Touch { identifier: number; screenX: number; @@ -67,55 +66,53 @@ interface TouchEvent extends Event { export class Gesture implements IDisposable { - private static readonly HOLD_DELAY = 700; private static readonly SCROLL_FRICTION = -0.005; + private static INSTANCE: Gesture; + private static HOLD_DELAY = 700; - private targetElement: HTMLElement; - private callOnTarget: IDisposable[]; + private dispatched: boolean; + private targets: HTMLElement[]; + private toDispose: IDisposable[]; private handle: IDisposable; private activeTouches: { [id: number]: TouchData; }; - constructor(target: HTMLElement) { - this.callOnTarget = []; + private constructor() { + this.toDispose = []; this.activeTouches = {}; - this.target = target; this.handle = null; + this.targets = []; + this.toDispose.push(DomUtils.addDisposableListener(document, 'touchstart', (e) => this.onTouchStart(e))); + this.toDispose.push(DomUtils.addDisposableListener(document, 'touchend', (e) => this.onTouchEnd(e))); + this.toDispose.push(DomUtils.addDisposableListener(document, 'touchmove', (e) => this.onTouchMove(e))); + } + + public static addTarget(element: HTMLElement): void { + if (!Gesture.isTouchDevice()) { + return; + } + if (!Gesture.INSTANCE) { + Gesture.INSTANCE = new Gesture(); + } + + Gesture.INSTANCE.targets.push(element); + } + + @memoize + private static isTouchDevice(): boolean { + return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || window.navigator.msMaxTouchPoints > 0; } public dispose(): void { - this.target = null; if (this.handle) { this.handle.dispose(); + dispose(this.toDispose); this.handle = null; } } - public set target(element: HTMLElement) { - this.callOnTarget = dispose(this.callOnTarget); - - this.activeTouches = {}; - - this.targetElement = element; - - if (!this.targetElement) { - return; - } - - this.callOnTarget.push(DomUtils.addDisposableListener(this.targetElement, 'touchstart', (e) => this.onTouchStart(e))); - this.callOnTarget.push(DomUtils.addDisposableListener(this.targetElement, 'touchend', (e) => this.onTouchEnd(e))); - this.callOnTarget.push(DomUtils.addDisposableListener(this.targetElement, 'touchmove', (e) => this.onTouchMove(e))); - } - - private static newGestureEvent(type: string): GestureEvent { - let event = (document.createEvent('CustomEvent')); - event.initEvent(type, false, true); - return event; - } - private onTouchStart(e: TouchEvent): void { let timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based. - e.preventDefault(); if (this.handle) { this.handle.dispose(); @@ -136,17 +133,21 @@ export class Gesture implements IDisposable { rollingPageY: [touch.pageY] }; - let evt = Gesture.newGestureEvent(EventType.Start); + let evt = this.newGestureEvent(EventType.Start, touch.target); evt.pageX = touch.pageX; evt.pageY = touch.pageY; - this.targetElement.dispatchEvent(evt); + this.dispatchEvent(evt); + } + + if (this.dispatched) { + e.preventDefault(); + e.stopPropagation(); + this.dispatched = false; } } private onTouchEnd(e: TouchEvent): void { let timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based. - e.preventDefault(); - e.stopPropagation(); let activeTouchCount = Object.keys(this.activeTouches).length; @@ -166,21 +167,19 @@ export class Gesture implements IDisposable { && Math.abs(data.initialPageX - arrays.tail(data.rollingPageX)) < 30 && Math.abs(data.initialPageY - arrays.tail(data.rollingPageY)) < 30) { - let evt = Gesture.newGestureEvent(EventType.Tap); - evt.initialTarget = data.initialTarget; + let evt = this.newGestureEvent(EventType.Tap, data.initialTarget); evt.pageX = arrays.tail(data.rollingPageX); evt.pageY = arrays.tail(data.rollingPageY); - this.targetElement.dispatchEvent(evt); + this.dispatchEvent(evt); } else if (holdTime >= Gesture.HOLD_DELAY && Math.abs(data.initialPageX - arrays.tail(data.rollingPageX)) < 30 && Math.abs(data.initialPageY - arrays.tail(data.rollingPageY)) < 30) { - let evt = Gesture.newGestureEvent(EventType.Contextmenu); - evt.initialTarget = data.initialTarget; + let evt = this.newGestureEvent(EventType.Contextmenu, data.initialTarget); evt.pageX = arrays.tail(data.rollingPageX); evt.pageY = arrays.tail(data.rollingPageY); - this.targetElement.dispatchEvent(evt); + this.dispatchEvent(evt); } else if (activeTouchCount === 1) { let finalX = arrays.tail(data.rollingPageX); @@ -190,7 +189,9 @@ export class Gesture implements IDisposable { let deltaX = finalX - data.rollingPageX[0]; let deltaY = finalY - data.rollingPageY[0]; - this.inertia(timestamp, // time now + // We need to get all the dispatch targets on the start of the inertia event + const dispatchTo = this.targets.filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget)); + this.inertia(dispatchTo, timestamp, // time now Math.abs(deltaX) / deltaT, // speed deltaX > 0 ? 1 : -1, // x direction finalX, // x now @@ -200,12 +201,36 @@ export class Gesture implements IDisposable { ); } + + this.dispatchEvent(this.newGestureEvent(EventType.End, data.initialTarget)); // forget about this touch delete this.activeTouches[touch.identifier]; } + + if (this.dispatched) { + e.preventDefault(); + e.stopPropagation(); + this.dispatched = false; + } } - private inertia(t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void { + private newGestureEvent(type: string, intialTarget?: EventTarget): GestureEvent { + let event = (document.createEvent('CustomEvent')); + event.initEvent(type, false, true); + event.initialTarget = intialTarget; + return event; + } + + private dispatchEvent(event: GestureEvent): void { + this.targets.forEach(target => { + if (event.initialTarget instanceof Node && target.contains(event.initialTarget)) { + target.dispatchEvent(event); + this.dispatched = true; + } + }); + } + + private inertia(dispatchTo: EventTarget[], t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void { this.handle = DomUtils.scheduleAtNextAnimationFrame(() => { let now = Date.now(); @@ -228,21 +253,19 @@ export class Gesture implements IDisposable { } // dispatch translation event - let evt = Gesture.newGestureEvent(EventType.Change); + let evt = this.newGestureEvent(EventType.Change); evt.translationX = delta_pos_x; evt.translationY = delta_pos_y; - this.targetElement.dispatchEvent(evt); + dispatchTo.forEach(d => d.dispatchEvent(evt)); if (!stopped) { - this.inertia(now, vX, dirX, x + delta_pos_x, vY, dirY, y + delta_pos_y); + this.inertia(dispatchTo, now, vX, dirX, x + delta_pos_x, vY, dirY, y + delta_pos_y); } }); } private onTouchMove(e: TouchEvent): void { let timestamp = Date.now(); // use Date.now() because on FF e.timeStamp is not epoch based. - e.preventDefault(); - e.stopPropagation(); for (let i = 0, len = e.changedTouches.length; i < len; i++) { @@ -255,12 +278,12 @@ export class Gesture implements IDisposable { let data = this.activeTouches[touch.identifier]; - let evt = Gesture.newGestureEvent(EventType.Change); + let evt = this.newGestureEvent(EventType.Change, data.initialTarget); evt.translationX = touch.pageX - arrays.tail(data.rollingPageX); evt.translationY = touch.pageY - arrays.tail(data.rollingPageY); evt.pageX = touch.pageX; evt.pageY = touch.pageY; - this.targetElement.dispatchEvent(evt); + this.dispatchEvent(evt); // only keep a few data points, to average the final speed if (data.rollingPageX.length > 3) { @@ -273,5 +296,11 @@ export class Gesture implements IDisposable { data.rollingPageY.push(touch.pageY); data.rollingTimestamps.push(timestamp); } + + if (this.dispatched) { + e.preventDefault(); + e.stopPropagation(); + this.dispatched = false; + } } } diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index 42b707b51c0d..41eb283271e7 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -14,7 +14,7 @@ import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { IAction, IActionRunner, Action, IActionChangeEvent, ActionRunner, IRunEvent } from 'vs/base/common/actions'; import DOM = require('vs/base/browser/dom'); import types = require('vs/base/common/types'); -import { Gesture, EventType, isTouchDevice } from 'vs/base/browser/touch'; +import { EventType, Gesture } from 'vs/base/browser/touch'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import Event, { Emitter } from 'vs/base/common/event'; @@ -41,7 +41,6 @@ export class BaseActionItem implements IActionItem { public _context: any; public _action: IAction; - private gesture: Gesture; private _actionRunner: IActionRunner; constructor(context: any, action: IAction, protected options?: IBaseActionItemOptions) { @@ -106,16 +105,14 @@ export class BaseActionItem implements IActionItem { public render(container: HTMLElement): void { this.builder = $(container); - this.gesture = new Gesture(container); + Gesture.addTarget(container); const enableDragging = this.options && this.options.draggable; if (enableDragging) { container.draggable = true; } - if (isTouchDevice) { - this.builder.on(EventType.Tap, e => this.onClick(e)); - } + this.builder.on(EventType.Tap, e => this.onClick(e)); this.builder.on(DOM.EventType.MOUSE_DOWN, (e) => { if (!enableDragging) { @@ -203,11 +200,6 @@ export class BaseActionItem implements IActionItem { this.builder = null; } - if (this.gesture) { - this.gesture.dispose(); - this.gesture = null; - } - this._callOnDispose = lifecycle.dispose(this._callOnDispose); } } diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index 8a321c10bd1a..d6d676578873 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -67,7 +67,7 @@ export class BaseDropdown extends ActionRunner { this._toDispose.push(cleanupFn); } - this._toDispose.push(new Gesture(this.$label.getHTMLElement())); + Gesture.addTarget(this.$label.getHTMLElement()); } public get toDispose(): IDisposable[] { diff --git a/src/vs/base/browser/ui/inputbox/inputBox.ts b/src/vs/base/browser/ui/inputbox/inputBox.ts index 8dfb882931c8..df7c0b99ba6b 100644 --- a/src/vs/base/browser/ui/inputbox/inputBox.ts +++ b/src/vs/base/browser/ui/inputbox/inputBox.ts @@ -219,10 +219,6 @@ export class InputBox extends Widget { } } - public setContextViewProvider(contextViewProvider: IContextViewProvider): void { - this.contextViewProvider = contextViewProvider; - } - public get inputElement(): HTMLInputElement { return this.input; } diff --git a/src/vs/base/browser/ui/list/list.ts b/src/vs/base/browser/ui/list/list.ts index f828de62d83c..05ab5d56cd87 100644 --- a/src/vs/base/browser/ui/list/list.ts +++ b/src/vs/base/browser/ui/list/list.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { GestureEvent } from 'vs/base/browser/touch'; + export interface IDelegate { getHeight(element: T): number; getTemplateId(element: T): string; @@ -15,19 +17,26 @@ export interface IRenderer { disposeTemplate(templateData: TTemplateData): void; } -export interface IListElementEvent { - element: T; - index: number; - event: E; -} - export interface IListEvent { elements: T[]; indexes: number[]; } -export interface IListMouseEvent extends MouseEvent { - element: T; +export interface IListMouseEvent { + browserEvent: MouseEvent; + element: T | undefined; + index: number; +} + +export interface IListTouchEvent { + browserEvent: TouchEvent; + element: T | undefined; + index: number; +} + +export interface IListGestureEvent { + browserEvent: GestureEvent; + element: T | undefined; index: number; } diff --git a/src/vs/base/browser/ui/list/listPaging.ts b/src/vs/base/browser/ui/list/listPaging.ts index c11ff0e6f8d1..e1c22181d062 100644 --- a/src/vs/base/browser/ui/list/listPaging.ts +++ b/src/vs/base/browser/ui/list/listPaging.ts @@ -7,7 +7,7 @@ import 'vs/css!./list'; import { IDisposable } from 'vs/base/common/lifecycle'; import { range } from 'vs/base/common/arrays'; import { IDelegate, IRenderer, IListEvent } from './list'; -import { List, IListOptions } from './listWidget'; +import { List, IListOptions, IListStyles } from './listWidget'; import { IPagedModel } from 'vs/base/common/paging'; import Event, { mapEvent } from 'vs/base/common/event'; @@ -73,6 +73,22 @@ export class PagedList { this.list = new List(container, delegate, pagedRenderers, options); } + getHTMLElement(): HTMLElement { + return this.list.getHTMLElement(); + } + + isDOMFocused(): boolean { + return this.list.getHTMLElement() === document.activeElement; + } + + get onDidFocus(): Event { + return this.list.onDidFocus; + } + + get onDidBlur(): Event { + return this.list.onDidBlur; + } + get widget(): List { return this.list; } @@ -110,6 +126,14 @@ export class PagedList { this.list.scrollTop = scrollTop; } + open(indexes: number[]): void { + this.list.open(indexes); + } + + setFocus(indexes: number[]): void { + this.list.setFocus(indexes); + } + focusNext(n?: number, loop?: boolean): void { this.list.focusNext(n, loop); } @@ -149,4 +173,8 @@ export class PagedList { reveal(index: number, relativeTop?: number): void { this.list.reveal(index, relativeTop); } + + style(styles: IListStyles): void { + this.list.style(styles); + } } \ No newline at end of file diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index f7a875c47f24..3936eb414730 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -3,19 +3,22 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { assign, getOrDefault } from 'vs/base/common/objects'; +import { getOrDefault } from 'vs/base/common/objects'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Gesture, EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch'; import * as DOM from 'vs/base/browser/dom'; +import Event, { mapEvent, filterEvent } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollEvent, ScrollbarVisibility } from 'vs/base/common/scrollable'; import { RangeMap, IRange, relativeComplement, intersect, shift } from './rangeMap'; -import { IDelegate, IRenderer } from './list'; +import { IDelegate, IRenderer, IListMouseEvent, IListTouchEvent, IListGestureEvent } from './list'; import { RowCache, IRow } from './rowCache'; import { isWindows } from 'vs/base/common/platform'; import * as browser from 'vs/base/browser/browser'; import { ISpliceable } from 'vs/base/common/sequence'; +import { memoize } from 'vs/base/common/decorators'; +import { DragMouseEvent } from 'vs/base/browser/mouseEvent'; function canUseTranslate3d(): boolean { if (browser.isFirefox) { @@ -47,18 +50,6 @@ interface IItem { row: IRow; } -const MouseEventTypes = [ - 'click', - 'dblclick', - 'mouseup', - 'mousedown', - 'mouseover', - 'mousemove', - 'mouseout', - 'contextmenu', - 'touchstart' -]; - export interface IListViewOptions { useShadows?: boolean; } @@ -80,6 +71,10 @@ export class ListView implements ISpliceable, IDisposable { private gesture: Gesture; private rowsContainer: HTMLElement; private scrollableElement: ScrollableElement; + private splicing = false; + private dragAndDropScrollInterval: number; + private dragAndDropScrollTimeout: number; + private dragAndDropMouseY: number; private disposables: IDisposable[]; constructor( @@ -106,7 +101,7 @@ export class ListView implements ISpliceable, IDisposable { this.rowsContainer = document.createElement('div'); this.rowsContainer.className = 'monaco-list-rows'; - this.gesture = new Gesture(this.rowsContainer); + Gesture.addTarget(this.rowsContainer); this.scrollableElement = new ScrollableElement(this.rowsContainer, { alwaysConsumeMouseWheel: true, @@ -123,6 +118,9 @@ export class ListView implements ISpliceable, IDisposable { this.scrollableElement.onScroll(this.onScroll, this, this.disposables); domEvent(this.rowsContainer, TouchEventType.Change)(this.onTouchChange, this, this.disposables); + const onDragOver = mapEvent(domEvent(this.rowsContainer, 'dragover'), e => new DragMouseEvent(e)); + onDragOver(this.onDragOver, this, this.disposables); + this.layout(); } @@ -131,6 +129,20 @@ export class ListView implements ISpliceable, IDisposable { } splice(start: number, deleteCount: number, elements: T[] = []): T[] { + if (this.splicing) { + throw new Error('Can\'t run recursive splices.'); + } + + this.splicing = true; + + try { + return this._splice(start, deleteCount, elements); + } finally { + this.splicing = false; + } + } + + private _splice(start: number, deleteCount: number, elements: T[] = []): T[] { const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight); const deleteRange = { start, end: start + deleteCount }; const removeRange = intersect(previousRenderRange, deleteRange); @@ -316,31 +328,33 @@ export class ListView implements ISpliceable, IDisposable { // Events - addListener(type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable { - const userHandler = handler; - let domNode = this.domNode; + @memoize get onMouseClick(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'click'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onMouseDblClick(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'dblclick'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onMouseUp(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'mouseup'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onMouseDown(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'mousedown'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onMouseOver(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'mouseover'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onMouseMove(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'mousemove'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onMouseOut(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'mouseout'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onContextMenu(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'contextmenu'), e => this.toMouseEvent(e)), e => e.index >= 0); } + @memoize get onTouchStart(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'touchstart'), e => this.toTouchEvent(e)), e => e.index >= 0); } + @memoize get onTap(): Event> { return filterEvent(mapEvent(domEvent(this.rowsContainer, TouchEventType.Tap), e => this.toGestureEvent(e)), e => e.index >= 0); } - if (MouseEventTypes.indexOf(type) > -1) { - handler = e => this.fireScopedEvent(e, userHandler, this.getItemIndexFromMouseEvent(e)); - } else if (type === TouchEventType.Tap) { - domNode = this.rowsContainer; - handler = e => this.fireScopedEvent(e, userHandler, this.getItemIndexFromGestureEvent(e)); - } - - return DOM.addDisposableListener(domNode, type, handler, useCapture); + private toMouseEvent(browserEvent: MouseEvent): IListMouseEvent { + const index = this.getItemIndexFromEventTarget(browserEvent.target); + const element = index < 0 ? undefined : this.items[index].element; + return { browserEvent, index, element }; } - private fireScopedEvent( - event: any, - handler: (event: any) => void, - index: number - ) { - if (index < 0) { - return; - } + private toTouchEvent(browserEvent: TouchEvent): IListTouchEvent { + const index = this.getItemIndexFromEventTarget(browserEvent.target); + const element = index < 0 ? undefined : this.items[index].element; + return { browserEvent, index, element }; + } - const element = this.items[index].element; - handler(assign(event, { element, index })); + private toGestureEvent(browserEvent: GestureEvent): IListGestureEvent { + const index = this.getItemIndexFromEventTarget(browserEvent.initialTarget); + const element = index < 0 ? undefined : this.items[index].element; + return { browserEvent, index, element }; } private onScroll(e: ScrollEvent): void { @@ -354,16 +368,60 @@ export class ListView implements ISpliceable, IDisposable { this.scrollTop -= event.translationY; } + private onDragOver(event: DragMouseEvent): void { + this.setupDragAndDropScrollInterval(); + this.dragAndDropMouseY = event.posy; + } + + private setupDragAndDropScrollInterval(): void { + var viewTop = DOM.getTopLeftOffset(this._domNode).top; + + if (!this.dragAndDropScrollInterval) { + this.dragAndDropScrollInterval = window.setInterval(() => { + if (this.dragAndDropMouseY === undefined) { + return; + } + + var diff = this.dragAndDropMouseY - viewTop; + var scrollDiff = 0; + var upperLimit = this.renderHeight - 35; + + if (diff < 35) { + scrollDiff = Math.max(-14, 0.2 * (diff - 35)); + } else if (diff > upperLimit) { + scrollDiff = Math.min(14, 0.2 * (diff - upperLimit)); + } + + this.scrollTop += scrollDiff; + }, 10); + + this.cancelDragAndDropScrollTimeout(); + + this.dragAndDropScrollTimeout = window.setTimeout(() => { + this.cancelDragAndDropScrollInterval(); + this.dragAndDropScrollTimeout = null; + }, 1000); + } + } + + private cancelDragAndDropScrollInterval(): void { + if (this.dragAndDropScrollInterval) { + window.clearInterval(this.dragAndDropScrollInterval); + this.dragAndDropScrollInterval = null; + } + + this.cancelDragAndDropScrollTimeout(); + } + + private cancelDragAndDropScrollTimeout(): void { + if (this.dragAndDropScrollTimeout) { + window.clearTimeout(this.dragAndDropScrollTimeout); + this.dragAndDropScrollTimeout = null; + } + } + // Util - private getItemIndexFromMouseEvent(event: MouseEvent): number { - return this.getItemIndexFromEventTarget(event.target); - } - - private getItemIndexFromGestureEvent(event: GestureEvent): number { - return this.getItemIndexFromEventTarget(event.initialTarget); - } - private getItemIndexFromEventTarget(target: EventTarget): number { while (target instanceof HTMLElement && target !== this.rowsContainer) { const element = target as HTMLElement; diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 0a80be240c80..d2c737a66919 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -10,12 +10,12 @@ import { range, firstIndex } from 'vs/base/common/arrays'; import { memoize } from 'vs/base/common/decorators'; import * as DOM from 'vs/base/browser/dom'; import * as platform from 'vs/base/common/platform'; -import { EventType as TouchEventType } from 'vs/base/browser/touch'; +import { Gesture } from 'vs/base/browser/touch'; import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import Event, { Emitter, EventBufferer, chain, mapEvent, fromCallback, anyEvent } from 'vs/base/common/event'; +import Event, { Emitter, EventBufferer, chain, mapEvent, anyEvent } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; -import { IDelegate, IRenderer, IListEvent, IListMouseEvent, IListContextMenuEvent } from './list'; +import { IDelegate, IRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent } from './list'; import { ListView, IListViewOptions } from './listView'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; @@ -253,17 +253,24 @@ class TraitSpliceable implements ISpliceable { } } +function isInputElement(e: HTMLElement): boolean { + return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA'; +} + class KeyboardController implements IDisposable { private disposables: IDisposable[]; constructor( private list: List, - private view: ListView + private view: ListView, + options: IListOptions ) { + const multipleSelectionSupport = !(options.multipleSelectionSupport === false); this.disposables = []; const onKeyDown = chain(domEvent(view.domNode, 'keydown')) + .filter(e => !isInputElement(e.target as HTMLElement)) .map(e => new StandardKeyboardEvent(e)); onKeyDown.filter(e => e.keyCode === KeyCode.Enter).on(this.onEnter, this, this.disposables); @@ -271,8 +278,11 @@ class KeyboardController implements IDisposable { onKeyDown.filter(e => e.keyCode === KeyCode.DownArrow).on(this.onDownArrow, this, this.disposables); onKeyDown.filter(e => e.keyCode === KeyCode.PageUp).on(this.onPageUpArrow, this, this.disposables); onKeyDown.filter(e => e.keyCode === KeyCode.PageDown).on(this.onPageDownArrow, this, this.disposables); - onKeyDown.filter(e => (platform.isMacintosh ? e.metaKey : e.ctrlKey) && e.keyCode === KeyCode.KEY_A).on(this.onCtrlA, this, this.disposables); onKeyDown.filter(e => e.keyCode === KeyCode.Escape).on(this.onEscape, this, this.disposables); + + if (multipleSelectionSupport) { + onKeyDown.filter(e => (platform.isMacintosh ? e.metaKey : e.ctrlKey) && e.keyCode === KeyCode.KEY_A).on(this.onCtrlA, this, this.disposables); + } } private onEnter(e: StandardKeyboardEvent): void { @@ -333,33 +343,39 @@ class KeyboardController implements IDisposable { } } -function isSelectionSingleChangeEvent(event: IListMouseEvent): boolean { - return platform.isMacintosh ? event.metaKey : event.ctrlKey; +function isSelectionSingleChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { + return platform.isMacintosh ? event.browserEvent.metaKey : event.browserEvent.ctrlKey; } -function isSelectionRangeChangeEvent(event: IListMouseEvent): boolean { - return event.shiftKey; +function isSelectionRangeChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { + return event.browserEvent.shiftKey; } -function isSelectionChangeEvent(event: IListMouseEvent): boolean { +function isSelectionChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { return isSelectionSingleChangeEvent(event) || isSelectionRangeChangeEvent(event); } -export interface IMouseControllerOptions { - selectOnMouseDown?: boolean; - focusOnMouseDown?: boolean; -} - class MouseController implements IDisposable { - private disposables: IDisposable[]; + private multipleSelectionSupport: boolean; + private didJustPressContextMenuKey: boolean = false; + private disposables: IDisposable[] = []; @memoize get onContextMenu(): Event> { - const fromKeyboard = chain(domEvent(this.view.domNode, 'keydown')) + const fromKeydown = chain(domEvent(this.view.domNode, 'keydown')) .map(e => new StandardKeyboardEvent(e)) - .filter(e => this.list.getFocus().length > 0) - .filter(e => e.keyCode === KeyCode.ContextMenu || (e.shiftKey && e.keyCode === KeyCode.F10)) - .map(e => { + .filter(e => this.didJustPressContextMenuKey = e.keyCode === KeyCode.ContextMenu || (e.shiftKey && e.keyCode === KeyCode.F10)) + .filter(e => { e.preventDefault(); e.stopPropagation(); return false; }) + .event as Event; + + const fromKeyup = chain(domEvent(this.view.domNode, 'keyup')) + .filter(() => { + const didJustPressContextMenuKey = this.didJustPressContextMenuKey; + this.didJustPressContextMenuKey = false; + return didJustPressContextMenuKey; + }) + .filter(() => this.list.getFocus().length > 0) + .map(() => { const index = this.list.getFocus()[0]; const element = this.view.element(index); const anchor = this.view.domElement(index); @@ -368,45 +384,48 @@ class MouseController implements IDisposable { .filter(({ anchor }) => !!anchor) .event; - const fromMouse = chain(fromCallback(handler => this.view.addListener('contextmenu', handler))) - .map(({ element, index, clientX, clientY }) => ({ element, index, anchor: { x: clientX + 1, y: clientY } })) + const fromMouse = chain(this.view.onContextMenu) + .filter(() => !this.didJustPressContextMenuKey) + .map(({ element, index, browserEvent }) => ({ element, index, anchor: { x: browserEvent.clientX + 1, y: browserEvent.clientY } })) .event; - return anyEvent>(fromKeyboard, fromMouse); + return anyEvent>(fromKeydown, fromKeyup, fromMouse); } constructor( private list: List, private view: ListView, - private options: IMouseControllerOptions = {} + private options: IListOptions = {} ) { - this.disposables = []; - this.disposables.push(view.addListener('mousedown', e => this.onMouseDown(e))); - this.disposables.push(view.addListener('click', e => this.onPointer(e))); - this.disposables.push(view.addListener('dblclick', e => this.onDoubleClick(e))); - this.disposables.push(view.addListener('touchstart', e => this.onMouseDown(e))); - this.disposables.push(view.addListener(TouchEventType.Tap, e => this.onPointer(e))); + this.multipleSelectionSupport = options.multipleSelectionSupport !== false; + + view.onMouseDown(this.onMouseDown, this, this.disposables); + view.onMouseClick(this.onPointer, this, this.disposables); + view.onMouseDblClick(this.onDoubleClick, this, this.disposables); + view.onTouchStart(this.onMouseDown, this, this.disposables); + view.onTap(this.onPointer, this, this.disposables); + Gesture.addTarget(view.domNode); } - private onMouseDown(e: IListMouseEvent): void { + private onMouseDown(e: IListMouseEvent | IListTouchEvent): void { if (this.options.focusOnMouseDown === false) { - e.preventDefault(); - e.stopPropagation(); - } else { + e.browserEvent.preventDefault(); + e.browserEvent.stopPropagation(); + } else if (document.activeElement !== e.browserEvent.target) { this.view.domNode.focus(); } let reference = this.list.getFocus()[0]; reference = reference === undefined ? this.list.getSelection()[0] : reference; - if (isSelectionRangeChangeEvent(e)) { + if (this.multipleSelectionSupport && isSelectionRangeChangeEvent(e)) { return this.changeSelection(e, reference); } const focus = e.index; this.list.setFocus([focus]); - if (isSelectionChangeEvent(e)) { + if (this.multipleSelectionSupport && isSelectionChangeEvent(e)) { return this.changeSelection(e, reference); } @@ -417,7 +436,7 @@ class MouseController implements IDisposable { } private onPointer(e: IListMouseEvent): void { - if (isSelectionChangeEvent(e)) { + if (this.multipleSelectionSupport && isSelectionChangeEvent(e)) { return; } @@ -429,7 +448,7 @@ class MouseController implements IDisposable { } private onDoubleClick(e: IListMouseEvent): void { - if (isSelectionChangeEvent(e)) { + if (this.multipleSelectionSupport && isSelectionChangeEvent(e)) { return; } @@ -438,7 +457,7 @@ class MouseController implements IDisposable { this.list.pin(focus); } - private changeSelection(e: IListMouseEvent, reference: number | undefined): void { + private changeSelection(e: IListMouseEvent | IListTouchEvent, reference: number | undefined): void { const focus = e.index; if (isSelectionRangeChangeEvent(e) && reference !== undefined) { @@ -472,11 +491,14 @@ class MouseController implements IDisposable { } } -export interface IListOptions extends IListViewOptions, IMouseControllerOptions, IListStyles { +export interface IListOptions extends IListViewOptions, IListStyles { identityProvider?: IIdentityProvider; ariaLabel?: string; mouseSupport?: boolean; + selectOnMouseDown?: boolean; + focusOnMouseDown?: boolean; keyboardSupport?: boolean; + multipleSelectionSupport?: boolean; } export interface IListStyles { @@ -511,7 +533,8 @@ const defaultStyles: IListStyles = { const DefaultOptions: IListOptions = { keyboardSupport: true, - mouseSupport: true + mouseSupport: true, + multipleSelectionSupport: true }; // TODO@Joao: move these utils into a SortedArray class @@ -634,7 +657,7 @@ export class List implements ISpliceable, IDisposable { private focus: Trait; private selection: Trait; - private eventBufferer: EventBufferer; + private eventBufferer = new EventBufferer(); private view: ListView; private spliceable: ISpliceable; private disposables: IDisposable[]; @@ -648,10 +671,7 @@ export class List implements ISpliceable, IDisposable { return mapEvent(this.eventBufferer.wrapEvent(this.selection.onChange), e => this.toListEvent(e)); } - private _onContextMenu: Event> = Event.None; - get onContextMenu(): Event> { - return this._onContextMenu; - } + readonly onContextMenu: Event> = Event.None; private _onOpen = new Emitter(); @memoize get onOpen(): Event> { @@ -663,6 +683,20 @@ export class List implements ISpliceable, IDisposable { return mapEvent(this._onPin.event, indexes => this.toListEvent({ indexes })); } + get onMouseClick(): Event> { return this.view.onMouseClick; } + get onMouseDblClick(): Event> { return this.view.onMouseDblClick; } + get onMouseUp(): Event> { return this.view.onMouseUp; } + get onMouseDown(): Event> { return this.view.onMouseDown; } + get onMouseOver(): Event> { return this.view.onMouseOver; } + get onMouseMove(): Event> { return this.view.onMouseMove; } + get onMouseOut(): Event> { return this.view.onMouseOut; } + get onTouchStart(): Event> { return this.view.onTouchStart; } + get onTap(): Event> { return this.view.onTap; } + + get onKeyDown(): Event { return domEvent(this.view.domNode, 'keydown'); } + get onKeyUp(): Event { return domEvent(this.view.domNode, 'keyup'); } + get onKeyPress(): Event { return domEvent(this.view.domNode, 'keypress'); } + readonly onDidFocus: Event; readonly onDidBlur: Event; @@ -679,7 +713,6 @@ export class List implements ISpliceable, IDisposable { this.focus = new FocusTrait(i => this.getElementDomId(i)); this.selection = new Trait('selected'); - this.eventBufferer = new EventBufferer(); mixin(options, defaultStyles, false); renderers = renderers.map(r => new PipelineRenderer(r.templateId, [aria, this.focus.renderer, this.selection.renderer, r])); @@ -704,14 +737,14 @@ export class List implements ISpliceable, IDisposable { this.onDidBlur = mapEvent(domEvent(this.view.domNode, 'blur', true), () => null); if (typeof options.keyboardSupport !== 'boolean' || options.keyboardSupport) { - const controller = new KeyboardController(this, this.view); + const controller = new KeyboardController(this, this.view, options); this.disposables.push(controller); } if (typeof options.mouseSupport !== 'boolean' || options.mouseSupport) { const controller = new MouseController(this, this.view, options); this.disposables.push(controller); - this._onContextMenu = controller.onContextMenu; + this.onContextMenu = controller.onContextMenu; } this.onFocusChange(this._onFocusChange, this, this.disposables); diff --git a/src/vs/base/browser/ui/sash/sash.ts b/src/vs/base/browser/ui/sash/sash.ts index fbeddfdd55a1..98f01d9ed3ce 100644 --- a/src/vs/base/browser/ui/sash/sash.ts +++ b/src/vs/base/browser/ui/sash/sash.ts @@ -12,7 +12,7 @@ import { isIPad } from 'vs/base/browser/browser'; import { isMacintosh } from 'vs/base/common/platform'; import types = require('vs/base/common/types'); import DOM = require('vs/base/browser/dom'); -import { EventType, GestureEvent } from 'vs/base/browser/touch'; +import { EventType, GestureEvent, Gesture } from 'vs/base/browser/touch'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import Event, { Emitter } from 'vs/base/common/event'; @@ -71,6 +71,7 @@ export class Sash { this.$e.on(DOM.EventType.MOUSE_DOWN, (e) => { this.onMouseDown(e as MouseEvent); }); this.$e.on(DOM.EventType.DBLCLICK, (e) => this._onDidReset.fire()); + Gesture.addTarget(this.$e.getHTMLElement()); this.$e.on(EventType.Start, (e) => { this.onTouchStart(e as GestureEvent); }); this.size = options.baseSize || 5; diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index 3094acbc6359..525365b8638b 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -59,6 +59,25 @@ enum State { Busy } +function pushToEnd(arr: T[], value: T): T[] { + let didFindValue = false; + + const result = arr.filter(v => { + if (v === value) { + didFindValue = true; + return false; + } + + return true; + }); + + if (didFindValue) { + result.push(value); + } + + return result; +} + export class SplitView implements IDisposable { private orientation: Orientation; @@ -203,9 +222,9 @@ export class SplitView implements IDisposable { this.state = State.Idle; } - private relayout(): void { + private relayout(lowPriorityIndex?: number): void { const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); - this.resize(this.viewItems.length - 1, this.contentSize - contentSize); + this.resize(this.viewItems.length - 1, this.size - contentSize, undefined, lowPriorityIndex); } layout(size: number): void { @@ -249,7 +268,7 @@ export class SplitView implements IDisposable { size = typeof size === 'number' ? size : item.size; size = clamp(size, item.view.minimumSize, item.view.maximumSize); item.size = size; - this.relayout(); + this.relayout(index); } resizeView(index: number, size: number): void { @@ -298,21 +317,28 @@ export class SplitView implements IDisposable { return this.viewItems[index].size; } - private resize(index: number, delta: number, sizes = this.viewItems.map(i => i.size)): void { + private resize(index: number, delta: number, sizes = this.viewItems.map(i => i.size), lowPriorityIndex?: number): void { if (index < 0 || index >= this.viewItems.length) { return; } if (delta !== 0) { - const upIndexes = range(index, -1); - const up = upIndexes.map(i => this.viewItems[i]); + let upIndexes = range(index, -1); + let downIndexes = range(index + 1, this.viewItems.length); + + if (typeof lowPriorityIndex === 'number') { + upIndexes = pushToEnd(upIndexes, lowPriorityIndex); + downIndexes = pushToEnd(downIndexes, lowPriorityIndex); + } + + const upItems = upIndexes.map(i => this.viewItems[i]); const upSizes = upIndexes.map(i => sizes[i]); - const downIndexes = range(index + 1, this.viewItems.length); - const down = downIndexes.map(i => this.viewItems[i]); + + const downItems = downIndexes.map(i => this.viewItems[i]); const downSizes = downIndexes.map(i => sizes[i]); - for (let i = 0, deltaUp = delta; deltaUp !== 0 && i < up.length; i++) { - const item = up[i]; + for (let i = 0, deltaUp = delta; deltaUp !== 0 && i < upItems.length; i++) { + const item = upItems[i]; const size = clamp(upSizes[i] + deltaUp, item.view.minimumSize, item.view.maximumSize); const viewDelta = size - upSizes[i]; @@ -320,8 +346,8 @@ export class SplitView implements IDisposable { item.size = size; } - for (let i = 0, deltaDown = delta; deltaDown !== 0 && i < down.length; i++) { - const item = down[i]; + for (let i = 0, deltaDown = delta; deltaDown !== 0 && i < downItems.length; i++) { + const item = downItems[i]; const size = clamp(downSizes[i] - deltaDown, item.view.minimumSize, item.view.maximumSize); const viewDelta = size - downSizes[i]; diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index 9eff176c7135..90e4c4ffdd67 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -349,13 +349,14 @@ export function always(promise: TPromise, f: Function): TPromise { * Runs the provided list of promise factories in sequential order. The returned * promise will complete to an array of results from each promise. */ -export function sequence(promiseFactories: ITask>[]): TPromise { + +export function sequence(promiseFactories: ITask>[]): TPromise { const results: T[] = []; // reverse since we start with last element using pop() promiseFactories = promiseFactories.reverse(); - function next(): Promise { + function next(): Thenable { if (promiseFactories.length) { return promiseFactories.pop()(); } @@ -363,7 +364,7 @@ export function sequence(promiseFactories: ITask>[]): TPromise { if (result !== undefined && result !== null) { results.push(result); } @@ -692,4 +693,4 @@ export class ThrottledEmitter extends Emitter { this.hasLastEvent = false; this.lastEvent = void 0; } -} \ No newline at end of file +} diff --git a/src/vs/base/common/color.ts b/src/vs/base/common/color.ts index d650dc0d92d3..f18a87dc15e5 100644 --- a/src/vs/base/common/color.ts +++ b/src/vs/base/common/color.ts @@ -214,7 +214,7 @@ export class HSVA { m = ((r - g) / delta) + 4; } - return new HSVA(m * 60, s, cmax, rgba.a); + return new HSVA(Math.round(m * 60), s, cmax, rgba.a); } // from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm diff --git a/src/vs/base/common/date.ts b/src/vs/base/common/date.ts new file mode 100644 index 000000000000..7cae97659cdf --- /dev/null +++ b/src/vs/base/common/date.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +function pad(number: number): string { + if (number < 10) { + return '0' + number; + } + + return String(number); +} + +export function toLocalISOString(date: Date): string { + return date.getFullYear() + + '-' + pad(date.getMonth() + 1) + + '-' + pad(date.getDate()) + + 'T' + pad(date.getHours()) + + ':' + pad(date.getMinutes()) + + ':' + pad(date.getSeconds()) + + '.' + (date.getMilliseconds() / 1000).toFixed(3).slice(2, 5) + + 'Z'; +} \ No newline at end of file diff --git a/src/vs/base/common/diff/diff.ts b/src/vs/base/common/diff/diff.ts index b9dee8dda6e5..faa62fad9135 100644 --- a/src/vs/base/common/diff/diff.ts +++ b/src/vs/base/common/diff/diff.ts @@ -95,7 +95,7 @@ export class MyArray { // LcsDiff.cs // // An implementation of the difference algorithm described in -// "An O(ND) Difference Algorithm and its letiations" by Eugene W. Myers +// "An O(ND) Difference Algorithm and its variations" by Eugene W. Myers // // Copyright (C) 2008 Microsoft Corporation @minifier_do_not_preserve //***************************************************************************** @@ -215,7 +215,7 @@ const hasOwnProperty = Object.prototype.hasOwnProperty; /** * An implementation of the difference algorithm described in - * "An O(ND) Difference Algorithm and its letiations" by Eugene W. Myers + * "An O(ND) Difference Algorithm and its variations" by Eugene W. Myers */ export class LcsDiff { diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 2f67b009aa5c..36f2a5012520 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -365,6 +365,7 @@ export class EventBufferer { export interface IChainableEvent { event: Event; map(fn: (i: T) => O): IChainableEvent; + forEach(fn: (i: T) => void): IChainableEvent; filter(fn: (e: T) => boolean): IChainableEvent; on(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; } @@ -373,6 +374,10 @@ export function mapEvent(event: Event, map: (i: I) => O): Event { return (listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables); } +export function forEach(event: Event, each: (i: I) => void): Event { + return (listener, thisArgs = null, disposables?) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables); +} + export function filterEvent(event: Event, filter: (e: T) => boolean): Event { return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); } @@ -387,6 +392,10 @@ class ChainableEvent implements IChainableEvent { return new ChainableEvent(mapEvent(this._event, fn)); } + forEach(fn: (i: T) => void): IChainableEvent { + return new ChainableEvent(forEach(this._event, fn)); + } + filter(fn: (e: T) => boolean): IChainableEvent { return new ChainableEvent(filterEvent(this._event, fn)); } diff --git a/src/vs/base/common/events.ts b/src/vs/base/common/events.ts deleted file mode 100644 index 82997d155541..000000000000 --- a/src/vs/base/common/events.ts +++ /dev/null @@ -1,78 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -export class Event { - public time: number; - public originalEvent: Event; - public source: any; - - constructor(originalEvent?: Event) { - this.time = (new Date()).getTime(); - this.originalEvent = originalEvent; - this.source = null; - } -} - -export class PropertyChangeEvent extends Event { - public key: string; - public oldValue: any; - public newValue: any; - - constructor(key?: string, oldValue?: any, newValue?: any, originalEvent?: Event) { - super(originalEvent); - - this.key = key; - this.oldValue = oldValue; - this.newValue = newValue; - } -} - -export class ViewerEvent extends Event { - public element: any; - - constructor(element: any, originalEvent?: Event) { - super(originalEvent); - - this.element = element; - } -} - -export interface ISelectionEvent { - selection: any[]; - payload?: any; - source: any; -} - -export interface IFocusEvent { - focus: any; - payload?: any; - source: any; -} - -export interface IHighlightEvent { - highlight: any; - payload?: any; - source: any; -} - -export const EventType = { - PROPERTY_CHANGED: 'propertyChanged', - SELECTION: 'selection', - FOCUS: 'focus', - BLUR: 'blur', - HIGHLIGHT: 'highlight', - EXPAND: 'expand', - COLLAPSE: 'collapse', - TOGGLE: 'toggle', - BEFORE_RUN: 'beforeRun', - RUN: 'run', - EDIT: 'edit', - SAVE: 'save', - CANCEL: 'cancel', - CHANGE: 'change', - DISPOSE: 'dispose', -}; - diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index b43808d4e311..0ff9a4513e41 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -341,6 +341,8 @@ export function matchesFuzzy(word: string, wordToMatchAgainst: string, enableSep return enableSeparateSubstringMatching ? fuzzySeparateFilter(word, wordToMatchAgainst) : fuzzyContiguousFilter(word, wordToMatchAgainst); } +//#region --- fuzzyScore --- + export function createMatches(position: number[]): IMatch[] { let ret: IMatch[] = []; if (!position) { @@ -503,7 +505,7 @@ export function fuzzyScore(pattern: string, word: string, patternMaxWhitespaceIg } else { score = 5; } - } else if (isSeparatorAtPos(lowWord, wordPos - 2)) { + } else if (isSeparatorAtPos(lowWord, wordPos - 2) || isWhitespaceAtPos(lowWord, wordPos - 2)) { // post separator: `foo <-> bar_foo` score = 5; @@ -673,8 +675,7 @@ class LazyArray { slice(): LazyArray { const ret = new LazyArray(); ret._parent = this; - ret._parentLen = this._data ? this._data.length : 0; - return ret; + ret._parentLen = this._data ? this._data.length : 0; return ret; } toArray(): number[] { @@ -693,14 +694,69 @@ class LazyArray { } } -export function nextTypoPermutation(pattern: string, patternPos: number) { +//#endregion + + +//#region --- graceful --- + +export function fuzzyScoreGracefulAggressive(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): [number, number[]] { + return fuzzyScoreWithPermutations(pattern, word, true, patternMaxWhitespaceIgnore); +} + +export function fuzzyScoreGraceful(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): [number, number[]] { + return fuzzyScoreWithPermutations(pattern, word, false, patternMaxWhitespaceIgnore); +} + +function fuzzyScoreWithPermutations(pattern: string, word: string, aggressive?: boolean, patternMaxWhitespaceIgnore?: number): [number, number[]] { + let top: [number, number[]] = fuzzyScore(pattern, word, patternMaxWhitespaceIgnore); + + if (top && !aggressive) { + // when using the original pattern yield a result we` + // return it unless we are aggressive and try to find + // a better alignment, e.g. `cno` -> `^co^ns^ole` or `^c^o^nsole`. + return top; + } + + if (pattern.length >= 3) { + // When the pattern is long enough then try a few (max 7) + // permutations of the pattern to find a better match. The + // permutations only swap neighbouring characters, e.g + // `cnoso` becomes `conso`, `cnsoo`, `cnoos`. + let tries = Math.min(7, pattern.length - 1); + for (let patternPos = 1; patternPos < tries; patternPos++) { + let newPattern = nextTypoPermutation(pattern, patternPos); + if (newPattern) { + let candidate = fuzzyScore(newPattern, word, patternMaxWhitespaceIgnore); + if (candidate) { + candidate[0] -= 3; // permutation penalty + if (!top || candidate[0] > top[0]) { + top = candidate; + } + } + } + } + } + + return top; +} + +function nextTypoPermutation(pattern: string, patternPos: number): string { if (patternPos + 1 >= pattern.length) { return undefined; } + let swap1 = pattern[patternPos]; + let swap2 = pattern[patternPos + 1]; + + if (swap1 === swap2) { + return undefined; + } + return pattern.slice(0, patternPos) - + pattern[patternPos + 1] - + pattern[patternPos] + + swap2 + + swap1 + pattern.slice(patternPos + 2); -} \ No newline at end of file +} + +//#endregion diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index f930237759cd..7c2f0fabc1eb 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -6,7 +6,7 @@ 'use strict'; export interface IIterator { - next(): { done: boolean, value: E }; + next(): { readonly done: boolean, readonly value: E }; } export interface INextIterator { diff --git a/src/vs/base/common/json.ts b/src/vs/base/common/json.ts index 042e0c863e5f..ffa75f460955 100644 --- a/src/vs/base/common/json.ts +++ b/src/vs/base/common/json.ts @@ -961,6 +961,9 @@ export function visit(text: string, visitor: JSONVisitor, options?: ParseOptions } onSeparator(','); scanNext(); // consume comma + if (_scanner.getToken() === SyntaxKind.CloseBracketToken && allowTrailingComma) { + break; + } } else if (needsComma) { handleError(ParseErrorCode.CommaExpected, [], []); } diff --git a/src/vs/base/common/jsonSchema.ts b/src/vs/base/common/jsonSchema.ts index 538858e0c0d1..5bec1537db23 100644 --- a/src/vs/base/common/jsonSchema.ts +++ b/src/vs/base/common/jsonSchema.ts @@ -55,6 +55,7 @@ export interface IJSONSchema { markdownEnumDescriptions?: string[]; // VSCode extension markdownDescription?: string; // VSCode extension doNotSuggest?: boolean; // VSCode extension + allowComments?: boolean; // VSCode extension } export interface IJSONSchemaMap { diff --git a/src/vs/base/common/labels.ts b/src/vs/base/common/labels.ts index 7730a5dbf80e..e8f135512e7e 100644 --- a/src/vs/base/common/labels.ts +++ b/src/vs/base/common/labels.ts @@ -106,6 +106,10 @@ export function tildify(path: string, userHome: string): string { return path; } +export function untildify(path: string, userHome: string): string { + return path.replace(/^~($|\/|\\)/, `${userHome}$1`); +} + /** * Shortens the paths but keeps them easy to distinguish. * Replaces not important parts with ellipsis. diff --git a/src/vs/base/common/linkedList.ts b/src/vs/base/common/linkedList.ts index 95f91a74c062..d40fd2a28617 100644 --- a/src/vs/base/common/linkedList.ts +++ b/src/vs/base/common/linkedList.ts @@ -95,21 +95,19 @@ export class LinkedList { } iterator(): IIterator { - let _done: boolean; - let _value: E; let element = { - get done() { return _done; }, - get value() { return _value; } + done: undefined, + value: undefined, }; let node = this._first; return { next(): { done: boolean; value: E } { if (!node) { - _done = true; - _value = undefined; + element.done = true; + element.value = undefined; } else { - _done = false; - _value = node.element; + element.done = false; + element.value = node.element; node = node.next; } return element; diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index 04186a763cdb..58e3fea9be18 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -555,18 +555,6 @@ export class LinkedMap { } } - public forEachReverse(callbackfn: (value: V, key: K, map: LinkedMap) => void, thisArg?: any): void { - let current = this._tail; - while (current) { - if (thisArg) { - callbackfn.bind(thisArg)(current.value, current.key, this); - } else { - callbackfn(current.value, current.key, this); - } - current = current.previous; - } - } - public values(): V[] { let result: V[] = []; let current = this._head; diff --git a/src/vs/base/common/marshalling.ts b/src/vs/base/common/marshalling.ts index 9275b413307c..ab5adf126268 100644 --- a/src/vs/base/common/marshalling.ts +++ b/src/vs/base/common/marshalling.ts @@ -11,7 +11,9 @@ export function stringify(obj: any): string { } export function parse(text: string): any { - return JSON.parse(text, reviver); + let data = JSON.parse(text); + data = revive(data, 0); + return data; } interface MarshalledObject { @@ -30,15 +32,27 @@ function replacer(key: string, value: any): any { return value; } -function reviver(key: string, value: any): any { - let marshallingConst: number; - if (value !== void 0 && value !== null) { - marshallingConst = (value).$mid; +function revive(obj: any, depth: number): any { + + if (!obj || depth > 200) { + return obj; } - switch (marshallingConst) { - case 1: return URI.revive(value); - case 2: return new RegExp(value.source, value.flags); - default: return value; + if (typeof obj === 'object') { + + switch ((obj).$mid) { + case 1: return URI.revive(obj); + case 2: return new RegExp(obj.source, obj.flags); + } + + // walk object (or array) + for (let key in obj) { + if (Object.hasOwnProperty.call(obj, key)) { + obj[key] = revive(obj[key], depth + 1); + } + } } + + return obj; } + diff --git a/src/vs/base/common/types.ts b/src/vs/base/common/types.ts index 84ecab74d333..5cae5c567f88 100644 --- a/src/vs/base/common/types.ts +++ b/src/vs/base/common/types.ts @@ -147,7 +147,7 @@ export function validateConstraint(arg: any, constraint: TypeConstraint): void { if (arg instanceof constraint) { return; } - if (arg && arg.constructor === constraint) { + if (!isUndefinedOrNull(arg) && arg.constructor === constraint) { return; } if (constraint.length === 1 && constraint.call(undefined, arg) === true) { diff --git a/src/vs/base/common/uri.ts b/src/vs/base/common/uri.ts index d99a0e403db9..2ccad2d4ad37 100644 --- a/src/vs/base/common/uri.ts +++ b/src/vs/base/common/uri.ts @@ -174,27 +174,27 @@ export default class URI implements UriComponents { if (scheme === void 0) { scheme = this.scheme; } else if (scheme === null) { - scheme = ''; + scheme = _empty; } if (authority === void 0) { authority = this.authority; } else if (authority === null) { - authority = ''; + authority = _empty; } if (path === void 0) { path = this.path; } else if (path === null) { - path = ''; + path = _empty; } if (query === void 0) { query = this.query; } else if (query === null) { - query = ''; + query = _empty; } if (fragment === void 0) { fragment = this.fragment; } else if (fragment === null) { - fragment = ''; + fragment = _empty; } if (scheme === this.scheme diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index b8b6707cda7c..03a87492c34b 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -8,6 +8,8 @@ import stream = require('vs/base/node/stream'); import iconv = require('iconv-lite'); import { TPromise } from 'vs/base/common/winjs.base'; +import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { exec } from 'child_process'; export const UTF8 = 'utf8'; export const UTF8_with_bom = 'utf8bom'; @@ -165,3 +167,88 @@ export function toCanonicalName(enc: string): string { return enc; } } + +// https://ss64.com/nt/chcp.html +const windowsTerminalEncodings = { + '437': 'cp437', // United States + '850': 'cp850', // Multilingual(Latin I) + '852': 'cp852', // Slavic(Latin II) + '855': 'cp855', // Cyrillic(Russian) + '857': 'cp857', // Turkish + '860': 'cp860', // Portuguese + '861': 'cp861', // Icelandic + '863': 'cp863', // Canadian - French + '865': 'cp865', // Nordic + '866': 'cp866', // Russian + '869': 'cp869', // Modern Greek + '1252': 'cp1252' // West European Latin +}; + +export function resolveTerminalEncoding(verbose?: boolean): TPromise { + let rawEncodingPromise: TPromise; + + // Support a global environment variable to win over other mechanics + const cliEncodingEnv = process.env['VSCODE_CLI_ENCODING']; + if (cliEncodingEnv) { + if (verbose) { + console.log(`Found VSCODE_CLI_ENCODING variable: ${cliEncodingEnv}`); + } + + rawEncodingPromise = TPromise.as(cliEncodingEnv); + } + + // Linux/Mac: use "locale charmap" command + else if (isLinux || isMacintosh) { + rawEncodingPromise = new TPromise(c => { + if (verbose) { + console.log('Running "locale charmap" to detect terminal encoding...'); + } + + exec('locale charmap', (err, stdout, stderr) => c(stdout)); + }); + } + + // Windows: educated guess + else { + rawEncodingPromise = new TPromise(c => { + if (verbose) { + console.log('Running "chcp" to detect terminal encoding...'); + } + + exec('chcp', (err, stdout, stderr) => { + if (stdout) { + const windowsTerminalEncodingKeys = Object.keys(windowsTerminalEncodings); + for (let i = 0; i < windowsTerminalEncodingKeys.length; i++) { + const key = windowsTerminalEncodingKeys[i]; + if (stdout.indexOf(key) >= 0) { + return c(windowsTerminalEncodings[key]); + } + } + } + + return c(void 0); + }); + }); + } + + return rawEncodingPromise.then(rawEncoding => { + if (verbose) { + console.log(`Detected raw terminal encoding: ${rawEncoding}`); + } + + if (!rawEncoding || rawEncoding.toLowerCase() === 'utf-8' || rawEncoding.toLowerCase() === UTF8) { + return UTF8; + } + + const iconvEncoding = toIconvLiteEncoding(rawEncoding); + if (iconv.encodingExists(iconvEncoding)) { + return iconvEncoding; + } + + if (verbose) { + console.log('Unsupported terminal encoding, falling back to UTF-8.'); + } + + return UTF8; + }); +} diff --git a/src/vs/base/node/extfs.ts b/src/vs/base/node/extfs.ts index 77b60dad3172..b01051d4d932 100644 --- a/src/vs/base/node/extfs.ts +++ b/src/vs/base/node/extfs.ts @@ -363,6 +363,35 @@ export function writeFileAndFlush(path: string, data: string | NodeBuffer, optio }); } +export function writeFileAndFlushSync(path: string, data: string | NodeBuffer, options?: { mode?: number; flag?: string; }): void { + if (!canFlush) { + return fs.writeFileSync(path, data, options); + } + + if (!options) { + options = { mode: 0o666, flag: 'w' }; + } + + // Open the file with same flags and mode as fs.writeFile() + const fd = fs.openSync(path, options.flag, options.mode); + + try { + + // It is valid to pass a fd handle to fs.writeFile() and this will keep the handle open! + fs.writeFileSync(fd, data); + + // Flush contents (not metadata) of the file to disk + try { + fs.fdatasyncSync(fd); + } catch (syncError) { + console.warn('[node.js fs] fdatasyncSync is now disabled for this session because it failed: ', syncError); + canFlush = false; + } + } finally { + fs.closeSync(fd); + } +} + /** * Copied from: https://github.com/Microsoft/vscode-node-debug/blob/master/src/node/pathUtilities.ts#L83 * diff --git a/src/vs/base/node/id.ts b/src/vs/base/node/id.ts index 22a79358a0a3..c4c5a8ee431c 100644 --- a/src/vs/base/node/id.ts +++ b/src/vs/base/node/id.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as getmac from 'getmac'; -import * as crypto from 'crypto'; import { TPromise } from 'vs/base/common/winjs.base'; import * as errors from 'vs/base/common/errors'; import * as uuid from 'vs/base/common/uuid'; @@ -86,17 +84,22 @@ export function getMachineId(): TPromise { function getMacMachineId(): TPromise { return new TPromise(resolve => { - try { - getmac.getMac((error, macAddress) => { - if (!error) { - resolve(crypto.createHash('sha256').update(macAddress, 'utf8').digest('hex')); - } else { - resolve(undefined); - } - }); - } catch (err) { + TPromise.join([import('crypto'), import('getmac')]).then(([crypto, getmac]) => { + try { + getmac.getMac((error, macAddress) => { + if (!error) { + resolve(crypto.createHash('sha256').update(macAddress, 'utf8').digest('hex')); + } else { + resolve(undefined); + } + }); + } catch (err) { + errors.onUnexpectedError(err); + resolve(undefined); + } + }, err => { errors.onUnexpectedError(err); resolve(undefined); - } + }); }); } diff --git a/src/vs/base/node/ports.ts b/src/vs/base/node/ports.ts index 1ab7de9ab2cb..94e6cfb01dc5 100644 --- a/src/vs/base/node/ports.ts +++ b/src/vs/base/node/ports.ts @@ -11,24 +11,24 @@ import net = require('net'); * Given a start point and a max number of retries, will find a port that * is openable. Will return 0 in case no free port can be found. */ -export function findFreePort(startPort: number, giveUpAfter: number, timeout: number, clb: (port: number) => void): void { +export function findFreePort(startPort: number, giveUpAfter: number, timeout: number): Thenable { let done = false; - const timeoutHandle = setTimeout(() => { - if (!done) { - done = true; + return new Promise(resolve => { + const timeoutHandle = setTimeout(() => { + if (!done) { + done = true; + return resolve(0); + } + }, timeout); - return clb(0); - } - }, timeout); - - doFindFreePort(startPort, giveUpAfter, (port) => { - if (!done) { - done = true; - clearTimeout(timeoutHandle); - - return clb(port); - } + doFindFreePort(startPort, giveUpAfter, (port) => { + if (!done) { + done = true; + clearTimeout(timeoutHandle); + return resolve(port); + } + }); }); } diff --git a/src/vs/base/node/profiler.ts b/src/vs/base/node/profiler.ts deleted file mode 100644 index 782c20e28f1e..000000000000 --- a/src/vs/base/node/profiler.ts +++ /dev/null @@ -1,100 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { join, basename } from 'path'; -import { writeFile } from 'vs/base/node/pfs'; - -export function startProfiling(name: string): TPromise { - return lazyV8Profiler.value.then(profiler => { - profiler.startProfiling(name); - return true; - }); -} - -const _isRunningOutOfDev = process.env['VSCODE_DEV']; - -export function stopProfiling(dir: string, prefix: string): TPromise { - return lazyV8Profiler.value.then(profiler => { - return profiler.stopProfiling(); - }).then(profile => { - return new TPromise((resolve, reject) => { - - // remove pii paths - if (!_isRunningOutOfDev) { - removePiiPaths(profile); // remove pii from our users - } - - profile.export(function (error, result) { - profile.delete(); - if (error) { - reject(error); - return; - } - let filepath = join(dir, `${prefix}_${profile.title}.cpuprofile`); - if (!_isRunningOutOfDev) { - filepath += '.txt'; // github issues must be: txt, zip, png, gif - } - writeFile(filepath, result).then(() => resolve(filepath), reject); - }); - }); - }); -} - -export function removePiiPaths(profile: Profile) { - const stack = [profile.head]; - while (stack.length > 0) { - const element = stack.pop(); - if (element.url) { - const shortUrl = basename(element.url); - if (element.url !== shortUrl) { - element.url = `pii_removed/${shortUrl}`; - } - } - if (element.children) { - stack.push(...element.children); - } - } -} - -declare interface Profiler { - startProfiling(name: string): void; - stopProfiling(): Profile; -} - -export declare interface Profile { - title: string; - export(callback: (err, data) => void): void; - delete(): void; - head: ProfileSample; -} - -export declare interface ProfileSample { - // bailoutReason:"" - // callUID:2333 - // children:Array[39] - // functionName:"(root)" - // hitCount:0 - // id:1 - // lineNumber:0 - // scriptId:0 - // url:"" - url: string; - children: ProfileSample[]; -} - -const lazyV8Profiler = new class { - private _value: TPromise; - get value() { - if (!this._value) { - this._value = new TPromise((resolve, reject) => { - require(['v8-profiler'], resolve, reject); - }); - } - return this._value; - } -}; diff --git a/src/vs/base/node/ps-win.ps1 b/src/vs/base/node/ps-win.ps1 new file mode 100644 index 000000000000..b98ad7b42c51 --- /dev/null +++ b/src/vs/base/node/ps-win.ps1 @@ -0,0 +1,183 @@ +################################################################################################ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +################################################################################################ + +Param( + [string]$ProcessName = "code.exe", + [int]$MaxSamples = 10 +) + +$processLength = "process(".Length + +function Get-MachineInfo { + $model = (Get-WmiObject -Class Win32_Processor).Name + $memory = (Get-WmiObject -Class Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1MB + $wmi_cs = Get-WmiObject -Class Win32_ComputerSystem + return @{ + "type" = "machineInfo" + "model" = $model + "processors" = $wmi_cs.NumberOfProcessors + "logicalProcessors" = $wmi_cs.NumberOfLogicalProcessors + "totalMemory" = $memory + + } +} +$machineInfo = Get-MachineInfo + +function Get-MachineState { + $proc = Get-WmiObject Win32_Processor + $os = Get-WmiObject win32_OperatingSystem + return @{ + "type" = 'machineState' + "cpuLoad" = $proc.LoadPercentage + "handles" = (Get-Process | Measure-Object Handles -Sum).Sum + "memory" = @{ + "total" = $os.TotalVisibleMemorySize + "free" = $os.FreePhysicalMemory + "swapTotal" = $os.TotalVirtualMemorySize + "swapFree" = $os.FreeVirtualMemory + } + } +} +$machineState = Get-MachineState + +$processId2CpuLoad = @{} +function Get-PerformanceCounters ($logicalProcessors) { + $counterError + # In a first round we get the performance counters and the process ids. + $counters = (Get-Counter ("\Process(*)\% Processor Time", "\Process(*)\ID Process") -ErrorAction SilentlyContinue).CounterSamples + $processKey2Id = @{} + foreach ($counter in $counters) { + if ($counter.Status -ne 0) { + continue + } + $path = $counter.path; + $segments = $path.Split("\"); + $kind = $segments[4]; + $processKey = $segments[3].Substring($processLength, $segments[3].Length - $processLength - 1) + if ($kind -eq "id process") { + $processKey2Id[$processKey] = [uint32]$counter.CookedValue + } + } + foreach ($counter in $counters) { + if ($counter.Status -ne 0) { + continue + } + $path = $counter.path; + $segments = $path.Split("\"); + $kind = $segments[4]; + $processKey = $segments[3].Substring($processLength, $segments[3].Length - $processLength - 1) + if ($kind -eq "% processor time") { + $array = New-Object double[] ($MaxSamples + 1) + $array[0] = ($counter.CookedValue / $logicalProcessors) + $processId = $processKey2Id[$processKey] + if ($processId) { + $processId2CpuLoad[$processId] = $array + } + } + } + # Now lets sample another 10 times but only the processor time + $samples = Get-Counter "\Process(*)\% Processor Time" -SampleInterval 1 -MaxSamples $MaxSamples -ErrorAction SilentlyContinue + for ($s = 0; $s -lt $samples.Count; $s++) { + $counters = $samples[$s].CounterSamples; + foreach ($counter in $counters) { + if ($counter.Status -ne 0) { + continue + } + $path = $counter.path; + $segments = $path.Split("\"); + $processKey = $segments[3].Substring($processLength, $segments[3].Length - $processLength - 1) + $processKey = $processKey2Id[$processKey]; + if ($processKey) { + $processId2CpuLoad[$processKey][$s + 1] = ($counter.CookedValue / $logicalProcessors) + } + } + } +} +Get-PerformanceCounters -logicalProcessors $machineInfo.logicalProcessors + +$topElements = New-Object PSObject[] $processId2CpuLoad.Keys.Count; +$index = 0; +foreach ($key in $processId2CpuLoad.Keys) { + $obj = [PSCustomObject]@{ + ProcessId = $key + Load = ($processId2CpuLoad[$key] | Measure-Object -Sum).Sum / ($MaxSamples + 1) + } + $topElements[$index] = $obj + $index++ +} +$topElements = $topElements | Sort-Object Load -Descending + +# Get all code processes +$codeProcesses = @{} +foreach ($item in Get-WmiObject Win32_Process -Filter "name = '$ProcessName'") { + $codeProcesses[$item.ProcessId] = $item +} +foreach ($item in Get-WmiObject Win32_Process -Filter "name = 'codeHelper.exe'") { + $codeProcesses[$item.ProcessId] = $item +} +$otherProcesses = @{} +foreach ($item in Get-WmiObject Win32_Process -Filter "name Like '%'") { + if (!($codeProcesses.Contains($item.ProcessId))) { + $otherProcesses[$item.ProcessId] = $item + } +} +$modified = $false +do { + $toDelete = @() + $modified = $false + foreach ($item in $otherProcesses.Values) { + if ($codeProcesses.Contains([uint32]$item.ParentProcessId)) { + $codeProcesses[$item.ProcessId] = $item; + $toDelete += $item + } + } + foreach ($item in $toDelete) { + $otherProcesses.Remove([uint32]$item.ProcessId) + $modified = $true + } +} while ($modified) + +$result = New-Object PSObject[] (2 + [math]::Min(5, $topElements.Count) + $codeProcesses.Count) +$result[0] = $machineInfo +$result[1] = $machineState +$index = 2; +for($i = 0; $i -lt 5 -and $i -lt $topElements.Count; $i++) { + $element = $topElements[$i] + $item = $codeProcesses[[uint32]$element.ProcessId] + if (!$item) { + $item = $otherProcesses[[uint32]$element.ProcessId] + } + if ($item) { + $cpuLoad = $processId2CpuLoad[[uint32]$item.ProcessId] | % { [pscustomobject] $_ } + $result[$index] = [pscustomobject]@{ + "type" = "topProcess" + "name" = $item.Name + "processId" = $item.ProcessId + "parentProcessId" = $item.ParentProcessId + "commandLine" = $item.CommandLine + "handles" = $item.HandleCount + "cpuLoad" = $cpuLoad + "workingSetSize" = $item.WorkingSetSize + } + $index++ + } +} +foreach ($item in $codeProcesses.Values) { + # we need to convert this otherwise to JSON with create a value, count object and not an inline array + $cpuLoad = $processId2CpuLoad[[uint32]$item.ProcessId] | % { [pscustomobject] $_ } + $result[$index] = [pscustomobject]@{ + "type" = "processInfo" + "name" = $item.Name + "processId" = $item.ProcessId + "parentProcessId" = $item.ParentProcessId + "commandLine" = $item.CommandLine + "handles" = $item.HandleCount + "cpuLoad" = $cpuLoad + "workingSetSize" = $item.WorkingSetSize + } + $index++ +} + +$result | ConvertTo-Json -Depth 99 diff --git a/src/vs/base/node/ps.ts b/src/vs/base/node/ps.ts new file mode 100644 index 000000000000..4fae9b9466db --- /dev/null +++ b/src/vs/base/node/ps.ts @@ -0,0 +1,253 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { spawn, exec } from 'child_process'; +import * as path from 'path'; +import URI from 'vs/base/common/uri'; + +export interface ProcessItem { + name: string; + cmd: string; + pid: number; + ppid: number; + load: number; + mem: number; + + children?: ProcessItem[]; +} + +export function listProcesses(rootPid: number): Promise { + + return new Promise((resolve, reject) => { + + let rootItem: ProcessItem; + const map = new Map(); + + function addToTree(pid: number, ppid: number, cmd: string, load: number, mem: number) { + + const parent = map.get(ppid); + if (pid === rootPid || parent) { + + const item: ProcessItem = { + name: findName(cmd), + cmd, + pid, + ppid, + load, + mem + }; + map.set(pid, item); + + if (pid === rootPid) { + rootItem = item; + } + + if (parent) { + if (!parent.children) { + parent.children = []; + } + parent.children.push(item); + if (parent.children.length > 1) { + parent.children = parent.children.sort((a, b) => a.pid - b.pid); + } + } + } + } + + function findName(cmd: string): string { + + const RENDERER_PROCESS_HINT = /--disable-blink-features=Auxclick/; + const WINDOWS_WATCHER_HINT = /\\watcher\\win32\\CodeHelper\.exe/; + const WINDOWS_CRASH_REPORTER = /--crashes-directory/; + const WINDOWS_PTY = /\\pipe\\winpty-control/; + const WINDOWS_CONSOLE_HOST = /conhost\.exe/; + const TYPE = /--type=([a-zA-Z-]+)/; + + // find windows file watcher + if (WINDOWS_WATCHER_HINT.exec(cmd)) { + return 'watcherService '; + } + + // find windows crash reporter + if (WINDOWS_CRASH_REPORTER.exec(cmd)) { + return 'electron-crash-reporter'; + } + + // find windows pty process + if (WINDOWS_PTY.exec(cmd)) { + return 'winpty-process'; + } + + //find windows console host process + if (WINDOWS_CONSOLE_HOST.exec(cmd)) { + return 'console-window-host (Windows internal process)'; + } + + // find "--type=xxxx" + let matches = TYPE.exec(cmd); + if (matches && matches.length === 2) { + if (matches[1] === 'renderer') { + if (!RENDERER_PROCESS_HINT.exec(cmd)) { + return 'shared-process'; + } + + return `window`; + } + return matches[1]; + } + + // find all xxxx.js + const JS = /[a-zA-Z-]+\.js/g; + let result = ''; + do { + matches = JS.exec(cmd); + if (matches) { + result += matches + ' '; + } + } while (matches); + + if (result) { + if (cmd.indexOf('node ') !== 0) { + return `electron_node ${result}`; + } + } + return cmd; + } + + if (process.platform === 'win32') { + + interface ProcessInfo { + type: 'processInfo'; + name: string; + processId: number; + parentProcessId: number; + commandLine: string; + handles: number; + cpuLoad: number[]; + workingSetSize: number; + } + + interface TopProcess { + type: 'topProcess'; + name: string; + processId: number; + parentProcessId: number; + commandLine: string; + handles: number; + cpuLoad: number[]; + workingSetSize: number; + } + + type Item = ProcessInfo | TopProcess; + + const cleanUNCPrefix = (value: string): string => { + if (value.indexOf('\\\\?\\') === 0) { + return value.substr(4); + } else if (value.indexOf('\\??\\') === 0) { + return value.substr(4); + } else if (value.indexOf('"\\\\?\\') === 0) { + return '"' + value.substr(5); + } else if (value.indexOf('"\\??\\') === 0) { + return '"' + value.substr(5); + } else { + return value; + } + }; + + const execMain = path.basename(process.execPath).replace(/ /g, '` '); + const script = URI.parse(require.toUrl('vs/base/node/ps-win.ps1')).fsPath.replace(/ /g, '` '); + const commandLine = `${script} -ProcessName ${execMain} -MaxSamples 3`; + const cmd = spawn('powershell.exe', ['-ExecutionPolicy', 'Bypass', '-Command', commandLine]); + + let stdout = ''; + let stderr = ''; + cmd.stdout.on('data', data => { + stdout += data.toString(); + }); + + cmd.stderr.on('data', data => { + stderr += data.toString(); + }); + + cmd.on('exit', () => { + if (stderr.length > 0) { + reject(stderr); + } + let processItems: Map = new Map(); + try { + const items: Item[] = JSON.parse(stdout); + for (const item of items) { + if (item.type === 'processInfo') { + let load = 0; + if (item.cpuLoad) { + for (let value of item.cpuLoad) { + load += value; + } + load = load / item.cpuLoad.length; + } else { + load = -1; + } + let commandLine = cleanUNCPrefix(item.commandLine); + processItems.set(item.processId, { + name: findName(commandLine), + cmd: commandLine, + pid: item.processId, + ppid: item.parentProcessId, + load: load, + mem: item.workingSetSize + }); + } + } + rootItem = processItems.get(rootPid); + if (rootItem) { + processItems.forEach(item => { + let parent = processItems.get(item.ppid); + if (parent) { + if (!parent.children) { + parent.children = []; + } + parent.children.push(item); + } + }); + processItems.forEach(item => { + if (item.children) { + item.children = item.children.sort((a, b) => a.pid - b.pid); + } + }); + resolve(rootItem); + } else { + reject(new Error(`Root process ${rootPid} not found`)); + } + } catch (error) { + reject(error); + } + }); + } else { // OS X & Linux + + const CMD = 'ps -ax -o pid=,ppid=,pcpu=,pmem=,command='; + const PID_CMD = /^\s*([0-9]+)\s+([0-9]+)\s+([0-9]+\.[0-9]+)\s+([0-9]+\.[0-9]+)\s+(.+)$/; + + exec(CMD, { maxBuffer: 1000 * 1024 }, (err, stdout, stderr) => { + + if (err || stderr) { + reject(err || stderr.toString()); + } else { + + const lines = stdout.toString().split('\n'); + for (const line of lines) { + let matches = PID_CMD.exec(line.trim()); + if (matches && matches.length === 6) { + addToTree(parseInt(matches[1]), parseInt(matches[2]), matches[5], parseFloat(matches[3]), parseFloat(matches[4])); + } + } + + resolve(rootItem); + } + }); + } + }); +} diff --git a/src/vs/base/node/stats.ts b/src/vs/base/node/stats.ts new file mode 100644 index 000000000000..5a802cbd0c2a --- /dev/null +++ b/src/vs/base/node/stats.ts @@ -0,0 +1,152 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { readdirSync, statSync, existsSync, readFileSync } from 'fs'; +import { join } from 'path'; + +export interface WorkspaceStatItem { + name: string; + count: number; +} + +export interface WorkspaceStats { + fileTypes: WorkspaceStatItem[]; + configFiles: WorkspaceStatItem[]; + fileCount: number; + maxFilesReached: boolean; +} + +function asSortedItems(map: Map): WorkspaceStatItem[] { + let a: WorkspaceStatItem[] = []; + map.forEach((value, index) => a.push({ name: index, count: value })); + return a.sort((a, b) => b.count - a.count); +} + +export function collectLaunchConfigs(folder: string): WorkspaceStatItem[] { + let launchConfigs = new Map(); + + let launchConfig = join(folder, '.vscode', 'launch.json'); + if (existsSync(launchConfig)) { + try { + const contents = readFileSync(launchConfig).toString(); + const json = JSON.parse(contents); + if (json['configurations']) { + for (const each of json['configurations']) { + const type = each['type']; + if (type) { + if (launchConfigs.has(type)) { + launchConfigs.set(type, launchConfigs.get(type) + 1); + } + else { + launchConfigs.set(type, 1); + } + } + } + } + } catch { + } + } + return asSortedItems(launchConfigs); +} + +export function collectWorkspaceStats(folder: string, filter: string[]): WorkspaceStats { + const configFilePatterns = [ + { 'tag': 'grunt.js', 'pattern': /^gruntfile\.js$/i }, + { 'tag': 'gulp.js', 'pattern': /^gulpfile\.js$/i }, + { 'tag': 'tsconfig.json', 'pattern': /^tsconfig\.json$/i }, + { 'tag': 'package.json', 'pattern': /^package\.json$/i }, + { 'tag': 'jsconfig.json', 'pattern': /^jsconfig\.json$/i }, + { 'tag': 'tslint.json', 'pattern': /^tslint\.json$/i }, + { 'tag': 'eslint.json', 'pattern': /^eslint\.json$/i }, + { 'tag': 'tasks.json', 'pattern': /^tasks\.json$/i }, + { 'tag': 'launch.json', 'pattern': /^launch\.json$/i }, + { 'tag': 'settings.json', 'pattern': /^settings\.json$/i }, + { 'tag': 'webpack.config.js', 'pattern': /^webpack\.config\.js$/i }, + { 'tag': 'project.json', 'pattern': /^project\.json$/i }, + { 'tag': 'makefile', 'pattern': /^makefile$/i }, + { 'tag': 'sln', 'pattern': /^.+\.sln$/i }, + { 'tag': 'csproj', 'pattern': /^.+\.csproj$/i }, + { 'tag': 'cmake', 'pattern': /^.+\.cmake$/i } + ]; + + let fileTypes = new Map(); + let configFiles = new Map(); + + const MAX_FILES = 20000; + + let walkSync = (dir: string, acceptFile: (fileName: string) => void, filter: string[], token) => { + try { + let files = readdirSync(dir); + for (const file of files) { + if (token.maxReached) { + return; + } + try { + if (statSync(join(dir, file)).isDirectory()) { + if (filter.indexOf(file) === -1) { + walkSync(join(dir, file), acceptFile, filter, token); + } + } + else { + if (token.count >= MAX_FILES) { + token.maxReached = true; + return; + } + token.count++; + acceptFile(file); + } + } catch { + // skip over files for which stat fails + } + } + } catch { + // skip over folders that cannot be read + } + }; + + let addFileType = (fileType: string) => { + if (fileTypes.has(fileType)) { + fileTypes.set(fileType, fileTypes.get(fileType) + 1); + } + else { + fileTypes.set(fileType, 1); + } + }; + + let addConfigFiles = (fileName: string) => { + for (const each of configFilePatterns) { + if (each.pattern.test(fileName)) { + if (configFiles.has(each.tag)) { + configFiles.set(each.tag, configFiles.get(each.tag) + 1); + } else { + configFiles.set(each.tag, 1); + } + } + } + }; + + let acceptFile = (name: string) => { + if (name.lastIndexOf('.') >= 0) { + let suffix: string | undefined = name.split('.').pop(); + if (suffix) { + addFileType(suffix); + } + } + addConfigFiles(name); + }; + + let token: { count: number, maxReached: boolean } = { count: 0, maxReached: false }; + walkSync(folder, acceptFile, filter, token); + + return { + configFiles: asSortedItems(configFiles), + fileTypes: asSortedItems(fileTypes), + fileCount: token.count, + maxFilesReached: token.maxReached + + }; +} \ No newline at end of file diff --git a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts index 773a4b79b4d1..914878e54541 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts @@ -171,8 +171,13 @@ export class QuickOpenEntry { return false; } - public isFile(): boolean { - return false; // TODO@Ben debt with editor history merging + /** + * Determines if this quick open entry should merge with the editor history in quick open. If set to true + * and the resource of this entry is the same as the resource for an editor history, it will not show up + * because it is considered to be a duplicate of an editor history. + */ + public mergeWithEditorHistory(): boolean { + return false; } } @@ -412,8 +417,6 @@ class Renderer implements IRenderer { data.actionBar.context = entry; // make sure the context is the current element this.actionProvider.getActions(null, entry).then((actions) => { - // TODO@Ben this will not work anymore as soon as quick open has more actions - // but as long as there is only one are ok if (data.actionBar.isEmpty() && actions && actions.length > 0) { data.actionBar.push(actions, { icon: true, label: false }); } else if (!data.actionBar.isEmpty() && (!actions || actions.length === 0)) { diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index 0fa4964c6756..4804d0c7b46c 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -10,10 +10,10 @@ import { TPromise } from 'vs/base/common/winjs.base'; import platform = require('vs/base/common/platform'); import types = require('vs/base/common/types'); import errors = require('vs/base/common/errors'); -import { IQuickNavigateConfiguration, IAutoFocus, IEntryRunContext, IModel, Mode } from 'vs/base/parts/quickopen/common/quickOpen'; +import { IQuickNavigateConfiguration, IAutoFocus, IEntryRunContext, IModel, Mode, IKeyMods } from 'vs/base/parts/quickopen/common/quickOpen'; import { Filter, Renderer, DataSource, IModelProvider, AccessibilityProvider } from 'vs/base/parts/quickopen/browser/quickOpenViewer'; import { Dimension, Builder, $ } from 'vs/base/browser/builder'; -import { ISelectionEvent, IFocusEvent, ITree, ContextMenuEvent, IActionProvider, ITreeStyles } from 'vs/base/parts/tree/browser/tree'; +import { ISelectionEvent, IFocusEvent, ITree, ContextMenuEvent, IActionProvider, ITreeStyles, ITreeOptions, ITreeConfiguration } from 'vs/base/parts/tree/browser/tree'; import { InputBox, MessageType, IInputBoxStyles, IRange } from 'vs/base/browser/ui/inputbox/inputBox'; import Severity from 'vs/base/common/severity'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; @@ -21,7 +21,7 @@ import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { DefaultController, ClickBehavior } from 'vs/base/parts/tree/browser/treeDefaults'; import DOM = require('vs/base/browser/dom'); -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { KeyCode } from 'vs/base/common/keyCodes'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { Color } from 'vs/base/common/color'; @@ -43,6 +43,7 @@ export interface IQuickOpenOptions extends IQuickOpenStyles { inputAriaLabel?: string; actionProvider?: IActionProvider; keyboardSupport?: boolean; + treeCreator?: (container: HTMLElement, configuration: ITreeConfiguration, options?: ITreeOptions) => ITree; } export interface IQuickOpenStyles extends IInputBoxStyles, ITreeStyles { @@ -61,10 +62,6 @@ export interface IShowOptions { inputSelection?: IRange; } -export interface IQuickOpenUsageLogger { - publicLog(eventName: string, data?: any): void; -} - export class QuickOpenController extends DefaultController { public onContextMenu(tree: ITree, element: any, event: ContextMenuEvent): boolean { @@ -115,14 +112,13 @@ export class QuickOpenWidget implements IModelProvider { private container: HTMLElement; private treeElement: HTMLElement; private inputElement: HTMLElement; - private usageLogger: IQuickOpenUsageLogger; private layoutDimensions: Dimension; private model: IModel; private inputChangingTimeoutHandle: number; private styles: IQuickOpenStyles; private renderer: Renderer; - constructor(container: HTMLElement, callbacks: IQuickOpenCallbacks, options: IQuickOpenOptions, usageLogger?: IQuickOpenUsageLogger) { + constructor(container: HTMLElement, callbacks: IQuickOpenCallbacks, options: IQuickOpenOptions) { this.isDisposed = false; this.toUnbind = []; this.container = container; @@ -130,7 +126,6 @@ export class QuickOpenWidget implements IModelProvider { this.options = options; this.styles = options || Object.create(null); mixin(this.styles, defaultStyles, false); - this.usageLogger = usageLogger; this.model = null; } @@ -231,7 +226,9 @@ export class QuickOpenWidget implements IModelProvider { this.treeContainer = div.div({ 'class': 'quick-open-tree' }, (div: Builder) => { - this.tree = new Tree(div.getHTMLElement(), { + const createTree = this.options.treeCreator || ((container, config, opts) => new Tree(container, config, opts)); + + this.tree = createTree(div.getHTMLElement(), { dataSource: new DataSource(this), controller: new QuickOpenController({ clickBehavior: ClickBehavior.ON_MOUSE_UP, keyboardSupport: this.options.keyboardSupport }), renderer: (this.renderer = new Renderer(this, this.styles)), @@ -393,7 +390,7 @@ export class QuickOpenWidget implements IModelProvider { }); } - if (this.tree) { + if (this.tree && !this.options.treeCreator) { this.tree.style(this.styles); } @@ -526,31 +523,17 @@ export class QuickOpenWidget implements IModelProvider { hide = this.model.runner.run(value, mode, context); } - // add telemetry when an item is accepted, logging the index of the item in the list and the length of the list - // to measure the rate of the success and the relevance of the order - if (this.usageLogger) { - const indexOfAcceptedElement = this.model.entries.indexOf(value); - const entriesCount = this.model.entries.length; - /* __GDPR__ - "quickOpenWidgetItemAccepted" : { - "index" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "count": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "isQuickNavigate": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.usageLogger.publicLog('quickOpenWidgetItemAccepted', { index: indexOfAcceptedElement, count: entriesCount, isQuickNavigate: this.quickNavigateConfiguration ? true : false }); - } - // Hide if command was run successfully if (hide) { this.hide(HideReason.ELEMENT_SELECTED); } } - private extractKeyMods(event: any): number[] { - const isCtrlCmd = event && (event.ctrlKey || event.metaKey || (event.payload && event.payload.originalEvent && (event.payload.originalEvent.ctrlKey || event.payload.originalEvent.metaKey))); - - return isCtrlCmd ? [KeyMod.CtrlCmd] : []; + private extractKeyMods(event: any): IKeyMods { + return { + ctrlCmd: event && (event.ctrlKey || event.metaKey || (event.payload && event.payload.originalEvent && (event.payload.originalEvent.ctrlKey || event.payload.originalEvent.metaKey))), + alt: event && (event.altKey || (event.payload && event.payload.originalEvent && event.payload.originalEvent.altKey)) + }; } public show(prefix: string, options?: IShowOptions): void; @@ -774,22 +757,6 @@ export class QuickOpenWidget implements IModelProvider { this.builder.hide(); this.builder.domBlur(); - // report failure cases - if (reason === HideReason.CANCELED) { - if (this.model) { - const entriesCount = this.model.entries.filter(e => this.isElementVisible(this.model, e)).length; - if (this.usageLogger) { - /* __GDPR__ - "quickOpenWidgetCancelled" : { - "count" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "isQuickNavigate": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.usageLogger.publicLog('quickOpenWidgetCancelled', { count: entriesCount, isQuickNavigate: this.quickNavigateConfiguration ? true : false }); - } - } - } - // Clear input field and clear tree this.inputBox.value = ''; this.tree.setInput(null); @@ -887,10 +854,6 @@ export class QuickOpenWidget implements IModelProvider { return this.tree.getInput(); } - public getTree(): ITree { - return this.tree; - } - public showInputDecoration(decoration: Severity): void { if (this.inputBox) { this.inputBox.showMessage({ type: decoration === Severity.Info ? MessageType.INFO : decoration === Severity.Warning ? MessageType.WARNING : MessageType.ERROR, content: '' }); diff --git a/src/vs/base/parts/quickopen/common/quickOpen.ts b/src/vs/base/parts/quickopen/common/quickOpen.ts index 1efef91896c0..70be0054a754 100644 --- a/src/vs/base/parts/quickopen/common/quickOpen.ts +++ b/src/vs/base/parts/quickopen/common/quickOpen.ts @@ -6,11 +6,6 @@ import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; -/* __GDPR__FRAGMENT__ - "IQuickNavigateConfiguration" : { - "keybindings" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ export interface IQuickNavigateConfiguration { keybindings: ResolvedKeybinding[]; } @@ -54,10 +49,15 @@ export enum Mode { export interface IEntryRunContext { event: any; - keymods: number[]; + keymods: IKeyMods; quickNavigateConfiguration: IQuickNavigateConfiguration; } +export interface IKeyMods { + ctrlCmd: boolean; + alt: boolean; +} + export interface IDataSource { getId(entry: T): string; getLabel(entry: T): string; diff --git a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts index b144e1a8ef14..4d151a7c2179 100644 --- a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts +++ b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts @@ -52,20 +52,6 @@ export function score(target: string, query: string, queryLower: string, fuzzy: } } - // When searching fuzzy, we require the query to be contained fully - // in the target string as separate substrings - else { - let targetOffset = 0; - for (let queryIndex = 0; queryIndex < queryLength; queryIndex++) { - targetOffset = targetLower.indexOf(queryLower[queryIndex], targetOffset); - if (targetOffset === -1) { - return NO_SCORE; - } - - targetOffset++; - } - } - const res = doScore(query, queryLower, queryLength, target, targetLower, targetLength); // if (DEBUG) { @@ -81,7 +67,8 @@ function doScore(query: string, queryLower: string, queryLength: number, target: const matches = []; // - // Build Scorer Matrix + // Build Scorer Matrix: + // // The matrix is composed of query q and target t. For each index we score // q[i] with t[i] and compare that with the previous score. If the score is // equal or larger, we keep the match. In addition to the score, we also keep @@ -105,7 +92,17 @@ function doScore(query: string, queryLower: string, queryLength: number, target: const matchesSequenceLength = queryIndex > 0 && targetIndex > 0 ? matches[diagIndex] : 0; - const score = computeCharScore(query, queryLower, queryIndex, target, targetLower, targetIndex, matchesSequenceLength); + // If we are not matching on the first query character any more, we only produce a + // score if we had a score previously for the last query index (by looking at the diagScore). + // This makes sure that the query always matches in sequence on the target. For example + // given a target of "ede" and a query of "de", we would otherwise produce a wrong high score + // for query[1] ("e") matching on target[0] ("e") because of the "beginning of word" boost. + let score: number; + if (!diagScore && queryIndex > 0) { + score = 0; + } else { + score = computeCharScore(query, queryLower, queryIndex, target, targetLower, targetIndex, matchesSequenceLength); + } // We have a score and its equal or larger than the left score // Match: sequence continues growing from previous diag value @@ -145,7 +142,7 @@ function doScore(query: string, queryLower: string, queryLength: number, target: // Print matrix // if (DEBUG_MATRIX) { - // printMatrix(query, target, matches, scores); + // printMatrix(query, target, matches, scores); // } return [scores[queryLength * targetLength - 1], positions.reverse()]; diff --git a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts index cc33d36270c1..29e70e70ca18 100644 --- a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +++ b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts @@ -244,6 +244,43 @@ suite('Quick Open Scorer', () => { assert.ok(!res.score); }); + test('scoreItem - proper target offset #2', function () { + const resource = URI.file('ede'); + + const res = scoreItem(resource, 'de', true, ResourceAccessor, cache); + + assert.equal(res.labelMatch.length, 1); + assert.equal(res.labelMatch[0].start, 1); + assert.equal(res.labelMatch[0].end, 3); + }); + + test('scoreItem - proper target offset #3', function () { + const resource = URI.file('/src/vs/editor/browser/viewParts/lineNumbers/flipped-cursor-2x.svg'); + + const res = scoreItem(resource, 'debug', true, ResourceAccessor, cache); + + assert.equal(res.descriptionMatch.length, 3); + assert.equal(res.descriptionMatch[0].start, 9); + assert.equal(res.descriptionMatch[0].end, 10); + assert.equal(res.descriptionMatch[1].start, 36); + assert.equal(res.descriptionMatch[1].end, 37); + assert.equal(res.descriptionMatch[2].start, 40); + assert.equal(res.descriptionMatch[2].end, 41); + + assert.equal(res.labelMatch.length, 2); + assert.equal(res.labelMatch[0].start, 9); + assert.equal(res.labelMatch[0].end, 10); + assert.equal(res.labelMatch[1].start, 20); + assert.equal(res.labelMatch[1].end, 21); + }); + + test('scoreItem - no match unless query contained in sequence', function () { + const resource = URI.file('abcde'); + + const res = scoreItem(resource, 'edcda', true, ResourceAccessor, cache); + assert.ok(!res.score); + }); + test('compareItemsByScore - identity', function () { const resourceA = URI.file('/some/path/fileA.txt'); const resourceB = URI.file('/some/path/other/fileB.txt'); diff --git a/src/vs/base/parts/tree/browser/treeDnd.ts b/src/vs/base/parts/tree/browser/treeDnd.ts index abae2bcfd18b..7b2fa8c4b1ad 100644 --- a/src/vs/base/parts/tree/browser/treeDnd.ts +++ b/src/vs/base/parts/tree/browser/treeDnd.ts @@ -10,6 +10,7 @@ import { DefaultDragAndDrop } from 'vs/base/parts/tree/browser/treeDefaults'; import URI from 'vs/base/common/uri'; import { basename } from 'vs/base/common/paths'; import { getPathLabel } from 'vs/base/common/labels'; +import { DataTransfers } from 'vs/base/browser/dnd'; export class ElementsDragAndDropData implements _.IDragAndDropData { @@ -116,7 +117,7 @@ export class SimpleFileResourceDragAndDrop extends DefaultDragAndDrop { // Apply some datatransfer types to allow for dragging the element outside of the application const resource = this.toResource(source); if (resource) { - originalEvent.dataTransfer.setData('text/plain', getPathLabel(resource)); + originalEvent.dataTransfer.setData(DataTransfers.TEXT, getPathLabel(resource)); } } } \ No newline at end of file diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 76b81d400388..041c4285a439 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -23,6 +23,8 @@ import { HeightMap, IViewItem } from 'vs/base/parts/tree/browser/treeViewModel'; import _ = require('vs/base/parts/tree/browser/tree'); import { KeyCode } from 'vs/base/common/keyCodes'; import Event, { Emitter } from 'vs/base/common/event'; +import { IDomNodePagePosition } from 'vs/base/browser/dom'; +import { DataTransfers } from 'vs/base/browser/dnd'; export interface IRow { element: HTMLElement; @@ -378,7 +380,6 @@ export class TreeView extends HeightMap { private styleElement: HTMLStyleElement; private rowsContainer: HTMLElement; private scrollableElement: ScrollableElement; - private wrapperGesture: Touch.Gesture; private msGesture: MSGesture; private lastPointerType: string; private lastClickTimeStamp: number = 0; @@ -475,7 +476,7 @@ export class TreeView extends HeightMap { this.wrapper.style.msTouchAction = 'none'; this.wrapper.style.msContentZooming = 'none'; } else { - this.wrapperGesture = new Touch.Gesture(this.wrapper); + Touch.Gesture.addTarget(this.wrapper); } this.rowsContainer = document.createElement('div'); @@ -1221,13 +1222,16 @@ export class TreeView extends HeightMap { var keyboardEvent = new Keyboard.StandardKeyboardEvent(event); element = this.model.getFocus(); - if (!element) { - return; - } + var position: IDomNodePagePosition; - var id = this.context.dataSource.getId(this.context.tree, element); - var viewItem = this.items[id]; - var position = DOM.getDomNodePagePosition(viewItem.element); + if (!element) { + element = this.model.getInput(); + position = DOM.getDomNodePagePosition(this.inputItem.element); + } else { + var id = this.context.dataSource.getId(this.context.tree, element); + var viewItem = this.items[id]; + position = DOM.getDomNodePagePosition(viewItem.element); + } resultEvent = new _.KeyboardContextMenuEvent(position.left + position.width, position.top, keyboardEvent); @@ -1288,7 +1292,7 @@ export class TreeView extends HeightMap { } e.dataTransfer.effectAllowed = 'copyMove'; - e.dataTransfer.setData('URL', item.uri); + e.dataTransfer.setData(DataTransfers.URL, item.uri); if (e.dataTransfer.setDragImage) { let label: string; @@ -1642,11 +1646,6 @@ export class TreeView extends HeightMap { } this.domNode = null; - if (this.wrapperGesture) { - this.wrapperGesture.dispose(); - this.wrapperGesture = null; - } - if (this.context.cache) { this.context.cache.dispose(); this.context.cache = null; diff --git a/src/vs/base/test/browser/builder.test.ts b/src/vs/base/test/browser/builder.test.ts index 76d1221c7807..717b5a37ccf3 100644 --- a/src/vs/base/test/browser/builder.test.ts +++ b/src/vs/base/test/browser/builder.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { Build, Builder, MultiBuilder, Binding, Dimension, Position, Box, $ } from 'vs/base/browser/builder'; +import { Build, Builder, MultiBuilder, $, bindElement, withElement, setPropertyOnElement, getPropertyFromElement } from 'vs/base/browser/builder'; import * as Types from 'vs/base/common/types'; import * as DomUtils from 'vs/base/browser/dom'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -30,6 +30,17 @@ let withBuilder = function (builder: Builder, offdom: boolean) { return new Builder(builder.getHTMLElement(), offdom); }; +function select(builder: Builder, selector: string, offdom?: boolean): MultiBuilder { + let elements = builder.getHTMLElement().querySelectorAll(selector); + + let builders: Builder[] = []; + for (let i = 0; i < elements.length; i++) { + builders.push(withElement(elements.item(i), offdom)); + } + + return new MultiBuilder(builders); +} + suite('Builder', () => { let fixture: HTMLElement; let fixtureId = 'builder-fixture'; @@ -44,19 +55,6 @@ suite('Builder', () => { document.body.removeChild(fixture); }); - test('Dimension.substract()', function () { - let d1 = new Dimension(200, 100); - let d2 = new Box(10, 20, 30, 40); - - assert.deepEqual(d1.substract(d2), new Dimension(140, 60)); - }); - - test('Position', function () { - let p = new Position(200, 100); - assert.strictEqual(p.x, 200); - assert.strictEqual(p.y, 100); - }); - test('Binding', function () { let b = Build.withElementById(fixtureId, false); let element = b.getHTMLElement(); @@ -64,34 +62,17 @@ suite('Builder', () => { assert(element); // Properties - Binding.setPropertyOnElement(element, 'foo', 'bar'); - assert.strictEqual(Binding.getPropertyFromElement(element, 'foo'), 'bar'); + setPropertyOnElement(element, 'foo', 'bar'); + assert.strictEqual(getPropertyFromElement(element, 'foo'), 'bar'); - Binding.setPropertyOnElement(element, 'foo', { foo: 'bar' }); - assert.deepEqual(Binding.getPropertyFromElement(element, 'foo'), { foo: 'bar' }); + setPropertyOnElement(element, 'foo', { foo: 'bar' }); + assert.deepEqual(getPropertyFromElement(element, 'foo'), { foo: 'bar' }); - Binding.removePropertyFromElement(element, 'foo'); + setPropertyOnElement(element, 'bar', 'bar'); + assert.strictEqual(getPropertyFromElement(element, 'bar'), 'bar'); - Binding.setPropertyOnElement(element, 'bar', 'bar'); - assert.strictEqual(Binding.getPropertyFromElement(element, 'bar'), 'bar'); - - Binding.setPropertyOnElement(element, 'bar', { foo: 'bar' }); - assert.deepEqual(Binding.getPropertyFromElement(element, 'bar'), { foo: 'bar' }); - - Binding.removePropertyFromElement(element, 'bar'); - - assert(!Binding.getPropertyFromElement(element, 'foo')); - assert(!Binding.getPropertyFromElement(element, 'bar')); - - // Binding - Binding.bindElement(element, 'bar'); - assert.strictEqual(Binding.getBindingFromElement(element), 'bar'); - - Binding.bindElement(element, { foo: 'bar' }); - assert.deepEqual(Binding.getBindingFromElement(element), { foo: 'bar' }); - - Binding.unbindElement(element); - assert(!Binding.getBindingFromElement(element)); + setPropertyOnElement(element, 'bar', { foo: 'bar' }); + assert.deepEqual(getPropertyFromElement(element, 'bar'), { foo: 'bar' }); }); test('Select', function () { @@ -103,7 +84,6 @@ suite('Builder', () => { assert(allDivs); assert(allDivs.length >= 1); assert(Types.isFunction(allDivs.push)); - assert(Types.isFunction(allDivs.pop)); assert(allDivs instanceof MultiBuilder); for (let key in b) { @@ -117,7 +97,6 @@ suite('Builder', () => { assert(noElement); assert(noElement.length === 0); assert(Types.isFunction(noElement.push)); - assert(Types.isFunction(noElement.pop)); assert(noElement instanceof MultiBuilder); for (let key in b) { @@ -267,7 +246,7 @@ suite('Builder', () => { b.build(Build.withElementById(fixtureId), 0); b = Build.withElementById(fixtureId); - let divs = b.select('div'); + let divs = select(b, 'div'); assert.strictEqual(divs.length, 4); let ids = divs.attr('id'); @@ -282,7 +261,7 @@ suite('Builder', () => { b.build(Build.withElementById(fixtureId), 2); b = Build.withElementById(fixtureId); - divs = b.select('div'); + divs = select(b, 'div'); assert.strictEqual(divs.length, 5); ids = divs.attr('id'); @@ -304,8 +283,6 @@ suite('Builder', () => { divBuilder.span({ innerHtml: 'see man' }); - - assert.strictEqual(divBuilder.parent().attr('id'), 'foobar'); }); test('Builder.clone()', function () { @@ -337,10 +314,8 @@ suite('Builder', () => { div.span(); }); - let multiBuilder = Build.withElementById(fixtureId).select('div'); + let multiBuilder = select(Build.withElementById(fixtureId), 'div'); assert(multiBuilder.length === 3); - - assert(multiBuilder.select('span').length === 3); }); test('Builder.p() and other elements', function () { @@ -381,8 +356,8 @@ suite('Builder', () => { assert.strictEqual('p', div.getHTMLElement().nodeName.toLowerCase()); }); - assert.strictEqual(Build.withElementById(fixtureId).select('div').length, 1); - assert.strictEqual(Build.withElementById(fixtureId).select('*').length, 7); + assert.strictEqual(select(Build.withElementById(fixtureId), 'div').length, 1); + assert.strictEqual(select(Build.withElementById(fixtureId), '*').length, 7); assert.strictEqual(Build.withElementById('builderspan').getHTMLElement().innerHTML, 'Foo Bar'); assert.strictEqual(Build.withElementById('builderimg').attr('src'), '#'); @@ -390,7 +365,6 @@ suite('Builder', () => { // Assert HTML through DOM let root = document.getElementById(fixtureId); - assert.strictEqual(b.parent().getHTMLElement(), root); assert.strictEqual(root.childNodes.length, 1); let div = root.childNodes[0]; @@ -453,8 +427,8 @@ suite('Builder', () => { }); }); - assert.strictEqual(Build.withElementById(fixtureId).select('div').length, 1); - assert.strictEqual(Build.withElementById(fixtureId).select('*').length, 7); + assert.strictEqual(select(Build.withElementById(fixtureId), 'div').length, 1); + assert.strictEqual(select(Build.withElementById(fixtureId), '*').length, 7); assert.strictEqual(Build.withElementById('builderspan').getHTMLElement().innerHTML, 'Foo Bar'); assert.strictEqual(Build.withElementById('builderimg').attr('src'), '#'); @@ -550,36 +524,21 @@ suite('Builder', () => { b.div(); b.id('foobar'); - b.src('foobar'); - b.href('foobar'); b.title('foobar'); - b.name('foobar'); b.type('foobar'); b.value('foobar'); - b.alt('foobar'); - b.draggable(true); b.tabindex(0); assert.strictEqual(b.attr('id'), 'foobar'); - assert.strictEqual(b.attr('src'), 'foobar'); - assert.strictEqual(b.attr('href'), 'foobar'); assert.strictEqual(b.attr('title'), 'foobar'); - assert.strictEqual(b.attr('name'), 'foobar'); assert.strictEqual(b.attr('type'), 'foobar'); assert.strictEqual(b.attr('value'), 'foobar'); - assert.strictEqual(b.attr('alt'), 'foobar'); - assert.strictEqual(b.attr('draggable'), 'true'); assert.strictEqual(b.attr('tabindex'), '0'); assert.strictEqual(b.getHTMLElement().getAttribute('id'), 'foobar'); - assert.strictEqual(b.getHTMLElement().getAttribute('src'), 'foobar'); - assert.strictEqual(b.getHTMLElement().getAttribute('href'), 'foobar'); assert.strictEqual(b.getHTMLElement().getAttribute('title'), 'foobar'); - assert.strictEqual(b.getHTMLElement().getAttribute('name'), 'foobar'); assert.strictEqual(b.getHTMLElement().getAttribute('type'), 'foobar'); assert.strictEqual(b.getHTMLElement().getAttribute('value'), 'foobar'); - assert.strictEqual(b.getHTMLElement().getAttribute('alt'), 'foobar'); - assert.strictEqual(b.getHTMLElement().getAttribute('draggable'), 'true'); assert.strictEqual(b.getHTMLElement().getAttribute('tabindex'), '0'); }); @@ -612,35 +571,6 @@ suite('Builder', () => { assert(!b.hasClass('barfoo')); assert(!b.hasClass('foobar')); assert(!b.getHTMLElement().className); - - b.addClass('foobar'); - b.swapClass('foobar', 'barfoo'); - assert(b.hasClass('barfoo')); - b.swapClass('foobar', 'barfoo'); - assert(b.hasClass('foobar')); - - b.toggleClass('foobar'); - assert(!b.hasClass('foobar')); - - b.toggleClass('barfoo'); - assert(b.hasClass('barfoo')); - - b.setClass('helloworld'); - assert(!b.hasClass('barfoo')); - assert(b.hasClass('helloworld')); - b.setClass(''); - assert(!b.hasClass('helloworld')); - }); - - test('Builder.color() and .background()', function () { - let b = Build.withElementById(fixtureId); - b.div(); - - b.color('red').background('blue'); - - assert.strictEqual(b.style('color'), 'red'); - assert.strictEqual(b.style('background-color'), 'blue'); - assert(b.getComputedStyle()); }); test('Builder.padding() and .margin()', function () { @@ -692,45 +622,6 @@ suite('Builder', () => { assert.strictEqual(b.style('maxHeight'), '600px'); }); - test('Builder.float() and .clear()', function () { - let b = Build.withElementById(fixtureId); - b.div(); - - b.float('left'); - b.clear('right'); - - assert.strictEqual(b.style('float'), 'left'); - assert.strictEqual(b.style('clear'), 'right'); - }); - - test('Builder.normal(), .italic(), .bold() and underline()', function () { - let b = Build.withElementById(fixtureId); - b.div(); - - b.italic().underline().bold(); - - assert(b.style('font-weight') === 'bold' || b.style('font-weight') === '700'); // For Opera - assert.strictEqual(b.style('text-decoration'), 'underline'); - assert.strictEqual(b.style('font-style'), 'italic'); - - b.normal(); - - assert(b.style('font-weight') === 'normal' || b.style('font-weight') === '400'); // For Opera - assert(b.style('text-decoration') === 'none' || b.style('text-decoration') === 'initial'); - assert.strictEqual(b.style('font-style'), 'normal'); - }); - - test('Builder.display() and .overflow()', function () { - let b = Build.withElementById(fixtureId); - b.div(); - - b.display('inline'); - b.overflow('hidden'); - - assert.strictEqual(b.style('display'), 'inline'); - assert.strictEqual(b.style('overflow'), 'hidden'); - }); - test('Builder.show() and .hide()', function () { let b = Build.withElementById(fixtureId); b.div(); @@ -810,17 +701,6 @@ suite('Builder', () => { assert.strictEqual(b.style('border-left-style'), 'dashed'); }); - test('Builder.textAlign() and .verticalAlign()', function () { - let b = Build.withElementById(fixtureId); - b.div(); - - b.textAlign('center'); - b.verticalAlign('top'); - - assert.strictEqual(b.style('textAlign'), 'center'); - assert.strictEqual(b.style('verticalAlign'), 'top'); - }); - test('Builder.innerHtml()', function () { let b = Build.withElementById(fixtureId); b.div(); @@ -843,30 +723,6 @@ suite('Builder', () => { assert.strictEqual(b.getHTMLElement().innerHTML, 'Foo Bar'); }); - test('Builder.parent(), .children(), .removeChild() and isEmpty()', function () { - let b = Build.withElementById(fixtureId); - b.empty(); - - assert(b.isEmpty()); - assert.strictEqual(b.parent().getHTMLElement(), b.getHTMLElement().parentNode); - assert(b.children().length === 0); - - let divB; - b.div(function (div: Builder) { - divB = div.clone(); - div.span(); - }); - b.span(); - - b = Build.withElementById(fixtureId); - assert(!b.isEmpty()); - assert.strictEqual(b.parent().getHTMLElement(), b.getHTMLElement().parentNode); - assert.equal(b.children().length, 2); - - b.removeChild(divB); - assert.equal(b.children().length, 1); - }); - test('Build Client Area', function () { // Global @@ -881,49 +737,6 @@ suite('Builder', () => { // assert(dimensions.height >= 0); }); - // test('Builder.select() and .matches()', function () { - // let b = Build.withElementById(fixtureId); - - // assert(b.matches('#' + fixtureId)); - - // let divs = withElementsBySelector('div'); - // for (let i = 0; i < divs.length; i++) { - // assert (divs.item(i).matches('div')); - // } - - // assert(b.select('div').length === 0); - - // b.clone().div(); - - // assert(b.select('div').length === 1); - // }); - - test('Builder.select() and .matches()', function () { - let b = Build.withElementById(fixtureId); - - assert(b.getTotalSize()); - assert(b.getContentSize()); - }); - - test('Builder.preventDefault()', function () { - let b = Build.withElementById(fixtureId); - b.element('input', { - type: 'button' - }); - - b.preventDefault(DomUtils.EventType.CLICK, true); - - b.once(DomUtils.EventType.CLICK, function (e) { - if (e.defaultPrevented) { - assert.strictEqual(e.defaultPrevented, true); - } else if (e.cancelBubble) { - assert.strictEqual(e.cancelBubble, true); - } - }); - - b.domClick(); - }); - test('Builder.once()', function () { let b = Build.withElementById(fixtureId); b.element('input', { @@ -936,8 +749,8 @@ suite('Builder', () => { assert(counter <= 1); }); - b.domClick(); - b.domClick(); + b.getHTMLElement().click(); + b.getHTMLElement().click(); }); test('Builder.once() with capture', function () { @@ -952,8 +765,8 @@ suite('Builder', () => { assert(counter <= 1); }, null, true); - b.domClick(); - b.domClick(); + b.getHTMLElement().click(); + b.getHTMLElement().click(); }); test('Builder.on() and .off()', function () { @@ -970,12 +783,12 @@ suite('Builder', () => { assert(listeners.length === 1); - b.domClick(); + b.getHTMLElement().click(); b.off(DomUtils.EventType.BLUR); - b.domClick(); + b.getHTMLElement().click(); b.off(DomUtils.EventType.CLICK); - b.domClick(); - b.domClick(); + b.getHTMLElement().click(); + b.getHTMLElement().click(); assert.equal(counter, 2); }); @@ -994,16 +807,16 @@ suite('Builder', () => { assert(listeners.length === 1); - b.domClick(); + b.getHTMLElement().click(); b.off(DomUtils.EventType.BLUR); - b.domClick(); + b.getHTMLElement().click(); b.off(DomUtils.EventType.BLUR, true); - b.domClick(); + b.getHTMLElement().click(); b.off(DomUtils.EventType.CLICK); - b.domClick(); + b.getHTMLElement().click(); b.off(DomUtils.EventType.CLICK, true); - b.domClick(); - b.domClick(); + b.getHTMLElement().click(); + b.getHTMLElement().click(); assert(counter === 4); }); @@ -1021,7 +834,7 @@ suite('Builder', () => { let counter7 = 0; b.div(function (div: Builder) { - div.bind('Foo Bar'); + bindElement(div.getHTMLElement(), 'Foo Bar'); div.setProperty('Foo', 'Bar'); bindings.push(div.clone()); @@ -1034,7 +847,7 @@ suite('Builder', () => { inputs.push(div.clone()); div.p(function (p: Builder) { - p.bind('Foo Bar'); + bindElement(p.getHTMLElement(), 'Foo Bar'); p.setProperty('Foo', 'Bar'); bindings.push(p.clone()); @@ -1047,7 +860,7 @@ suite('Builder', () => { inputs.push(p.clone()); p.ul(function (ul: Builder) { - ul.bind('Foo Bar'); + bindElement(ul.getHTMLElement(), 'Foo Bar'); ul.setProperty('Foo', 'Bar'); bindings.push(ul.clone()); @@ -1060,7 +873,7 @@ suite('Builder', () => { inputs.push(ul.clone()); ul.li(function (li: Builder) { - li.bind('Foo Bar'); + bindElement(li.getHTMLElement(), 'Foo Bar'); li.setProperty('Foo', 'Bar'); bindings.push(li.clone()); @@ -1076,7 +889,7 @@ suite('Builder', () => { id: 'builderspan', innerHtml: 'Foo Bar' }, function (span) { - span.bind('Foo Bar'); + bindElement(span.getHTMLElement(), 'Foo Bar'); span.setProperty('Foo', 'Bar'); bindings.push(span.clone()); @@ -1093,7 +906,7 @@ suite('Builder', () => { id: 'builderimg', src: '#' }, function (img) { - img.bind('Foo Bar'); + bindElement(img.getHTMLElement(), 'Foo Bar'); img.setProperty('Foo', 'Bar'); bindings.push(img.clone()); @@ -1111,7 +924,7 @@ suite('Builder', () => { href: '#', innerHtml: 'Link' }, function (a) { - a.bind('Foo Bar'); + bindElement(a.getHTMLElement(), 'Foo Bar'); a.setProperty('Foo', 'Bar'); bindings.push(a.clone()); @@ -1129,23 +942,21 @@ suite('Builder', () => { }); inputs.forEach(function (input) { - input.domClick(); + input.getHTMLElement().click(); }); for (let i = 0; i < bindings.length; i++) { - assert(bindings[i].getBinding()); assert(bindings[i].getProperty('Foo')); } Build.withElementById(fixtureId).empty(); - assert(Build.withElementById(fixtureId).select('*').length === 0); + assert(select(Build.withElementById(fixtureId), '*').length === 0); inputs.forEach(function (input) { - input.domClick(); + input.getHTMLElement().click(); }); for (let i = 0; i < bindings.length; i++) { - assert(!bindings[i].getBinding()); assert(!bindings[i].getProperty('Foo')); } @@ -1208,7 +1019,7 @@ suite('Builder', () => { let counter7 = 0; b.div(function (div: Builder) { - div.bind('Foo Bar'); + bindElement(div.getHTMLElement(), 'Foo Bar'); div.setProperty('Foo', 'Bar'); bindings.push(div.clone()); @@ -1221,7 +1032,7 @@ suite('Builder', () => { inputs.push(div.clone()); div.p(function (p: Builder) { - p.bind('Foo Bar'); + bindElement(p.getHTMLElement(), 'Foo Bar'); p.setProperty('Foo', 'Bar'); bindings.push(p.clone()); @@ -1234,7 +1045,7 @@ suite('Builder', () => { inputs.push(p.clone()); p.ul(function (ul: Builder) { - ul.bind('Foo Bar'); + bindElement(ul.getHTMLElement(), 'Foo Bar'); ul.setProperty('Foo', 'Bar'); bindings.push(ul.clone()); @@ -1247,7 +1058,7 @@ suite('Builder', () => { inputs.push(ul.clone()); ul.li(function (li: Builder) { - li.bind('Foo Bar'); + bindElement(li.getHTMLElement(), 'Foo Bar'); li.setProperty('Foo', 'Bar'); bindings.push(li.clone()); @@ -1263,7 +1074,7 @@ suite('Builder', () => { id: 'builderspan', innerHtml: 'Foo Bar' }, function (span) { - span.bind('Foo Bar'); + bindElement(span.getHTMLElement(), 'Foo Bar'); span.setProperty('Foo', 'Bar'); bindings.push(span.clone()); @@ -1280,7 +1091,7 @@ suite('Builder', () => { id: 'builderimg', src: '#' }, function (img) { - img.bind('Foo Bar'); + bindElement(img.getHTMLElement(), 'Foo Bar'); img.setProperty('Foo', 'Bar'); bindings.push(img.clone()); @@ -1298,7 +1109,7 @@ suite('Builder', () => { href: '#', innerHtml: 'Link' }, function (a) { - a.bind('Foo Bar'); + bindElement(a.getHTMLElement(), 'Foo Bar'); a.setProperty('Foo', 'Bar'); bindings.push(a.clone()); @@ -1316,23 +1127,21 @@ suite('Builder', () => { }); inputs.forEach(function (input) { - input.domClick(); + input.getHTMLElement().click(); }); for (let i = 0; i < bindings.length; i++) { - assert(bindings[i].getBinding()); assert(bindings[i].getProperty('Foo')); } - Build.withElementById(fixtureId).select('div').destroy(); - assert(Build.withElementById(fixtureId).select('*').length === 0); + select(Build.withElementById(fixtureId), 'div').destroy(); + assert(select(Build.withElementById(fixtureId), '*').length === 0); inputs.forEach(function (input) { - input.domClick(); + input.getHTMLElement().click(); }); for (let i = 0; i < bindings.length; i++) { - assert(!bindings[i].getBinding()); assert(!bindings[i].getProperty('Foo')); } @@ -1383,92 +1192,6 @@ suite('Builder', () => { } }); - test('Builder.empty() MultiBuilder', function () { - let b = Build.withElementById(fixtureId); - let inputs: Builder[] = []; - - let firstCounter = 0; - b.div(function (div: Builder) { - div.element('input', { - type: 'button' - }).on(DomUtils.EventType.CLICK, function () { - firstCounter++; - }); - - inputs.push(div.clone()); - }); - - let secondCounter = 0; - b.div(function (div: Builder) { - div.element('input', { - type: 'button' - }).on(DomUtils.EventType.CLICK, function () { - secondCounter++; - }); - - inputs.push(div.clone()); - }); - - let thirdCounter = 0; - b.div(function (div: Builder) { - div.element('input', { - type: 'button' - }).on(DomUtils.EventType.CLICK, function () { - thirdCounter++; - }); - - inputs.push(div.clone()); - }); - - Build.withElementById(fixtureId).select('div > input').domClick(); - - Build.withElementById(fixtureId).select('div').empty(); - - inputs.forEach(function (input) { - input.domClick(); - }); - - assert.equal(firstCounter, 1); - assert.equal(secondCounter, 1); - assert.equal(thirdCounter, 1); - }); - - test('Builder .domFocus(), .domBlur(), .hasFocus()', function () { - let b = Build.withElementById(fixtureId); - - b.element('input', { type: 'text' }); - assert(!b.hasFocus()); - b.domFocus().domSelect(); - assert(b.hasFocus()); - b.domBlur(); - assert(!b.hasFocus()); - }); - - test('Builder misc', function () { - let b = Build.withElementById(fixtureId); - b.div(); - - b.on([DomUtils.EventType.CLICK, DomUtils.EventType.MOUSE_DOWN, DomUtils.EventType.MOUSE_UP], function (e, b) { - }); - b.off([DomUtils.EventType.CLICK, DomUtils.EventType.MOUSE_DOWN, DomUtils.EventType.MOUSE_UP]); - - b.once([DomUtils.EventType.CLICK, DomUtils.EventType.MOUSE_DOWN, DomUtils.EventType.MOUSE_UP], function (e, b) { - }); - b.off([DomUtils.EventType.CLICK, DomUtils.EventType.MOUSE_DOWN, DomUtils.EventType.MOUSE_UP]); - - b.preventDefault(DomUtils.EventType.CLICK, true); - - b.bind('foo'); - assert.strictEqual(b.getBinding(), 'foo'); - b.unbind(); - assert(!b.getBinding()); - - b.setProperty('foo', 'bar'); - assert.strictEqual(b.getProperty('foo'), 'bar'); - b.removeProperty('foo'); - assert(!b.getProperty('foo')); - }); - test('Builder.offDOM()', function () { let b = Build.withElementById(fixtureId); b.div({ id: '1' }); @@ -1630,4 +1353,4 @@ suite('Builder', () => { assert.equal((obj.firstChild).tagName.toLowerCase(), 'span'); assert.equal((obj.firstChild).className, 'core'); }); -}); \ No newline at end of file +}); diff --git a/src/vs/base/test/common/color.test.ts b/src/vs/base/test/common/color.test.ts index 7ccee7a4d51d..359bc6c398e1 100644 --- a/src/vs/base/test/common/color.test.ts +++ b/src/vs/base/test/common/color.test.ts @@ -153,6 +153,7 @@ suite('Color', () => { assert.deepEqual(HSVA.toRGBA(new HSVA(300, 1, 0.502, 1)), new RGBA(128, 0, 128, 1)); assert.deepEqual(HSVA.toRGBA(new HSVA(180, 1, 0.502, 1)), new RGBA(0, 128, 128, 1)); assert.deepEqual(HSVA.toRGBA(new HSVA(240, 1, 0.502, 1)), new RGBA(0, 0, 128, 1)); + }); test('HSVA.fromRGBA', () => { @@ -185,6 +186,11 @@ suite('Color', () => { assert.deepEqual(new Color(new HSVA(10, 0, 0, 0)).rgba, new Color(new HSVA(20, 0, 0, 0)).rgba); assert.notDeepEqual(new Color(new HSVA(10, 0, 0, 0)).hsva, new Color(new HSVA(20, 0, 0, 0)).hsva); }); + + test('bug#36240', () => { + assert.deepEqual(HSVA.fromRGBA(new RGBA(92, 106, 196, 1)), new HSVA(232, .531, .769, 1)); + assert.deepEqual(HSVA.toRGBA(HSVA.fromRGBA(new RGBA(92, 106, 196, 1))), new RGBA(92, 106, 196, 1)); + }); }); suite('Format', () => { diff --git a/src/vs/base/test/common/filters.perf.test.ts b/src/vs/base/test/common/filters.perf.test.ts index 82df853e427d..28ee9b43626d 100644 --- a/src/vs/base/test/common/filters.perf.test.ts +++ b/src/vs/base/test/common/filters.perf.test.ts @@ -19,7 +19,7 @@ function perfSuite(name: string, callback: (this: Mocha.ISuiteCallbackContext) = perfSuite('Performance - fuzzyMatch', function () { - console.log(`Matching ${data.length} items against ${patterns.length} patterns...`); + console.log(`Matching ${data.length} items against ${patterns.length} patterns (${data.length * patterns.length} operations) `); function perfTest(name: string, match: (pattern: string, word: string) => any) { test(name, function () { @@ -32,12 +32,15 @@ perfSuite('Performance - fuzzyMatch', function () { match(pattern, item); } } - console.log(name, Date.now() - t1, `${(count / (Date.now() - t1)).toPrecision(6)}/ms`); + const d = Date.now() - t1; + console.log(name, `${d}ms, ${Math.round(count / d) * 15}ops/15ms`); }); } perfTest('matchesFuzzy', filters.matchesFuzzy); perfTest('fuzzyContiguousFilter', filters.fuzzyContiguousFilter); perfTest('fuzzyScore', filters.fuzzyScore); + perfTest('fuzzyScoreGraceful', filters.fuzzyScoreGraceful); + perfTest('fuzzyScoreGracefulAggressive', filters.fuzzyScoreGracefulAggressive); }); diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 6aea42f4915e..a6fe1a58b1ac 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { IFilter, or, matchesPrefix, matchesStrictPrefix, matchesCamelCase, matchesSubString, matchesContiguousSubString, matchesWords, fuzzyScore, nextTypoPermutation, IMatch } from 'vs/base/common/filters'; +import { IFilter, or, matchesPrefix, matchesStrictPrefix, matchesCamelCase, matchesSubString, matchesContiguousSubString, matchesWords, fuzzyScore, IMatch, fuzzyScoreGraceful, fuzzyScoreGracefulAggressive } from 'vs/base/common/filters'; function filterOk(filter: IFilter, word: string, wordToMatchAgainst: string, highlights?: { start: number; end: number; }[]) { let r = filter(word, wordToMatchAgainst); @@ -423,19 +423,21 @@ suite('Filters', () => { assertTopScore(fuzzyScore, '_lineS', 0, '_lineS', '_lines'); }); - test('nextTypoPermutation', function () { + test('HTML closing tag proposal filtered out #38880', function () { + assertMatches('\t\t<', '\t\t', '^\t^\t^', (pattern, word) => fuzzyScore(pattern, word, 0)); + assertMatches('\t\t<', '\t\t', '\t\t^', (pattern, word) => fuzzyScore(pattern, word, 3)); + assertMatches('\t<', '\t', '\t^', (pattern, word) => fuzzyScore(pattern, word, 2)); + }); - function assertTypos(pattern: string, ...variants: string[]) { - let pos = 1; - for (const expected of variants) { - const actual = nextTypoPermutation(pattern, pos); - assert.equal(actual, expected); - pos += 1; - } - assert.equal(nextTypoPermutation(pattern, pos), undefined); - } + test('fuzzyScoreGraceful', function () { - assertTypos('abc', 'acb'); - assertTypos('foboar', 'fbooar', 'foobar', 'fobaor', 'fobora'); + assertMatches('rlut', 'result', undefined, fuzzyScore); + assertMatches('rlut', 'result', '^res^u^l^t', fuzzyScoreGraceful); + + assertMatches('cno', 'console', '^co^ns^ole', fuzzyScore); + assertMatches('cno', 'console', '^co^ns^ole', fuzzyScoreGraceful); + assertMatches('cno', 'console', '^c^o^nsole', fuzzyScoreGracefulAggressive); + assertMatches('cno', 'co_new', '^c^o_^new', fuzzyScoreGraceful); + assertMatches('cno', 'co_new', '^c^o_^new', fuzzyScoreGracefulAggressive); }); }); diff --git a/src/vs/base/test/common/json.test.ts b/src/vs/base/test/common/json.test.ts index 065becde0080..2551f00fde3b 100644 --- a/src/vs/base/test/common/json.test.ts +++ b/src/vs/base/test/common/json.test.ts @@ -234,6 +234,7 @@ suite('JSON', () => { assertValidParse('{ "hello": [] }', { hello: [] }, options); assertValidParse('{ "hello": [], "world": {}, }', { hello: [], world: {} }, options); assertValidParse('{ "hello": [], "world": {} }', { hello: [], world: {} }, options); + assertValidParse('{ "hello": [1,] }', { hello: [1] }, options); assertInvalidParse('{ "hello": [], }', { hello: [] }); assertInvalidParse('{ "hello": [], "world": {}, }', { hello: [], world: {} }); diff --git a/src/vs/base/test/node/encoding/encoding.test.ts b/src/vs/base/test/node/encoding/encoding.test.ts index ce229da6f907..7c5c56f7a9f7 100644 --- a/src/vs/base/test/node/encoding/encoding.test.ts +++ b/src/vs/base/test/node/encoding/encoding.test.ts @@ -8,6 +8,7 @@ import assert = require('assert'); import encoding = require('vs/base/node/encoding'); +import { encodingExists } from 'vs/base/node/encoding'; suite('Encoding', () => { test('detectBOM UTF-8', (done: (err?: any) => void) => { @@ -54,4 +55,21 @@ suite('Encoding', () => { done(); }, done); }); + + test('resolve terminal encoding (detect)', function (done: (err?: any) => void) { + encoding.resolveTerminalEncoding().then(encoding => { + assert.ok(encodingExists(encoding)); + done(); + }, done); + }); + + test('resolve terminal encoding (environment)', function (done: (err?: any) => void) { + process.env['VSCODE_CLI_ENCODING'] = 'utf16le'; + + encoding.resolveTerminalEncoding().then(encoding => { + assert.ok(encodingExists(encoding)); + assert.equal(encoding, 'utf16le'); + done(); + }, done); + }); }); diff --git a/src/vs/base/test/node/extfs/extfs.test.ts b/src/vs/base/test/node/extfs/extfs.test.ts index fb3308f9a4a5..06ecf0b8ba0b 100644 --- a/src/vs/base/test/node/extfs/extfs.test.ts +++ b/src/vs/base/test/node/extfs/extfs.test.ts @@ -209,6 +209,31 @@ suite('Extfs', () => { }); }); + test('writeFileAndFlushSync', function (done: () => void) { + const id = uuid.generateUuid(); + const parentDir = path.join(os.tmpdir(), 'vsctests', id); + const newDir = path.join(parentDir, 'extfs', id); + const testFile = path.join(newDir, 'flushed.txt'); + + mkdirp(newDir, 493, error => { + if (error) { + return onError(error, done); + } + + assert.ok(fs.existsSync(newDir)); + + extfs.writeFileAndFlushSync(testFile, 'Hello World', null); + assert.equal(fs.readFileSync(testFile), 'Hello World'); + + const largeString = (new Array(100 * 1024)).join('Large String\n'); + + extfs.writeFileAndFlushSync(testFile, largeString, null); + assert.equal(fs.readFileSync(testFile), largeString); + + extfs.del(parentDir, os.tmpdir(), done, ignore); + }); + }); + test('realcase', (done) => { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); diff --git a/src/vs/base/test/node/id.test.ts b/src/vs/base/test/node/id.test.ts new file mode 100644 index 000000000000..3c01f23d8c14 --- /dev/null +++ b/src/vs/base/test/node/id.test.ts @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import { getMachineId } from 'vs/base/node/id'; + +suite('ID', () => { + + test('getMachineId', function () { + return getMachineId().then(id => { + assert.ok(id); + }); + }); +}); \ No newline at end of file diff --git a/src/vs/base/test/node/port.test.ts b/src/vs/base/test/node/port.test.ts index 24906c66662f..7c2d3678d11e 100644 --- a/src/vs/base/test/node/port.test.ts +++ b/src/vs/base/test/node/port.test.ts @@ -18,7 +18,7 @@ suite('Ports', () => { } // get an initial freeport >= 7000 - ports.findFreePort(7000, 100, 300000, (initialPort) => { + ports.findFreePort(7000, 100, 300000).then(initialPort => { assert.ok(initialPort >= 7000); // create a server to block this port @@ -26,7 +26,7 @@ suite('Ports', () => { server.listen(initialPort, null, null, () => { // once listening, find another free port and assert that the port is different from the opened one - ports.findFreePort(7000, 50, 300000, (freePort) => { + ports.findFreePort(7000, 50, 300000).then(freePort => { assert.ok(freePort >= 7000 && freePort !== initialPort); server.close(); diff --git a/src/vs/code/electron-browser/sharedProcess.js b/src/vs/code/electron-browser/sharedProcess.js index 9b216f896221..2e39f94b2e51 100644 --- a/src/vs/code/electron-browser/sharedProcess.js +++ b/src/vs/code/electron-browser/sharedProcess.js @@ -89,7 +89,11 @@ function main() { }); } - require(['vs/code/electron-browser/sharedProcessMain'], function () { }); + require(['vs/code/electron-browser/sharedProcessMain'], function (sharedProcess) { + sharedProcess.startup({ + machineId: configuration.machineId + }); + }); }); } diff --git a/src/vs/code/electron-browser/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcessMain.ts index 65d951ef245b..f28c43680c14 100644 --- a/src/vs/code/electron-browser/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcessMain.ts @@ -24,7 +24,7 @@ import { IRequestService } from 'vs/platform/request/node/request'; import { RequestService } from 'vs/platform/request/electron-browser/requestService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { combinedAppender, NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; -import { resolveCommonProperties, machineIdStorageKey } from 'vs/platform/telemetry/node/commonProperties'; +import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; import { TelemetryAppenderChannel } from 'vs/platform/telemetry/common/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; @@ -34,8 +34,17 @@ import { IWindowsService } from 'vs/platform/windows/common/windows'; import { WindowsChannelClient } from 'vs/platform/windows/common/windowsIpc'; import { ipcRenderer } from 'electron'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { StorageService, inMemoryLocalStorageInstance } from 'vs/platform/storage/common/storageService'; import { createSharedProcessContributions } from 'vs/code/electron-browser/contrib/contributions'; +import { createLogService } from 'vs/platform/log/node/spdlogService'; +import { ILogService } from 'vs/platform/log/common/log'; + +export interface ISharedProcessConfiguration { + readonly machineId: string; +} + +export function startup(configuration: ISharedProcessConfiguration) { + handshake(configuration); +} interface ISharedProcessInitData { sharedIPCHandle: string; @@ -66,10 +75,17 @@ class ActiveWindowManager implements IDisposable { const eventPrefix = 'monacoworkbench'; -function main(server: Server, initData: ISharedProcessInitData): void { +function main(server: Server, initData: ISharedProcessInitData, configuration: ISharedProcessConfiguration): void { const services = new ServiceCollection(); - services.set(IEnvironmentService, new SyncDescriptor(EnvironmentService, initData.args, process.execPath)); + const environmentService = new EnvironmentService(initData.args, process.execPath); + const logService = createLogService('sharedprocess', environmentService); + process.once('exit', () => logService.dispose()); + + logService.info('main', JSON.stringify(configuration)); + + services.set(IEnvironmentService, environmentService); + services.set(ILogService, logService); services.set(IConfigurationService, new SyncDescriptor(ConfigurationService)); services.set(IRequestService, new SyncDescriptor(RequestService)); @@ -100,21 +116,12 @@ function main(server: Server, initData: ISharedProcessInitData): void { const services = new ServiceCollection(); const environmentService = accessor.get(IEnvironmentService); - const { appRoot, extensionsPath, extensionDevelopmentPath, isBuilt, extensionTestsPath, installSource } = environmentService; + const { appRoot, extensionsPath, extensionDevelopmentPath, isBuilt, installSourcePath } = environmentService; if (isBuilt && !extensionDevelopmentPath && !environmentService.args['disable-telemetry'] && product.enableTelemetry) { - const disableStorage = !!extensionTestsPath; // never keep any state when running extension tests! - const storage = disableStorage ? inMemoryLocalStorageInstance : window.localStorage; - const storageService = new StorageService(storage, storage); - const config: ITelemetryServiceConfig = { appender, - commonProperties: resolveCommonProperties(product.commit, pkg.version, installSource) - // __GDPR__COMMON__ "common.machineId" : { "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" } - .then(result => Object.defineProperty(result, 'common.machineId', { - get: () => storageService.get(machineIdStorageKey), - enumerable: true - })), + commonProperties: resolveCommonProperties(product.commit, pkg.version, configuration.machineId, installSourcePath), piiPaths: [appRoot, extensionsPath] }; @@ -182,10 +189,8 @@ function startHandshake(): TPromise { }); } -function handshake(): TPromise { +function handshake(configuration: ISharedProcessConfiguration): TPromise { return startHandshake() - .then((data) => setupIPC(data.sharedIPCHandle).then(server => main(server, data))) + .then(data => setupIPC(data.sharedIPCHandle).then(server => main(server, data, configuration))) .then(() => ipcRenderer.send('handshake:im ready')); -} - -handshake(); +} \ No newline at end of file diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 71b1557292d3..c16afdc07963 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -26,7 +26,7 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiati import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ILogService } from 'vs/platform/log/common/log'; -import { IStorageService } from 'vs/platform/storage/node/storage'; +import { IStateService } from 'vs/platform/state/common/state'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IURLService } from 'vs/platform/url/common/url'; @@ -35,7 +35,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { ITelemetryAppenderChannel, TelemetryAppenderClient } from 'vs/platform/telemetry/common/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; -import { resolveCommonProperties, machineIdStorageKey, machineIdIpcChannel } from 'vs/platform/telemetry/node/commonProperties'; +import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; import { getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; import product from 'vs/platform/node/product'; import pkg from 'vs/platform/node/package'; @@ -53,10 +53,12 @@ import { WorkspacesChannel } from 'vs/platform/workspaces/common/workspacesIpc'; import { IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; import { dirname, join } from 'path'; import { touch } from 'vs/base/node/pfs'; +import { getMachineId } from 'vs/base/node/id'; export class CodeApplication { private static readonly APP_ICON_REFRESH_KEY = 'macOSAppIconRefresh3'; + private static readonly MACHINE_ID_KEY = 'telemetry.machineId'; private toDispose: IDisposable[]; private windowsMainService: IWindowsMainService; @@ -74,8 +76,8 @@ export class CodeApplication { @IEnvironmentService private environmentService: IEnvironmentService, @ILifecycleService private lifecycleService: ILifecycleService, @IConfigurationService configurationService: ConfigurationService, - @IStorageService private storageService: IStorageService, - @IHistoryMainService private historyService: IHistoryMainService + @IStateService private stateService: IStateService, + @IHistoryMainService private historyMainService: IHistoryMainService ) { this.toDispose = [mainIpcServer, configurationService]; @@ -107,7 +109,7 @@ export class CodeApplication { }); app.on('will-quit', () => { - this.logService.log('App#will-quit: disposing resources'); + this.logService.trace('App#will-quit: disposing resources'); this.dispose(); }); @@ -119,7 +121,7 @@ export class CodeApplication { }); app.on('activate', (event: Event, hasVisibleWindows: boolean) => { - this.logService.log('App#activate'); + this.logService.trace('App#activate'); // Mac only event: open new window when we get activated if (!hasVisibleWindows && this.windowsMainService) { @@ -154,7 +156,7 @@ export class CodeApplication { let macOpenFiles: string[] = []; let runningTimeout: number = null; app.on('open-file', (event: Event, path: string) => { - this.logService.log('App#open-file: ', path); + this.logService.trace('App#open-file: ', path); event.preventDefault(); // Keep in array because more might come! @@ -186,17 +188,12 @@ export class CodeApplication { }); ipc.on('vscode:exit', (_event: any, code: number) => { - this.logService.log('IPC#vscode:exit', code); + this.logService.trace('IPC#vscode:exit', code); this.dispose(); this.lifecycleService.kill(code); }); - ipc.on(machineIdIpcChannel, (_event: any, machineId: string) => { - this.logService.log('IPC#vscode-machineId'); - this.storageService.setItem(machineIdStorageKey, machineId); - }); - ipc.on('vscode:fetchShellEnv', (_event: any, windowId: number) => { const { webContents } = BrowserWindow.fromId(windowId); getShellEnvironment().then(shellEnv => { @@ -214,7 +211,7 @@ export class CodeApplication { ipc.on('vscode:broadcast', (_event: any, windowId: number, broadcast: { channel: string; payload: any; }) => { if (this.windowsMainService && broadcast.channel && !isUndefinedOrNull(broadcast.payload)) { - this.logService.log('IPC#vscode:broadcast', broadcast.channel, broadcast.payload); + this.logService.trace('IPC#vscode:broadcast', broadcast.channel, broadcast.payload); // Handle specific events on main side this.onBroadcast(broadcast.channel, broadcast.payload); @@ -238,15 +235,15 @@ export class CodeApplication { if (event === 'vscode:changeColorTheme' && typeof payload === 'string') { let data = JSON.parse(payload); - this.storageService.setItem(CodeWindow.themeStorageKey, data.id); - this.storageService.setItem(CodeWindow.themeBackgroundStorageKey, data.background); + this.stateService.setItem(CodeWindow.themeStorageKey, data.id); + this.stateService.setItem(CodeWindow.themeBackgroundStorageKey, data.background); } } - public startup(): void { - this.logService.log('Starting VS Code in verbose mode'); - this.logService.log(`from: ${this.environmentService.appRoot}`); - this.logService.log('args:', this.environmentService.args); + public startup(): TPromise { + this.logService.debug('Starting VS Code'); + this.logService.debug(`from: ${this.environmentService.appRoot}`); + this.logService.debug('args:', this.environmentService.args); // Make sure we associate the program with the app user model id // This will help Windows to associate the running program with @@ -259,30 +256,51 @@ export class CodeApplication { // Create Electron IPC Server this.electronIpcServer = new ElectronIPCServer(); - // Spawn shared process - this.sharedProcess = new SharedProcess(this.environmentService, this.userEnv); - this.toDispose.push(this.sharedProcess); - this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); + // Resolve unique machine ID + this.logService.trace('Resolving machine identifier...'); + return this.resolveMachineId().then(machineId => { + this.logService.trace(`Resolved machine identifier: ${machineId}`); - // Services - const appInstantiationService = this.initServices(); + // Spawn shared process + this.sharedProcess = new SharedProcess(this.environmentService, machineId, this.userEnv); + this.toDispose.push(this.sharedProcess); + this.sharedProcessClient = TPromise.timeout(5000).then(() => this.sharedProcess.whenReady()).then(() => connect(this.environmentService.sharedIPCHandle, 'main')); - // Setup Auth Handler - const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); - this.toDispose.push(authHandler); + // Services + const appInstantiationService = this.initServices(machineId); - // Open Windows - appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); + // Setup Auth Handler + const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); + this.toDispose.push(authHandler); - // Post Open Windows Tasks - appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + // Open Windows + appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); + + // Post Open Windows Tasks + appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + }); } - private initServices(): IInstantiationService { + private resolveMachineId(): TPromise { + const machineId = this.stateService.getItem(CodeApplication.MACHINE_ID_KEY); + if (machineId) { + return TPromise.wrap(machineId); + } + + return getMachineId().then(machineId => { + + // Remember in global storage + this.stateService.setItem(CodeApplication.MACHINE_ID_KEY, machineId); + + return machineId; + }); + } + + private initServices(machineId: string): IInstantiationService { const services = new ServiceCollection(); services.set(IUpdateService, new SyncDescriptor(UpdateService)); - services.set(IWindowsMainService, new SyncDescriptor(WindowsManager)); + services.set(IWindowsMainService, new SyncDescriptor(WindowsManager, machineId)); services.set(IWindowsService, new SyncDescriptor(WindowsService, this.sharedProcess)); services.set(ILaunchService, new SyncDescriptor(LaunchService)); @@ -290,14 +308,10 @@ export class CodeApplication { if (this.environmentService.isBuilt && !this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) { const channel = getDelayedChannel(this.sharedProcessClient.then(c => c.getChannel('telemetryAppender'))); const appender = new TelemetryAppenderClient(channel); - const commonProperties = resolveCommonProperties(product.commit, pkg.version, this.environmentService.installSource) - // __GDPR__COMMON__ "common.machineId" : { "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" } - .then(result => Object.defineProperty(result, 'common.machineId', { - get: () => this.storageService.getItem(machineIdStorageKey), - enumerable: true - })); + const commonProperties = resolveCommonProperties(product.commit, pkg.version, machineId, this.environmentService.installSourcePath); const piiPaths = [this.environmentService.appRoot, this.environmentService.extensionsPath]; const config: ITelemetryServiceConfig = { appender, commonProperties, piiPaths }; + services.set(ITelemetryService, new SyncDescriptor(TelemetryService, config)); } else { services.set(ITelemetryService, NullTelemetryService); @@ -342,7 +356,6 @@ export class CodeApplication { this.electronIpcServer.registerChannel('windows', windowsChannel); this.sharedProcessClient.done(client => client.registerChannel('windows', windowsChannel)); - // Lifecycle this.lifecycleService.ready(); @@ -405,8 +418,8 @@ export class CodeApplication { appInstantiationService.createInstance(CodeMenu); // Jump List - this.historyService.updateWindowsJumpList(); - this.historyService.onRecentlyOpenedChange(() => this.historyService.updateWindowsJumpList()); + this.historyMainService.updateWindowsJumpList(); + this.historyMainService.onRecentlyOpenedChange(() => this.historyMainService.updateWindowsJumpList()); // Start shared process here this.sharedProcess.spawn(); @@ -414,8 +427,8 @@ export class CodeApplication { // Helps application icon refresh after an update with new icon is installed (macOS) // TODO@Ben remove after a couple of releases if (platform.isMacintosh) { - if (!this.storageService.getItem(CodeApplication.APP_ICON_REFRESH_KEY)) { - this.storageService.setItem(CodeApplication.APP_ICON_REFRESH_KEY, true); + if (!this.stateService.getItem(CodeApplication.APP_ICON_REFRESH_KEY)) { + this.stateService.setItem(CodeApplication.APP_ICON_REFRESH_KEY, true); // 'exe' => /Applications/Visual Studio Code - Insiders.app/Contents/MacOS/Electron const appPath = dirname(dirname(dirname(app.getPath('exe')))); diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index 6434cfd557c2..45985c3f4d61 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -32,7 +32,7 @@ export class ProxyAuthHandler { private disposables: IDisposable[] = []; constructor( - @IWindowsMainService private windowsService: IWindowsMainService + @IWindowsMainService private windowsMainService: IWindowsMainService ) { const onLogin = fromNodeEventEmitter(app, 'login', (event, webContents, req, authInfo, cb) => ({ event, webContents, req, authInfo, cb })); onLogin(this.onLogin, this, this.disposables); @@ -59,7 +59,7 @@ export class ProxyAuthHandler { title: 'VS Code' }; - const focusedWindow = this.windowsService.getFocusedWindow(); + const focusedWindow = this.windowsMainService.getFocusedWindow(); if (focusedWindow) { opts.parent = focusedWindow.win; diff --git a/src/vs/code/electron-main/diagnostics.ts b/src/vs/code/electron-main/diagnostics.ts new file mode 100644 index 000000000000..82673450fe9f --- /dev/null +++ b/src/vs/code/electron-main/diagnostics.ts @@ -0,0 +1,178 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { WorkspaceStats, collectWorkspaceStats, collectLaunchConfigs, WorkspaceStatItem } from 'vs/base/node/stats'; +import { IMainProcessInfo } from 'vs/code/electron-main/launch'; +import { ProcessItem, listProcesses } from 'vs/base/node/ps'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; +import * as os from 'os'; +import { virtualMachineHint } from 'vs/base/node/id'; +import { repeat, pad } from 'vs/base/common/strings'; +import { isWindows } from 'vs/base/common/platform'; +import { app } from 'electron'; +import { basename } from 'path'; + +export function printDiagnostics(info: IMainProcessInfo): Promise { + return listProcesses(info.mainPID).then(rootProcess => { + + // Environment Info + console.log(''); + console.log(formatEnvironment(info)); + + // Process List + console.log(''); + console.log(formatProcessList(info, rootProcess)); + + // Workspace Stats + if (info.windows.some(window => window.folders && window.folders.length > 0)) { + console.log(''); + console.log('Workspace Stats: '); + info.windows.forEach(window => { + if (window.folders.length === 0) { + return; + } + + console.log(`| Window (${window.title})`); + + window.folders.forEach(folder => { + try { + const stats = collectWorkspaceStats(folder, ['node_modules', '.git']); + let countMessage = `${stats.fileCount} files`; + if (stats.maxFilesReached) { + countMessage = `more than ${countMessage}`; + } + console.log(`| Folder (${basename(folder)}): ${countMessage}`); + console.log(formatWorkspaceStats(stats)); + + const launchConfigs = collectLaunchConfigs(folder); + if (launchConfigs.length > 0) { + console.log(formatLaunchConfigs(launchConfigs)); + } + } catch (error) { + console.log(`| Error: Unable to collect workpsace stats for folder ${folder} (${error.toString()})`); + } + }); + }); + } + console.log(''); + console.log(''); + }); +} + +function formatWorkspaceStats(workspaceStats: WorkspaceStats): string { + const output: string[] = []; + const lineLength = 60; + let col = 0; + + const appendAndWrap = (name: string, count: number) => { + const item = ` ${name}(${count})`; + + if (col + item.length > lineLength) { + output.push(line); + line = '| '; + col = line.length; + } + else { + col += item.length; + } + line += item; + }; + + + // File Types + let line = '| File types:'; + const maxShown = 10; + let max = workspaceStats.fileTypes.length > maxShown ? maxShown : workspaceStats.fileTypes.length; + for (let i = 0; i < max; i++) { + const item = workspaceStats.fileTypes[i]; + appendAndWrap(item.name, item.count); + } + output.push(line); + + // Conf Files + if (workspaceStats.configFiles.length >= 0) { + line = '| Conf files:'; + col = 0; + workspaceStats.configFiles.forEach((item) => { + appendAndWrap(item.name, item.count); + }); + output.push(line); + } + + return output.join('\n'); +} + +function formatLaunchConfigs(configs: WorkspaceStatItem[]): string { + const output: string[] = []; + let line = '| Launch Configs:'; + configs.forEach(each => { + const item = each.count > 1 ? ` ${each.name}(${each.count})` : ` ${each.name}`; + line += item; + }); + output.push(line); + return output.join('\n'); +} + +function formatEnvironment(info: IMainProcessInfo): string { + const MB = 1024 * 1024; + const GB = 1024 * MB; + + const output: string[] = []; + output.push(`Version: ${pkg.name} ${pkg.version} (${product.commit || 'Commit unknown'}, ${product.date || 'Date unknown'})`); + output.push(`OS Version: ${os.type()} ${os.arch()} ${os.release()})`); + const cpus = os.cpus(); + if (cpus && cpus.length > 0) { + output.push(`CPUs: ${cpus[0].model} (${cpus.length} x ${cpus[0].speed})`); + } + output.push(`Memory (System): ${(os.totalmem() / GB).toFixed(2)}GB (${(os.freemem() / GB).toFixed(2)}GB free)`); + if (!isWindows) { + output.push(`Load (avg): ${os.loadavg().map(l => Math.round(l)).join(', ')}`); // only provided on Linux/macOS + } + output.push(`VM: ${Math.round((virtualMachineHint.value() * 100))}%`); + output.push(`Screen Reader: ${app.isAccessibilitySupportEnabled() ? 'yes' : 'no'}`); + + return output.join('\n'); +} + +function formatProcessList(info: IMainProcessInfo, rootProcess: ProcessItem): string { + const mapPidToWindowTitle = new Map(); + info.windows.forEach(window => mapPidToWindowTitle.set(window.pid, window.title)); + + const output: string[] = []; + + output.push('CPU %\tMem MB\tProcess'); + + formatProcessItem(mapPidToWindowTitle, output, rootProcess, 0); + + return output.join('\n'); +} + +function formatProcessItem(mapPidToWindowTitle: Map, output: string[], item: ProcessItem, indent: number): void { + const isRoot = (indent === 0); + + const MB = 1024 * 1024; + + // Format name with indent + let name: string; + if (isRoot) { + name = `${product.applicationName} main`; + } else { + name = `${repeat(' ', indent)} ${item.name}`; + + if (item.name === 'window') { + name = `${name} (${mapPidToWindowTitle.get(item.pid)})`; + } + } + const memory = process.platform === 'win32' ? item.mem : (os.totalmem() * (item.mem / 100)); + output.push(`${pad(Number(item.load.toFixed(0)), 5, ' ')}\t${pad(Number((memory / MB).toFixed(0)), 6, ' ')}\t${name}`); + + // Recurse into children if any + if (Array.isArray(item.children)) { + item.children.forEach(child => formatProcessItem(mapPidToWindowTitle, output, child, indent + 1)); + } +} \ No newline at end of file diff --git a/src/vs/code/electron-main/keyboard.ts b/src/vs/code/electron-main/keyboard.ts index fbec79fd50f6..0d53eb2146c5 100644 --- a/src/vs/code/electron-main/keyboard.ts +++ b/src/vs/code/electron-main/keyboard.ts @@ -7,7 +7,7 @@ import * as nativeKeymap from 'native-keymap'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IStorageService } from 'vs/platform/storage/node/storage'; +import { IStateService } from 'vs/platform/state/common/state'; import Event, { Emitter, once } from 'vs/base/common/event'; import { ConfigWatcher } from 'vs/base/node/config'; import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; @@ -58,13 +58,13 @@ export class KeybindingsResolver { onKeybindingsChanged: Event = this._onKeybindingsChanged.event; constructor( - @IStorageService private storageService: IStorageService, + @IStateService private stateService: IStateService, @IEnvironmentService environmentService: IEnvironmentService, - @IWindowsMainService private windowsService: IWindowsMainService, + @IWindowsMainService private windowsMainService: IWindowsMainService, @ILogService private logService: ILogService ) { this.commandIds = new Set(); - this.keybindings = this.storageService.getItem<{ [id: string]: string; }>(KeybindingsResolver.lastKnownKeybindingsMapStorageKey) || Object.create(null); + this.keybindings = this.stateService.getItem<{ [id: string]: string; }>(KeybindingsResolver.lastKnownKeybindingsMapStorageKey) || Object.create(null); this.keybindingsWatcher = new ConfigWatcher(environmentService.appKeybindingsPath, { changeBufferDelay: 100, onError: error => this.logService.error(error) }); this.registerListeners(); @@ -102,24 +102,24 @@ export class KeybindingsResolver { if (keybindingsChanged) { this.keybindings = resolvedKeybindings; - this.storageService.setItem(KeybindingsResolver.lastKnownKeybindingsMapStorageKey, this.keybindings); // keep to restore instantly after restart + this.stateService.setItem(KeybindingsResolver.lastKnownKeybindingsMapStorageKey, this.keybindings); // keep to restore instantly after restart this._onKeybindingsChanged.fire(); } }); // Resolve keybindings when any first window is loaded - const onceOnWindowReady = once(this.windowsService.onWindowReady); + const onceOnWindowReady = once(this.windowsMainService.onWindowReady); onceOnWindowReady(win => this.resolveKeybindings(win)); // Resolve keybindings again when keybindings.json changes this.keybindingsWatcher.onDidUpdateConfiguration(() => this.resolveKeybindings()); // Resolve keybindings when window reloads because an installed extension could have an impact - this.windowsService.onWindowReload(() => this.resolveKeybindings()); + this.windowsMainService.onWindowReload(() => this.resolveKeybindings()); } - private resolveKeybindings(win = this.windowsService.getLastActiveWindow()): void { + private resolveKeybindings(win = this.windowsMainService.getLastActiveWindow()): void { if (this.commandIds.size && win) { const commandIds: string[] = []; this.commandIds.forEach(id => commandIds.push(id)); diff --git a/src/vs/code/electron-main/launch.ts b/src/vs/code/electron-main/launch.ts index 189224ef9c6f..31125cac1054 100644 --- a/src/vs/code/electron-main/launch.ts +++ b/src/vs/code/electron-main/launch.ts @@ -15,6 +15,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { OpenContext } from 'vs/platform/windows/common/windows'; import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; import { whenDeleted } from 'vs/base/node/pfs'; +import { IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; export const ID = 'launchService'; export const ILaunchService = createDecorator(ID); @@ -24,15 +25,28 @@ export interface IStartArguments { userEnv: IProcessEnvironment; } +export interface IWindowInfo { + pid: number; + title: string; + folders: string[]; +} + +export interface IMainProcessInfo { + mainPID: number; + windows: IWindowInfo[]; +} + export interface ILaunchService { _serviceBrand: any; start(args: ParsedArgs, userEnv: IProcessEnvironment): TPromise; getMainProcessId(): TPromise; + getMainProcessInfo(): TPromise; } export interface ILaunchChannel extends IChannel { call(command: 'start', arg: IStartArguments): TPromise; call(command: 'get-main-process-id', arg: null): TPromise; + call(command: 'get-main-process-info', arg: null): TPromise; call(command: string, arg: any): TPromise; } @@ -48,6 +62,9 @@ export class LaunchChannel implements ILaunchChannel { case 'get-main-process-id': return this.service.getMainProcessId(); + + case 'get-main-process-info': + return this.service.getMainProcessInfo(); } return undefined; @@ -67,6 +84,10 @@ export class LaunchChannelClient implements ILaunchService { public getMainProcessId(): TPromise { return this.channel.call('get-main-process-id', null); } + + public getMainProcessInfo(): TPromise { + return this.channel.call('get-main-process-info', null); + } } export class LaunchService implements ILaunchService { @@ -75,12 +96,13 @@ export class LaunchService implements ILaunchService { constructor( @ILogService private logService: ILogService, - @IWindowsMainService private windowsService: IWindowsMainService, - @IURLService private urlService: IURLService + @IWindowsMainService private windowsMainService: IWindowsMainService, + @IURLService private urlService: IURLService, + @IWorkspacesMainService private workspacesMainService: IWorkspacesMainService ) { } public start(args: ParsedArgs, userEnv: IProcessEnvironment): TPromise { - this.logService.log('Received data from other instance: ', args, userEnv); + this.logService.trace('Received data from other instance: ', args, userEnv); // Check early for open-url which is handled in URL service const openUrlArg = args['open-url'] || []; @@ -95,13 +117,13 @@ export class LaunchService implements ILaunchService { const context = !!userEnv['VSCODE_CLI'] ? OpenContext.CLI : OpenContext.DESKTOP; let usedWindows: ICodeWindow[]; if (!!args.extensionDevelopmentPath) { - this.windowsService.openExtensionDevelopmentHostWindow({ context, cli: args, userEnv }); + this.windowsMainService.openExtensionDevelopmentHostWindow({ context, cli: args, userEnv }); } else if (args._.length === 0 && (args['new-window'] || args['unity-launch'])) { - usedWindows = this.windowsService.open({ context, cli: args, userEnv, forceNewWindow: true, forceEmpty: true }); + usedWindows = this.windowsMainService.open({ context, cli: args, userEnv, forceNewWindow: true, forceEmpty: true }); } else if (args._.length === 0) { - usedWindows = [this.windowsService.focusLastActive(args, context)]; + usedWindows = [this.windowsMainService.focusLastActive(args, context)]; } else { - usedWindows = this.windowsService.open({ + usedWindows = this.windowsMainService.open({ context, cli: args, userEnv, @@ -118,7 +140,7 @@ export class LaunchService implements ILaunchService { // In addition, we poll for the wait marker file to be deleted to return. if (args.wait && usedWindows.length === 1 && usedWindows[0]) { return TPromise.any([ - this.windowsService.waitForWindowCloseOrLoad(usedWindows[0].id), + this.windowsMainService.waitForWindowCloseOrLoad(usedWindows[0].id), whenDeleted(args.waitMarkerFilePath) ]).then(() => void 0, () => void 0); } @@ -127,8 +149,40 @@ export class LaunchService implements ILaunchService { } public getMainProcessId(): TPromise { - this.logService.log('Received request for process ID from other instance.'); + this.logService.trace('Received request for process ID from other instance.'); return TPromise.as(process.pid); } + + public getMainProcessInfo(): TPromise { + this.logService.trace('Received request for main process info from other instance.'); + + return TPromise.wrap({ + mainPID: process.pid, + windows: this.windowsMainService.getWindows().map(window => { + return this.getWindowInfo(window); + }) + } as IMainProcessInfo); + } + + private getWindowInfo(window: ICodeWindow): IWindowInfo { + const folders: string[] = []; + + if (window.openedFolderPath) { + folders.push(window.openedFolderPath); + } else if (window.openedWorkspace) { + const rootFolders = this.workspacesMainService.resolveWorkspaceSync(window.openedWorkspace.configPath).folders; + rootFolders.forEach(root => { + if (root.uri.scheme === 'file') { + folders.push(root.uri.fsPath); + } + }); + } + + return { + pid: window.win.webContents.getOSProcessId(), + title: window.win.getTitle(), + folders + } as IWindowInfo; + } } \ No newline at end of file diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 550ab41f174a..d9f1c0b0081e 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -9,19 +9,21 @@ import { app, dialog } from 'electron'; import { assign } from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; import product from 'vs/platform/node/product'; +import * as path from 'path'; import { parseMainProcessArgv } from 'vs/platform/environment/node/argv'; -import { mkdirp } from 'vs/base/node/pfs'; +import { mkdirp, readdir, rimraf } from 'vs/base/node/pfs'; import { validatePaths } from 'vs/code/node/paths'; import { LifecycleService, ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; import { Server, serve, connect } from 'vs/base/parts/ipc/node/ipc.net'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ILaunchChannel, LaunchChannelClient } from './launch'; +import { ILaunchChannel, LaunchChannelClient } from 'vs/code/electron-main/launch'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { ILogService, LogMainService } from 'vs/platform/log/common/log'; -import { IStorageService, StorageService } from 'vs/platform/storage/node/storage'; +import { ILogService, ConsoleLogMainService, MultiplexLogService } from 'vs/platform/log/common/log'; +import { StateService } from 'vs/platform/state/node/stateService'; +import { IStateService } from 'vs/platform/state/common/state'; import { IBackupMainService } from 'vs/platform/backup/common/backup'; import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainService'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; @@ -40,16 +42,28 @@ import { WorkspacesMainService } from 'vs/platform/workspaces/electron-main/work import { IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; import { localize } from 'vs/nls'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; +import { createLogService } from 'vs/platform/log/node/spdlogService'; +import { printDiagnostics } from 'vs/code/electron-main/diagnostics'; function createServices(args: ParsedArgs): IInstantiationService { const services = new ServiceCollection(); - services.set(IEnvironmentService, new SyncDescriptor(EnvironmentService, args, process.execPath)); - services.set(ILogService, new SyncDescriptor(LogMainService)); + const environmentService = new EnvironmentService(args, process.execPath); + const spdlogService = createLogService('main', environmentService); + const consoleLogService = new ConsoleLogMainService(environmentService); + const logService = new MultiplexLogService([consoleLogService, spdlogService]); + + process.once('exit', () => logService.dispose()); + + // Eventually cleanup + setTimeout(() => cleanupOlderLogs(environmentService).then(null, err => console.error(err)), 10000); + + services.set(IEnvironmentService, environmentService); + services.set(ILogService, logService); services.set(IWorkspacesMainService, new SyncDescriptor(WorkspacesMainService)); services.set(IHistoryMainService, new SyncDescriptor(HistoryMainService)); services.set(ILifecycleService, new SyncDescriptor(LifecycleService)); - services.set(IStorageService, new SyncDescriptor(StorageService)); + services.set(IStateService, new SyncDescriptor(StateService)); services.set(IConfigurationService, new SyncDescriptor(ConfigurationService)); services.set(IRequestService, new SyncDescriptor(RequestService)); services.set(IURLService, new SyncDescriptor(URLService, args['open-url'])); @@ -58,12 +72,28 @@ function createServices(args: ParsedArgs): IInstantiationService { return new InstantiationService(services, true); } +/** + * Cleans up older logs, while keeping the 10 most recent ones. +*/ +async function cleanupOlderLogs(environmentService: EnvironmentService): TPromise { + const currentLog = path.basename(environmentService.logsPath); + const logsRoot = path.dirname(environmentService.logsPath); + const children = await readdir(logsRoot); + const allSessions = children.filter(name => /^\d{8}T\d{6}$/.test(name)); + const oldSessions = allSessions.sort().filter((d, i) => d !== currentLog); + const toDelete = oldSessions.slice(0, Math.max(0, oldSessions.length - 9)); + + await TPromise.join(toDelete.map(name => rimraf(path.join(logsRoot, name)))); +} + function createPaths(environmentService: IEnvironmentService): TPromise { const paths = [ environmentService.appSettingsHome, environmentService.extensionsPath, - environmentService.nodeCachedDataDir + environmentService.nodeCachedDataDir, + environmentService.logsPath ]; + return TPromise.join(paths.map(p => p && mkdirp(p))) as TPromise; } @@ -80,7 +110,7 @@ function setupIPC(accessor: ServicesAccessor): TPromise { if (platform.isWindows) { promise = service.getMainProcessId() .then(processId => { - logService.log('Sending some foreground love to the running instance:', processId); + logService.trace('Sending some foreground love to the running instance:', processId); try { const { allowSetForegroundWindow } = require.__$__nodeRequire('windows-foreground-love'); @@ -96,10 +126,22 @@ function setupIPC(accessor: ServicesAccessor): TPromise { function setup(retry: boolean): TPromise { return serve(environmentService.mainIPCHandle).then(server => { - if (platform.isMacintosh) { - app.dock.show(); // dock might be hidden at this case due to a retry + + // Print --status usage info + if (environmentService.args.status) { + logService.warn('Warning: The --status argument can only be used if Code is already running. Please run it again after Code has started.'); + throw new ExpectedError('Terminating...'); } + // dock might be hidden at this case due to a retry + if (platform.isMacintosh) { + app.dock.show(); + } + + // Set the VSCODE_PID variable here when we are sure we are the first + // instance to startup. Otherwise we would wrongly overwrite the PID + process.env['VSCODE_PID'] = String(process.pid); + return server; }, err => { if (err.code !== 'EADDRINUSE') { @@ -124,12 +166,11 @@ function setupIPC(accessor: ServicesAccessor): TPromise { return TPromise.wrapError(new Error(msg)); } - logService.log('Sending env to running instance...'); - // Show a warning dialog after some timeout if it takes long to talk to the other instance - // Skip this if we are running with --wait where it is expected that we wait for a while + // Skip this if we are running with --wait where it is expected that we wait for a while. + // Also skip when gathering diagnostics (--status) which can take a longer time. let startupWarningDialogHandle: number; - if (!environmentService.wait) { + if (!environmentService.wait && !environmentService.status) { startupWarningDialogHandle = setTimeout(() => { showStartupWarningDialog( localize('secondInstanceNoResponse', "Another instance of {0} is running but not responding", product.nameShort), @@ -141,6 +182,15 @@ function setupIPC(accessor: ServicesAccessor): TPromise { const channel = client.getChannel('launch'); const service = new LaunchChannelClient(channel); + // Process Info + if (environmentService.args.status) { + return service.getMainProcessInfo().then(info => { + return printDiagnostics(info).then(() => TPromise.wrapError(new ExpectedError())); + }); + } + + logService.trace('Sending env to running instance...'); + return allowSetForegroundWindow(service) .then(() => service.start(environmentService.args, process.env)) .then(() => client.dispose()) @@ -172,7 +222,7 @@ function setupIPC(accessor: ServicesAccessor): TPromise { try { fs.unlinkSync(environmentService.mainIPCHandle); } catch (e) { - logService.log('Fatal error deleting obsolete instance handle', e); + logService.warn('Could not delete obsolete instance handle', e); return TPromise.wrapError(e); } @@ -204,14 +254,16 @@ function quit(accessor: ServicesAccessor, reason?: ExpectedError | Error): void if (reason) { if ((reason as ExpectedError).isExpected) { - logService.log(reason.message); + if (reason.message) { + logService.trace(reason.message); + } } else { exitCode = 1; // signal error to the outside if (reason.stack) { - console.error(reason.stack); + logService.error(reason.stack); } else { - console.error(`Startup error: ${reason.toString()}`); + logService.error(`Startup error: ${reason.toString()}`); } } } @@ -239,19 +291,16 @@ function main() { // Patch `process.env` with the instance's environment const environmentService = accessor.get(IEnvironmentService); const instanceEnv: typeof process.env = { - VSCODE_PID: String(process.pid), VSCODE_IPC_HOOK: environmentService.mainIPCHandle, - VSCODE_NLS_CONFIG: process.env['VSCODE_NLS_CONFIG'] + VSCODE_NLS_CONFIG: process.env['VSCODE_NLS_CONFIG'], + VSCODE_LOGS: process.env['VSCODE_LOGS'] }; assign(process.env, instanceEnv); // Startup return instantiationService.invokeFunction(a => createPaths(a.get(IEnvironmentService))) .then(() => instantiationService.invokeFunction(setupIPC)) - .then(mainIpcServer => { - const app = instantiationService.createInstance(CodeApplication, mainIpcServer, instanceEnv); - app.startup(); - }); + .then(mainIpcServer => instantiationService.createInstance(CodeApplication, mainIpcServer, instanceEnv).startup()); }).done(null, err => instantiationService.invokeFunction(quit, err)); } diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 2523bd850304..a3207fa5aa64 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -68,10 +68,10 @@ export class CodeMenu { @IUpdateService private updateService: IUpdateService, @IInstantiationService instantiationService: IInstantiationService, @IConfigurationService private configurationService: IConfigurationService, - @IWindowsMainService private windowsService: IWindowsMainService, + @IWindowsMainService private windowsMainService: IWindowsMainService, @IEnvironmentService private environmentService: IEnvironmentService, @ITelemetryService private telemetryService: ITelemetryService, - @IHistoryMainService private historyService: IHistoryMainService + @IHistoryMainService private historyMainService: IHistoryMainService ) { this.extensionViewlets = []; this.nativeTabMenuItems = []; @@ -92,11 +92,11 @@ export class CodeMenu { }); // Listen to some events from window service to update menu - this.historyService.onRecentlyOpenedChange(() => this.updateMenu()); - this.windowsService.onWindowsCountChanged(e => this.onWindowsCountChanged(e)); - this.windowsService.onActiveWindowChanged(() => this.updateWorkspaceMenuItems()); - this.windowsService.onWindowReady(() => this.updateWorkspaceMenuItems()); - this.windowsService.onWindowClose(() => this.updateWorkspaceMenuItems()); + this.historyMainService.onRecentlyOpenedChange(() => this.updateMenu()); + this.windowsMainService.onWindowsCountChanged(e => this.onWindowsCountChanged(e)); + this.windowsMainService.onActiveWindowChanged(() => this.updateWorkspaceMenuItems()); + this.windowsMainService.onWindowReady(() => this.updateWorkspaceMenuItems()); + this.windowsMainService.onWindowClose(() => this.updateWorkspaceMenuItems()); // Listen to extension viewlets ipc.on('vscode:extensionViewlets', (_event: any, rawExtensionViewlets: string) => { @@ -214,7 +214,7 @@ export class CodeMenu { } private updateWorkspaceMenuItems(): void { - const window = this.windowsService.getLastActiveWindow(); + const window = this.windowsMainService.getLastActiveWindow(); const isInWorkspaceContext = window && !!window.openedWorkspace; const isInFolderContext = window && !!window.openedFolderPath; @@ -310,7 +310,7 @@ export class CodeMenu { this.appMenuInstalled = true; const dockMenu = new Menu(); - dockMenu.append(new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsService.openNewWindow(OpenContext.DOCK) })); + dockMenu.append(new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsMainService.openNewWindow(OpenContext.DOCK) })); app.dock.setMenu(dockMenu); } @@ -325,7 +325,13 @@ export class CodeMenu { const hide = new MenuItem({ label: nls.localize('mHide', "Hide {0}", product.nameLong), role: 'hide', accelerator: 'Command+H' }); const hideOthers = new MenuItem({ label: nls.localize('mHideOthers', "Hide Others"), role: 'hideothers', accelerator: 'Command+Alt+H' }); const showAll = new MenuItem({ label: nls.localize('mShowAll', "Show All"), role: 'unhide' }); - const quit = new MenuItem(this.likeAction('workbench.action.quit', { label: nls.localize('miQuit', "Quit {0}", product.nameLong), click: () => this.windowsService.quit() })); + const quit = new MenuItem(this.likeAction('workbench.action.quit', { + label: nls.localize('miQuit', "Quit {0}", product.nameLong), click: () => { + if (this.windowsMainService.getWindowCount() === 0 || !!this.windowsMainService.getFocusedWindow()) { + this.windowsMainService.quit(); // fix for https://github.com/Microsoft/vscode/issues/39191 + } + } + })); const actions = [about]; actions.push(...checkForUpdates); @@ -346,39 +352,39 @@ export class CodeMenu { } private setFileMenu(fileMenu: Electron.Menu): void { - const hasNoWindows = (this.windowsService.getWindowCount() === 0); + const hasNoWindows = (this.windowsMainService.getWindowCount() === 0); let newFile: Electron.MenuItem; if (hasNoWindows) { - newFile = new MenuItem(this.likeAction('workbench.action.files.newUntitledFile', { label: this.mnemonicLabel(nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File")), click: () => this.windowsService.openNewWindow(OpenContext.MENU) })); + newFile = new MenuItem(this.likeAction('workbench.action.files.newUntitledFile', { label: this.mnemonicLabel(nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File")), click: () => this.windowsMainService.openNewWindow(OpenContext.MENU) })); } else { newFile = this.createMenuItem(nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File"), 'workbench.action.files.newUntitledFile'); } let open: Electron.MenuItem; if (hasNoWindows) { - open = new MenuItem(this.likeAction('workbench.action.files.openFileFolder', { label: this.mnemonicLabel(nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...")), click: (menuItem, win, event) => this.windowsService.pickFileFolderAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); + open = new MenuItem(this.likeAction('workbench.action.files.openFileFolder', { label: this.mnemonicLabel(nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...")), click: (menuItem, win, event) => this.windowsMainService.pickFileFolderAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); } else { open = this.createMenuItem(nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open..."), ['workbench.action.files.openFileFolder', 'workbench.action.files.openFileFolderInNewWindow']); } let openWorkspace: Electron.MenuItem; if (hasNoWindows) { - openWorkspace = new MenuItem(this.likeAction('workbench.action.openWorkspace', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenWorkspace', comment: ['&& denotes a mnemonic'] }, "Open Wor&&kspace...")), click: (menuItem, win, event) => this.windowsService.pickWorkspaceAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); + openWorkspace = new MenuItem(this.likeAction('workbench.action.openWorkspace', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenWorkspace', comment: ['&& denotes a mnemonic'] }, "Open Wor&&kspace...")), click: (menuItem, win, event) => this.windowsMainService.pickWorkspaceAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); } else { openWorkspace = this.createMenuItem(nls.localize({ key: 'miOpenWorkspace', comment: ['&& denotes a mnemonic'] }, "Open Wor&&kspace..."), ['workbench.action.openWorkspace', 'workbench.action.openWorkspaceInNewWindow']); } let openFolder: Electron.MenuItem; if (hasNoWindows) { - openFolder = new MenuItem(this.likeAction('workbench.action.files.openFolder', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...")), click: (menuItem, win, event) => this.windowsService.pickFolderAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); + openFolder = new MenuItem(this.likeAction('workbench.action.files.openFolder', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...")), click: (menuItem, win, event) => this.windowsMainService.pickFolderAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); } else { openFolder = this.createMenuItem(nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder..."), ['workbench.action.files.openFolder', 'workbench.action.files.openFolderInNewWindow']); } let openFile: Electron.MenuItem; if (hasNoWindows) { - openFile = new MenuItem(this.likeAction('workbench.action.files.openFile', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File...")), click: (menuItem, win, event) => this.windowsService.pickFileAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); + openFile = new MenuItem(this.likeAction('workbench.action.files.openFile', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File...")), click: (menuItem, win, event) => this.windowsMainService.pickFileAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); } else { openFile = this.createMenuItem(nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File..."), ['workbench.action.files.openFile', 'workbench.action.files.openFileInNewWindow']); } @@ -395,20 +401,20 @@ export class CodeMenu { const saveAllFiles = this.createMenuItem(nls.localize({ key: 'miSaveAll', comment: ['&& denotes a mnemonic'] }, "Save A&&ll"), 'workbench.action.files.saveAll'); const autoSaveEnabled = [AutoSaveConfiguration.AFTER_DELAY, AutoSaveConfiguration.ON_FOCUS_CHANGE, AutoSaveConfiguration.ON_WINDOW_CHANGE].some(s => this.currentAutoSaveSetting === s); - const autoSave = new MenuItem(this.likeAction('vscode.toggleAutoSave', { label: this.mnemonicLabel(nls.localize('miAutoSave', "Auto Save")), type: 'checkbox', checked: autoSaveEnabled, enabled: this.windowsService.getWindowCount() > 0, click: () => this.windowsService.sendToFocused('vscode.toggleAutoSave') }, false)); + const autoSave = new MenuItem(this.likeAction('vscode.toggleAutoSave', { label: this.mnemonicLabel(nls.localize('miAutoSave', "Auto Save")), type: 'checkbox', checked: autoSaveEnabled, enabled: this.windowsMainService.getWindowCount() > 0, click: () => this.windowsMainService.sendToFocused('vscode.toggleAutoSave') }, false)); const preferences = this.getPreferencesMenu(); - const newWindow = new MenuItem(this.likeAction('workbench.action.newWindow', { label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsService.openNewWindow(OpenContext.MENU) })); + const newWindow = new MenuItem(this.likeAction('workbench.action.newWindow', { label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsMainService.openNewWindow(OpenContext.MENU) })); const revertFile = this.createMenuItem(nls.localize({ key: 'miRevert', comment: ['&& denotes a mnemonic'] }, "Re&&vert File"), 'workbench.action.files.revert'); - const closeWindow = new MenuItem(this.likeAction('workbench.action.closeWindow', { label: this.mnemonicLabel(nls.localize({ key: 'miCloseWindow', comment: ['&& denotes a mnemonic'] }, "Clos&&e Window")), click: () => this.windowsService.getLastActiveWindow().win.close(), enabled: this.windowsService.getWindowCount() > 0 })); + const closeWindow = new MenuItem(this.likeAction('workbench.action.closeWindow', { label: this.mnemonicLabel(nls.localize({ key: 'miCloseWindow', comment: ['&& denotes a mnemonic'] }, "Clos&&e Window")), click: () => this.windowsMainService.getLastActiveWindow().win.close(), enabled: this.windowsMainService.getWindowCount() > 0 })); this.closeWorkspace = this.createMenuItem(nls.localize({ key: 'miCloseWorkspace', comment: ['&& denotes a mnemonic'] }, "Close &&Workspace"), 'workbench.action.closeFolder'); this.closeFolder = this.createMenuItem(nls.localize({ key: 'miCloseFolder', comment: ['&& denotes a mnemonic'] }, "Close &&Folder"), 'workbench.action.closeFolder'); const closeEditor = this.createMenuItem(nls.localize({ key: 'miCloseEditor', comment: ['&& denotes a mnemonic'] }, "&&Close Editor"), 'workbench.action.closeActiveEditor'); - const exit = new MenuItem(this.likeAction('workbench.action.quit', { label: this.mnemonicLabel(nls.localize({ key: 'miExit', comment: ['&& denotes a mnemonic'] }, "E&&xit")), click: () => this.windowsService.quit() })); + const exit = new MenuItem(this.likeAction('workbench.action.quit', { label: this.mnemonicLabel(nls.localize({ key: 'miExit', comment: ['&& denotes a mnemonic'] }, "E&&xit")), click: () => this.windowsMainService.quit() })); this.updateWorkspaceMenuItems(); @@ -468,7 +474,7 @@ export class CodeMenu { private setOpenRecentMenu(openRecentMenu: Electron.Menu): void { openRecentMenu.append(this.createMenuItem(nls.localize({ key: 'miReopenClosedEditor', comment: ['&& denotes a mnemonic'] }, "&&Reopen Closed Editor"), 'workbench.action.reopenClosedEditor')); - const { workspaces, files } = this.historyService.getRecentlyOpened(); + const { workspaces, files } = this.historyMainService.getRecentlyOpened(); // Workspaces if (workspaces.length > 0) { @@ -492,7 +498,7 @@ export class CodeMenu { openRecentMenu.append(__separator__()); openRecentMenu.append(this.createMenuItem(nls.localize({ key: 'miMore', comment: ['&& denotes a mnemonic'] }, "&&More..."), 'workbench.action.openRecent')); openRecentMenu.append(__separator__()); - openRecentMenu.append(new MenuItem(this.likeAction('workbench.action.clearRecentFiles', { label: this.mnemonicLabel(nls.localize({ key: 'miClearRecentOpen', comment: ['&& denotes a mnemonic'] }, "&&Clear Recently Opened")), click: () => this.historyService.clearRecentlyOpened() }))); + openRecentMenu.append(new MenuItem(this.likeAction('workbench.action.clearRecentFiles', { label: this.mnemonicLabel(nls.localize({ key: 'miClearRecentOpen', comment: ['&& denotes a mnemonic'] }, "&&Clear Recently Opened")), click: () => this.historyMainService.clearRecentlyOpened() }))); } } @@ -511,7 +517,7 @@ export class CodeMenu { label, click: (menuItem, win, event) => { const openInNewWindow = this.isOptionClick(event); - const success = this.windowsService.open({ + const success = this.windowsMainService.open({ context: OpenContext.MENU, cli: this.environmentService.args, pathsToOpen: [path], forceNewWindow: openInNewWindow, @@ -519,7 +525,7 @@ export class CodeMenu { }).length > 0; if (!success) { - this.historyService.removeFromRecentlyOpened([isSingleFolderWorkspaceIdentifier(workspace) ? workspace : workspace.configPath]); + this.historyMainService.removeFromRecentlyOpened([isSingleFolderWorkspaceIdentifier(workspace) ? workspace : workspace.configPath]); } } }, false)); @@ -678,7 +684,7 @@ export class CodeMenu { const commands = this.createMenuItem(nls.localize({ key: 'miCommandPalette', comment: ['&& denotes a mnemonic'] }, "&&Command Palette..."), 'workbench.action.showCommands'); - const fullscreen = new MenuItem(this.withKeybinding('workbench.action.toggleFullScreen', { label: this.mnemonicLabel(nls.localize({ key: 'miToggleFullScreen', comment: ['&& denotes a mnemonic'] }, "Toggle &&Full Screen")), click: () => this.windowsService.getLastActiveWindow().toggleFullScreen(), enabled: this.windowsService.getWindowCount() > 0 })); + const fullscreen = new MenuItem(this.withKeybinding('workbench.action.toggleFullScreen', { label: this.mnemonicLabel(nls.localize({ key: 'miToggleFullScreen', comment: ['&& denotes a mnemonic'] }, "Toggle &&Full Screen")), click: () => this.windowsMainService.getLastActiveWindow().toggleFullScreen(), enabled: this.windowsMainService.getWindowCount() > 0 })); const toggleZenMode = this.createMenuItem(nls.localize('miToggleZenMode', "Toggle Zen Mode"), 'workbench.action.toggleZenMode'); const toggleMenuBar = this.createMenuItem(nls.localize({ key: 'miToggleMenuBar', comment: ['&& denotes a mnemonic'] }, "Toggle Menu &&Bar"), 'workbench.action.toggleMenuBar'); const splitEditor = this.createMenuItem(nls.localize({ key: 'miSplitEditor', comment: ['&& denotes a mnemonic'] }, "Split &&Editor"), 'workbench.action.splitEditor'); @@ -874,15 +880,15 @@ export class CodeMenu { } private setMacWindowMenu(macWindowMenu: Electron.Menu): void { - const minimize = new MenuItem({ label: nls.localize('mMinimize', "Minimize"), role: 'minimize', accelerator: 'Command+M', enabled: this.windowsService.getWindowCount() > 0 }); - const zoom = new MenuItem({ label: nls.localize('mZoom', "Zoom"), role: 'zoom', enabled: this.windowsService.getWindowCount() > 0 }); - const bringAllToFront = new MenuItem({ label: nls.localize('mBringToFront', "Bring All to Front"), role: 'front', enabled: this.windowsService.getWindowCount() > 0 }); + const minimize = new MenuItem({ label: nls.localize('mMinimize', "Minimize"), role: 'minimize', accelerator: 'Command+M', enabled: this.windowsMainService.getWindowCount() > 0 }); + const zoom = new MenuItem({ label: nls.localize('mZoom', "Zoom"), role: 'zoom', enabled: this.windowsMainService.getWindowCount() > 0 }); + const bringAllToFront = new MenuItem({ label: nls.localize('mBringToFront', "Bring All to Front"), role: 'front', enabled: this.windowsMainService.getWindowCount() > 0 }); const switchWindow = this.createMenuItem(nls.localize({ key: 'miSwitchWindow', comment: ['&& denotes a mnemonic'] }, "Switch &&Window..."), 'workbench.action.switchWindow'); this.nativeTabMenuItems = []; const nativeTabMenuItems: Electron.MenuItem[] = []; if (this.currentEnableNativeTabs) { - const hasMultipleWindows = this.windowsService.getWindowCount() > 1; + const hasMultipleWindows = this.windowsMainService.getWindowCount() > 1; this.nativeTabMenuItems.push(this.createMenuItem(nls.localize('mShowPreviousTab', "Show Previous Tab"), 'workbench.action.showPreviousWindowTab', hasMultipleWindows)); this.nativeTabMenuItems.push(this.createMenuItem(nls.localize('mShowNextTab', "Show Next Tab"), 'workbench.action.showNextWindowTab', hasMultipleWindows)); @@ -905,7 +911,7 @@ export class CodeMenu { } private toggleDevTools(): void { - const w = this.windowsService.getFocusedWindow(); + const w = this.windowsMainService.getFocusedWindow(); if (w && w.win) { const contents = w.win.webContents; if (w.hasHiddenTitleBarStyle() && !w.win.isFullScreen() && !contents.isDevToolsOpened()) { @@ -920,7 +926,7 @@ export class CodeMenu { const toggleDevToolsItem = new MenuItem(this.likeAction('workbench.action.toggleDevTools', { label: this.mnemonicLabel(nls.localize({ key: 'miToggleDevTools', comment: ['&& denotes a mnemonic'] }, "&&Toggle Developer Tools")), click: () => this.toggleDevTools(), - enabled: (this.windowsService.getWindowCount() > 0) + enabled: (this.windowsMainService.getWindowCount() > 0) })); const showAccessibilityOptions = new MenuItem(this.likeAction('accessibilityOptions', { @@ -933,9 +939,9 @@ export class CodeMenu { let reportIssuesItem: Electron.MenuItem = null; if (product.reportIssueUrl) { - const label = nls.localize({ key: 'miReportIssues', comment: ['&& denotes a mnemonic'] }, "Report &&Issues"); + const label = nls.localize({ key: 'miReportIssue', comment: ['&& denotes a mnemonic', 'Translate this to "Report Issue in English" in all languages please!'] }, "Report &&Issue"); - if (this.windowsService.getWindowCount() > 0) { + if (this.windowsMainService.getWindowCount() > 0) { reportIssuesItem = this.createMenuItem(label, 'workbench.action.reportIssues'); } else { reportIssuesItem = new MenuItem({ label: this.mnemonicLabel(label), click: () => this.openUrl(product.reportIssueUrl, 'openReportIssues') }); @@ -944,14 +950,14 @@ export class CodeMenu { const keyboardShortcutsUrl = isLinux ? product.keyboardShortcutsUrlLinux : isMacintosh ? product.keyboardShortcutsUrlMac : product.keyboardShortcutsUrlWin; arrays.coalesce([ - new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miWelcome', comment: ['&& denotes a mnemonic'] }, "&&Welcome")), click: () => this.runActionInRenderer('workbench.action.showWelcomePage'), enabled: (this.windowsService.getWindowCount() > 0) }), - new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miInteractivePlayground', comment: ['&& denotes a mnemonic'] }, "&&Interactive Playground")), click: () => this.runActionInRenderer('workbench.action.showInteractivePlayground'), enabled: (this.windowsService.getWindowCount() > 0) }), - product.documentationUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miDocumentation', comment: ['&& denotes a mnemonic'] }, "&&Documentation")), click: () => this.runActionInRenderer('workbench.action.openDocumentationUrl'), enabled: (this.windowsService.getWindowCount() > 0) }) : null, - product.releaseNotesUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miReleaseNotes', comment: ['&& denotes a mnemonic'] }, "&&Release Notes")), click: () => this.runActionInRenderer('update.showCurrentReleaseNotes'), enabled: (this.windowsService.getWindowCount() > 0) }) : null, + new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miWelcome', comment: ['&& denotes a mnemonic'] }, "&&Welcome")), click: () => this.runActionInRenderer('workbench.action.showWelcomePage'), enabled: (this.windowsMainService.getWindowCount() > 0) }), + new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miInteractivePlayground', comment: ['&& denotes a mnemonic'] }, "&&Interactive Playground")), click: () => this.runActionInRenderer('workbench.action.showInteractivePlayground'), enabled: (this.windowsMainService.getWindowCount() > 0) }), + product.documentationUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miDocumentation', comment: ['&& denotes a mnemonic'] }, "&&Documentation")), click: () => this.runActionInRenderer('workbench.action.openDocumentationUrl'), enabled: (this.windowsMainService.getWindowCount() > 0) }) : null, + product.releaseNotesUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miReleaseNotes', comment: ['&& denotes a mnemonic'] }, "&&Release Notes")), click: () => this.runActionInRenderer('update.showCurrentReleaseNotes'), enabled: (this.windowsMainService.getWindowCount() > 0) }) : null, __separator__(), - keyboardShortcutsUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miKeyboardShortcuts', comment: ['&& denotes a mnemonic'] }, "&&Keyboard Shortcuts Reference")), click: () => this.runActionInRenderer('workbench.action.keybindingsReference'), enabled: (this.windowsService.getWindowCount() > 0) }) : null, - product.introductoryVideosUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miIntroductoryVideos', comment: ['&& denotes a mnemonic'] }, "Introductory &&Videos")), click: () => this.runActionInRenderer('workbench.action.openIntroductoryVideosUrl'), enabled: (this.windowsService.getWindowCount() > 0) }) : null, - product.tipsAndTricksUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miTipsAndTricks', comment: ['&& denotes a mnemonic'] }, "&&Tips and Tricks")), click: () => this.runActionInRenderer('workbench.action.openTipsAndTricksUrl'), enabled: (this.windowsService.getWindowCount() > 0) }) : null, + keyboardShortcutsUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miKeyboardShortcuts', comment: ['&& denotes a mnemonic'] }, "&&Keyboard Shortcuts Reference")), click: () => this.runActionInRenderer('workbench.action.keybindingsReference'), enabled: (this.windowsMainService.getWindowCount() > 0) }) : null, + product.introductoryVideosUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miIntroductoryVideos', comment: ['&& denotes a mnemonic'] }, "Introductory &&Videos")), click: () => this.runActionInRenderer('workbench.action.openIntroductoryVideosUrl'), enabled: (this.windowsMainService.getWindowCount() > 0) }) : null, + product.tipsAndTricksUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miTipsAndTricks', comment: ['&& denotes a mnemonic'] }, "&&Tips and Tricks")), click: () => this.runActionInRenderer('workbench.action.openTipsAndTricksUrl'), enabled: (this.windowsMainService.getWindowCount() > 0) }) : null, (product.introductoryVideosUrl || keyboardShortcutsUrl) ? __separator__() : null, product.twitterUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miTwitter', comment: ['&& denotes a mnemonic'] }, "&&Join us on Twitter")), click: () => this.openUrl(product.twitterUrl, 'openTwitterUrl') }) : null, product.requestFeatureUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miUserVoice', comment: ['&& denotes a mnemonic'] }, "&&Search Feature Requests")), click: () => this.openUrl(product.requestFeatureUrl, 'openUserVoiceUrl') }) : null, @@ -1088,7 +1094,7 @@ export class CodeMenu { this.runActionInRenderer(commandId); }; - const enabled = typeof arg3 === 'boolean' ? arg3 : this.windowsService.getWindowCount() > 0; + const enabled = typeof arg3 === 'boolean' ? arg3 : this.windowsMainService.getWindowCount() > 0; const checked = typeof arg4 === 'boolean' ? arg4 : false; let commandId: string; @@ -1113,11 +1119,11 @@ export class CodeMenu { private createContextAwareMenuItem(label: string, commandId: string, clickHandler: IMenuItemClickHandler): Electron.MenuItem { return new MenuItem(this.withKeybinding(commandId, { label: this.mnemonicLabel(label), - enabled: this.windowsService.getWindowCount() > 0, + enabled: this.windowsMainService.getWindowCount() > 0, click: () => { // No Active Window - const activeWindow = this.windowsService.getFocusedWindow(); + const activeWindow = this.windowsMainService.getFocusedWindow(); if (!activeWindow) { return clickHandler.inNoWindow(); } @@ -1137,9 +1143,9 @@ export class CodeMenu { // We make sure to not run actions when the window has no focus, this helps // for https://github.com/Microsoft/vscode/issues/25907 and specifically for // https://github.com/Microsoft/vscode/issues/11928 - const activeWindow = this.windowsService.getFocusedWindow(); + const activeWindow = this.windowsMainService.getFocusedWindow(); if (activeWindow) { - this.windowsService.sendToFocused('vscode:runAction', { id, from: 'menu' } as IRunActionInWindowRequest); + this.windowsMainService.sendToFocused('vscode:runAction', { id, from: 'menu' } as IRunActionInWindowRequest); } } @@ -1191,7 +1197,7 @@ export class CodeMenu { } private openAboutDialog(): void { - const lastActiveWindow = this.windowsService.getFocusedWindow() || this.windowsService.getLastActiveWindow(); + const lastActiveWindow = this.windowsMainService.getFocusedWindow() || this.windowsMainService.getLastActiveWindow(); const detail = nls.localize('aboutDetail', "Version {0}\nCommit {1}\nDate {2}\nShell {3}\nRenderer {4}\nNode {5}\nArchitecture {6}", @@ -1209,19 +1215,19 @@ export class CodeMenu { buttons.push(mnemonicButtonLabel(nls.localize({ key: 'copy', comment: ['&& denotes a mnemonic'] }, "&&Copy"))); // https://github.com/Microsoft/vscode/issues/37608 } - dialog.showMessageBox(lastActiveWindow && lastActiveWindow.win, { + const result = dialog.showMessageBox(lastActiveWindow && lastActiveWindow.win, { title: product.nameLong, type: 'info', message: product.nameLong, detail: `\n${detail}`, buttons, noLink: true - }, result => { - if (isWindows && result === 1) { - clipboard.writeText(detail); - } }); + if (isWindows && result === 1) { + clipboard.writeText(detail); + } + this.reportMenuActionTelemetry('showAboutDialog'); } diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index e37c9db7df53..7c1edf759064 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -20,6 +20,12 @@ export class SharedProcess implements ISharedProcess { private window: Electron.BrowserWindow; private disposables: IDisposable[] = []; + constructor( + private environmentService: IEnvironmentService, + private readonly machineId: string, + private readonly userEnv: IProcessEnvironment + ) { } + @memoize private get _whenReady(): TPromise { this.window = new BrowserWindow({ @@ -32,6 +38,7 @@ export class SharedProcess implements ISharedProcess { }); const config = assign({ appRoot: this.environmentService.appRoot, + machineId: this.machineId, nodeCachedDataDir: this.environmentService.nodeCachedDataDir, userEnv: this.userEnv }); @@ -76,11 +83,6 @@ export class SharedProcess implements ISharedProcess { }); } - constructor( - private environmentService: IEnvironmentService, - private userEnv: IProcessEnvironment - ) { } - spawn(): void { this.barrier.open(); } diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index f89884a91797..bdf16efb1f55 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -7,10 +7,9 @@ import * as path from 'path'; import * as objects from 'vs/base/common/objects'; -import { stopProfiling } from 'vs/base/node/profiler'; import nls = require('vs/nls'); import URI from 'vs/base/common/uri'; -import { IStorageService } from 'vs/platform/storage/node/storage'; +import { IStateService } from 'vs/platform/state/common/state'; import { shell, screen, BrowserWindow, systemPreferences, app, TouchBar, nativeImage } from 'electron'; import { TPromise, TValueCallback } from 'vs/base/common/winjs.base'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; @@ -18,7 +17,6 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { parseArgs } from 'vs/platform/environment/node/argv'; import product from 'vs/platform/node/product'; -import pkg from 'vs/platform/node/package'; import { IWindowSettings, MenuBarVisibility, IWindowConfiguration, ReadyState, IRunActionInWindowRequest } from 'vs/platform/windows/common/windows'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; @@ -27,6 +25,7 @@ import { IWorkspaceIdentifier, IWorkspacesMainService } from 'vs/platform/worksp import { IBackupMainService } from 'vs/platform/backup/common/backup'; import { ICommandAction } from 'vs/platform/actions/common/actions'; import { mark, exportEntries } from 'vs/base/common/performance'; +import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/extensionGalleryService'; export interface IWindowState { width?: number; @@ -98,6 +97,8 @@ export class CodeWindow implements ICodeWindow { private currentConfig: IWindowConfiguration; private pendingLoadConfig: IWindowConfiguration; + private marketplaceHeadersPromise: TPromise; + private touchBarGroups: Electron.TouchBarSegmentedControl[]; constructor( @@ -105,9 +106,9 @@ export class CodeWindow implements ICodeWindow { @ILogService private logService: ILogService, @IEnvironmentService private environmentService: IEnvironmentService, @IConfigurationService private configurationService: IConfigurationService, - @IStorageService private storageService: IStorageService, - @IWorkspacesMainService private workspaceService: IWorkspacesMainService, - @IBackupMainService private backupService: IBackupMainService + @IStateService private stateService: IStateService, + @IWorkspacesMainService private workspacesMainService: IWorkspacesMainService, + @IBackupMainService private backupMainService: IBackupMainService ) { this.touchBarGroups = []; this._lastFocusTime = -1; @@ -124,6 +125,9 @@ export class CodeWindow implements ICodeWindow { // macOS: touch bar support this.createTouchBar(); + // Request handling + this.handleMarketplaceRequests(); + // Eventing this.registerListeners(); } @@ -190,7 +194,7 @@ export class CodeWindow implements ICodeWindow { this._win = new BrowserWindow(options); this._id = this._win.id; - // TODO@Ben Bug in Electron (https://github.com/electron/electron/issues/10862). On multi-monitor setups, + // Bug in Electron (https://github.com/electron/electron/issues/10862). On multi-monitor setups, // it can happen that the position we set to the window is not the correct one on the display. // To workaround, we ask the window for its position and set it again if not matching. // This only applies if the window is not fullscreen or maximized and multiple monitors are used. @@ -203,7 +207,7 @@ export class CodeWindow implements ICodeWindow { } } } catch (err) { - this.logService.log(`Unexpected error fixing window position on windows with multiple windows: ${err}\n${err.stack}`); + this.logService.warn(`Unexpected error fixing window position on windows with multiple windows: ${err}\n${err.stack}`); } } @@ -331,17 +335,21 @@ export class CodeWindow implements ICodeWindow { return this._readyState; } - private registerListeners(): void { - const urls = ['https://marketplace.visualstudio.com/*', 'https://*.vsassets.io/*']; - const headers = { - 'X-Market-Client-Id': `VSCode ${pkg.version}`, - 'User-Agent': `VSCode ${pkg.version}`, - 'X-Market-User-Id': this.environmentService.machineUUID - }; + private handleMarketplaceRequests(): void { + // Resolve marketplace headers + this.marketplaceHeadersPromise = resolveMarketplaceHeaders(this.environmentService); + + // Inject headers when requests are incoming + const urls = ['https://marketplace.visualstudio.com/*', 'https://*.vsassets.io/*']; this._win.webContents.session.webRequest.onBeforeSendHeaders({ urls }, (details: any, cb: any) => { - cb({ cancel: false, requestHeaders: objects.assign(details.requestHeaders, headers) }); + this.marketplaceHeadersPromise.done(headers => { + cb({ cancel: false, requestHeaders: objects.assign(details.requestHeaders, headers) }); + }); }); + } + + private registerListeners(): void { // Prevent loading of svgs this._win.webContents.session.webRequest.onBeforeRequest(null, (details, callback) => { @@ -430,7 +438,7 @@ export class CodeWindow implements ICodeWindow { this.toDispose.push(this.configurationService.onDidChangeConfiguration(e => this.onConfigurationUpdated())); // Handle Workspace events - this.toDispose.push(this.workspaceService.onUntitledWorkspaceDeleted(e => this.onUntitledWorkspaceDeleted(e))); + this.toDispose.push(this.workspacesMainService.onUntitledWorkspaceDeleted(e => this.onUntitledWorkspaceDeleted(e))); } private onUntitledWorkspaceDeleted(workspace: IWorkspaceIdentifier): void { @@ -493,7 +501,7 @@ export class CodeWindow implements ICodeWindow { // Clear Document Edited if needed if (isMacintosh && this._win.isDocumentEdited()) { - if (!isReload || !this.backupService.isHotExitEnabled()) { + if (!isReload || !this.backupMainService.isHotExitEnabled()) { this._win.setDocumentEdited(false); } } @@ -522,12 +530,6 @@ export class CodeWindow implements ICodeWindow { } }, 10000); } - - // (--prof-startup) save profile to disk - const { profileStartup } = this.environmentService; - if (profileStartup) { - stopProfiling(profileStartup.dir, profileStartup.prefix).done(undefined, err => this.logService.error(err)); - } } public reload(configuration?: IWindowConfiguration, cli?: ParsedArgs): void { @@ -561,6 +563,9 @@ export class CodeWindow implements ICodeWindow { private getUrl(windowConfiguration: IWindowConfiguration): string { + // Set window ID + windowConfiguration.windowId = this._win.id; + // Set zoomlevel const windowConfig = this.configurationService.getValue('window'); const zoomLevel = windowConfig && windowConfig.zoomLevel; @@ -602,7 +607,7 @@ export class CodeWindow implements ICodeWindow { return 'hc-black'; } - const theme = this.storageService.getItem(CodeWindow.themeStorageKey, 'vs-dark'); + const theme = this.stateService.getItem(CodeWindow.themeStorageKey, 'vs-dark'); return theme.split(' ')[0]; } @@ -612,7 +617,7 @@ export class CodeWindow implements ICodeWindow { return CodeWindow.DEFAULT_BG_HC_BLACK; } - const background = this.storageService.getItem(CodeWindow.themeBackgroundStorageKey, null); + const background = this.stateService.getItem(CodeWindow.themeBackgroundStorageKey, null); if (!background) { const baseTheme = this.getBaseTheme(); @@ -678,7 +683,7 @@ export class CodeWindow implements ICodeWindow { try { state = this.validateWindowState(state); } catch (err) { - this.logService.log(`Unexpected error validating window state: ${err}\n${err.stack}`); // somehow display API can be picky about the state to validate + this.logService.warn(`Unexpected error validating window state: ${err}\n${err.stack}`); // somehow display API can be picky about the state to validate } } diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 14825f0daf4f..2dab6f94941e 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -12,7 +12,7 @@ import * as arrays from 'vs/base/common/arrays'; import { assign, mixin, equals } from 'vs/base/common/objects'; import { IBackupMainService } from 'vs/platform/backup/common/backup'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; -import { IStorageService } from 'vs/platform/storage/node/storage'; +import { IStateService } from 'vs/platform/state/common/state'; import { CodeWindow, IWindowState as ISingleWindowState, defaultWindowState, WindowMode } from 'vs/code/electron-main/window'; import { ipcMain as ipc, screen, BrowserWindow, dialog, systemPreferences, app } from 'electron'; import { IPathWithLineAndColumn, parseLineAndColumnAware } from 'vs/code/node/paths'; @@ -45,10 +45,6 @@ interface INewWindowState extends ISingleWindowState { hasDefaultState?: boolean; } -interface ILegacyWindowState extends IWindowState { - workspacePath?: string; -} - interface IWindowState { workspace?: IWorkspaceIdentifier; folderPath?: string; @@ -56,10 +52,6 @@ interface IWindowState { uiState: ISingleWindowState; } -interface ILegacyWindowsState extends IWindowsState { - openedFolders?: IWindowState[]; -} - interface IWindowsState { lastActiveWindow?: IWindowState; lastPluginDevelopmentHostWindow?: IWindowState; @@ -138,51 +130,25 @@ export class WindowsManager implements IWindowsMainService { onWindowsCountChanged: CommonEvent = this._onWindowsCountChanged.event; constructor( + private readonly machineId: string, @ILogService private logService: ILogService, - @IStorageService private storageService: IStorageService, + @IStateService private stateService: IStateService, @IEnvironmentService private environmentService: IEnvironmentService, @ILifecycleService private lifecycleService: ILifecycleService, - @IBackupMainService private backupService: IBackupMainService, + @IBackupMainService private backupMainService: IBackupMainService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService private configurationService: IConfigurationService, - @IHistoryMainService private historyService: IHistoryMainService, - @IWorkspacesMainService private workspacesService: IWorkspacesMainService, + @IHistoryMainService private historyMainService: IHistoryMainService, + @IWorkspacesMainService private workspacesMainService: IWorkspacesMainService, @IInstantiationService private instantiationService: IInstantiationService ) { - this.windowsState = this.storageService.getItem(WindowsManager.windowsStateStorageKey) || { openedWindows: [] }; - - this.fileDialog = new FileDialog(environmentService, telemetryService, storageService, this); - this.workspacesManager = new WorkspacesManager(workspacesService, backupService, environmentService, this); - - this.migrateLegacyWindowState(); - } - - private migrateLegacyWindowState(): void { - const state: ILegacyWindowsState = this.windowsState; - - // TODO@Ben migration from previous openedFolders to new openedWindows property - if (Array.isArray(state.openedFolders) && state.openedFolders.length > 0) { - state.openedWindows = state.openedFolders; - state.openedFolders = void 0; - } else if (!state.openedWindows) { - state.openedWindows = []; + this.windowsState = this.stateService.getItem(WindowsManager.windowsStateStorageKey) || { openedWindows: [] }; + if (!Array.isArray(this.windowsState.openedWindows)) { + this.windowsState.openedWindows = []; } - // TODO@Ben migration from previous workspacePath in window state to folderPath - const states: ILegacyWindowState[] = []; - states.push(state.lastActiveWindow); - states.push(state.lastPluginDevelopmentHostWindow); - states.push(...state.openedWindows); - states.forEach(state => { - if (!state) { - return; - } - - if (typeof state.workspacePath === 'string') { - state.folderPath = state.workspacePath; - state.workspacePath = void 0; - } - }); + this.fileDialog = new FileDialog(environmentService, telemetryService, stateService, this); + this.workspacesManager = new WorkspacesManager(workspacesMainService, backupMainService, environmentService, this); } public ready(initialUserEnv: IProcessEnvironment): void { @@ -202,7 +168,7 @@ export class WindowsManager implements IWindowsMainService { // React to workbench loaded events from windows ipc.on('vscode:workbenchLoaded', (_event: any, windowId: number) => { - this.logService.log('IPC#vscode-workbenchLoaded'); + this.logService.trace('IPC#vscode-workbenchLoaded'); const win = this.getWindowById(windowId); if (win) { @@ -276,7 +242,7 @@ export class WindowsManager implements IWindowsMainService { // - closeAll(2): onBeforeWindowClose(2, false), onBeforeWindowClose(2, false), onBeforeQuit(0) // private onBeforeQuit(): void { - const currentWindowsState: ILegacyWindowsState = { + const currentWindowsState: IWindowsState = { openedWindows: [], lastPluginDevelopmentHostWindow: this.windowsState.lastPluginDevelopmentHostWindow, lastActiveWindow: this.lastClosedWindowState @@ -310,7 +276,7 @@ export class WindowsManager implements IWindowsMainService { } // Persist - this.storageService.setItem(WindowsManager.windowsStateStorageKey, currentWindowsState); + this.stateService.setItem(WindowsManager.windowsStateStorageKey, currentWindowsState); } // See note on #onBeforeQuit() for details how these events are flowing @@ -403,12 +369,12 @@ export class WindowsManager implements IWindowsMainService { let workspacesToRestore: IWorkspaceIdentifier[] = []; let emptyToRestore: string[] = []; if (openConfig.initialStartup && !openConfig.cli.extensionDevelopmentPath) { - foldersToRestore = this.backupService.getFolderBackupPaths(); + foldersToRestore = this.backupMainService.getFolderBackupPaths(); - workspacesToRestore = this.backupService.getWorkspaceBackups(); // collect from workspaces with hot-exit backups - workspacesToRestore.push(...this.workspacesService.getUntitledWorkspacesSync()); // collect from previous window session + workspacesToRestore = this.backupMainService.getWorkspaceBackups(); // collect from workspaces with hot-exit backups + workspacesToRestore.push(...this.workspacesMainService.getUntitledWorkspacesSync()); // collect from previous window session - emptyToRestore = this.backupService.getEmptyWindowBackupPaths(); + emptyToRestore = this.backupMainService.getEmptyWindowBackupPaths(); emptyToRestore.push(...pathsToOpen.filter(w => !w.workspace && !w.folderPath && w.backupPath).map(w => basename(w.backupPath))); // add empty windows with backupPath emptyToRestore = arrays.distinct(emptyToRestore); // prevent duplicates } @@ -475,7 +441,9 @@ export class WindowsManager implements IWindowsMainService { } }); - this.historyService.addRecentlyOpened(recentlyOpenedWorkspaces, recentlyOpenedFiles); + if (!this.environmentService.skipAddToRecentlyOpened) { + this.historyMainService.addRecentlyOpened(recentlyOpenedWorkspaces, recentlyOpenedFiles); + } } // If we got started with --wait from the CLI, we need to signal to the outside when the window @@ -541,7 +509,7 @@ export class WindowsManager implements IWindowsMainService { context: openConfig.context, filePath: fileToCheck && fileToCheck.filePath, userHome: this.environmentService.userHome, - workspaceResolver: workspace => this.workspacesService.resolveWorkspaceSync(workspace.configPath) + workspaceResolver: workspace => this.workspacesMainService.resolveWorkspaceSync(workspace.configPath) }); // Special case: we started with --wait and we got back a folder to open. In this case @@ -796,7 +764,7 @@ export class WindowsManager implements IWindowsMainService { if (!openConfig.addMode && isCommandLineOrAPICall) { const foldersToOpen = windowsToOpen.filter(path => !!path.folderPath); if (foldersToOpen.length > 1) { - const workspace = this.workspacesService.createWorkspaceSync(foldersToOpen.map(folder => ({ uri: URI.file(folder.folderPath) }))); + const workspace = this.workspacesMainService.createWorkspaceSync(foldersToOpen.map(folder => ({ uri: URI.file(folder.folderPath) }))); // Add workspace and remove folders thereby windowsToOpen.push({ workspace }); @@ -937,10 +905,6 @@ export class WindowsManager implements IWindowsMainService { const windowConfig = this.configurationService.getValue('window'); restoreWindows = ((windowConfig && windowConfig.restoreWindows) || 'one') as RestoreWindowsSetting; - if (restoreWindows === 'one' /* default */ && windowConfig && windowConfig.reopenFolders) { - restoreWindows = windowConfig.reopenFolders; // TODO@Ben migration from deprecated window.reopenFolders setting - } - if (['all', 'folders', 'one', 'none'].indexOf(restoreWindows) === -1) { restoreWindows = 'one'; } @@ -970,7 +934,7 @@ export class WindowsManager implements IWindowsMainService { // Workspace (unless disabled via flag) if (!options || !options.forceOpenWorkspaceAsFile) { - const workspace = this.workspacesService.resolveWorkspaceSync(candidate); + const workspace = this.workspacesMainService.resolveWorkspaceSync(candidate); if (workspace) { return { workspace: { id: workspace.id, configPath: workspace.configPath } }; } @@ -990,7 +954,7 @@ export class WindowsManager implements IWindowsMainService { }; } } catch (error) { - this.historyService.removeFromRecentlyOpened([candidate]); // since file does not seem to exist anymore, remove from recent + this.historyMainService.removeFromRecentlyOpened([candidate]); // since file does not seem to exist anymore, remove from recent if (options && options.ignoreFileNotFound) { return { filePath: candidate, createFilePath: true }; // assume this is a file that does not yet exist @@ -1065,6 +1029,7 @@ export class WindowsManager implements IWindowsMainService { // Build IWindowConfiguration from config and options const configuration: IWindowConfiguration = mixin({}, options.cli); // inherit all properties from CLI configuration.appRoot = this.environmentService.appRoot; + configuration.machineId = this.machineId; configuration.execPath = process.execPath; configuration.userEnv = assign({}, this.initialUserEnv, options.userEnv || {}); configuration.isInitialStartup = options.initialStartup; @@ -1158,11 +1123,11 @@ export class WindowsManager implements IWindowsMainService { // Register window for backups if (!configuration.extensionDevelopmentPath) { if (configuration.workspace) { - configuration.backupPath = this.backupService.registerWorkspaceBackupSync(configuration.workspace); + configuration.backupPath = this.backupMainService.registerWorkspaceBackupSync(configuration.workspace); } else if (configuration.folderPath) { - configuration.backupPath = this.backupService.registerFolderBackupSync(configuration.folderPath); + configuration.backupPath = this.backupMainService.registerFolderBackupSync(configuration.folderPath); } else { - configuration.backupPath = this.backupService.registerEmptyWindowBackupSync(options.emptyWindowBackupFolder); + configuration.backupPath = this.backupMainService.registerEmptyWindowBackupSync(options.emptyWindowBackupFolder); } } @@ -1332,7 +1297,7 @@ export class WindowsManager implements IWindowsMainService { private doEnterWorkspace(win: CodeWindow, result: IEnterWorkspaceResult): IEnterWorkspaceResult { // Mark as recently opened - this.historyService.addRecentlyOpened([result.workspace], []); + this.historyMainService.addRecentlyOpened([result.workspace], []); // Trigger Eevent to indicate load of workspace into window this._onWindowReady.fire(win); @@ -1352,7 +1317,7 @@ export class WindowsManager implements IWindowsMainService { } const workspace = e.window.openedWorkspace; - if (!workspace || !this.workspacesService.isUntitledWorkspace(workspace)) { + if (!workspace || !this.workspacesMainService.isUntitledWorkspace(workspace)) { return; // only care about untitled workspaces to ask for saving } @@ -1453,48 +1418,48 @@ export class WindowsManager implements IWindowsMainService { // Unresponsive if (error === WindowError.UNRESPONSIVE) { - dialog.showMessageBox(window.win, { + const result = dialog.showMessageBox(window.win, { title: product.nameLong, type: 'warning', buttons: [mnemonicButtonLabel(localize({ key: 'reopen', comment: ['&& denotes a mnemonic'] }, "&&Reopen")), mnemonicButtonLabel(localize({ key: 'wait', comment: ['&& denotes a mnemonic'] }, "&&Keep Waiting")), mnemonicButtonLabel(localize({ key: 'close', comment: ['&& denotes a mnemonic'] }, "&&Close"))], message: localize('appStalled', "The window is no longer responding"), detail: localize('appStalledDetail', "You can reopen or close the window or keep waiting."), noLink: true - }, result => { - if (!window.win) { - return; // Return early if the window has been going down already - } - - if (result === 0) { - window.reload(); - } else if (result === 2) { - this.onBeforeWindowClose(window); // 'close' event will not be fired on destroy(), so run it manually - window.win.destroy(); // make sure to destroy the window as it is unresponsive - } }); + + if (!window.win) { + return; // Return early if the window has been going down already + } + + if (result === 0) { + window.reload(); + } else if (result === 2) { + this.onBeforeWindowClose(window); // 'close' event will not be fired on destroy(), so run it manually + window.win.destroy(); // make sure to destroy the window as it is unresponsive + } } // Crashed else { - dialog.showMessageBox(window.win, { + const result = dialog.showMessageBox(window.win, { title: product.nameLong, type: 'warning', buttons: [mnemonicButtonLabel(localize({ key: 'reopen', comment: ['&& denotes a mnemonic'] }, "&&Reopen")), mnemonicButtonLabel(localize({ key: 'close', comment: ['&& denotes a mnemonic'] }, "&&Close"))], message: localize('appCrashed', "The window has crashed"), detail: localize('appCrashedDetail', "We are sorry for the inconvenience! You can reopen the window to continue where you left off."), noLink: true - }, result => { - if (!window.win) { - return; // Return early if the window has been going down already - } - - if (result === 0) { - window.reload(); - } else if (result === 1) { - this.onBeforeWindowClose(window); // 'close' event will not be fired on destroy(), so run it manually - window.win.destroy(); // make sure to destroy the window as it has crashed - } }); + + if (!window.win) { + return; // Return early if the window has been going down already + } + + if (result === 0) { + window.reload(); + } else if (result === 1) { + this.onBeforeWindowClose(window); // 'close' event will not be fired on destroy(), so run it manually + window.win.destroy(); // make sure to destroy the window as it has crashed + } } } @@ -1587,7 +1552,7 @@ class FileDialog { constructor( private environmentService: IEnvironmentService, private telemetryService: ITelemetryService, - private storageService: IStorageService, + private stateService: IStateService, private windowsMainService: IWindowsMainService ) { } @@ -1628,7 +1593,7 @@ class FileDialog { // Ensure defaultPath if (!options.dialogOptions.defaultPath) { - options.dialogOptions.defaultPath = this.storageService.getItem(FileDialog.workingDirPickerStorageKey); + options.dialogOptions.defaultPath = this.stateService.getItem(FileDialog.workingDirPickerStorageKey); } // Ensure properties @@ -1650,21 +1615,20 @@ class FileDialog { // Show Dialog const focusedWindow = this.windowsMainService.getWindowById(options.windowId) || this.windowsMainService.getFocusedWindow(); - dialog.showOpenDialog(focusedWindow && focusedWindow.win, options.dialogOptions, paths => { - if (paths && paths.length > 0) { - if (isMacintosh) { - paths = paths.map(path => normalizeNFC(path)); // normalize paths returned from the OS - } - - // Remember path in storage for next time - this.storageService.setItem(FileDialog.workingDirPickerStorageKey, dirname(paths[0])); - - // Return - return clb(paths); + let paths = dialog.showOpenDialog(focusedWindow && focusedWindow.win, options.dialogOptions); + if (paths && paths.length > 0) { + if (isMacintosh) { + paths = paths.map(path => normalizeNFC(path)); // normalize paths returned from the OS } - return clb(void (0)); - }); + // Remember path in storage for next time + this.stateService.setItem(FileDialog.workingDirPickerStorageKey, dirname(paths[0])); + + // Return + return clb(paths); + } + + return clb(void (0)); } } diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index bbad96d8893f..fe645ff4e0db 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -3,18 +3,20 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { spawn } from 'child_process'; +import { spawn, ChildProcess } from 'child_process'; import { TPromise } from 'vs/base/common/winjs.base'; import { assign } from 'vs/base/common/objects'; import { parseCLIProcessArgv, buildHelpMessage } from 'vs/platform/environment/node/argv'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import product from 'vs/platform/node/product'; import pkg from 'vs/platform/node/package'; - -import * as fs from 'fs'; import * as paths from 'path'; import * as os from 'os'; +import * as fs from 'fs'; import { whenDeleted } from 'vs/base/node/pfs'; +import { findFreePort } from 'vs/base/node/ports'; +import { resolveTerminalEncoding } from 'vs/base/node/encoding'; +import * as iconv from 'iconv-lite'; function shouldSpawnCliProcess(argv: ParsedArgs): boolean { return !!argv['install-source'] @@ -27,7 +29,7 @@ interface IMainCli { main: (argv: ParsedArgs) => TPromise; } -export function main(argv: string[]): TPromise { +export async function main(argv: string[]): TPromise { let args: ParsedArgs; try { @@ -37,14 +39,24 @@ export function main(argv: string[]): TPromise { return TPromise.as(null); } + // Help if (args.help) { console.log(buildHelpMessage(product.nameLong, product.applicationName, pkg.version)); - } else if (args.version) { + } + + // Version Info + else if (args.version) { console.log(`${pkg.version}\n${product.commit}\n${process.arch}`); - } else if (shouldSpawnCliProcess(args)) { + } + + // Extensions Management + else if (shouldSpawnCliProcess(args)) { const mainCli = new TPromise(c => require(['vs/code/node/cliProcessMain'], c)); return mainCli.then(cli => cli.main(args)); - } else { + } + + // Just Code + else { const env = assign({}, process.env, { // this will signal Code that it was spawned from this module 'VSCODE_CLI': '1', @@ -53,8 +65,62 @@ export function main(argv: string[]): TPromise { delete env['ELECTRON_RUN_AS_NODE']; - if (args.verbose) { + let processCallbacks: ((child: ChildProcess) => Thenable)[] = []; + + const verbose = args.verbose || args.status; + + if (verbose) { env['ELECTRON_ENABLE_LOGGING'] = '1'; + + processCallbacks.push(child => { + child.stdout.on('data', (data: Buffer) => console.log(data.toString('utf8').trim())); + child.stderr.on('data', (data: Buffer) => console.log(data.toString('utf8').trim())); + + return new TPromise(c => child.once('exit', () => c(null))); + }); + } + + // If we are running with input from stdin, pipe that into a file and + // open this file via arguments. Ignore this when we are passed with + // paths to open. + let isReadingFromStdin: boolean; + try { + isReadingFromStdin = args._.length === 0 && !process.stdin.isTTY; // Via https://twitter.com/MylesBorins/status/782009479382626304 + } catch (error) { + // Windows workaround for https://github.com/nodejs/node/issues/11656 + } + + let stdinFilePath: string; + if (isReadingFromStdin) { + let stdinFileError: Error; + stdinFilePath = paths.join(os.tmpdir(), `code-stdin-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 3)}.txt`); + try { + const stdinFileStream = fs.createWriteStream(stdinFilePath); + resolveTerminalEncoding(verbose).done(encoding => { + + // Pipe into tmp file using terminals encoding + const converterStream = iconv.decodeStream(encoding); + process.stdin.pipe(converterStream).pipe(stdinFileStream); + }); + + // Make sure to open tmp file + argv.push(stdinFilePath); + + // Enable --wait to get all data and ignore adding this to history + argv.push('--wait'); + argv.push('--skip-add-to-recently-opened'); + args.wait = true; + } catch (error) { + stdinFileError = error; + } + + if (verbose) { + if (stdinFileError) { + console.error(`Failed to create file to read via stdin: ${stdinFileError.toString()}`); + } else { + console.log(`Reading from stdin via: ${stdinFilePath}`); + } + } } // If we are started with --wait create a random temporary file @@ -73,7 +139,7 @@ export function main(argv: string[]): TPromise { waitMarkerError = error; } - if (args.verbose) { + if (verbose) { if (waitMarkerError) { console.error(`Failed to create marker file for --wait: ${waitMarkerError.toString()}`); } else { @@ -82,26 +148,76 @@ export function main(argv: string[]): TPromise { } } + // If we have been started with `--prof-startup` we need to find free ports to profile + // the main process, the renderer, and the extension host. We also disable v8 cached data + // to get better profile traces. Last, we listen on stdout for a signal that tells us to + // stop profiling. + if (args['prof-startup']) { + const portMain = await findFreePort(9222, 10, 6000); + const portRenderer = await findFreePort(portMain + 1, 10, 6000); + const portExthost = await findFreePort(portRenderer + 1, 10, 6000); + + if (!portMain || !portRenderer || !portExthost) { + console.error('Failed to find free ports for profiler to connect to do.'); + return; + } + + const filenamePrefix = paths.join(os.homedir(), Math.random().toString(16).slice(-4)); + + argv.push(`--inspect-brk=${portMain}`); + argv.push(`--remote-debugging-port=${portRenderer}`); + argv.push(`--inspect-brk-extensions=${portExthost}`); + argv.push(`--prof-startup-prefix`, filenamePrefix); + argv.push(`--no-cached-data`); + + fs.writeFileSync(filenamePrefix, argv.slice(-6).join('|')); + + processCallbacks.push(async child => { + + // load and start profiler + const profiler = await import('v8-inspect-profiler'); + const main = await profiler.startProfiling({ port: portMain }); + const renderer = await profiler.startProfiling({ port: portRenderer, tries: 200 }); + const extHost = await profiler.startProfiling({ port: portExthost, tries: 300 }); + + // wait for the renderer to delete the + // marker file + whenDeleted(filenamePrefix); + + let profileMain = await main.stop(); + let profileRenderer = await renderer.stop(); + let profileExtHost = await extHost.stop(); + let suffix = ''; + + if (!process.env['VSCODE_DEV']) { + // when running from a not-development-build we remove + // absolute filenames because we don't want to reveal anything + // about users. We also append the `.txt` suffix to make it + // easier to attach these files to GH issues + profileMain = profiler.rewriteAbsolutePaths(profileMain, 'piiRemoved'); + profileRenderer = profiler.rewriteAbsolutePaths(profileRenderer, 'piiRemoved'); + profileExtHost = profiler.rewriteAbsolutePaths(profileExtHost, 'piiRemoved'); + suffix = '.txt'; + } + + // finally stop profiling and save profiles to disk + await profiler.writeProfile(profileMain, `${filenamePrefix}-main.cpuprofile${suffix}`); + await profiler.writeProfile(profileRenderer, `${filenamePrefix}-renderer.cpuprofile${suffix}`); + await profiler.writeProfile(profileExtHost, `${filenamePrefix}-exthost.cpuprofile${suffix}`); + }); + } + const options = { detached: true, env }; - if (!args.verbose) { + if (!verbose) { options['stdio'] = 'ignore'; } const child = spawn(process.execPath, argv.slice(2), options); - if (args.verbose) { - child.stdout.on('data', (data: Buffer) => console.log(data.toString('utf8').trim())); - child.stderr.on('data', (data: Buffer) => console.log(data.toString('utf8').trim())); - } - - if (args.verbose) { - return new TPromise(c => child.once('exit', () => c(null))); - } - if (args.wait && waitMarkerFilePath) { return new TPromise(c => { @@ -110,8 +226,16 @@ export function main(argv: string[]): TPromise { // Complete when wait marker file is deleted whenDeleted(waitMarkerFilePath).done(c, c); + }).then(() => { + + // Make sure to delete the tmp stdin file if we have any + if (stdinFilePath) { + fs.unlinkSync(stdinFilePath); + } }); } + + return TPromise.join(processCallbacks.map(callback => callback(child))); } return TPromise.as(null); diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 288dba2a9afd..dfdaf922741a 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -7,7 +7,6 @@ import { localize } from 'vs/nls'; import product from 'vs/platform/node/product'; import pkg from 'vs/platform/node/package'; import * as path from 'path'; -import * as fs from 'fs'; import { TPromise } from 'vs/base/common/winjs.base'; import { sequence } from 'vs/base/common/async'; @@ -17,7 +16,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; -import { EnvironmentService, getInstallSourcePath } from 'vs/platform/environment/node/environmentService'; +import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionManifest, IGalleryExtension, LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionManagementService, validateLocalExtension } from 'vs/platform/extensionManagement/node/extensionManagementService'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; @@ -30,10 +29,15 @@ import { RequestService } from 'vs/platform/request/node/requestService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationService } from 'vs/platform/configuration/node/configurationService'; import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; -import { mkdirp } from 'vs/base/node/pfs'; +import { mkdirp, writeFile } from 'vs/base/node/pfs'; import { IChoiceService } from 'vs/platform/message/common/message'; import { ChoiceCliService } from 'vs/platform/message/node/messageCli'; import { getBaseLabel } from 'vs/base/common/labels'; +import { IStateService } from 'vs/platform/state/common/state'; +import { StateService } from 'vs/platform/state/node/stateService'; +import { createLogService } from 'vs/platform/log/node/spdlogService'; +import { ILogService } from 'vs/platform/log/common/log'; +import { isPromiseCanceledError } from 'vs/base/common/errors'; const notFound = (id: string) => localize('notFound', "Extension '{0}' not found.", id); const notInstalled = (id: string) => localize('notInstalled', "Extension '{0}' is not installed.", id); @@ -77,10 +81,7 @@ class Main { } private setInstallSource(installSource: string): TPromise { - return new TPromise((c, e) => { - const path = getInstallSourcePath(this.environmentService.userDataPath); - fs.writeFile(path, installSource.slice(0, 30), 'utf8', err => err ? e(err) : c(null)); - }); + return writeFile(this.environmentService.installSourcePath, installSource.slice(0, 30)); } private listExtensions(showVersions: boolean): TPromise { @@ -97,6 +98,13 @@ class Main { return this.extensionManagementService.install(extension).then(() => { console.log(localize('successVsixInstall', "Extension '{0}' was successfully installed!", getBaseLabel(extension))); + }, error => { + if (isPromiseCanceledError(error)) { + console.log(localize('cancelVsixInstall', "Cancelled installing Extension '{0}'.", getBaseLabel(extension))); + return null; + } else { + return TPromise.wrapError(error); + } }); }); @@ -135,7 +143,16 @@ class Main { console.log(localize('installing', "Installing...")); return this.extensionManagementService.installFromGallery(extension) - .then(() => console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.version))); + .then( + () => console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.version)), + error => { + if (isPromiseCanceledError(error)) { + console.log(localize('cancelVsixInstall', "Cancelled installing Extension '{0}'.", id)); + return null; + } else { + return TPromise.wrapError(error); + } + }); }); }); }); @@ -177,15 +194,25 @@ const eventPrefix = 'monacoworkbench'; export function main(argv: ParsedArgs): TPromise { const services = new ServiceCollection(); - services.set(IEnvironmentService, new SyncDescriptor(EnvironmentService, argv, process.execPath)); + + const environmentService = new EnvironmentService(argv, process.execPath); + const logService = createLogService('cli', environmentService); + process.once('exit', () => logService.dispose()); + + logService.info('main', argv); + + services.set(IEnvironmentService, environmentService); + services.set(ILogService, logService); + services.set(IStateService, new SyncDescriptor(StateService)); const instantiationService: IInstantiationService = new InstantiationService(services); return instantiationService.invokeFunction(accessor => { const envService = accessor.get(IEnvironmentService); + const stateService = accessor.get(IStateService); return TPromise.join([envService.appSettingsHome, envService.extensionsPath].map(p => mkdirp(p))).then(() => { - const { appRoot, extensionsPath, extensionDevelopmentPath, isBuilt, installSource } = envService; + const { appRoot, extensionsPath, extensionDevelopmentPath, isBuilt, installSourcePath } = envService; const services = new ServiceCollection(); services.set(IConfigurationService, new SyncDescriptor(ConfigurationService)); @@ -207,7 +234,7 @@ export function main(argv: ParsedArgs): TPromise { const config: ITelemetryServiceConfig = { appender: combinedAppender(...appenders), - commonProperties: resolveCommonProperties(product.commit, pkg.version, installSource), + commonProperties: resolveCommonProperties(product.commit, pkg.version, stateService.getItem('telemetry.machineId'), installSourcePath), piiPaths: [appRoot, extensionsPath] }; diff --git a/src/vs/editor/browser/controller/coreCommands.ts b/src/vs/editor/browser/controller/coreCommands.ts index 4d00a70ec195..313479b1766a 100644 --- a/src/vs/editor/browser/controller/coreCommands.ts +++ b/src/vs/editor/browser/controller/coreCommands.ts @@ -32,7 +32,12 @@ const CORE_WEIGHT = KeybindingsRegistry.WEIGHT.editorCore(); export abstract class CoreEditorCommand extends EditorCommand { public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { - this.runCoreEditorCommand(editor._getCursors(), args || {}); + const cursors = editor._getCursors(); + if (!cursors) { + // the editor has no view => has no cursors + return; + } + this.runCoreEditorCommand(cursors, args || {}); } public abstract runCoreEditorCommand(cursors: ICursors, args: any): void; diff --git a/src/vs/editor/browser/controller/pointerHandler.ts b/src/vs/editor/browser/controller/pointerHandler.ts index 2c7548ff84bd..d8a44df68373 100644 --- a/src/vs/editor/browser/controller/pointerHandler.ts +++ b/src/vs/editor/browser/controller/pointerHandler.ts @@ -188,12 +188,10 @@ class StandardPointerHandler extends MouseHandler implements IDisposable { class TouchHandler extends MouseHandler { - private gesture: Gesture; - constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper) { super(context, viewController, viewHelper); - this.gesture = new Gesture(this.viewHelper.linesContentDomNode); + Gesture.addTarget(this.viewHelper.linesContentDomNode); this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e))); this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Change, (e) => this.onChange(e))); @@ -202,7 +200,6 @@ class TouchHandler extends MouseHandler { } public dispose(): void { - this.gesture.dispose(); super.dispose(); } diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 1a5b52198702..5dfe1c8c4c5a 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -35,7 +35,7 @@ export class CodeEditorServiceImpl extends AbstractCodeEditorService { styleSheet: this._styleSheet, key: key, parentTypeKey: parentTypeKey, - options: options + options: options || Object.create(null) }; if (!parentTypeKey) { provider = new DecorationTypeOptionsProvider(this._themeService, providerArgs); diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index d1f2e969b296..34eb4d6e194e 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -31,6 +31,7 @@ import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/com import { editorErrorForeground, editorErrorBorder, editorWarningForeground, editorWarningBorder, editorInfoBorder, editorInfoForeground } from 'vs/editor/common/view/editorColorRegistry'; import { Color } from 'vs/base/common/color'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { ClassName } from 'vs/editor/common/model/intervalTree'; export abstract class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor { @@ -477,28 +478,28 @@ function getSquigglySVGData(color: Color) { registerThemingParticipant((theme, collector) => { let errorBorderColor = theme.getColor(editorErrorBorder); if (errorBorderColor) { - collector.addRule(`.monaco-editor .squiggly-c-error { border-bottom: 4px double ${errorBorderColor}; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorErrorDecoration} { border-bottom: 4px double ${errorBorderColor}; }`); } let errorForeground = theme.getColor(editorErrorForeground); if (errorForeground) { - collector.addRule(`.monaco-editor .squiggly-c-error { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(errorForeground)}") repeat-x bottom left; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorErrorDecoration} { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(errorForeground)}") repeat-x bottom left; }`); } let warningBorderColor = theme.getColor(editorWarningBorder); if (warningBorderColor) { - collector.addRule(`.monaco-editor .squiggly-b-warning { border-bottom: 4px double ${warningBorderColor}; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorWarningDecoration} { border-bottom: 4px double ${warningBorderColor}; }`); } let warningForeground = theme.getColor(editorWarningForeground); if (warningForeground) { - collector.addRule(`.monaco-editor .squiggly-b-warning { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(warningForeground)}") repeat-x bottom left; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorWarningDecoration} { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(warningForeground)}") repeat-x bottom left; }`); } let infoBorderColor = theme.getColor(editorInfoBorder); - if (warningBorderColor) { - collector.addRule(`.monaco-editor .squiggly-c-info { border-bottom: 4px double ${infoBorderColor}; }`); + if (infoBorderColor) { + collector.addRule(`.monaco-editor .${ClassName.EditorInfoDecoration} { border-bottom: 4px double ${infoBorderColor}; }`); } let infoForeground = theme.getColor(editorInfoForeground); - if (warningForeground) { - collector.addRule(`.monaco-editor .squiggly-c-info { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(infoForeground)}") repeat-x bottom left; }`); + if (infoForeground) { + collector.addRule(`.monaco-editor .${ClassName.EditorInfoDecoration} { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(infoForeground)}") repeat-x bottom left; }`); } }); diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 8593c6e46775..0eef59e694f5 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -290,6 +290,11 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_DEFAULTS.contribInfo.find.autoFindInSelection, 'description': nls.localize('find.autoFindInSelection', "Controls if Find in Selection flag is turned on when multiple characters or lines of text are selected in the editor") }, + 'editor.find.globalFindClipboard': { + 'type': 'boolean', + 'default': EDITOR_DEFAULTS.contribInfo.find.globalFindClipboard, + 'description': nls.localize('find.globalFindClipboard', "Controls if the Find Widget should read or modify the shared find clipboard on macOS") + }, 'editor.wordWrap': { 'type': 'string', 'enum': ['off', 'on', 'wordWrapColumn', 'bounded'], @@ -609,6 +614,12 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_DEFAULTS.contribInfo.lightbulbEnabled, 'description': nls.localize('codeActions', "Enables the code action lightbulb") }, + 'editor.selectionClipboard': { + 'type': 'boolean', + 'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard, + 'description': nls.localize('selectionClipboard', "Controls if the Linux primary clipboard should be supported."), + 'included': platform.isLinux + }, 'diffEditor.renderSideBySide': { 'type': 'boolean', 'default': true, @@ -627,12 +638,4 @@ const editorConfiguration: IConfigurationNode = { } }; -if (platform.isLinux) { - editorConfiguration['properties']['editor.selectionClipboard'] = { - 'type': 'boolean', - 'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard, - 'description': nls.localize('selectionClipboard', "Controls if the Linux primary clipboard should be supported.") - }; -} - configurationRegistry.registerConfiguration(editorConfiguration); diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index b5f0638c1896..0b49b501f246 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -86,6 +86,11 @@ export interface IEditorFindOptions { * Controls if Find in Selection flag is turned on when multiple lines of text are selected in the editor. */ autoFindInSelection: boolean; + /** + * @internal + * Controls if the Find Widget should read or modify the shared find clipboard on macOS + */ + globalFindClipboard: boolean; } /** @@ -739,6 +744,10 @@ export interface InternalEditorMinimapOptions { export interface InternalEditorFindOptions { readonly seedSearchStringFromSelection: boolean; readonly autoFindInSelection: boolean; + /** + * @internal + */ + readonly globalFindClipboard: boolean; } export interface EditorWrappingInfo { @@ -1112,6 +1121,7 @@ export class InternalEditorOptions { return ( a.seedSearchStringFromSelection === b.seedSearchStringFromSelection && a.autoFindInSelection === b.autoFindInSelection + && a.globalFindClipboard === b.globalFindClipboard ); } @@ -1550,7 +1560,8 @@ export class EditorOptionsValidator { return { seedSearchStringFromSelection: _boolean(opts.seedSearchStringFromSelection, defaults.seedSearchStringFromSelection), - autoFindInSelection: _boolean(opts.autoFindInSelection, defaults.autoFindInSelection) + autoFindInSelection: _boolean(opts.autoFindInSelection, defaults.autoFindInSelection), + globalFindClipboard: _boolean(opts.globalFindClipboard, defaults.globalFindClipboard) }; } @@ -2219,7 +2230,8 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { matchBrackets: true, find: { seedSearchStringFromSelection: true, - autoFindInSelection: false + autoFindInSelection: false, + globalFindClipboard: true }, colorDecorators: true, lightbulbEnabled: true diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 5e31a05368d9..65743dc72536 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -82,7 +82,9 @@ export class CursorConfiguration { public readonly autoClosingPairsOpen: CharacterMap; public readonly autoClosingPairsClose: CharacterMap; public readonly surroundingPairs: CharacterMap; - public readonly electricChars: { [key: string]: boolean; }; + + private readonly _languageIdentifier: LanguageIdentifier; + private _electricChars: { [key: string]: boolean; }; public static shouldRecreate(e: IConfigurationChangedEvent): boolean { return ( @@ -102,6 +104,8 @@ export class CursorConfiguration { modelOptions: TextModelResolvedOptions, configuration: IConfiguration ) { + this._languageIdentifier = languageIdentifier; + let c = configuration.editor; this.readOnly = c.readOnly; @@ -119,14 +123,7 @@ export class CursorConfiguration { this.autoClosingPairsOpen = {}; this.autoClosingPairsClose = {}; this.surroundingPairs = {}; - this.electricChars = {}; - - let electricChars = CursorConfiguration._getElectricCharacters(languageIdentifier); - if (electricChars) { - for (let i = 0; i < electricChars.length; i++) { - this.electricChars[electricChars[i]] = true; - } - } + this._electricChars = null; let autoClosingPairs = CursorConfiguration._getAutoClosingPairs(languageIdentifier); if (autoClosingPairs) { @@ -144,6 +141,19 @@ export class CursorConfiguration { } } + public get electricChars() { + if (!this._electricChars) { + this._electricChars = {}; + let electricChars = CursorConfiguration._getElectricCharacters(this._languageIdentifier); + if (electricChars) { + for (let i = 0; i < electricChars.length; i++) { + this._electricChars[electricChars[i]] = true; + } + } + } + return this._electricChars; + } + public normalizeIndentation(str: string): string { return TextModel.normalizeIndentation(str, this.tabSize, this.insertSpaces); } diff --git a/src/vs/editor/common/core/lineTokens.ts b/src/vs/editor/common/core/lineTokens.ts index 16c70ef52153..c4c5eda5e372 100644 --- a/src/vs/editor/common/core/lineTokens.ts +++ b/src/vs/editor/common/core/lineTokens.ts @@ -12,61 +12,72 @@ export class LineToken { _lineTokenBrand: void; private readonly _source: LineTokens; - private readonly _tokenIndex: number; - private readonly _metadata: number; + private readonly _tokenCount: number; - public readonly startOffset: number; - public readonly endOffset: number; - - public readonly hasPrev: boolean; - public readonly hasNext: boolean; + private _tokenIndex: number; + private _metadata: number; + private _startOffset: number; + private _endOffset: number; + public get startOffset(): number { + return this._startOffset; + } + public get endOffset(): number { + return this._endOffset; + } + public get hasPrev(): boolean { + return (this._tokenIndex > 0); + } + public get hasNext(): boolean { + return (this._tokenIndex + 1 < this._tokenCount); + } public get languageId(): LanguageId { return TokenMetadata.getLanguageId(this._metadata); } - public get tokenType(): StandardTokenType { return TokenMetadata.getTokenType(this._metadata); } - public get fontStyle(): FontStyle { return TokenMetadata.getFontStyle(this._metadata); } - public get foregroundId(): ColorId { return TokenMetadata.getForeground(this._metadata); } - public get backgroundId(): ColorId { return TokenMetadata.getBackground(this._metadata); } constructor(source: LineTokens, tokenIndex: number, tokenCount: number, startOffset: number, endOffset: number, metadata: number) { this._source = source; + this._tokenCount = tokenCount; + this._set(tokenIndex, startOffset, endOffset, metadata); + } + + public clone(): LineToken { + return new LineToken(this._source, this._tokenIndex, this._tokenCount, this._startOffset, this._endOffset, this._metadata); + } + + _set(tokenIndex: number, startOffset: number, endOffset: number, metadata: number): void { this._tokenIndex = tokenIndex; this._metadata = metadata; - - this.startOffset = startOffset; - this.endOffset = endOffset; - - this.hasPrev = (this._tokenIndex > 0); - this.hasNext = (this._tokenIndex + 1 < tokenCount); + this._startOffset = startOffset; + this._endOffset = endOffset; } public prev(): LineToken { if (!this.hasPrev) { return null; } - - return this._source.tokenAt(this._tokenIndex - 1); + this._source.tokenAt(this._tokenIndex - 1, this); + return this; } public next(): LineToken { if (!this.hasNext) { return null; } - - return this._source.tokenAt(this._tokenIndex + 1); + this._source.tokenAt(this._tokenIndex + 1, this); + return this; } } @@ -134,7 +145,7 @@ export class LineTokens { return this.tokenAt(tokenIndex); } - public tokenAt(tokenIndex: number): LineToken { + public tokenAt(tokenIndex: number, dest?: LineToken): LineToken { let startOffset = this._tokens[(tokenIndex << 1)]; let endOffset: number; if (tokenIndex + 1 < this._tokensCount) { @@ -143,6 +154,11 @@ export class LineTokens { endOffset = this._textLength; } let metadata = this._tokens[(tokenIndex << 1) + 1]; + + if (dest) { + dest._set(tokenIndex, startOffset, endOffset, metadata); + return dest; + } return new LineToken(this, tokenIndex, this._tokensCount, startOffset, endOffset, metadata); } diff --git a/src/vs/editor/common/model/textModelWithTokens.ts b/src/vs/editor/common/model/textModelWithTokens.ts index 4e1404c0fa5c..00985a045649 100644 --- a/src/vs/editor/common/model/textModelWithTokens.ts +++ b/src/vs/editor/common/model/textModelWithTokens.ts @@ -417,10 +417,10 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke public getWordAtPosition(_position: IPosition): editorCommon.IWordAtPosition { this._assertNotDisposed(); - let position = this.validatePosition(_position); - let lineContent = this.getLineContent(position.lineNumber); + const position = this.validatePosition(_position); + const lineContent = this.getLineContent(position.lineNumber); - if (this._invalidLineStartIndex <= position.lineNumber) { + if (this._invalidLineStartIndex <= position.lineNumber - 1) { // this line is not tokenized return getWordAtText( position.column, @@ -430,30 +430,29 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke ); } - let lineTokens = this._getLineTokens(position.lineNumber); - let offset = position.column - 1; - let token = lineTokens.findTokenAtOffset(offset); + const lineTokens = this._getLineTokens(position.lineNumber); + const offset = position.column - 1; + const token = lineTokens.findTokenAtOffset(offset); + const languageId = token.languageId; - let result = getWordAtText( - position.column, - LanguageConfigurationRegistry.getWordDefinition(token.languageId), - lineContent.substring(token.startOffset, token.endOffset), - token.startOffset - ); - - if (!result && token.hasPrev && token.startOffset === offset) { - // The position is right at the beginning of `modeIndex`, so try looking at `modeIndex` - 1 too - - let prevToken = token.prev(); - result = getWordAtText( - position.column, - LanguageConfigurationRegistry.getWordDefinition(prevToken.languageId), - lineContent.substring(prevToken.startOffset, prevToken.endOffset), - prevToken.startOffset - ); + // go left until a different language is hit + let startOffset: number; + for (let leftToken = token.clone(); leftToken !== null && leftToken.languageId === languageId; leftToken = leftToken.prev()) { + startOffset = leftToken.startOffset; } - return result; + // go right until a different language is hit + let endOffset: number; + for (let rightToken = token.clone(); rightToken !== null && rightToken.languageId === languageId; rightToken = rightToken.next()) { + endOffset = rightToken.endOffset; + } + + return getWordAtText( + position.column, + LanguageConfigurationRegistry.getWordDefinition(languageId), + lineContent.substring(startOffset, endOffset), + startOffset + ); } public getWordUntilPosition(position: IPosition): editorCommon.IWordAtPosition { @@ -502,7 +501,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke let lineTokens = this._getLineTokens(lineNumber); const lineText = this._lines[lineNumber - 1].text; - const currentToken = lineTokens.findTokenAtOffset(position.column - 1); + let currentToken = lineTokens.findTokenAtOffset(position.column - 1); if (!currentToken) { return null; } @@ -556,14 +555,14 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke // If position is in between two tokens, try also looking in the previous token if (currentToken.hasPrev && currentToken.startOffset === position.column - 1) { - const prevToken = currentToken.prev(); - const prevModeBrackets = LanguageConfigurationRegistry.getBracketsSupport(prevToken.languageId); + const searchEndOffset = currentToken.startOffset; + currentToken = currentToken.prev(); + const prevModeBrackets = LanguageConfigurationRegistry.getBracketsSupport(currentToken.languageId); // check that previous token is not to be ignored - if (prevModeBrackets && !ignoreBracketsInToken(prevToken.tokenType)) { + if (prevModeBrackets && !ignoreBracketsInToken(currentToken.tokenType)) { // limit search in case previous token is very large, there's no need to go beyond `maxBracketLength` - const searchStartOffset = Math.max(prevToken.startOffset, position.column - 1 - prevModeBrackets.maxBracketLength); - const searchEndOffset = currentToken.startOffset; + const searchStartOffset = Math.max(currentToken.startOffset, position.column - 1 - prevModeBrackets.maxBracketLength); const foundBracket = BracketsUtils.findPrevBracketInToken(prevModeBrackets.reversedRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); // check that we didn't hit a bracket too far away from position diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 1d0de01715ad..2fc0420eef8e 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -292,7 +292,7 @@ export interface CodeActionProvider { /** * Provide commands for the given document and range. */ - provideCodeActions(model: editorCommon.IReadOnlyModel, range: Range, token: CancellationToken): (CodeAction | Command)[] | Thenable<(Command | CodeAction)[]>; + provideCodeActions(model: editorCommon.IReadOnlyModel, range: Range, token: CancellationToken): CodeAction[] | Thenable; } /** diff --git a/src/vs/editor/common/modes/languageConfigurationRegistry.ts b/src/vs/editor/common/modes/languageConfigurationRegistry.ts index af92f8219b47..4d15e0f504b4 100644 --- a/src/vs/editor/common/modes/languageConfigurationRegistry.ts +++ b/src/vs/editor/common/modes/languageConfigurationRegistry.ts @@ -18,7 +18,7 @@ import { DEFAULT_WORD_REGEXP, ensureValidWordDefinition } from 'vs/editor/common import { createScopedLineTokens } from 'vs/editor/common/modes/supports'; import { LineTokens } from 'vs/editor/common/core/lineTokens'; import { Range } from 'vs/editor/common/core/range'; -import { IndentAction, EnterAction, IAutoClosingPair, LanguageConfiguration, IndentationRule, FoldingRules } from 'vs/editor/common/modes/languageConfiguration'; +import { IndentAction, EnterAction, IAutoClosingPair, LanguageConfiguration, IndentationRule, FoldingRules, IAutoClosingPairConditional } from 'vs/editor/common/modes/languageConfiguration'; import { LanguageIdentifier, LanguageId } from 'vs/editor/common/modes'; /** @@ -46,18 +46,23 @@ export interface IIndentConverter { export class RichEditSupport { private readonly _conf: LanguageConfiguration; + private readonly _languageIdentifier: LanguageIdentifier; + private _brackets: RichEditBrackets; + private _electricCharacter: BracketElectricCharacterSupport; - public readonly electricCharacter: BracketElectricCharacterSupport; public readonly comments: ICommentsConfiguration; public readonly characterPair: CharacterPairSupport; public readonly wordDefinition: RegExp; public readonly onEnter: OnEnterSupport; public readonly indentRulesSupport: IndentRulesSupport; - public readonly brackets: RichEditBrackets; public readonly indentationRules: IndentationRule; public readonly foldingRules: FoldingRules; constructor(languageIdentifier: LanguageIdentifier, previous: RichEditSupport, rawConf: LanguageConfiguration) { + this._languageIdentifier = languageIdentifier; + + this._brackets = null; + this._electricCharacter = null; let prev: LanguageConfiguration = null; if (previous) { @@ -66,16 +71,11 @@ export class RichEditSupport { this._conf = RichEditSupport._mergeConf(prev, rawConf); - if (this._conf.brackets) { - this.brackets = new RichEditBrackets(languageIdentifier, this._conf.brackets); - } - this.onEnter = RichEditSupport._handleOnEnter(this._conf); this.comments = RichEditSupport._handleComments(this._conf); this.characterPair = new CharacterPairSupport(this._conf); - this.electricCharacter = new BracketElectricCharacterSupport(this.brackets, this.characterPair.getAutoClosingPairs(), this._conf.__electricCharacterSupport); this.wordDefinition = this._conf.wordPattern || DEFAULT_WORD_REGEXP; @@ -87,6 +87,29 @@ export class RichEditSupport { this.foldingRules = this._conf.folding || {}; } + public get brackets(): RichEditBrackets { + if (!this._brackets && this._conf.brackets) { + this._brackets = new RichEditBrackets(this._languageIdentifier, this._conf.brackets); + } + return this._brackets; + } + + public get electricCharacter(): BracketElectricCharacterSupport { + if (!this._electricCharacter) { + let autoClosingPairs: IAutoClosingPairConditional[] = []; + if (this._conf.autoClosingPairs) { + autoClosingPairs = this._conf.autoClosingPairs; + } else if (this._conf.brackets) { + autoClosingPairs = this._conf.brackets.map(b => { + return { open: b[0], close: b[1] }; + }); + } + + this._electricCharacter = new BracketElectricCharacterSupport(this.brackets, autoClosingPairs, this._conf.__electricCharacterSupport); + } + return this._electricCharacter; + } + private static _mergeConf(prev: LanguageConfiguration, current: LanguageConfiguration): LanguageConfiguration { return { comments: (prev ? current.comments || prev.comments : current.comments), diff --git a/src/vs/editor/common/viewLayout/viewLineRenderer.ts b/src/vs/editor/common/viewLayout/viewLineRenderer.ts index cd1cc17d451a..8f1696f969b2 100644 --- a/src/vs/editor/common/viewLayout/viewLineRenderer.ts +++ b/src/vs/editor/common/viewLayout/viewLineRenderer.ts @@ -569,8 +569,14 @@ function _applyInlineDecorations(lineContent: string, len: number, tokens: LineP } } - if (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset === tokens[tokens.length - 1].endIndex) { - result[resultLen++] = new LinePart(lastResultEndIndex, lineDecorations[lineDecorationIndex].className); + const lastTokenEndIndex = tokens[tokens.length - 1].endIndex; + if (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset === lastTokenEndIndex) { + let classNames: string[] = []; + while (lineDecorationIndex < lineDecorationsLen && lineDecorations[lineDecorationIndex].startOffset === lastTokenEndIndex) { + classNames.push(lineDecorations[lineDecorationIndex].className); + lineDecorationIndex++; + } + result[resultLen++] = new LinePart(lastResultEndIndex, classNames.join(' ')); } return result; diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/codelensController.ts index e38293a1d124..45fc1d5d584e 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/codelensController.ts @@ -129,12 +129,18 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { this._localToDispose.push(this._editor.onDidChangeModelContent((e) => { this._editor.changeDecorations((changeAccessor) => { this._editor.changeViewZones((viewAccessor) => { - const toDispose: CodeLens[] = []; + let toDispose: CodeLens[] = []; + let lastLensLineNumber: number = -1; + this._lenses.forEach((lens) => { - if (lens.isValid()) { - lens.update(viewAccessor); - } else { + if (!lens.isValid() || lastLensLineNumber === lens.getLineNumber()) { + // invalid -> lens collapsed, attach range doesn't exist anymore + // line_number -> lenses should never be on the same line toDispose.push(lens); + + } else { + lens.update(viewAccessor); + lastLensLineNumber = lens.getLineNumber(); } }); diff --git a/src/vs/editor/contrib/dnd/dnd.ts b/src/vs/editor/contrib/dnd/dnd.ts index 19189da8f19b..dcbc3023c764 100644 --- a/src/vs/editor/contrib/dnd/dnd.ts +++ b/src/vs/editor/contrib/dnd/dnd.ts @@ -129,14 +129,20 @@ export class DragAndDropController implements editorCommon.IEditorContribution { let newCursorPosition = new Position(mouseEvent.target.position.lineNumber, mouseEvent.target.position.column); if (this._dragSelection === null) { - let newSelections = this._editor.getSelections().map(selection => { - if (selection.containsPosition(newCursorPosition)) { - return new Selection(newCursorPosition.lineNumber, newCursorPosition.column, newCursorPosition.lineNumber, newCursorPosition.column); - } else { - return selection; - } - }); - this._editor.setSelections(newSelections); + if (mouseEvent.event.shiftKey) { + let primarySelection = this._editor.getSelection(); + let { startLineNumber, startColumn } = primarySelection; + this._editor.setSelections([new Selection(startLineNumber, startColumn, newCursorPosition.lineNumber, newCursorPosition.column)]); + } else { + let newSelections = this._editor.getSelections().map(selection => { + if (selection.containsPosition(newCursorPosition)) { + return new Selection(newCursorPosition.lineNumber, newCursorPosition.column, newCursorPosition.lineNumber, newCursorPosition.column); + } else { + return selection; + } + }); + this._editor.setSelections(newSelections); + } } else if (!this._dragSelection.containsPosition(newCursorPosition) || ( ( diff --git a/src/vs/editor/contrib/find/findController.ts b/src/vs/editor/contrib/find/findController.ts index 1b6a27ea6f01..aea6fb8abbcd 100644 --- a/src/vs/editor/contrib/find/findController.ts +++ b/src/vs/editor/contrib/find/findController.ts @@ -17,6 +17,7 @@ import { FindReplaceState, FindReplaceStateChangedEvent, INewFindReplaceState } import { Delayer } from 'vs/base/common/async'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -24,6 +25,7 @@ import { FindWidget, IFindController } from 'vs/editor/contrib/find/findWidget'; import { FindOptionsWidget } from 'vs/editor/contrib/find/findOptionsWidget'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { optional } from 'vs/platform/instantiation/common/instantiation'; export function getSelectionSearchString(editor: ICodeEditor): string { let selection = editor.getSelection(); @@ -52,6 +54,7 @@ export const enum FindStartFocusAction { export interface IFindStartOptions { forceRevealReplace: boolean; seedSearchStringFromSelection: boolean; + seedSearchStringFromGlobalClipboard: boolean; shouldFocus: FindStartFocusAction; shouldAnimate: boolean; } @@ -67,16 +70,23 @@ export class CommonFindController extends Disposable implements editorCommon.IEd protected _updateHistoryDelayer: Delayer; private _model: FindModelBoundToEditorModel; private _storageService: IStorageService; + private _clipboardService: IClipboardService; public static get(editor: ICodeEditor): CommonFindController { return editor.getContribution(CommonFindController.ID); } - constructor(editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService, @IStorageService storageService: IStorageService) { + constructor( + editor: ICodeEditor, + @IContextKeyService contextKeyService: IContextKeyService, + @IStorageService storageService: IStorageService, + @IClipboardService clipboardService: IClipboardService + ) { super(); this._editor = editor; this._findWidgetVisible = CONTEXT_FIND_WIDGET_VISIBLE.bindTo(contextKeyService); this._storageService = storageService; + this._clipboardService = clipboardService; this._updateHistoryDelayer = new Delayer(500); this._currentHistoryNavigator = new HistoryNavigator(); @@ -102,6 +112,7 @@ export class CommonFindController extends Disposable implements editorCommon.IEd this._start({ forceRevealReplace: false, seedSearchStringFromSelection: false && this._editor.getConfiguration().contribInfo.find.seedSearchStringFromSelection, + seedSearchStringFromGlobalClipboard: false, shouldFocus: FindStartFocusAction.NoFocusChange, shouldAnimate: false, }); @@ -139,17 +150,20 @@ export class CommonFindController extends Disposable implements editorCommon.IEd this.disposeModel(); } } + if (e.searchString) { + this.setGlobalBufferTerm(this._state.searchString); + } } private saveQueryState(e: FindReplaceStateChangedEvent) { - if (e.isRegex && typeof this._state.isRegex !== 'undefined') { - this._storageService.store('editor.isRegex', this._state.isRegex, StorageScope.WORKSPACE); + if (e.isRegex) { + this._storageService.store('editor.isRegex', this._state.actualIsRegex, StorageScope.WORKSPACE); } - if (e.wholeWord && typeof this._state.wholeWord !== 'undefined') { - this._storageService.store('editor.wholeWord', this._state.wholeWord, StorageScope.WORKSPACE); + if (e.wholeWord) { + this._storageService.store('editor.wholeWord', this._state.actualWholeWord, StorageScope.WORKSPACE); } - if (e.matchCase && typeof this._state.matchCase !== 'undefined') { - this._storageService.store('editor.matchCase', this._state.matchCase, StorageScope.WORKSPACE); + if (e.matchCase) { + this._storageService.store('editor.matchCase', this._state.actualMatchCase, StorageScope.WORKSPACE); } } @@ -244,6 +258,13 @@ export class CommonFindController extends Disposable implements editorCommon.IEd } } + if (!stateChanges.searchString && opts.seedSearchStringFromGlobalClipboard) { + let selectionSearchString = this.getGlobalBufferTerm(); + if (selectionSearchString) { + stateChanges.searchString = selectionSearchString; + } + } + // Overwrite isReplaceRevealed if (opts.forceRevealReplace) { stateChanges.isReplaceRevealed = true; @@ -319,6 +340,19 @@ export class CommonFindController extends Disposable implements editorCommon.IEd } return true; } + + public getGlobalBufferTerm(): string { + if (this._editor.getConfiguration().contribInfo.find.globalFindClipboard && this._clipboardService) { + return this._clipboardService.readFindText(); + } + return ''; + } + + public setGlobalBufferTerm(text: string) { + if (this._editor.getConfiguration().contribInfo.find.globalFindClipboard && this._clipboardService) { + this._clipboardService.writeFindText(text); + } + } } export class FindController extends CommonFindController implements IFindController { @@ -332,9 +366,10 @@ export class FindController extends CommonFindController implements IFindControl @IContextKeyService private _contextKeyService: IContextKeyService, @IKeybindingService private _keybindingService: IKeybindingService, @IThemeService private _themeService: IThemeService, - @IStorageService storageService: IStorageService + @IStorageService storageService: IStorageService, + @optional(IClipboardService) clipboardService: IClipboardService ) { - super(editor, _contextKeyService, storageService); + super(editor, _contextKeyService, storageService, clipboardService); } protected _start(opts: IFindStartOptions): void { @@ -389,6 +424,7 @@ export class StartFindAction extends EditorAction { controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: editor.getConfiguration().contribInfo.find.seedSearchStringFromSelection, + seedSearchStringFromGlobalClipboard: editor.getConfiguration().contribInfo.find.globalFindClipboard, shouldFocus: FindStartFocusAction.FocusFindInput, shouldAnimate: true }); @@ -420,9 +456,12 @@ export class StartFindWithSelectionAction extends EditorAction { controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: true, + seedSearchStringFromGlobalClipboard: false, shouldFocus: FindStartFocusAction.FocusFindInput, shouldAnimate: true }); + + controller.setGlobalBufferTerm(controller.getState().searchString); } } } @@ -433,6 +472,7 @@ export abstract class MatchFindAction extends EditorAction { controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getConfiguration().contribInfo.find.seedSearchStringFromSelection, + seedSearchStringFromGlobalClipboard: true, shouldFocus: FindStartFocusAction.NoFocusChange, shouldAnimate: true }); @@ -499,6 +539,7 @@ export abstract class SelectionMatchFindAction extends EditorAction { controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, + seedSearchStringFromGlobalClipboard: false, shouldFocus: FindStartFocusAction.NoFocusChange, shouldAnimate: true }); @@ -585,6 +626,7 @@ export class StartFindReplaceAction extends EditorAction { controller.start({ forceRevealReplace: true, seedSearchStringFromSelection: seedSearchStringFromSelection, + seedSearchStringFromGlobalClipboard: editor.getConfiguration().contribInfo.find.seedSearchStringFromSelection, shouldFocus: shouldFocus, shouldAnimate: true }); diff --git a/src/vs/editor/contrib/find/findState.ts b/src/vs/editor/contrib/find/findState.ts index 0c6533d0374d..21d2d0f53997 100644 --- a/src/vs/editor/contrib/find/findState.ts +++ b/src/vs/editor/contrib/find/findState.ts @@ -79,6 +79,11 @@ export class FindReplaceState implements IDisposable { public get isRegex(): boolean { return effectiveOptionValue(this._isRegexOverride, this._isRegex); } public get wholeWord(): boolean { return effectiveOptionValue(this._wholeWordOverride, this._wholeWord); } public get matchCase(): boolean { return effectiveOptionValue(this._matchCaseOverride, this._matchCase); } + + public get actualIsRegex(): boolean { return this._isRegex; } + public get actualWholeWord(): boolean { return this._wholeWord; } + public get actualMatchCase(): boolean { return this._matchCase; } + public get searchScope(): Range { return this._searchScope; } public get matchesPosition(): number { return this._matchesPosition; } public get matchesCount(): number { return this._matchesCount; } diff --git a/src/vs/editor/contrib/find/findWidget.ts b/src/vs/editor/contrib/find/findWidget.ts index 2d023dd39035..19faa63f3b0b 100644 --- a/src/vs/editor/contrib/find/findWidget.ts +++ b/src/vs/editor/contrib/find/findWidget.ts @@ -34,6 +34,7 @@ import { editorFindRangeHighlight, editorFindMatch, editorFindMatchHighlight, ac export interface IFindController { replace(): void; replaceAll(): void; + getGlobalBufferTerm(): string; } const NLS_FIND_INPUT_LABEL = nls.localize('label.find', "Find"); @@ -109,6 +110,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas private _viewZoneId: number; private _resizeSash: Sash; + private _resized: boolean; constructor( codeEditor: ICodeEditor, @@ -132,47 +134,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._register(this._state.onFindReplaceStateChange((e) => this._onStateChanged(e))); this._buildDomNode(); this._updateButtons(); - - let checkEditorWidth = () => { - let editorWidth = this._codeEditor.getConfiguration().layoutInfo.width; - let minimapWidth = this._codeEditor.getConfiguration().layoutInfo.minimapWidth; - let collapsedFindWidget = false; - let reducedFindWidget = false; - let narrowFindWidget = false; - let widgetWidth = dom.getTotalWidth(this._domNode); - - if (widgetWidth > FIND_WIDGET_INITIAL_WIDTH) { - // as the widget is resized by users, we may need to change the max width of the widget as the editor width changes. - this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; - this._replaceInputBox.inputElement.style.width = `${dom.getTotalWidth(this._findInput.inputBox.inputElement)}px`; - return; - } - - if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth >= editorWidth) { - reducedFindWidget = true; - } - if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth) { - narrowFindWidget = true; - } - if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth + 50) { - collapsedFindWidget = true; - } - dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); - dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); - dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); - - if (!narrowFindWidget && !collapsedFindWidget) { - // the minimal left offset of findwidget is 15px. - this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; - } - - let findInputWidth = dom.getTotalWidth(this._findInput.inputBox.inputElement); - if (findInputWidth > 0) { - this._replaceInputBox.inputElement.style.width = `${findInputWidth}px`; - } - - }; - checkEditorWidth(); + this._tryUpdateWidgetWidth(); this._register(this._codeEditor.onDidChangeConfiguration((e: IConfigurationChangedEvent) => { if (e.readOnly) { @@ -183,7 +145,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._updateButtons(); } if (e.layoutInfo) { - checkEditorWidth(); + this._tryUpdateWidgetWidth(); } })); this._register(this._codeEditor.onDidChangeCursorSelection(() => { @@ -191,6 +153,15 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._updateToggleSelectionFindButton(); } })); + this._register(this._codeEditor.onDidFocusEditor(() => { + if (this._isVisible) { + let globalBufferTerm = this._controller.getGlobalBufferTerm(); + if (globalBufferTerm && globalBufferTerm !== this._state.searchString) { + this._state.change({ searchString: globalBufferTerm }, true); + this._findInput.select(); + } + } + })); this._findInputFocused = CONTEXT_FIND_INPUT_FOCUSED.bindTo(contextKeyService); this._focusTracker = this._register(dom.trackFocus(this._findInput.inputBox.inputElement)); this._register(this._focusTracker.onDidFocus(() => { @@ -289,6 +260,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas if (this._state.isReplaceRevealed) { if (!this._codeEditor.getConfiguration().readOnly && !this._isReplaceVisible) { this._isReplaceVisible = true; + this._replaceInputBox.width = this._findInput.inputBox.width; this._updateButtons(); } } else { @@ -404,6 +376,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas } else { this._toggleSelectionFind.checked = false; } + this._tryUpdateWidgetWidth(); this._updateButtons(); setTimeout(() => { @@ -534,6 +507,53 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._replaceInputBox.style(inputStyles); } + private _tryUpdateWidgetWidth() { + if (!this._isVisible) { + return; + } + let editorWidth = this._codeEditor.getConfiguration().layoutInfo.width; + let minimapWidth = this._codeEditor.getConfiguration().layoutInfo.minimapWidth; + let collapsedFindWidget = false; + let reducedFindWidget = false; + let narrowFindWidget = false; + + if (this._resized) { + let widgetWidth = dom.getTotalWidth(this._domNode); + + if (widgetWidth > FIND_WIDGET_INITIAL_WIDTH) { + // as the widget is resized by users, we may need to change the max width of the widget as the editor width changes. + this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; + this._replaceInputBox.inputElement.style.width = `${dom.getTotalWidth(this._findInput.inputBox.inputElement)}px`; + return; + } + } + + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth >= editorWidth) { + reducedFindWidget = true; + } + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth) { + narrowFindWidget = true; + } + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth + 50) { + collapsedFindWidget = true; + } + dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); + dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); + dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); + + if (!narrowFindWidget && !collapsedFindWidget) { + // the minimal left offset of findwidget is 15px. + this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; + } + + if (this._resized) { + let findInputWidth = dom.getTotalWidth(this._findInput.inputBox.inputElement); + if (findInputWidth > 0) { + this._replaceInputBox.inputElement.style.width = `${findInputWidth}px`; + } + } + } + // ----- Public public focusFindInput(): void { @@ -861,6 +881,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas private _buildSash() { this._resizeSash = new Sash(this._domNode, this, { orientation: Orientation.VERTICAL }); + this._resized = false; let originalWidth = FIND_WIDGET_INITIAL_WIDTH; this._register(this._resizeSash.onDidStart((e: ISashEvent) => { @@ -868,6 +889,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas })); this._register(this._resizeSash.onDidChange((evt: ISashEvent) => { + this._resized = true; let width = originalWidth + evt.startX - evt.currentX; if (width < FIND_WIDGET_INITIAL_WIDTH) { diff --git a/src/vs/editor/contrib/find/test/findController.test.ts b/src/vs/editor/contrib/find/test/findController.test.ts index 59e8681a1cbe..7eb0243f2c1d 100644 --- a/src/vs/editor/contrib/find/test/findController.test.ts +++ b/src/vs/editor/contrib/find/test/findController.test.ts @@ -11,10 +11,12 @@ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; +import * as platform from 'vs/base/common/platform'; import { CommonFindController, FindStartFocusAction, IFindStartOptions, NextMatchFindAction, StartFindAction } from 'vs/editor/contrib/find/findController'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { HistoryNavigator } from 'vs/base/common/history'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { Delayer } from 'vs/base/common/async'; @@ -28,8 +30,13 @@ export class TestFindController extends CommonFindController { private _delayedUpdateHistoryEvent: Emitter = new Emitter(); - constructor(editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService, @IStorageService storageService: IStorageService) { - super(editor, contextKeyService, storageService); + constructor( + editor: ICodeEditor, + @IContextKeyService contextKeyService: IContextKeyService, + @IStorageService storageService: IStorageService, + @IClipboardService clipboardService: IClipboardService + ) { + super(editor, contextKeyService, storageService, clipboardService); this._updateHistoryDelayer = new Delayer(50); } @@ -70,6 +77,7 @@ function fromRange(rng: Range): number[] { suite('FindController', () => { let queryState: { [key: string]: any; } = {}; + let clipboardState = ''; let serviceCollection = new ServiceCollection(); serviceCollection.set(IStorageService, { get: (key: string) => queryState[key], @@ -77,6 +85,88 @@ suite('FindController', () => { store: (key: string, value: any) => { queryState[key] = value; } } as IStorageService); + if (platform.isMacintosh) { + serviceCollection.set(IClipboardService, { + readFindText: _ => clipboardState, + writeFindText: (value: any) => { clipboardState = value; } + }); + } + + test('stores to the global clipboard buffer on start find action', () => { + withTestCodeEditor([ + 'ABC', + 'ABC', + 'XYZ', + 'ABC' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + clipboardState = ''; + if (!platform.isMacintosh) { + assert.ok(true); + return; + } + let findController = editor.registerAndInstantiateContribution(TestFindController); + let startFindAction = new StartFindAction(); + // I select ABC on the first line + editor.setSelection(new Selection(1, 1, 1, 4)); + // I hit Ctrl+F to show the Find dialog + startFindAction.run(null, editor); + + assert.deepEqual(findController.getGlobalBufferTerm(), findController.getState().searchString); + findController.dispose(); + }); + }); + + test('reads from the global clipboard buffer on next find action if buffer exists', () => { + withTestCodeEditor([ + 'ABC', + 'ABC', + 'XYZ', + 'ABC' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + clipboardState = 'ABC'; + + if (!platform.isMacintosh) { + assert.ok(true); + return; + } + + let findController = editor.registerAndInstantiateContribution(TestFindController); + let findState = findController.getState(); + let nextMatchFindAction = new NextMatchFindAction(); + + nextMatchFindAction.run(null, editor); + assert.equal(findState.searchString, 'ABC'); + + assert.deepEqual(fromRange(editor.getSelection()), [1, 1, 1, 4]); + + findController.dispose(); + }); + }); + + test('writes to the global clipboard buffer when text changes', () => { + withTestCodeEditor([ + 'ABC', + 'ABC', + 'XYZ', + 'ABC' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + clipboardState = ''; + if (!platform.isMacintosh) { + assert.ok(true); + return; + } + + let findController = editor.registerAndInstantiateContribution(TestFindController); + let findState = findController.getState(); + + findState.change({ searchString: 'ABC' }, true); + + assert.deepEqual(findController.getGlobalBufferTerm(), 'ABC'); + + findController.dispose(); + }); + }); + test('issue #1857: F3, Find Next, acts like "Find Under Cursor"', () => { withTestCodeEditor([ 'ABC', @@ -84,7 +174,7 @@ suite('FindController', () => { 'XYZ', 'ABC' ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; // The cursor is at the very top, of the file, at the first ABC let findController = editor.registerAndInstantiateContribution(TestFindController); let findState = findController.getState(); @@ -139,7 +229,7 @@ suite('FindController', () => { withTestCodeEditor([ 'import nls = require(\'vs/nls\');' ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); let nextMatchFindAction = new NextMatchFindAction(); @@ -164,7 +254,7 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); let startFindAction = new StartFindAction(); let nextMatchFindAction = new NextMatchFindAction(); @@ -190,11 +280,12 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); findController.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, + seedSearchStringFromGlobalClipboard: false, shouldFocus: FindStartFocusAction.NoFocusChange, shouldAnimate: false }); @@ -218,7 +309,7 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); findController.getState().change({ searchString: '2' }, false); @@ -234,7 +325,7 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); findController.delayUpdateHistory = true; findController.getState().change({ searchString: '1' }, false); @@ -254,7 +345,7 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); findController.getState().change({ searchString: '2' }, false); @@ -271,7 +362,7 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); findController.getState().change({ searchString: '2' }, false); @@ -288,7 +379,7 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); findController.getState().change({ searchString: '2' }, false); @@ -308,7 +399,7 @@ suite('FindController', () => { 'var y = (3 * 5)', 'var z = (3 * 5)', ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); findController.getState().change({ searchString: '2' }, false); @@ -326,7 +417,7 @@ suite('FindController', () => { withTestCodeEditor([ 'HRESULT OnAmbientPropertyChange(DISPID dispid);' ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); let startFindAction = new StartFindAction(); @@ -353,7 +444,7 @@ suite('FindController', () => { 'line2', 'line3' ], { serviceCollection: serviceCollection }, (editor, cursor) => { - + clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController); let startFindAction = new StartFindAction(); diff --git a/src/vs/editor/contrib/folding/folding.ts b/src/vs/editor/contrib/folding/folding.ts index 7f1d4e94571d..b7c020900420 100644 --- a/src/vs/editor/contrib/folding/folding.ts +++ b/src/vs/editor/contrib/folding/folding.ts @@ -8,6 +8,7 @@ import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; +import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { RunOnceScheduler, Delayer } from 'vs/base/common/async'; import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -15,7 +16,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { ScrollType, IModel, IEditorContribution } from 'vs/editor/common/editorCommon'; import { registerEditorAction, registerEditorContribution, ServicesAccessor, EditorAction, registerInstantiatedEditorAction } from 'vs/editor/browser/editorExtensions'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; -import { FoldingModel, setCollapseStateAtLevel, CollapseMemento, setCollapseStateLevelsDown, setCollapseStateLevelsUp } from 'vs/editor/contrib/folding/foldingModel'; +import { FoldingModel, setCollapseStateAtLevel, CollapseMemento, setCollapseStateLevelsDown, setCollapseStateLevelsUp, setCollapseStateForMatchingLines } from 'vs/editor/contrib/folding/foldingModel'; import { FoldingDecorationProvider } from './foldingDecorations'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; @@ -180,7 +181,10 @@ export class FoldingController implements IEditorContribution { if (this.updateScheduler) { this.foldingModelPromise = this.updateScheduler.trigger(() => { if (this.foldingModel) { // null if editor has been disposed, or folding turned off - this.foldingModel.update(this.computeRanges(this.foldingModel.textModel)); + // some cursors might have moved into hidden regions, make sure they are in expanded regions + let selections = this.editor.getSelections(); + let selectionLineNumbers = selections ? selections.map(s => s.startLineNumber) : []; + this.foldingModel.update(this.computeRanges(this.foldingModel.textModel), selectionLineNumbers); } return this.foldingModel; }); @@ -508,6 +512,78 @@ class FoldRecursivelyAction extends FoldingAction { } } +class FoldAllBlockCommentsAction extends FoldingAction { + + constructor() { + super({ + id: 'editor.foldAllBlockComments', + label: nls.localize('foldAllBlockComments.label', "Fold All Block Comments"), + alias: 'Fold All Block Comments', + precondition: null, + kbOpts: { + kbExpr: EditorContextKeys.textFocus, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.US_SLASH) + } + }); + } + + invoke(foldingController: FoldingController, foldingModel: FoldingModel, editor: ICodeEditor): void { + let comments = LanguageConfigurationRegistry.getComments(editor.getModel().getLanguageIdentifier().id); + if (comments && comments.blockCommentStartToken) { + let regExp = new RegExp('^\\s*' + escapeRegExpCharacters(comments.blockCommentStartToken)); + setCollapseStateForMatchingLines(foldingModel, regExp, true); + } + } +} + +class FoldAllRegionsAction extends FoldingAction { + + constructor() { + super({ + id: 'editor.foldAllMarkerRegions', + label: nls.localize('foldAllMarkerRegions.label', "Fold All Regions"), + alias: 'Fold All Regions', + precondition: null, + kbOpts: { + kbExpr: EditorContextKeys.textFocus, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_8) + } + }); + } + + invoke(foldingController: FoldingController, foldingModel: FoldingModel, editor: ICodeEditor): void { + let foldingRules = LanguageConfigurationRegistry.getFoldingRules(editor.getModel().getLanguageIdentifier().id); + if (foldingRules && foldingRules.markers && foldingRules.markers.start) { + let regExp = new RegExp(foldingRules.markers.start); + setCollapseStateForMatchingLines(foldingModel, regExp, true); + } + } +} + +class UnfoldAllRegionsAction extends FoldingAction { + + constructor() { + super({ + id: 'editor.unfoldAllMarkerRegions', + label: nls.localize('unfoldAllMarkerRegions.label', "Unfold All Regions"), + alias: 'Unfold All Regions', + precondition: null, + kbOpts: { + kbExpr: EditorContextKeys.textFocus, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_9) + } + }); + } + + invoke(foldingController: FoldingController, foldingModel: FoldingModel, editor: ICodeEditor): void { + let foldingRules = LanguageConfigurationRegistry.getFoldingRules(editor.getModel().getLanguageIdentifier().id); + if (foldingRules && foldingRules.markers && foldingRules.markers.start) { + let regExp = new RegExp(foldingRules.markers.start); + setCollapseStateForMatchingLines(foldingModel, regExp, false); + } + } +} + class FoldAllAction extends FoldingAction { constructor() { @@ -568,8 +644,11 @@ registerEditorAction(FoldAction); registerEditorAction(FoldRecursivelyAction); registerEditorAction(FoldAllAction); registerEditorAction(UnfoldAllAction); +registerEditorAction(FoldAllBlockCommentsAction); +registerEditorAction(FoldAllRegionsAction); +registerEditorAction(UnfoldAllRegionsAction); -for (let i = 1; i <= 9; i++) { +for (let i = 1; i <= 7; i++) { registerInstantiatedEditorAction( new FoldLevelAction({ id: FoldLevelAction.ID(i), diff --git a/src/vs/editor/contrib/folding/foldingModel.ts b/src/vs/editor/contrib/folding/foldingModel.ts index 63c883a58578..8c39fd86c30c 100644 --- a/src/vs/editor/contrib/folding/foldingModel.ts +++ b/src/vs/editor/contrib/folding/foldingModel.ts @@ -5,7 +5,7 @@ import { IModel, IModelDecorationOptions, IModelDeltaDecoration, IModelDecorationsChangeAccessor } from 'vs/editor/common/editorCommon'; import Event, { Emitter } from 'vs/base/common/event'; -import { FoldingRanges, ILineRange } from './foldingRanges'; +import { FoldingRanges, ILineRange, FoldingRegion } from './foldingRanges'; export interface IDecorationProvider { getDecorationOption(isCollapsed: boolean): IModelDecorationOptions; @@ -60,12 +60,24 @@ export class FoldingModel { this._updateEventEmitter.fire({ model: this, collapseStateChanged: regions }); } - public update(newRanges: FoldingRanges): void { + public update(newRanges: FoldingRanges, blockedLineNumers: number[] = []): void { let newEditorDecorations = []; + let isBlocked = (startLineNumber, endLineNumber) => { + for (let blockedLineNumber of blockedLineNumers) { + if (startLineNumber < blockedLineNumber && blockedLineNumber <= endLineNumber) { // first line is visible + return true; + } + } + return false; + }; + let initRange = (index: number, isCollapsed: boolean) => { - newRanges.setCollapsed(index, isCollapsed); let startLineNumber = newRanges.getStartLineNumber(index); + if (isCollapsed && isBlocked(startLineNumber, newRanges.getEndLineNumber(index))) { + isCollapsed = false; + } + newRanges.setCollapsed(index, isCollapsed); let maxColumn = this._textModel.getLineMaxColumn(startLineNumber); let decorationRange = { startLineNumber: startLineNumber, @@ -167,7 +179,7 @@ export class FoldingModel { let index = this._ranges.findRange(lineNumber); let level = 1; while (index >= 0) { - let current = new FoldingRegion(this._ranges, index); + let current = this._ranges.toRegion(index); if (!filter || filter(current, level)) { result.push(current); } @@ -182,7 +194,7 @@ export class FoldingModel { if (this._ranges) { let index = this._ranges.findRange(lineNumber); if (index >= 0) { - return new FoldingRegion(this._ranges, index); + return this._ranges.toRegion(index); } } return null; @@ -195,7 +207,7 @@ export class FoldingModel { let index = region ? region.regionIndex + 1 : 0; let endLineNumber = region ? region.endLineNumber : Number.MAX_VALUE; for (let i = index, len = this._ranges.length; i < len; i++) { - let current = new FoldingRegion(this._ranges, i); + let current = this._ranges.toRegion(i); if (this._ranges.getStartLineNumber(i) < endLineNumber) { if (trackLevel) { while (levelStack.length > 0 && !current.containedBy(levelStack[levelStack.length - 1])) { @@ -217,41 +229,7 @@ export class FoldingModel { } -export class FoldingRegion { - constructor(private ranges: FoldingRanges, private index: number) { - } - - public get startLineNumber() { - return this.ranges.getStartLineNumber(this.index); - } - - public get endLineNumber() { - return this.ranges.getEndLineNumber(this.index); - } - - public get regionIndex() { - return this.index; - } - - public get parentIndex() { - return this.ranges.getParentIndex(this.index); - } - - public get isCollapsed() { - return this.ranges.isCollapsed(this.index); - } - - containedBy(range: ILineRange): boolean { - return range.startLineNumber <= this.startLineNumber && range.endLineNumber >= this.endLineNumber; - } - containsLine(lineNumber: number) { - return this.startLineNumber <= lineNumber && lineNumber <= this.endLineNumber; - } - hidesLine(lineNumber: number) { - return this.startLineNumber < lineNumber && lineNumber <= this.endLineNumber; - } -} /** * Collapse or expand the regions at the given locations including all children. @@ -306,4 +284,23 @@ export function setCollapseStateAtLevel(foldingModel: FoldingModel, foldLevel: n let filter = (region: FoldingRegion, level: number) => level === foldLevel && region.isCollapsed !== doCollapse && !blockedLineNumbers.some(line => region.containsLine(line)); let toToggle = foldingModel.getRegionsInside(null, filter); foldingModel.toggleCollapseState(toToggle); +} + +/** + * Folds all regions for which the lines start with a given regex + * @param foldingModel the folding model + */ +export function setCollapseStateForMatchingLines(foldingModel: FoldingModel, regExp: RegExp, doCollapse: boolean): void { + let editorModel = foldingModel.textModel; + let ranges = foldingModel.ranges; + let toToggle = []; + for (let i = ranges.length - 1; i >= 0; i--) { + if (doCollapse !== ranges.isCollapsed(i)) { + let startLineNumber = ranges.getStartLineNumber(i); + if (regExp.test(editorModel.getLineContent(startLineNumber))) { + toToggle.push(ranges.toRegion(i)); + } + } + } + foldingModel.toggleCollapseState(toToggle); } \ No newline at end of file diff --git a/src/vs/editor/contrib/folding/foldingRanges.ts b/src/vs/editor/contrib/folding/foldingRanges.ts index bbe244de30a4..666e174f1b2a 100644 --- a/src/vs/editor/contrib/folding/foldingRanges.ts +++ b/src/vs/editor/contrib/folding/foldingRanges.ts @@ -84,6 +84,10 @@ export class FoldingRanges { } } + public toRegion(index: number): FoldingRegion { + return new FoldingRegion(this, index); + } + public getParentIndex(index: number) { this.ensureParentIndices(); let parent = ((this._startIndexes[index] & MASK_INDENT) >>> 24) + ((this._endIndexes[index] & MASK_INDENT) >>> 16); @@ -130,4 +134,40 @@ export class FoldingRanges { } return -1; } +} + +export class FoldingRegion { + + constructor(private ranges: FoldingRanges, private index: number) { + } + + public get startLineNumber() { + return this.ranges.getStartLineNumber(this.index); + } + + public get endLineNumber() { + return this.ranges.getEndLineNumber(this.index); + } + + public get regionIndex() { + return this.index; + } + + public get parentIndex() { + return this.ranges.getParentIndex(this.index); + } + + public get isCollapsed() { + return this.ranges.isCollapsed(this.index); + } + + containedBy(range: ILineRange): boolean { + return range.startLineNumber <= this.startLineNumber && range.endLineNumber >= this.endLineNumber; + } + containsLine(lineNumber: number) { + return this.startLineNumber <= lineNumber && lineNumber <= this.endLineNumber; + } + hidesLine(lineNumber: number) { + return this.startLineNumber < lineNumber && lineNumber <= this.endLineNumber; + } } \ No newline at end of file diff --git a/src/vs/editor/contrib/folding/test/foldingModel.test.ts b/src/vs/editor/contrib/folding/test/foldingModel.test.ts index a00ef95b0450..287baab9c2d3 100644 --- a/src/vs/editor/contrib/folding/test/foldingModel.test.ts +++ b/src/vs/editor/contrib/folding/test/foldingModel.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { FoldingModel, FoldingRegion, setCollapseStateAtLevel, setCollapseStateLevelsDown, setCollapseStateLevelsUp } from 'vs/editor/contrib/folding/foldingModel'; +import { FoldingModel, setCollapseStateAtLevel, setCollapseStateLevelsDown, setCollapseStateLevelsUp, setCollapseStateForMatchingLines } from 'vs/editor/contrib/folding/foldingModel'; import { Model } from 'vs/editor/common/model/model'; import { computeRanges } from 'vs/editor/contrib/folding/indentRangeProvider'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @@ -13,6 +13,8 @@ import { TrackedRangeStickiness, IModelDeltaDecoration, IModel, IModelDecoration import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; +import { FoldingRegion } from 'vs/editor/contrib/folding/foldingRanges'; +import { escapeRegExpCharacters } from 'vs/base/common/strings'; interface ExpectedRegion { @@ -588,4 +590,44 @@ suite('Folding Model', () => { }); + + test('setCollapseStateForMatchingLines', () => { + let lines = [ + /* 1*/ '/**', + /* 2*/ ' * the class', + /* 3*/ ' */', + /* 4*/ 'class A {', + /* 5*/ ' /**', + /* 6*/ ' * the foo', + /* 7*/ ' */', + /* 8*/ ' void foo() {', + /* 9*/ ' /*', + /* 10*/ ' * the comment', + /* 11*/ ' */', + /* 12*/ ' }', + /* 13*/ '}']; + + let textModel = Model.createFromString(lines.join('\n')); + try { + let foldingModel = new FoldingModel(textModel, new TestDecorationProvider(textModel)); + + let ranges = computeRanges(textModel, false, { start: /^\/\/#region$/, end: /^\/\/#endregion$/ }); + foldingModel.update(ranges); + + let r1 = r(1, 3, false); + let r2 = r(4, 12, false); + let r3 = r(5, 7, false); + let r4 = r(8, 11, false); + let r5 = r(9, 11, false); + assertRanges(foldingModel, [r1, r2, r3, r4, r5]); + + let regExp = new RegExp('^\\s*' + escapeRegExpCharacters('/*')); + setCollapseStateForMatchingLines(foldingModel, regExp, true); + assertFoldedRanges(foldingModel, [r1, r3, r5], '1'); + } finally { + textModel.dispose(); + } + + }); + }); \ No newline at end of file diff --git a/src/vs/editor/contrib/gotoError/gotoError.ts b/src/vs/editor/contrib/gotoError/gotoError.ts index 758634a1f003..f60bc6af83df 100644 --- a/src/vs/editor/contrib/gotoError/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/gotoError.ts @@ -15,7 +15,6 @@ import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMarker, IMarkerService } from 'vs/platform/markers/common/markers'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -398,23 +397,12 @@ class MarkerNavigationAction extends EditorAction { } public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const telemetryService = accessor.get(ITelemetryService); - const controller = MarkerController.get(editor); if (!controller) { return; } let model = controller.getOrCreateModel(); - /* __GDPR__ - "zoneWidgetShown" : { - "mode" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "${include}": [ - "${EditorTelemetryData}" - ] - } - */ - telemetryService.publicLog('zoneWidgetShown', { mode: 'go to error', ...editor.getTelemetryData() }); if (model) { if (this._isNext) { model.next(); diff --git a/src/vs/editor/contrib/hover/hover.css b/src/vs/editor/contrib/hover/hover.css index 47f30d4d07ed..3c1349d47fcb 100644 --- a/src/vs/editor/contrib/hover/hover.css +++ b/src/vs/editor/contrib/hover/hover.css @@ -27,14 +27,6 @@ max-width: 500px; } -/* - * https://github.com/Microsoft/monaco-editor/issues/417 - * Safari 10.1, fails inherit correct visibility from parent when we change the visibility of parent element from hidden to inherit, in this particular case. - */ -.monaco-editor-hover .monaco-scrollable-element { - visibility: visible; -} - .monaco-editor-hover .hover-row { padding: 4px 5px; } @@ -74,4 +66,4 @@ .monaco-editor-hover .monaco-tokenized-source { white-space: pre-wrap; word-break: break-all; -} \ No newline at end of file +} diff --git a/src/vs/editor/contrib/hover/modesContentHover.ts b/src/vs/editor/contrib/hover/modesContentHover.ts index 00ec6881e855..4e93efdcb969 100644 --- a/src/vs/editor/contrib/hover/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/modesContentHover.ts @@ -295,7 +295,8 @@ export class ModesContentHoverWidget extends ContentHoverWidget { // update column from which to show var renderColumn = Number.MAX_VALUE, highlightRange = messages[0].range, - fragment = document.createDocumentFragment(); + fragment = document.createDocumentFragment(), + isEmptyHoverContent = true; let containColorPicker = false; messages.forEach((msg) => { @@ -312,6 +313,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { .forEach(contents => { const renderedContents = this._markdownRenderer.render(contents); fragment.appendChild($('div.hover-row', null, renderedContents)); + isEmptyHoverContent = false; }); } else { containColorPicker = true; @@ -392,7 +394,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { // show - if (!containColorPicker) { + if (!containColorPicker && !isEmptyHoverContent) { this.showAt(new Position(renderRange.startLineNumber, renderColumn), this._shouldFocus); this.updateContents(fragment); } diff --git a/src/vs/editor/contrib/indentation/indentation.ts b/src/vs/editor/contrib/indentation/indentation.ts index 0ff2954e47b0..427ef548b306 100644 --- a/src/vs/editor/contrib/indentation/indentation.ts +++ b/src/vs/editor/contrib/indentation/indentation.ts @@ -21,6 +21,7 @@ import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand'; import { TextEdit, StandardTokenType } from 'vs/editor/common/modes'; import * as IndentUtil from './indentUtils'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IndentConsts } from 'vs/editor/common/modes/supports/indentRules'; export function shiftIndent(tabSize: number, indentation: string, count?: number): string { count = count || 1; @@ -472,10 +473,31 @@ export class AutoIndentOnPaste implements IEditorContribution { text: newIndent }); firstLineText = newIndent + firstLineText.substr(oldIndentation.length); + } else { + let indentMetadata = LanguageConfigurationRegistry.getIndentMetadata(model, startLineNumber); + + if (indentMetadata === 0 || indentMetadata === IndentConsts.UNINDENT_MASK) { + // we paste content into a line where only contains whitespaces + // after pasting, the indentation of the first line is already correct + // the first line doesn't match any indentation rule + // then no-op. + return; + } } } } + const firstLineNumber = startLineNumber; + + // ignore empty or ignored lines + while (startLineNumber < range.endLineNumber) { + if (!/\S/.test(model.getLineContent(startLineNumber + 1))) { + startLineNumber++; + continue; + } + break; + } + if (startLineNumber !== range.endLineNumber) { let virtualModel = { getLineTokens: (lineNumber: number) => { @@ -488,7 +510,7 @@ export class AutoIndentOnPaste implements IEditorContribution { return model.getLanguageIdAtPosition(lineNumber, column); }, getLineContent: (lineNumber: number) => { - if (lineNumber === startLineNumber) { + if (lineNumber === firstLineNumber) { return firstLineText; } else { return model.getLineContent(lineNumber); diff --git a/src/vs/editor/contrib/links/links.css b/src/vs/editor/contrib/links/links.css index 9e0a52185713..7516dac36edb 100644 --- a/src/vs/editor/contrib/links/links.css +++ b/src/vs/editor/contrib/links/links.css @@ -5,6 +5,7 @@ .monaco-editor .detected-link, .monaco-editor .detected-link-active { text-decoration: underline; + text-underline-position: under; } .monaco-editor .detected-link-active { diff --git a/src/vs/editor/contrib/quickFix/quickFix.ts b/src/vs/editor/contrib/quickFix/quickFix.ts index 7c9eaf759c01..3a13fc986847 100644 --- a/src/vs/editor/contrib/quickFix/quickFix.ts +++ b/src/vs/editor/contrib/quickFix/quickFix.ts @@ -7,16 +7,16 @@ import URI from 'vs/base/common/uri'; import { IReadOnlyModel } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; -import { CodeActionProviderRegistry, CodeAction, Command } from 'vs/editor/common/modes'; +import { CodeActionProviderRegistry, CodeAction } from 'vs/editor/common/modes'; import { asWinJsPromise } from 'vs/base/common/async'; import { TPromise } from 'vs/base/common/winjs.base'; import { onUnexpectedExternalError, illegalArgument } from 'vs/base/common/errors'; import { IModelService } from 'vs/editor/common/services/modelService'; import { registerLanguageCommand } from 'vs/editor/browser/editorExtensions'; -export function getCodeActions(model: IReadOnlyModel, range: Range): TPromise<(CodeAction | Command)[]> { +export function getCodeActions(model: IReadOnlyModel, range: Range): TPromise { - const allResults: (CodeAction | Command)[] = []; + const allResults: CodeAction[] = []; const promises = CodeActionProviderRegistry.all(model).map(support => { return asWinJsPromise(token => support.provideCodeActions(model, range, token)).then(result => { if (Array.isArray(result)) { diff --git a/src/vs/editor/contrib/quickFix/quickFixCommands.ts b/src/vs/editor/contrib/quickFix/quickFixCommands.ts index 6f16b6e16104..7de263a38635 100644 --- a/src/vs/editor/contrib/quickFix/quickFixCommands.ts +++ b/src/vs/editor/contrib/quickFix/quickFixCommands.ts @@ -11,6 +11,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; @@ -46,7 +47,7 @@ export class QuickFixController implements IEditorContribution { @IContextMenuService contextMenuService: IContextMenuService, @IKeybindingService private readonly _keybindingService: IKeybindingService, @ITextModelService private readonly _textModelService: ITextModelService, - @IFileService private _fileService: IFileService + @optional(IFileService) private _fileService: IFileService ) { this._editor = editor; this._model = new QuickFixModel(this._editor, markerService); diff --git a/src/vs/editor/contrib/quickFix/quickFixModel.ts b/src/vs/editor/contrib/quickFix/quickFixModel.ts index fa61f6e256d9..e2ff0dcd2a1e 100644 --- a/src/vs/editor/contrib/quickFix/quickFixModel.ts +++ b/src/vs/editor/contrib/quickFix/quickFixModel.ts @@ -11,7 +11,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { CodeActionProviderRegistry, CodeAction, Command } from 'vs/editor/common/modes'; +import { CodeActionProviderRegistry, CodeAction } from 'vs/editor/common/modes'; import { getCodeActions } from './quickFix'; import { Position } from 'vs/editor/common/core/position'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -112,16 +112,7 @@ export class QuickFixOracle { const model = this._editor.getModel(); const range = model.validateRange(rangeOrSelection); const position = rangeOrSelection instanceof Selection ? rangeOrSelection.getPosition() : rangeOrSelection.getStartPosition(); - - const fixes = getCodeActions(model, range).then(actions => - actions.map(action => { - if ('id' in action) { - // must be a command - const command = action as Command; - return { title: command.title, command: command } as CodeAction; - } - return action; - })); + const fixes = getCodeActions(model, range); this._signalChange({ type, diff --git a/src/vs/editor/contrib/quickFix/test/quickFix.test.ts b/src/vs/editor/contrib/quickFix/test/quickFix.test.ts new file mode 100644 index 000000000000..315d5b56e311 --- /dev/null +++ b/src/vs/editor/contrib/quickFix/test/quickFix.test.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import URI from 'vs/base/common/uri'; +import Severity from 'vs/base/common/severity'; +import { Model } from 'vs/editor/common/model/model'; +import { CodeActionProviderRegistry, LanguageIdentifier, CodeActionProvider } from 'vs/editor/common/modes'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Range } from 'vs/editor/common/core/range'; +import { getCodeActions } from 'vs/editor/contrib/quickFix/quickFix'; + +suite('QuickFix', () => { + + let langId = new LanguageIdentifier('fooLang', 17); + let uri = URI.parse('untitled:path'); + let model: Model; + let disposables: IDisposable[] = []; + + setup(function () { + model = Model.createFromString('test1\ntest2\ntest3', undefined, langId, uri); + disposables = [model]; + }); + + teardown(function () { + dispose(disposables); + }); + + test('basics', async function () { + + const provider = new class implements CodeActionProvider { + provideCodeActions() { + return [{ + title: 'Testing1', + diagnostics: [{ + startLineNumber: 1, + startColumn: 1, + endLineNumber: 2, + endColumn: 1, + severity: Severity.Error, + message: 'some error' + }] + }, { + title: 'Testing2' + }]; + } + }; + + disposables.push(CodeActionProviderRegistry.register('fooLang', provider)); + + const actions = await getCodeActions(model, new Range(1, 1, 2, 1)); + assert.equal(actions.length, 2); + }); + +}); diff --git a/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css b/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css index 5c8996336c3c..cc49758d1dd1 100644 --- a/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css +++ b/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css @@ -27,8 +27,7 @@ } .monaco-editor .reference-zone-widget .ref-tree { - line-height: 22px; - font-size: 13px; + line-height: 23px; } .monaco-editor .reference-zone-widget .ref-tree .reference { diff --git a/src/vs/editor/contrib/referenceSearch/referencesController.ts b/src/vs/editor/contrib/referenceSearch/referencesController.ts index f4c10cdbb609..fac06e8beb0b 100644 --- a/src/vs/editor/contrib/referenceSearch/referencesController.ts +++ b/src/vs/editor/contrib/referenceSearch/referencesController.ts @@ -10,11 +10,9 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; import { IEditorService } from 'vs/platform/editor/common/editor'; -import { fromPromise, stopwatch } from 'vs/base/common/event'; import { IInstantiationService, optional } from 'vs/platform/instantiation/common/instantiation'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IMessageService } from 'vs/platform/message/common/message'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -58,7 +56,6 @@ export class ReferencesController implements editorCommon.IEditorContribution { @IContextKeyService contextKeyService: IContextKeyService, @IEditorService private _editorService: IEditorService, @ITextModelService private _textModelResolverService: ITextModelService, - @ITelemetryService private _telemetryService: ITelemetryService, @IMessageService private _messageService: IMessageService, @IInstantiationService private _instantiationService: IInstantiationService, @IWorkspaceContextService private _contextService: IWorkspaceContextService, @@ -143,7 +140,7 @@ export class ReferencesController implements editorCommon.IEditorContribution { const requestId = ++this._requestIdPool; - const promise = modelPromise.then(model => { + modelPromise.then(model => { // still current request? widget still open? if (requestId !== this._requestIdPool || !this._widget) { @@ -156,23 +153,6 @@ export class ReferencesController implements editorCommon.IEditorContribution { this._model = model; - // measure time it stays open - const startTime = Date.now(); - this._disposables.push({ - dispose: () => { - /* __GDPR__ - "zoneWidgetShown" : { - "mode" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "elapsedTime": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog('zoneWidgetShown', { - mode: 'reference search', - elapsedTime: Date.now() - startTime - }); - } - }); - // show widget return this._widget.setModel(this._model).then(() => { @@ -192,20 +172,6 @@ export class ReferencesController implements editorCommon.IEditorContribution { }, error => { this._messageService.show(Severity.Error, error); }); - - const onDone = stopwatch(fromPromise(promise)); - const mode = this._editor.getModel().getLanguageIdentifier().language; - - /* __GDPR__ - "findReferences" : { - "durarion" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "mode": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - onDone(duration => this._telemetryService.publicLog('findReferences', { - duration, - mode - })); } public closeWidget(): void { diff --git a/src/vs/editor/contrib/referenceSearch/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/referencesWidget.ts index 4b2d75c1b2d6..a1b758e7844b 100644 --- a/src/vs/editor/contrib/referenceSearch/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/referencesWidget.ts @@ -433,7 +433,7 @@ class Renderer implements tree.IRenderer { } getHeight(tree: tree.ITree, element: FileReferences | OneReference): number { - return 22; + return 23; } getTemplateId(tree: tree.ITree, element: FileReferences | OneReference): string { diff --git a/src/vs/editor/contrib/snippet/snippetController2.ts b/src/vs/editor/contrib/snippet/snippetController2.ts index 8752b20a8ec6..eda1c4e15099 100644 --- a/src/vs/editor/contrib/snippet/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/snippetController2.ts @@ -19,6 +19,7 @@ import { repeat } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { ILogService } from 'vs/platform/log/common/log'; export class SnippetController2 implements IEditorContribution { @@ -41,6 +42,7 @@ export class SnippetController2 implements IEditorContribution { constructor( private readonly _editor: ICodeEditor, + @ILogService private _logService: ILogService, @IContextKeyService contextKeyService: IContextKeyService ) { this._inSnippet = SnippetController2.InSnippetMode.bindTo(contextKeyService); @@ -64,6 +66,26 @@ export class SnippetController2 implements IEditorContribution { overwriteBefore: number = 0, overwriteAfter: number = 0, undoStopBefore: boolean = true, undoStopAfter: boolean = true ): void { + // this is here to find out more about the yet-not-understood + // error that sometimes happens when we fail to inserted a nested + // snippet + try { + this._doInsert(template, overwriteBefore, overwriteAfter, undoStopBefore, undoStopAfter); + + } catch (e) { + this.cancel(); + this._logService.error(e); + this._logService.error('snippet_error'); + this._logService.error('insert_template=', template); + this._logService.error('existing_template=', this._session ? this._session._logInfo() : ''); + } + } + + private _doInsert( + template: string, + overwriteBefore: number = 0, overwriteAfter: number = 0, + undoStopBefore: boolean = true, undoStopAfter: boolean = true + ): void { // don't listen while inserting the snippet // as that is the inflight state causing cancelation diff --git a/src/vs/editor/contrib/snippet/snippetSession.css b/src/vs/editor/contrib/snippet/snippetSession.css index b6c7d72adda3..e6c549bb760b 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.css +++ b/src/vs/editor/contrib/snippet/snippetSession.css @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-editor.vs .snippet-placeholder { background-color: rgba(10, 50, 100, 0.1); } -.monaco-editor.vs-dark .snippet-placeholder { background-color: rgba(124, 124, 124, 0.1); } -.monaco-editor.hc-black .snippet-placeholder { background-color: rgba(124, 124, 124, 0.1); } +.monaco-editor.vs .snippet-placeholder { background-color: rgba(10, 50, 100, 0.2); min-width: 2px; } +.monaco-editor.vs-dark .snippet-placeholder { background-color: rgba(124, 124, 124, 0.3); min-width: 2px; } +.monaco-editor.hc-black .snippet-placeholder { background-color: rgba(124, 124, 124, 0.3); min-width: 2px; } .monaco-editor.vs .finish-snippet-placeholder { outline: rgba(10, 50, 100, 0.5) solid 1px; } .monaco-editor.vs-dark .finish-snippet-placeholder { outline: #525252 solid 1px; } diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index a63d8c9f5993..0764236fae99 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -27,8 +27,8 @@ export class OneSnippet { private _placeholderDecorations: Map; private _placeholderGroups: Placeholder[][]; - private _placeholderGroupsIdx: number; - private _nestingLevel: number = 1; + _placeholderGroupsIdx: number; + _nestingLevel: number = 1; private static readonly _decor = { active: ModelDecorationOptions.register({ stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }), @@ -143,17 +143,28 @@ export class OneSnippet { return this._snippet.placeholders.length > 0; } - get placeholderRanges() { - const ret: Range[] = []; - this._placeholderDecorations.forEach((id, placeholder) => { - if (!placeholder.isFinalTabstop) { - const range = this._editor.getModel().getDecorationRange(id); - if (range) { - ret.push(range); + computePossibleSelections() { + const result = new Map(); + for (const placeholdersWithEqualIndex of this._placeholderGroups) { + let ranges: Range[]; + + for (const placeholder of placeholdersWithEqualIndex) { + if (placeholder.isFinalTabstop) { + // ignore those + break; } + + if (!ranges) { + ranges = []; + result.set(placeholder.index, ranges); + } + + const id = this._placeholderDecorations.get(placeholder); + const range = this._editor.getModel().getDecorationRange(id); + ranges.push(range); } - }); - return ret; + } + return result; } get choice(): Choice { @@ -316,6 +327,7 @@ export class SnippetSession { private readonly _editor: ICodeEditor; private readonly _template: string; + private readonly _templateMerges: [number, number, string][] = []; private readonly _overwriteBefore: number; private readonly _overwriteAfter: number; private _snippets: OneSnippet[] = []; @@ -331,6 +343,10 @@ export class SnippetSession { dispose(this._snippets); } + _logInfo(): string { + return `template="${this._template}", merged_templates="${this._templateMerges.join(' -> ')}"`; + } + insert(): void { const model = this._editor.getModel(); @@ -349,6 +365,7 @@ export class SnippetSession { } merge(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { + this._templateMerges.push([this._snippets[0]._nestingLevel, this._snippets[0]._placeholderGroupsIdx, template]); const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, template, overwriteBefore, overwriteAfter, true); this._editor.setSelections(this._editor.getModel().pushEditOperations(this._editor.getSelections(), edits, undoEdits => { @@ -369,11 +386,13 @@ export class SnippetSession { next(): void { const newSelections = this._move(true); this._editor.setSelections(newSelections); + this._editor.revealPositionInCenterIfOutsideViewport(newSelections[0].getPosition()); } prev(): void { const newSelections = this._move(false); this._editor.setSelections(newSelections); + this._editor.revealPositionInCenterIfOutsideViewport(newSelections[0].getPosition()); } private _move(fwd: boolean | undefined): Selection[] { @@ -415,29 +434,56 @@ export class SnippetSession { return false; } - const ranges: Range[] = []; + let ranges: Range[] = []; + let placeholderIndex: number = -1; for (const snippet of this._snippets) { - ranges.push(...snippet.placeholderRanges); + + const possibleSelections = snippet.computePossibleSelections(); + + // for the first snippet find the placeholder (and its ranges) + // that contain at least one selection. for all remaining snippets + // the same placeholder (and their ranges) must be used. + if (placeholderIndex < 0) { + possibleSelections.forEach((ranges, index) => { + if (placeholderIndex >= 0) { + return; + } + ranges.sort(Range.compareRangesUsingStarts); + for (const selection of selections) { + if (ranges[0].containsRange(selection)) { + placeholderIndex = index; + break; + } + } + }); + } + + if (placeholderIndex < 0) { + // return false if we couldn't associate a selection to + // this (the first) snippet + return false; + } + + ranges.push(...possibleSelections.get(placeholderIndex)); } - if (selections.length > ranges.length) { + if (selections.length !== ranges.length) { + // this means we started at a placeholder with N + // ranges and new have M (N > M) selections. + // So (at least) one placeholder is without selection -> cancel return false; } - // sort selections and ranges by their start position - // and then make sure each selection is contained by - // a placeholder range + // also sort (placeholder)-ranges. then walk both arrays and + // make sure the placeholder-ranges contain the corresponding + // selection selections.sort(Range.compareRangesUsingStarts); ranges.sort(Range.compareRangesUsingStarts); - outer: for (const selection of selections) { - let range: Range; - while (range = ranges.shift()) { - if (range.containsRange(selection)) { - continue outer; - } + for (let i = 0; i < ranges.length; i++) { + if (!ranges[i].containsRange(selections[i])) { + return false; } - return false; } return true; diff --git a/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts b/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts index a73725238740..4ad7e0dec05a 100644 --- a/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts @@ -12,6 +12,7 @@ import { TestCodeEditor, withTestCodeEditor } from 'vs/editor/test/browser/testC import { Cursor } from 'vs/editor/common/controller/cursor'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { NoopLogService } from 'vs/platform/log/common/log'; class TestSnippetController extends SnippetController2 { @@ -19,7 +20,7 @@ class TestSnippetController extends SnippetController2 { editor: ICodeEditor, @IContextKeyService private _contextKeyService: IContextKeyService ) { - super(editor, _contextKeyService); + super(editor, new NoopLogService(), _contextKeyService); } isInSnippetMode(): boolean { diff --git a/src/vs/editor/contrib/snippet/test/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/snippetController2.test.ts index 53278154130f..638047b4f7c8 100644 --- a/src/vs/editor/contrib/snippet/test/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetController2.test.ts @@ -11,6 +11,7 @@ import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { Model } from 'vs/editor/common/model/model'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { NoopLogService } from 'vs/platform/log/common/log'; suite('SnippetController2', function () { @@ -31,6 +32,7 @@ suite('SnippetController2', function () { let editor: ICodeEditor; let model: Model; let contextKeys: MockContextKeyService; + let logService = new NoopLogService(); setup(function () { contextKeys = new MockContextKeyService(); @@ -45,13 +47,13 @@ suite('SnippetController2', function () { }); test('creation', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); assertContextKeys(contextKeys, false, false, false); ctrl.dispose(); }); test('insert, insert -> abort', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('foo${1:bar}foo$0'); assertContextKeys(contextKeys, true, false, true); @@ -63,7 +65,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> tab, tab, done', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('${1:one}${2:two}$0'); assertContextKeys(contextKeys, true, false, true); @@ -81,7 +83,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> cursor moves out (left/right)', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('foo${1:bar}foo$0'); assertContextKeys(contextKeys, true, false, true); @@ -93,7 +95,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> cursor moves out (up/down)', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('foo${1:bar}foo$0'); assertContextKeys(contextKeys, true, false, true); @@ -105,7 +107,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> cursors collapse', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('foo${1:bar}foo$0'); assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); @@ -117,7 +119,7 @@ suite('SnippetController2', function () { }); test('insert, insert plain text -> no snippet mode', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('foobar'); assertContextKeys(contextKeys, false, false, false); @@ -125,7 +127,7 @@ suite('SnippetController2', function () { }); test('insert, delete snippet text', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('${1:foobar}$0'); assertContextKeys(contextKeys, true, false, true); @@ -149,7 +151,7 @@ suite('SnippetController2', function () { }); test('insert, nested snippet', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('${1:foobar}$0'); assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); @@ -168,7 +170,7 @@ suite('SnippetController2', function () { }); test('insert, nested plain text', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('${1:foobar}$0'); assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); @@ -183,7 +185,7 @@ suite('SnippetController2', function () { }); test('Nested snippets without final placeholder jumps to next outer placeholder, #27898', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('for(const ${1:element} of ${2:array}) {$0}'); assertContextKeys(contextKeys, true, false, true); @@ -202,7 +204,7 @@ suite('SnippetController2', function () { }); test('Inconsistent tab stop behaviour with recursive snippets and tab / shift tab, #27543', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); ctrl.insert('1_calize(${1:nl}, \'${2:value}\')$0'); assertContextKeys(contextKeys, true, false, true); @@ -226,7 +228,7 @@ suite('SnippetController2', function () { }); test('Snippet tabstop selecting content of previously entered variable only works when separated by space, #23728', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); @@ -244,7 +246,7 @@ suite('SnippetController2', function () { }); test('HTML Snippets Combine, #32211', function () { - const ctrl = new SnippetController2(editor, contextKeys); + const ctrl = new SnippetController2(editor, logService, contextKeys); model.setValue(''); model.updateOptions({ insertSpaces: false, tabSize: 4, trimAutoWhitespace: false }); @@ -274,4 +276,31 @@ suite('SnippetController2', function () { assertSelections(editor, new Selection(11, 18, 11, 22)); }); + test('Problems with nested snippet insertion #39594', function () { + const ctrl = new SnippetController2(editor, logService, contextKeys); + + model.setValue(''); + editor.setSelection(new Selection(1, 1, 1, 1)); + + ctrl.insert('$1 = ConvertTo-Json $1'); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(1, 19, 1, 19)); + + editor.setSelection(new Selection(1, 19, 1, 19)); + + // snippet mode should stop because $1 has two occurrences + // and we only have one selection left + assertContextKeys(contextKeys, false, false, false); + }); + + test('Problems with nested snippet insertion #39594', function () { + // ensure selection-change-to-cancel logic isn't too aggressive + const ctrl = new SnippetController2(editor, logService, contextKeys); + + model.setValue('a-\naaa-'); + editor.setSelections([new Selection(2, 5, 2, 5), new Selection(1, 3, 1, 3)]); + + ctrl.insert('log($1);$0'); + assertSelections(editor, new Selection(2, 9, 2, 9), new Selection(1, 7, 1, 7)); + assertContextKeys(contextKeys, true, false, true); + }); }); diff --git a/src/vs/editor/contrib/suggest/completionModel.ts b/src/vs/editor/contrib/suggest/completionModel.ts index 45ca3b876a92..21cc4b1f13a8 100644 --- a/src/vs/editor/contrib/suggest/completionModel.ts +++ b/src/vs/editor/contrib/suggest/completionModel.ts @@ -5,7 +5,7 @@ 'use strict'; -import { fuzzyScore } from 'vs/base/common/filters'; +import { fuzzyScore, fuzzyScoreGracefulAggressive } from 'vs/base/common/filters'; import { ISuggestSupport, ISuggestResult } from 'vs/editor/common/modes'; import { ISuggestionItem, SnippetConfig } from './suggest'; import { isDisposable } from 'vs/base/common/lifecycle'; @@ -14,6 +14,7 @@ export interface ICompletionItem extends ISuggestionItem { matches?: number[]; score?: number; idx?: number; + word?: string; } @@ -37,13 +38,20 @@ export class LineContext { characterCountDelta: number; } +const enum Refilter { + Nothing = 0, + All = 1, + Incr = 2 +} + export class CompletionModel { private readonly _column: number; - private readonly _items: ISuggestionItem[]; + private readonly _items: ICompletionItem[]; private readonly _snippetCompareFn = CompletionModel._compareCompletionItems; private _lineContext: LineContext; + private _refilterKind: Refilter; private _filteredItems: ICompletionItem[]; private _isIncomplete: boolean; private _stats: ICompletionStats; @@ -51,6 +59,7 @@ export class CompletionModel { constructor(items: ISuggestionItem[], column: number, lineContext: LineContext, snippetConfig?: SnippetConfig) { this._items = items; this._column = column; + this._refilterKind = Refilter.All; this._lineContext = lineContext; if (snippetConfig === 'top') { @@ -78,10 +87,10 @@ export class CompletionModel { set lineContext(value: LineContext) { if (this._lineContext.leadingLineContent !== value.leadingLineContent - || this._lineContext.characterCountDelta !== value.characterCountDelta) { - + || this._lineContext.characterCountDelta !== value.characterCountDelta + ) { + this._refilterKind = this._lineContext.characterCountDelta < value.characterCountDelta && this._filteredItems ? Refilter.Incr : Refilter.All; this._lineContext = value; - this._filteredItems = undefined; } } @@ -116,22 +125,30 @@ export class CompletionModel { } private _ensureCachedState(): void { - if (!this._filteredItems) { + if (this._refilterKind !== Refilter.Nothing) { this._createCachedState(); } } private _createCachedState(): void { - this._filteredItems = []; + this._isIncomplete = false; this._stats = { suggestionCount: 0, snippetCount: 0, textCount: 0 }; const { leadingLineContent, characterCountDelta } = this._lineContext; let word = ''; - for (let i = 0; i < this._items.length; i++) { + // incrementally filter less + const source = this._refilterKind === Refilter.All ? this._items : this._filteredItems; + const target: typeof source = []; - const item = this._items[i]; + // picks a score function based on the number of + // items that we have to score/filter + const scoreFn = source.length > 2000 ? fuzzyScore : fuzzyScoreGracefulAggressive; + + for (let i = 0; i < source.length; i++) { + + const item = source[i]; const { suggestion, container } = item; // collect those supports that signaled having @@ -140,12 +157,16 @@ export class CompletionModel { // 'word' is that remainder of the current line that we // filter and score against. In theory each suggestion uses a - // differnet word, but in practice not - that's why we cache + // different word, but in practice not - that's why we cache const wordLen = suggestion.overwriteBefore + characterCountDelta - (item.position.column - this._column); if (word.length !== wordLen) { word = wordLen === 0 ? '' : leadingLineContent.slice(-wordLen); } + // remember the word against which this item was + // scored + item.word = word; + if (wordLen === 0) { // when there is nothing to score against, don't // event try to do. Use a const rank and rely on @@ -159,19 +180,19 @@ export class CompletionModel { // if it matches we check with the label to compute highlights // and if that doesn't yield a result we have no highlights, // despite having the match - let match = fuzzyScore(word, suggestion.filterText, suggestion.overwriteBefore); + let match = scoreFn(word, suggestion.filterText, suggestion.overwriteBefore); if (!match) { continue; } item.score = match[0]; item.matches = []; - match = fuzzyScore(word, suggestion.label, suggestion.overwriteBefore); + match = scoreFn(word, suggestion.label, suggestion.overwriteBefore); if (match) { item.matches = match[1]; } } else { // by default match `word` against the `label` - let match = fuzzyScore(word, suggestion.label, suggestion.overwriteBefore); + let match = scoreFn(word, suggestion.label, suggestion.overwriteBefore); if (match) { item.score = match[0]; item.matches = match[1]; @@ -182,7 +203,7 @@ export class CompletionModel { item.idx = i; - this._filteredItems.push(item); + target.push(item); // update stats this._stats.suggestionCount++; @@ -192,7 +213,8 @@ export class CompletionModel { } } - this._filteredItems.sort(this._snippetCompareFn); + this._filteredItems = target.sort(this._snippetCompareFn); + this._refilterKind = Refilter.Nothing; } private static _compareCompletionItems(a: ICompletionItem, b: ICompletionItem): number { diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index 3b08962d4f7d..7d7013aaa1a4 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -10,7 +10,6 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; @@ -28,6 +27,7 @@ import { SuggestModel, State } from './suggestModel'; import { ICompletionItem } from './completionModel'; import { SuggestWidget } from './suggestWidget'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { SuggestMemories } from 'vs/editor/contrib/suggest/suggestMemory'; class AcceptOnCharacterOracle { @@ -85,16 +85,17 @@ export class SuggestController implements IEditorContribution { private _model: SuggestModel; private _widget: SuggestWidget; + private _memory: SuggestMemories; private _toDispose: IDisposable[] = []; constructor( private _editor: ICodeEditor, @ICommandService private _commandService: ICommandService, - @ITelemetryService private _telemetryService: ITelemetryService, @IContextKeyService private _contextKeyService: IContextKeyService, @IInstantiationService private _instantiationService: IInstantiationService, ) { this._model = new SuggestModel(this._editor); + this._memory = _instantiationService.createInstance(SuggestMemories); this._toDispose.push(this._model.onDidTrigger(e => { if (!this._widget) { @@ -102,14 +103,23 @@ export class SuggestController implements IEditorContribution { } this._widget.showTriggered(e.auto); })); + let lastSelectedItem: ICompletionItem; + this._toDispose.push(this._model.onDidSuggest(e => { + let index = this._memory.select(this._editor.getModel().getLanguageIdentifier(), e.completionModel.items, lastSelectedItem); + if (index >= 0) { + lastSelectedItem = e.completionModel.items[index]; + } else { + index = 0; + lastSelectedItem = undefined; + } + this._widget.showSuggestions(e.completionModel, index, e.isFrozen, e.auto); + })); this._toDispose.push(this._model.onDidCancel(e => { if (this._widget && !e.retrigger) { this._widget.hideWidget(); + lastSelectedItem = undefined; } })); - this._toDispose.push(this._model.onDidSuggest(e => { - this._widget.showSuggestions(e.completionModel, e.isFrozen, e.auto); - })); // Manage the acceptSuggestionsOnEnter context key let acceptSuggestionsOnEnter = SuggestContext.AcceptSuggestionsOnEnter.bindTo(_contextKeyService); @@ -183,14 +193,15 @@ export class SuggestController implements IEditorContribution { } } - private _onDidSelectItem(item: ICompletionItem): void { + protected _onDidSelectItem(item: ICompletionItem): void { if (!item) { this._model.cancel(); return; } const { suggestion, position } = item; - const columnDelta = this._editor.getPosition().column - position.column; + const editorColumn = this._editor.getPosition().column; + const columnDelta = editorColumn - position.column; if (Array.isArray(suggestion.additionalTextEdits)) { this._editor.pushUndoStop(); @@ -198,6 +209,9 @@ export class SuggestController implements IEditorContribution { this._editor.pushUndoStop(); } + // remember this word for future invocations + this._memory.remember(this._editor.getModel().getLanguageIdentifier(), item); + let { insertText } = suggestion; if (suggestion.snippetType !== 'textmate') { insertText = SnippetParser.escape(insertText); @@ -224,15 +238,6 @@ export class SuggestController implements IEditorContribution { } this._alertCompletionItem(item); - /* __GDPR__ - "suggestSnippetInsert" : { - "suggestionType" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "${include}": [ - "${EditorTelemetryData}" - ] - } - */ - this._telemetryService.publicLog('suggestSnippetInsert', { ...this._editor.getTelemetryData(), suggestionType: suggestion.type }); } private _alertCompletionItem({ suggestion }: ICompletionItem): void { diff --git a/src/vs/editor/contrib/suggest/suggestMemory.ts b/src/vs/editor/contrib/suggest/suggestMemory.ts new file mode 100644 index 000000000000..1d4c32c0281b --- /dev/null +++ b/src/vs/editor/contrib/suggest/suggestMemory.ts @@ -0,0 +1,107 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { ICompletionItem } from 'vs/editor/contrib/suggest/completionModel'; +import { LRUCache } from 'vs/base/common/map'; +import { LanguageIdentifier } from 'vs/editor/common/modes'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; + +export class SuggestMemories { + + private readonly _storagePrefix = 'suggest/memories'; + private readonly _data = new Map(); + + constructor( + @IStorageService private _storageService: IStorageService + ) { + // + } + + remember({ language }: LanguageIdentifier, item: ICompletionItem): void { + let memory = this._data.get(language); + if (!memory) { + memory = new SuggestMemory(); + this._data.set(language, memory); + } + memory.remember(item); + this._storageService.store(`${this._storagePrefix}/${language}`, JSON.stringify(memory), StorageScope.WORKSPACE); + } + + select({ language }: LanguageIdentifier, items: ICompletionItem[], last: ICompletionItem): number { + let memory = this._data.get(language); + if (!memory) { + const key: string = `${this._storagePrefix}/${language}`; + const raw = this._storageService.get(key, StorageScope.WORKSPACE); + if (raw) { + try { + const tuples = <[string, MemoryItem][]>JSON.parse(raw); + memory = new SuggestMemory(tuples); + last = undefined; + this._data.set(language, memory); + } catch (e) { + this._storageService.remove(key, StorageScope.WORKSPACE); + } + } + } + if (memory) { + return memory.select(items, last); + } else { + return -1; + } + } +} + + +export interface MemoryItem { + type: string; + insertText: string; +} + +export class SuggestMemory { + + private readonly _memory = new LRUCache(400, 0.75); + + constructor(tuples?: [string, MemoryItem][]) { + if (tuples) { + for (const [word, item] of tuples) { + this._memory.set(word, item); + } + } + } + + remember(item: ICompletionItem): void { + if (item.word) { + this._memory.set(item.word, { insertText: item.suggestion.insertText, type: item.suggestion.type }); + } + } + + select(items: ICompletionItem[], last: ICompletionItem): number { + for (let i = 0; i < items.length; i++) { + if (items[i] === last) { + // prefer the last selected item when + // there is one + return i; + } + if (items[i].word) { + const item = this._memory.get(items[i].word); + if (this._matches(item, items[i])) { + return i; + } + } + } + return -1; + } + + private _matches(item: MemoryItem, candidate: ICompletionItem): boolean { + return item && item.insertText === candidate.suggestion.insertText && item.type === candidate.suggestion.type; + } + + toJSON(): [string, MemoryItem][] { + const tuples: [string, MemoryItem][] = []; + this._memory.forEach((value, key) => tuples.push([key, value])); + return tuples; + } +} diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index c1643a4bfe26..6e3f371d09f0 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -259,17 +259,14 @@ export class SuggestModel implements IDisposable { this._currentPosition = this._editor.getPosition(); if (!e.selection.isEmpty() - || e.source !== 'keyboard' || e.reason !== CursorChangeReason.NotSet + || (e.source !== 'keyboard' && e.source !== 'deleteLeft') ) { - - if (this._state === State.Idle) { - // Early exit if nothing needs to be done! - // Leave some form of early exit check here if you wish to continue being a cursor position change listener ;) - return; + // Early exit if nothing needs to be done! + // Leave some form of early exit check here if you wish to continue being a cursor position change listener ;) + if (this._state !== State.Idle) { + this.cancel(); } - - this.cancel(); return; } @@ -292,9 +289,9 @@ export class SuggestModel implements IDisposable { this.cancel(); - if (LineContext.shouldAutoTrigger(this._editor)) { - this._triggerAutoSuggestPromise = TPromise.timeout(this._quickSuggestDelay); - this._triggerAutoSuggestPromise.then(() => { + this._triggerAutoSuggestPromise = TPromise.timeout(this._quickSuggestDelay); + this._triggerAutoSuggestPromise.then(() => { + if (LineContext.shouldAutoTrigger(this._editor)) { const model = this._editor.getModel(); const pos = this._editor.getPosition(); @@ -322,10 +319,10 @@ export class SuggestModel implements IDisposable { } } - this._triggerAutoSuggestPromise = null; this.trigger({ auto: true }); - }); - } + } + this._triggerAutoSuggestPromise = null; + }); } } } diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 4859f1890454..1742ab977819 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -34,7 +34,7 @@ import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -const sticky = true; // for development purposes +const sticky = false; // for development purposes const expandSuggestionDocsByDefault = false; const maxSuggestionsToShow = 12; @@ -153,6 +153,7 @@ class Renderer implements IRenderer { } data.highlightedLabel.set(suggestion.label, createMatches(element.matches)); + // data.highlightedLabel.set(`${suggestion.label} <${element.score}=score(${element.word}, ${suggestion.filterText || suggestion.label})>`, createMatches(element.matches)); data.typeLabel.textContent = (suggestion.detail || '').replace(/\n.*$/m, ''); if (canExpandCompletionItem(element)) { @@ -693,7 +694,7 @@ export class SuggestWidget implements IContentWidget, IDelegate } } - showSuggestions(completionModel: CompletionModel, isFrozen: boolean, isAuto: boolean): void { + showSuggestions(completionModel: CompletionModel, selectionIndex: number, isFrozen: boolean, isAuto: boolean): void { if (this.loadingTimeout) { clearTimeout(this.loadingTimeout); this.loadingTimeout = null; @@ -737,8 +738,8 @@ export class SuggestWidget implements IContentWidget, IDelegate this.focusedItem = null; this.focusedItemIndex = null; this.list.splice(0, this.list.length, this.completionModel.items); - this.list.setFocus([0]); - this.list.reveal(0, 0); + this.list.setFocus([selectionIndex]); + this.list.reveal(selectionIndex, selectionIndex); if (isFrozen) { this.setState(State.Frozen); diff --git a/src/vs/editor/contrib/suggest/test/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/completionModel.test.ts index ac54e0244bcb..7d78bfe14519 100644 --- a/src/vs/editor/contrib/suggest/test/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/completionModel.test.ts @@ -225,7 +225,74 @@ suite('CompletionModel', function () { const [first, second] = model.items; assert.equal(first.suggestion.label, 'source'); assert.equal(second.suggestion.label, '<- groups'); - }); + test('Score only filtered items when typing more, score all when typing less', function () { + model = new CompletionModel([ + createSuggestItem('console', 0, 'property'), + createSuggestItem('co_new', 0, 'property'), + createSuggestItem('bar', 0, 'property'), + createSuggestItem('car', 0, 'property'), + createSuggestItem('foo', 0, 'property'), + ], 1, { + leadingLineContent: '', + characterCountDelta: 0 + }, 'inline'); + + assert.equal(model.items.length, 5); + + // narrow down once + model.lineContext = { leadingLineContent: 'c', characterCountDelta: 1 }; + assert.equal(model.items.length, 3); + + // query gets longer, narrow down the narrow-down'ed-set from before + model.lineContext = { leadingLineContent: 'cn', characterCountDelta: 2 }; + assert.equal(model.items.length, 2); + + // query gets shorter, refilter everything + model.lineContext = { leadingLineContent: '', characterCountDelta: 0 }; + assert.equal(model.items.length, 5); + }); + + test('Have more relaxed suggest matching algorithm #15419', function () { + model = new CompletionModel([ + createSuggestItem('result', 0, 'property'), + createSuggestItem('replyToUser', 0, 'property'), + createSuggestItem('randomLolut', 0, 'property'), + createSuggestItem('car', 0, 'property'), + createSuggestItem('foo', 0, 'property'), + ], 1, { + leadingLineContent: '', + characterCountDelta: 0 + }, 'inline'); + + // query gets longer, narrow down the narrow-down'ed-set from before + model.lineContext = { leadingLineContent: 'rlut', characterCountDelta: 4 }; + assert.equal(model.items.length, 3); + + const [first, second, third] = model.items; + assert.equal(first.suggestion.label, 'result'); // best with `rult` + assert.equal(second.suggestion.label, 'replyToUser'); // best with `rltu` + assert.equal(third.suggestion.label, 'randomLolut'); // best with `rlut` + }); + + test('Emmet suggestion not appearing at the top of the list in jsx files, #39518', function () { + model = new CompletionModel([ + createSuggestItem('from', 0, 'property'), + createSuggestItem('form', 0, 'property'), + createSuggestItem('form:get', 0, 'property'), + createSuggestItem('testForeignMeasure', 0, 'property'), + createSuggestItem('fooRoom', 0, 'property'), + ], 1, { + leadingLineContent: '', + characterCountDelta: 0 + }, 'inline'); + + model.lineContext = { leadingLineContent: 'form', characterCountDelta: 4 }; + assert.equal(model.items.length, 5); + const [first, second, third] = model.items; + assert.equal(first.suggestion.label, 'form'); // best with `form` + assert.equal(second.suggestion.label, 'form:get'); // best with `form` + assert.equal(third.suggestion.label, 'from'); // best with `from` + }); }); diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts index cb8c0886462f..d0c081f90a5c 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts @@ -22,14 +22,18 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { IStorageService, NullStorageService } from 'vs/platform/storage/common/storage'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; function createMockEditor(model: Model): TestCodeEditor { const contextKeyService = new MockContextKeyService(); const telemetryService = NullTelemetryService; const instantiationService = new InstantiationService(new ServiceCollection( [IContextKeyService, contextKeyService], - [ITelemetryService, telemetryService] + [ITelemetryService, telemetryService], + [IStorageService, NullStorageService] )); const editor = new TestCodeEditor(new MockScopeLocation(), {}, instantiationService, contextKeyService); @@ -101,7 +105,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { disposables.push(model); }); - function withOracle(callback: (model: SuggestModel, editor: ICodeEditor) => any): TPromise { + function withOracle(callback: (model: SuggestModel, editor: TestCodeEditor) => any): TPromise { return new TPromise((resolve, reject) => { const editor = createMockEditor(model); @@ -534,4 +538,82 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }); }); }); + + test('Backspace should not always cancel code completion, #36491', function () { + disposables.push(SuggestRegistry.register({ scheme: 'test' }, alwaysSomethingSupport)); + + return withOracle(async (model, editor) => { + await assertEvent(model.onDidSuggest, () => { + editor.setPosition({ lineNumber: 1, column: 4 }); + editor.trigger('keyboard', Handler.Type, { text: 'd' }); + + }, event => { + assert.equal(event.auto, true); + assert.equal(event.completionModel.items.length, 1); + const [first] = event.completionModel.items; + + assert.equal(first.support, alwaysSomethingSupport); + }); + + await assertEvent(model.onDidSuggest, () => { + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); + + }, event => { + assert.equal(event.auto, true); + assert.equal(event.completionModel.items.length, 1); + const [first] = event.completionModel.items; + + assert.equal(first.support, alwaysSomethingSupport); + }); + }); + }); + + test('Text changes for completion CodeAction are affected by the completion #39893', function () { + disposables.push(SuggestRegistry.register({ scheme: 'test' }, { + provideCompletionItems(doc, pos): ISuggestResult { + return { + incomplete: true, + suggestions: [{ + label: 'bar', + type: 'property', + insertText: 'bar', + overwriteBefore: 2, + additionalTextEdits: [{ + text: ', bar', + range: { startLineNumber: 1, endLineNumber: 1, startColumn: 17, endColumn: 17 } + }] + }] + }; + } + })); + + model.setValue('ba; import { foo } from "./b"'); + + return withOracle(async (sugget, editor) => { + class TestCtrl extends SuggestController { + _onDidSelectItem(item) { + super._onDidSelectItem(item); + } + } + const ctrl = editor.registerAndInstantiateContribution(TestCtrl); + editor.registerAndInstantiateContribution(SnippetController2); + + await assertEvent(sugget.onDidSuggest, () => { + editor.setPosition({ lineNumber: 1, column: 3 }); + sugget.trigger({ auto: false }); + }, event => { + + assert.equal(event.completionModel.items.length, 1); + const [first] = event.completionModel.items; + assert.equal(first.suggestion.label, 'bar'); + + ctrl._onDidSelectItem(first); + }); + + assert.equal( + model.getValue(), + 'bar; import { foo, bar } from "./b"' + ); + }); + }); }); diff --git a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts index e833c79b7dfd..9f31985a37ed 100644 --- a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts @@ -159,7 +159,7 @@ class WordHighlighter { try { this._ignorePositionChangeEvent = true; this.editor.setPosition(dest.getStartPosition()); - this.editor.revealRangeInCenter(dest); + this.editor.revealRangeInCenterIfOutsideViewport(dest); } finally { this._ignorePositionChangeEvent = false; } @@ -173,7 +173,7 @@ class WordHighlighter { try { this._ignorePositionChangeEvent = true; this.editor.setPosition(dest.getStartPosition()); - this.editor.revealRangeInCenter(dest); + this.editor.revealRangeInCenterIfOutsideViewport(dest); } finally { this._ignorePositionChangeEvent = false; } @@ -330,7 +330,7 @@ class WordHighlighter { this.renderDecorationsTimer = -1; this.renderDecorations(); } else { - // Asyncrhonous + // Asynchronous this.renderDecorationsTimer = setTimeout(() => { this.renderDecorations(); }, (minimumRenderTime - currentTime)); diff --git a/src/vs/editor/contrib/zoneWidget/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/zoneWidget.ts index dca1d69a836d..a2a990f46e87 100644 --- a/src/vs/editor/contrib/zoneWidget/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/zoneWidget.ts @@ -28,6 +28,7 @@ export interface IOptions { isResizeable?: boolean; frameColor?: Color; arrowColor?: Color; + keepEditorSelection?: boolean; } export interface IStyles { @@ -42,7 +43,8 @@ const defaultOptions: IOptions = { showFrame: true, className: '', frameColor: defaultColor, - arrowColor: defaultColor + arrowColor: defaultColor, + keepEditorSelection: false }; const WIDGET_ID = 'vs.editor.contrib.zoneWidget'; @@ -391,7 +393,9 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { this._doLayout(containerHeight, width); - this.editor.setSelection(where); + if (!this.options.keepEditorSelection) { + this.editor.setSelection(where); + } // Reveal the line above or below the zone widget, to get the zone widget in the viewport const revealLineNumber = Math.min(this.editor.getModel().getLineCount(), Math.max(1, where.endLineNumber + 1)); diff --git a/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts b/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts index ea3d4dcc5c20..07cd17c01af6 100644 --- a/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts +++ b/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts @@ -48,8 +48,7 @@ export class QuickOpenEditorWidget implements IOverlayWidget { inputPlaceHolder: null, inputAriaLabel: configuration.inputAriaLabel, keyboardSupport: true - }, - null + } ); this.styler = attachQuickOpenStyler(this.quickOpenWidget, this.themeService); diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index c316839a2061..44dd3f9f46fa 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -260,7 +260,7 @@ export class SimpleMessageService implements IMessageService { // No-op } - public confirmSync(confirmation: IConfirmation): boolean { + public confirm(confirmation: IConfirmation): boolean { let messageText = confirmation.message; if (confirmation.detail) { messageText = messageText + '\n\n' + confirmation.detail; @@ -269,8 +269,8 @@ export class SimpleMessageService implements IMessageService { return window.confirm(messageText); } - public confirm(confirmation: IConfirmation): TPromise { - return TPromise.as({ confirmed: this.confirmSync(confirmation) } as IConfirmationResult); + public confirmWithCheckbox(confirmation: IConfirmation): TPromise { + return TPromise.as({ confirmed: this.confirm(confirmation), checkboxChecked: false /* unsupported */ } as IConfirmationResult); } } diff --git a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts index a186bfba28b4..bd45bf98e971 100644 --- a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts +++ b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts @@ -1167,6 +1167,36 @@ suite('viewLineRenderer.renderLine 2', () => { assert.deepEqual(actual.html, expected); }); + test('issue #38935: GitLens end-of-line blame no longer rendering', () => { + + let actual = renderViewLine(new RenderLineInput( + true, + '\t}', + false, + 0, + [createPart(2, 3)], + [ + new LineDecoration(3, 3, 'ced-TextEditorDecorationType2-5e9b9b3f-3 ced-TextEditorDecorationType2-3', InlineDecorationType.Before), + new LineDecoration(3, 3, 'ced-TextEditorDecorationType2-5e9b9b3f-4 ced-TextEditorDecorationType2-4', InlineDecorationType.After), + ], + 4, + 10, + 10000, + 'none', + false, + false + )); + + let expected = [ + '', + '\u00a0\u00a0\u00a0\u00a0}', + '', + '' + ].join(''); + + assert.deepEqual(actual.html, expected); + }); + function createTestGetColumnOfLinePartOffset(lineContent: string, tabSize: number, parts: ViewLineToken[], expectedPartLengths: number[]): (partIndex: number, partLength: number, offset: number, expected: number) => void { let renderLineOutput = renderViewLine(new RenderLineInput( false, diff --git a/src/vs/platform/actions/test/common/menuService.test.ts b/src/vs/platform/actions/test/common/menuService.test.ts index 322e87f44a21..40ecb80f1ff8 100644 --- a/src/vs/platform/actions/test/common/menuService.test.ts +++ b/src/vs/platform/actions/test/common/menuService.test.ts @@ -12,12 +12,13 @@ import { NullCommandService } from 'vs/platform/commands/common/commands'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { IExtensionPoint } from 'vs/platform/extensions/common/extensionsRegistry'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ExtensionPointContribution, IExtensionDescription, IExtensionsStatus, IExtensionService, ActivationTimes } from 'vs/platform/extensions/common/extensions'; +import { ExtensionPointContribution, IExtensionDescription, IExtensionsStatus, IExtensionService, ProfileSession } from 'vs/platform/extensions/common/extensions'; import Event, { Emitter } from 'vs/base/common/event'; // --- service instances class MockExtensionService implements IExtensionService { + public _serviceBrand: any; private _onDidRegisterExtensions = new Emitter(); @@ -25,6 +26,8 @@ class MockExtensionService implements IExtensionService { return this._onDidRegisterExtensions.event; } + onDidChangeExtensionsStatus = null; + public activateByEvent(activationEvent: string): TPromise { throw new Error('Not implemented'); } @@ -45,7 +48,7 @@ class MockExtensionService implements IExtensionService { throw new Error('Not implemented'); } - public getExtensionsActivationTimes(): { [id: string]: ActivationTimes; } { + public startExtensionHostProfile(): TPromise { throw new Error('Not implemented'); } @@ -60,6 +63,10 @@ class MockExtensionService implements IExtensionService { public stopExtensionHost(): void { throw new Error('Method not implemented.'); } + + public getExtensionHostInformation(): any { + throw new Error('Method not implemented.'); + } } const extensionService = new MockExtensionService(); diff --git a/src/vs/platform/backup/electron-main/backupMainService.ts b/src/vs/platform/backup/electron-main/backupMainService.ts index b36a581d93c1..9201f86adb91 100644 --- a/src/vs/platform/backup/electron-main/backupMainService.ts +++ b/src/vs/platform/backup/electron-main/backupMainService.ts @@ -309,7 +309,7 @@ export class BackupMainService implements IBackupMainService { fs.mkdirSync(this.backupHome); } - fs.writeFileSync(this.workspacesJsonPath, JSON.stringify(this.backups)); + extfs.writeFileAndFlushSync(this.workspacesJsonPath, JSON.stringify(this.backups)); } catch (ex) { this.logService.error(`Backup: Could not save workspaces.json: ${ex.toString()}`); } diff --git a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts index ae7618cefd32..0fae04bac59c 100644 --- a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts +++ b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts @@ -19,7 +19,7 @@ import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainSe import { IBackupWorkspacesFormat } from 'vs/platform/backup/common/backup'; import { HotExitConfiguration } from 'vs/platform/files/common/files'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { LogMainService } from 'vs/platform/log/common/log'; +import { ConsoleLogMainService } from 'vs/platform/log/common/log'; import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { createHash } from 'crypto'; import { getRandomTestPath } from 'vs/workbench/test/workbenchTestServices'; @@ -34,7 +34,7 @@ suite('BackupMainService', () => { class TestBackupMainService extends BackupMainService { constructor(backupHome: string, backupWorkspacesPath: string, configService: TestConfigurationService) { - super(environmentService, configService, new LogMainService(environmentService)); + super(environmentService, configService, new ConsoleLogMainService(environmentService)); this.backupHome = backupHome; this.workspacesJsonPath = backupWorkspacesPath; diff --git a/src/vs/platform/clipboard/common/clipboardService.ts b/src/vs/platform/clipboard/common/clipboardService.ts index efa0e681a6a7..ea350cacae3e 100644 --- a/src/vs/platform/clipboard/common/clipboardService.ts +++ b/src/vs/platform/clipboard/common/clipboardService.ts @@ -22,4 +22,14 @@ export interface IClipboardService { * Reads the content of the clipboard in plain text */ readText(): string; -} \ No newline at end of file + + /** + * Reads text from the system find pasteboard. + */ + readFindText(): string; + + /** + * Writes text to the system find pasteboard. + */ + writeFindText(text: string): void; +} diff --git a/src/vs/platform/clipboard/electron-browser/clipboardService.ts b/src/vs/platform/clipboard/electron-browser/clipboardService.ts index dfec48de0fa8..d779be48e6cb 100644 --- a/src/vs/platform/clipboard/electron-browser/clipboardService.ts +++ b/src/vs/platform/clipboard/electron-browser/clipboardService.ts @@ -7,6 +7,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { clipboard } from 'electron'; +import * as platform from 'vs/base/common/platform'; export class ClipboardService implements IClipboardService { @@ -19,4 +20,17 @@ export class ClipboardService implements IClipboardService { public readText(): string { return clipboard.readText(); } -} \ No newline at end of file + + public readFindText(): string { + if (platform.isMacintosh) { + return clipboard.readFindText(); + } + return ''; + } + + public writeFindText(text: string): void { + if (platform.isMacintosh) { + clipboard.writeFindText(text); + } + } +} diff --git a/src/vs/platform/commands/common/commandService.ts b/src/vs/platform/commands/common/commandService.ts index 570d8e6df19a..6acdb78a4ef9 100644 --- a/src/vs/platform/commands/common/commandService.ts +++ b/src/vs/platform/commands/common/commandService.ts @@ -11,6 +11,7 @@ import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import Event, { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ILogService } from 'vs/platform/log/common/log'; export class CommandService extends Disposable implements ICommandService { @@ -24,13 +25,16 @@ export class CommandService extends Disposable implements ICommandService { constructor( @IInstantiationService private _instantiationService: IInstantiationService, @IExtensionService private _extensionService: IExtensionService, - @IContextKeyService private _contextKeyService: IContextKeyService + @IContextKeyService private _contextKeyService: IContextKeyService, + @ILogService private _logService: ILogService ) { super(); this._extensionService.whenInstalledExtensionsRegistered().then(value => this._extensionHostIsReady = value); } executeCommand(id: string, ...args: any[]): TPromise { + this._logService.trace('CommandService#executeCommand', id); + // we always send an activation event, but // we don't wait for it when the extension // host didn't yet start and the command is already registered diff --git a/src/vs/platform/commands/test/commandService.test.ts b/src/vs/platform/commands/test/commandService.test.ts index 4d262f8b2d82..78207993cb09 100644 --- a/src/vs/platform/commands/test/commandService.test.ts +++ b/src/vs/platform/commands/test/commandService.test.ts @@ -9,13 +9,14 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { CommandService } from 'vs/platform/commands/common/commandService'; -import { IExtensionService, ExtensionPointContribution, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IExtensionService, ExtensionPointContribution, IExtensionDescription, IExtensionHostInformation, ProfileSession } from 'vs/platform/extensions/common/extensions'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IExtensionPoint } from 'vs/platform/extensions/common/extensionsRegistry'; import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyService'; import { SimpleConfigurationService } from 'vs/editor/standalone/browser/simpleServices'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import Event, { Emitter } from 'vs/base/common/event'; +import { NoopLogService } from 'vs/platform/log/common/log'; class SimpleExtensionService implements IExtensionService { _serviceBrand: any; @@ -23,6 +24,7 @@ class SimpleExtensionService implements IExtensionService { get onDidRegisterExtensions(): Event { return this._onDidRegisterExtensions.event; } + onDidChangeExtensionsStatus = null; activateByEvent(activationEvent: string): TPromise { return this.whenInstalledExtensionsRegistered().then(() => { }); } @@ -35,12 +37,15 @@ class SimpleExtensionService implements IExtensionService { getExtensionsStatus() { return undefined; } - getExtensionsActivationTimes() { + getExtensionHostInformation(): IExtensionHostInformation { return undefined; } getExtensions(): TPromise { return TPromise.wrap([]); } + startExtensionHostProfile(): TPromise { + throw new Error('Not implemented'); + } restartExtensionHost(): void { } startExtensionHost(): void { @@ -70,7 +75,7 @@ suite('CommandService', function () { lastEvent = activationEvent; return super.activateByEvent(activationEvent); } - }, new ContextKeyService(new SimpleConfigurationService())); + }, new ContextKeyService(new SimpleConfigurationService()), new NoopLogService()); return service.executeCommand('foo').then(() => { assert.ok(lastEvent, 'onCommand:foo'); @@ -88,7 +93,7 @@ suite('CommandService', function () { activateByEvent(activationEvent: string): TPromise { return TPromise.wrapError(new Error('bad_activate')); } - }, new ContextKeyService(new SimpleConfigurationService())); + }, new ContextKeyService(new SimpleConfigurationService()), new NoopLogService()); return service.executeCommand('foo').then(() => assert.ok(false), err => { assert.equal(err.message, 'bad_activate'); @@ -104,7 +109,7 @@ suite('CommandService', function () { whenInstalledExtensionsRegistered() { return new TPromise(_resolve => { /*ignore*/ }); } - }, new ContextKeyService(new SimpleConfigurationService())); + }, new ContextKeyService(new SimpleConfigurationService()), new NoopLogService()); service.executeCommand('bar'); assert.equal(callCounter, 1); @@ -121,7 +126,7 @@ suite('CommandService', function () { whenInstalledExtensionsRegistered() { return new TPromise(_resolve => { resolveFunc = _resolve; }); } - }, new ContextKeyService(new SimpleConfigurationService())); + }, new ContextKeyService(new SimpleConfigurationService()), new NoopLogService()); let r = service.executeCommand('bar'); assert.equal(callCounter, 0); @@ -140,7 +145,8 @@ suite('CommandService', function () { let commandService = new CommandService( new InstantiationService(), new SimpleExtensionService(), - contextKeyService + contextKeyService, + new NoopLogService() ); let counter = 0; diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 1b7623c2d5e9..033f45017662 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -51,6 +51,11 @@ export interface IConfigurationRegistry { */ getConfigurationProperties(): { [qualifiedKey: string]: IConfigurationPropertySchema }; + /** + * Returns all excluded configurations settings of all configuration nodes contributed to this registry. + */ + getExcludedConfigurationProperties(): { [qualifiedKey: string]: IConfigurationPropertySchema }; + /** * Register the identifiers for editor configurations */ @@ -67,6 +72,7 @@ export interface IConfigurationPropertySchema extends IJSONSchema { isExecutable?: boolean; scope?: ConfigurationScope; notMultiRootAdopted?: boolean; + included?: boolean; } export interface IConfigurationNode { @@ -97,6 +103,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { private configurationContributors: IConfigurationNode[]; private configurationProperties: { [qualifiedKey: string]: IJSONSchema }; + private excludedConfigurationProperties: { [qualifiedKey: string]: IJSONSchema }; private editorConfigurationSchema: IJSONSchema; private overrideIdentifiers: string[] = []; private overridePropertyPattern: string; @@ -108,6 +115,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { this.configurationContributors = []; this.editorConfigurationSchema = { properties: {}, patternProperties: {}, additionalProperties: false, errorMessage: 'Unknown editor configuration setting' }; this.configurationProperties = {}; + this.excludedConfigurationProperties = {}; this.computeOverridePropertyPattern(); contributionRegistry.registerSchema(editorConfigurationSchemaId, this.editorConfigurationSchema); @@ -191,8 +199,17 @@ class ConfigurationRegistry implements IConfigurationRegistry { if (property.scope === void 0) { property.scope = scope; } - // add to properties map - this.configurationProperties[key] = properties[key]; + + // Add to properties maps + // Property is included by default if 'included' is unspecified + if (properties[key].hasOwnProperty('included') && !properties[key].included) { + this.excludedConfigurationProperties[key] = properties[key]; + delete properties[key]; + continue; + } else { + this.configurationProperties[key] = properties[key]; + } + propertyKeys.push(key); } } @@ -213,6 +230,10 @@ class ConfigurationRegistry implements IConfigurationRegistry { return this.configurationProperties; } + getExcludedConfigurationProperties(): { [qualifiedKey: string]: IConfigurationPropertySchema } { + return this.excludedConfigurationProperties; + } + private registerJSONConfiguration(configuration: IConfigurationNode) { function register(configuration: IConfigurationNode) { let properties = configuration.properties; diff --git a/src/vs/platform/contextkey/browser/contextKeyService.ts b/src/vs/platform/contextkey/browser/contextKeyService.ts index ea163d70cc62..a0dd9ebd4a1c 100644 --- a/src/vs/platform/contextkey/browser/contextKeyService.ts +++ b/src/vs/platform/contextkey/browser/contextKeyService.ts @@ -235,7 +235,11 @@ export abstract class AbstractContextKeyService implements IContextKeyService { } public setContext(key: string, value: any): void { - if (this.getContextValuesContainer(this._myContextId).setValue(key, value)) { + const myContext = this.getContextValuesContainer(this._myContextId); + if (!myContext) { + return; + } + if (myContext.setValue(key, value)) { this._onDidChangeContextKey.fire(key); } } diff --git a/src/vs/platform/editor/common/editor.ts b/src/vs/platform/editor/common/editor.ts index be03bb996778..98d63a1977b3 100644 --- a/src/vs/platform/editor/common/editor.ts +++ b/src/vs/platform/editor/common/editor.ts @@ -192,6 +192,19 @@ export enum Verbosity { LONG } +export interface IRevertOptions { + + /** + * Forces to load the contents of the editor again even if the editor is not dirty. + */ + force?: boolean; + + /** + * A soft revert will clear dirty state of an editor but will not attempt to load it. + */ + soft?: boolean; +} + export interface IEditorInput extends IDisposable { /** @@ -232,7 +245,7 @@ export interface IEditorInput extends IDisposable { /** * Reverts this input. */ - revert(): TPromise; + revert(options?: IRevertOptions): TPromise; /** * Returns if the other object matches this input. diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 8783ac3a2ce1..932af88fa1e3 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -4,12 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { LogLevel } from 'vs/platform/log/common/log'; export interface ParsedArgs { [arg: string]: any; _: string[]; help?: boolean; version?: boolean; + status?: boolean; wait?: boolean; waitMarkerFilePath?: string; diff?: boolean; @@ -22,7 +24,9 @@ export interface ParsedArgs { 'user-data-dir'?: string; performance?: boolean; 'prof-startup'?: string; + 'prof-startup-prefix'?: string; verbose?: boolean; + log?: string; logExtensionHostCommunication?: boolean; 'disable-extensions'?: boolean; 'extensions-dir'?: string; @@ -40,12 +44,14 @@ export interface ParsedArgs { 'enable-proposed-api'?: string | string[]; 'open-url'?: string | string[]; 'skip-getting-started'?: boolean; + 'skip-release-notes'?: boolean; 'sticky-quickopen'?: boolean; 'disable-telemetry'?: boolean; 'export-default-configuration'?: string; 'install-source'?: string; 'disable-updates'?: string; 'disable-crash-reporter'?: string; + 'skip-add-to-recently-opened'?: boolean; } export const IEnvironmentService = createDecorator('environmentService'); @@ -75,7 +81,7 @@ export interface IEnvironmentService { appSettingsHome: string; appSettingsPath: string; appKeybindingsPath: string; - machineUUID: string; + settingsSearchBuildId: number; settingsSearchUrl: string; @@ -97,19 +103,26 @@ export interface IEnvironmentService { logExtensionHostCommunication: boolean; isBuilt: boolean; - verbose: boolean; wait: boolean; + status: boolean; performance: boolean; - profileStartup: { prefix: string, dir: string } | undefined; + + // logging + logsPath: string; + verbose: boolean; + logLevel: LogLevel; skipGettingStarted: boolean | undefined; + skipReleaseNotes: boolean | undefined; + + skipAddToRecentlyOpened: boolean; mainIPCHandle: string; sharedIPCHandle: string; nodeCachedDataDir: string; - installSource: string; + installSourcePath: string; disableUpdates: boolean; disableCrashReporter: boolean; } diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index d276878d7880..5de73213eff9 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -48,10 +48,13 @@ const options: minimist.Opts = { 'show-versions', 'nolazy', 'skip-getting-started', + 'skip-release-notes', 'sticky-quickopen', 'disable-telemetry', 'disable-updates', - 'disable-crash-reporter' + 'disable-crash-reporter', + 'skip-add-to-recently-opened', + 'status' ], alias: { add: 'a', @@ -60,6 +63,7 @@ const options: minimist.Opts = { wait: 'w', diff: 'd', goto: 'g', + status: 's', 'new-window': 'n', 'reuse-window': 'r', performance: 'p', @@ -135,6 +139,7 @@ export const optionsHelp: { [name: string]: string; } = { '--inspect-brk-extensions': localize('inspect-brk-extensions', "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection uri."), '-r, --reuse-window': localize('reuseWindow', "Force opening a file or folder in the last active window."), '--user-data-dir ': localize('userDataDir', "Specifies the directory that user data is kept in, useful when running as root."), + '--log ': localize('log', "Log level to use. Default is 'info'. Allowed values are 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'."), '--verbose': localize('verbose', "Print verbose output (implies --wait)."), '-w, --wait': localize('wait', "Wait for the files to be closed before returning."), '--extensions-dir ': localize('extensionHomePath', "Set the root path for extensions."), @@ -145,6 +150,7 @@ export const optionsHelp: { [name: string]: string; } = { '--enable-proposed-api ': localize('experimentalApis', "Enables proposed api features for an extension."), '--disable-extensions': localize('disableExtensions', "Disable all installed extensions."), '--disable-gpu': localize('disableGPU', "Disable GPU hardware acceleration."), + '-s, --status': localize('status', "Print process usage and diagnostics information."), '-v, --version': localize('version', "Print version."), '-h, --help': localize('help', "Print usage.") }; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index d674d6af54f7..4e7728abac0b 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -8,12 +8,12 @@ import * as crypto from 'crypto'; import * as paths from 'vs/base/node/paths'; import * as os from 'os'; import * as path from 'path'; -import * as fs from 'fs'; import URI from 'vs/base/common/uri'; -import { generateUuid, isUUID } from 'vs/base/common/uuid'; import { memoize } from 'vs/base/common/decorators'; import pkg from 'vs/platform/node/package'; import product from 'vs/platform/node/product'; +import { LogLevel } from 'vs/platform/log/common/log'; +import { toLocalISOString } from 'vs/base/common/date'; // Read this before there's any chance it is overwritten // Related to https://github.com/Microsoft/vscode/issues/30624 @@ -40,10 +40,6 @@ function getIPCHandle(userDataPath: string, type: string): string { } } -export function getInstallSourcePath(userDataPath: string): string { - return path.join(userDataPath, 'installSource'); -} - export class EnvironmentService implements IEnvironmentService { _serviceBrand: any; @@ -55,6 +51,8 @@ export class EnvironmentService implements IEnvironmentService { get execPath(): string { return this._execPath; } + readonly logsPath: string; + @memoize get userHome(): string { return os.homedir(); } @@ -92,6 +90,9 @@ export class EnvironmentService implements IEnvironmentService { @memoize get workspacesHome(): string { return path.join(this.userDataPath, 'Workspaces'); } + @memoize + get installSourcePath(): string { return path.join(this.userDataPath, 'installSource'); } + @memoize get extensionsPath(): string { return parsePathArg(this._args['extensions-dir'], process) || process.env['VSCODE_EXTENSIONS'] || path.join(this.userHome, product.dataFolderName, 'extensions'); } @@ -105,6 +106,10 @@ export class EnvironmentService implements IEnvironmentService { get skipGettingStarted(): boolean { return this._args['skip-getting-started']; } + get skipReleaseNotes(): boolean { return this._args['skip-release-notes']; } + + get skipAddToRecentlyOpened(): boolean { return this._args['skip-add-to-recently-opened']; } + @memoize get debugExtensionHost(): IExtensionHostDebugParams { return parseExtensionHostPort(this._args, this.isBuilt); } @@ -113,22 +118,39 @@ export class EnvironmentService implements IEnvironmentService { get isBuilt(): boolean { return !process.env['VSCODE_DEV']; } get verbose(): boolean { return this._args.verbose; } + + @memoize + get logLevel(): LogLevel { + if (this.verbose) { + return LogLevel.Trace; + } + if (typeof this._args.log === 'string') { + const logLevel = this._args.log.toLowerCase(); + switch (logLevel) { + case 'trace': + return LogLevel.Trace; + case 'debug': + return LogLevel.Debug; + case 'info': + return LogLevel.Info; + case 'warn': + return LogLevel.Warning; + case 'error': + return LogLevel.Error; + case 'critical': + return LogLevel.Critical; + case 'off': + return LogLevel.Off; + } + } + return LogLevel.Info; + } + get wait(): boolean { return this._args.wait; } get logExtensionHostCommunication(): boolean { return this._args.logExtensionHostCommunication; } get performance(): boolean { return this._args.performance; } - - @memoize - get profileStartup(): { prefix: string, dir: string } | undefined { - if (this._args['prof-startup']) { - return { - prefix: process.env.VSCODE_PROFILES_PREFIX, - dir: os.homedir() - }; - } else { - return undefined; - } - } + get status(): boolean { return this._args.status; } @memoize get mainIPCHandle(): string { return getIPCHandle(this.userDataPath, 'main'); } @@ -142,34 +164,13 @@ export class EnvironmentService implements IEnvironmentService { get disableUpdates(): boolean { return !!this._args['disable-updates']; } get disableCrashReporter(): boolean { return !!this._args['disable-crash-reporter']; } - readonly machineUUID: string; - - readonly installSource: string; - constructor(private _args: ParsedArgs, private _execPath: string) { - const machineIdPath = path.join(this.userDataPath, 'machineid'); - - try { - this.machineUUID = fs.readFileSync(machineIdPath, 'utf8'); - - if (!isUUID(this.machineUUID)) { - throw new Error('Not a UUID'); - } - } catch (err) { - this.machineUUID = generateUuid(); - - try { - fs.writeFileSync(machineIdPath, this.machineUUID, 'utf8'); - } catch (err) { - // noop - } + if (!process.env['VSCODE_LOGS']) { + const key = toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, ''); + process.env['VSCODE_LOGS'] = path.join(this.userDataPath, 'logs', key); } - try { - this.installSource = fs.readFileSync(getInstallSourcePath(this.userDataPath), 'utf8').slice(0, 30); - } catch (err) { - this.installSource = ''; - } + this.logsPath = process.env['VSCODE_LOGS']; } } diff --git a/src/vs/platform/environment/test/node/environmentService.test.ts b/src/vs/platform/environment/test/node/environmentService.test.ts index 792a248e70cf..928f8b5b2363 100644 --- a/src/vs/platform/environment/test/node/environmentService.test.ts +++ b/src/vs/platform/environment/test/node/environmentService.test.ts @@ -41,4 +41,4 @@ suite('EnvironmentService', () => { assert.equal(parse(['--user-data-dir', './dir'], { cwd: () => '/foo', env: { 'VSCODE_CWD': '/bar' } }), path.resolve('/bar/dir'), 'should use VSCODE_CWD as the cwd when --user-data-dir is specified'); }); -}); \ No newline at end of file +}); diff --git a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts index 455a941edc4b..1f475504c98e 100644 --- a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts +++ b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts @@ -9,7 +9,7 @@ import { distinct, coalesce } from 'vs/base/common/arrays'; import Event, { Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IExtensionManagementService, DidUninstallExtensionEvent, IExtensionEnablementService, IExtensionIdentifier, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { adoptToGalleryExtensionId, getIdAndVersionFromLocalExtensionId, areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { adoptToGalleryExtensionId, getIdFromLocalExtensionId, areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -59,6 +59,9 @@ export class ExtensionEnablementService implements IExtensionEnablementService { } getEnablementState(identifier: IExtensionIdentifier): EnablementState { + if (this.environmentService.disableExtensions) { + return EnablementState.Disabled; + } if (this.hasWorkspace) { if (this._getEnabledExtensions(StorageScope.WORKSPACE).filter(e => areSameExtensions(e, identifier))[0]) { return EnablementState.WorkspaceEnabled; @@ -258,7 +261,7 @@ export class ExtensionEnablementService implements IExtensionEnablementService { private _onDidUninstallExtension({ identifier, error }: DidUninstallExtensionEvent): void { if (!error) { - const id = getIdAndVersionFromLocalExtensionId(identifier.id).id; + const id = getIdFromLocalExtensionId(identifier.id); if (id) { const extension = { id, uuid: identifier.uuid }; this._removeFromDisabledExtensions(extension, StorageScope.WORKSPACE); diff --git a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts index 94872199ae5f..3b60c27a3678 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts @@ -25,21 +25,41 @@ export function getGalleryExtensionIdFromLocal(local: ILocalExtension): string { return getGalleryExtensionId(local.manifest.publisher, local.manifest.name); } -export function getIdAndVersionFromLocalExtensionId(localExtensionId: string): { id: string, version: string } { - const matches = /^([^.]+\..+)-(\d+\.\d+\.\d+)$/.exec(localExtensionId); - if (matches && matches[1] && matches[2]) { - return { id: adoptToGalleryExtensionId(matches[1]), version: matches[2] }; +export const LOCAL_EXTENSION_ID_REGEX = /^([^.]+\..+)-(\d+\.\d+\.\d+(-.*)?)$/; + +export function getIdFromLocalExtensionId(localExtensionId: string): string { + const matches = LOCAL_EXTENSION_ID_REGEX.exec(localExtensionId); + if (matches && matches[1]) { + return adoptToGalleryExtensionId(matches[1]); } - return { - id: adoptToGalleryExtensionId(localExtensionId), - version: null - }; + return adoptToGalleryExtensionId(localExtensionId); } export function adoptToGalleryExtensionId(id: string): string { return id.replace(EXTENSION_IDENTIFIER_REGEX, (match, publisher: string, name: string) => getGalleryExtensionId(publisher, name)); } +export function groupByExtension(extensions: T[], getExtensionIdentifier: (t: T) => IExtensionIdentifier): T[][] { + const byExtension: T[][] = []; + const findGroup = extension => { + for (const group of byExtension) { + if (group.some(e => areSameExtensions(getExtensionIdentifier(e), getExtensionIdentifier(extension)))) { + return group; + } + } + return null; + }; + for (const extension of extensions) { + const group = findGroup(extension); + if (group) { + group.push(extension); + } else { + byExtension.push([extension]); + } + } + return byExtension; +} + export function getLocalExtensionTelemetryData(extension: ILocalExtension): any { return { id: getGalleryExtensionIdFromLocal(extension), diff --git a/src/vs/platform/extensionManagement/common/extensionNls.ts b/src/vs/platform/extensionManagement/common/extensionNls.ts index 517cf9c1bcbf..ae4df2ad9897 100644 --- a/src/vs/platform/extensionManagement/common/extensionNls.ts +++ b/src/vs/platform/extensionManagement/common/extensionNls.ts @@ -8,7 +8,7 @@ import { cloneAndChange } from 'vs/base/common/objects'; import { IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; -const nlsRegex = /^%([\w\d.]+)%$/i; +const nlsRegex = /^%([\w\d.-]+)%$/i; export interface ITranslations { [key: string]: string; diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 9256639c0e42..e79adfe2cbce 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -7,7 +7,6 @@ import { localize } from 'vs/nls'; import { tmpdir } from 'os'; import * as path from 'path'; import { TPromise } from 'vs/base/common/winjs.base'; -import * as uuid from 'vs/base/common/uuid'; import { distinct } from 'vs/base/common/arrays'; import { getErrorMessage, isPromiseCanceledError } from 'vs/base/common/errors'; import { StatisticType, IGalleryExtension, IExtensionGalleryService, IGalleryExtensionAsset, IQueryOptions, SortBy, SortOrder, IExtensionManifest, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -21,6 +20,9 @@ import pkg from 'vs/platform/node/package'; import product from 'vs/platform/node/product'; import { isVersionValid } from 'vs/platform/extensions/node/extensionValidator'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { readFile } from 'vs/base/node/pfs'; +import { writeFileAndFlushSync } from 'vs/base/node/extfs'; +import { generateUuid, isUUID } from 'vs/base/common/uuid'; interface IRawGalleryExtensionFile { assetType: string; @@ -313,7 +315,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { private extensionsGalleryUrl: string; - private readonly commonHTTPHeaders: { [key: string]: string; }; + private readonly commonHeadersPromise: TPromise<{ [key: string]: string; }>; constructor( @IRequestService private requestService: IRequestService, @@ -322,11 +324,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { ) { const config = product.extensionsGallery; this.extensionsGalleryUrl = config && config.serviceUrl; - this.commonHTTPHeaders = { - 'X-Market-Client-Id': `VSCode ${pkg.version}`, - 'User-Agent': `VSCode ${pkg.version}`, - 'X-Market-User-Id': this.environmentService.machineUUID - }; + this.commonHeadersPromise = resolveMarketplaceHeaders(this.environmentService); } private api(path = ''): string { @@ -412,33 +410,34 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } private queryGallery(query: Query): TPromise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> { - const commonHeaders = this.commonHTTPHeaders; - const data = JSON.stringify(query.raw); - const headers = assign({}, commonHeaders, { - 'Content-Type': 'application/json', - 'Accept': 'application/json;api-version=3.0-preview.1', - 'Accept-Encoding': 'gzip', - 'Content-Length': data.length - }); + return this.commonHeadersPromise.then(commonHeaders => { + const data = JSON.stringify(query.raw); + const headers = assign({}, commonHeaders, { + 'Content-Type': 'application/json', + 'Accept': 'application/json;api-version=3.0-preview.1', + 'Accept-Encoding': 'gzip', + 'Content-Length': data.length + }); - return this.requestService.request({ - type: 'POST', - url: this.api('/extensionquery'), - data, - headers - }).then(context => { + return this.requestService.request({ + type: 'POST', + url: this.api('/extensionquery'), + data, + headers + }).then(context => { - if (context.res.statusCode >= 400 && context.res.statusCode < 500) { - return { galleryExtensions: [], total: 0 }; - } + if (context.res.statusCode >= 400 && context.res.statusCode < 500) { + return { galleryExtensions: [], total: 0 }; + } - return asJson(context).then(result => { - const r = result.results[0]; - const galleryExtensions = r.extensions; - const resultCount = r.resultMetadata && r.resultMetadata.filter(m => m.metadataType === 'ResultCount')[0]; - const total = resultCount && resultCount.metadataItems.filter(i => i.name === 'TotalCount')[0].count || 0; + return asJson(context).then(result => { + const r = result.results[0]; + const galleryExtensions = r.extensions; + const resultCount = r.resultMetadata && r.resultMetadata.filter(m => m.metadataType === 'ResultCount')[0]; + const total = resultCount && resultCount.metadataItems.filter(i => i.name === 'TotalCount')[0].count || 0; - return { galleryExtensions, total }; + return { galleryExtensions, total }; + }); }); }); } @@ -448,35 +447,41 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return TPromise.as(null); } - const headers = { ...this.commonHTTPHeaders, Accept: '*/*;api-version=4.0-preview.1' }; + return this.commonHeadersPromise.then(commonHeaders => { + const headers = { ...commonHeaders, Accept: '*/*;api-version=4.0-preview.1' }; - return this.requestService.request({ - type: 'POST', - url: this.api(`/publishers/${publisher}/extensions/${name}/${version}/stats?statType=${type}`), - headers - }).then(null, () => null); + return this.requestService.request({ + type: 'POST', + url: this.api(`/publishers/${publisher}/extensions/${name}/${version}/stats?statType=${type}`), + headers + }).then(null, () => null); + }); } download(extension: IGalleryExtension): TPromise { - return this.loadCompatibleVersion(extension).then(extension => { - const zipPath = path.join(tmpdir(), uuid.generateUuid()); - const data = getGalleryExtensionTelemetryData(extension); - const startTime = new Date().getTime(); - /* __GDPR__ - "galleryService:downloadVSIX" : { - "duration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "${include}": [ - "${GalleryExtensionTelemetryData}" - ] + return this.loadCompatibleVersion(extension) + .then(extension => { + if (!extension) { + return TPromise.wrapError(new Error(localize('notCompatibleDownload', "Unable to download because the extension compatible with current version '{0}' of VS Code is not found.", pkg.version))); } - */ - const log = (duration: number) => this.telemetryService.publicLog('galleryService:downloadVSIX', assign(data, { duration })); + const zipPath = path.join(tmpdir(), generateUuid()); + const data = getGalleryExtensionTelemetryData(extension); + const startTime = new Date().getTime(); + /* __GDPR__ + "galleryService:downloadVSIX" : { + "duration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, + "${include}": [ + "${GalleryExtensionTelemetryData}" + ] + } + */ + const log = (duration: number) => this.telemetryService.publicLog('galleryService:downloadVSIX', assign(data, { duration })); - return this.getAsset(extension.assets.download) - .then(context => download(zipPath, context)) - .then(() => log(new Date().getTime() - startTime)) - .then(() => zipPath); - }); + return this.getAsset(extension.assets.download) + .then(context => download(zipPath, context)) + .then(() => log(new Date().getTime() - startTime)) + .then(() => zipPath); + }); } getReadme(extension: IGalleryExtension): TPromise { @@ -512,22 +517,26 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withAssetTypes(AssetType.Manifest, AssetType.VSIX) .withFilter(FilterType.ExtensionId, extension.identifier.uuid); - return this.queryGallery(query).then(({ galleryExtensions }) => { - const [rawExtension] = galleryExtensions; + return this.queryGallery(query) + .then(({ galleryExtensions }) => { + const [rawExtension] = galleryExtensions; - if (!rawExtension) { - return TPromise.wrapError(new Error(localize('notFound', "Extension not found"))); - } + if (!rawExtension) { + return null; + } - return this.getLastValidExtensionVersion(rawExtension, rawExtension.versions) - .then(rawVersion => { - extension.properties.dependencies = getDependencies(rawVersion); - extension.properties.engine = getEngine(rawVersion); - extension.assets.download = getVersionAsset(rawVersion, AssetType.VSIX); - extension.version = rawVersion.version; - return extension; - }); - }); + return this.getLastValidExtensionVersion(rawExtension, rawExtension.versions) + .then(rawVersion => { + if (rawVersion) { + extension.properties.dependencies = getDependencies(rawVersion); + extension.properties.engine = getEngine(rawVersion); + extension.assets.download = getVersionAsset(rawVersion, AssetType.VSIX); + extension.version = rawVersion.version; + return extension; + } + return null; + }); + }); } private loadDependencies(extensionNames: string[]): TPromise { @@ -583,47 +592,25 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } private getAsset(asset: IGalleryExtensionAsset, options: IRequestOptions = {}): TPromise { - const baseOptions = { type: 'GET' }; - const headers = assign({}, this.commonHTTPHeaders, options.headers || {}); - options = assign({}, options, baseOptions, { headers }); + return this.commonHeadersPromise.then(commonHeaders => { + const baseOptions = { type: 'GET' }; + const headers = assign({}, commonHeaders, options.headers || {}); + options = assign({}, options, baseOptions, { headers }); - const url = asset.uri; - const fallbackUrl = asset.fallbackUri; - const firstOptions = assign({}, options, { url }); + const url = asset.uri; + const fallbackUrl = asset.fallbackUri; + const firstOptions = assign({}, options, { url }); - return this.requestService.request(firstOptions) - .then(context => { - if (context.res.statusCode === 200) { - return TPromise.as(context); - } - - return asText(context) - .then(message => TPromise.wrapError(new Error(`Expected 200, got back ${context.res.statusCode} instead.\n\n${message}`))); - }) - .then(null, err => { - if (isPromiseCanceledError(err)) { - return TPromise.wrapError(err); - } - - const message = getErrorMessage(err); - /* __GDPR__ - "galleryService:requestError" : { - "url" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "cdn": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + return this.requestService.request(firstOptions) + .then(context => { + if (context.res.statusCode === 200) { + return TPromise.as(context); } - */ - this.telemetryService.publicLog('galleryService:requestError', { url, cdn: true, message }); - /* __GDPR__ - "galleryService:cdnFallback" : { - "url" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('galleryService:cdnFallback', { url, message }); - const fallbackOptions = assign({}, options, { url: fallbackUrl }); - return this.requestService.request(fallbackOptions).then(null, err => { + return asText(context) + .then(message => TPromise.wrapError(new Error(`Expected 200, got back ${context.res.statusCode} instead.\n\n${message}`))); + }) + .then(null, err => { if (isPromiseCanceledError(err)) { return TPromise.wrapError(err); } @@ -636,10 +623,34 @@ export class ExtensionGalleryService implements IExtensionGalleryService { "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ - this.telemetryService.publicLog('galleryService:requestError', { url: fallbackUrl, cdn: false, message }); - return TPromise.wrapError(err); + this.telemetryService.publicLog('galleryService:requestError', { url, cdn: true, message }); + /* __GDPR__ + "galleryService:cdnFallback" : { + "url" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this.telemetryService.publicLog('galleryService:cdnFallback', { url, message }); + + const fallbackOptions = assign({}, options, { url: fallbackUrl }); + return this.requestService.request(fallbackOptions).then(null, err => { + if (isPromiseCanceledError(err)) { + return TPromise.wrapError(err); + } + + const message = getErrorMessage(err); + /* __GDPR__ + "galleryService:requestError" : { + "url" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "cdn": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this.telemetryService.publicLog('galleryService:requestError', { url: fallbackUrl, cdn: false, message }); + return TPromise.wrapError(err); + }); }); - }); + }); } private getLastValidExtensionVersion(extension: IRawGalleryExtension, versions: IRawGalleryExtensionVersion[]): TPromise { @@ -665,7 +676,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { private getLastValidExtensionVersionReccursively(extension: IRawGalleryExtension, versions: IRawGalleryExtensionVersion[]): TPromise { if (!versions.length) { - return TPromise.wrapError(new Error(localize('noCompatible', "Couldn't find a compatible version of {0} with this version of Code.", extension.displayName || extension.extensionName))); + return null; } const version = versions[0]; @@ -701,3 +712,33 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return false; } } + +export function resolveMarketplaceHeaders(environmentService: IEnvironmentService): TPromise<{ [key: string]: string; }> { + const marketplaceMachineIdFile = path.join(environmentService.userDataPath, 'machineid'); + + return readFile(marketplaceMachineIdFile, 'utf8').then(contents => { + if (isUUID(contents)) { + return contents; + } + + return TPromise.wrap(null); // invalid marketplace UUID + }, error => { + return TPromise.wrap(null); // error reading ID file + }).then(uuid => { + if (!uuid) { + uuid = generateUuid(); + + try { + writeFileAndFlushSync(marketplaceMachineIdFile, uuid); + } catch (error) { + //noop + } + } + + return { + 'X-Market-Client-Id': `VSCode ${pkg.version}`, + 'User-Agent': `VSCode ${pkg.version}`, + 'X-Market-User-Id': uuid + }; + }); +} \ No newline at end of file diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index d02a3484cfbb..0a8bac15123f 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -21,20 +21,37 @@ import { StatisticType, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { getGalleryExtensionIdFromLocal, getIdAndVersionFromLocalExtensionId, adoptToGalleryExtensionId, areSameExtensions, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { getGalleryExtensionIdFromLocal, adoptToGalleryExtensionId, areSameExtensions, getGalleryExtensionId, groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { localizeManifest } from '../common/extensionNls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { Limiter } from 'vs/base/common/async'; import Event, { Emitter } from 'vs/base/common/event'; import * as semver from 'semver'; -import { groupBy, values } from 'vs/base/common/collections'; import URI from 'vs/base/common/uri'; import { IChoiceService, Severity } from 'vs/platform/message/common/message'; +import pkg from 'vs/platform/node/package'; +import { isMacintosh } from 'vs/base/common/platform'; +import { MANIFEST_CACHE_FOLDER, USER_MANIFEST_CACHE_FILE } from 'vs/platform/extensions/common/extensions'; +import { ILogService } from 'vs/platform/log/common/log'; const SystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', 'extensions')); -const INSTALL_ERROR_OBSOLETE = 'obsolete'; +const ERROR_SCANNING_SYS_EXTENSIONS = 'scanningSystem'; +const ERROR_SCANNING_USER_EXTENSIONS = 'scanningUser'; +const INSTALL_ERROR_UNSET_UNINSTALLED = 'unsetUninstalled'; +const INSTALL_ERROR_INCOMPATIBLE = 'incompatible'; +const INSTALL_ERROR_DOWNLOADING = 'downloading'; +const INSTALL_ERROR_VALIDATING = 'validating'; const INSTALL_ERROR_GALLERY = 'gallery'; const INSTALL_ERROR_LOCAL = 'local'; +const INSTALL_ERROR_EXTRACTING = 'extracting'; +const INSTALL_ERROR_DELETING = 'deleting'; +const INSTALL_ERROR_UNKNOWN = 'unknown'; + +export class ExtensionManagementError extends Error { + constructor(message: string, readonly code: string) { + super(message); + } +} function parseManifest(raw: string): TPromise<{ manifest: IExtensionManifest; metadata: IGalleryMetadata; }> { return new TPromise((c, e) => { @@ -76,7 +93,6 @@ interface InstallableExtension { zipPath: string; id: string; metadata?: IGalleryMetadata; - current?: ILocalExtension; } export class ExtensionManagementService implements IExtensionManagementService { @@ -84,8 +100,9 @@ export class ExtensionManagementService implements IExtensionManagementService { _serviceBrand: any; private extensionsPath: string; - private obsoletePath: string; - private obsoleteFileLimiter: Limiter; + private uninstalledPath: string; + private userDataPath: string; + private uninstalledFileLimiter: Limiter; private disposables: IDisposable[] = []; private _onInstallExtension = new Emitter(); @@ -103,32 +120,83 @@ export class ExtensionManagementService implements IExtensionManagementService { constructor( @IEnvironmentService environmentService: IEnvironmentService, @IChoiceService private choiceService: IChoiceService, - @IExtensionGalleryService private galleryService: IExtensionGalleryService + @IExtensionGalleryService private galleryService: IExtensionGalleryService, + @ILogService private logService: ILogService, ) { this.extensionsPath = environmentService.extensionsPath; - this.obsoletePath = path.join(this.extensionsPath, '.obsolete'); - this.obsoleteFileLimiter = new Limiter(1); + this.uninstalledPath = path.join(this.extensionsPath, '.obsolete'); + this.userDataPath = environmentService.userDataPath; + this.uninstalledFileLimiter = new Limiter(1); + } + + private deleteExtensionsManifestCache(): void { + const cacheFolder = path.join(this.userDataPath, MANIFEST_CACHE_FOLDER); + const cacheFile = path.join(cacheFolder, USER_MANIFEST_CACHE_FILE); + + pfs.del(cacheFile).done(() => { }, () => { }); } install(zipPath: string): TPromise { + this.deleteExtensionsManifestCache(); + zipPath = path.resolve(zipPath); return validateLocalExtension(zipPath) - .then(manifest => { + .then(manifest => { const identifier = { id: getLocalExtensionIdFromManifest(manifest) }; + return this.unsetUninstalledAndRemove(identifier.id) + .then( + () => this.checkOutdated(manifest) + .then(validated => { + if (validated) { + this.logService.info('Installing the extension:', identifier.id); + this._onInstallExtension.fire({ identifier, zipPath }); + return this.getMetadata(getGalleryExtensionId(manifest.publisher, manifest.name)) + .then( + metadata => this.installFromZipPath(identifier, zipPath, metadata, manifest), + error => this.installFromZipPath(identifier, zipPath, null, manifest)) + .then(() => this.logService.info('Successfully installed the extension:', identifier.id), e => this.logService.error('Failed to install the extension:', identifier.id, e.message)); + } + return null; + }), + e => TPromise.wrapError(new Error(nls.localize('restartCode', "Please restart Code before reinstalling {0}.", manifest.displayName || manifest.name)))); + }); + } - return this.isObsolete(identifier.id).then(isObsolete => { - if (isObsolete) { - return TPromise.wrapError(new Error(nls.localize('restartCodeLocal', "Please restart Code before reinstalling {0}.", manifest.displayName || manifest.name))); - } + private unsetUninstalledAndRemove(id: string): TPromise { + return this.isUninstalled(id) + .then(isUninstalled => { + if (isUninstalled) { + this.logService.trace('Removing the extension:', id); + const extensionPath = path.join(this.extensionsPath, id); + return pfs.rimraf(extensionPath) + .then(() => this.unsetUninstalled(id)) + .then(() => this.logService.info('Reomved the extension:', id)); + } + return null; + }); + } - this._onInstallExtension.fire({ identifier, zipPath }); - - return this.getMetadata(getGalleryExtensionId(manifest.publisher, manifest.name)) - .then( - metadata => this.installFromZipPath(identifier, zipPath, metadata, manifest), - error => this.installFromZipPath(identifier, zipPath, null, manifest)); - }); + private checkOutdated(manifest: IExtensionManifest): TPromise { + const extensionIdentifier = { id: getGalleryExtensionId(manifest.publisher, manifest.name) }; + return this.getInstalled(LocalExtensionType.User) + .then(installedExtensions => { + const newer = installedExtensions.filter(local => areSameExtensions(extensionIdentifier, { id: getGalleryExtensionIdFromLocal(local) }) && semver.gt(local.manifest.version, manifest.version))[0]; + if (newer) { + const message = nls.localize('installingOutdatedExtension', "A newer version of this extension is already installed. Would you like to override this with the older version?"); + const options = [ + nls.localize('override', "Override"), + nls.localize('cancel', "Cancel") + ]; + return this.choiceService.choose(Severity.Info, message, options, 1, true) + .then(value => { + if (value === 0) { + return this.uninstall(newer, true).then(() => true); + } + return TPromise.wrapError(errors.canceled()); + }); + } + return true; }); } @@ -139,7 +207,7 @@ export class ExtensionManagementService implements IExtensionManagementService { return this.getDependenciesToInstall(local.manifest.extensionDependencies) .then(dependenciesToInstall => this.downloadAndInstallExtensions(metadata ? dependenciesToInstall.filter(d => d.identifier.uuid !== metadata.id) : dependenciesToInstall)) .then(() => local, error => { - this.uninstallExtension(local.identifier); + this.uninstallExtension(local); return TPromise.wrapError(error); }); } @@ -152,95 +220,117 @@ export class ExtensionManagementService implements IExtensionManagementService { } installFromGallery(extension: IGalleryExtension): TPromise { - return this.prepareAndCollectExtensionsToInstall(extension) - .then(extensionsToInstall => this.downloadAndInstallExtensions(extensionsToInstall) - .then(local => this.onDidInstallExtensions(extensionsToInstall, local))); - } + this.deleteExtensionsManifestCache(); - private prepareAndCollectExtensionsToInstall(extension: IGalleryExtension): TPromise { this.onInstallExtensions([extension]); return this.collectExtensionsToInstall(extension) .then( - extensionsToInstall => this.checkForObsolete(extensionsToInstall) - .then( - extensionsToInstall => { - if (extensionsToInstall.length > 1) { - this.onInstallExtensions(extensionsToInstall.slice(1)); - } - return extensionsToInstall; - }, - error => this.onDidInstallExtensions([extension], null, INSTALL_ERROR_OBSOLETE, error) - ), - error => this.onDidInstallExtensions([extension], null, INSTALL_ERROR_GALLERY, error) - ); - } - - private downloadAndInstallExtensions(extensions: IGalleryExtension[]): TPromise { - return this.getInstalled(LocalExtensionType.User) - .then(installed => TPromise.join(extensions.map(extensionToInstall => this.downloadInstallableExtension(extensionToInstall, installed))) - .then( - installableExtensions => TPromise.join(installableExtensions.map(installableExtension => this.installExtension(installableExtension))) - .then(null, error => this.rollback(extensions).then(() => this.onDidInstallExtensions(extensions, null, INSTALL_ERROR_LOCAL, error))), - error => this.onDidInstallExtensions(extensions, null, INSTALL_ERROR_GALLERY, error))); + extensionsToInstall => { + if (extensionsToInstall.length > 1) { + this.onInstallExtensions(extensionsToInstall.slice(1)); + } + return this.downloadAndInstallExtensions(extensionsToInstall) + .then( + locals => this.onDidInstallExtensions(extensionsToInstall, locals, []), + errors => this.onDidInstallExtensions(extensionsToInstall, [], errors)); + }, + error => this.onDidInstallExtensions([extension], [], [error])); } private collectExtensionsToInstall(extension: IGalleryExtension): TPromise { return this.galleryService.loadCompatibleVersion(extension) - .then(extensionToInstall => this.getDependenciesToInstall(extension.properties.dependencies) - .then(dependenciesToInstall => [extensionToInstall, ...dependenciesToInstall.filter(d => d.identifier.uuid !== extensionToInstall.identifier.uuid)])); + .then(compatible => { + if (!compatible) { + return TPromise.wrapError(new ExtensionManagementError(nls.localize('notFoundCompatible', "Unable to install because, the extension '{0}' compatible with current version '{1}' of VS Code is not found.", extension.identifier.id, pkg.version), INSTALL_ERROR_INCOMPATIBLE)); + } + return this.getDependenciesToInstall(compatible.properties.dependencies) + .then( + dependenciesToInstall => ([compatible, ...dependenciesToInstall.filter(d => d.identifier.uuid !== compatible.identifier.uuid)]), + error => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(error).message, INSTALL_ERROR_GALLERY))); + }, + error => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(error).message, INSTALL_ERROR_GALLERY))); } - private checkForObsolete(extensionsToInstall: IGalleryExtension[]): TPromise { - return this.filterObsolete(...extensionsToInstall.map(i => getLocalExtensionIdFromGallery(i, i.version))) - .then(obsolete => obsolete.length ? TPromise.wrapError(new Error(nls.localize('restartCodeGallery', "Please restart Code before reinstalling."))) : extensionsToInstall); + private downloadAndInstallExtensions(extensions: IGalleryExtension[]): TPromise { + return TPromise.join(extensions.map(extensionToInstall => this.downloadInstallableExtension(extensionToInstall) + .then(installableExtension => this.installExtension(installableExtension)) + )).then(null, errors => this.rollback(extensions).then(() => TPromise.wrapError(errors), () => TPromise.wrapError(errors))); } - private downloadInstallableExtension(extension: IGalleryExtension, installed: ILocalExtension[]): TPromise { - const current = installed.filter(i => i.identifier.uuid === extension.identifier.uuid)[0]; + private downloadInstallableExtension(extension: IGalleryExtension): TPromise { const id = getLocalExtensionIdFromGallery(extension, extension.version); const metadata = { id: extension.identifier.uuid, publisherId: extension.publisherId, publisherDisplayName: extension.publisherDisplayName, }; - return this.galleryService.download(extension) - .then(zipPath => validateLocalExtension(zipPath).then(() => ({ zipPath, id, metadata, current }))); + + return this.galleryService.loadCompatibleVersion(extension) + .then( + compatible => { + if (compatible) { + this.logService.trace('Started downloading extension:', extension.name); + return this.galleryService.download(extension) + .then( + zipPath => { + this.logService.info('Downloaded extension:', extension.name); + return validateLocalExtension(zipPath) + .then( + () => ({ zipPath, id, metadata }), + error => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(error).message, INSTALL_ERROR_VALIDATING)) + ); + }, + error => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(error).message, INSTALL_ERROR_DOWNLOADING))); + } else { + return TPromise.wrapError(new ExtensionManagementError(nls.localize('notFoundCompatibleDependency', "Unable to install because, the depending extension '{0}' compatible with current version '{1}' of VS Code is not found.", extension.identifier.id, pkg.version), INSTALL_ERROR_INCOMPATIBLE)); + } + }, + error => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(error).message, INSTALL_ERROR_GALLERY))); } private rollback(extensions: IGalleryExtension[]): TPromise { return this.filterOutUninstalled(extensions) - .then(installed => TPromise.join(installed.map(local => this.uninstallExtension(local.identifier)))) + .then(installed => TPromise.join(installed.map(local => this.uninstallExtension(local)))) .then(() => null, () => null); } private onInstallExtensions(extensions: IGalleryExtension[]): void { for (const extension of extensions) { + this.logService.info('Installing extension:', extension.name); const id = getLocalExtensionIdFromGallery(extension, extension.version); this._onInstallExtension.fire({ identifier: { id, uuid: extension.identifier.uuid }, gallery: extension }); } } - private onDidInstallExtensions(extensions: IGalleryExtension[], local: ILocalExtension[], errorCode?: string, error?: any): TPromise { + private onDidInstallExtensions(extensions: IGalleryExtension[], locals: ILocalExtension[], errors: Error[]): TPromise { extensions.forEach((gallery, index) => { const identifier = { id: getLocalExtensionIdFromGallery(gallery, gallery.version), uuid: gallery.identifier.uuid }; - if (errorCode) { - this._onDidInstallExtension.fire({ identifier, gallery, error: errorCode }); + const local = locals[index]; + const error = errors[index]; + if (local) { + this.logService.info(`Extensions installed successfully:`, gallery.identifier.id); + this._onDidInstallExtension.fire({ identifier, gallery, local }); } else { - this._onDidInstallExtension.fire({ identifier, gallery, local: local[index] }); + const errorCode = error && (error).code ? (error).code : INSTALL_ERROR_UNKNOWN; + this.logService.error(`Failed to install extension:`, gallery.identifier.id, error ? error.message : errorCode); + this._onDidInstallExtension.fire({ identifier, gallery, error: errorCode }); } }); - return error ? TPromise.wrapError(Array.isArray(error) ? this.joinErrors(error) : error) : TPromise.as(null); + return errors.length ? TPromise.wrapError(this.joinErrors(errors)) : TPromise.as(null); } private getDependenciesToInstall(dependencies: string[]): TPromise { - return this.galleryService.loadAllDependencies(dependencies.map(id => ({ id }))) - .then(allDependencies => this.getInstalled() - .then(local => { - return allDependencies.filter(d => { - const extensionId = getLocalExtensionIdFromGallery(d, d.version); - return local.every(({ identifier }) => identifier.id !== extensionId); - }); - })); + if (dependencies.length) { + return this.galleryService.loadAllDependencies(dependencies.map(id => ({ id }))) + .then(allDependencies => this.getInstalled() + .then(local => { + return allDependencies.filter(d => { + const extensionId = getLocalExtensionIdFromGallery(d, d.version); + return local.every(({ identifier }) => identifier.id !== extensionId); + }); + })); + } + return TPromise.as([]); } private filterOutUninstalled(extensions: IGalleryExtension[]): TPromise { @@ -253,14 +343,54 @@ export class ExtensionManagementService implements IExtensionManagementService { return filtered.length ? filtered[0] : null; } - private installExtension({ zipPath, id, metadata, current }: InstallableExtension): TPromise { - const extensionPath = path.join(this.extensionsPath, id); + private installExtension(installableExtension: InstallableExtension): TPromise { + return this.unsetUninstalledAndGetLocal(installableExtension.id) + .then( + local => { + if (local) { + return local; + } + return this.extractAndInstall(installableExtension); + }, + e => { + if (isMacintosh) { + return TPromise.wrapError(new ExtensionManagementError(nls.localize('quitCode', "Unable to install the extension. Please Quit and Start VS Code before reinstalling."), INSTALL_ERROR_UNSET_UNINSTALLED)); + } + return TPromise.wrapError(new ExtensionManagementError(nls.localize('exitCode', "Unable to install the extension. Please Exit and Start VS Code before reinstalling."), INSTALL_ERROR_UNSET_UNINSTALLED)); + }); + } - return pfs.rimraf(extensionPath).then(() => { - return extract(zipPath, extensionPath, { sourcePath: 'extension', overwrite: true }) - .then(() => readManifest(extensionPath)) - .then(({ manifest }) => { - return pfs.readdir(extensionPath).then(children => { + private unsetUninstalledAndGetLocal(id: string): TPromise { + return this.isUninstalled(id) + .then(isUninstalled => { + if (isUninstalled) { + this.logService.trace('Removing the extension from uninstalled list:', id); + // If the same version of extension is marked as uninstalled, remove it from there and return the local. + return this.unsetUninstalled(id) + .then(() => { + this.logService.info('Removed the extension from uninstalled list:', id); + return this.getInstalled(LocalExtensionType.User); + }) + .then(installed => installed.filter(i => i.identifier.id === id)[0]); + } + return null; + }); + } + + private extractAndInstall({ zipPath, id, metadata }: InstallableExtension): TPromise { + const extensionPath = path.join(this.extensionsPath, id); + return pfs.rimraf(extensionPath) + .then(() => { + this.logService.trace(`Started extracting the extension from ${zipPath} to ${extensionPath}`); + return extract(zipPath, extensionPath, { sourcePath: 'extension', overwrite: true }) + .then( + () => { + this.logService.info(`Extracted extension to ${extensionPath}:`, id); + return TPromise.join([readManifest(extensionPath), pfs.readdir(extensionPath)]) + .then(null, e => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(e).message, INSTALL_ERROR_LOCAL))); + }, + e => TPromise.wrapError(new ExtensionManagementError(e.message, INSTALL_ERROR_EXTRACTING))) + .then(([{ manifest }, children]) => { const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0]; const readmeUrl = readme ? URI.file(path.join(extensionPath, readme)).toString() : null; const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; @@ -270,28 +400,31 @@ export class ExtensionManagementService implements IExtensionManagementService { const local: ILocalExtension = { type, identifier, manifest, metadata, path: extensionPath, readmeUrl, changelogUrl }; + this.logService.trace(`Updating metadata of the extension:`, id); return this.saveMetadataForLocalExtension(local) - .then(() => this.checkForRename(current, local)) - .then(() => local); + .then(() => { + this.logService.info(`Updated metadata of the extension:`, id); + return local; + }, e => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(e).message, INSTALL_ERROR_LOCAL))); }); - }); - }); + }, e => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(e).message, INSTALL_ERROR_DELETING))); } uninstall(extension: ILocalExtension, force = false): TPromise { - return this.removeOutdatedExtensions() - .then(() => - this.scanUserExtensions() - .then(installed => { - const promises = installed - .filter(e => e.manifest.publisher === extension.manifest.publisher && e.manifest.name === extension.manifest.name) - .map(e => this.checkForDependenciesAndUninstall(e, installed, force)); - return TPromise.join(promises).then(null, error => TPromise.wrapError(Array.isArray(error) ? this.joinErrors(error) : error)); - })) - .then(() => { /* drop resolved value */ }); + this.deleteExtensionsManifestCache(); + + return this.getInstalled(LocalExtensionType.User) + .then(installed => { + const promises = installed + .filter(e => e.manifest.publisher === extension.manifest.publisher && e.manifest.name === extension.manifest.name) + .map(e => this.checkForDependenciesAndUninstall(e, installed, force)); + return TPromise.join(promises).then(() => null, error => TPromise.wrapError(this.joinErrors(error))); + }); } updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): TPromise { + this.deleteExtensionsManifestCache(); + local.metadata = metadata; return this.saveMetadataForLocalExtension(local); } @@ -316,20 +449,11 @@ export class ExtensionManagementService implements IExtensionManagementService { }); } - private checkForRename(currentExtension: ILocalExtension, newExtension: ILocalExtension): TPromise { - // Check if the gallery id for current and new exensions are same, if not, remove the current one. - if (currentExtension && getGalleryExtensionIdFromLocal(currentExtension) !== getGalleryExtensionIdFromLocal(newExtension)) { - // return this.uninstallExtension(currentExtension.identifier); - return this.setObsolete(currentExtension.identifier.id); - } - return TPromise.as(null); - } - - private joinErrors(errors: (Error | string)[]): Error { + private joinErrors(errorOrErrors: (Error | string) | ((Error | string)[])): Error { + const errors = Array.isArray(errorOrErrors) ? errorOrErrors : [errorOrErrors]; if (errors.length === 1) { return errors[0] instanceof Error ? errors[0] : new Error(errors[0]); } - return errors.reduce((previousValue: Error, currentValue: Error | string) => { return new Error(`${previousValue.message}${previousValue.message ? ',' : ''}${currentValue instanceof Error ? currentValue.message : currentValue}`); }, new Error('')); @@ -373,6 +497,7 @@ export class ExtensionManagementService implements IExtensionManagementService { const dependencies = distinct(this.getDependenciesToUninstallRecursively(extension, installed, [])).filter(e => e !== extension); return this.uninstallWithDependencies(extension, dependencies, installed); } + this.logService.info('Cancelled uninstalling extension:', extension.identifier.id); return TPromise.wrapError(errors.canceled()); }, error => TPromise.wrapError(errors.canceled())); } @@ -392,6 +517,7 @@ export class ExtensionManagementService implements IExtensionManagementService { if (value === 0) { return this.uninstallWithDependencies(extension, [], installed); } + this.logService.info('Cancelled uninstalling extension:', extension.identifier.id); return TPromise.wrapError(errors.canceled()); }, error => TPromise.wrapError(errors.canceled())); } @@ -402,7 +528,7 @@ export class ExtensionManagementService implements IExtensionManagementService { if (dependents.length) { return TPromise.wrapError(new Error(this.getDependentsErrorMessage(extension, dependents))); } - return TPromise.join([this.uninstallExtension(extension.identifier), ...dependenciesToUninstall.map(d => this.doUninstall(d))]).then(() => null); + return TPromise.join([this.uninstallExtension(extension), ...dependenciesToUninstall.map(d => this.doUninstall(d))]).then(() => null); } private getDependentsErrorMessage(extension: ILocalExtension, dependents: ILocalExtension[]): string { @@ -453,7 +579,7 @@ export class ExtensionManagementService implements IExtensionManagementService { private doUninstall(extension: ILocalExtension): TPromise { return this.preUninstallExtension(extension) - .then(() => this.uninstallExtension(extension.identifier)) + .then(() => this.uninstallExtension(extension)) .then(() => this.postUninstallExtension(extension), error => { this.postUninstallExtension(extension, INSTALL_ERROR_LOCAL); @@ -465,24 +591,29 @@ export class ExtensionManagementService implements IExtensionManagementService { const extensionPath = path.join(this.extensionsPath, extension.identifier.id); return pfs.exists(extensionPath) .then(exists => exists ? null : TPromise.wrapError(new Error(nls.localize('notExists', "Could not find extension")))) - .then(() => this._onUninstallExtension.fire(extension.identifier)); + .then(() => { + this.logService.info('Uninstalling extension:', extension.identifier.id); + this._onUninstallExtension.fire(extension.identifier); + }); } - private uninstallExtension({ id }: IExtensionIdentifier): TPromise { - const extensionPath = path.join(this.extensionsPath, id); - return this.setObsolete(id) - .then(() => pfs.rimraf(extensionPath)) - .then(() => this.unsetObsolete(id)); + private uninstallExtension(local: ILocalExtension): TPromise { + const identifier = { id: getGalleryExtensionIdFromLocal(local), uuid: local.identifier.uuid }; + return this.scanUserExtensions(false) // Uninstall all extensions which are same as requested + .then(extensions => extensions.filter(i => areSameExtensions({ id: getGalleryExtensionIdFromLocal(i), uuid: i.identifier.uuid }, identifier))) + .then(uninstalled => this.setUninstalled(...uninstalled.map(u => u.identifier.id))); } private async postUninstallExtension(extension: ILocalExtension, error?: string): TPromise { - if (!error) { + if (error) { + this.logService.error('Failed to uninstall extension:', extension.identifier.id, error); + } else { + this.logService.info('Successfully uninstalled extension:', extension.identifier.id); // only report if extension has a mapped gallery extension. UUID identifies the gallery extension. if (extension.identifier.uuid) { await this.galleryService.reportStatistic(extension.manifest.publisher, extension.manifest.name, extension.manifest.version, StatisticType.Uninstall); } } - this._onDidUninstallExtension.fire({ identifier: extension.identifier, error }); } @@ -490,25 +621,36 @@ export class ExtensionManagementService implements IExtensionManagementService { const promises = []; if (type === null || type === LocalExtensionType.System) { - promises.push(this.scanSystemExtensions()); + promises.push(this.scanSystemExtensions().then(null, e => new ExtensionManagementError(this.joinErrors(e).message, ERROR_SCANNING_SYS_EXTENSIONS))); } if (type === null || type === LocalExtensionType.User) { - promises.push(this.scanUserExtensions()); + promises.push(this.scanUserExtensions(true).then(null, e => new ExtensionManagementError(this.joinErrors(e).message, ERROR_SCANNING_USER_EXTENSIONS))); } - return TPromise.join(promises).then(flatten); + return TPromise.join(promises).then(flatten, errors => TPromise.wrapError(this.joinErrors(errors))); } private scanSystemExtensions(): TPromise { - return this.scanExtensions(SystemExtensionsRoot, LocalExtensionType.System); + this.logService.trace('Started scanning system extensions'); + return this.scanExtensions(SystemExtensionsRoot, LocalExtensionType.System) + .then(result => { + this.logService.info('Scanned system extensions:', result.length); + return result; + }); } - private scanUserExtensions(): TPromise { - return this.scanExtensions(this.extensionsPath, LocalExtensionType.User).then(extensions => { - const byId = values(groupBy(extensions, p => getGalleryExtensionIdFromLocal(p))); - return byId.map(p => p.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version))[0]); - }); + private scanUserExtensions(excludeOutdated: boolean): TPromise { + this.logService.trace('Started scanning user extensions'); + return this.scanExtensions(this.extensionsPath, LocalExtensionType.User) + .then(extensions => { + this.logService.info('Scanned user extensions:', extensions.length); + if (excludeOutdated) { + const byExtension: ILocalExtension[][] = groupByExtension(extensions, e => ({ id: getGalleryExtensionIdFromLocal(e), uuid: e.identifier.uuid })); + return byExtension.map(p => p.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version))[0]); + } + return extensions; + }); } private scanExtensions(root: string, type: LocalExtensionType): TPromise { @@ -540,90 +682,69 @@ export class ExtensionManagementService implements IExtensionManagementService { } private scanExtensionFolders(root: string): TPromise { - return this.getObsoleteExtensions() - .then(obsolete => pfs.readdir(root).then(extensions => extensions.filter(id => !obsolete[id]))); + return this.getUninstalledExtensions() + .then(uninstalled => pfs.readdir(root).then(extensions => extensions.filter(id => !uninstalled[id]))); } removeDeprecatedExtensions(): TPromise { - return TPromise.join([ - this.removeOutdatedExtensions(), - this.removeObsoleteExtensions() - ]); - } + return this.getUninstalledExtensions() + .then(uninstalled => { + const unInstalledExtensionIds = Object.keys(uninstalled); + return this.scanUserExtensions(false) + .then(extensions => { + const byExtension: ILocalExtension[][] = groupByExtension(extensions, e => ({ id: getGalleryExtensionIdFromLocal(e), uuid: e.identifier.uuid })); + const outDatedExtensionIds = flatten(byExtension.map(p => p.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version)).slice(1))) + .map(a => a.identifier.id); - private removeOutdatedExtensions(): TPromise { - return this.getOutdatedExtensionIds() - .then(extensionIds => this.removeExtensions(extensionIds)); - } - - private removeObsoleteExtensions(): TPromise { - return this.getObsoleteExtensions() - .then(obsolete => Object.keys(obsolete)) - .then(extensionIds => this.removeExtensions(extensionIds)); - } - - private removeExtensions(extensionsIds: string[]): TPromise { - return TPromise.join(extensionsIds.map(id => { - return pfs.rimraf(path.join(this.extensionsPath, id)) - .then(() => this.withObsoleteExtensions(obsolete => delete obsolete[id])); - })); - } - - private getOutdatedExtensionIds(): TPromise { - return this.scanExtensionFolders(this.extensionsPath) - .then(folders => { - const galleryFolders = folders - .map(folder => (assign({ folder }, getIdAndVersionFromLocalExtensionId(folder)))) - .filter(({ id, version }) => !!id && !!version); - - const byId = values(groupBy(galleryFolders, p => p.id)); - - return flatten(byId.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version)).slice(1))) - .map(a => a.folder); + return TPromise.join([...unInstalledExtensionIds, ...outDatedExtensionIds].map(id => { + return pfs.rimraf(path.join(this.extensionsPath, id)) + .then(() => this.withUninstalledExtensions(uninstalled => delete uninstalled[id])); + })); + }); }); } - private isObsolete(id: string): TPromise { - return this.filterObsolete(id).then(obsolete => obsolete.length === 1); + private isUninstalled(id: string): TPromise { + return this.filterUninstalled(id).then(uninstalled => uninstalled.length === 1); } - private filterObsolete(...ids: string[]): TPromise { - return this.withObsoleteExtensions(allObsolete => { - const obsolete = []; + private filterUninstalled(...ids: string[]): TPromise { + return this.withUninstalledExtensions(allUninstalled => { + const uninstalled = []; for (const id of ids) { - if (!!allObsolete[id]) { - obsolete.push(id); + if (!!allUninstalled[id]) { + uninstalled.push(id); } } - return obsolete; + return uninstalled; }); } - private setObsolete(id: string): TPromise { - return this.withObsoleteExtensions(obsolete => assign(obsolete, { [id]: true })); + private setUninstalled(...ids: string[]): TPromise { + return this.withUninstalledExtensions(uninstalled => assign(uninstalled, ids.reduce((result, id) => { result[id] = true; return result; }, {}))); } - private unsetObsolete(id: string): TPromise { - return this.withObsoleteExtensions(obsolete => delete obsolete[id]); + private unsetUninstalled(id: string): TPromise { + return this.withUninstalledExtensions(uninstalled => delete uninstalled[id]); } - private getObsoleteExtensions(): TPromise<{ [id: string]: boolean; }> { - return this.withObsoleteExtensions(obsolete => obsolete); + private getUninstalledExtensions(): TPromise<{ [id: string]: boolean; }> { + return this.withUninstalledExtensions(uninstalled => uninstalled); } - private withObsoleteExtensions(fn: (obsolete: { [id: string]: boolean; }) => T): TPromise { - return this.obsoleteFileLimiter.queue(() => { + private withUninstalledExtensions(fn: (uninstalled: { [id: string]: boolean; }) => T): TPromise { + return this.uninstalledFileLimiter.queue(() => { let result: T = null; - return pfs.readFile(this.obsoletePath, 'utf8') + return pfs.readFile(this.uninstalledPath, 'utf8') .then(null, err => err.code === 'ENOENT' ? TPromise.as('{}') : TPromise.wrapError(err)) .then<{ [id: string]: boolean }>(raw => { try { return JSON.parse(raw); } catch (e) { return {}; } }) - .then(obsolete => { result = fn(obsolete); return obsolete; }) - .then(obsolete => { - if (Object.keys(obsolete).length === 0) { - return pfs.rimraf(this.obsoletePath); + .then(uninstalled => { result = fn(uninstalled); return uninstalled; }) + .then(uninstalled => { + if (Object.keys(uninstalled).length === 0) { + return pfs.rimraf(this.uninstalledPath); } else { - const raw = JSON.stringify(obsolete); - return pfs.writeFile(this.obsoletePath, raw); + const raw = JSON.stringify(uninstalled); + return pfs.writeFile(this.uninstalledPath, raw); } }) .then(() => result); @@ -645,4 +766,4 @@ export function getLocalExtensionIdFromManifest(manifest: IExtensionManifest): s function getLocalExtensionId(id: string, version: string): string { return `${id}-${version}`; -} \ No newline at end of file +} diff --git a/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts b/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts new file mode 100644 index 000000000000..b8df67a3d7d9 --- /dev/null +++ b/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as semver from 'semver'; +import { adoptToGalleryExtensionId, LOCAL_EXTENSION_ID_REGEX } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; + +export function getIdAndVersionFromLocalExtensionId(localExtensionId: string): { id: string, version: string } { + const matches = LOCAL_EXTENSION_ID_REGEX.exec(localExtensionId); + if (matches && matches[1] && matches[2]) { + const version = semver.valid(matches[2]); + if (version) { + return { id: adoptToGalleryExtensionId(matches[1]), version }; + } + } + return { + id: adoptToGalleryExtensionId(localExtensionId), + version: null + }; +} \ No newline at end of file diff --git a/src/vs/platform/extensionManagement/test/node/extensionGalleryService.test.ts b/src/vs/platform/extensionManagement/test/node/extensionGalleryService.test.ts new file mode 100644 index 000000000000..63d4e31cb4d2 --- /dev/null +++ b/src/vs/platform/extensionManagement/test/node/extensionGalleryService.test.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as assert from 'assert'; +import * as os from 'os'; +import extfs = require('vs/base/node/extfs'); +import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; +import { parseArgs } from 'vs/platform/environment/node/argv'; +import { getRandomTestPath } from 'vs/workbench/test/workbenchTestServices'; +import { join } from 'path'; +import { mkdirp } from 'vs/base/node/pfs'; +import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/extensionGalleryService'; +import { isUUID } from 'vs/base/common/uuid'; + +suite('Extension Gallery Service', () => { + const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'extensiongalleryservice'); + const marketplaceHome = join(parentDir, 'Marketplace'); + + setup(done => { + + // Delete any existing backups completely and then re-create it. + extfs.del(marketplaceHome, os.tmpdir(), () => { + mkdirp(marketplaceHome).then(() => { + done(); + }); + }); + }); + + teardown(done => { + extfs.del(marketplaceHome, os.tmpdir(), done); + }); + + test('marketplace machine id', done => { + const args = ['--user-data-dir', marketplaceHome]; + const environmentService = new EnvironmentService(parseArgs(args), process.execPath); + + return resolveMarketplaceHeaders(environmentService).then(headers => { + assert.ok(isUUID(headers['X-Market-User-Id'])); + + return resolveMarketplaceHeaders(environmentService).then(headers2 => { + assert.equal(headers['X-Market-User-Id'], headers2['X-Market-User-Id']); + + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index 22d4e4259f9e..fe757879b076 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -27,9 +27,16 @@ export interface IExtensionDescription { readonly main?: string; readonly contributes?: { [point: string]: any; }; readonly keywords?: string[]; + readonly repository?: { + url: string; + }; enableProposedApi?: boolean; } +export const MANIFEST_CACHE_FOLDER = 'CachedExtensions'; +export const USER_MANIFEST_CACHE_FILE = 'user'; +export const BUILTIN_MANIFEST_CACHE_FILE = 'builtin'; + export const IExtensionService = createDecorator('extensionService'); export interface IMessage { @@ -42,19 +49,63 @@ export interface IMessage { export interface IExtensionsStatus { messages: IMessage[]; + activationTimes: ActivationTimes; + runtimeErrors: Error[]; } -export class ActivationTimes { - public readonly startup: boolean; - public readonly codeLoadingTime: number; - public readonly activateCallTime: number; - public readonly activateResolvedTime: number; +/** + * e.g. + * ``` + * { + * startTime: 1511954813493000, + * endTime: 1511954835590000, + * deltas: [ 100, 1500, 123456, 1500, 100000 ], + * ids: [ 'idle', 'self', 'extension1', 'self', 'idle' ] + * } + * ``` + */ +export interface IExtensionHostProfile { + /** + * Profiling start timestamp in microseconds. + */ + startTime: number; + /** + * Profiling end timestamp in microseconds. + */ + endTime: number; + /** + * Duration of segment in microseconds. + */ + deltas: number[]; + /** + * Segment identifier: extension id or one of the four known strings. + */ + ids: ProfileSegmentId[]; - constructor(startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number) { - this.startup = startup; - this.codeLoadingTime = codeLoadingTime; - this.activateCallTime = activateCallTime; - this.activateResolvedTime = activateResolvedTime; + /** + * Get the information as a .cpuprofile. + */ + data: object; + + /** + * Get the aggregated time per segmentId + */ + getAggregatedTimes(): Map; +} + +/** + * Extension id or one of the four known program states. + */ +export type ProfileSegmentId = string | 'idle' | 'program' | 'gc' | 'self'; + +export class ActivationTimes { + constructor( + public readonly startup: boolean, + public readonly codeLoadingTime: number, + public readonly activateCallTime: number, + public readonly activateResolvedTime: number, + public readonly activationEvent: string + ) { } } @@ -68,6 +119,10 @@ export class ExtensionPointContribution { } } +export interface IExtensionHostInformation { + inspectPort: number; +} + export interface IExtensionService { _serviceBrand: any; @@ -80,6 +135,13 @@ export interface IExtensionService { */ onDidRegisterExtensions: Event; + /** + * @event + * Fired when extensions status changes. + * The event contains the ids of the extensions that have changed. + */ + onDidChangeExtensionsStatus: Event; + /** * Send an activation event and activate interested extensions. */ @@ -107,9 +169,9 @@ export interface IExtensionService { getExtensionsStatus(): { [id: string]: IExtensionsStatus }; /** - * Get information about extension activation times. + * Begin an extension host process profile session. */ - getExtensionsActivationTimes(): { [id: string]: ActivationTimes; }; + startExtensionHostProfile(): TPromise; /** * Restarts the extension host. @@ -125,4 +187,13 @@ export interface IExtensionService { * Stops the extension host. */ stopExtensionHost(): void; + + /** + * + */ + getExtensionHostInformation(): IExtensionHostInformation; +} + +export interface ProfileSession { + stop(): TPromise; } diff --git a/src/vs/platform/extensions/common/extensionsRegistry.ts b/src/vs/platform/extensions/common/extensionsRegistry.ts index fd969d13623a..52af538246fc 100644 --- a/src/vs/platform/extensions/common/extensionsRegistry.ts +++ b/src/vs/platform/extensions/common/extensionsRegistry.ts @@ -199,6 +199,16 @@ const schema: IJSONSchema = { description: nls.localize('vscode.extension.activationEvents.onDebug', 'An activation event emitted whenever a user is about to start debugging or about to setup debug configurations.'), body: 'onDebug' }, + { + label: 'onDebugInitialConfigurations', + description: nls.localize('vscode.extension.activationEvents.onDebugInitialConfigurations', 'An activation event emitted whenever a "launch.json" needs to be created (and all provideDebugConfigurations methods need to be called).'), + body: 'onDebugInitialConfigurations' + }, + { + label: 'onDebugResolve', + description: nls.localize('vscode.extension.activationEvents.onDebugResolve', 'An activation event emitted whenever a debug session with the specific type is about to be launched (and a corresponding resolveDebugConfiguration method needs to be called).'), + body: 'onDebugResolve:${6:type}' + }, { label: 'workspaceContains', description: nls.localize('vscode.extension.activationEvents.workspaceContains', 'An activation event emitted whenever a folder is opened that contains at least a file matching the specified glob pattern.'), diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 3744088afe57..262916172b60 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -8,7 +8,6 @@ import { TPromise } from 'vs/base/common/winjs.base'; import paths = require('vs/base/common/paths'); import URI from 'vs/base/common/uri'; import glob = require('vs/base/common/glob'); -import events = require('vs/base/common/events'); import { isLinux } from 'vs/base/common/platform'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import Event from 'vs/base/common/event'; @@ -245,12 +244,11 @@ export interface IFileChange { resource: URI; } -export class FileChangesEvent extends events.Event { +export class FileChangesEvent { + private _changes: IFileChange[]; constructor(changes: IFileChange[]) { - super(); - this._changes = changes; } diff --git a/src/vs/platform/history/electron-main/historyMainService.ts b/src/vs/platform/history/electron-main/historyMainService.ts index 069fa2c47336..761b5c052654 100644 --- a/src/vs/platform/history/electron-main/historyMainService.ts +++ b/src/vs/platform/history/electron-main/historyMainService.ts @@ -9,7 +9,7 @@ import * as path from 'path'; import * as nls from 'vs/nls'; import * as arrays from 'vs/base/common/arrays'; import { trim } from 'vs/base/common/strings'; -import { IStorageService } from 'vs/platform/storage/node/storage'; +import { IStateService } from 'vs/platform/state/common/state'; import { app } from 'electron'; import { ILogService } from 'vs/platform/log/common/log'; import { getPathLabel, getBaseLabel } from 'vs/base/common/labels'; @@ -22,10 +22,6 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { isEqual } from 'vs/base/common/paths'; import { RunOnceScheduler } from 'vs/base/common/async'; -export interface ILegacyRecentlyOpened extends IRecentlyOpened { - folders: string[]; // TODO@Ben migration -} - export class HistoryMainService implements IHistoryMainService { private static readonly MAX_TOTAL_RECENT_ENTRIES = 100; @@ -41,9 +37,9 @@ export class HistoryMainService implements IHistoryMainService { private macOSRecentDocumentsUpdater: RunOnceScheduler; constructor( - @IStorageService private storageService: IStorageService, + @IStateService private stateService: IStateService, @ILogService private logService: ILogService, - @IWorkspacesMainService private workspacesService: IWorkspacesMainService, + @IWorkspacesMainService private workspacesMainService: IWorkspacesMainService, @IEnvironmentService private environmentService: IEnvironmentService, ) { this.macOSRecentDocumentsUpdater = new RunOnceScheduler(() => this.updateMacOSRecentDocuments(), 800); @@ -52,7 +48,7 @@ export class HistoryMainService implements IHistoryMainService { } private registerListeners(): void { - this.workspacesService.onWorkspaceSaved(e => this.onWorkspaceSaved(e)); + this.workspacesMainService.onWorkspaceSaved(e => this.onWorkspaceSaved(e)); } private onWorkspaceSaved(e: IWorkspaceSavedEvent): void { @@ -67,7 +63,7 @@ export class HistoryMainService implements IHistoryMainService { // Workspaces workspaces.forEach(workspace => { - const isUntitledWorkspace = !isSingleFolderWorkspaceIdentifier(workspace) && this.workspacesService.isUntitledWorkspace(workspace); + const isUntitledWorkspace = !isSingleFolderWorkspaceIdentifier(workspace) && this.workspacesMainService.isUntitledWorkspace(workspace); if (isUntitledWorkspace) { return; // only store saved workspaces } @@ -179,9 +175,9 @@ export class HistoryMainService implements IHistoryMainService { let files: string[]; // Get from storage - const storedRecents = this.storageService.getItem(HistoryMainService.recentlyOpenedStorageKey) as ILegacyRecentlyOpened; + const storedRecents = this.stateService.getItem(HistoryMainService.recentlyOpenedStorageKey); if (storedRecents) { - workspaces = storedRecents.workspaces || storedRecents.folders || []; + workspaces = storedRecents.workspaces || []; files = storedRecents.files || []; } else { workspaces = []; @@ -203,7 +199,7 @@ export class HistoryMainService implements IHistoryMainService { files = arrays.distinct(files, file => this.distinctFn(file)); // Hide untitled workspaces - workspaces = workspaces.filter(workspace => isSingleFolderWorkspaceIdentifier(workspace) || !this.workspacesService.isUntitledWorkspace(workspace)); + workspaces = workspaces.filter(workspace => isSingleFolderWorkspaceIdentifier(workspace) || !this.workspacesMainService.isUntitledWorkspace(workspace)); return { workspaces, files }; } @@ -217,7 +213,7 @@ export class HistoryMainService implements IHistoryMainService { } private saveRecentlyOpened(recent: IRecentlyOpened): void { - this.storageService.setItem(HistoryMainService.recentlyOpenedStorageKey, recent); + this.stateService.setItem(HistoryMainService.recentlyOpenedStorageKey, recent); } public updateWindowsJumpList(): void { @@ -281,7 +277,7 @@ export class HistoryMainService implements IHistoryMainService { try { app.setJumpList(jumpList); } catch (error) { - this.logService.log('#setJumpList', error); // since setJumpList is relatively new API, make sure to guard for errors + this.logService.warn('#setJumpList', error); // since setJumpList is relatively new API, make sure to guard for errors } } } \ No newline at end of file diff --git a/src/vs/platform/integrity/common/integrity.ts b/src/vs/platform/integrity/common/integrity.ts index 747c07ca50de..6984b0fa8e7a 100644 --- a/src/vs/platform/integrity/common/integrity.ts +++ b/src/vs/platform/integrity/common/integrity.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import URI from 'vs/base/common/uri'; @@ -25,5 +24,5 @@ export interface IntegrityTestResult { export interface IIntegrityService { _serviceBrand: any; - isPure(): TPromise; + isPure(): Thenable; } diff --git a/src/vs/platform/integrity/node/integrityServiceImpl.ts b/src/vs/platform/integrity/node/integrityServiceImpl.ts index 33ce7582d895..96798846b0b5 100644 --- a/src/vs/platform/integrity/node/integrityServiceImpl.ts +++ b/src/vs/platform/integrity/node/integrityServiceImpl.ts @@ -15,6 +15,7 @@ import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import { Action } from 'vs/base/common/actions'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; interface IStorageData { dontShowPrompt: boolean; @@ -60,11 +61,12 @@ export class IntegrityServiceImpl implements IIntegrityService { private _messageService: IMessageService; private _storage: IntegrityStorage; - private _isPurePromise: TPromise; + private _isPurePromise: Thenable; constructor( @IMessageService messageService: IMessageService, - @IStorageService storageService: IStorageService + @IStorageService storageService: IStorageService, + @ILifecycleService private lifecycleService: ILifecycleService ) { this._messageService = messageService; this._storage = new IntegrityStorage(storageService); @@ -124,14 +126,14 @@ export class IntegrityServiceImpl implements IIntegrityService { }); } - public isPure(): TPromise { + public isPure(): Thenable { return this._isPurePromise; } - private _isPure(): TPromise { + private _isPure(): Thenable { const expectedChecksums = product.checksums || {}; - return TPromise.timeout(10000).then(() => { + return this.lifecycleService.when(LifecyclePhase.Eventually).then(() => { let asyncResults: TPromise[] = Object.keys(expectedChecksums).map((filename) => { return this._resolve(filename, expectedChecksums[filename]); }); diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index e9468d0dd7b7..82518d718f8f 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -124,8 +124,8 @@ suite('AbstractKeybindingService', () => { let messageService: IMessageService = { _serviceBrand: undefined, hideAll: undefined, - confirmSync: undefined, confirm: undefined, + confirmWithCheckbox: undefined, show: (sev: Severity, message: any): () => void => { showMessageCalls.push({ sev: sev, diff --git a/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts b/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts index d9b3be30cfd5..d77c65cd1b6c 100644 --- a/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts +++ b/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts @@ -8,7 +8,7 @@ import { ipcMain as ipc, app } from 'electron'; import { TPromise, TValueCallback } from 'vs/base/common/winjs.base'; import { ILogService } from 'vs/platform/log/common/log'; -import { IStorageService } from 'vs/platform/storage/node/storage'; +import { IStateService } from 'vs/platform/state/common/state'; import Event, { Emitter } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ICodeWindow } from 'vs/platform/windows/electron-main/windows'; @@ -94,7 +94,7 @@ export class LifecycleService implements ILifecycleService { constructor( @ILogService private logService: ILogService, - @IStorageService private storageService: IStorageService + @IStateService private stateService: IStateService ) { this.windowToCloseRequest = Object.create(null); this.quitRequested = false; @@ -105,10 +105,10 @@ export class LifecycleService implements ILifecycleService { } private handleRestarted(): void { - this._wasRestarted = !!this.storageService.getItem(LifecycleService.QUIT_FROM_RESTART_MARKER); + this._wasRestarted = !!this.stateService.getItem(LifecycleService.QUIT_FROM_RESTART_MARKER); if (this._wasRestarted) { - this.storageService.removeItem(LifecycleService.QUIT_FROM_RESTART_MARKER); // remove the marker right after if found + this.stateService.removeItem(LifecycleService.QUIT_FROM_RESTART_MARKER); // remove the marker right after if found } } @@ -124,7 +124,7 @@ export class LifecycleService implements ILifecycleService { // before-quit app.on('before-quit', (e) => { - this.logService.log('Lifecycle#before-quit'); + this.logService.trace('Lifecycle#before-quit'); if (!this.quitRequested) { this._onBeforeQuit.fire(); // only send this if this is the first quit request we have @@ -135,7 +135,7 @@ export class LifecycleService implements ILifecycleService { // window-all-closed app.on('window-all-closed', () => { - this.logService.log('Lifecycle#window-all-closed'); + this.logService.trace('Lifecycle#window-all-closed'); // Windows/Linux: we quit when all windows have closed // Mac: we only quit when quit was requested @@ -150,11 +150,11 @@ export class LifecycleService implements ILifecycleService { // Window Before Closing: Main -> Renderer window.win.on('close', e => { const windowId = window.id; - this.logService.log('Lifecycle#window-before-close', windowId); + this.logService.trace('Lifecycle#window-before-close', windowId); // The window already acknowledged to be closed if (this.windowToCloseRequest[windowId]) { - this.logService.log('Lifecycle#window-close', windowId); + this.logService.trace('Lifecycle#window-close', windowId); delete this.windowToCloseRequest[windowId]; @@ -183,7 +183,7 @@ export class LifecycleService implements ILifecycleService { return TPromise.as(false); } - this.logService.log('Lifecycle#unload()', window.id); + this.logService.trace('Lifecycle#unload()', window.id); const windowUnloadReason = this.quitRequested ? UnloadReason.QUIT : reason; @@ -247,7 +247,7 @@ export class LifecycleService implements ILifecycleService { * by the user or not. */ public quit(fromUpdate?: boolean): TPromise { - this.logService.log('Lifecycle#quit()'); + this.logService.trace('Lifecycle#quit()'); if (!this.pendingQuitPromise) { this.pendingQuitPromise = new TPromise(c => { @@ -258,7 +258,7 @@ export class LifecycleService implements ILifecycleService { app.once('will-quit', () => { if (this.pendingQuitPromiseComplete) { if (fromUpdate) { - this.storageService.setItem(LifecycleService.QUIT_FROM_RESTART_MARKER, true); + this.stateService.setItem(LifecycleService.QUIT_FROM_RESTART_MARKER, true); } this.pendingQuitPromiseComplete(false /* no veto */); @@ -296,7 +296,7 @@ export class LifecycleService implements ILifecycleService { let vetoed = false; app.once('quit', () => { if (!vetoed) { - this.storageService.setItem(LifecycleService.QUIT_FROM_RESTART_MARKER, true); + this.stateService.setItem(LifecycleService.QUIT_FROM_RESTART_MARKER, true); app.relaunch({ args }); } }); diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 6c91a4518ec3..b4d344e30acd 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -4,12 +4,20 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; -import { List } from 'vs/base/browser/ui/list/listWidget'; +import { ITree, ITreeConfiguration, ITreeOptions } from 'vs/base/parts/tree/browser/tree'; +import { List, IListOptions } from 'vs/base/browser/ui/list/listWidget'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { RunOnceScheduler } from 'vs/base/common/async'; +import { IDisposable, toDisposable, combinedDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IContextKeyService, IContextKey, RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { PagedList, IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; +import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; +import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; +import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import Event, { Emitter } from 'vs/base/common/event'; +import { InputFocusedContextKey } from 'vs/platform/workbench/common/contextkeys'; + +export type ListWidget = List | PagedList | ITree; export const IListService = createDecorator('listService'); @@ -17,52 +25,32 @@ export interface IListService { _serviceBrand: any; - /** - * Makes a tree or list widget known to the list service. It will track the lists focus and - * blur events to update context keys based on the widget being focused or not. - * - * @param extraContextKeys an optional list of additional context keys to update based on - * the widget being focused or not. - */ - register(tree: ITree, extraContextKeys?: (IContextKey)[]): IDisposable; - register(list: List, extraContextKeys?: (IContextKey)[]): IDisposable; - /** * Returns the currently focused list widget if any. */ - getFocused(): ITree | List; + readonly lastFocusedList: ListWidget | undefined; } -export const ListFocusContext = new RawContextKey('listFocus', false); - interface IRegisteredList { - widget: ITree | List; + widget: ListWidget; extraContextKeys?: (IContextKey)[]; } export class ListService implements IListService { - public _serviceBrand: any; + _serviceBrand: any; - private focusedTreeOrList: ITree | List; - private lists: IRegisteredList[]; + private lists: IRegisteredList[] = []; + private _lastFocusedWidget: ListWidget | undefined = undefined; - private listFocusContext: IContextKey; - - private focusChangeScheduler: RunOnceScheduler; - - constructor( - @IContextKeyService contextKeyService: IContextKeyService - ) { - this.listFocusContext = ListFocusContext.bindTo(contextKeyService); - this.lists = []; - this.focusChangeScheduler = new RunOnceScheduler(() => this.onFocusChange(), 50 /* delay until the focus/blur dust settles */); + get lastFocusedList(): ListWidget | undefined { + return this._lastFocusedWidget; } - public register(tree: ITree, extraContextKeys?: (IContextKey)[]): IDisposable; - public register(list: List, extraContextKeys?: (IContextKey)[]): IDisposable; - public register(widget: ITree | List, extraContextKeys?: (IContextKey)[]): IDisposable { - if (this.indexOf(widget) >= 0) { + constructor( @IContextKeyService contextKeyService: IContextKeyService) { } + + register(widget: ListWidget, extraContextKeys?: (IContextKey)[]): IDisposable { + if (this.lists.some(l => l.widget === widget)) { throw new Error('Cannot register the same widget multiple times'); } @@ -72,83 +60,115 @@ export class ListService implements IListService { // Check for currently being focused if (widget.isDOMFocused()) { - this.setFocusedList(registeredList); + this._lastFocusedWidget = widget; } - const toDispose = [ - widget.onDidFocus(() => this.focusChangeScheduler.schedule()), - widget.onDidBlur(() => this.focusChangeScheduler.schedule()) - ]; + const result = combinedDisposable([ + widget.onDidFocus(() => this._lastFocusedWidget = widget), + toDisposable(() => this.lists.splice(this.lists.indexOf(registeredList), 1)) + ]); - // Special treatment for tree highlight mode - if (!(widget instanceof List)) { - const tree = widget; + return result; + } +} - toDispose.push(tree.onDidChangeHighlight(() => { - this.focusChangeScheduler.schedule(); - })); - } +const RawWorkbenchListFocusContextKey = new RawContextKey('listFocus', true); +export const WorkbenchListFocusContextKey = ContextKeyExpr.and(RawWorkbenchListFocusContextKey, ContextKeyExpr.not(InputFocusedContextKey)); - // Remove list once disposed - toDispose.push({ - dispose: () => { this.lists.splice(this.lists.indexOf(registeredList), 1); } - }); +export type Widget = List | PagedList | ITree; - return { - dispose: () => dispose(toDispose) - }; +function createScopedContextKeyService(contextKeyService: IContextKeyService, widget: Widget): IContextKeyService { + const result = contextKeyService.createScoped(widget.getHTMLElement()); + RawWorkbenchListFocusContextKey.bindTo(result); + return result; +} + +export class WorkbenchList extends List { + + readonly contextKeyService: IContextKeyService; + private disposable: IDisposable; + + constructor( + container: HTMLElement, + delegate: IDelegate, + renderers: IRenderer[], + options: IListOptions, + @IContextKeyService contextKeyService: IContextKeyService, + @IListService listService: IListService, + @IThemeService themeService: IThemeService + ) { + super(container, delegate, renderers, options); + this.contextKeyService = createScopedContextKeyService(contextKeyService, this); + + this.disposable = combinedDisposable([ + this.contextKeyService, + (listService as ListService).register(this), + attachListStyler(this, themeService) + ]); } - private indexOf(widget: ITree | List): number { - for (let i = 0; i < this.lists.length; i++) { - const list = this.lists[i]; - if (list.widget === widget) { - return i; - } - } + dispose(): void { + this.disposable.dispose(); + } +} - return -1; +export class WorkbenchPagedList extends PagedList { + + readonly contextKeyService: IContextKeyService; + private disposable: IDisposable; + + constructor( + container: HTMLElement, + delegate: IDelegate, + renderers: IPagedRenderer[], + options: IListOptions, + @IContextKeyService contextKeyService: IContextKeyService, + @IListService listService: IListService, + @IThemeService themeService: IThemeService + ) { + super(container, delegate, renderers, options); + this.contextKeyService = createScopedContextKeyService(contextKeyService, this); + + this.disposable = combinedDisposable([ + this.contextKeyService, + (listService as ListService).register(this), + attachListStyler(this, themeService) + ]); } - private onFocusChange(): void { - let focusedList: IRegisteredList; - for (let i = 0; i < this.lists.length; i++) { - const list = this.lists[i]; - if (document.activeElement === list.widget.getHTMLElement()) { - focusedList = list; - break; - } - } + dispose(): void { + this.disposable.dispose(); + } +} - this.setFocusedList(focusedList); +export class WorkbenchTree extends Tree { + + private _onFocusChange = new Emitter(); + readonly onFocusChange: Event = this._onFocusChange.event; + + readonly contextKeyService: IContextKeyService; + private disposables: IDisposable[] = []; + + constructor( + container: HTMLElement, + configuration: ITreeConfiguration, + options: ITreeOptions, + @IContextKeyService contextKeyService: IContextKeyService, + @IListService listService: IListService, + @IThemeService themeService: IThemeService + ) { + super(container, configuration, options); + + this.contextKeyService = createScopedContextKeyService(contextKeyService, this); + + this.disposables.push( + this.contextKeyService, + (listService as ListService).register(this), + attachListStyler(this, themeService) + ); } - private setFocusedList(focusedList?: IRegisteredList): void { - - // First update our context - if (focusedList) { - this.focusedTreeOrList = focusedList.widget; - this.listFocusContext.set(true); - } else { - this.focusedTreeOrList = void 0; - this.listFocusContext.set(false); - } - - // Then check for extra contexts to unset - for (let i = 0; i < this.lists.length; i++) { - const list = this.lists[i]; - if (list !== focusedList && list.extraContextKeys) { - list.extraContextKeys.forEach(key => key.set(false)); - } - } - - // Finally set context for focused list if there are any - if (focusedList && focusedList.extraContextKeys) { - focusedList.extraContextKeys.forEach(key => key.set(true)); - } + dispose(): void { + this.disposables = dispose(this.disposables); } - - public getFocused(): ITree | List { - return this.focusedTreeOrList; - } -} \ No newline at end of file +} diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index 6860e33cf4e0..95bd211f0193 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -5,37 +5,246 @@ 'use strict'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { createDecorator as createServiceDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { isWindows } from 'vs/base/common/platform'; -export const ILogService = createDecorator('logService'); +export const ILogService = createServiceDecorator('logService'); -export interface ILogService { - _serviceBrand: any; - - log(...args: any[]): void; - warn(...args: any[]): void; - error(...args: any[]): void; +export enum LogLevel { + Trace, + Debug, + Info, + Warning, + Error, + Critical, + Off } -export class LogMainService implements ILogService { - +export interface ILogService extends IDisposable { _serviceBrand: any; - constructor( @IEnvironmentService private environmentService: IEnvironmentService) { + setLevel(level: LogLevel): void; + getLevel(): LogLevel; + trace(message: string, ...args: any[]): void; + debug(message: string, ...args: any[]): void; + info(message: string, ...args: any[]): void; + warn(message: string, ...args: any[]): void; + error(message: string | Error, ...args: any[]): void; + critical(message: string | Error, ...args: any[]): void; +} + +export class ConsoleLogMainService implements ILogService { + + _serviceBrand: any; + private level: LogLevel = LogLevel.Error; + private useColors: boolean; + + constructor( @IEnvironmentService environmentService: IEnvironmentService) { + this.setLevel(environmentService.logLevel); + this.useColors = !isWindows; } - public log(...args: any[]): void { - if (this.environmentService.verbose) { - console.log(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, ...args); + setLevel(level: LogLevel): void { + this.level = level; + } + + getLevel(): LogLevel { + return this.level; + } + + trace(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Trace) { + if (this.useColors) { + console.log(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); + } else { + console.log(`[main ${new Date().toLocaleTimeString()}]`, message, ...args); + } } } - public error(...args: any[]): void { - console.error(`\x1b[91m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, ...args); + debug(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Debug) { + if (this.useColors) { + console.log(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); + } else { + console.log(`[main ${new Date().toLocaleTimeString()}]`, message, ...args); + } + } } - public warn(...args: any[]): void { - console.warn(`\x1b[93m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, ...args); + info(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Info) { + if (this.useColors) { + console.log(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); + } else { + console.log(`[main ${new Date().toLocaleTimeString()}]`, message, ...args); + } + } } -} \ No newline at end of file + + warn(message: string | Error, ...args: any[]): void { + if (this.level <= LogLevel.Warning) { + if (this.useColors) { + console.warn(`\x1b[93m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); + } else { + console.warn(`[main ${new Date().toLocaleTimeString()}]`, message, ...args); + } + } + } + + error(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Error) { + if (this.useColors) { + console.error(`\x1b[91m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); + } else { + console.error(`[main ${new Date().toLocaleTimeString()}]`, message, ...args); + } + } + } + + critical(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Critical) { + if (this.useColors) { + console.error(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); + } else { + console.error(`[main ${new Date().toLocaleTimeString()}]`, message, ...args); + } + } + } + + dispose(): void { + // noop + } +} + +export class ConsoleLogService implements ILogService { + + _serviceBrand: any; + private level: LogLevel = LogLevel.Error; + + constructor( @IEnvironmentService environmentService: IEnvironmentService) { + this.setLevel(environmentService.logLevel); + } + + setLevel(level: LogLevel): void { + this.level = level; + } + + getLevel(): LogLevel { + return this.level; + } + + trace(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Trace) { + console.log('%cTRACE', 'color: #888', message, ...args); + } + } + + debug(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Debug) { + console.log('%cDEBUG', 'background: #eee; color: #888', message, ...args); + } + } + + info(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Info) { + console.log('%c INFO', 'color: #33f', message, ...args); + } + } + + warn(message: string | Error, ...args: any[]): void { + if (this.level <= LogLevel.Warning) { + console.log('%c WARN', 'color: #993', message, ...args); + } + } + + error(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Error) { + console.log('%c ERR', 'color: #f33', message, ...args); + } + } + + critical(message: string, ...args: any[]): void { + if (this.level <= LogLevel.Critical) { + console.log('%cCRITI', 'background: #f33; color: white', message, ...args); + } + } + + dispose(): void { } +} + +export class MultiplexLogService implements ILogService { + _serviceBrand: any; + + constructor(private logServices: ILogService[]) { } + + setLevel(level: LogLevel): void { + for (const logService of this.logServices) { + logService.setLevel(level); + } + } + + getLevel(): LogLevel { + for (const logService of this.logServices) { + return logService.getLevel(); + } + return LogLevel.Info; + } + + trace(message: string, ...args: any[]): void { + for (const logService of this.logServices) { + logService.trace(message, ...args); + } + } + + debug(message: string, ...args: any[]): void { + for (const logService of this.logServices) { + logService.debug(message, ...args); + } + } + + info(message: string, ...args: any[]): void { + for (const logService of this.logServices) { + logService.info(message, ...args); + } + } + + warn(message: string, ...args: any[]): void { + for (const logService of this.logServices) { + logService.warn(message, ...args); + } + } + + error(message: string | Error, ...args: any[]): void { + for (const logService of this.logServices) { + logService.error(message, ...args); + } + } + + critical(message: string | Error, ...args: any[]): void { + for (const logService of this.logServices) { + logService.critical(message, ...args); + } + } + + dispose(): void { + for (const logService of this.logServices) { + logService.dispose(); + } + } +} + +export class NoopLogService implements ILogService { + _serviceBrand: any; + setLevel(level: LogLevel): void { } + getLevel(): LogLevel { return LogLevel.Info; } + trace(message: string, ...args: any[]): void { } + debug(message: string, ...args: any[]): void { } + info(message: string, ...args: any[]): void { } + warn(message: string, ...args: any[]): void { } + error(message: string | Error, ...args: any[]): void { } + critical(message: string | Error, ...args: any[]): void { } + dispose(): void { } +} diff --git a/src/vs/platform/log/node/spdlogService.ts b/src/vs/platform/log/node/spdlogService.ts new file mode 100644 index 000000000000..ffdd39e2d23e --- /dev/null +++ b/src/vs/platform/log/node/spdlogService.ts @@ -0,0 +1,111 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as path from 'path'; +import { ILogService, LogLevel, NoopLogService } from 'vs/platform/log/common/log'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { RotatingLogger, setAsyncMode } from 'spdlog'; + +export function createLogService(processName: string, environmentService: IEnvironmentService): ILogService { + try { + setAsyncMode(8192, 2000); + const logfilePath = path.join(environmentService.logsPath, `${processName}.log`); + const logger = new RotatingLogger(processName, logfilePath, 1024 * 1024 * 5, 6); + logger.setLevel(0); + + return new SpdLogService(logger, environmentService.logLevel); + } catch (e) { + console.error(e); + } + return new NoopLogService(); +} + +class SpdLogService implements ILogService { + + _serviceBrand: any; + + constructor( + private readonly logger: RotatingLogger, + private level: LogLevel = LogLevel.Error + ) { + } + + setLevel(logLevel: LogLevel): void { + this.level = logLevel; + } + + getLevel(): LogLevel { + return this.level; + } + + trace(): void { + if (this.level <= LogLevel.Trace) { + this.logger.trace(this.format(arguments)); + } + } + + debug(): void { + if (this.level <= LogLevel.Debug) { + this.logger.debug(this.format(arguments)); + } + } + + info(): void { + if (this.level <= LogLevel.Info) { + this.logger.info(this.format(arguments)); + } + } + + warn(): void { + if (this.level <= LogLevel.Warning) { + this.logger.warn(this.format(arguments)); + } + } + + error(): void { + if (this.level <= LogLevel.Error) { + const arg = arguments[0]; + + if (arg instanceof Error) { + const array = Array.prototype.slice.call(arguments) as any[]; + array[0] = arg.stack; + this.logger.error(this.format(array)); + } else { + this.logger.error(this.format(arguments)); + } + } + } + + critical(): void { + if (this.level <= LogLevel.Critical) { + this.logger.critical(this.format(arguments)); + } + } + + dispose(): void { + this.logger.flush(); + this.logger.drop(); + } + + private format(args: any): string { + let result = ''; + + for (let i = 0; i < args.length; i++) { + let a = args[i]; + + if (typeof a === 'object') { + try { + a = JSON.stringify(a); + } catch (e) { } + } + + result += (i > 0 ? ' ' : '') + a; + } + + return result; + } +} \ No newline at end of file diff --git a/src/vs/platform/markers/common/problemMatcher.ts b/src/vs/platform/markers/common/problemMatcher.ts index b518a234e3fc..05b4f7bc2946 100644 --- a/src/vs/platform/markers/common/problemMatcher.ts +++ b/src/vs/platform/markers/common/problemMatcher.ts @@ -1598,7 +1598,7 @@ class ProblemMatcherRegistryImpl implements IProblemMatcherRegistry { label: localize('eslint-compact', 'ESLint compact problems'), owner: 'eslint', applyTo: ApplyToKind.allDocuments, - fileLocation: FileLocationKind.Relative, + fileLocation: FileLocationKind.Absolute, filePrefix: '${workspaceFolder}', pattern: ProblemPatternRegistry.get('eslint-compact') }); diff --git a/src/vs/platform/message/common/message.ts b/src/vs/platform/message/common/message.ts index cfe7e4488547..63ca9fe894bb 100644 --- a/src/vs/platform/message/common/message.ts +++ b/src/vs/platform/message/common/message.ts @@ -62,12 +62,12 @@ export interface IMessageService { /** * Ask the user for confirmation. */ - confirmSync(confirmation: IConfirmation): boolean; + confirm(confirmation: IConfirmation): boolean; /** - * Ask the user for confirmation without blocking. + * Ask the user for confirmation with a checkbox. */ - confirm(confirmation: IConfirmation): TPromise; + confirmWithCheckbox(confirmation: IConfirmation): TPromise; } export const IChoiceService = createDecorator('choiceService'); diff --git a/src/vs/platform/node/product.ts b/src/vs/platform/node/product.ts index aec3cd8a91a0..68802e24d9b9 100644 --- a/src/vs/platform/node/product.ts +++ b/src/vs/platform/node/product.ts @@ -31,6 +31,7 @@ export interface IProductConfiguration { exeBasedExtensionTips: { [id: string]: any; }; extensionKeywords: { [extension: string]: string[]; }; extensionAllowedBadgeProviders: string[]; + extensionAllowedProposedApi: string[]; keymapExtensionTips: string[]; crashReporter: { companyName: string; diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index cd966c7e1935..358d61cabb9d 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -78,5 +78,5 @@ export interface IProgressService2 { _serviceBrand: any; - withProgress(options: IProgressOptions, task: (progress: IProgress) => TPromise): void; + withProgress(options: IProgressOptions, task: (progress: IProgress) => Thenable): void; } diff --git a/src/vs/platform/request/electron-browser/requestService.ts b/src/vs/platform/request/electron-browser/requestService.ts index da4457c08f12..513ab8151323 100644 --- a/src/vs/platform/request/electron-browser/requestService.ts +++ b/src/vs/platform/request/electron-browser/requestService.ts @@ -61,6 +61,7 @@ export const xhrRequest: IRequestFunction = (options: IRequestOptions): TPromise stream: new ArrayBufferStream(xhr.response) }); }; + xhr.ontimeout = e => reject(new Error(`XHR timeout: ${options.timeout}ms`)); if (options.timeout) { xhr.timeout = options.timeout; diff --git a/src/vs/platform/state/common/state.ts b/src/vs/platform/state/common/state.ts new file mode 100644 index 000000000000..9166da30a455 --- /dev/null +++ b/src/vs/platform/state/common/state.ts @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const IStateService = createDecorator('stateService'); + +export interface IStateService { + _serviceBrand: any; + + getItem(key: string, defaultValue?: T): T; + setItem(key: string, data: any): void; + removeItem(key: string): void; +} \ No newline at end of file diff --git a/src/vs/platform/state/node/stateService.ts b/src/vs/platform/state/node/stateService.ts new file mode 100644 index 000000000000..6d49892b033e --- /dev/null +++ b/src/vs/platform/state/node/stateService.ts @@ -0,0 +1,110 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as path from 'path'; +import * as fs from 'original-fs'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { writeFileAndFlushSync } from 'vs/base/node/extfs'; +import { isUndefined, isUndefinedOrNull } from 'vs/base/common/types'; +import { IStateService } from 'vs/platform/state/common/state'; +import { ILogService } from 'vs/platform/log/common/log'; + +export class FileStorage { + + private database: object = null; + + constructor(private dbPath: string, private onError: (error) => void) { } + + private ensureLoaded(): void { + if (!this.database) { + this.database = this.loadSync(); + } + } + + public getItem(key: string, defaultValue?: T): T { + this.ensureLoaded(); + + const res = this.database[key]; + if (isUndefinedOrNull(res)) { + return defaultValue; + } + + return res; + } + + public setItem(key: string, data: any): void { + this.ensureLoaded(); + + // Remove an item when it is undefined or null + if (isUndefinedOrNull(data)) { + return this.removeItem(key); + } + + // Shortcut for primitives that did not change + if (typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean') { + if (this.database[key] === data) { + return; + } + } + + this.database[key] = data; + this.saveSync(); + } + + public removeItem(key: string): void { + this.ensureLoaded(); + + // Only update if the key is actually present (not undefined) + if (!isUndefined(this.database[key])) { + this.database[key] = void 0; + this.saveSync(); + } + } + + private loadSync(): object { + try { + return JSON.parse(fs.readFileSync(this.dbPath).toString()); // invalid JSON or permission issue can happen here + } catch (error) { + if (error && error.code !== 'ENOENT') { + this.onError(error); + } + + return {}; + } + } + + private saveSync(): void { + try { + writeFileAndFlushSync(this.dbPath, JSON.stringify(this.database, null, 4)); // permission issue can happen here + } catch (error) { + this.onError(error); + } + } +} + +export class StateService implements IStateService { + + _serviceBrand: any; + + private fileStorage: FileStorage; + + constructor( @IEnvironmentService environmentService: IEnvironmentService, @ILogService logService: ILogService) { + this.fileStorage = new FileStorage(path.join(environmentService.userDataPath, 'storage.json'), error => logService.error(error)); + } + + public getItem(key: string, defaultValue?: T): T { + return this.fileStorage.getItem(key, defaultValue); + } + + public setItem(key: string, data: any): void { + this.fileStorage.setItem(key, data); + } + + public removeItem(key: string): void { + this.fileStorage.removeItem(key); + } +} diff --git a/src/vs/platform/state/test/node/state.test.ts b/src/vs/platform/state/test/node/state.test.ts new file mode 100644 index 000000000000..19776218d7d1 --- /dev/null +++ b/src/vs/platform/state/test/node/state.test.ts @@ -0,0 +1,56 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as assert from 'assert'; +import os = require('os'); +import path = require('path'); +import extfs = require('vs/base/node/extfs'); +import { getRandomTestPath } from 'vs/workbench/test/workbenchTestServices'; +import { writeFileAndFlushSync, mkdirp } from 'vs/base/node/extfs'; +import { FileStorage } from 'vs/platform/state/node/stateService'; + +suite('StateService', () => { + const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'stateservice'); + const storageFile = path.join(parentDir, 'storage.json'); + + teardown(done => { + extfs.del(parentDir, os.tmpdir(), done); + }); + + test('Basics', done => { + return mkdirp(parentDir).then(() => { + writeFileAndFlushSync(storageFile, ''); + + let service = new FileStorage(storageFile, () => null); + + service.setItem('some.key', 'some.value'); + assert.equal(service.getItem('some.key'), 'some.value'); + + service.removeItem('some.key'); + assert.equal(service.getItem('some.key', 'some.default'), 'some.default'); + + assert.ok(!service.getItem('some.unknonw.key')); + + service.setItem('some.other.key', 'some.other.value'); + + service = new FileStorage(storageFile, () => null); + + assert.equal(service.getItem('some.other.key'), 'some.other.value'); + + service.setItem('some.other.key', 'some.other.value'); + assert.equal(service.getItem('some.other.key'), 'some.other.value'); + + service.setItem('some.undefined.key', void 0); + assert.equal(service.getItem('some.undefined.key', 'some.default'), 'some.default'); + + service.setItem('some.null.key', null); + assert.equal(service.getItem('some.null.key', 'some.default'), 'some.default'); + + done(); + }); + }); +}); \ No newline at end of file diff --git a/src/vs/platform/storage/node/storage.ts b/src/vs/platform/storage/node/storage.ts deleted file mode 100644 index 438a7af5b8d0..000000000000 --- a/src/vs/platform/storage/node/storage.ts +++ /dev/null @@ -1,94 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import * as path from 'path'; -import * as fs from 'original-fs'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; - -export const IStorageService = createDecorator('storageService'); - -export interface IStorageService { - _serviceBrand: any; - getItem(key: string, defaultValue?: T): T; - setItem(key: string, data: any): void; - removeItem(key: string): void; -} - -export class StorageService implements IStorageService { - - _serviceBrand: any; - - private dbPath: string; - private database: any = null; - - constructor( @IEnvironmentService private environmentService: IEnvironmentService) { - this.dbPath = path.join(environmentService.userDataPath, 'storage.json'); - } - - public getItem(key: string, defaultValue?: T): T { - if (!this.database) { - this.database = this.load(); - } - - const res = this.database[key]; - if (typeof res === 'undefined') { - return defaultValue; - } - - return this.database[key]; - } - - public setItem(key: string, data: any): void { - if (!this.database) { - this.database = this.load(); - } - - // Shortcut for primitives that did not change - if (typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean') { - if (this.database[key] === data) { - return; - } - } - - this.database[key] = data; - this.save(); - } - - public removeItem(key: string): void { - if (!this.database) { - this.database = this.load(); - } - - if (this.database[key]) { - delete this.database[key]; - this.save(); - } - } - - private load(): any { - try { - return JSON.parse(fs.readFileSync(this.dbPath).toString()); // invalid JSON or permission issue can happen here - } catch (error) { - if (this.environmentService.verbose) { - console.error(error); - } - - return {}; - } - } - - private save(): void { - try { - fs.writeFileSync(this.dbPath, JSON.stringify(this.database, null, 4)); // permission issue can happen here - } catch (error) { - if (this.environmentService.verbose) { - console.error(error); - } - } - } -} diff --git a/src/vs/platform/telemetry/browser/idleMonitor.ts b/src/vs/platform/telemetry/browser/idleMonitor.ts deleted file mode 100644 index 8b76f60b9a42..000000000000 --- a/src/vs/platform/telemetry/browser/idleMonitor.ts +++ /dev/null @@ -1,78 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TimeoutTimer } from 'vs/base/common/async'; -import Event, { Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; -import * as dom from 'vs/base/browser/dom'; - -export enum UserStatus { - Idle, - Active -} - -export class IdleMonitor extends Disposable { - - private _lastActiveTime: number; - private _idleCheckTimeout: TimeoutTimer; - private _status: UserStatus; - private _idleTime: number; - - private _onStatusChange: Emitter; - get onStatusChange(): Event { return this._onStatusChange.event; } - - constructor(idleTime: number) { - super(); - - this._status = null; - this._idleCheckTimeout = this._register(new TimeoutTimer()); - this._lastActiveTime = -1; - this._idleTime = idleTime; - this._onStatusChange = new Emitter(); - - this._register(dom.addDisposableListener(document, 'mousemove', () => this._onUserActive())); - this._register(dom.addDisposableListener(document, 'keydown', () => this._onUserActive())); - this._onUserActive(); - } - - get status(): UserStatus { - return this._status; - } - - private _onUserActive(): void { - this._lastActiveTime = (new Date()).getTime(); - - if (this._status !== UserStatus.Active) { - this._status = UserStatus.Active; - this._scheduleIdleCheck(); - this._onStatusChange.fire(this._status); - } - } - - private _onUserIdle(): void { - if (this._status !== UserStatus.Idle) { - this._status = UserStatus.Idle; - this._onStatusChange.fire(this._status); - } - } - - private _scheduleIdleCheck(): void { - const minimumTimeWhenUserCanBecomeIdle = this._lastActiveTime + this._idleTime; - const timeout = minimumTimeWhenUserCanBecomeIdle - (new Date()).getTime(); - - this._idleCheckTimeout.setIfNotSet(() => this._checkIfUserIsIdle(), timeout); - } - - private _checkIfUserIsIdle(): void { - const actualIdleTime = (new Date()).getTime() - this._lastActiveTime; - - if (actualIdleTime >= this._idleTime) { - this._onUserIdle(); - } else { - this._scheduleIdleCheck(); - } - } -} diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 4f55ea15c233..41c3db8d63fd 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -11,7 +11,6 @@ import paths = require('vs/base/common/paths'); import URI from 'vs/base/common/uri'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService, KeybindingSource } from 'vs/platform/keybinding/common/keybinding'; -import { ILifecycleService, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; import { ITelemetryService, ITelemetryInfo, ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; export const NullTelemetryService = new class implements ITelemetryService { @@ -135,7 +134,6 @@ const configurationValueWhitelist = [ 'workbench.sideBar.location', 'window.openFilesInNewWindow', 'javascript.validate.enable', - 'window.reopenFolders', 'window.restoreWindows', 'extensions.autoUpdate', 'files.eol', @@ -184,17 +182,6 @@ export function configurationTelemetry(telemetryService: ITelemetryService, conf }); } -export function lifecycleTelemetry(telemetryService: ITelemetryService, lifecycleService: ILifecycleService): IDisposable { - return lifecycleService.onShutdown(event => { - /* __GDPR__ - "shutdown" : { - "reason" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('shutdown', { reason: ShutdownReason[event] }); - }); -} - export function keybindingsTelemetry(telemetryService: ITelemetryService, keybindingService: IKeybindingService): IDisposable { return keybindingService.onDidUpdateKeybindings(event => { if (event.source === KeybindingSource.User && event.keybindings) { diff --git a/src/vs/platform/telemetry/node/commonProperties.ts b/src/vs/platform/telemetry/node/commonProperties.ts index 3ee844f84e36..0d232325091e 100644 --- a/src/vs/platform/telemetry/node/commonProperties.ts +++ b/src/vs/platform/telemetry/node/commonProperties.ts @@ -7,13 +7,12 @@ import * as Platform from 'vs/base/common/platform'; import * as os from 'os'; import { TPromise } from 'vs/base/common/winjs.base'; import * as uuid from 'vs/base/common/uuid'; +import { readFile } from 'vs/base/node/pfs'; -export const machineIdStorageKey = 'telemetry.machineId'; -export const machineIdIpcChannel = 'vscode:machineId'; - -export function resolveCommonProperties(commit: string, version: string, source: string): TPromise<{ [name: string]: string; }> { +export function resolveCommonProperties(commit: string, version: string, machineId: string, installSourcePath: string): TPromise<{ [name: string]: string; }> { const result: { [name: string]: string; } = Object.create(null); - + // __GDPR__COMMON__ "common.machineId" : { "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" } + result['common.machineId'] = machineId; // __GDPR__COMMON__ "sessionID" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } result['sessionID'] = uuid.generateUuid() + Date.now(); // __GDPR__COMMON__ "commitHash" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } @@ -28,8 +27,6 @@ export function resolveCommonProperties(commit: string, version: string, source: result['common.nodePlatform'] = process.platform; // __GDPR__COMMON__ "common.nodeArch" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } result['common.nodeArch'] = process.arch; - // __GDPR__COMMON__ "common.source" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - result['common.source'] = source; // dynamic properties which value differs on each call let seq = 0; @@ -52,5 +49,13 @@ export function resolveCommonProperties(commit: string, version: string, source: } }); - return TPromise.as(result); + return readFile(installSourcePath, 'utf8').then(contents => { + + // __GDPR__COMMON__ "common.source" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + result['common.source'] = contents.slice(0, 30); + + return result; + }, error => { + return result; + }); } \ No newline at end of file diff --git a/src/vs/platform/telemetry/node/workbenchCommonProperties.ts b/src/vs/platform/telemetry/node/workbenchCommonProperties.ts index 00dbb1346af2..41a7901dffbf 100644 --- a/src/vs/platform/telemetry/node/workbenchCommonProperties.ts +++ b/src/vs/platform/telemetry/node/workbenchCommonProperties.ts @@ -7,12 +7,10 @@ import * as os from 'os'; import { TPromise } from 'vs/base/common/winjs.base'; import * as uuid from 'vs/base/common/uuid'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { getMachineId } from 'vs/base/node/id'; -import { resolveCommonProperties, machineIdStorageKey } from '../node/commonProperties'; +import { resolveCommonProperties } from '../node/commonProperties'; - -export function resolveWorkbenchCommonProperties(storageService: IStorageService, commit: string, version: string, source: string): TPromise<{ [name: string]: string }> { - return resolveCommonProperties(commit, version, source).then(result => { +export function resolveWorkbenchCommonProperties(storageService: IStorageService, commit: string, version: string, machineId: string, installSourcePath: string): TPromise<{ [name: string]: string }> { + return resolveCommonProperties(commit, version, machineId, installSourcePath).then(result => { // __GDPR__COMMON__ "common.version.shell" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } result['common.version.shell'] = process.versions && (process).versions['electron']; // __GDPR__COMMON__ "common.version.renderer" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } @@ -31,32 +29,16 @@ export function resolveWorkbenchCommonProperties(storageService: IStorageService result['common.lastSessionDate'] = lastSessionDate; // __GDPR__COMMON__ "common.isNewSession" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } result['common.isNewSession'] = !lastSessionDate ? '1' : '0'; - - const promises: TPromise[] = []; // __GDPR__COMMON__ "common.instanceId" : { "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" } - promises.push(getOrCreateInstanceId(storageService).then(value => result['common.instanceId'] = value)); - // __GDPR__COMMON__ "common.machineId" : { "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" } - promises.push(getOrCreateMachineId(storageService).then(value => result['common.machineId'] = value)); + result['common.instanceId'] = getOrCreateInstanceId(storageService); - return TPromise.join(promises).then(() => result); - }); -} - -function getOrCreateInstanceId(storageService: IStorageService): TPromise { - let result = storageService.get('telemetry.instanceId') || uuid.generateUuid(); - storageService.store('telemetry.instanceId', result); - return TPromise.as(result); -} - -export function getOrCreateMachineId(storageService: IStorageService): TPromise { - let result = storageService.get(machineIdStorageKey); - - if (result) { - return TPromise.as(result); - } - - return getMachineId().then(result => { - storageService.store(machineIdStorageKey, result); return result; }); } + +function getOrCreateInstanceId(storageService: IStorageService): string { + const result = storageService.get('telemetry.instanceId') || uuid.generateUuid(); + storageService.store('telemetry.instanceId', result); + + return result; +} \ No newline at end of file diff --git a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts index ff36faa14f5d..725718f20bc0 100644 --- a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts @@ -5,49 +5,67 @@ 'use strict'; import * as assert from 'assert'; +import * as path from 'path'; +import * as os from 'os'; +import * as fs from 'fs'; import { TPromise } from 'vs/base/common/winjs.base'; import { resolveWorkbenchCommonProperties } from 'vs/platform/telemetry/node/workbenchCommonProperties'; import { StorageService, InMemoryLocalStorage } from 'vs/platform/storage/common/storageService'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; +import { getRandomTestPath } from 'vs/workbench/test/workbenchTestServices'; +import { del } from 'vs/base/node/extfs'; +import { mkdirp } from 'vs/base/node/pfs'; suite('Telemetry - common properties', function () { + const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'telemetryservice'); + const installSource = path.join(parentDir, 'installSource'); const commit: string = void 0; const version: string = void 0; - const source: string = void 0; let storageService: StorageService; setup(() => { storageService = new StorageService(new InMemoryLocalStorage(), null, TestWorkspace.id); }); + teardown(done => { + del(parentDir, os.tmpdir(), done); + }); + test('default', function () { + return mkdirp(parentDir).then(() => { + fs.writeFileSync(installSource, 'my.install.source'); - return resolveWorkbenchCommonProperties(storageService, commit, version, source).then(props => { + return resolveWorkbenchCommonProperties(storageService, commit, version, 'someMachineId', installSource).then(props => { + assert.ok('commitHash' in props); + assert.ok('sessionID' in props); + assert.ok('timestamp' in props); + assert.ok('common.platform' in props); + assert.ok('common.nodePlatform' in props); + assert.ok('common.nodeArch' in props); + assert.ok('common.timesincesessionstart' in props); + assert.ok('common.sequence' in props); - assert.ok('commitHash' in props); - assert.ok('sessionID' in props); - assert.ok('timestamp' in props); - assert.ok('common.platform' in props); - assert.ok('common.nodePlatform' in props); - assert.ok('common.nodeArch' in props); - assert.ok('common.timesincesessionstart' in props); - assert.ok('common.sequence' in props); + // assert.ok('common.version.shell' in first.data); // only when running on electron + // assert.ok('common.version.renderer' in first.data); + assert.ok('common.osVersion' in props, 'osVersion'); + assert.ok('version' in props); + assert.equal(props['common.source'], 'my.install.source'); - // assert.ok('common.version.shell' in first.data); // only when running on electron - // assert.ok('common.version.renderer' in first.data); - assert.ok('common.osVersion' in props, 'osVersion'); - assert.ok('version' in props); - assert.ok('common.source' in props); + assert.ok('common.firstSessionDate' in props, 'firstSessionDate'); + assert.ok('common.lastSessionDate' in props, 'lastSessionDate'); // conditional, see below, 'lastSessionDate'ow + assert.ok('common.isNewSession' in props, 'isNewSession'); - assert.ok('common.firstSessionDate' in props, 'firstSessionDate'); - assert.ok('common.lastSessionDate' in props, 'lastSessionDate'); // conditional, see below, 'lastSessionDate'ow - assert.ok('common.isNewSession' in props, 'isNewSession'); + // machine id et al + assert.ok('common.instanceId' in props, 'instanceId'); + assert.ok('common.machineId' in props, 'machineId'); - // machine id et al - assert.ok('common.instanceId' in props, 'instanceId'); - assert.ok('common.machineId' in props, 'machineId'); + fs.unlinkSync(installSource); + return resolveWorkbenchCommonProperties(storageService, commit, version, 'someMachineId', installSource).then(props => { + assert.ok(!('common.source' in props)); + }); + }); }); }); @@ -55,7 +73,7 @@ suite('Telemetry - common properties', function () { storageService.store('telemetry.lastSessionDate', new Date().toUTCString()); - return resolveWorkbenchCommonProperties(storageService, commit, version, source).then(props => { + return resolveWorkbenchCommonProperties(storageService, commit, version, 'someMachineId', installSource).then(props => { assert.ok('common.lastSessionDate' in props); // conditional, see below assert.ok('common.isNewSession' in props); @@ -64,7 +82,7 @@ suite('Telemetry - common properties', function () { }); test('values chance on ask', function () { - return resolveWorkbenchCommonProperties(storageService, commit, version, source).then(props => { + return resolveWorkbenchCommonProperties(storageService, commit, version, 'someMachineId', installSource).then(props => { let value1 = props['common.sequence']; let value2 = props['common.sequence']; assert.ok(value1 !== value2, 'seq'); diff --git a/src/vs/platform/update/electron-main/updateService.ts b/src/vs/platform/update/electron-main/updateService.ts index 907364dbd20d..b7f8f5edf69a 100644 --- a/src/vs/platform/update/electron-main/updateService.ts +++ b/src/vs/platform/update/electron-main/updateService.ts @@ -22,6 +22,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IUpdateService, State, IAutoUpdater, IUpdate, IRawUpdate } from 'vs/platform/update/common/update'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { ILogService } from 'vs/platform/log/common/log'; export class UpdateService implements IUpdateService { @@ -88,7 +89,8 @@ export class UpdateService implements IUpdateService { @ILifecycleService private lifecycleService: ILifecycleService, @IConfigurationService private configurationService: IConfigurationService, @ITelemetryService private telemetryService: ITelemetryService, - @IEnvironmentService private environmentService: IEnvironmentService + @IEnvironmentService private environmentService: IEnvironmentService, + @ILogService private logService: ILogService ) { if (process.platform === 'win32') { this.raw = new Win32AutoUpdaterImpl(requestService); @@ -121,7 +123,7 @@ export class UpdateService implements IUpdateService { // Start checking for updates after 30 seconds this.scheduleCheckForUpdates(30 * 1000) - .done(null, err => console.error(err)); + .done(null, err => this.logService.error(err)); } private scheduleCheckForUpdates(delay = 60 * 60 * 1000): TPromise { @@ -268,7 +270,10 @@ export class UpdateService implements IUpdateService { return TPromise.as(null); } + this.logService.trace('update#quitAndInstall(): before lifecycle quit()'); + this.lifecycleService.quit(true /* from update */).done(vetod => { + this.logService.trace(`update#quitAndInstall(): after lifecycle quit() with veto: ${vetod}`); if (vetod) { return; } @@ -277,9 +282,11 @@ export class UpdateService implements IUpdateService { // we workaround this issue by forcing an explicit flush of the storage data. // see also https://github.com/Microsoft/vscode/issues/172 if (process.platform === 'darwin') { + this.logService.trace('update#quitAndInstall(): calling flushStorageData()'); electron.session.defaultSession.flushStorageData(); } + this.logService.trace('update#quitAndInstall(): running raw#quitAndInstall()'); this.raw.quitAndInstall(); }); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index e34f14bfb879..b221607ef393 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -191,10 +191,10 @@ export interface IWindowService { setDocumentEdited(flag: boolean): TPromise; onWindowTitleDoubleClick(): TPromise; show(): TPromise; - showMessageBoxSync(options: MessageBoxOptions): number; - showMessageBox(options: MessageBoxOptions): TPromise; - showSaveDialog(options: SaveDialogOptions, callback?: (fileName: string) => void): string; - showOpenDialog(options: OpenDialogOptions, callback?: (fileNames: string[]) => void): string[]; + showMessageBox(options: MessageBoxOptions): number; + showSaveDialog(options: SaveDialogOptions): string; + showOpenDialog(options: OpenDialogOptions): string[]; + showMessageBoxWithCheckbox(options: MessageBoxOptions): TPromise; } export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden'; @@ -207,7 +207,6 @@ export interface IWindowSettings { openFilesInNewWindow: 'on' | 'off' | 'default'; openFoldersInNewWindow: 'on' | 'off' | 'default'; restoreWindows: 'all' | 'folders' | 'one' | 'none'; - reopenFolders: 'all' | 'one' | 'none'; // TODO@Ben deprecated restoreFullscreen: boolean; zoomLevel: number; titleBarStyle: 'native' | 'custom'; @@ -292,6 +291,9 @@ export interface IAddFoldersRequest { } export interface IWindowConfiguration extends ParsedArgs, IOpenFileRequest { + machineId: string; + windowId: number; + appRoot: string; execPath: string; isInitialStartup?: boolean; diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index 5656370d8da8..3e8a9ee45555 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -123,11 +123,11 @@ export class WindowService implements IWindowService { return this.windowsService.showWindow(this.windowId); } - showMessageBoxSync(options: Electron.MessageBoxOptions): number { + showMessageBox(options: Electron.MessageBoxOptions): number { return remote.dialog.showMessageBox(remote.getCurrentWindow(), options); } - showMessageBox(options: Electron.MessageBoxOptions): TPromise { + showMessageBoxWithCheckbox(options: Electron.MessageBoxOptions): TPromise { return new TPromise((c, e) => { return remote.dialog.showMessageBox(remote.getCurrentWindow(), options, (response: number, checkboxChecked: boolean) => { c({ button: response, checkboxChecked }); @@ -135,7 +135,7 @@ export class WindowService implements IWindowService { }); } - showSaveDialog(options: Electron.SaveDialogOptions, callback?: (fileName: string) => void): string { + showSaveDialog(options: Electron.SaveDialogOptions): string { function normalizePath(path: string): string { if (path && isMacintosh) { @@ -145,14 +145,10 @@ export class WindowService implements IWindowService { return path; } - if (callback) { - return remote.dialog.showSaveDialog(remote.getCurrentWindow(), options, path => callback(normalizePath(path))); - } - return normalizePath(remote.dialog.showSaveDialog(remote.getCurrentWindow(), options)); // https://github.com/electron/electron/issues/4936 } - showOpenDialog(options: Electron.OpenDialogOptions, callback?: (fileNames: string[]) => void): string[] { + showOpenDialog(options: Electron.OpenDialogOptions): string[] { function normalizePaths(paths: string[]): string[] { if (paths && paths.length > 0 && isMacintosh) { @@ -162,10 +158,6 @@ export class WindowService implements IWindowService { return paths; } - if (callback) { - return remote.dialog.showOpenDialog(remote.getCurrentWindow(), options, paths => callback(normalizePaths(paths))); - } - return normalizePaths(remote.dialog.showOpenDialog(remote.getCurrentWindow(), options)); // https://github.com/electron/electron/issues/4936 } diff --git a/src/vs/platform/workbench/common/contextkeys.ts b/src/vs/platform/workbench/common/contextkeys.ts new file mode 100644 index 000000000000..c4a740d8c28b --- /dev/null +++ b/src/vs/platform/workbench/common/contextkeys.ts @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; + +export const InputFocusedContextKey = 'inputFocus'; +export const InputFocusedContext = new RawContextKey(InputFocusedContextKey, false); \ No newline at end of file diff --git a/src/vs/platform/workspaces/common/workspacesIpc.ts b/src/vs/platform/workspaces/common/workspacesIpc.ts index 981405a11905..91257d6d12e6 100644 --- a/src/vs/platform/workspaces/common/workspacesIpc.ts +++ b/src/vs/platform/workspaces/common/workspacesIpc.ts @@ -7,7 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IWorkspacesService, IWorkspaceIdentifier, IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesService, IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; import URI from 'vs/base/common/uri'; export interface IWorkspacesChannel extends IChannel { @@ -17,7 +17,7 @@ export interface IWorkspacesChannel extends IChannel { export class WorkspacesChannel implements IWorkspacesChannel { - constructor(private service: IWorkspacesService) { } + constructor(private service: IWorkspacesMainService) { } public call(command: string, arg?: any): TPromise { switch (command) { diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index 1c59a4d0412b..f06b9ccc058b 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -11,9 +11,9 @@ import { isParent } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { extname, join, dirname, isAbsolute, resolve } from 'path'; import { mkdirp, writeFile, readFile } from 'vs/base/node/pfs'; -import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs'; +import { readFileSync, existsSync, mkdirSync } from 'fs'; import { isLinux, isMacintosh } from 'vs/base/common/platform'; -import { delSync, readdirSync } from 'vs/base/node/extfs'; +import { delSync, readdirSync, writeFileAndFlushSync } from 'vs/base/node/extfs'; import Event, { Emitter } from 'vs/base/common/event'; import { ILogService } from 'vs/platform/log/common/log'; import { isEqual } from 'vs/base/common/paths'; @@ -86,7 +86,7 @@ export class WorkspacesMainService implements IWorkspacesMainService { folders: toWorkspaceFolders(workspace.folders, URI.file(dirname(path))) }; } catch (error) { - this.logService.log(error.toString()); + this.logService.warn(error.toString()); } return null; @@ -136,7 +136,7 @@ export class WorkspacesMainService implements IWorkspacesMainService { mkdirSync(configParent); - writeFileSync(workspace.configPath, JSON.stringify(storedWorkspace, null, '\t')); + writeFileAndFlushSync(workspace.configPath, JSON.stringify(storedWorkspace, null, '\t')); return workspace; } @@ -262,7 +262,7 @@ export class WorkspacesMainService implements IWorkspacesMainService { try { delSync(dirname(configPath)); } catch (error) { - this.logService.log(`Unable to delete untitled workspace ${configPath} (${error}).`); + this.logService.warn(`Unable to delete untitled workspace ${configPath} (${error}).`); } } @@ -271,7 +271,9 @@ export class WorkspacesMainService implements IWorkspacesMainService { try { untitledWorkspacePaths = readdirSync(this.workspacesHome).map(folder => join(this.workspacesHome, folder, UNTITLED_WORKSPACE_NAME)); } catch (error) { - this.logService.log(`Unable to read folders in ${this.workspacesHome} (${error}).`); + if (error && error.code !== 'ENOENT') { + this.logService.warn(`Unable to read folders in ${this.workspacesHome} (${error}).`); + } } const untitledWorkspaces: IWorkspaceIdentifier[] = coalesce(untitledWorkspacePaths.map(untitledWorkspacePath => { diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index f112ef8f9ebd..7031cb064702 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -15,7 +15,7 @@ import { EnvironmentService } from 'vs/platform/environment/node/environmentServ import { parseArgs } from 'vs/platform/environment/node/argv'; import { WorkspacesMainService, IStoredWorkspace } from 'vs/platform/workspaces/electron-main/workspacesMainService'; import { WORKSPACE_EXTENSION, IWorkspaceSavedEvent, IWorkspaceIdentifier, IRawFileWorkspaceFolder, IWorkspaceFolderCreationData, IRawUriWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; -import { LogMainService } from 'vs/platform/log/common/log'; +import { ConsoleLogMainService } from 'vs/platform/log/common/log'; import URI from 'vs/base/common/uri'; import { getRandomTestPath } from 'vs/workbench/test/workbenchTestServices'; @@ -48,7 +48,7 @@ suite('WorkspacesMainService', () => { } const environmentService = new TestEnvironmentService(parseArgs(process.argv), process.execPath); - const logService = new LogMainService(environmentService); + const logService = new ConsoleLogMainService(environmentService); let service: TestWorkspacesMainService; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index d95b2c764ca0..b02773f70b99 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1714,13 +1714,13 @@ declare module 'vscode' { /** * A file glob pattern to match file paths against. This can either be a glob pattern string - * (like `**\*.{ts,js}` or `*.{ts,js}`) or a [relative pattern](#RelativePattern). + * (like `**​/*.{ts,js}` or `*.{ts,js}`) or a [relative pattern](#RelativePattern). * * Glob patterns can have the following syntax: * * `*` to match one or more characters in a path segment * * `?` to match on one character in a path segment * * `**` to match any number of path segments, including none - * * `{}` to group conditions (e.g. `**\*.{ts,js}` matches all TypeScript and JavaScript files) + * * `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files) * * `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …) * * `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`) */ @@ -1732,7 +1732,7 @@ declare module 'vscode' { * its resource, or a glob-pattern that is applied to the [path](#TextDocument.fileName). * * @sample A language filter that applies to typescript files on disk: `{ language: 'typescript', scheme: 'file' }` - * @sample A language filter that applies to all package.json paths: `{ language: 'json', pattern: '**\package.json' }` + * @sample A language filter that applies to all package.json paths: `{ language: 'json', pattern: '**​/package.json' }` */ export interface DocumentFilter { @@ -1758,7 +1758,7 @@ declare module 'vscode' { * and [language filters](#DocumentFilter). * * @sample `let sel:DocumentSelector = 'typescript'`; - * @sample `let sel:DocumentSelector = ['typescript', { language: 'json', pattern: '**\tsconfig.json' }]`; + * @sample `let sel:DocumentSelector = ['typescript', { language: 'json', pattern: '**​/tsconfig.json' }]`; */ export type DocumentSelector = string | DocumentFilter | (string | DocumentFilter)[]; @@ -3452,7 +3452,7 @@ declare module 'vscode' { uri: Uri; /** - * The document range of this locations. + * The document range of this location. */ range: Range; @@ -4496,7 +4496,7 @@ declare module 'vscode' { * has changed. *Note* that the event also fires when the active editor changes * to `undefined`. */ - export const onDidChangeActiveTextEditor: Event; + export const onDidChangeActiveTextEditor: Event; /** * An [event](#Event) which fires when the array of [visible editors](#window.visibleTextEditors) @@ -5260,7 +5260,7 @@ declare module 'vscode' { /** * Find files across all [workspace folders](#workspace.workspaceFolders) in the workspace. * - * @sample `findFiles('**\*.js', '**\node_modules\**', 10)` + * @sample `findFiles('**​/*.js', '**​/node_modules/**', 10)` * @param include A [glob pattern](#GlobPattern) that defines the files to search for. The glob pattern * will be matched against the file paths of resulting matches relative to their workspace. Use a [relative pattern](#RelativePattern) * to restrict the search results to a [workspace folder](#WorkspaceFolder). diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 0f2291ac19ec..566fc38c0173 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -86,9 +86,9 @@ declare module 'vscode' { // todo@joh discover files etc export interface FileSystemProvider { - onDidChange?: Event; + readonly onDidChange?: Event; - root: Uri; + readonly root: Uri; // more... // @@ -247,4 +247,83 @@ declare module 'vscode' { */ provideCodeActions2?(document: TextDocument, range: Range, context: CodeActionContext, token: CancellationToken): ProviderResult<(Command | CodeAction)[]>; } + + export namespace debug { + + /** + * List of breakpoints. + * + * @readonly + */ + export let breakpoints: Breakpoint[]; + + /** + * An event that is emitted when a breakpoint is added, removed, or changed. + */ + export const onDidChangeBreakpoints: Event; + } + + /** + * An event describing a change to the set of [breakpoints](#debug.Breakpoint). + */ + export interface BreakpointsChangeEvent { + /** + * Added breakpoints. + */ + readonly added: Breakpoint[]; + + /** + * Removed breakpoints. + */ + readonly removed: Breakpoint[]; + + /** + * Changed breakpoints. + */ + readonly changed: Breakpoint[]; + } + + /** + * The base class of all breakpoint types. + */ + export class Breakpoint { + /** + * Is breakpoint enabled. + */ + readonly enabled: boolean; + /** + * An optional expression for conditional breakpoints. + */ + readonly condition?: string; + /** + * An optional expression that controls how many hits of the breakpoint are ignored. + */ + readonly hitCondition?: string; + + protected constructor(enabled: boolean, condition: string, hitCondition: string); + } + + /** + * A breakpoint specified by a source location. + */ + export class SourceBreakpoint extends Breakpoint { + /** + * The source and line position of this breakpoint. + */ + readonly location: Location; + + private constructor(enabled: boolean, condition: string, hitCondition: string, location: Location); + } + + /** + * A breakpoint specified by a function name. + */ + export class FunctionBreakpoint extends Breakpoint { + /** + * The name of the function to which this breakpoint is attached. + */ + readonly functionName: string; + + private constructor(enabled: boolean, condition: string, hitCondition: string, functionName: string); + } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadCommands.ts b/src/vs/workbench/api/electron-browser/mainThreadCommands.ts index f0a84773a515..2b21782e38ca 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadCommands.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadCommands.ts @@ -33,7 +33,7 @@ export class MainThreadCommands implements MainThreadCommandsShape { this._generateCommandsDocumentationRegistration.dispose(); } - private _generateCommandsDocumentation(): TPromise { + private _generateCommandsDocumentation(): Thenable { return this._proxy.$getContributedCommandHandlerDescriptions().then(result => { // add local commands const commands = CommandsRegistry.getCommands(); diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts index 3556feea70b8..280264901468 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts @@ -6,10 +6,10 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import uri from 'vs/base/common/uri'; -import { IDebugService, IConfig, IDebugConfigurationProvider } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint } from 'vs/workbench/parts/debug/common/debug'; import { TPromise } from 'vs/base/common/winjs.base'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ExtHostContext, ExtHostDebugServiceShape, MainThreadDebugServiceShape, DebugSessionUUID, MainContext, IExtHostContext } from '../node/extHost.protocol'; +import { ExtHostContext, ExtHostDebugServiceShape, MainThreadDebugServiceShape, DebugSessionUUID, MainContext, IExtHostContext, IBreakpointsDelta, ISourceBreakpointData, IFunctionBreakpointData } from '../node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import severity from 'vs/base/common/severity'; @@ -18,6 +18,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape { private _proxy: ExtHostDebugServiceShape; private _toDispose: IDisposable[]; + private _breakpointEventsActive: boolean; constructor( extHostContext: IExtHostContext, @@ -35,6 +36,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape { this._proxy.$acceptDebugSessionActiveChanged(undefined); } })); + this._toDispose.push(debugService.onDidCustomEvent(event => { if (event && event.sessionId) { const process = this.debugService.getModel().getProcesses().filter(p => p.getId() === event.sessionId).pop(); @@ -49,6 +51,73 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape { this._toDispose = dispose(this._toDispose); } + public $startBreakpointEvents(): TPromise { + + if (!this._breakpointEventsActive) { + this._breakpointEventsActive = true; + + // set up a handler to send more + this._toDispose.push(this.debugService.getModel().onDidChangeBreakpoints(e => { + if (e) { + const delta: IBreakpointsDelta = {}; + if (e.added) { + delta.added = this.toWire(e.added); + } + if (e.removed) { + delta.removed = e.removed.map(x => x.getId()); + } + if (e.changed) { + delta.changed = this.toWire(e.changed); + } + + if (delta.added || delta.removed || delta.changed) { + this._proxy.$acceptBreakpointsDelta(delta); + } + } + })); + + // send all breakpoints + const bps = this.debugService.getModel().getBreakpoints(); + const fbps = this.debugService.getModel().getFunctionBreakpoints(); + if (bps.length > 0 || fbps.length > 0) { + this._proxy.$acceptBreakpointsDelta({ + added: this.toWire(bps).concat(this.toWire(fbps)) + }); + } + } + + return TPromise.wrap(undefined); + } + + private toWire(bps: (IBreakpoint | IFunctionBreakpoint)[]): (ISourceBreakpointData | IFunctionBreakpointData)[] { + + return bps.map(bp => { + if ('name' in bp) { + const fbp = bp; + return { + type: 'function', + id: bp.getId(), + enabled: bp.enabled, + functionName: fbp.name, + hitCondition: bp.hitCondition, + /* condition: bp.condition */ + }; + } else { + const sbp = bp; + return { + type: 'source', + id: bp.getId(), + enabled: bp.enabled, + condition: sbp.condition, + hitCondition: bp.hitCondition, + uri: sbp.uri, + line: sbp.lineNumber > 0 ? sbp.lineNumber - 1 : 0, + character: (typeof sbp.column === 'number' && sbp.column > 0) ? sbp.column - 1 : 0 + }; + } + }); + } + public $registerDebugConfigurationProvider(debugType: string, hasProvide: boolean, hasResolve: boolean, handle: number): TPromise { const provider = { diff --git a/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts b/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts index 2e6768b97ed4..dfc8714ca3b7 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TPromise } from 'vs/base/common/winjs.base'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { MainThreadDiaglogsShape, MainContext, IExtHostContext, MainThreadDialogOpenOptions, MainThreadDialogSaveOptions } from '../node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; @@ -25,29 +24,30 @@ export class MainThreadDialogs implements MainThreadDiaglogsShape { // } - $showOpenDialog(options: MainThreadDialogOpenOptions): TPromise { + $showOpenDialog(options: MainThreadDialogOpenOptions): Promise { // TODO@joh what about remote dev setup? if (options.defaultUri && options.defaultUri.scheme !== 'file') { - return TPromise.wrapError(new Error('Not supported - Open-dialogs can only be opened on `file`-uris.')); + return Promise.reject(new Error('Not supported - Open-dialogs can only be opened on `file`-uris.')); } - return new TPromise(resolve => { - this._windowService.showOpenDialog( - MainThreadDialogs._convertOpenOptions(options), - filenames => resolve(isFalsyOrEmpty(filenames) ? undefined : filenames) + return new Promise(resolve => { + const filenames = this._windowService.showOpenDialog( + MainThreadDialogs._convertOpenOptions(options) ); + + resolve(isFalsyOrEmpty(filenames) ? undefined : filenames); }); } - $showSaveDialog(options: MainThreadDialogSaveOptions): TPromise { + $showSaveDialog(options: MainThreadDialogSaveOptions): Promise { // TODO@joh what about remote dev setup? if (options.defaultUri && options.defaultUri.scheme !== 'file') { - return TPromise.wrapError(new Error('Not supported - Save-dialogs can only be opened on `file`-uris.')); + return Promise.reject(new Error('Not supported - Save-dialogs can only be opened on `file`-uris.')); } - return new TPromise(resolve => { - this._windowService.showSaveDialog( - MainThreadDialogs._convertSaveOptions(options), - filename => resolve(!filename ? undefined : filename) + return new Promise(resolve => { + const filename = this._windowService.showSaveDialog( + MainThreadDialogs._convertSaveOptions(options) ); + resolve(!filename ? undefined : filename); }); } diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts index 35716ef72c44..026be3a7145f 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts @@ -22,7 +22,6 @@ import { IFileService } from 'vs/platform/files/common/files'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { isCodeEditor, isDiffEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; namespace mapset { @@ -307,15 +306,14 @@ export class MainThreadDocumentsAndEditors { @IFileService fileService: IFileService, @ITextModelService textModelResolverService: ITextModelService, @IUntitledEditorService untitledEditorService: IUntitledEditorService, - @IEditorGroupService editorGroupService: IEditorGroupService, - @ITelemetryService telemetryService: ITelemetryService + @IEditorGroupService editorGroupService: IEditorGroupService ) { this._proxy = extHostContext.get(ExtHostContext.ExtHostDocumentsAndEditors); const mainThreadDocuments = new MainThreadDocuments(this, extHostContext, this._modelService, modeService, this._textFileService, fileService, textModelResolverService, untitledEditorService); extHostContext.set(MainContext.MainThreadDocuments, mainThreadDocuments); - const mainThreadEditors = new MainThreadEditors(this, extHostContext, codeEditorService, this._workbenchEditorService, editorGroupService, telemetryService, textModelResolverService, fileService, this._modelService); + const mainThreadEditors = new MainThreadEditors(this, extHostContext, codeEditorService, this._workbenchEditorService, editorGroupService, textModelResolverService, fileService, this._modelService); extHostContext.set(MainContext.MainThreadEditors, mainThreadEditors); // It is expected that the ctor of the state computer calls our `_onDelta`. diff --git a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts index 88e9bff09ad0..9870316763a0 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts @@ -16,7 +16,6 @@ import { Position as EditorPosition, ITextEditorOptions } from 'vs/platform/edit import { MainThreadTextEditor } from './mainThreadEditor'; import { ITextEditorConfigurationUpdate, TextEditorRevealType, IApplyEditsOptions, IUndoStopOptions } from 'vs/workbench/api/node/extHost.protocol'; import { MainThreadDocumentsAndEditors } from './mainThreadDocumentsAndEditors'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { equals as objectEquals } from 'vs/base/common/objects'; import { ExtHostContext, MainThreadEditorsShape, ExtHostEditorsShape, ITextDocumentShowOptions, ITextEditorPositionData, IExtHostContext, IWorkspaceResourceEdit } from '../node/extHost.protocol'; import { IRange } from 'vs/editor/common/core/range'; @@ -32,7 +31,6 @@ export class MainThreadEditors implements MainThreadEditorsShape { private _proxy: ExtHostEditorsShape; private _documentsAndEditors: MainThreadDocumentsAndEditors; private _workbenchEditorService: IWorkbenchEditorService; - private _telemetryService: ITelemetryService; private _toDispose: IDisposable[]; private _textEditorsListenersMap: { [editorId: string]: IDisposable[]; }; private _editorPositionData: ITextEditorPositionData; @@ -44,7 +42,6 @@ export class MainThreadEditors implements MainThreadEditorsShape { @ICodeEditorService private _codeEditorService: ICodeEditorService, @IWorkbenchEditorService workbenchEditorService: IWorkbenchEditorService, @IEditorGroupService editorGroupService: IEditorGroupService, - @ITelemetryService telemetryService: ITelemetryService, @ITextModelService private readonly _textModelResolverService: ITextModelService, @IFileService private readonly _fileService: IFileService, @IModelService private readonly _modelService: IModelService, @@ -52,7 +49,6 @@ export class MainThreadEditors implements MainThreadEditorsShape { this._proxy = extHostContext.get(ExtHostContext.ExtHostEditors); this._documentsAndEditors = documentsAndEditors; this._workbenchEditorService = workbenchEditorService; - this._telemetryService = telemetryService; this._toDispose = []; this._textEditorsListenersMap = Object.create(null); this._editorPositionData = null; @@ -140,14 +136,6 @@ export class MainThreadEditors implements MainThreadEditorsShape { } $tryShowEditor(id: string, position: EditorPosition): TPromise { - // check how often this is used - /* __GDPR__ - "api.deprecated" : { - "function" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog('api.deprecated', { function: 'TextEditor.show' }); - let mainThreadEditor = this._documentsAndEditors.getEditor(id); if (mainThreadEditor) { let model = mainThreadEditor.getModel(); @@ -160,14 +148,6 @@ export class MainThreadEditors implements MainThreadEditorsShape { } $tryHideEditor(id: string): TPromise { - // check how often this is used - /* __GDPR__ - "api.deprecated" : { - "function" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog('api.deprecated', { function: 'TextEditor.hide' }); - let mainThreadEditor = this._documentsAndEditors.getEditor(id); if (mainThreadEditor) { let editors = this._workbenchEditorService.getVisibleEditors(); diff --git a/src/vs/workbench/api/electron-browser/mainThreadErrors.ts b/src/vs/workbench/api/electron-browser/mainThreadErrors.ts index a737587e7060..a1ff2a2dd6cf 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadErrors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadErrors.ts @@ -15,11 +15,11 @@ export class MainThreadErrors implements MainThreadErrorsShape { // } - $onUnexpectedError(err: any | SerializedError, extensionId: string | undefined): void { + $onUnexpectedError(err: any | SerializedError): void { if (err.$isError) { const { name, message, stack } = err; err = new Error(); - err.message = extensionId ? `[${extensionId}] ${message}` : message; + err.message = message; err.name = name; err.stack = stack; } diff --git a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts index ea48b3c3a40b..01f35e37211c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts @@ -9,6 +9,7 @@ import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { MainThreadExtensionServiceShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; import { ExtensionService } from 'vs/workbench/services/extensions/electron-browser/extensionService'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { SerializedError } from 'vs/base/common/errors'; @extHostNamedCustomer(MainContext.MainThreadExtensionService) export class MainThreadExtensionService implements MainThreadExtensionServiceShape { @@ -30,9 +31,21 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha $localShowMessage(severity: Severity, msg: string): void { this._extensionService._logOrShowMessage(severity, msg); } - $onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void { - this._extensionService._onExtensionActivated(extensionId, startup, codeLoadingTime, activateCallTime, activateResolvedTime); + $onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationEvent: string): void { + this._extensionService._onExtensionActivated(extensionId, startup, codeLoadingTime, activateCallTime, activateResolvedTime, activationEvent); + } + $onExtensionRuntimeError(extensionId: string, data: SerializedError): void { + const error = new Error(); + error.name = data.name; + error.message = data.message; + error.stack = data.stack; + this._extensionService._onExtensionRuntimeError(extensionId, error); + console.error(`[${extensionId}]${error.message}`); + console.error(error.stack); } $onExtensionActivationFailed(extensionId: string): void { } + $addMessage(extensionId: string, severity: Severity, message: string): void { + this._extensionService._addMessage(extensionId, severity, message); + } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index 16ce692ccc3b..7466f66d835d 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -164,7 +164,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha $registerQuickFixSupport(handle: number, selector: vscode.DocumentSelector): TPromise { this._registrations[handle] = modes.CodeActionProviderRegistry.register(toLanguageSelector(selector), { - provideCodeActions: (model: IReadOnlyModel, range: EditorRange, token: CancellationToken): Thenable<(modes.Command | modes.CodeAction)[]> => { + provideCodeActions: (model: IReadOnlyModel, range: EditorRange, token: CancellationToken): Thenable => { return this._heapService.trackRecursive(wireCancellationToken(token, this._proxy.$provideCodeActions(handle, model.uri, range))); } }); diff --git a/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts b/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts index 090834e9b6a8..c62b072f5399 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts @@ -8,7 +8,6 @@ import nls = require('vs/nls'); import { IMessageService, IChoiceService } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; import { Action } from 'vs/base/common/actions'; -import { TPromise as Promise } from 'vs/base/common/winjs.base'; import { MainThreadMessageServiceShape, MainContext, IExtHostContext, MainThreadMessageOptions } from '../node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadProgress.ts b/src/vs/workbench/api/electron-browser/mainThreadProgress.ts index 5ddce6f738bc..4b0f1c69aca4 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadProgress.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadProgress.ts @@ -5,7 +5,6 @@ 'use strict'; import { IProgressService2, IProgress, IProgressOptions, IProgressStep } from 'vs/platform/progress/common/progress'; -import { TPromise } from 'vs/base/common/winjs.base'; import { MainThreadProgressShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; @@ -47,7 +46,7 @@ export class MainThreadProgress implements MainThreadProgressShape { private _createTask(handle: number) { return (progress: IProgress) => { - return new TPromise(resolve => { + return new Promise(resolve => { this._progress.set(handle, { resolve, progress }); }); }; diff --git a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts index 77de0d81f241..e1508fc1f4c4 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts @@ -5,13 +5,11 @@ 'use strict'; -import { TPromise } from 'vs/base/common/winjs.base'; import { sequence } from 'vs/base/common/async'; import * as strings from 'vs/base/common/strings'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ISaveParticipant, ITextFileEditorModel, SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IModel, ISingleEditOperation, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; @@ -27,13 +25,7 @@ import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustom import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -export interface INamedSaveParticpant extends ISaveParticipant { - readonly name: string; -} - -class TrimWhitespaceParticipant implements INamedSaveParticpant { - - readonly name = 'TrimWhitespaceParticipant'; +class TrimWhitespaceParticipant implements ISaveParticipant { constructor( @IConfigurationService private configurationService: IConfigurationService, @@ -89,9 +81,7 @@ function findEditor(model: IModel, codeEditorService: ICodeEditorService): ICode return candidate; } -export class FinalNewLineParticipant implements INamedSaveParticpant { - - readonly name = 'FinalNewLineParticipant'; +export class FinalNewLineParticipant implements ISaveParticipant { constructor( @IConfigurationService private configurationService: IConfigurationService, @@ -129,9 +119,7 @@ export class FinalNewLineParticipant implements INamedSaveParticpant { } } -export class TrimFinalNewLinesParticipant implements INamedSaveParticpant { - - readonly name = 'TrimFinalNewLinesParticipant'; +export class TrimFinalNewLinesParticipant implements ISaveParticipant { constructor( @IConfigurationService private configurationService: IConfigurationService, @@ -168,7 +156,11 @@ export class TrimFinalNewLinesParticipant implements INamedSaveParticpant { currentLine = model.getLineContent(currentLineNumber); currentLineIsEmptyOrWhitespace = strings.lastNonWhitespaceIndex(currentLine) === -1; } - model.pushEditOperations(prevSelection, [EditOperation.delete(new Range(currentLineNumber + 1, 1, lineCount + 1, 1))], edits => prevSelection); + + const deletionRange = new Range(currentLineNumber + 1, 1, lineCount + 1, 1); + if (!deletionRange.isEmpty()) { + model.pushEditOperations(prevSelection, [EditOperation.delete(deletionRange)], edits => prevSelection); + } if (editor) { editor.setSelections(prevSelection); @@ -176,9 +168,7 @@ export class TrimFinalNewLinesParticipant implements INamedSaveParticpant { } } -class FormatOnSaveParticipant implements INamedSaveParticpant { - - readonly name = 'FormatOnSaveParticipant'; +class FormatOnSaveParticipant implements ISaveParticipant { constructor( @ICodeEditorService private _editorService: ICodeEditorService, @@ -188,7 +178,7 @@ class FormatOnSaveParticipant implements INamedSaveParticpant { // Nothing } - participate(editorModel: ITextFileEditorModel, env: { reason: SaveReason }): TPromise { + participate(editorModel: ITextFileEditorModel, env: { reason: SaveReason }): Promise { const model = editorModel.textEditorModel; if (env.reason === SaveReason.AUTO @@ -199,7 +189,7 @@ class FormatOnSaveParticipant implements INamedSaveParticpant { const versionNow = model.getVersionId(); const { tabSize, insertSpaces } = model.getOptions(); - return new TPromise((resolve, reject) => { + return new Promise((resolve, reject) => { setTimeout(reject, 750); getDocumentFormattingEdits(model, { tabSize, insertSpaces }) .then(edits => this._editorWorkerService.computeMoreMinimalEdits(model.uri, edits)) @@ -246,23 +236,21 @@ class FormatOnSaveParticipant implements INamedSaveParticpant { } } -class ExtHostSaveParticipant implements INamedSaveParticpant { +class ExtHostSaveParticipant implements ISaveParticipant { private _proxy: ExtHostDocumentSaveParticipantShape; - readonly name = 'ExtHostSaveParticipant'; - constructor(extHostContext: IExtHostContext) { this._proxy = extHostContext.get(ExtHostContext.ExtHostDocumentSaveParticipant); } - participate(editorModel: ITextFileEditorModel, env: { reason: SaveReason }): TPromise { - return new TPromise((resolve, reject) => { + participate(editorModel: ITextFileEditorModel, env: { reason: SaveReason }): Promise { + return new Promise((resolve, reject) => { setTimeout(reject, 1750); this._proxy.$participateInSave(editorModel.getResource(), env.reason).then(values => { for (const success of values) { if (!success) { - return TPromise.wrapError(new Error('listener failed')); + return Promise.reject(new Error('listener failed')); } } return undefined; @@ -275,11 +263,10 @@ class ExtHostSaveParticipant implements INamedSaveParticpant { @extHostCustomer export class SaveParticipant implements ISaveParticipant { - private _saveParticipants: INamedSaveParticpant[]; + private _saveParticipants: ISaveParticipant[]; constructor( extHostContext: IExtHostContext, - @ITelemetryService private _telemetryService: ITelemetryService, @IInstantiationService instantiationService: IInstantiationService, @IConfigurationService configurationService: IConfigurationService, @ICodeEditorService codeEditorService: ICodeEditorService, @@ -302,39 +289,11 @@ export class SaveParticipant implements ISaveParticipant { TextFileEditorModel.setSaveParticipant(undefined); } - participate(model: ITextFileEditorModel, env: { reason: SaveReason }): TPromise { - - const stats: { [name: string]: number } = Object.create(null); - + participate(model: ITextFileEditorModel, env: { reason: SaveReason }): Thenable { const promiseFactory = this._saveParticipants.map(p => () => { - - const { name } = p; - const t1 = Date.now(); - - return TPromise.as(p.participate(model, env)).then(() => { - stats[`Success-${name}`] = Date.now() - t1; - }, err => { - stats[`Failure-${name}`] = Date.now() - t1; - // console.error(err); - }); + return Promise.resolve(p.participate(model, env)); }); - return sequence(promiseFactory).then(() => { - /* __GDPR__ - "saveParticipantStats" : { - "${wildcard}": [ - { - "${prefix}": "Success-", - "${classification}": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } - }, - { - "${prefix}": "Failure-", - "${classification}": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } - } - ] - } - */ - this._telemetryService.publicLog('saveParticipantStats', stats); - }); + return sequence(promiseFactory).then(() => { }); } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts index aa70391c5387..afaa490c84fd 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts @@ -12,6 +12,7 @@ import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { ViewsRegistry } from 'vs/workbench/browser/parts/views/viewsRegistry'; import { ITreeViewDataProvider, ITreeItem } from 'vs/workbench/common/views'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { assign } from 'vs/base/common/objects'; @extHostNamedCustomer(MainContext.MainThreadTreeViews) export class MainThreadTreeViews extends Disposable implements MainThreadTreeViewsShape { @@ -30,10 +31,10 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie ViewsRegistry.registerTreeViewDataProvider(treeViewId, this._register(new TreeViewDataProvider(treeViewId, this._proxy, this.messageService))); } - $refresh(treeViewId: string, treeItemHandles: number[]): void { + $refresh(treeViewId: string, itemsToRefresh: { [treeItemHandle: string]: ITreeItem }): void { const treeViewDataProvider: TreeViewDataProvider = ViewsRegistry.getTreeViewDataProvider(treeViewId); if (treeViewDataProvider) { - treeViewDataProvider.refresh(treeItemHandles); + treeViewDataProvider.refresh(itemsToRefresh); } } @@ -43,7 +44,7 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie } } -type TreeItemHandle = number; +type TreeItemHandle = string; class TreeViewDataProvider implements ITreeViewDataProvider { @@ -53,7 +54,6 @@ class TreeViewDataProvider implements ITreeViewDataProvider { private _onDispose: Emitter = new Emitter(); readonly onDispose: Event = this._onDispose.event; - private childrenMap: Map = new Map(); private itemsMap: Map = new Map(); constructor(private treeViewId: string, @@ -65,8 +65,7 @@ class TreeViewDataProvider implements ITreeViewDataProvider { getElements(): TPromise { return this._proxy.$getElements(this.treeViewId) .then(elements => { - this.postGetElements(null, elements); - return elements; + return this.postGetElements(elements); }, err => { this.messageService.show(Severity.Error, err); return null; @@ -79,20 +78,34 @@ class TreeViewDataProvider implements ITreeViewDataProvider { } return this._proxy.$getChildren(this.treeViewId, treeItem.handle) .then(children => { - this.postGetElements(treeItem.handle, children); - return children; + return this.postGetElements(children); }, err => { this.messageService.show(Severity.Error, err); return null; }); } - refresh(treeItemHandles: number[]) { - if (treeItemHandles && treeItemHandles.length) { - let treeItems = treeItemHandles.map(treeItemHandle => this.itemsMap.get(treeItemHandle)) - .filter(treeItem => !!treeItem); - if (treeItems.length) { - this._onDidChange.fire(treeItems); + refresh(itemsToRefreshByHandle: { [treeItemHandle: string]: ITreeItem }) { + if (itemsToRefreshByHandle) { + const itemsToRefresh: ITreeItem[] = []; + for (const treeItemHandle of Object.keys(itemsToRefreshByHandle)) { + const currentTreeItem = this.itemsMap.get(treeItemHandle); + if (currentTreeItem) { // Refresh only if the item exists + const treeItem = itemsToRefreshByHandle[treeItemHandle]; + // Update the current item with refreshed item + this.updateTreeItem(currentTreeItem, treeItem); + if (treeItemHandle === treeItem.handle) { + itemsToRefresh.push(currentTreeItem); + } else { + // Update maps when handle is changed and refresh parent + this.itemsMap.delete(treeItemHandle); + this.itemsMap.set(currentTreeItem.handle, currentTreeItem); + itemsToRefresh.push(this.itemsMap.get(treeItem.parentHandle)); + } + } + if (itemsToRefresh.length) { + this._onDidChange.fire(itemsToRefresh); + } } } else { this._onDidChange.fire(); @@ -103,21 +116,28 @@ class TreeViewDataProvider implements ITreeViewDataProvider { this._onDispose.fire(); } - private postGetElements(parent: TreeItemHandle, children: ITreeItem[]) { - this.setElements(parent, children); + private postGetElements(elements: ITreeItem[]): ITreeItem[] { + const result = []; + if (elements) { + for (const element of elements) { + const currentTreeItem = this.itemsMap.get(element.handle); + if (currentTreeItem) { + // Update the current item with new item + this.updateTreeItem(currentTreeItem, element); + } else { + this.itemsMap.set(element.handle, element); + } + // Always use the existing items + result.push(this.itemsMap.get(element.handle)); + } + } + return result; } - private setElements(parent: TreeItemHandle, children: ITreeItem[]) { - if (children && children.length) { - for (const child of children) { - this.itemsMap.set(child.handle, child); - if (child.children && child.children.length) { - this.setElements(child.handle, child.children); - } - } - if (parent) { - this.childrenMap.set(parent, children.map(child => child.handle)); - } + private updateTreeItem(current: ITreeItem, treeItem: ITreeItem): void { + treeItem.children = treeItem.children ? treeItem.children : null; + if (current) { + assign(current, treeItem); } } } \ No newline at end of file diff --git a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts index 837eb4f98a3b..d0820e649e0d 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts @@ -14,7 +14,6 @@ import { MainThreadWorkspaceShape, ExtHostWorkspaceShape, ExtHostContext, MainCo import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IRelativePattern, isRelativePattern } from 'vs/base/common/glob'; @extHostNamedCustomer(MainContext.MainThreadWorkspace) export class MainThreadWorkspace implements MainThreadWorkspaceShape { @@ -52,17 +51,17 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { // --- search --- - $startSearch(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults: number, requestId: number): Thenable { + $startSearch(includePattern: string, includeFolder: string, excludePattern: string, maxResults: number, requestId: number): Thenable { const workspace = this._contextService.getWorkspace(); if (!workspace.folders.length) { return undefined; } let folderQueries: IFolderQuery[]; - if (typeof include === 'string' || !include) { + if (typeof includeFolder === 'string') { + folderQueries = [{ folder: URI.file(includeFolder) }]; // if base provided, only search in that folder + } else { folderQueries = workspace.folders.map(folder => ({ folder: folder.uri })); // absolute pattern: search across all folders - } else if (isRelativePattern(include)) { - folderQueries = [{ folder: URI.file(include.base) }]; // relative pattern: search only in base folder } if (!folderQueries) { @@ -83,8 +82,8 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { folderQueries, type: QueryType.File, maxResults, - includePattern: { [typeof include === 'string' ? include : !!include ? include.pattern : undefined]: true }, - excludePattern: { [typeof exclude === 'string' ? exclude : !!exclude ? exclude.pattern : undefined]: true }, + includePattern: { [typeof includePattern === 'string' ? includePattern : undefined]: true }, + excludePattern: { [typeof excludePattern === 'string' ? excludePattern : undefined]: true }, useRipgrep, ignoreSymlinks }; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index af59bb8d4776..feb0e727eb66 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -56,6 +56,9 @@ import { ExtHostFileSystem } from 'vs/workbench/api/node/extHostFileSystem'; import { FileChangeType, FileType } from 'vs/platform/files/common/files'; import { ExtHostDecorations } from 'vs/workbench/api/node/extHostDecorations'; import { toGlobPattern, toLanguageSelector } from 'vs/workbench/api/node/extHostTypeConverters'; +import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionActivator'; +import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { ILogService } from 'vs/platform/log/common/log'; export interface IExtensionApiFactory { (extension: IExtensionDescription): typeof vscode; @@ -79,7 +82,8 @@ export function createApiFactory( threadService: ExtHostThreadService, extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, - extensionService: ExtHostExtensionService + extensionService: ExtHostExtensionService, + logService: ILogService ): IExtensionApiFactory { // Addressable instances @@ -90,7 +94,7 @@ export function createApiFactory( const extHostDocumentContentProviders = threadService.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(threadService, extHostDocumentsAndEditors)); const extHostDocumentSaveParticipant = threadService.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostDocuments, threadService.get(MainContext.MainThreadEditors))); const extHostEditors = threadService.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(threadService, extHostDocumentsAndEditors)); - const extHostCommands = threadService.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(threadService, extHostHeapService)); + const extHostCommands = threadService.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(threadService, extHostHeapService, logService)); const extHostTreeViews = threadService.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(threadService.get(MainContext.MainThreadTreeViews), extHostCommands)); threadService.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace); const extHostDebugService = threadService.set(ExtHostContext.ExtHostDebugService, new ExtHostDebugService(threadService, extHostWorkspace)); @@ -101,7 +105,7 @@ export function createApiFactory( const extHostFileSystemEvent = threadService.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService()); const extHostQuickOpen = threadService.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(threadService, extHostWorkspace, extHostCommands)); const extHostTerminalService = threadService.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(threadService)); - const extHostSCM = threadService.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(threadService, extHostCommands)); + const extHostSCM = threadService.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(threadService, extHostCommands, logService)); const extHostTask = threadService.set(ExtHostContext.ExtHostTask, new ExtHostTask(threadService, extHostWorkspace)); const extHostWindow = threadService.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(threadService)); threadService.set(ExtHostContext.ExtHostExtensionService, extensionService); @@ -123,8 +127,14 @@ export function createApiFactory( return function (extension: IExtensionDescription): typeof vscode { - if (extension.enableProposedApi && !extension.isBuiltin) { + if (!isFalsyOrEmpty(product.extensionAllowedProposedApi) + && product.extensionAllowedProposedApi.indexOf(extension.id) >= 0 + ) { + // fast lane -> proposed api is available to all extensions + // that are listed in product.json-files + extension.enableProposedApi = true; + } else if (extension.enableProposedApi && !extension.isBuiltin) { if ( !initData.environment.enableProposedApiForAll && initData.environment.enableProposedApiFor.indexOf(extension.id) < 0 @@ -217,7 +227,7 @@ export function createApiFactory( return extHostLanguages.getLanguages(); }, match(selector: vscode.DocumentSelector, document: vscode.TextDocument): number { - return score(toLanguageSelector(selector), document.uri, document.languageId); + return score(toLanguageSelector(selector), document.uri, document.languageId); }, registerCodeActionsProvider(selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider): vscode.Disposable { return languageFeatures.registerCodeActionProvider(selector, provider); @@ -460,7 +470,7 @@ export function createApiFactory( return extHostDocuments.onDidSaveDocument(listener, thisArgs, disposables); }, onWillSaveTextDocument: (listener, thisArgs?, disposables?) => { - return extHostDocumentSaveParticipant.onWillSaveTextDocumentEvent(listener, thisArgs, disposables); + return extHostDocumentSaveParticipant.getOnWillSaveTextDocumentEvent(extension)(listener, thisArgs, disposables); }, onDidChangeConfiguration: (listener: (_: any) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => { return extHostConfiguration.onDidChangeConfiguration(listener, thisArgs, disposables); @@ -498,8 +508,8 @@ export function createApiFactory( get activeDebugConsole() { return extHostDebugService.activeDebugConsole; }, - startDebugging(folder: vscode.WorkspaceFolder | undefined, nameOrConfig: string | vscode.DebugConfiguration) { - return extHostDebugService.startDebugging(folder, nameOrConfig); + get breakpoints() { + return extHostDebugService.breakpoints; }, onDidStartDebugSession(listener, thisArg?, disposables?) { return extHostDebugService.onDidStartDebugSession(listener, thisArg, disposables); @@ -513,6 +523,12 @@ export function createApiFactory( onDidReceiveDebugSessionCustomEvent(listener, thisArg?, disposables?) { return extHostDebugService.onDidReceiveDebugSessionCustomEvent(listener, thisArg, disposables); }, + onDidChangeBreakpoints: proposedApiFunction(extension, (listener, thisArgs?, disposables?) => { + return extHostDebugService.onDidChangeBreakpoints(listener, thisArgs, disposables); + }), + startDebugging(folder: vscode.WorkspaceFolder | undefined, nameOrConfig: string | vscode.DebugConfiguration) { + return extHostDebugService.startDebugging(folder, nameOrConfig); + }, registerDebugConfigurationProvider(debugType: string, provider: vscode.DebugConfigurationProvider) { return extHostDebugService.registerDebugConfigurationProvider(debugType, provider); } @@ -531,6 +547,7 @@ export function createApiFactory( scm, debug, // types + Breakpoint: extHostTypes.Breakpoint, CancellationTokenSource: CancellationTokenSource, CodeAction: extHostTypes.CodeAction, CodeLens: extHostTypes.CodeLens, @@ -549,6 +566,7 @@ export function createApiFactory( DocumentHighlightKind: extHostTypes.DocumentHighlightKind, DocumentLink: extHostTypes.DocumentLink, EventEmitter: Emitter, + FunctionBreakpoint: extHostTypes.FunctionBreakpoint, Hover: extHostTypes.Hover, IndentAction: languageConfiguration.IndentAction, Location: extHostTypes.Location, @@ -561,6 +579,7 @@ export function createApiFactory( SignatureHelp: extHostTypes.SignatureHelp, SignatureInformation: extHostTypes.SignatureInformation, SnippetString: extHostTypes.SnippetString, + SourceBreakpoint: extHostTypes.SourceBreakpoint, StatusBarAlignment: extHostTypes.StatusBarAlignment, SymbolInformation: extHostTypes.SymbolInformation, SymbolKind: extHostTypes.SymbolKind, @@ -620,7 +639,7 @@ class Extension implements vscode.Extension { } activate(): Thenable { - return this._extensionService.activateById(this.id, false).then(() => this.exports); + return this._extensionService.activateById(this.id, new ExtensionActivatedByAPI(false)).then(() => this.exports); } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 42ae15c73ab7..111a4643be84 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -46,10 +46,10 @@ import { ITreeItem } from 'vs/workbench/common/views'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SerializedError } from 'vs/base/common/errors'; -import { IRelativePattern } from 'vs/base/common/glob'; import { IWorkspaceFolderData } from 'vs/platform/workspace/common/workspace'; import { IStat, IFileChange } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; +import { ParsedArgs } from 'vs/platform/environment/common/environment'; export interface IEnvironment { isExtensionDevelopmentDebug: boolean; @@ -76,6 +76,9 @@ export interface IInitData { extensions: IExtensionDescription[]; configuration: IConfigurationInitData; telemetryInfo: ITelemetryInfo; + windowId: number; + args: ParsedArgs; + execPath: string; } export interface IConfigurationInitData extends IConfigurationData { @@ -141,8 +144,8 @@ export interface MainThreadDialogSaveOptions { } export interface MainThreadDiaglogsShape extends IDisposable { - $showOpenDialog(options: MainThreadDialogOpenOptions): TPromise; - $showSaveDialog(options: MainThreadDialogSaveOptions): TPromise; + $showOpenDialog(options: MainThreadDialogOpenOptions): Thenable; + $showSaveDialog(options: MainThreadDialogSaveOptions): Thenable; } export interface MainThreadDecorationsShape extends IDisposable { @@ -236,11 +239,11 @@ export interface MainThreadEditorsShape extends IDisposable { export interface MainThreadTreeViewsShape extends IDisposable { $registerView(treeViewId: string): void; - $refresh(treeViewId: string, treeItemHandles: number[]): void; + $refresh(treeViewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem }): void; } export interface MainThreadErrorsShape extends IDisposable { - $onUnexpectedError(err: any | SerializedError, extensionId: string | undefined): void; + $onUnexpectedError(err: any | SerializedError): void; } export interface MainThreadLanguageFeaturesShape extends IDisposable { @@ -328,7 +331,7 @@ export interface MainThreadTelemetryShape extends IDisposable { } export interface MainThreadWorkspaceShape extends IDisposable { - $startSearch(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults: number, requestId: number): Thenable; + $startSearch(includePattern: string, includeFolder: string, excludePattern: string, maxResults: number, requestId: number): Thenable; $cancelSearch(requestId: number): Thenable; $saveAll(includeUntitled?: boolean): Thenable; } @@ -351,8 +354,10 @@ export interface MainThreadTaskShape extends IDisposable { export interface MainThreadExtensionServiceShape extends IDisposable { $localShowMessage(severity: Severity, msg: string): void; - $onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void; + $onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationEvent: string): void; $onExtensionActivationFailed(extensionId: string): void; + $onExtensionRuntimeError(extensionId: string, error: SerializedError): void; + $addMessage(extensionId: string, severity: Severity, message: string): void; } export interface SCMProviderFeatures { @@ -415,6 +420,7 @@ export interface MainThreadDebugServiceShape extends IDisposable { $startDebugging(folder: URI | undefined, nameOrConfig: string | vscode.DebugConfiguration): TPromise; $customDebugAdapterRequest(id: DebugSessionUUID, command: string, args: any): TPromise; $appendDebugConsole(value: string): TPromise; + $startBreakpointEvents(): TPromise; } export interface MainThreadWindowShape extends IDisposable { @@ -425,7 +431,7 @@ export interface MainThreadWindowShape extends IDisposable { export interface ExtHostCommandsShape { $executeContributedCommand(id: string, ...args: any[]): Thenable; - $getContributedCommandHandlerDescriptions(): TPromise<{ [id: string]: string | ICommandHandlerDescription }>; + $getContributedCommandHandlerDescriptions(): Thenable<{ [id: string]: string | ICommandHandlerDescription }>; } export interface ExtHostConfigurationShape { @@ -456,7 +462,7 @@ export interface ExtHostDocumentsShape { } export interface ExtHostDocumentSaveParticipantShape { - $participateInSave(resource: URI, reason: SaveReason): TPromise; + $participateInSave(resource: URI, reason: SaveReason): Thenable; } export interface ITextEditorAddData { @@ -489,7 +495,7 @@ export interface ExtHostDocumentsAndEditorsShape { export interface ExtHostTreeViewsShape { $getElements(treeViewId: string): TPromise; - $getChildren(treeViewId: string, treeItemHandle: number): TPromise; + $getChildren(treeViewId: string, treeItemHandle: string): TPromise; } export interface ExtHostWorkspaceShape { @@ -581,7 +587,7 @@ export interface ExtHostLanguageFeaturesShape { $provideHover(handle: number, resource: URI, position: IPosition): TPromise; $provideDocumentHighlights(handle: number, resource: URI, position: IPosition): TPromise; $provideReferences(handle: number, resource: URI, position: IPosition, context: modes.ReferenceContext): TPromise; - $provideCodeActions(handle: number, resource: URI, range: IRange): TPromise<(modes.Command | modes.CodeAction)[]>; + $provideCodeActions(handle: number, resource: URI, range: IRange): TPromise; $provideDocumentFormattingEdits(handle: number, resource: URI, options: modes.FormattingOptions): TPromise; $provideDocumentRangeFormattingEdits(handle: number, resource: URI, range: IRange, options: modes.FormattingOptions): TPromise; $provideOnTypeFormattingEdits(handle: number, resource: URI, position: IPosition, ch: string, options: modes.FormattingOptions): TPromise; @@ -619,6 +625,32 @@ export interface ExtHostTaskShape { $provideTasks(handle: number): TPromise; } +export interface IBreakpointData { + type: 'source' | 'function'; + id: string; + enabled: boolean; + condition?: string; + hitCondition?: string; +} + +export interface ISourceBreakpointData extends IBreakpointData { + type: 'source'; + uri: URI; + line: number; + character: number; +} + +export interface IFunctionBreakpointData extends IBreakpointData { + type: 'function'; + functionName: string; +} + +export interface IBreakpointsDelta { + added?: (ISourceBreakpointData | IFunctionBreakpointData)[]; + removed?: string[]; + changed?: (ISourceBreakpointData | IFunctionBreakpointData)[]; +} + export interface ExtHostDebugServiceShape { $resolveDebugConfiguration(handle: number, folder: URI | undefined, debugConfiguration: any): TPromise; $provideDebugConfigurations(handle: number, folder: URI | undefined): TPromise; @@ -626,6 +658,7 @@ export interface ExtHostDebugServiceShape { $acceptDebugSessionTerminated(id: DebugSessionUUID, type: string, name: string): void; $acceptDebugSessionActiveChanged(id: DebugSessionUUID | undefined, type?: string, name?: string): void; $acceptDebugSessionCustomEvent(id: DebugSessionUUID, type: string, name: string, event: any): void; + $acceptBreakpointsDelta(delat: IBreakpointsDelta): void; } diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index 6a4c1e415dc8..0bafb7cb7c65 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -16,6 +16,7 @@ import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { IWorkspaceSymbolProvider } from 'vs/workbench/parts/search/common/search'; import { Position as EditorPosition, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { CustomCodeAction } from 'vs/workbench/api/node/extHostLanguageFeatures'; export class ExtHostApiCommands { @@ -392,16 +393,26 @@ export class ExtHostApiCommands { }); } - private _executeCodeActionProvider(resource: URI, range: types.Range): Thenable { + private _executeCodeActionProvider(resource: URI, range: types.Range): Thenable<(vscode.CodeAction | vscode.Command)[]> { const args = { resource, range: typeConverters.fromRange(range) }; - return this._commands.executeCommand('_executeCodeActionProvider', args).then(value => { + return this._commands.executeCommand('_executeCodeActionProvider', args).then(value => { if (!Array.isArray(value)) { return undefined; } - return value.map(quickFix => this._commands.converter.fromInternal(quickFix)); + return value.map(codeAction => { + if (codeAction._isSynthetic) { + return this._commands.converter.fromInternal(codeAction.command); + } else { + const ret = new types.CodeAction( + codeAction.title, + typeConverters.WorkspaceEdit.to(codeAction.edits) + ); + return ret; + } + }); }); } diff --git a/src/vs/workbench/api/node/extHostCommands.ts b/src/vs/workbench/api/node/extHostCommands.ts index 774d71f8e262..0fea03506f5b 100644 --- a/src/vs/workbench/api/node/extHostCommands.ts +++ b/src/vs/workbench/api/node/extHostCommands.ts @@ -6,7 +6,6 @@ import { validateConstraint } from 'vs/base/common/types'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; -import { TPromise } from 'vs/base/common/winjs.base'; import * as extHostTypes from 'vs/workbench/api/node/extHostTypes'; import * as extHostTypeConverter from 'vs/workbench/api/node/extHostTypeConverters'; import { cloneAndChange } from 'vs/base/common/objects'; @@ -15,6 +14,7 @@ import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import * as modes from 'vs/editor/common/modes'; import * as vscode from 'vscode'; +import { ILogService } from 'vs/platform/log/common/log'; interface CommandHandler { callback: Function; @@ -35,7 +35,8 @@ export class ExtHostCommands implements ExtHostCommandsShape { constructor( mainContext: IMainContext, - heapService: ExtHostHeapService + heapService: ExtHostHeapService, + private logService: ILogService ) { this._proxy = mainContext.get(MainContext.MainThreadCommands); this._converter = new CommandsConverter(this, heapService); @@ -50,6 +51,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { } registerCommand(id: string, callback: (...args: any[]) => T | Thenable, thisArg?: any, description?: ICommandHandlerDescription): extHostTypes.Disposable { + this.logService.trace('ExtHostCommands#registerCommand', id); if (!id.trim().length) { throw new Error('invalid id'); @@ -70,6 +72,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { } executeCommand(id: string, ...args: any[]): Thenable { + this.logService.trace('ExtHostCommands#executeCommand', id); if (this._commands.has(id)) { // we stay inside the extension host and support @@ -102,7 +105,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { $executeContributedCommand(id: string, ...args: any[]): Thenable { let command = this._commands.get(id); if (!command) { - return TPromise.wrapError(new Error(`Contributed command '${id}' does not exist.`)); + return Promise.reject(new Error(`Contributed command '${id}' does not exist.`)); } let { callback, thisArg, description } = command; @@ -112,7 +115,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { try { validateConstraint(args[i], description.args[i].constraint); } catch (err) { - return TPromise.wrapError(new Error(`Running the contributed command:'${id}' failed. Illegal argument '${description.args[i].name}' - ${description.args[i].description}`)); + return Promise.reject(new Error(`Running the contributed command:'${id}' failed. Illegal argument '${description.args[i].name}' - ${description.args[i].description}`)); } } } @@ -121,7 +124,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { try { let result = callback.apply(thisArg, args); - return TPromise.as(result); + return Promise.resolve(result); } catch (err) { // console.log(err); // try { @@ -129,11 +132,13 @@ export class ExtHostCommands implements ExtHostCommandsShape { // } catch (err) { // // // } - return TPromise.wrapError(new Error(`Running the contributed command:'${id}' failed.`)); + return Promise.reject(new Error(`Running the contributed command:'${id}' failed.`)); } } getCommands(filterUnderscoreCommands: boolean = false): Thenable { + this.logService.trace('ExtHostCommands#getCommands', filterUnderscoreCommands); + return this._proxy.$getCommands().then(result => { if (filterUnderscoreCommands) { result = result.filter(command => command[0] !== '_'); @@ -142,7 +147,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { }); } - $getContributedCommandHandlerDescriptions(): TPromise<{ [id: string]: string | ICommandHandlerDescription }> { + $getContributedCommandHandlerDescriptions(): Thenable<{ [id: string]: string | ICommandHandlerDescription }> { const result: { [id: string]: string | ICommandHandlerDescription } = Object.create(null); this._commands.forEach((command, id) => { let { description } = command; @@ -150,7 +155,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { result[id] = description; } }); - return TPromise.as(result); + return Promise.resolve(result); } } diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index 4e9bd4c99b43..ad91917fa767 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -7,12 +7,12 @@ import { TPromise } from 'vs/base/common/winjs.base'; import Event, { Emitter } from 'vs/base/common/event'; import { asWinJsPromise } from 'vs/base/common/async'; -import { MainContext, MainThreadDebugServiceShape, ExtHostDebugServiceShape, DebugSessionUUID, IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, MainThreadDebugServiceShape, ExtHostDebugServiceShape, DebugSessionUUID, IMainContext, IBreakpointsDelta, ISourceBreakpointData, IFunctionBreakpointData } from 'vs/workbench/api/node/extHost.protocol'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import * as vscode from 'vscode'; import URI from 'vs/base/common/uri'; -import * as types from 'vs/workbench/api/node/extHostTypes'; +import { Disposable, Position, Location, SourceBreakpoint, FunctionBreakpoint } from 'vs/workbench/api/node/extHostTypes'; export class ExtHostDebugService implements ExtHostDebugServiceShape { @@ -43,6 +43,11 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { private _activeDebugConsole: ExtHostDebugConsole; get activeDebugConsole(): ExtHostDebugConsole { return this._activeDebugConsole; } + private _breakpoints: Map; + private _breakpointEventsActive: boolean; + + private _onDidChangeBreakpoints: Emitter; + constructor(mainContext: IMainContext, workspace: ExtHostWorkspace) { @@ -58,19 +63,94 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { this._debugServiceProxy = mainContext.get(MainContext.MainThreadDebugService); + this._onDidChangeBreakpoints = new Emitter({ + onFirstListenerAdd: () => { + this.startBreakpoints(); + } + }); + this._activeDebugConsole = new ExtHostDebugConsole(this._debugServiceProxy); + + this._breakpoints = new Map(); + this._breakpointEventsActive = false; + } + + private startBreakpoints() { + if (!this._breakpointEventsActive) { + this._breakpointEventsActive = true; + this._debugServiceProxy.$startBreakpointEvents(); + } + } + + get onDidChangeBreakpoints(): Event { + return this._onDidChangeBreakpoints.event; + } + + get breakpoints(): vscode.Breakpoint[] { + + this.startBreakpoints(); + + const result: vscode.Breakpoint[] = []; + this._breakpoints.forEach(bp => result.push(bp)); + return result; + } + + public $acceptBreakpointsDelta(delta: IBreakpointsDelta): void { + + let a: vscode.Breakpoint[] = []; + let r: vscode.Breakpoint[] = []; + let c: vscode.Breakpoint[] = []; + + if (delta.added) { + a = delta.added.map(bpd => { + const bp = this.fromWire(bpd); + this._breakpoints.set(bpd.id, bp); + return bp; + }); + } + + if (delta.removed) { + r = delta.removed.map(id => { + const bp = this._breakpoints.get(id); + if (bp) { + this._breakpoints.delete(id); + } + return bp; + }); + } + + if (delta.changed) { + c = delta.changed.map(bpd => { + const bp = this.fromWire(bpd); + this._breakpoints.set(bpd.id, bp); + return bp; + }); + } + + this._onDidChangeBreakpoints.fire(Object.freeze({ + added: Object.freeze(a || []), + removed: Object.freeze(r || []), + changed: Object.freeze(c || []) + })); + } + + private fromWire(bp: ISourceBreakpointData | IFunctionBreakpointData): vscode.Breakpoint { + if (bp.type === 'function') { + return new FunctionBreakpoint(bp.enabled, bp.condition, bp.hitCondition, bp.functionName); + } + return new SourceBreakpoint(bp.enabled, bp.condition, bp.hitCondition, new Location(bp.uri, new Position(bp.line, bp.character))); } public registerDebugConfigurationProvider(type: string, provider: vscode.DebugConfigurationProvider): vscode.Disposable { if (!provider) { - return new types.Disposable(() => { }); + return new Disposable(() => { }); } let handle = this.nextHandle(); this._handlers.set(handle, provider); this._debugServiceProxy.$registerDebugConfigurationProvider(type, !!provider.provideDebugConfigurations, !!provider.resolveDebugConfiguration, handle); - return new types.Disposable(() => { + return new Disposable(() => { this._handlers.delete(handle); this._debugServiceProxy.$unregisterDebugConfigurationProvider(handle); }); @@ -87,7 +167,6 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { return asWinJsPromise(token => handler.provideDebugConfigurations(this.getFolder(folderUri), token)); } - public $resolveDebugConfiguration(handle: number, folderUri: URI | undefined, debugConfiguration: vscode.DebugConfiguration): TPromise { let handler = this._handlers.get(handle); if (!handler) { diff --git a/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts b/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts index 607c8c27b4d9..da949bda9376 100644 --- a/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts +++ b/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts @@ -8,7 +8,6 @@ import Event from 'vs/base/common/event'; import URI from 'vs/base/common/uri'; import { sequence, always } from 'vs/base/common/async'; import { illegalState } from 'vs/base/common/errors'; -import { TPromise } from 'vs/base/common/winjs.base'; import { ExtHostDocumentSaveParticipantShape, MainThreadEditorsShape, IWorkspaceResourceEdit } from 'vs/workbench/api/node/extHost.protocol'; import { TextEdit } from 'vs/workbench/api/node/extHostTypes'; import { fromRange, TextDocumentSaveReason, EndOfLine } from 'vs/workbench/api/node/extHostTypeConverters'; @@ -16,12 +15,15 @@ import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import * as vscode from 'vscode'; import { LinkedList } from 'vs/base/common/linkedList'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; + +type Listener = [Function, any, IExtensionDescription]; export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSaveParticipantShape { private _documents: ExtHostDocuments; private _mainThreadEditors: MainThreadEditorsShape; - private _callbacks = new LinkedList<[Function, any]>(); + private _callbacks = new LinkedList(); private _badListeners = new WeakMap(); private _thresholds: { timeout: number; errors: number; }; @@ -35,9 +37,9 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic this._callbacks.clear(); } - get onWillSaveTextDocumentEvent(): Event { + getOnWillSaveTextDocumentEvent(extension: IExtensionDescription): Event { return (listener, thisArg, disposables) => { - const remove = this._callbacks.push([listener, thisArg]); + const remove = this._callbacks.push([listener, thisArg, extension]); const result = { dispose: remove }; if (Array.isArray(disposables)) { disposables.push(result); @@ -46,13 +48,13 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic }; } - $participateInSave(resource: URI, reason: SaveReason): TPromise { + $participateInSave(resource: URI, reason: SaveReason): Thenable { const entries = this._callbacks.toArray(); let didTimeout = false; let didTimeoutHandle = setTimeout(() => didTimeout = true, this._thresholds.timeout); - const promise = sequence(entries.map(([fn, thisArg]) => { + const promise = sequence(entries.map(listener => { return () => { if (didTimeout) { @@ -61,18 +63,17 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic } const document = this._documents.getDocumentData(resource).document; - return this._deliverEventAsyncAndBlameBadListeners(fn, thisArg, { document, reason: TextDocumentSaveReason.to(reason) }); + return this._deliverEventAsyncAndBlameBadListeners(listener, { document, reason: TextDocumentSaveReason.to(reason) }); }; })); - return always(promise, () => clearTimeout(didTimeoutHandle)); } - private _deliverEventAsyncAndBlameBadListeners(listener: Function, thisArg: any, stubEvent: vscode.TextDocumentWillSaveEvent): TPromise { + private _deliverEventAsyncAndBlameBadListeners([listener, thisArg, extension]: Listener, stubEvent: vscode.TextDocumentWillSaveEvent): Promise { const errors = this._badListeners.get(listener); if (errors > this._thresholds.errors) { // bad listener - ignore - return TPromise.wrap(false); + return Promise.resolve(false); } return this._deliverEventAsync(listener, thisArg, stubEvent).then(() => { @@ -93,9 +94,9 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic }); } - private _deliverEventAsync(listener: Function, thisArg: any, stubEvent: vscode.TextDocumentWillSaveEvent): TPromise { + private _deliverEventAsync(listener: Function, thisArg: any, stubEvent: vscode.TextDocumentWillSaveEvent): Promise { - const promises: TPromise[] = []; + const promises: Promise[] = []; const { document, reason } = stubEvent; const { version } = document; @@ -107,7 +108,7 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic if (Object.isFrozen(promises)) { throw illegalState('waitUntil can not be called async'); } - promises.push(TPromise.wrap(p)); + promises.push(Promise.resolve(p)); } }); @@ -115,16 +116,23 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic // fire event listener.apply(thisArg, [event]); } catch (err) { - return TPromise.wrapError(err); + return Promise.reject(err); } // freeze promises after event call Object.freeze(promises); - return new TPromise((resolve, reject) => { + return new Promise((resolve, reject) => { // join on all listener promises, reject after timeout const handle = setTimeout(() => reject(new Error('timeout')), this._thresholds.timeout); - return always(TPromise.join(promises), () => clearTimeout(handle)).then(resolve, reject); + + return Promise.all(promises).then(edits => { + clearTimeout(handle); + resolve(edits); + }).catch(err => { + clearTimeout(handle); + reject(err); + }); }).then(values => { @@ -156,7 +164,7 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic } // TODO@joh bubble this to listener? - return TPromise.wrapError(new Error('concurrent_edits')); + return Promise.reject(new Error('concurrent_edits')); }); } } diff --git a/src/vs/workbench/api/node/extHostExtensionActivator.ts b/src/vs/workbench/api/node/extHostExtensionActivator.ts index 5b36a1aaa79e..5038d467d3b3 100644 --- a/src/vs/workbench/api/node/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/node/extHostExtensionActivator.ts @@ -159,9 +159,24 @@ export class FailedExtension extends ActivatedExtension { export interface IExtensionsActivatorHost { showMessage(severity: Severity, message: string): void; - actualActivateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise; + actualActivateExtension(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): TPromise; } +export class ExtensionActivatedByEvent { + constructor( + public readonly startup: boolean, + public readonly activationEvent: string + ) { } +} + +export class ExtensionActivatedByAPI { + constructor( + public readonly startup: boolean + ) { } +} + +export type ExtensionActivationReason = ExtensionActivatedByEvent | ExtensionActivatedByAPI; + export class ExtensionsActivator { private readonly _registry: ExtensionDescriptionRegistry; @@ -192,23 +207,23 @@ export class ExtensionsActivator { return this._activatedExtensions[extensionId]; } - public activateByEvent(activationEvent: string, startup: boolean): TPromise { + public activateByEvent(activationEvent: string, reason: ExtensionActivationReason): TPromise { if (this._alreadyActivatedEvents[activationEvent]) { return NO_OP_VOID_PROMISE; } let activateExtensions = this._registry.getExtensionDescriptionsForActivationEvent(activationEvent); - return this._activateExtensions(activateExtensions, startup, 0).then(() => { + return this._activateExtensions(activateExtensions, reason, 0).then(() => { this._alreadyActivatedEvents[activationEvent] = true; }); } - public activateById(extensionId: string, startup: boolean): TPromise { + public activateById(extensionId: string, reason: ExtensionActivationReason): TPromise { let desc = this._registry.getExtensionDescription(extensionId); if (!desc) { throw new Error('Extension `' + extensionId + '` is not known'); } - return this._activateExtensions([desc], startup, 0); + return this._activateExtensions([desc], reason, 0); } /** @@ -252,7 +267,7 @@ export class ExtensionsActivator { } } - private _activateExtensions(extensionDescriptions: IExtensionDescription[], startup: boolean, recursionLevel: number): TPromise { + private _activateExtensions(extensionDescriptions: IExtensionDescription[], reason: ExtensionActivationReason, recursionLevel: number): TPromise { // console.log(recursionLevel, '_activateExtensions: ', extensionDescriptions.map(p => p.id)); if (extensionDescriptions.length === 0) { return TPromise.as(void 0); @@ -294,15 +309,15 @@ export class ExtensionsActivator { if (red.length === 0) { // Finally reached only leafs! - return TPromise.join(green.map((p) => this._activateExtension(p, startup))).then(_ => void 0); + return TPromise.join(green.map((p) => this._activateExtension(p, reason))).then(_ => void 0); } - return this._activateExtensions(green, startup, recursionLevel + 1).then(_ => { - return this._activateExtensions(red, startup, recursionLevel + 1); + return this._activateExtensions(green, reason, recursionLevel + 1).then(_ => { + return this._activateExtensions(red, reason, recursionLevel + 1); }); } - private _activateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise { + private _activateExtension(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): TPromise { if (hasOwnProperty.call(this._activatedExtensions, extensionDescription.id)) { return TPromise.as(void 0); } @@ -311,7 +326,7 @@ export class ExtensionsActivator { return this._activatingExtensions[extensionDescription.id]; } - this._activatingExtensions[extensionDescription.id] = this._host.actualActivateExtension(extensionDescription, startup).then(null, (err) => { + this._activatingExtensions[extensionDescription.id] = this._host.actualActivateExtension(extensionDescription, reason).then(null, (err) => { this._host.showMessage(Severity.Error, nls.localize('activationError', "Activating extension `{0}` failed: {1}.", extensionDescription.id, err.message)); console.error('Activating extension `' + extensionDescription.id + '` failed: ', err.message); console.log('Here is the error stack: ', err.stack); diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 7679350dda8d..71a56b06be48 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -6,7 +6,7 @@ import { dispose } from 'vs/base/common/lifecycle'; import { join } from 'path'; -import { mkdirp, dirExists } from 'vs/base/node/pfs'; +import { mkdirp, dirExists, realpath } from 'vs/base/node/pfs'; import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/node/extensionDescriptionRegistry'; @@ -14,13 +14,13 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions' import { ExtHostStorage } from 'vs/workbench/api/node/extHostStorage'; import { createApiFactory, initializeExtensionApi } from 'vs/workbench/api/node/extHost.api.impl'; import { MainContext, MainThreadExtensionServiceShape, IWorkspaceData, IEnvironment, IInitData, ExtHostExtensionServiceShape, MainThreadTelemetryShape } from './extHost.protocol'; -import { IExtensionMemento, ExtensionsActivator, ActivatedExtension, IExtensionAPI, IExtensionContext, EmptyExtension, IExtensionModule, ExtensionActivationTimesBuilder, ExtensionActivationTimes } from 'vs/workbench/api/node/extHostExtensionActivator'; +import { IExtensionMemento, ExtensionsActivator, ActivatedExtension, IExtensionAPI, IExtensionContext, EmptyExtension, IExtensionModule, ExtensionActivationTimesBuilder, ExtensionActivationTimes, ExtensionActivationReason, ExtensionActivatedByEvent } from 'vs/workbench/api/node/extHostExtensionActivator'; import { ExtHostThreadService } from 'vs/workbench/services/thread/node/extHostThreadService'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; -import { realpath } from 'fs'; import { TernarySearchTree } from 'vs/base/common/map'; import { Barrier } from 'vs/base/common/async'; +import { ILogService } from 'vs/platform/log/common/log'; class ExtensionMemento implements IExtensionMemento { @@ -117,6 +117,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private readonly _storage: ExtHostStorage; private readonly _storagePath: ExtensionStoragePath; private readonly _proxy: MainThreadExtensionServiceShape; + private readonly _logService: ILogService; private _activator: ExtensionsActivator; private _extensionPathIndex: TPromise>; /** @@ -125,11 +126,13 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { constructor(initData: IInitData, threadService: ExtHostThreadService, extHostWorkspace: ExtHostWorkspace, - extHostConfiguration: ExtHostConfiguration + extHostConfiguration: ExtHostConfiguration, + logService: ILogService ) { this._barrier = new Barrier(); this._registry = new ExtensionDescriptionRegistry(initData.extensions); this._threadService = threadService; + this._logService = logService; this._mainThreadTelemetry = threadService.get(MainContext.MainThreadTelemetry); this._storage = new ExtHostStorage(threadService); this._storagePath = new ExtensionStoragePath(initData.workspace, initData.environment); @@ -137,7 +140,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._activator = null; // initialize API first (i.e. do not release barrier until the API is initialized) - const apiFactory = createApiFactory(initData, threadService, extHostWorkspace, extHostConfiguration, this); + const apiFactory = createApiFactory(initData, threadService, extHostWorkspace, extHostConfiguration, this, logService); initializeExtensionApi(this, apiFactory).then(() => { @@ -157,8 +160,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { } }, - actualActivateExtension: (extensionDescription: IExtensionDescription, startup: boolean): TPromise => { - return this._activateExtension(extensionDescription, startup); + actualActivateExtension: (extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): TPromise => { + return this._activateExtension(extensionDescription, reason); } }); @@ -178,18 +181,19 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { } public activateByEvent(activationEvent: string, startup: boolean): TPromise { + const reason = new ExtensionActivatedByEvent(startup, activationEvent); if (this._barrier.isOpen()) { - return this._activator.activateByEvent(activationEvent, startup); + return this._activator.activateByEvent(activationEvent, reason); } else { - return this._barrier.wait().then(() => this._activator.activateByEvent(activationEvent, startup)); + return this._barrier.wait().then(() => this._activator.activateByEvent(activationEvent, reason)); } } - public activateById(extensionId: string, startup: boolean): TPromise { + public activateById(extensionId: string, reason: ExtensionActivationReason): TPromise { if (this._barrier.isOpen()) { - return this._activator.activateById(extensionId, startup); + return this._activator.activateById(extensionId, reason); } else { - return this._barrier.wait().then(() => this._activator.activateById(extensionId, startup)); + return this._barrier.wait().then(() => this._activator.activateById(extensionId, reason)); } } @@ -217,16 +221,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { if (!ext.main) { return undefined; } - return new TPromise((resolve, reject) => { - realpath(ext.extensionFolderPath, (err, path) => { - if (err) { - reject(err); - } else { - tree.set(path, ext); - resolve(void 0); - } - }); - }); + return realpath(ext.extensionFolderPath).then(value => tree.set(value, ext)); + }); this._extensionPathIndex = TPromise.join(extensions).then(() => tree); } @@ -272,12 +268,17 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { return result; } + public addMessage(extensionId: string, severity: Severity, message: string): void { + this._proxy.$addMessage(extensionId, severity, message); + } + // --- impl - private _activateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise { - return this._doActivateExtension(extensionDescription, startup).then((activatedExtension) => { + private _activateExtension(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): TPromise { + return this._doActivateExtension(extensionDescription, reason).then((activatedExtension) => { const activationTimes = activatedExtension.activationTimes; - this._proxy.$onExtensionActivated(extensionDescription.id, activationTimes.startup, activationTimes.codeLoadingTime, activationTimes.activateCallTime, activationTimes.activateResolvedTime); + let activationEvent = (reason instanceof ExtensionActivatedByEvent ? reason.activationEvent : null); + this._proxy.$onExtensionActivated(extensionDescription.id, activationTimes.startup, activationTimes.codeLoadingTime, activationTimes.activateCallTime, activationTimes.activateResolvedTime, activationEvent); return activatedExtension; }, (err) => { this._proxy.$onExtensionActivationFailed(extensionDescription.id); @@ -285,7 +286,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { }); } - private _doActivateExtension(extensionDescription: IExtensionDescription, startup: boolean): TPromise { + private _doActivateExtension(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): TPromise { let event = getTelemetryActivationEvent(extensionDescription); /* __GDPR__ "activatePlugin" : { @@ -300,12 +301,14 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { return TPromise.as(new EmptyExtension(ExtensionActivationTimes.NONE)); } - const activationTimesBuilder = new ExtensionActivationTimesBuilder(startup); + this._logService.info(`ExtensionService#_doActivateExtension ${extensionDescription.id} ${JSON.stringify(reason)}`); + + const activationTimesBuilder = new ExtensionActivationTimesBuilder(reason.startup); return TPromise.join([ - loadCommonJSModule(extensionDescription.main, activationTimesBuilder), + loadCommonJSModule(this._logService, extensionDescription.main, activationTimesBuilder), this._loadExtensionContext(extensionDescription) ]).then(values => { - return ExtHostExtensionService._callActivate(values[0], values[1], activationTimesBuilder); + return ExtHostExtensionService._callActivate(this._logService, extensionDescription.id, values[0], values[1], activationTimesBuilder); }, (errors: any[]) => { // Avoid failing with an array of errors, fail with a single error if (errors[0]) { @@ -323,6 +326,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { let globalState = new ExtensionMemento(extensionDescription.id, true, this._storage); let workspaceState = new ExtensionMemento(extensionDescription.id, false, this._storage); + this._logService.trace(`ExtensionService#loadExtensionContext ${extensionDescription.id}`); return TPromise.join([ globalState.whenReady, workspaceState.whenReady, @@ -339,22 +343,23 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { }); } - private static _callActivate(extensionModule: IExtensionModule, context: IExtensionContext, activationTimesBuilder: ExtensionActivationTimesBuilder): Thenable { + private static _callActivate(logService: ILogService, extensionId: string, extensionModule: IExtensionModule, context: IExtensionContext, activationTimesBuilder: ExtensionActivationTimesBuilder): Thenable { // Make sure the extension's surface is not undefined extensionModule = extensionModule || { activate: undefined, deactivate: undefined }; - return this._callActivateOptional(extensionModule, context, activationTimesBuilder).then((extensionExports) => { + return this._callActivateOptional(logService, extensionId, extensionModule, context, activationTimesBuilder).then((extensionExports) => { return new ActivatedExtension(false, activationTimesBuilder.build(), extensionModule, extensionExports, context.subscriptions); }); } - private static _callActivateOptional(extensionModule: IExtensionModule, context: IExtensionContext, activationTimesBuilder: ExtensionActivationTimesBuilder): Thenable { + private static _callActivateOptional(logService: ILogService, extensionId: string, extensionModule: IExtensionModule, context: IExtensionContext, activationTimesBuilder: ExtensionActivationTimesBuilder): Thenable { if (typeof extensionModule.activate === 'function') { try { activationTimesBuilder.activateCallStart(); + logService.trace(`ExtensionService#_callActivateOptional ${extensionId}`); const activateResult: TPromise = extensionModule.activate.apply(global, [context]); activationTimesBuilder.activateCallStop(); @@ -379,9 +384,10 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { } } -function loadCommonJSModule(modulePath: string, activationTimesBuilder: ExtensionActivationTimesBuilder): TPromise { +function loadCommonJSModule(logService: ILogService, modulePath: string, activationTimesBuilder: ExtensionActivationTimesBuilder): TPromise { let r: T = null; activationTimesBuilder.codeLoadingStart(); + logService.info(`ExtensionService#loadCommonJSModule ${modulePath}`); try { r = require.__$__nodeRequire(modulePath); } catch (e) { @@ -399,13 +405,7 @@ function getTelemetryActivationEvent(extensionDescription: IExtensionDescription "name": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, "publisherDisplayName": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, "activationEvents": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "isBuiltin": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "${wildcard}": [ - { - "${prefix}": "contribution.", - "${classification}": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - ] + "isBuiltin": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ let event = { @@ -416,34 +416,5 @@ function getTelemetryActivationEvent(extensionDescription: IExtensionDescription isBuiltin: extensionDescription.isBuiltin }; - for (let contribution in extensionDescription.contributes) { - let contributionDetails = extensionDescription.contributes[contribution]; - - if (!contributionDetails) { - continue; - } - - switch (contribution) { - case 'debuggers': - let types = contributionDetails.reduce((p, c) => p ? p + ',' + c['type'] : c['type'], ''); - event['contribution.debuggers'] = types; - break; - case 'grammars': - let grammers = contributionDetails.reduce((p, c) => p ? p + ',' + c['language'] : c['language'], ''); - event['contribution.grammars'] = grammers; - break; - case 'languages': - let languages = contributionDetails.reduce((p, c) => p ? p + ',' + c['id'] : c['id'], ''); - event['contribution.languages'] = languages; - break; - case 'tmSnippets': - let tmSnippets = contributionDetails.reduce((p, c) => p ? p + ',' + c['languageId'] : c['languageId'], ''); - event['contribution.tmSnippets'] = tmSnippets; - break; - default: - event[`contribution.${contribution}`] = true; - } - } - return event; } diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 05756e0d7a9e..6e5c04f836c4 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -255,7 +255,11 @@ class ReferenceAdapter { } } -class QuickFixAdapter { +export interface CustomCodeAction extends modes.CodeAction { + _isSynthetic?: boolean; +} + +class CodeActionAdapter { private _documents: ExtHostDocuments; private _commands: CommandsConverter; @@ -269,7 +273,7 @@ class QuickFixAdapter { this._provider = provider; } - provideCodeActions(resource: URI, range: IRange): TPromise<(modes.CodeAction | modes.Command)[]> { + provideCodeActions(resource: URI, range: IRange): TPromise { const doc = this._documents.getDocumentData(resource).document; const ran = TypeConverters.toRange(range); @@ -285,39 +289,45 @@ class QuickFixAdapter { } }); - return asWinJsPromise(token => - this._provider.provideCodeActions2 - ? this._provider.provideCodeActions2(doc, ran, { diagnostics: allDiagnostics }, token) - : this._provider.provideCodeActions(doc, ran, { diagnostics: allDiagnostics }, token) - ).then(commands => { - if (!Array.isArray(commands)) { + return asWinJsPromise(token => this._provider.provideCodeActions2 + ? this._provider.provideCodeActions2(doc, ran, { diagnostics: allDiagnostics }, token) + : this._provider.provideCodeActions(doc, ran, { diagnostics: allDiagnostics }, token) + ).then(commandsOrActions => { + if (isFalsyOrEmpty(commandsOrActions)) { return undefined; } - return commands.map((action): modes.CodeAction => { - if (!action) { - return undefined; + const result: CustomCodeAction[] = []; + for (const candidate of commandsOrActions) { + if (!candidate) { + continue; } - - if (typeof action.command === 'string') { - return this._commands.toInternal(action as vscode.Command); + if (CodeActionAdapter._isCommand(candidate)) { + // old school: synthetic code action + result.push({ + _isSynthetic: true, + title: candidate.title, + command: this._commands.toInternal(candidate), + }); + } else { + // new school: convert code action + result.push({ + title: candidate.title, + command: candidate.command && this._commands.toInternal(candidate.command), + diagnostics: candidate.diagnostics && candidate.diagnostics.map(DiagnosticCollection.toMarkerData), + edits: Array.isArray(candidate.edits) + ? TypeConverters.WorkspaceEdit.fromTextEdits(resource, candidate.edits) + : candidate.edits && TypeConverters.WorkspaceEdit.from(candidate.edits), + }); } + } - const codeAction = action as vscode.CodeAction; - return { - title: codeAction.title, - command: codeAction.command ? this._commands.toInternal(codeAction.command) : undefined, - edits: codeAction.edits - ? Array.isArray(codeAction.edits) - ? TypeConverters.WorkspaceEdit.fromTextEdits(resource, codeAction.edits) - : TypeConverters.WorkspaceEdit.from(codeAction.edits) - : undefined, - diagnostics: codeAction.diagnostics - ? codeAction.diagnostics.map(DiagnosticCollection.toMarkerData) - : undefined - } as modes.CodeAction; - }); + return result; }); } + + private static _isCommand(thing: any): thing is vscode.Command { + return typeof (thing).command === 'string' && typeof (thing).title === 'string'; + } } class DocumentFormattingAdapter { @@ -768,7 +778,7 @@ class ColorProviderAdapter { } type Adapter = OutlineAdapter | CodeLensAdapter | DefinitionAdapter | HoverAdapter - | DocumentHighlightAdapter | ReferenceAdapter | QuickFixAdapter | DocumentFormattingAdapter + | DocumentHighlightAdapter | ReferenceAdapter | CodeActionAdapter | DocumentFormattingAdapter | RangeFormattingAdapter | OnTypeFormattingAdapter | NavigateTypeAdapter | RenameAdapter | SuggestAdapter | SignatureHelpAdapter | LinkProviderAdapter | ImplementationAdapter | TypeDefinitionAdapter | ColorProviderAdapter; @@ -933,13 +943,13 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { registerCodeActionProvider(selector: vscode.DocumentSelector, provider: vscode.CodeActionProvider): vscode.Disposable { const handle = this._nextHandle(); - this._adapter.set(handle, new QuickFixAdapter(this._documents, this._commands.converter, this._diagnostics, provider)); + this._adapter.set(handle, new CodeActionAdapter(this._documents, this._commands.converter, this._diagnostics, provider)); this._proxy.$registerQuickFixSupport(handle, selector); return this._createDisposable(handle); } - $provideCodeActions(handle: number, resource: URI, range: IRange): TPromise<(modes.Command | modes.CodeAction)[]> { - return this._withAdapter(handle, QuickFixAdapter, adapter => adapter.provideCodeActions(resource, range)); + $provideCodeActions(handle: number, resource: URI, range: IRange): TPromise { + return this._withAdapter(handle, CodeActionAdapter, adapter => adapter.provideCodeActions(resource, range)); } // --- formatting diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index 9c3637a8c4c9..9444ef007441 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -17,6 +17,7 @@ import { sortedDiff } from 'vs/base/common/arrays'; import { comparePaths } from 'vs/base/common/comparers'; import * as vscode from 'vscode'; import { ISplice } from 'vs/base/common/sequence'; +import { ILogService } from 'vs/platform/log/common/log'; type ProviderHandle = number; type GroupHandle = number; @@ -443,7 +444,8 @@ export class ExtHostSCM { constructor( mainContext: IMainContext, - private _commands: ExtHostCommands + private _commands: ExtHostCommands, + @ILogService private logService: ILogService ) { this._proxy = mainContext.get(MainContext.MainThreadSCM); @@ -487,6 +489,8 @@ export class ExtHostSCM { } createSourceControl(extension: IExtensionDescription, id: string, label: string, rootUri: vscode.Uri | undefined): vscode.SourceControl { + this.logService.trace('ExtHostSCM#createSourceControl', extension.id, id, label, rootUri); + const handle = ExtHostSCM._handlePool++; const sourceControl = new ExtHostSourceControl(this._proxy, this._commands, id, label, rootUri); this._sourceControls.set(handle, sourceControl); @@ -500,6 +504,8 @@ export class ExtHostSCM { // Deprecated getLastInputBox(extension: IExtensionDescription): ExtHostSCMInputBox { + this.logService.trace('ExtHostSCM#getLastInputBox', extension.id); + const sourceControls = this._sourceControlsByExtension.get(extension.id); const sourceControl = sourceControls && sourceControls[sourceControls.length - 1]; const inputBox = sourceControl && sourceControl.inputBox; @@ -508,6 +514,8 @@ export class ExtHostSCM { } $provideOriginalResource(sourceControlHandle: number, uri: URI): TPromise { + this.logService.trace('ExtHostSCM#$provideOriginalResource', sourceControlHandle, uri); + const sourceControl = this._sourceControls.get(sourceControlHandle); if (!sourceControl || !sourceControl.quickDiffProvider) { @@ -521,6 +529,8 @@ export class ExtHostSCM { } $onInputBoxValueChange(sourceControlHandle: number, value: string): TPromise { + this.logService.trace('ExtHostSCM#$onInputBoxValueChange', sourceControlHandle); + const sourceControl = this._sourceControls.get(sourceControlHandle); if (!sourceControl) { @@ -532,6 +542,8 @@ export class ExtHostSCM { } async $executeResourceCommand(sourceControlHandle: number, groupHandle: number, handle: number): TPromise { + this.logService.trace('ExtHostSCM#$executeResourceCommand', sourceControlHandle, groupHandle, handle); + const sourceControl = this._sourceControls.get(sourceControlHandle); if (!sourceControl) { diff --git a/src/vs/workbench/api/node/extHostTextEditors.ts b/src/vs/workbench/api/node/extHostTextEditors.ts index d3ca9b8edc8c..10232e0c87ce 100644 --- a/src/vs/workbench/api/node/extHostTextEditors.ts +++ b/src/vs/workbench/api/node/extHostTextEditors.ts @@ -20,13 +20,13 @@ export class ExtHostEditors implements ExtHostEditorsShape { private readonly _onDidChangeTextEditorSelection = new Emitter(); private readonly _onDidChangeTextEditorOptions = new Emitter(); private readonly _onDidChangeTextEditorViewColumn = new Emitter(); - private readonly _onDidChangeActiveTextEditor = new Emitter(); + private readonly _onDidChangeActiveTextEditor = new Emitter(); private readonly _onDidChangeVisibleTextEditors = new Emitter(); readonly onDidChangeTextEditorSelection: Event = this._onDidChangeTextEditorSelection.event; readonly onDidChangeTextEditorOptions: Event = this._onDidChangeTextEditorOptions.event; readonly onDidChangeTextEditorViewColumn: Event = this._onDidChangeTextEditorViewColumn.event; - readonly onDidChangeActiveTextEditor: Event = this._onDidChangeActiveTextEditor.event; + readonly onDidChangeActiveTextEditor: Event = this._onDidChangeActiveTextEditor.event; readonly onDidChangeVisibleTextEditors: Event = this._onDidChangeVisibleTextEditors.event; diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index 71789d1563c5..ad9610e5fb20 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -7,17 +7,15 @@ import { localize } from 'vs/nls'; import * as vscode from 'vscode'; import URI from 'vs/base/common/uri'; -import { distinct } from 'vs/base/common/arrays'; import { debounceEvent } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import { Disposable } from 'vs/base/common/lifecycle'; import { ExtHostTreeViewsShape, MainThreadTreeViewsShape } from './extHost.protocol'; import { ITreeItem, TreeViewItemHandleArg } from 'vs/workbench/common/views'; -import { TreeItemCollapsibleState } from './extHostTypes'; import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/node/extHostCommands'; import { asWinJsPromise } from 'vs/base/common/async'; -type TreeItemHandle = number; +type TreeItemHandle = string; export class ExtHostTreeViews implements ExtHostTreeViewsShape { @@ -56,7 +54,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { return treeView.getTreeItems(); } - $getChildren(treeViewId: string, treeItemHandle?: number): TPromise { + $getChildren(treeViewId: string, treeItemHandle?: string): TPromise { const treeView = this.treeViews.get(treeViewId); if (!treeView) { return TPromise.wrapError(new Error(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId))); @@ -70,13 +68,18 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { } } +interface TreeNode { + index: number; + handle: TreeItemHandle; + parent: TreeItemHandle; + children: TreeItemHandle[]; +} + class ExtHostTreeView extends Disposable { - private _itemHandlePool = 0; - - private extElementsMap: Map = new Map(); - private itemHandlesMap: Map = new Map(); - private extChildrenElementsMap: Map = new Map(); + private static ROOT_HANDLE = '0'; + private elements: Map = new Map(); + private nodes: Map = new Map(); constructor(private viewId: string, private dataProvider: vscode.TreeDataProvider, private proxy: MainThreadTreeViewsShape, private commands: CommandsConverter) { super(); @@ -87,12 +90,9 @@ class ExtHostTreeView extends Disposable { } getTreeItems(): TPromise { - this.extChildrenElementsMap.clear(); - this.extElementsMap.clear(); - this.itemHandlesMap.clear(); - + this.clearAll(); return asWinJsPromise(() => this.dataProvider.getChildren()) - .then(elements => this.processAndMapElements(elements)); + .then(elements => this.resolveElements(elements)); } getChildren(treeItemHandle: TreeItemHandle): TPromise { @@ -104,77 +104,86 @@ class ExtHostTreeView extends Disposable { } return asWinJsPromise(() => this.dataProvider.getChildren(extElement)) - .then(childrenElements => this.processAndMapElements(childrenElements)); + .then(childrenElements => this.resolveElements(childrenElements, treeItemHandle)) + .then(childrenItems => { + this.nodes.get(extElement).children = childrenItems.map(c => c.handle); + return childrenItems; + }); } getExtensionElement(treeItemHandle: TreeItemHandle): T { - return this.extElementsMap.get(treeItemHandle); + return this.elements.get(treeItemHandle); } private _refresh(elements: T[]): void { const hasRoot = elements.some(element => !element); if (hasRoot) { - this.proxy.$refresh(this.viewId, []); + this.proxy.$refresh(this.viewId); } else { - const itemHandles = distinct(elements.map(element => this.itemHandlesMap.get(element)) - .filter(itemHandle => !!itemHandle)); - if (itemHandles.length) { - this.proxy.$refresh(this.viewId, itemHandles); + const handlesToUpdate = this.getHandlesToUpdate(elements); + if (handlesToUpdate.length) { + this._refreshHandles(handlesToUpdate); } } } - private processAndMapElements(elements: T[]): TPromise { + private resolveElements(elements: T[], parentHandle?: TreeItemHandle): TPromise { if (elements && elements.length) { return TPromise.join( elements.filter(element => !!element) - .map(element => { - if (this.extChildrenElementsMap.has(element)) { - return TPromise.wrapError(new Error(localize('treeView.duplicateElement', 'Element {0} is already registered', element))); - } - return this.resolveElement(element); + .map((element, index) => { + return this.resolveElement(element, index, parentHandle) + .then(treeItem => { + if (treeItem) { + this.nodes.set(element, { + index, + handle: treeItem.handle, + parent: parentHandle, + children: void 0 + }); + if (this.elements.has(treeItem.handle)) { + return TPromise.wrapError(new Error(localize('treeView.duplicateElement', 'Element {0} is already registered', element))); + } + this.elements.set(treeItem.handle, element); + } + return treeItem; + }); })) .then(treeItems => treeItems.filter(treeItem => !!treeItem)); } return TPromise.as([]); } - private resolveElement(element: T): TPromise { + private resolveElement(element: T, index: number, parentHandle?: TreeItemHandle): TPromise { return asWinJsPromise(() => this.dataProvider.getTreeItem(element)) - .then(extTreeItem => { - const treeItem = this.massageTreeItem(extTreeItem); - if (treeItem) { - this.itemHandlesMap.set(element, treeItem.handle); - this.extElementsMap.set(treeItem.handle, element); - if (treeItem.collapsibleState === TreeItemCollapsibleState.Expanded) { - return this.getChildren(treeItem.handle).then(children => { - treeItem.children = children; - return treeItem; - }); - } else { - return treeItem; - } - } - return null; - }); + .then(extTreeItem => this.massageTreeItem(element, extTreeItem, index, parentHandle)); } - private massageTreeItem(extensionTreeItem: vscode.TreeItem): ITreeItem { + private massageTreeItem(element: T, extensionTreeItem: vscode.TreeItem, index: number, parentHandle: TreeItemHandle): ITreeItem { if (!extensionTreeItem) { return null; } const icon = this.getLightIconPath(extensionTreeItem); + const label = extensionTreeItem.label; + const handle = typeof element === 'string' ? element : this.generateHandle(label, index, parentHandle); return { - handle: ++this._itemHandlePool, - label: extensionTreeItem.label, + handle, + parentHandle, + label, command: extensionTreeItem.command ? this.commands.toInternal(extensionTreeItem.command) : void 0, contextValue: extensionTreeItem.contextValue, icon, iconDark: this.getDarkIconPath(extensionTreeItem) || icon, - collapsibleState: extensionTreeItem.collapsibleState, + collapsibleState: extensionTreeItem.collapsibleState }; } + private generateHandle(label: string, index: number, parentHandle: TreeItemHandle): TreeItemHandle { + parentHandle = parentHandle ? parentHandle : ExtHostTreeView.ROOT_HANDLE; + label = label.indexOf('/') !== -1 ? label.replace('/', '//') : label; + return `${parentHandle}/${index}:${label}`; + } + private getLightIconPath(extensionTreeItem: vscode.TreeItem): string { if (extensionTreeItem.iconPath) { if (typeof extensionTreeItem.iconPath === 'string' || extensionTreeItem.iconPath instanceof URI) { @@ -199,29 +208,107 @@ class ExtHostTreeView extends Disposable { return URI.file(iconPath).toString(); } - private clearChildren(extElement: T): void { - const children = this.extChildrenElementsMap.get(extElement); - if (children) { - for (const child of children) { - this.clearElement(child); + private getHandlesToUpdate(elements: T[]): TreeItemHandle[] { + const elementsToUpdate = new Set(); + for (const element of elements) { + let elementNode = this.nodes.get(element); + if (elementNode && !elementsToUpdate.has(elementNode.handle)) { + // check if an ancestor of extElement is already in the elements to update list + let currentNode = elementNode; + while (currentNode && currentNode.parent && !elementsToUpdate.has(currentNode.parent)) { + const parentElement = this.elements.get(currentNode.parent); + currentNode = this.nodes.get(parentElement); + } + if (!currentNode.parent) { + elementsToUpdate.add(elementNode.handle); + } } - this.extChildrenElementsMap.delete(extElement); } + + const handlesToUpdate: TreeItemHandle[] = []; + // Take only top level elements + elementsToUpdate.forEach((handle) => { + const element = this.elements.get(handle); + let node = this.nodes.get(element); + if (node && !elementsToUpdate.has(node.parent)) { + handlesToUpdate.push(handle); + } + }); + + return handlesToUpdate; } - private clearElement(extElement: T): void { - this.clearChildren(extElement); + private _refreshHandles(itemHandles: TreeItemHandle[]): TPromise { + const itemsToRefresh: { [handle: string]: ITreeItem } = {}; + const promises: TPromise[] = []; + itemHandles.forEach(treeItemHandle => { + const extElement = this.getExtensionElement(treeItemHandle); + const node = this.nodes.get(extElement); + const promise = this.resolveElement(extElement, node.index, node.parent) + .then(treeItem => { + if (treeItemHandle !== treeItem.handle) { + // Update caches if handle changes + this.updateCaches(node, treeItem, extElement); + } + itemsToRefresh[treeItemHandle] = treeItem; + }); + promises.push(promise); + }); + return TPromise.join(promises) + .then(treeItems => { + this.proxy.$refresh(this.viewId, itemsToRefresh); + }); + } - const treeItemhandle = this.itemHandlesMap.get(extElement); - this.itemHandlesMap.delete(extElement); - if (treeItemhandle) { - this.extElementsMap.delete(treeItemhandle); + private updateCaches(node: TreeNode, treeItem: ITreeItem, element: T): void { + if (node.parent) { + // Update parent's children handles + const parentElement = this.getExtensionElement(node.parent); + const parentNode = this.nodes.get(parentElement); + parentNode.children[node.index] = treeItem.handle; } + + // Update elements map + this.elements.delete(node.handle); + this.elements.set(treeItem.handle, element); + + // Update node + node.handle = treeItem.handle; + } + + private clearChildren(element: T): void { + let node = this.nodes.get(element); + if (node.children) { + for (const childHandle of node.children) { + const childEleement = this.elements.get(childHandle); + if (childEleement) { + this.clear(childEleement); + } + } + } + node.children = void 0; + } + + private clear(element: T): void { + let node = this.nodes.get(element); + if (node.children) { + for (const childHandle of node.children) { + const childEleement = this.elements.get(childHandle); + if (childEleement) { + this.clear(childEleement); + } + } + } + this.nodes.delete(element); + this.elements.delete(node.handle); + } + + private clearAll(): void { + this.elements.clear(); + this.nodes.clear(); } dispose() { - this.extElementsMap.clear(); - this.itemHandlesMap.clear(); - this.extChildrenElementsMap.clear(); + this.clearAll(); } } \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 5de197f9eb9d..f2e7dce967dc 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -17,7 +17,7 @@ import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; import { ISelection } from 'vs/editor/common/core/selection'; import * as htmlContent from 'vs/base/common/htmlContent'; -import { IRelativePattern, isRelativePattern } from 'vs/base/common/glob'; +import { IRelativePattern } from 'vs/base/common/glob'; import { LanguageSelector, LanguageFilter } from 'vs/editor/common/modes/languageSelector'; export interface PositionLike { @@ -252,6 +252,14 @@ export namespace WorkspaceEdit { } return result; } + + export function to(value: modes.WorkspaceEdit) { + const result = new types.WorkspaceEdit(); + for (const edit of value.edits) { + result.replace(edit.resource, toRange(edit.range), edit.newText); + } + return result; + } } @@ -599,6 +607,12 @@ export function toGlobPattern(pattern: vscode.GlobPattern): string | IRelativePa return new types.RelativePattern(pattern.base, pattern.pattern); } +function isRelativePattern(obj: any): obj is vscode.RelativePattern { + const rp = obj as vscode.RelativePattern; + + return rp && typeof rp.base === 'string' && typeof rp.pattern === 'string'; +} + export function toLanguageSelector(selector: vscode.DocumentSelector): LanguageSelector { if (Array.isArray(selector)) { return selector.map(sel => doToLanguageSelector(sel)); @@ -617,4 +631,4 @@ function doToLanguageSelector(selector: string | vscode.DocumentFilter): string scheme: selector.scheme, pattern: toGlobPattern(selector.pattern) }; -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index d38439f81eea..b0cc9b020622 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1498,3 +1498,36 @@ export class RelativePattern implements IRelativePattern { return relative(from, to); } } + +export class Breakpoint { + + readonly enabled: boolean; + readonly condition?: string; + readonly hitCondition?: string; + + protected constructor(enabled: boolean, condition: string, hitCondition: string) { + this.enabled = enabled; + this.condition = condition; + this.hitCondition = hitCondition; + this.condition = condition; + this.hitCondition = hitCondition; + } +} + +export class SourceBreakpoint extends Breakpoint { + readonly location: Location; + + constructor(enabled: boolean, condition: string, hitCondition: string, location: Location) { + super(enabled, condition, hitCondition); + this.location = location; + } +} + +export class FunctionBreakpoint extends Breakpoint { + readonly functionName: string; + + constructor(enabled: boolean, condition: string, hitCondition: string, functionName: string) { + super(enabled, condition, hitCondition); + this.functionName = functionName; + } +} diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 654d088c5def..73f38a7da6e5 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -14,7 +14,6 @@ import { IWorkspaceData, ExtHostWorkspaceShape, MainContext, MainThreadWorkspace import * as vscode from 'vscode'; import { compare } from 'vs/base/common/strings'; import { TernarySearchTree } from 'vs/base/common/map'; -import { IRelativePattern } from 'vs/base/common/glob'; class Workspace2 extends Workspace { @@ -155,9 +154,30 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape { // --- search --- - findFiles(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults?: number, token?: vscode.CancellationToken): Thenable { + findFiles(include: vscode.GlobPattern, exclude: vscode.GlobPattern, maxResults?: number, token?: vscode.CancellationToken): Thenable { const requestId = ExtHostWorkspace._requestIdPool++; - const result = this._proxy.$startSearch(include, exclude, maxResults, requestId); + + let includePattern: string; + let includeFolder: string; + if (include) { + if (typeof include === 'string') { + includePattern = include; + } else { + includePattern = include.pattern; + includeFolder = include.base; + } + } + + let excludePattern: string; + if (exclude) { + if (typeof exclude === 'string') { + excludePattern = exclude; + } else { + excludePattern = exclude.pattern; + } + } + + const result = this._proxy.$startSearch(includePattern, includeFolder, excludePattern, maxResults, requestId); if (token) { token.onCancellationRequested(() => this._proxy.$cancelSearch(requestId)); } diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index 948871f5c179..c7f752077e07 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -26,10 +26,10 @@ import { IConstructorSignature0, IInstantiationService } from 'vs/platform/insta * layout and focus call, but only one create and dispose call. */ export abstract class Composite extends Component implements IComposite { - private _telemetryData: any = {}; + private _onTitleAreaUpdate: Emitter; + private visible: boolean; private parent: Builder; - private _onTitleAreaUpdate: Emitter; protected actionRunner: IActionRunner; @@ -100,42 +100,6 @@ export abstract class Composite extends Component implements IComposite { public setVisible(visible: boolean): TPromise { this.visible = visible; - // Reset telemetry data when composite becomes visible - if (visible) { - this._telemetryData = {}; - this._telemetryData.startTime = new Date(); - - // Only submit telemetry data when not running from an integration test - if (this._telemetryService && this._telemetryService.publicLog) { - const eventName: string = 'compositeOpen'; - /* __GDPR__ - "compositeOpen" : { - "composite" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog(eventName, { composite: this.getId() }); - } - } - - // Send telemetry data when composite hides - else { - this._telemetryData.timeSpent = (Date.now() - this._telemetryData.startTime) / 1000; - delete this._telemetryData.startTime; - - // Only submit telemetry data when not running from an integration test - if (this._telemetryService && this._telemetryService.publicLog) { - const eventName: string = 'compositeShown'; - this._telemetryData.composite = this.getId(); - /* __GDPR__ - "compositeShown" : { - "timeSpent" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "composite": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog(eventName, this._telemetryData); - } - } - return TPromise.as(null); } diff --git a/src/vs/workbench/browser/editor.ts b/src/vs/workbench/browser/editor.ts index 24c226052d9b..16a6140a6e4f 100644 --- a/src/vs/workbench/browser/editor.ts +++ b/src/vs/workbench/browser/editor.ts @@ -12,6 +12,8 @@ import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IConstructorSignature0, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { isArray } from 'vs/base/common/types'; import URI from 'vs/base/common/uri'; +import { DataTransfers } from 'vs/base/browser/dnd'; +import { IEditorViewState } from 'vs/editor/common/editorCommon'; export interface IEditorDescriptor { instantiate(instantiationService: IInstantiationService): BaseEditor; @@ -204,20 +206,50 @@ export interface IDraggedResource { isExternal: boolean; } -export function extractResources(e: DragEvent, externalOnly?: boolean): IDraggedResource[] { - const resources: IDraggedResource[] = []; +export interface IDraggedEditor extends IDraggedResource { + backupResource?: URI; + viewState?: IEditorViewState; +} + +export interface ISerializedDraggedEditor { + resource: string; + backupResource: string; + viewState: IEditorViewState; +} + +export const CodeDataTransfers = { + EDITOR: 'CodeEditor' +}; + +export function extractResources(e: DragEvent, externalOnly?: boolean): (IDraggedResource | IDraggedEditor)[] { + const resources: (IDraggedResource | IDraggedEditor)[] = []; if (e.dataTransfer.types.length > 0) { - // Check for in-app DND + // Check for window-to-window DND if (!externalOnly) { - const rawData = e.dataTransfer.getData('URL'); - if (rawData) { + + // Data Transfer: Code Editor + const rawEditorData = e.dataTransfer.getData(CodeDataTransfers.EDITOR); + if (rawEditorData) { try { - resources.push({ resource: URI.parse(rawData), isExternal: false }); + const draggedEditor = JSON.parse(rawEditorData) as ISerializedDraggedEditor; + resources.push({ resource: URI.parse(draggedEditor.resource), backupResource: URI.parse(draggedEditor.backupResource), viewState: draggedEditor.viewState, isExternal: false }); } catch (error) { // Invalid URI } } + + // Data Transfer: URL + else { + const rawURLData = e.dataTransfer.getData(DataTransfers.URL); + if (rawURLData) { + try { + resources.push({ resource: URI.parse(rawURLData), isExternal: false }); + } catch (error) { + // Invalid URI + } + } + } } // Check for native file transfer diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 72857199426e..08f2178ba7b3 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -183,7 +183,7 @@ export class ResourceLabel extends IconLabel { if (this.options && typeof this.options.title === 'string') { iconLabelOptions.title = this.options.title; - } else if (resource) { + } else if (resource && resource.scheme !== Schemas.data /* do not accidentally inline Data URIs */) { iconLabelOptions.title = getPathLabel(resource, void 0, this.environmentService); } diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index d04e8eefb73d..81b49fbed8db 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -686,6 +686,10 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal } public getVerticalSashHeight(sash: Sash): number { + if (sash === this.sashXTwo && !this.partService.isVisible(Parts.PANEL_PART)) { + return 0; + } + return this.sidebarHeight; } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index e703469831ba..d0c3072491ef 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -18,7 +18,7 @@ import { Part } from 'vs/workbench/browser/part'; import { GlobalActivityActionItem, GlobalActivityAction, ViewletActivityAction, ToggleViewletAction } from 'vs/workbench/browser/parts/activitybar/activitybarActions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; -import { IPartService, Position as SideBarPosition } from 'vs/workbench/services/part/common/partService'; +import { IPartService, Parts, Position as SideBarPosition } from 'vs/workbench/services/part/common/partService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; @@ -39,6 +39,7 @@ export class ActivitybarPart extends Part { badgeForeground: ACTIVITY_BAR_BADGE_FOREGROUND, dragAndDropBackground: ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND }; + private static readonly ACTION_HEIGHT = 50; public _serviceBrand: any; @@ -72,7 +73,7 @@ export class ActivitybarPart extends Part { getDefaultCompositeId: () => this.viewletService.getDefaultViewletId(), hidePart: () => this.partService.setSideBarHidden(true), colors: ActivitybarPart.COLORS, - overflowActionSize: 50 + overflowActionSize: ActivitybarPart.ACTION_HEIGHT }); this.registerListeners(); } @@ -184,6 +185,9 @@ export class ActivitybarPart extends Part { * Layout title, content and status area in the given dimension. */ public layout(dimension: Dimension): Dimension[] { + if (!this.partService.isVisible(Parts.ACTIVITYBAR_PART)) { + return [dimension]; + } // Pass to super const sizes = super.layout(dimension); @@ -193,7 +197,7 @@ export class ActivitybarPart extends Part { let availableHeight = this.dimension.height; if (this.globalActionBar) { // adjust height for global actions showing - availableHeight -= (this.globalActionBar.items.length * this.globalActionBar.domNode.clientHeight); + availableHeight -= (this.globalActionBar.items.length * ActivitybarPart.ACTION_HEIGHT); } this.compositeBar.layout(new Dimension(dimension.width, availableHeight)); diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 8d0c918c6538..24b4a8998426 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -223,15 +223,22 @@ export class CompositeBar implements ICompositeBar { if (overflows) { size -= this.compositeSizeInBar.get(compositesToShow[maxVisible]); compositesToShow = compositesToShow.slice(0, maxVisible); + size += this.options.overflowActionSize; } // Check if we need to make extra room for the overflow action - if (overflows && (size + this.options.overflowActionSize > limit)) { - compositesToShow.pop(); + if (size > limit) { + size -= this.compositeSizeInBar.get(compositesToShow.pop()); } + // We always try show the active composite if (this.activeCompositeId && compositesToShow.length && compositesToShow.indexOf(this.activeCompositeId) === -1) { - compositesToShow.pop(); + const removedComposite = compositesToShow.pop(); + size = size - this.compositeSizeInBar.get(removedComposite) + this.compositeSizeInBar.get(this.activeCompositeId); compositesToShow.push(this.activeCompositeId); } + // The active composite might have bigger size than the removed composite, check for overflow again + if (size > limit) { + compositesToShow.length ? compositesToShow.splice(compositesToShow.length - 2, 1) : compositesToShow.pop(); + } const visibleComposites = Object.keys(this.compositeIdToActions); const visibleCompositesChange = !arrays.equals(compositesToShow, visibleComposites); @@ -348,6 +355,9 @@ export class CompositeBar implements ICompositeBar { const visibleComposites = this.getVisibleComposites(); let unpinPromise: TPromise; + // remove from pinned + const index = this.pinnedComposites.indexOf(compositeId); + this.pinnedComposites.splice(index, 1); // Case: composite is not the active one or the active one is a different one // Solv: we do nothing @@ -374,10 +384,6 @@ export class CompositeBar implements ICompositeBar { } unpinPromise.then(() => { - // then remove from pinned and update switcher - const index = this.pinnedComposites.indexOf(compositeId); - this.pinnedComposites.splice(index, 1); - this.updateCompositeSwitcher(); }); } diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 4e23ee561e5d..d099ee571e07 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -323,11 +323,13 @@ export abstract class BaseFocusSideGroupAction extends Action { else if (referenceEditor) { const history = this.historyService.getHistory(); for (let input of history) { - if (input instanceof EditorInput && input.supportsSplitEditor()) { - return this.editorService.openEditor(input, { pinned: true }, this.getTargetEditorSide()); + if (input instanceof EditorInput) { + if (input.supportsSplitEditor()) { + return this.editorService.openEditor(input, { pinned: true }, this.getTargetEditorSide()); + } + } else { + return this.editorService.openEditor({ resource: (input as IResourceInput).resource, options: { pinned: true } }, this.getTargetEditorSide()); } - - return this.editorService.openEditor({ resource: (input as IResourceInput).resource, options: { pinned: true } }, this.getTargetEditorSide()); } } @@ -583,9 +585,14 @@ export class RevertAndCloseEditorAction extends Action { const input = activeEditor.input; const position = activeEditor.position; - return activeEditor.input.revert().then(ok => - this.editorService.closeEditor(position, input) - ); + // first try a normal revert where the contents of the editor are restored + return activeEditor.input.revert().then(() => this.editorService.closeEditor(position, input), error => { + // if that fails, since we are about to close the editor, we accept that + // the editor cannot be reverted and instead do a soft revert that just + // enables us to close the editor. With this, a user can always close a + // dirty editor even when reverting fails. + return activeEditor.input.revert({ soft: true }).then(() => this.editorService.closeEditor(position, input)); + }); } return TPromise.as(false); diff --git a/src/vs/workbench/browser/parts/editor/editorAreaDropHandler.ts b/src/vs/workbench/browser/parts/editor/editorAreaDropHandler.ts new file mode 100644 index 000000000000..587ceeb91282 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/editorAreaDropHandler.ts @@ -0,0 +1,171 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { IDraggedResource, IDraggedEditor, extractResources } from 'vs/workbench/browser/editor'; +import { WORKSPACE_EXTENSION, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { extname } from 'vs/base/common/paths'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; +import URI from 'vs/base/common/uri'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { BACKUP_FILE_RESOLVE_OPTIONS, IBackupFileService } from 'vs/workbench/services/backup/common/backup'; +import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { Schemas } from 'vs/base/common/network'; +import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { Position } from 'vs/platform/editor/common/editor'; +import { onUnexpectedError } from 'vs/base/common/errors'; + +/** + * Shared function across some editor components to handle drag & drop of external resources. E.g. of folders and workspace files + * to open them in the window instead of the editor or to handle dirty editors being dropped between instances of Code. + */ +export class EditorAreaDropHandler { + + constructor( + @IFileService private fileService: IFileService, + @IWindowsService private windowsService: IWindowsService, + @IWindowService private windowService: IWindowService, + @IWorkspacesService private workspacesService: IWorkspacesService, + @ITextFileService private textFileService: ITextFileService, + @IBackupFileService private backupFileService: IBackupFileService, + @IEditorGroupService private groupService: IEditorGroupService, + @IUntitledEditorService private untitledEditorService: IUntitledEditorService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + ) { + } + + public handleDrop(event: DragEvent, afterDrop: () => void, targetPosition: Position, targetIndex?: number): void { + const resources = extractResources(event).filter(r => r.resource.scheme === Schemas.file || r.resource.scheme === Schemas.untitled); + if (!resources.length) { + return; + } + + return this.doHandleDrop(resources).then(isWorkspaceOpening => { + if (isWorkspaceOpening) { + return void 0; // return early if the drop operation resulted in this window changing to a workspace + } + + // Add external ones to recently open list unless dropped resource is a workspace + const externalResources = resources.filter(d => d.isExternal).map(d => d.resource); + if (externalResources.length) { + this.windowsService.addRecentlyOpened(externalResources.map(resource => resource.fsPath)); + } + + // Open in Editor + return this.windowService.focusWindow() + .then(() => this.editorService.openEditors(resources.map(r => { + return { + input: { + resource: r.resource, + options: { + pinned: true, + index: targetIndex, + viewState: (r as IDraggedEditor).viewState + } + }, + position: targetPosition + }; + }))).then(() => { + + // Finish with provided function + afterDrop(); + }); + }).done(null, onUnexpectedError); + } + + private doHandleDrop(resources: (IDraggedResource | IDraggedEditor)[]): TPromise { + + // Check for dirty editor being dropped + if (resources.length === 1 && !resources[0].isExternal && (resources[0] as IDraggedEditor).backupResource) { + return this.handleDirtyEditorDrop(resources[0]); + } + + // Check for workspace file being dropped + if (resources.some(r => r.isExternal)) { + return this.handleWorkspaceFileDrop(resources); + } + + return TPromise.as(false); + } + + private handleDirtyEditorDrop(droppedDirtyEditor: IDraggedEditor): TPromise { + + // Untitled: always ensure that we open a new untitled for each file we drop + if (droppedDirtyEditor.resource.scheme === Schemas.untitled) { + droppedDirtyEditor.resource = this.untitledEditorService.createOrGet().getResource(); + } + + // Return early if the resource is already dirty in target or opened already + if (this.textFileService.isDirty(droppedDirtyEditor.resource) || this.groupService.getStacksModel().isOpen(droppedDirtyEditor.resource)) { + return TPromise.as(false); + } + + // Resolve the contents of the dropped dirty resource from source + return this.textFileService.resolveTextContent(droppedDirtyEditor.backupResource, BACKUP_FILE_RESOLVE_OPTIONS).then(content => { + + // Set the contents of to the resource to the target + return this.backupFileService.backupResource(droppedDirtyEditor.resource, this.backupFileService.parseBackupContent(content.value)); + }).then(() => false, () => false /* ignore any error */); + } + + private handleWorkspaceFileDrop(resources: (IDraggedResource | IDraggedEditor)[]): TPromise { + const externalResources = resources.filter(d => d.isExternal).map(d => d.resource); + + const externalWorkspaceResources: { workspaces: URI[], folders: URI[] } = { + workspaces: [], + folders: [] + }; + + return TPromise.join(externalResources.map(resource => { + + // Check for Workspace + if (extname(resource.fsPath) === `.${WORKSPACE_EXTENSION}`) { + externalWorkspaceResources.workspaces.push(resource); + + return void 0; + } + + // Check for Folder + return this.fileService.resolveFile(resource).then(stat => { + if (stat.isDirectory) { + externalWorkspaceResources.folders.push(stat.resource); + } + }, error => void 0); + })).then(_ => { + const { workspaces, folders } = externalWorkspaceResources; + + // Return early if no external resource is a folder or workspace + if (workspaces.length === 0 && folders.length === 0) { + return false; + } + + // Pass focus to window + this.windowService.focusWindow(); + + let workspacesToOpen: TPromise; + + // Open in separate windows if we drop workspaces or just one folder + if (workspaces.length > 0 || folders.length === 1) { + workspacesToOpen = TPromise.as([...workspaces, ...folders].map(resources => resources.fsPath)); + } + + // Multiple folders: Create new workspace with folders and open + else if (folders.length > 1) { + workspacesToOpen = this.workspacesService.createWorkspace(folders.map(folder => ({ uri: folder }))).then(workspace => [workspace.configPath]); + } + + // Open + workspacesToOpen.then(workspaces => { + this.windowsService.openWindow(workspaces, { forceReuseWindow: true }); + }); + + return true; + }); + } +} \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index 6c5c2fd6e175..a6e2d0b65b7c 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -21,26 +21,21 @@ import { isMacintosh } from 'vs/base/common/platform'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Position, POSITIONS } from 'vs/platform/editor/common/editor'; import { IEditorGroupService, IEditorTabOptions, GroupArrangement, GroupOrientation } from 'vs/workbench/services/group/common/groupService'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { TabsTitleControl } from 'vs/workbench/browser/parts/editor/tabsTitleControl'; -import { TitleControl, ITitleAreaControl, handleWorkspaceExternalDrop } from 'vs/workbench/browser/parts/editor/titleControl'; +import { TitleControl, ITitleAreaControl } from 'vs/workbench/browser/parts/editor/titleControl'; import { NoTabsTitleControl } from 'vs/workbench/browser/parts/editor/noTabsTitleControl'; import { IEditorStacksModel, IStacksModelChangeEvent, IEditorGroup, EditorOptions, TextEditorOptions, IEditorIdentifier } from 'vs/workbench/common/editor'; -import { extractResources } from 'vs/workbench/browser/editor'; -import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { getCodeEditor } from 'vs/editor/browser/services/codeEditorService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { Themable, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND, EDITOR_GROUP_HEADER_TABS_BORDER } from 'vs/workbench/common/theme'; import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IFileService } from 'vs/platform/files/common/files'; -import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; +import { EditorAreaDropHandler } from 'vs/workbench/browser/parts/editor/editorAreaDropHandler'; export enum Rochade { NONE, @@ -88,7 +83,6 @@ export interface IEditorGroupsControl { getRatio(): number[]; - dispose(): void; } @@ -147,16 +141,10 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro groupOrientation: GroupOrientation, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IEditorGroupService private editorGroupService: IEditorGroupService, - @ITelemetryService private telemetryService: ITelemetryService, @IContextKeyService private contextKeyService: IContextKeyService, @IExtensionService private extensionService: IExtensionService, @IInstantiationService private instantiationService: IInstantiationService, - @IWindowService private windowService: IWindowService, - @IWindowsService private windowsService: IWindowsService, - @IThemeService themeService: IThemeService, - @IFileService private fileService: IFileService, - @IMessageService private messageService: IMessageService, - @IWorkspacesService private workspacesService: IWorkspacesService + @IThemeService themeService: IThemeService ) { super(themeService); @@ -229,6 +217,9 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro private updateTabOptions(tabOptions: IEditorTabOptions, refresh?: boolean): void { const tabCloseButton = this.tabOptions ? this.tabOptions.tabCloseButton : 'right'; + const tabSizing = this.tabOptions ? this.tabOptions.tabSizing : 'fit'; + const iconTheme = this.tabOptions ? this.tabOptions.iconTheme : 'vs-seti'; + this.tabOptions = tabOptions; if (!refresh) { @@ -265,8 +256,13 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro this.createTitleControl(this.stacks.groupAt(position), this.silos[position], titleContainer, this.getInstantiationService(position)); } - // Refresh title when icons change - else if (showingIcons !== this.tabOptions.showIcons || tabCloseButton !== this.tabOptions.tabCloseButton) { + // Refresh title when layout options change + else if ( + showingIcons !== this.tabOptions.showIcons || + tabCloseButton !== this.tabOptions.tabCloseButton || + tabSizing !== this.tabOptions.tabSizing || + iconTheme !== this.tabOptions.iconTheme + ) { titleControl.refresh(); } } @@ -444,15 +440,6 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro // Automatically maximize this position if it is minimized if (this.isSiloMinimized(this.lastActivePosition)) { - - // Log this fact in telemetry - if (this.telemetryService) { - /* __GDPR__ - "workbenchEditorMaximized" : {} - */ - this.telemetryService.publicLog('workbenchEditorMaximized'); - } - let remainingSize = this.totalSize; let layout = false; @@ -1125,36 +1112,14 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro // Check for URI transfer else { - const droppedResources = extractResources(e).filter(r => r.resource.scheme === 'file' || r.resource.scheme === 'untitled'); - if (droppedResources.length) { - handleWorkspaceExternalDrop(droppedResources, $this.fileService, $this.messageService, $this.windowsService, $this.windowService, $this.workspacesService).then(handled => { - if (handled) { - return; - } + const dropHandler = $this.instantiationService.createInstance(EditorAreaDropHandler); + dropHandler.handleDrop(e, () => { + if (splitEditor && splitTo !== freeGroup) { + groupService.moveGroup(freeGroup, splitTo); + } - // Add external ones to recently open list - const externalResources = droppedResources.filter(d => d.isExternal).map(d => d.resource); - if (externalResources.length) { - $this.windowsService.addRecentlyOpened(externalResources.map(resource => resource.fsPath)); - } - - // Open in Editor - $this.windowService.focusWindow() - .then(() => editorService.openEditors(droppedResources.map(d => { - return { - input: { resource: d.resource, options: { pinned: true } }, - position: splitEditor ? freeGroup : position - }; - }))).then(() => { - if (splitEditor && splitTo !== freeGroup) { - groupService.moveGroup(freeGroup, splitTo); - } - - groupService.focusGroup(splitEditor ? splitTo : position); - }) - .done(null, errors.onUnexpectedError); - }); - } + groupService.focusGroup(splitEditor ? splitTo : position); + }, splitEditor ? freeGroup : position); } } diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index 48e81a3e15de..166e435a60cb 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -41,7 +41,7 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; import { EDITOR_GROUP_BACKGROUND } from 'vs/workbench/common/theme'; -import { createCSSRule } from 'vs/base/browser/dom'; +import { createCSSRule, scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { join } from 'vs/base/common/paths'; import { IEditorDescriptor, IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; @@ -162,26 +162,21 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService showIcons: editorConfig.showIcons, showTabs: editorConfig.showTabs, tabCloseButton: editorConfig.tabCloseButton, + tabSizing: editorConfig.tabSizing, labelFormat: editorConfig.labelFormat, + iconTheme: config.workbench.iconTheme }; this.revealIfOpen = editorConfig.revealIfOpen; - - /* __GDPR__ - "workbenchEditorConfiguration" : { - "${include}": [ - "${IWorkbenchEditorConfiguration}" - ] - } - */ - this.telemetryService.publicLog('workbenchEditorConfiguration', objects.deepClone(editorConfig)); // Clone because telemetry service will modify the passed data by adding more details. } else { this.tabOptions = { previewEditors: true, showIcons: false, showTabs: true, tabCloseButton: 'right', + tabSizing: 'fit', labelFormat: 'default', + iconTheme: 'vs-seti' }; this.revealIfOpen = false; @@ -214,7 +209,7 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService } private onConfigurationUpdated(event: IConfigurationChangeEvent): void { - if (event.affectsConfiguration('workbench.editor')) { + if (event.affectsConfiguration('workbench.editor') || event.affectsConfiguration('workbench.iconTheme')) { const configuration = this.configurationService.getValue(); if (configuration && configuration.workbench && configuration.workbench.editor) { const editorConfig = configuration.workbench.editor; @@ -234,8 +229,10 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService previewEditors: newPreviewEditors, showIcons: editorConfig.showIcons, tabCloseButton: editorConfig.tabCloseButton, + tabSizing: editorConfig.tabSizing, showTabs: this.forceHideTabs ? false : editorConfig.showTabs, labelFormat: editorConfig.labelFormat, + iconTheme: configuration.workbench.iconTheme }; if (!this.doNotFireTabOptionsChanged && !objects.equals(oldTabOptions, this.tabOptions)) { @@ -359,16 +356,6 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService return TPromise.wrapError(new Error(strings.format('Can not find a registered editor for the input {0}', input))); } - // Opened to the side - if (position !== Position.ONE) { - /* __GDPR__ - "workbenchSideEditorOpened" : { - "position" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchSideEditorOpened', { position: position }); - } - // Update stacks: We do this early on before the UI is there because we want our stacks model to have // a consistent view of the editor world and updating it later async after the UI is there will cause // issues (e.g. when a closeEditor call is made that expects the openEditor call to have updated the @@ -575,7 +562,7 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService // Recover by closing the active editor (if the input is still the active one) if (group.activeEditor === input) { - this.doCloseActiveEditor(group); + this.doCloseActiveEditor(group, !(options && options.preserveFocus) /* still preserve focus as needed */); } } @@ -705,9 +692,7 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService } // Check for dirty and veto - const editorsToClose = arrays.flatten(groups.map(group => group.getEditors().map(editor => { return { group, editor }; }))); - - return this.handleDirty(editorsToClose).then(veto => { + return this.handleDirty(arrays.flatten(groups.map(group => group.getEditors(true /* in MRU order */).map(editor => { return { group, editor }; })))).then(veto => { if (veto) { return; } @@ -722,19 +707,24 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService return TPromise.wrap(null); } - let editors = group.getEditors(); + let editorsToClose = group.getEditors(true /* in MRU order */); + + // Filter: unmodified only if (filter.unmodifiedOnly) { - editors = editors.filter(e => !e.isDirty()); + editorsToClose = editorsToClose.filter(e => !e.isDirty()); + } + + // Filter: direction (left / right) + if (!types.isUndefinedOrNull(filter.direction)) { + editorsToClose = (filter.direction === Direction.LEFT) ? editorsToClose.slice(0, group.indexOf(filter.except)) : editorsToClose.slice(group.indexOf(filter.except) + 1); + } + + // Filter: except + else { + editorsToClose = editorsToClose.filter(e => !filter.except || !e.matches(filter.except)); } // Check for dirty and veto - let editorsToClose: EditorInput[]; - if (types.isUndefinedOrNull(filter.direction)) { - editorsToClose = editors.filter(e => !filter.except || !e.matches(filter.except)); - } else { - editorsToClose = (filter.direction === Direction.LEFT) ? editors.slice(0, group.indexOf(filter.except)) : editors.slice(group.indexOf(filter.except) + 1); - } - return this.handleDirty(editorsToClose.map(editor => { return { group, editor }; }), true /* ignore if opened in other group */).then(veto => { if (veto) { return; @@ -830,17 +820,50 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService const { editor } = identifier; - const res = editor.confirmSave(); - switch (res) { - case ConfirmResult.SAVE: - return editor.save().then(ok => !ok); + // Switch to editor that we want to handle + return this.openEditor(identifier.editor, null, this.stacks.positionOfGroup(identifier.group)).then(() => { + return this.ensureEditorOpenedBeforePrompt().then(() => { + const res = editor.confirmSave(); + switch (res) { + case ConfirmResult.SAVE: + return editor.save().then(ok => !ok); - case ConfirmResult.DONT_SAVE: - return editor.revert().then(ok => !ok); + case ConfirmResult.DONT_SAVE: + // first try a normal revert where the contents of the editor are restored + return editor.revert().then(ok => !ok, error => { + // if that fails, since we are about to close the editor, we accept that + // the editor cannot be reverted and instead do a soft revert that just + // enables us to close the editor. With this, a user can always close a + // dirty editor even when reverting fails. + return editor.revert({ soft: true }).then(ok => !ok); + }); - case ConfirmResult.CANCEL: - return TPromise.as(true); // veto - } + case ConfirmResult.CANCEL: + return true; // veto + } + }); + }); + } + + private ensureEditorOpenedBeforePrompt(): TPromise { + + // Force title area update + this.editorGroupsControl.updateTitleAreas(true /* refresh active group */); + + // TODO@Ben our dialogs currently use the sync API, which means they block the JS + // thread when showing. As such, any UI update will not happen unless we wait a little + // bit. We wait for 2 request animation frames before showing the confirm. The first + // frame is where the UI is updating and the second is good enough to bring up the dialog. + // See also https://github.com/Microsoft/vscode/issues/39536 + return new TPromise(c => { + scheduleAtNextAnimationFrame(() => { + // Here the UI is updating + scheduleAtNextAnimationFrame(() => { + // Here we can show a blocking dialog + c(void 0); + }); + }); + }); } private countEditors(editor: EditorInput): number { diff --git a/src/vs/workbench/browser/parts/editor/editorPicker.ts b/src/vs/workbench/browser/parts/editor/editorPicker.ts index 979df653a597..abe0d8a17a98 100644 --- a/src/vs/workbench/browser/parts/editor/editorPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorPicker.ts @@ -16,7 +16,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { getIconClasses } from 'vs/workbench/browser/labels'; import { IModelService } from 'vs/editor/common/services/modelService'; import { QuickOpenHandler } from 'vs/workbench/browser/quickopen'; -import { Position } from 'vs/platform/editor/common/editor'; +import { Position, IEditorOptions } from 'vs/platform/editor/common/editor'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -71,15 +71,13 @@ export class EditorPickerEntry extends QuickOpenEntryGroup { } public run(mode: Mode, context: IEntryRunContext): boolean { - if (mode === Mode.OPEN) { - return this.runOpen(context); + let options: IEditorOptions; + if (mode === Mode.PREVIEW) { + options = { preserveFocus: true }; // in preview, make sure to keep focus in quick open } - return super.run(mode, context); - } - - private runOpen(context: IEntryRunContext): boolean { - this.editorService.openEditor(this.editor, null, this.stacks.positionOfGroup(this.group)).done(null, errors.onUnexpectedError); + // Open Editor + this.editorService.openEditor(this.editor, options, this.stacks.positionOfGroup(this.group)).done(null, errors.onUnexpectedError); return true; } diff --git a/src/vs/workbench/browser/parts/editor/media/tabstitle.css b/src/vs/workbench/browser/parts/editor/media/tabstitle.css index f28bc2a599cf..3dcea34628f0 100644 --- a/src/vs/workbench/browser/parts/editor/media/tabstitle.css +++ b/src/vs/workbench/browser/parts/editor/media/tabstitle.css @@ -37,8 +37,6 @@ .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab { display: flex; - width: 120px; - min-width: fit-content; white-space: nowrap; cursor: pointer; height: 35px; @@ -47,10 +45,35 @@ padding-left: 10px; } +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.sizing-shrink.has-icon-theme.close-button-right, +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.sizing-shrink.has-icon-theme.close-button-off { + padding-left: 5px; /* reduce padding when we show icons and are in shrinking mode and tab close button is not left */ +} + +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.sizing-fit { + width: 120px; + min-width: fit-content; +} + +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.sizing-shrink { + min-width: 60px; + flex-basis: 0; /* all tabs are even */ + flex-grow: 1; /* all tabs grow even */ + max-width: fit-content; +} + +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.sizing-shrink.close-button-left { + min-width: 80px; /* make more room for close button when it shows to the left */ +} + .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.dragged { will-change: transform; /* forces tab to be drawn on a separate layer (fixes https://github.com/Microsoft/vscode/issues/18733) */ } +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.dragged-over * { + pointer-events: none; /* prevents cursor flickering (fixes https://github.com/Microsoft/vscode/issues/38753) */ +} + .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.close-button-left { flex-direction: row-reverse; padding-left: 0; @@ -64,8 +87,8 @@ margin-bottom: auto; } -.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab .monaco-icon-label, -.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab .monaco-icon-label > .monaco-icon-label-description-container { +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.sizing-fit .monaco-icon-label, +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.sizing-fit .monaco-icon-label > .monaco-icon-label-description-container { overflow: visible; /* fixes https://github.com/Microsoft/vscode/issues/20182 */ } @@ -81,6 +104,16 @@ width: 28px; } +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.close-button-right.sizing-shrink > .tab-close { + flex: 0; + overflow: hidden; /* let the close button be pushed out of view when sizing is set to shrink to make more room... */ +} + +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.dirty.close-button-right.sizing-shrink > .tab-close, +.monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.close-button-right.sizing-shrink:hover > .tab-close { + overflow: visible; /* ...but still show the close button on hover and when dirty */ +} + .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.close-button-off > .tab-close { display: none; /* hide the close action bar when we are configured to hide it */ } @@ -132,8 +165,7 @@ /* No Tab Close Button */ .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.close-button-off { - padding-right: 12px; - transition: padding-right ease-in-out 100ms; + padding-right: 10px; /* give a little bit more room if close button is off */ } .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.close-button-off.dirty { diff --git a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts index 7b5575cf751d..72aeecf038b6 100644 --- a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts @@ -18,7 +18,6 @@ import { EventType as TouchEventType, GestureEvent, Gesture } from 'vs/base/brow export class NoTabsTitleControl extends TitleControl { private titleContainer: HTMLElement; private editorLabel: ResourceLabel; - private titleTouchSupport: Gesture; public setContext(group: IEditorGroup): void { super.setContext(group); @@ -32,7 +31,7 @@ export class NoTabsTitleControl extends TitleControl { this.titleContainer = parent; // Gesture Support - this.titleTouchSupport = new Gesture(this.titleContainer); + Gesture.addTarget(this.titleContainer); // Pin on double click this.toUnbind.push(DOM.addDisposableListener(this.titleContainer, DOM.EventType.DBLCLICK, (e: MouseEvent) => this.onTitleDoubleClick(e))); @@ -162,10 +161,4 @@ export class NoTabsTitleControl extends TitleControl { default: return Verbosity.MEDIUM; } } - - public dispose(): void { - super.dispose(); - - this.titleTouchSupport.dispose(); - } -} \ No newline at end of file +} diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 054b32740acc..a80ab21c3f01 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -30,22 +30,24 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService } from 'vs/platform/actions/common/actions'; -import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; -import { TitleControl, handleWorkspaceExternalDrop } from 'vs/workbench/browser/parts/editor/titleControl'; +import { TitleControl } from 'vs/workbench/browser/parts/editor/titleControl'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; -import { extractResources } from 'vs/workbench/browser/editor'; +import { CodeDataTransfers, ISerializedDraggedEditor } from 'vs/workbench/browser/editor'; import { getOrSet } from 'vs/base/common/map'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { TAB_INACTIVE_BACKGROUND, TAB_ACTIVE_BACKGROUND, TAB_ACTIVE_FOREGROUND, TAB_INACTIVE_FOREGROUND, TAB_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, TAB_UNFOCUSED_ACTIVE_FOREGROUND, TAB_UNFOCUSED_INACTIVE_FOREGROUND, TAB_UNFOCUSED_ACTIVE_BORDER, TAB_ACTIVE_BORDER } from 'vs/workbench/common/theme'; +import { TAB_INACTIVE_BACKGROUND, TAB_ACTIVE_BACKGROUND, TAB_ACTIVE_FOREGROUND, TAB_INACTIVE_FOREGROUND, TAB_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, TAB_UNFOCUSED_ACTIVE_FOREGROUND, TAB_UNFOCUSED_INACTIVE_FOREGROUND, TAB_UNFOCUSED_ACTIVE_BORDER, TAB_ACTIVE_BORDER, TAB_HOVER_BACKGROUND, TAB_HOVER_BORDER, TAB_UNFOCUSED_HOVER_BACKGROUND, TAB_UNFOCUSED_HOVER_BORDER } from 'vs/workbench/common/theme'; import { activeContrastBorder, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { IFileService } from 'vs/platform/files/common/files'; -import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { Dimension } from 'vs/base/browser/builder'; import { scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; +import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { DataTransfers } from 'vs/base/browser/dnd'; +import { EditorAreaDropHandler } from 'vs/workbench/browser/parts/editor/editorAreaDropHandler'; +import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; interface IEditorInputLabel { name: string; @@ -78,11 +80,9 @@ export class TabsTitleControl extends TitleControl { @IMessageService messageService: IMessageService, @IMenuService menuService: IMenuService, @IQuickOpenService quickOpenService: IQuickOpenService, - @IWindowService private windowService: IWindowService, - @IWindowsService private windowsService: IWindowsService, @IThemeService themeService: IThemeService, - @IFileService private fileService: IFileService, - @IWorkspacesService private workspacesService: IWorkspacesService + @ITextFileService private textFileService: ITextFileService, + @IBackupFileService private backupFileService: IBackupFileService ) { super(contextMenuService, instantiationService, editorService, editorGroupService, contextKeyService, keybindingService, telemetryService, messageService, menuService, quickOpenService, themeService); @@ -156,6 +156,12 @@ export class TabsTitleControl extends TitleControl { } })); + this.toUnbind.push(DOM.addDisposableListener(this.tabsContainer, DOM.EventType.MOUSE_DOWN, (e: MouseEvent) => { + if (e.button === 1) { + e.preventDefault(); // required to prevent auto-scrolling (https://github.com/Microsoft/vscode/issues/16690) + } + })); + // Custom Scrollbar this.scrollbar = new ScrollableElement(this.tabsContainer, { horizontal: ScrollbarVisibility.Auto, @@ -275,7 +281,9 @@ export class TabsTitleControl extends TitleControl { const isGroupActive = this.stacks.isActive(group); if (isGroupActive) { DOM.addClass(this.titleContainer, 'active'); + DOM.removeClass(this.titleContainer, 'inactive'); } else { + DOM.addClass(this.titleContainer, 'inactive'); DOM.removeClass(this.titleContainer, 'active'); } @@ -286,6 +294,10 @@ export class TabsTitleControl extends TitleControl { // Tab label and styles editorsOfGroup.forEach((editor, index) => { const tabContainer = this.tabsContainer.children[index] as HTMLElement; + if (!tabContainer) { + return; // could be a race condition between updating tabs and creating tabs + } + const isPinned = group.isPinned(index); const isTabActive = group.isActive(editor); const isDirty = editor.isDirty(); @@ -303,11 +315,23 @@ export class TabsTitleControl extends TitleControl { tabContainer.style.outlineColor = this.getColor(activeContrastBorder); const tabOptions = this.editorGroupService.getTabOptions(); - ['off', 'left'].forEach(option => { + + ['off', 'left', 'right'].forEach(option => { const domAction = tabOptions.tabCloseButton === option ? DOM.addClass : DOM.removeClass; domAction(tabContainer, `close-button-${option}`); }); + ['fit', 'shrink'].forEach(option => { + const domAction = tabOptions.tabSizing === option ? DOM.addClass : DOM.removeClass; + domAction(tabContainer, `sizing-${option}`); + }); + + if (tabOptions.showIcons && !!tabOptions.iconTheme) { + DOM.addClass(tabContainer, 'has-icon-theme'); + } else { + DOM.removeClass(tabContainer, 'has-icon-theme'); + } + // Label const tabLabel = this.editorLabels[index]; tabLabel.setLabel({ name, description, resource: toResource(editor, { supportSideBySide: true }) }, { extraClasses: ['tab-label'], italic: !isPinned }); @@ -519,7 +543,7 @@ export class TabsTitleControl extends TitleControl { DOM.addClass(tabContainer, 'tab'); // Gesture Support - const gestureSupport = new Gesture(tabContainer); + Gesture.addTarget(tabContainer); // Tab Editor Label const editorLabel = this.instantiationService.createInstance(ResourceLabel, tabContainer, void 0); @@ -536,7 +560,7 @@ export class TabsTitleControl extends TitleControl { // Eventing const disposable = this.hookTabListeners(tabContainer, index); - this.tabDisposeables.push(combinedDisposable([disposable, bar, editorLabel, gestureSupport])); + this.tabDisposeables.push(combinedDisposable([disposable, bar, editorLabel])); return tabContainer; } @@ -611,7 +635,7 @@ export class TabsTitleControl extends TitleControl { if (e instanceof MouseEvent && e.button !== 0) { if (e.button === 1) { - return false; // required due to https://github.com/Microsoft/vscode/issues/16690 + e.preventDefault(); // required to prevent auto-scrolling (https://github.com/Microsoft/vscode/issues/16690) } return void 0; // only for left mouse click @@ -739,12 +763,22 @@ export class TabsTitleControl extends TitleControl { const resource = toResource(editor, { supportSideBySide: true }); if (resource) { const resourceStr = resource.toString(); - e.dataTransfer.setData('URL', resourceStr); // enables cross window DND of tabs - e.dataTransfer.setData('text/plain', getPathLabel(resource)); // enables dropping tab resource path into text controls + + e.dataTransfer.setData(DataTransfers.TEXT, getPathLabel(resource)); // enables dropping tab resource path into text controls if (resource.scheme === 'file') { - e.dataTransfer.setData('DownloadURL', [MIME_BINARY, editor.getName(), resourceStr].join(':')); // enables support to drag a tab as file to desktop + e.dataTransfer.setData(DataTransfers.DOWNLOAD_URL, [MIME_BINARY, editor.getName(), resourceStr].join(':')); // enables support to drag a tab as file to desktop } + + // Prepare IDraggedEditor transfer + const activeEditor = this.editorService.getActiveEditor(); + const draggedEditor: ISerializedDraggedEditor = { + resource: resourceStr, + backupResource: this.textFileService.isDirty(resource) ? this.backupFileService.toBackupResource(resource).toString() : void 0, + viewState: activeEditor instanceof BaseTextEditor ? activeEditor.getControl().saveViewState() : void 0 + }; + + e.dataTransfer.setData(CodeDataTransfers.EDITOR, JSON.stringify(draggedEditor)); // enables cross window DND of tabs into the editor area } // Fixes https://github.com/Microsoft/vscode/issues/18733 @@ -773,6 +807,8 @@ export class TabsTitleControl extends TitleControl { } } + DOM.addClass(tab, 'dragged-over'); + if (!draggedEditorIsTab) { this.updateDropFeedback(tab, true, index); } @@ -782,6 +818,7 @@ export class TabsTitleControl extends TitleControl { disposables.push(DOM.addDisposableListener(tab, DOM.EventType.DRAG_LEAVE, (e: DragEvent) => { counter--; if (counter === 0) { + DOM.removeClass(tab, 'dragged-over'); this.updateDropFeedback(tab, false, index); } })); @@ -789,6 +826,7 @@ export class TabsTitleControl extends TitleControl { // Drag end disposables.push(DOM.addDisposableListener(tab, DOM.EventType.DRAG_END, (e: DragEvent) => { counter = 0; + DOM.removeClass(tab, 'dragged-over'); this.updateDropFeedback(tab, false, index); this.onEditorDragEnd(); @@ -797,6 +835,7 @@ export class TabsTitleControl extends TitleControl { // Drop disposables.push(DOM.addDisposableListener(tab, DOM.EventType.DROP, (e: DragEvent) => { counter = 0; + DOM.removeClass(tab, 'dragged-over'); this.updateDropFeedback(tab, false, index); const { group, position } = this.toTabContext(index); @@ -820,13 +859,14 @@ export class TabsTitleControl extends TitleControl { } private onDrop(e: DragEvent, group: IEditorGroup, targetPosition: Position, targetIndex: number): void { + DOM.EventHelper.stop(e, true); + this.updateDropFeedback(this.tabsContainer, false); DOM.removeClass(this.tabsContainer, 'scroll'); // Local DND const draggedEditor = TabsTitleControl.getDraggedEditor(); if (draggedEditor) { - DOM.EventHelper.stop(e, true); // Move editor to target position and index if (this.isMoveOperation(e, draggedEditor.group, group)) { @@ -843,37 +883,8 @@ export class TabsTitleControl extends TitleControl { // External DND else { - this.handleExternalDrop(e, targetPosition, targetIndex); - } - } - - private handleExternalDrop(e: DragEvent, targetPosition: Position, targetIndex: number): void { - const droppedResources = extractResources(e).filter(r => r.resource.scheme === 'file' || r.resource.scheme === 'untitled'); - if (droppedResources.length) { - DOM.EventHelper.stop(e, true); - - handleWorkspaceExternalDrop(droppedResources, this.fileService, this.messageService, this.windowsService, this.windowService, this.workspacesService).then(handled => { - if (handled) { - return; - } - - // Add external ones to recently open list - const externalResources = droppedResources.filter(d => d.isExternal).map(d => d.resource); - if (externalResources.length) { - this.windowsService.addRecentlyOpened(externalResources.map(resource => resource.fsPath)); - } - - // Open in Editor - this.windowService.focusWindow() - .then(() => this.editorService.openEditors(droppedResources.map(d => { - return { - input: { resource: d.resource, options: { pinned: true, index: targetIndex } }, - position: targetPosition - }; - }))).then(() => { - this.editorGroupService.focusGroup(targetPosition); - }).done(null, errors.onUnexpectedError); - }); + const dropHandler = this.instantiationService.createInstance(EditorAreaDropHandler); + dropHandler.handleDrop(e, () => this.editorGroupService.focusGroup(targetPosition), targetPosition, targetIndex); } } @@ -931,4 +942,42 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { } `); } -}); \ No newline at end of file + + // Hover Background + const tabHoverBackground = theme.getColor(TAB_HOVER_BACKGROUND); + if (tabHoverBackground) { + collector.addRule(` + .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.active .tabs-container > .tab:hover { + background: ${tabHoverBackground} !important; + } + `); + } + + const tabUnfocusedHoverBackground = theme.getColor(TAB_UNFOCUSED_HOVER_BACKGROUND); + if (tabUnfocusedHoverBackground) { + collector.addRule(` + .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.inactive .tabs-container > .tab:hover { + background: ${tabUnfocusedHoverBackground} !important; + } + `); + } + + // Hover Border + const tabHoverBorder = theme.getColor(TAB_HOVER_BORDER); + if (tabHoverBorder) { + collector.addRule(` + .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.active .tabs-container > .tab:hover { + box-shadow: ${tabHoverBorder} 0 -1px inset !important; + } + `); + } + + const tabUnfocusedHoverBorder = theme.getColor(TAB_UNFOCUSED_HOVER_BORDER); + if (tabUnfocusedHoverBorder) { + collector.addRule(` + .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.inactive .tabs-container > .tab:hover { + box-shadow: ${tabUnfocusedHoverBorder} 0 -1px inset !important; + } + `); + } +}); diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index f6205123ea6c..fbc40c161240 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -37,12 +37,6 @@ import { IMenuService, MenuId, IMenu, ExecuteCommandAction } from 'vs/platform/a import { ResourceContextKey } from 'vs/workbench/common/resources'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Themable } from 'vs/workbench/common/theme'; -import { IDraggedResource } from 'vs/workbench/browser/editor'; -import { WORKSPACE_EXTENSION, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; -import { extname } from 'vs/base/common/paths'; -import { IFileService } from 'vs/platform/files/common/files'; -import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; -import URI from 'vs/base/common/uri'; import { isDiffEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { Dimension } from 'vs/base/browser/builder'; @@ -423,7 +417,17 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl getActions: () => TPromise.as(this.getContextMenuActions(identifier)), getActionsContext: () => identifier, getKeyBinding: (action) => this.getKeybinding(action), - onHide: (cancel) => this.resourceContext.set(currentContext) // restore previous context + onHide: (cancel) => { + + // restore previous context + this.resourceContext.set(currentContext); + + // restore focus to active editor if any + const editor = this.editorService.getActiveEditor(); + if (editor) { + editor.focus(); + } + } }); } @@ -490,74 +494,3 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl this.editorActionsToolbar.dispose(); } } - -/** - * Shared function across some editor components to handle drag & drop of folders and workspace files - * to open them in the window instead of the editor. - */ -export function handleWorkspaceExternalDrop( - resources: IDraggedResource[], - fileService: IFileService, - messageService: IMessageService, - windowsService: IWindowsService, - windowService: IWindowService, - workspacesService: IWorkspacesService -): TPromise { - - // Return early if there are no external resources - const externalResources = resources.filter(d => d.isExternal).map(d => d.resource); - if (!externalResources.length) { - return TPromise.as(false); - } - - const externalWorkspaceResources: { workspaces: URI[], folders: URI[] } = { - workspaces: [], - folders: [] - }; - - return TPromise.join(externalResources.map(resource => { - - // Check for Workspace - if (extname(resource.fsPath) === `.${WORKSPACE_EXTENSION}`) { - externalWorkspaceResources.workspaces.push(resource); - - return void 0; - } - - // Check for Folder - return fileService.resolveFile(resource).then(stat => { - if (stat.isDirectory) { - externalWorkspaceResources.folders.push(stat.resource); - } - }, error => void 0); - })).then(_ => { - const { workspaces, folders } = externalWorkspaceResources; - - // Return early if no external resource is a folder or workspace - if (workspaces.length === 0 && folders.length === 0) { - return false; - } - - // Pass focus to window - windowService.focusWindow(); - - let workspacesToOpen: TPromise; - - // Open in separate windows if we drop workspaces or just one folder - if (workspaces.length > 0 || folders.length === 1) { - workspacesToOpen = TPromise.as([...workspaces, ...folders].map(resources => resources.fsPath)); - } - - // Multiple folders: Create new workspace with folders and open - else if (folders.length > 1) { - workspacesToOpen = workspacesService.createWorkspace(folders.map(folder => ({ uri: folder }))).then(workspace => [workspace.configPath]); - } - - // Open - workspacesToOpen.then(workspaces => { - windowsService.openWindow(workspaces, { forceReuseWindow: true }); - }); - - return true; - }); -} diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index 67a4a38738a5..a72286fe7917 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -31,7 +31,7 @@ } .monaco-workbench > .part.panel > .composite.title > .title-actions { - flex: 0; + flex-grow: 0; } .monaco-workbench > .part.panel > .title > .title-actions .monaco-action-bar .action-item .action-label { @@ -50,35 +50,39 @@ } .monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar { - line-height: 32px; + line-height: 30px; + height: 35px; } -.monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:first-child .action-label { +.monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:first-child { margin-left: 12px; } -.monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item .action-label { +.monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item { text-transform: uppercase; - margin-left: 16px; - margin-right: 16px; + padding-left: 16px; + padding-right: 16px; font-size: 11px; - padding-bottom: 4px; /* puts the bottom border down */ + padding-bottom: 3px; /* puts the bottom border down */ + padding-top: 2px; + display: flex; +} + +.monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:last-child { + padding-right: 6px; } .monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked .action-label { border-bottom: 1px solid; + height: 82%; } .monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .badge .badge-content { - top: 8px; - right: 0px; - position: absolute; - font-size: 11px; - min-width: 6px; - line-height: 18px; - padding: 0 5px; - border-radius: 20px; + padding: 0.2em 0.5em; + border-radius: 1em; + font-weight: normal; text-align: center; + display: inline; } /** Actions */ diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 075ae3a16506..b195a3511b05 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -43,6 +43,7 @@ export class PanelPart extends CompositePart implements IPanelService { private blockOpeningPanel: boolean; private compositeBar: CompositeBar; private dimension: Dimension; + private toolbarWidth = new Map(); constructor( id: string, @@ -86,7 +87,7 @@ export class PanelPart extends CompositePart implements IPanelService { getOnCompositeClickAction: (compositeId: string) => this.instantiationService.createInstance(PanelActivityAction, this.getPanel(compositeId)), getDefaultCompositeId: () => Registry.as(PanelExtensions.Panels).getDefaultPanelId(), hidePart: () => this.partService.setPanelHidden(true), - overflowActionSize: 28, + overflowActionSize: 44, colors: { backgroundColor: PANEL_BACKGROUND, badgeBackground, @@ -213,6 +214,9 @@ export class PanelPart extends CompositePart implements IPanelService { } public layout(dimension: Dimension): Dimension[] { + if (!this.partService.isVisible(Parts.PANEL_PART)) { + return [dimension]; + } if (this.partService.getPanelPosition() === Position.RIGHT) { // Take into account the 1px border when layouting @@ -228,15 +232,27 @@ export class PanelPart extends CompositePart implements IPanelService { private layoutCompositeBar(): void { if (this.dimension) { - let availableWidth = this.dimension.width - 8; // take padding into account + let availableWidth = this.dimension.width - 40; // take padding into account if (this.toolBar) { // adjust height for global actions showing - availableWidth = Math.max(PanelPart.MIN_COMPOSITE_BAR_WIDTH, availableWidth - this.toolBar.getContainer().getHTMLElement().offsetWidth); + availableWidth = Math.max(PanelPart.MIN_COMPOSITE_BAR_WIDTH, availableWidth - this.getToolbarWidth()); } this.compositeBar.layout(new Dimension(availableWidth, this.dimension.height)); } } + private getToolbarWidth(): number { + const activePanel = this.getActivePanel(); + if (!activePanel) { + return 0; + } + if (!this.toolbarWidth.has(activePanel.getId())) { + this.toolbarWidth.set(activePanel.getId(), this.toolBar.getContainer().getHTMLElement().offsetWidth); + } + + return this.toolbarWidth.get(activePanel.getId()); + } + public shutdown(): void { // Persist Hidden State this.compositeBar.store(); @@ -315,7 +331,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { outline-style: solid; border-bottom: none; padding-bottom: 0; - outline-offset: 3px; + outline-offset: 1px; } .monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:not(.checked) .action-label:hover { diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index c301f8d29e3f..c5e59196388d 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -35,7 +35,6 @@ import { EditorInput, IWorkbenchEditorConfiguration } from 'vs/workbench/common/ import { Component } from 'vs/workbench/common/component'; import Event, { Emitter } from 'vs/base/common/event'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { KeyMod } from 'vs/base/common/keyCodes'; import { QuickOpenHandler, QuickOpenHandlerDescriptor, IQuickOpenRegistry, Extensions, EditorQuickOpenEntry, CLOSE_ON_FOCUS_LOST_CONFIG } from 'vs/workbench/browser/quickopen'; import errors = require('vs/base/common/errors'); import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -43,11 +42,9 @@ import { IPickOpenEntry, IFilePickOpenEntry, IInputOptions, IQuickOpenService, I import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; -import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { attachQuickOpenStyler } from 'vs/platform/theme/common/styler'; @@ -57,6 +54,7 @@ import { BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { FileKind, IFileService } from 'vs/platform/files/common/files'; import { scoreItem, ScorerCache, compareItemsByScore, prepareQuery } from 'vs/base/parts/quickopen/common/quickOpenScorer'; import { getBaseLabel } from 'vs/base/common/labels'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; const HELP_PREFIX = '?'; @@ -105,7 +103,6 @@ export class QuickOpenController extends Component implements IQuickOpenService constructor( @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IMessageService private messageService: IMessageService, - @ITelemetryService private telemetryService: ITelemetryService, @IContextKeyService private contextKeyService: IContextKeyService, @IConfigurationService private configurationService: IConfigurationService, @IInstantiationService private instantiationService: IInstantiationService, @@ -313,14 +310,13 @@ export class QuickOpenController extends Component implements IQuickOpenService onHide: (reason) => this.handleOnHide(true, reason) }, { inputPlaceHolder: options.placeHolder || '', - keyboardSupport: false - }, - this.telemetryService + keyboardSupport: false, + treeCreator: (container, config, opts) => new WorkbenchTree(container, config, opts, this.contextKeyService, this.listService, this.themeService) + } ); this.toUnbind.push(attachQuickOpenStyler(this.pickOpenWidget, this.themeService, { background: SIDE_BAR_BACKGROUND, foreground: SIDE_BAR_FOREGROUND })); const pickOpenContainer = this.pickOpenWidget.create(); - this.toUnbind.push(this.listService.register(this.pickOpenWidget.getTree())); DOM.addClass(pickOpenContainer, 'show-file-icons'); this.positionQuickOpenWidget(); } @@ -556,14 +552,6 @@ export class QuickOpenController extends Component implements IQuickOpenService const registry = Registry.as(Extensions.Quickopen); const handlerDescriptor = registry.getQuickOpenHandler(prefix) || registry.getDefaultQuickOpenHandler(); - /* __GDPR__ - "quickOpenWidgetShown" : { - "mode" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "quickNavigate": { "${inline}": [ "${IQuickNavigateConfiguration}" ] } - } - */ - this.telemetryService.publicLog('quickOpenWidgetShown', { mode: handlerDescriptor.getId(), quickNavigate: quickNavigateConfiguration }); - // Trigger onOpen this.resolveHandler(handlerDescriptor).done(null, errors.onUnexpectedError); @@ -580,14 +568,13 @@ export class QuickOpenController extends Component implements IQuickOpenService onFocusLost: () => !this.closeOnFocusLost }, { inputPlaceHolder: this.hasHandler(HELP_PREFIX) ? nls.localize('quickOpenInput', "Type '?' to get help on the actions you can take from here") : '', - keyboardSupport: false - }, - this.telemetryService + keyboardSupport: false, + treeCreator: (container, config, opts) => new WorkbenchTree(container, config, opts, this.contextKeyService, this.listService, this.themeService) + } ); this.toUnbind.push(attachQuickOpenStyler(this.quickOpenWidget, this.themeService, { background: SIDE_BAR_BACKGROUND, foreground: SIDE_BAR_FOREGROUND })); const quickOpenContainer = this.quickOpenWidget.create(); - this.toUnbind.push(this.listService.register(this.quickOpenWidget.getTree())); DOM.addClass(quickOpenContainer, 'show-file-icons'); this.positionQuickOpenWidget(); } @@ -870,7 +857,7 @@ export class QuickOpenController extends Component implements IQuickOpenService const result = handlerResults[i]; const resource = result.getResource(); - if (!result.isFile() || !resource || !mapEntryToResource[resource.toString()]) { + if (!result.mergeWithEditorHistory() || !resource || !mapEntryToResource[resource.toString()]) { additionalHandlerResults.push(result); } } @@ -1314,8 +1301,8 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { public run(mode: Mode, context: IEntryRunContext): boolean { if (mode === Mode.OPEN) { - const sideBySide = !context.quickNavigateConfiguration && context.keymods.indexOf(KeyMod.CtrlCmd) >= 0; - const pinned = !this.configurationService.getValue().workbench.editor.enablePreviewFromQuickOpen; + const sideBySide = !context.quickNavigateConfiguration && context.keymods.ctrlCmd; + const pinned = !this.configurationService.getValue().workbench.editor.enablePreviewFromQuickOpen || context.keymods.alt; if (this.input instanceof EditorInput) { this.editorService.openEditor(this.input, { pinned }, sideBySide).done(null, errors.onUnexpectedError); diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index fd9b149c8031..bdb3dae5d54e 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -29,6 +29,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND, SIDE_BAR_BORDER } from 'vs/workbench/common/theme'; import { ToggleSidebarVisibilityAction } from 'vs/workbench/browser/actions/toggleSidebarVisibility'; +import { Dimension } from 'vs/base/browser/builder'; export class SidebarPart extends CompositePart { @@ -128,6 +129,14 @@ export class SidebarPart extends CompositePart { return this.hideActiveComposite().then(composite => void 0); } + public layout(dimension: Dimension): Dimension[] { + if (!this.partService.isVisible(Parts.SIDEBAR_PART)) { + return [dimension]; + } + + return super.layout(dimension); + } + protected getTitleAreaContextMenuActions(): IAction[] { const contextMenuActions = super.getTitleAreaContextMenuActions(); if (contextMenuActions.length) { diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index d7bee751d176..10ce86b1cc73 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -14,31 +14,29 @@ import { IAction, IActionItem, ActionRunner } from 'vs/base/common/actions'; import { IMessageService } from 'vs/platform/message/common/message'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IListService } from 'vs/platform/list/browser/listService'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { ClickBehavior, DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; import { createActionItem, fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITree, IDataSource, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; -import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { ViewsRegistry } from 'vs/workbench/browser/parts/views/viewsRegistry'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; -import { ViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { TreeViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { TreeItemCollapsibleState, ITreeItem, ITreeViewDataProvider, TreeViewItemHandleArg } from 'vs/workbench/common/views'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; -export class TreeView extends ViewsViewletPanel { +export class TreeView extends TreeViewsViewletPanel { private menus: Menus; - private viewFocusContext: IContextKey; private activated: boolean = false; private treeInputPromise: TPromise; private dataProviderElementChangeListener: IDisposable; + private elementsToRefresh: ITreeItem[] = []; constructor( options: IViewletViewOptions, @@ -54,7 +52,6 @@ export class TreeView extends ViewsViewletPanel { ) { super({ ...(options as IViewOptions), ariaHeaderLabel: options.name }, keybindingService, contextMenuService); this.menus = this.instantiationService.createInstance(Menus, this.id); - this.viewFocusContext = this.contextKeyService.createKey(this.id, void 0); this.menus.onDidChangeTitle(() => this.updateActions(), this, this.disposables); this.themeService.onThemeChange(() => this.tree.refresh() /* soft refresh */, this, this.disposables); if (options.expanded) { @@ -86,21 +83,22 @@ export class TreeView extends ViewsViewletPanel { } } - public createViewer(container: Builder): ITree { + public createViewer(container: Builder): WorkbenchTree { const dataSource = this.instantiationService.createInstance(TreeDataSource, this.id); const renderer = this.instantiationService.createInstance(TreeRenderer); const controller = this.instantiationService.createInstance(TreeController, this.id, this.menus); - const tree = new Tree(container.getHTMLElement(), { - dataSource, - renderer, - controller - }, { - keyboardSupport: false - }); + const tree = new WorkbenchTree( + container.getHTMLElement(), + { dataSource, renderer, controller }, + { keyboardSupport: false }, + this.contextKeyService, + this.listService, + this.themeService + ); - this.disposables.push(attachListStyler(tree, this.themeService)); - this.disposables.push(this.listService.register(tree, [this.viewFocusContext])); + tree.contextKeyService.createKey(this.id, true); this.disposables.push(tree.onDidChangeSelection(() => this.onSelection())); + return tree; } @@ -116,10 +114,6 @@ export class TreeView extends ViewsViewletPanel { return createActionItem(action, this.keybindingService, this.messageService); } - public setVisible(visible: boolean): TPromise { - return super.setVisible(visible); - } - private setInput(): TPromise { if (this.tree) { if (!this.treeInputPromise) { @@ -175,10 +169,29 @@ export class TreeView extends ViewsViewletPanel { } } + protected updateTreeVisibility(tree: WorkbenchTree, isVisible: boolean): void { + super.updateTreeVisibility(tree, isVisible); + if (isVisible && this.elementsToRefresh.length) { + this.doRefresh(this.elementsToRefresh); + this.elementsToRefresh = []; + } + } + private refresh(elements: ITreeItem[]): void { - elements = elements ? elements : [this.tree.getInput()]; + if (!elements) { + const root: ITreeItem = this.tree.getInput(); + root.children = null; // reset children + elements = [root]; + } + if (this.isVisible() && this.isExpanded()) { + this.doRefresh(elements); + } else { + this.elementsToRefresh.push(...elements); + } + } + + private doRefresh(elements: ITreeItem[]): void { for (const element of elements) { - element.children = null; this.tree.refresh(element); } } @@ -195,7 +208,8 @@ export class TreeView extends ViewsViewletPanel { class Root implements ITreeItem { label = 'root'; - handle = -1; + handle = '0'; + parentHandle = null; collapsibleState = TreeItemCollapsibleState.Expanded; } @@ -208,7 +222,7 @@ class TreeDataSource implements IDataSource { } public getId(tree: ITree, node: ITreeItem): string { - return '' + node.handle; + return node.handle; } public hasChildren(tree: ITree, node: ITreeItem): boolean { diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index 82a567781551..cd2d2213b2d0 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -12,7 +12,6 @@ import { Scope } from 'vs/workbench/common/memento'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IAction, IActionRunner } from 'vs/base/common/actions'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; import { firstIndex } from 'vs/base/common/arrays'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; @@ -28,6 +27,7 @@ import { IContextKeyService, IContextKeyChangeEvent } from 'vs/platform/contextk import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { PanelViewlet, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IPanelOptions } from 'vs/base/browser/ui/splitview/panelview'; +import { WorkbenchTree } from 'vs/platform/list/browser/listService'; export interface IViewOptions extends IPanelOptions { id: string; @@ -37,15 +37,10 @@ export interface IViewOptions extends IPanelOptions { export abstract class ViewsViewletPanel extends ViewletPanel { + private _isVisible: boolean; + readonly id: string; readonly name: string; - protected treeContainer: HTMLElement; - - // TODO@sandeep why is tree here? isn't this coming only from TreeView - protected tree: ITree; - protected isDisposed: boolean; - private _isVisible: boolean; - private dragHandler: DelayedDragHandler; constructor( options: IViewOptions, @@ -59,6 +54,72 @@ export abstract class ViewsViewletPanel extends ViewletPanel { this._expanded = options.expanded; } + setVisible(visible: boolean): TPromise { + if (this._isVisible !== visible) { + this._isVisible = visible; + } + + return TPromise.wrap(null); + } + + isVisible(): boolean { + return this._isVisible; + } + + getActions(): IAction[] { + return []; + } + + getSecondaryActions(): IAction[] { + return []; + } + + getActionItem(action: IAction): IActionItem { + return null; + } + + getActionsContext(): any { + return undefined; + } + + getOptimalWidth(): number { + return 0; + } + + create(): TPromise { + return TPromise.as(null); + } + + shutdown(): void { + // Subclass to implement + } + +} + +// TODO@isidor @sandeep remove this class +export abstract class TreeViewsViewletPanel extends ViewsViewletPanel { + + readonly id: string; + readonly name: string; + protected treeContainer: HTMLElement; + + // TODO@sandeep why is tree here? isn't this coming only from TreeView + protected tree: WorkbenchTree; + protected isDisposed: boolean; + private dragHandler: DelayedDragHandler; + + constructor( + options: IViewOptions, + protected keybindingService: IKeybindingService, + protected contextMenuService: IContextMenuService + ) { + super(options, keybindingService, contextMenuService); + + this.id = options.id; + this.name = options.name; + this._expanded = options.expanded; + } + setExpanded(expanded: boolean): void { this.updateTreeVisibility(this.tree, expanded); super.setExpanded(expanded); @@ -77,18 +138,14 @@ export abstract class ViewsViewletPanel extends ViewletPanel { return treeContainer; } - getViewer(): ITree { + getViewer(): WorkbenchTree { return this.tree; } - isVisible(): boolean { - return this._isVisible; - } - setVisible(visible: boolean): TPromise { - if (this._isVisible !== visible) { - this._isVisible = visible; - this.updateTreeVisibility(this.tree, visible && this.isExpanded()); + if (this.isVisible() !== visible) { + return super.setVisible(visible) + .then(() => this.updateTreeVisibility(this.tree, visible && this.isExpanded())); } return TPromise.wrap(null); @@ -157,7 +214,7 @@ export abstract class ViewsViewletPanel extends ViewletPanel { super.dispose(); } - private updateTreeVisibility(tree: ITree, isVisible: boolean): void { + protected updateTreeVisibility(tree: WorkbenchTree, isVisible: boolean): void { if (!tree) { return; } @@ -362,16 +419,14 @@ export class ViewsViewlet extends PanelViewlet { for (const view of panels) { let viewState = this.viewsStates.get(view.id); if (!viewState || typeof viewState.size === 'undefined' || !view.isExpanded() !== viewState.collapsed) { - viewState = this.updateViewStateSize(view); - this.viewsStates.set(view.id, viewState); + this.updateViewStateSize(view); } } if (toRemove.length) { for (const viewDescriptor of toRemove) { let view = this.getView(viewDescriptor.id); - const viewState = this.updateViewStateSize(view); - this.viewsStates.set(view.id, viewState); + this.updateViewStateSize(view); this.removePanel(view); this.viewsViewletPanels.splice(this.viewsViewletPanels.indexOf(view), 1); } @@ -394,7 +449,7 @@ export class ViewsViewlet extends PanelViewlet { this.addPanel(view, size, index); this.viewsViewletPanels.splice(index, 0, view); - this.viewsStates.set(view.id, this.updateViewStateSize(view)); + this.updateViewStateSize(view); } return TPromise.join(toCreate.map(view => view.create())) @@ -408,8 +463,7 @@ export class ViewsViewlet extends PanelViewlet { private updateAllViewsSizes(): void { for (const view of this.viewsViewletPanels) { - let viewState = this.updateViewStateSize(view); - this.viewsStates.set(view.id, viewState); + this.updateViewStateSize(view); } } @@ -562,10 +616,16 @@ export class ViewsViewlet extends PanelViewlet { return this.viewsViewletPanels.filter(view => view.id === id)[0]; } - private updateViewStateSize(view: ViewsViewletPanel): IViewState { + private updateViewStateSize(view: ViewsViewletPanel): void { const currentState = this.viewsStates.get(view.id); + if (currentState && !this.didLayout) { + // Do not update to new state if the layout has not happened yet + return; + } + const newViewState = this.createViewState(view); - return currentState ? { ...currentState, collapsed: newViewState.collapsed, size: newViewState.size } : newViewState; + const stateToUpdate = currentState ? { ...currentState, collapsed: newViewState.collapsed, size: newViewState.size } : newViewState; + this.viewsStates.set(view.id, stateToUpdate); } protected createViewState(view: ViewsViewletPanel): IViewState { diff --git a/src/vs/workbench/browser/quickopen.ts b/src/vs/workbench/browser/quickopen.ts index 340218ea1ad6..39f9a21eda28 100644 --- a/src/vs/workbench/browser/quickopen.ts +++ b/src/vs/workbench/browser/quickopen.ts @@ -13,7 +13,6 @@ import types = require('vs/base/common/types'); import errors = require('vs/base/common/errors'); import { Registry } from 'vs/platform/registry/common/platform'; import { Action } from 'vs/base/common/actions'; -import { KeyMod } from 'vs/base/common/keyCodes'; import { Mode, IEntryRunContext, IAutoFocus, IModel, IQuickNavigateConfiguration } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntry, QuickOpenEntryGroup } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { EditorOptions, EditorInput } from 'vs/workbench/common/editor'; @@ -267,28 +266,30 @@ export class EditorQuickOpenEntry extends QuickOpenEntry implements IEditorQuick const hideWidget = (mode === Mode.OPEN); if (mode === Mode.OPEN || mode === Mode.OPEN_IN_BACKGROUND) { - let sideBySide = context.keymods.indexOf(KeyMod.CtrlCmd) >= 0; + const sideBySide = context.keymods.ctrlCmd; - let openInBackgroundOptions: IEditorOptions; + let openOptions: IEditorOptions; if (mode === Mode.OPEN_IN_BACKGROUND) { - openInBackgroundOptions = { pinned: true, preserveFocus: true }; + openOptions = { pinned: true, preserveFocus: true }; + } else if (context.keymods.alt) { + openOptions = { pinned: true }; } - let input = this.getInput(); + const input = this.getInput(); if (input instanceof EditorInput) { let opts = this.getOptions(); if (opts) { - opts = objects.mixin(opts, openInBackgroundOptions, true); - } else if (openInBackgroundOptions) { - opts = EditorOptions.create(openInBackgroundOptions); + opts = objects.mixin(opts, openOptions, true); + } else if (openOptions) { + opts = EditorOptions.create(openOptions); } this.editorService.openEditor(input, opts, sideBySide).done(null, errors.onUnexpectedError); } else { const resourceInput = input; - if (openInBackgroundOptions) { - resourceInput.options = objects.assign(resourceInput.options || Object.create(null), openInBackgroundOptions); + if (openOptions) { + resourceInput.options = objects.assign(resourceInput.options || Object.create(null), openOptions); } this.editorService.openEditor(resourceInput, sideBySide).done(null, errors.onUnexpectedError); diff --git a/src/vs/workbench/common/actions.ts b/src/vs/workbench/common/actions.ts index 8224b78b1937..70cf7c390c52 100644 --- a/src/vs/workbench/common/actions.ts +++ b/src/vs/workbench/common/actions.ts @@ -60,10 +60,17 @@ Registry.add(Extensions.WorkbenchActions, new class implements IWorkbenchActionR // https://github.com/Microsoft/vscode/blob/master/src/vs/workbench/parts/search/electron-browser/search.contribution.ts#L266 if (descriptor.label) { + let idx = alias.indexOf(': '); + let categoryOriginal; + if (idx > 0) { + categoryOriginal = alias.substr(0, idx); + alias = alias.substr(idx + 2); + } + const command = { id: descriptor.id, title: { value: descriptor.label, original: alias }, - category + category: category && { value: category, original: categoryOriginal } }; MenuRegistry.addCommand(command); diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 60d6992a6643..fa0547e62948 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -11,7 +11,7 @@ import types = require('vs/base/common/types'); import URI from 'vs/base/common/uri'; import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IEditor, IEditorViewState, IModel, ScrollType } from 'vs/editor/common/editorCommon'; -import { IEditorInput, IEditorModel, IEditorOptions, ITextEditorOptions, IBaseResourceInput, Position, Verbosity, IEditor as IBaseEditor } from 'vs/platform/editor/common/editor'; +import { IEditorInput, IEditorModel, IEditorOptions, ITextEditorOptions, IBaseResourceInput, Position, Verbosity, IEditor as IBaseEditor, IRevertOptions } from 'vs/platform/editor/common/editor'; import { IInstantiationService, IConstructorSignature0 } from 'vs/platform/instantiation/common/instantiation'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -214,7 +214,7 @@ export abstract class EditorInput implements IEditorInput { /** * Reverts the editor if it is dirty. Subclasses return a promise with a boolean indicating the success of the operation. */ - public revert(): TPromise { + public revert(options?: IRevertOptions): TPromise { return TPromise.as(true); } @@ -808,23 +808,11 @@ export const EditorOpenPositioning = { export const OPEN_POSITIONING_CONFIG = 'workbench.editor.openPositioning'; export interface IWorkbenchEditorConfiguration { - /* __GDPR__FRAGMENT__ - "IWorkbenchEditorConfiguration" : { - "showTabs" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "tabCloseButton": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "showIcons": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "enablePreview": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "enablePreviewFromQuickOpen": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "closeOnFileDelete": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "openPositioning": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "revealIfOpen": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "swipeToNavigate": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ workbench: { editor: { showTabs: boolean; tabCloseButton: 'left' | 'right' | 'off'; + tabSizing: 'fit' | 'shrink'; showIcons: boolean; enablePreview: boolean; enablePreviewFromQuickOpen: boolean; @@ -833,7 +821,8 @@ export interface IWorkbenchEditorConfiguration { revealIfOpen: boolean; swipeToNavigate: boolean, labelFormat: 'default' | 'short' | 'medium' | 'long'; - } + }, + iconTheme: string; }; } diff --git a/src/vs/workbench/common/editor/resourceEditorInput.ts b/src/vs/workbench/common/editor/resourceEditorInput.ts index 4f9a57314ec8..850154f02bc1 100644 --- a/src/vs/workbench/common/editor/resourceEditorInput.ts +++ b/src/vs/workbench/common/editor/resourceEditorInput.ts @@ -93,7 +93,8 @@ export class ResourceEditorInput extends EditorInput { if (!(model instanceof ResourceEditorModel)) { ref.dispose(); this.modelReference = null; - return TPromise.wrapError(new Error(`Unexpected model for ResourceInput: ${this.resource}`)); // TODO@Ben eventually also files should be supported, but we guard due to the dangerous dispose of the model in dispose() + + return TPromise.wrapError(new Error(`Unexpected model for ResourceInput: ${this.resource}`)); } return model; diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 77887fd950d4..5ea4917d2248 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -23,6 +23,18 @@ export const TAB_INACTIVE_BACKGROUND = registerColor('tab.inactiveBackground', { hc: null }, nls.localize('tabInactiveBackground', "Inactive tab background color. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_HOVER_BACKGROUND = registerColor('tab.hoverBackground', { + dark: null, + light: null, + hc: null +}, nls.localize('tabHoverBackground', "Tab background color when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + +export const TAB_UNFOCUSED_HOVER_BACKGROUND = registerColor('tab.unfocusedHoverBackground', { + dark: transparent(TAB_HOVER_BACKGROUND, 0.5), + light: transparent(TAB_HOVER_BACKGROUND, 0.7), + hc: null +}, nls.localize('tabUnfocusedHoverBackground', "Tab background color in an unfocused group when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + export const TAB_BORDER = registerColor('tab.border', { dark: '#252526', light: '#F3F3F3', @@ -41,6 +53,18 @@ export const TAB_UNFOCUSED_ACTIVE_BORDER = registerColor('tab.unfocusedActiveBor hc: null }, nls.localize('tabActiveUnfocusedBorder', "Border to highlight active tabs in an unfocused group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_HOVER_BORDER = registerColor('tab.hoverBorder', { + dark: null, + light: null, + hc: null +}, nls.localize('tabHoverBorder', "Border to highlight tabs when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + +export const TAB_UNFOCUSED_HOVER_BORDER = registerColor('tab.unfocusedHoverBorder', { + dark: transparent(TAB_HOVER_BORDER, 0.5), + light: transparent(TAB_HOVER_BORDER, 0.7), + hc: null +}, nls.localize('tabUnfocusedHoverBorder', "Border to highlight tabs in an unfocused group when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + export const TAB_ACTIVE_FOREGROUND = registerColor('tab.activeForeground', { dark: Color.white, light: '#333333', diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 599a1cfdde47..00b5ddbc9398 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -9,7 +9,7 @@ import { Command } from 'vs/editor/common/modes'; export type TreeViewItemHandleArg = { $treeViewId: string, - $treeItemHandle: number + $treeItemHandle: string }; export enum TreeItemCollapsibleState { @@ -20,7 +20,9 @@ export enum TreeItemCollapsibleState { export interface ITreeItem { - handle: number; + handle: string; + + parentHandle: string; label: string; diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index cae8f800d69c..76d1c2d8e3a3 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -25,8 +25,7 @@ import { IExtensionManagementService, LocalExtensionType, ILocalExtension, IExte import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import paths = require('vs/base/common/paths'); import { isMacintosh, isLinux, language } from 'vs/base/common/platform'; -import { IQuickOpenService, IFilePickOpenEntry, ISeparator, IPickOpenAction, IPickOpenItem } from 'vs/platform/quickOpen/common/quickOpen'; -import { KeyMod } from 'vs/base/common/keyCodes'; +import { IQuickOpenService, IFilePickOpenEntry, ISeparator, IPickOpenAction, IPickOpenItem, IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen'; import * as browser from 'vs/base/browser/browser'; import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; import { IEntryRunContext } from 'vs/base/parts/quickopen/common/quickOpen'; @@ -44,9 +43,10 @@ import { IPanel } from 'vs/workbench/common/panel'; import { IWorkspaceIdentifier, getWorkspaceLabel, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { FileKind, IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { IExtensionService, ActivationTimes } from 'vs/platform/extensions/common/extensions'; import { getEntries } from 'vs/base/common/performance'; import { IEditor } from 'vs/platform/editor/common/editor'; +import { ILogService, LogLevel } from 'vs/platform/log/common/log'; // --- actions @@ -360,7 +360,15 @@ export class ShowStartupPerformance extends Action { (console).groupEnd(); (console).group('Extension Activation Stats'); - (console).table(this.extensionService.getExtensionsActivationTimes()); + let extensionsActivationTimes: { [id: string]: ActivationTimes; } = {}; + let extensionsStatus = this.extensionService.getExtensionsStatus(); + for (let id in extensionsStatus) { + const status = extensionsStatus[id]; + if (status.activationTimes) { + extensionsActivationTimes[id] = status.activationTimes; + } + } + (console).table(extensionsActivationTimes); (console).groupEnd(); (console).group('Raw Startup Timers (CSV)'); @@ -750,7 +758,7 @@ export abstract class BaseOpenRecentAction extends Action { } const runPick = (path: string, isFile: boolean, context: IEntryRunContext) => { - const forceNewWindow = context.keymods.indexOf(KeyMod.CtrlCmd) >= 0; + const forceNewWindow = context.keymods.ctrlCmd; this.windowsService.openWindow([path], { forceNewWindow, forceOpenWorkspaceAsFile: isFile }); }; @@ -878,7 +886,7 @@ export class CloseMessagesAction extends Action { export class ReportIssueAction extends Action { public static readonly ID = 'workbench.action.reportIssues'; - public static readonly LABEL = nls.localize('reportIssues', "Report Issues"); + public static readonly LABEL = nls.localize({ key: 'reportIssueInEnglish', comment: ['Translate this to "Report Issue in English" in all languages please!'] }, "Report Issue"); constructor( id: string, @@ -991,13 +999,13 @@ export class ReportPerformanceIssueAction extends Action { } public run(appendix?: string): TPromise { - return this.integrityService.isPure().then(res => { + this.integrityService.isPure().then(res => { const issueUrl = this.generatePerformanceIssueUrl(product.reportIssueUrl, pkg.name, pkg.version, product.commit, product.date, res.isPure, appendix); window.open(issueUrl); - - return TPromise.as(true); }); + + return TPromise.wrap(true); } private generatePerformanceIssueUrl(baseUrl: string, name: string, version: string, commit: string, date: string, isPure: boolean, appendix?: string): string { @@ -1675,4 +1683,82 @@ export class ConfigureLocaleAction extends Action { throw new Error(nls.localize('fail.createSettings', "Unable to create '{0}' ({1}).", getPathLabel(file, this.contextService), error)); }); } +} + +export class OpenLogsFolderAction extends Action { + + static ID = 'workbench.action.openLogsFolder'; + static LABEL = nls.localize('openLogsFolder', "Open Logs Folder"); + + constructor(id: string, label: string, + @IEnvironmentService private environmentService: IEnvironmentService, + @IWindowsService private windowsService: IWindowsService, + ) { + super(id, label); + } + + run(): TPromise { + return this.windowsService.showItemInFolder(paths.join(this.environmentService.logsPath, 'main.log')); + } +} + +export class ShowLogsAction extends Action { + + static ID = 'workbench.action.showLogs'; + static LABEL = nls.localize('showLogs', "Show Logs..."); + + constructor(id: string, label: string, + @IEnvironmentService private environmentService: IEnvironmentService, + @IWindowService private windowService: IWindowService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IQuickOpenService private quickOpenService: IQuickOpenService + ) { + super(id, label); + } + + run(): TPromise { + const entries: IPickOpenEntry[] = [ + { id: 'main', label: nls.localize('mainProcess', "Main"), run: () => this.editorService.openEditor({ resource: URI.file(paths.join(this.environmentService.logsPath, 'main.log')) }) }, + { id: 'shared', label: nls.localize('sharedProcess', "Shared"), run: () => this.editorService.openEditor({ resource: URI.file(paths.join(this.environmentService.logsPath, 'sharedprocess.log')) }) }, + { id: 'renderer', label: nls.localize('rendererProcess', "Renderer"), run: () => this.editorService.openEditor({ resource: URI.file(paths.join(this.environmentService.logsPath, `renderer${this.windowService.getCurrentWindowId()}.log`)) }) }, + { id: 'extenshionHost', label: nls.localize('extensionHost', "Extension Host"), run: () => this.editorService.openEditor({ resource: URI.file(paths.join(this.environmentService.logsPath, `exthost${this.windowService.getCurrentWindowId()}.log`)) }) } + ]; + + return this.quickOpenService.pick(entries, { placeHolder: nls.localize('selectProcess', "Select process") }).then(entry => { + if (entry) { + entry.run(null); + } + }); + } +} + +export class SetLogLevelAction extends Action { + + static ID = 'workbench.action.setLogLevel'; + static LABEL = nls.localize('setLogLevel', "Set Log Level"); + + constructor(id: string, label: string, + @IQuickOpenService private quickOpenService: IQuickOpenService, + @ILogService private logService: ILogService + ) { + super(id, label); + } + + run(): TPromise { + const entries = [ + { label: nls.localize('trace', "Trace"), level: LogLevel.Trace }, + { label: nls.localize('debug', "Debug"), level: LogLevel.Debug }, + { label: nls.localize('info', "Info"), level: LogLevel.Info }, + { label: nls.localize('warn', "Warning"), level: LogLevel.Warning }, + { label: nls.localize('err', "Error"), level: LogLevel.Error }, + { label: nls.localize('critical', "Critical"), level: LogLevel.Critical }, + { label: nls.localize('off', "Off"), level: LogLevel.Off } + ]; + + return this.quickOpenService.pick(entries, { placeHolder: nls.localize('selectLogLevel', "Select log level"), autoFocus: { autoFocusIndex: this.logService.getLevel() } }).then(entry => { + if (entry) { + this.logService.setLevel(entry.level); + } + }); + } } \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 81bc8dd1fbbf..4fcb345a224b 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -7,12 +7,7 @@ 'use strict'; -if (window.location.search.indexOf('prof-startup') >= 0) { - var profiler = require('v8-profiler'); - profiler.startProfiling('renderer', true); -} - -/*global window,document,define,Monaco_Loader_Init*/ +/*global window,document,define*/ const perf = require('../../../base/common/performance'); perf.mark('renderer/started'); @@ -62,15 +57,6 @@ function parseURLQueryArgs() { .reduce(function (r, param) { r[param[0]] = decodeURIComponent(param[1]); return r; }, {}); } -function createScript(src, onload) { - const script = document.createElement('script'); - script.src = src; - script.addEventListener('load', onload); - - const head = document.getElementsByTagName('head')[0]; - head.insertBefore(script, head.lastChild); -} - function uriFromPath(_path) { var pathName = path.resolve(_path).replace(/\\/g, '/'); if (pathName.length > 0 && pathName.charAt(0) !== '/') { @@ -158,73 +144,63 @@ function main() { } // Load the loader and start loading the workbench - const rootUrl = uriFromPath(configuration.appRoot) + '/out'; + const loaderFilename = configuration.appRoot + '/out/vs/loader.js'; + const loaderSource = require('fs').readFileSync(loaderFilename); + require('vm').runInThisContext(loaderSource, { filename: loaderFilename }); - function onLoader() { - window.nodeRequire = require.__$__nodeRequire; + window.nodeRequire = require.__$__nodeRequire; - define('fs', ['original-fs'], function (originalFS) { return originalFS; }); // replace the patched electron fs with the original node fs for all AMD code + define('fs', ['original-fs'], function (originalFS) { return originalFS; }); // replace the patched electron fs with the original node fs for all AMD code - window.MonacoEnvironment = {}; + window.MonacoEnvironment = {}; - const onNodeCachedData = window.MonacoEnvironment.onNodeCachedData = []; - require.config({ - baseUrl: rootUrl, - 'vs/nls': nlsConfig, - recordStats: !!configuration.performance, - nodeCachedDataDir: configuration.nodeCachedDataDir, - onNodeCachedData: function () { onNodeCachedData.push(arguments); }, - nodeModules: [/*BUILD->INSERT_NODE_MODULES*/] - }); + const onNodeCachedData = window.MonacoEnvironment.onNodeCachedData = []; + require.config({ + baseUrl: uriFromPath(configuration.appRoot) + '/out', + 'vs/nls': nlsConfig, + recordStats: !!configuration.performance, + nodeCachedDataDir: configuration.nodeCachedDataDir, + onNodeCachedData: function () { onNodeCachedData.push(arguments); }, + nodeModules: [/*BUILD->INSERT_NODE_MODULES*/] + }); - if (nlsConfig.pseudo) { - require(['vs/nls'], function (nlsPlugin) { - nlsPlugin.setPseudoTranslation(nlsConfig.pseudo); - }); - } - - // Perf Counters - const timers = window.MonacoEnvironment.timers = { - isInitialStartup: !!configuration.isInitialStartup, - hasAccessibilitySupport: !!configuration.accessibilitySupport, - start: configuration.perfStartTime, - appReady: configuration.perfAppReady, - windowLoad: configuration.perfWindowLoadTime, - beforeLoadWorkbenchMain: Date.now() - }; - - const workbenchMainClock = perf.time('loadWorkbenchMain'); - require([ - 'vs/workbench/workbench.main', - 'vs/nls!vs/workbench/workbench.main', - 'vs/css!vs/workbench/workbench.main' - ], function () { - workbenchMainClock.stop(); - timers.afterLoadWorkbenchMain = Date.now(); - - process.lazyEnv.then(function () { - perf.mark('main/startup'); - require('vs/workbench/electron-browser/main') - .startup(configuration) - .done(function () { - unbind(); // since the workbench is running, unbind our developer related listeners and let the workbench handle them - }, function (error) { - onError(error, enableDeveloperTools); - }); - }); + if (nlsConfig.pseudo) { + require(['vs/nls'], function (nlsPlugin) { + nlsPlugin.setPseudoTranslation(nlsConfig.pseudo); }); } - // In the bundled version the nls plugin is packaged with the loader so the NLS Plugins - if (typeof Monaco_Loader_Init === 'function') { - const loader = Monaco_Loader_Init(); - //eslint-disable-next-line no-global-assign - define = loader.define; require = loader.require; - onLoader(); + // Perf Counters + const timers = window.MonacoEnvironment.timers = { + isInitialStartup: !!configuration.isInitialStartup, + hasAccessibilitySupport: !!configuration.accessibilitySupport, + start: configuration.perfStartTime, + appReady: configuration.perfAppReady, + windowLoad: configuration.perfWindowLoadTime, + beforeLoadWorkbenchMain: Date.now() + }; + + const workbenchMainClock = perf.time('loadWorkbenchMain'); + require([ + 'vs/workbench/workbench.main', + 'vs/nls!vs/workbench/workbench.main', + 'vs/css!vs/workbench/workbench.main' + ], function () { + workbenchMainClock.stop(); + timers.afterLoadWorkbenchMain = Date.now(); + + process.lazyEnv.then(function () { + perf.mark('main/startup'); + require('vs/workbench/electron-browser/main') + .startup(configuration) + .done(function () { + unbind(); // since the workbench is running, unbind our developer related listeners and let the workbench handle them + }, function (error) { + onError(error, enableDeveloperTools); + }); + }); + }); - } else { - createScript(rootUrl + '/vs/loader.js', onLoader); - } } main(); diff --git a/src/vs/workbench/electron-browser/commands.ts b/src/vs/workbench/electron-browser/commands.ts index f079880f97cd..b7f991b44e92 100644 --- a/src/vs/workbench/electron-browser/commands.ts +++ b/src/vs/workbench/electron-browser/commands.ts @@ -12,7 +12,6 @@ import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRe import { IPartService } from 'vs/workbench/services/part/common/partService'; import { NoEditorsVisibleContext, InZenModeContext } from 'vs/workbench/electron-browser/workbench'; import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; -import { IListService, ListFocusContext } from 'vs/platform/list/browser/listService'; import { List } from 'vs/base/browser/ui/list/listWidget'; import errors = require('vs/base/common/errors'); import { CommandsRegistry } from 'vs/platform/commands/common/commands'; @@ -20,6 +19,9 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import URI from 'vs/base/common/uri'; import { IEditorOptions, Position as EditorPosition } from 'vs/platform/editor/common/editor'; import { openFolderCommand, openFileInNewWindowCommand, openFileFolderInNewWindowCommand, openFolderInNewWindowCommand, openWorkspaceInNewWindowCommand } from 'vs/workbench/browser/actions/workspaceActions'; +import { WorkbenchListFocusContextKey, IListService } from 'vs/platform/list/browser/listService'; +import { PagedList } from 'vs/base/browser/ui/list/listPaging'; +import { range } from 'vs/base/common/arrays'; // --- List Commands @@ -28,19 +30,18 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusDown', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.DownArrow, mac: { primary: KeyCode.DownArrow, secondary: [KeyMod.WinCtrl | KeyCode.KEY_N] }, handler: (accessor, arg2) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; const count = typeof arg2 === 'number' ? arg2 : 1; // List - if (focused instanceof List) { + if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.focusNext(count); @@ -60,19 +61,18 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusUp', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.UpArrow, mac: { primary: KeyCode.UpArrow, secondary: [KeyMod.WinCtrl | KeyCode.KEY_P] }, handler: (accessor, arg2) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; const count = typeof arg2 === 'number' ? arg2 : 1; // List - if (focused instanceof List) { + if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.focusPrevious(count); @@ -92,18 +92,17 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.collapse', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.LeftArrow, mac: { primary: KeyCode.LeftArrow, secondary: [KeyMod.CtrlCmd | KeyCode.UpArrow] }, handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // Tree only - if (focused && !(focused instanceof List)) { + if (focused && !(focused instanceof List || focused instanceof PagedList)) { const tree = focused; const focus = tree.getFocus(); @@ -123,14 +122,13 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.expand', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.RightArrow, handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // Tree only - if (focused && !(focused instanceof List)) { + if (focused && !(focused instanceof List || focused instanceof PagedList)) { const tree = focused; const focus = tree.getFocus(); @@ -150,14 +148,13 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusPageUp', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.PageUp, handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // List - if (focused instanceof List) { + if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.focusPreviousPage(); @@ -177,14 +174,13 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusPageDown', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.PageDown, handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // List - if (focused instanceof List) { + if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.focusNextPage(); @@ -204,7 +200,7 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusFirst', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.Home, handler: accessor => listFocusFirst(accessor) }); @@ -212,17 +208,16 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusFirstChild', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: null, handler: accessor => listFocusFirst(accessor, { fromFocused: true }) }); function listFocusFirst(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // List - if (focused instanceof List) { + if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.setFocus([0]); @@ -241,7 +236,7 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusLast', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.End, handler: accessor => listFocusLast(accessor) }); @@ -249,17 +244,16 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusLastChild', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: null, handler: accessor => listFocusLast(accessor, { fromFocused: true }) }); function listFocusLast(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // List - if (focused instanceof List) { + if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.setFocus([list.length - 1]); @@ -278,7 +272,7 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.select', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.Enter, secondary: [KeyMod.CtrlCmd | KeyCode.Enter], mac: { @@ -286,11 +280,10 @@ export function registerCommands(): void { secondary: [KeyMod.CtrlCmd | KeyCode.Enter, KeyMod.CtrlCmd | KeyCode.DownArrow] }, handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // List - if (focused instanceof List) { + if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.setSelection(list.getFocus()); list.open(list.getFocus()); @@ -308,17 +301,32 @@ export function registerCommands(): void { } }); + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'list.selectAll', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + when: WorkbenchListFocusContextKey, + primary: KeyMod.CtrlCmd | KeyCode.KEY_A, + handler: (accessor) => { + const focused = accessor.get(IListService).lastFocusedList; + + // List + if (focused instanceof List || focused instanceof PagedList) { + const list = focused; + list.setSelection(range(list.length)); + } + } + }); + KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.toggleExpand', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.Space, handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // Tree only - if (focused && !(focused instanceof List)) { + if (focused && !(focused instanceof List || focused instanceof PagedList)) { const tree = focused; const focus = tree.getFocus(); @@ -332,14 +340,13 @@ export function registerCommands(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.clear', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ListFocusContext, + when: WorkbenchListFocusContextKey, primary: KeyCode.Escape, handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); + const focused = accessor.get(IListService).lastFocusedList; // Tree only - if (focused && !(focused instanceof List)) { + if (focused && !(focused instanceof List || focused instanceof PagedList)) { const tree = focused; if (tree.getSelection().length) { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index c7b3f2fc56d4..24565c1ea2d9 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -14,7 +14,7 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'v import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; -import { CloseEditorAction, KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, ReportIssueAction, ReportPerformanceIssueAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseWorkspaceAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, CloseMessagesAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, ConfigureLocaleAction } from 'vs/workbench/electron-browser/actions'; +import { CloseEditorAction, KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, ReportIssueAction, ReportPerformanceIssueAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseWorkspaceAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, CloseMessagesAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, ConfigureLocaleAction, ShowLogsAction, OpenLogsFolderAction, SetLogLevelAction } from 'vs/workbench/electron-browser/actions'; import { MessagesVisibleContext } from 'vs/workbench/electron-browser/workbench'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { registerCommands } from 'vs/workbench/electron-browser/commands'; @@ -31,11 +31,15 @@ registerCommands(); const viewCategory = nls.localize('view', "View"); const helpCategory = nls.localize('help', "Help"); const fileCategory = nls.localize('file', "File"); +const devCategory = nls.localize('developer', "Developer"); const workbenchActionsRegistry = Registry.as(Extensions.WorkbenchActions); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(NewWindowAction, NewWindowAction.ID, NewWindowAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_N }), 'New Window'); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(CloseCurrentWindowAction, CloseCurrentWindowAction.ID, CloseCurrentWindowAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_W }), 'Close Window'); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(SwitchWindow, SwitchWindow.ID, SwitchWindow.LABEL, { primary: null, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_W } }), 'Switch Window...'); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(QuickSwitchWindow, QuickSwitchWindow.ID, QuickSwitchWindow.LABEL), 'Quick Switch Window...'); +workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowLogsAction, ShowLogsAction.ID, ShowLogsAction.LABEL), 'Developer: Show Logs...', devCategory); +workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenLogsFolderAction, OpenLogsFolderAction.ID, OpenLogsFolderAction.LABEL), 'Developer: Open Log Folder', devCategory); +workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(SetLogLevelAction, SetLogLevelAction.ID, SetLogLevelAction.LABEL), 'Developer: Set Log Level', devCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenRecentAction, QuickOpenRecentAction.ID, QuickOpenRecentAction.LABEL), 'File: Quick Open Recent...', fileCategory); @@ -157,6 +161,12 @@ let workbenchProperties: { [path: string]: IJSONSchema; } = { 'default': 'right', 'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorTabCloseButton' }, "Controls the position of the editor's tabs close buttons or disables them when set to 'off'.") }, + 'workbench.editor.tabSizing': { + 'type': 'string', + 'enum': ['fit', 'shrink'], + 'default': 'fit', + 'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'tabSizing' }, "Controls the sizing of editor tabs. Set to 'fit' to keep tabs always large enough to show the full editor label. Set to 'shrink' to allow tabs to get smaller when the available space is not enough to show all tabs at once.") + }, 'workbench.editor.showIcons': { 'type': 'boolean', 'description': nls.localize('showIcons', "Controls if opened editors should show with an icon or not. This requires an icon theme to be enabled as well."), @@ -266,130 +276,121 @@ configurationRegistry.registerConfiguration({ // Configuration: Window -let properties: { [path: string]: IJSONSchema; } = { - 'window.openFilesInNewWindow': { - 'type': 'string', - 'enum': ['on', 'off', 'default'], - 'enumDescriptions': [ - nls.localize('window.openFilesInNewWindow.on', "Files will open in a new window"), - nls.localize('window.openFilesInNewWindow.off', "Files will open in the window with the files' folder open or the last active window"), - nls.localize('window.openFilesInNewWindow.default', "Files will open in the window with the files' folder open or the last active window unless opened via the dock or from finder (macOS only)") - ], - 'default': 'off', - 'description': - nls.localize('openFilesInNewWindow', "Controls if files should open in a new window.\n- default: files will open in the window with the files' folder open or the last active window unless opened via the dock or from finder (macOS only)\n- on: files will open in a new window\n- off: files will open in the window with the files' folder open or the last active window\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).") - }, - 'window.openFoldersInNewWindow': { - 'type': 'string', - 'enum': ['on', 'off', 'default'], - 'enumDescriptions': [ - nls.localize('window.openFoldersInNewWindow.on', "Folders will open in a new window"), - nls.localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window"), - nls.localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu)") - ], - 'default': 'default', - 'description': nls.localize('openFoldersInNewWindow', "Controls if folders should open in a new window or replace the last active window.\n- default: folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu)\n- on: folders will open in a new window\n- off: folders will replace the last active window\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option)." - ) - }, - 'window.restoreWindows': { - 'type': 'string', - 'enum': ['all', 'folders', 'one', 'none'], - 'enumDescriptions': [ - nls.localize('window.reopenFolders.all', "Reopen all windows."), - nls.localize('window.reopenFolders.folders', "Reopen all folders. Empty workspaces will not be restored."), - nls.localize('window.reopenFolders.one', "Reopen the last active window."), - nls.localize('window.reopenFolders.none', "Never reopen a window. Always start with an empty one.") - ], - 'default': 'one', - 'description': nls.localize('restoreWindows', "Controls how windows are being reopened after a restart. Select 'none' to always start with an empty workspace, 'one' to reopen the last window you worked on, 'folders' to reopen all windows that had folders opened or 'all' to reopen all windows of your last session.") - }, - 'window.restoreFullscreen': { - 'type': 'boolean', - 'default': false, - 'description': nls.localize('restoreFullscreen', "Controls if a window should restore to full screen mode if it was exited in full screen mode.") - }, - 'window.zoomLevel': { - 'type': 'number', - 'default': 0, - 'description': nls.localize('zoomLevel', "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.") - }, - 'window.title': { - 'type': 'string', - 'default': isMacintosh ? '${activeEditorShort}${separator}${rootName}' : '${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}', - 'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'], key: 'title' }, - "Controls the window title based on the active editor. Variables are substituted based on the context:\n\${activeEditorShort}: the file name (e.g. myFile.txt)\n\${activeEditorMedium}: the path of the file relative to the workspace folder (e.g. myFolder/myFile.txt)\n\${activeEditorLong}: the full path of the file (e.g. /Users/Development/myProject/myFolder/myFile.txt)\n\${folderName}: name of the workspace folder the file is contained in (e.g. myFolder)\n\${folderPath}: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)\n\${rootName}: name of the workspace (e.g. myFolder or myWorkspace)\n\${rootPath}: file path of the workspace (e.g. /Users/Development/myWorkspace)\n\${appName}: e.g. VS Code\n\${dirty}: a dirty indicator if the active editor is dirty\n\${separator}: a conditional separator (\" - \") that only shows when surrounded by variables with values") - }, - 'window.newWindowDimensions': { - 'type': 'string', - 'enum': ['default', 'inherit', 'maximized', 'fullscreen'], - 'enumDescriptions': [ - nls.localize('window.newWindowDimensions.default', "Open new windows in the center of the screen."), - nls.localize('window.newWindowDimensions.inherit', "Open new windows with same dimension as last active one."), - nls.localize('window.newWindowDimensions.maximized', "Open new windows maximized."), - nls.localize('window.newWindowDimensions.fullscreen', "Open new windows in full screen mode.") - ], - 'default': 'default', - 'description': nls.localize('newWindowDimensions', "Controls the dimensions of opening a new window when at least one window is already opened. By default, a new window will open in the center of the screen with small dimensions. When set to 'inherit', the window will get the same dimensions as the last window that was active. When set to 'maximized', the window will open maximized and fullscreen if configured to 'fullscreen'. Note that this setting does not have an impact on the first window that is opened. The first window will always restore the size and location as you left it before closing.") - }, - 'window.closeWhenEmpty': { - 'type': 'boolean', - 'default': false, - 'description': nls.localize('closeWhenEmpty', "Controls if closing the last editor should also close the window. This setting only applies for windows that do not show folders.") - } -}; - -if (isWindows || isLinux) { - properties['window.menuBarVisibility'] = { - 'type': 'string', - 'enum': ['default', 'visible', 'toggle', 'hidden'], - 'enumDescriptions': [ - nls.localize('window.menuBarVisibility.default', "Menu is only hidden in full screen mode."), - nls.localize('window.menuBarVisibility.visible', "Menu is always visible even in full screen mode."), - nls.localize('window.menuBarVisibility.toggle', "Menu is hidden but can be displayed via Alt key."), - nls.localize('window.menuBarVisibility.hidden', "Menu is always hidden.") - ], - 'default': 'default', - 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen.") - }; - properties['window.enableMenuBarMnemonics'] = { - 'type': 'boolean', - 'default': true, - 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead.") - }; -} - -if (isWindows) { - properties['window.autoDetectHighContrast'] = { - 'type': 'boolean', - 'default': true, - 'description': nls.localize('autoDetectHighContrast', "If enabled, will automatically change to high contrast theme if Windows is using a high contrast theme, and to dark theme when switching away from a Windows high contrast theme."), - }; -} - -if (isMacintosh) { - properties['window.titleBarStyle'] = { - 'type': 'string', - 'enum': ['native', 'custom'], - 'default': 'custom', - 'description': nls.localize('titleBarStyle', "Adjust the appearance of the window title bar. Changes require a full restart to apply.") - }; - - // Minimum: macOS Sierra (10.12.x = darwin 16.x) - if (parseFloat(os.release()) >= 16) { - properties['window.nativeTabs'] = { - 'type': 'boolean', - 'default': false, - 'description': nls.localize('window.nativeTabs', "Enables macOS Sierra window tabs. Note that changes require a full restart to apply and that native tabs will disable a custom title bar style if configured.") - }; - } -} configurationRegistry.registerConfiguration({ 'id': 'window', 'order': 8, 'title': nls.localize('windowConfigurationTitle', "Window"), 'type': 'object', - 'properties': properties + 'properties': { + 'window.openFilesInNewWindow': { + 'type': 'string', + 'enum': ['on', 'off', 'default'], + 'enumDescriptions': [ + nls.localize('window.openFilesInNewWindow.on', "Files will open in a new window"), + nls.localize('window.openFilesInNewWindow.off', "Files will open in the window with the files' folder open or the last active window"), + nls.localize('window.openFilesInNewWindow.default', "Files will open in the window with the files' folder open or the last active window unless opened via the dock or from finder (macOS only)") + ], + 'default': 'off', + 'description': + nls.localize('openFilesInNewWindow', "Controls if files should open in a new window.\n- default: files will open in the window with the files' folder open or the last active window unless opened via the dock or from finder (macOS only)\n- on: files will open in a new window\n- off: files will open in the window with the files' folder open or the last active window\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).") + }, + 'window.openFoldersInNewWindow': { + 'type': 'string', + 'enum': ['on', 'off', 'default'], + 'enumDescriptions': [ + nls.localize('window.openFoldersInNewWindow.on', "Folders will open in a new window"), + nls.localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window"), + nls.localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu)") + ], + 'default': 'default', + 'description': nls.localize('openFoldersInNewWindow', "Controls if folders should open in a new window or replace the last active window.\n- default: folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu)\n- on: folders will open in a new window\n- off: folders will replace the last active window\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option)." + ) + }, + 'window.restoreWindows': { + 'type': 'string', + 'enum': ['all', 'folders', 'one', 'none'], + 'enumDescriptions': [ + nls.localize('window.reopenFolders.all', "Reopen all windows."), + nls.localize('window.reopenFolders.folders', "Reopen all folders. Empty workspaces will not be restored."), + nls.localize('window.reopenFolders.one', "Reopen the last active window."), + nls.localize('window.reopenFolders.none', "Never reopen a window. Always start with an empty one.") + ], + 'default': 'one', + 'description': nls.localize('restoreWindows', "Controls how windows are being reopened after a restart. Select 'none' to always start with an empty workspace, 'one' to reopen the last window you worked on, 'folders' to reopen all windows that had folders opened or 'all' to reopen all windows of your last session.") + }, + 'window.restoreFullscreen': { + 'type': 'boolean', + 'default': false, + 'description': nls.localize('restoreFullscreen', "Controls if a window should restore to full screen mode if it was exited in full screen mode.") + }, + 'window.zoomLevel': { + 'type': 'number', + 'default': 0, + 'description': nls.localize('zoomLevel', "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.") + }, + 'window.title': { + 'type': 'string', + 'default': isMacintosh ? '${activeEditorShort}${separator}${rootName}' : '${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}', + 'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'], key: 'title' }, + "Controls the window title based on the active editor. Variables are substituted based on the context:\n\${activeEditorShort}: the file name (e.g. myFile.txt)\n\${activeEditorMedium}: the path of the file relative to the workspace folder (e.g. myFolder/myFile.txt)\n\${activeEditorLong}: the full path of the file (e.g. /Users/Development/myProject/myFolder/myFile.txt)\n\${folderName}: name of the workspace folder the file is contained in (e.g. myFolder)\n\${folderPath}: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)\n\${rootName}: name of the workspace (e.g. myFolder or myWorkspace)\n\${rootPath}: file path of the workspace (e.g. /Users/Development/myWorkspace)\n\${appName}: e.g. VS Code\n\${dirty}: a dirty indicator if the active editor is dirty\n\${separator}: a conditional separator (\" - \") that only shows when surrounded by variables with values") + }, + 'window.newWindowDimensions': { + 'type': 'string', + 'enum': ['default', 'inherit', 'maximized', 'fullscreen'], + 'enumDescriptions': [ + nls.localize('window.newWindowDimensions.default', "Open new windows in the center of the screen."), + nls.localize('window.newWindowDimensions.inherit', "Open new windows with same dimension as last active one."), + nls.localize('window.newWindowDimensions.maximized', "Open new windows maximized."), + nls.localize('window.newWindowDimensions.fullscreen', "Open new windows in full screen mode.") + ], + 'default': 'default', + 'description': nls.localize('newWindowDimensions', "Controls the dimensions of opening a new window when at least one window is already opened. By default, a new window will open in the center of the screen with small dimensions. When set to 'inherit', the window will get the same dimensions as the last window that was active. When set to 'maximized', the window will open maximized and fullscreen if configured to 'fullscreen'. Note that this setting does not have an impact on the first window that is opened. The first window will always restore the size and location as you left it before closing.") + }, + 'window.closeWhenEmpty': { + 'type': 'boolean', + 'default': false, + 'description': nls.localize('closeWhenEmpty', "Controls if closing the last editor should also close the window. This setting only applies for windows that do not show folders.") + }, + 'window.menuBarVisibility': { + 'type': 'string', + 'enum': ['default', 'visible', 'toggle', 'hidden'], + 'enumDescriptions': [ + nls.localize('window.menuBarVisibility.default', "Menu is only hidden in full screen mode."), + nls.localize('window.menuBarVisibility.visible', "Menu is always visible even in full screen mode."), + nls.localize('window.menuBarVisibility.toggle', "Menu is hidden but can be displayed via Alt key."), + nls.localize('window.menuBarVisibility.hidden', "Menu is always hidden.") + ], + 'default': 'default', + 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen."), + 'included': isWindows || isLinux + }, + 'window.enableMenuBarMnemonics': { + 'type': 'boolean', + 'default': true, + 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), + 'included': isWindows || isLinux + }, + 'window.autoDetectHighContrast': { + 'type': 'boolean', + 'default': true, + 'description': nls.localize('autoDetectHighContrast', "If enabled, will automatically change to high contrast theme if Windows is using a high contrast theme, and to dark theme when switching away from a Windows high contrast theme."), + 'included': !isWindows + }, + 'window.titleBarStyle': { + 'type': 'string', + 'enum': ['native', 'custom'], + 'default': 'custom', + 'description': nls.localize('titleBarStyle', "Adjust the appearance of the window title bar. Changes require a full restart to apply."), + 'included': isMacintosh + }, + 'window.nativeTabs': { + 'type': 'boolean', + 'default': false, + 'description': nls.localize('window.nativeTabs', "Enables macOS Sierra window tabs. Note that changes require a full restart to apply and that native tabs will disable a custom title bar style if configured."), + 'included': isMacintosh && parseFloat(os.release()) >= 16 // Minimum: macOS Sierra (10.12.x = darwin 16.x) + } + } }); // Configuration: Zen Mode @@ -442,6 +443,7 @@ const schemaId = 'vscode://schemas/locale'; const schema: IJSONSchema = { id: schemaId, + allowComments: true, description: 'Locale Definition file', type: 'object', default: { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 577105b0535d..ed776746567e 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -32,19 +32,19 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { StorageService, inMemoryLocalStorageInstance } from 'vs/platform/storage/common/storageService'; import { Client as ElectronIPCClient } from 'vs/base/parts/ipc/electron-browser/ipc.electron-browser'; -import { webFrame, remote } from 'electron'; +import { webFrame } from 'electron'; import { UpdateChannelClient } from 'vs/platform/update/common/updateIpc'; import { IUpdateService } from 'vs/platform/update/common/update'; import { URLChannelClient } from 'vs/platform/url/common/urlIpc'; import { IURLService } from 'vs/platform/url/common/url'; import { WorkspacesChannelClient } from 'vs/platform/workspaces/common/workspacesIpc'; import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { createLogService } from 'vs/platform/log/node/spdlogService'; import fs = require('fs'); +import { ConsoleLogService, MultiplexLogService } from 'vs/platform/log/common/log'; gracefulFs.gracefulify(fs); // enable gracefulFs -const currentWindowId = remote.getCurrentWindow().id; - export function startup(configuration: IWindowConfiguration): TPromise { // Ensure others can listen to zoom level changes @@ -68,14 +68,20 @@ export function startup(configuration: IWindowConfiguration): TPromise { } function openWorkbench(configuration: IWindowConfiguration): TPromise { - const mainProcessClient = new ElectronIPCClient(String(`window${currentWindowId}`)); - const mainServices = createMainProcessServices(mainProcessClient); + const mainProcessClient = new ElectronIPCClient(String(`window${configuration.windowId}`)); + const mainServices = createMainProcessServices(mainProcessClient, configuration); const environmentService = new EnvironmentService(configuration, configuration.execPath); + const spdlogService = createLogService(`renderer${configuration.windowId}`, environmentService); + const consoleLogService = new ConsoleLogService(environmentService); + const logService = new MultiplexLogService([consoleLogService, spdlogService]); + + logService.trace('openWorkbench configuration', JSON.stringify(configuration)); // Since the configuration service is one of the core services that is used in so many places, we initialize it // right before startup of the workbench shell to have its data ready for consumers return createAndInitializeWorkspaceService(configuration, environmentService).then(workspaceService => { + const timerService = new TimerService((window).MonacoEnvironment.timers as IInitData, workspaceService.getWorkbenchState() === WorkbenchState.EMPTY); const storageService = createStorageService(workspaceService, environmentService); @@ -90,6 +96,7 @@ function openWorkbench(configuration: IWindowConfiguration): TPromise { contextService: workspaceService, configurationService: workspaceService, environmentService, + logService, timerService, storageService }, mainServices, configuration); @@ -185,7 +192,7 @@ function createStorageService(workspaceService: IWorkspaceContextService, enviro return new StorageService(storage, storage, workspaceId, secondaryWorkspaceId); } -function createMainProcessServices(mainProcessClient: ElectronIPCClient): ServiceCollection { +function createMainProcessServices(mainProcessClient: ElectronIPCClient, configuration: IWindowConfiguration): ServiceCollection { const serviceCollection = new ServiceCollection(); const windowsChannel = mainProcessClient.getChannel('windows'); @@ -195,7 +202,7 @@ function createMainProcessServices(mainProcessClient: ElectronIPCClient): Servic serviceCollection.set(IUpdateService, new SyncDescriptor(UpdateChannelClient, updateChannel)); const urlChannel = mainProcessClient.getChannel('url'); - serviceCollection.set(IURLService, new SyncDescriptor(URLChannelClient, urlChannel, currentWindowId)); + serviceCollection.set(IURLService, new SyncDescriptor(URLChannelClient, urlChannel, configuration.windowId)); const workspacesChannel = mainProcessClient.getChannel('workspaces'); serviceCollection.set(IWorkspacesService, new WorkspacesChannelClient(workspacesChannel)); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 8eed7cd4610b..cf13abcc7ccb 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -21,15 +21,13 @@ import pkg from 'vs/platform/node/package'; import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService'; import { Workbench, IWorkbenchStartedInfo } from 'vs/workbench/electron-browser/workbench'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { NullTelemetryService, configurationTelemetry, lifecycleTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; +import { NullTelemetryService, configurationTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; import { IExperimentService, ExperimentService } from 'vs/platform/telemetry/common/experiments'; import { ITelemetryAppenderChannel, TelemetryAppenderClient } from 'vs/platform/telemetry/common/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; -import { IdleMonitor, UserStatus } from 'vs/platform/telemetry/browser/idleMonitor'; import ErrorTelemetry from 'vs/platform/telemetry/browser/errorTelemetry'; import { ElectronWindow } from 'vs/workbench/electron-browser/window'; -import { resolveWorkbenchCommonProperties, getOrCreateMachineId } from 'vs/platform/telemetry/node/workbenchCommonProperties'; -import { machineIdIpcChannel } from 'vs/platform/telemetry/node/commonProperties'; +import { resolveWorkbenchCommonProperties } from 'vs/platform/telemetry/node/workbenchCommonProperties'; import { IWindowsService, IWindowService, IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { WindowService } from 'vs/platform/windows/electron-browser/windowService'; import { MessageService } from 'vs/workbench/services/message/electron-browser/messageService'; @@ -53,7 +51,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { ILifecycleService, LifecyclePhase, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IMessageService, IChoiceService, Severity } from 'vs/platform/message/common/message'; @@ -73,7 +71,6 @@ import { IExtensionManagementChannel, ExtensionManagementChannelClient } from 'v import { IExtensionManagementService, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; -import { remote, ipcRenderer as ipc } from 'electron'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { restoreFontInfo, readFontInfo, saveFontInfo } from 'vs/editor/browser/config/configuration'; import * as browser from 'vs/base/browser/browser'; @@ -89,6 +86,7 @@ import { ITextMateService } from 'vs/workbench/services/textMate/electron-browse import { IBroadcastService, BroadcastService } from 'vs/platform/broadcast/electron-browser/broadcastService'; import { HashService } from 'vs/workbench/services/hash/node/hashService'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; +import { ILogService } from 'vs/platform/log/common/log'; /** * Services that we require for the Shell @@ -97,12 +95,11 @@ export interface ICoreServices { contextService: IWorkspaceContextService; configurationService: IConfigurationService; environmentService: IEnvironmentService; + logService: ILogService; timerService: ITimerService; storageService: IStorageService; } -const currentWindow = remote.getCurrentWindow(); - /** * The workbench shell contains the workbench with a rich header containing navigation and the activity bar. * With the Shell being the top level element in the page, it is also responsible for driving the layouting. @@ -111,6 +108,7 @@ export class WorkbenchShell { private storageService: IStorageService; private messageService: MessageService; private environmentService: IEnvironmentService; + private logService: ILogService; private contextViewService: ContextViewService; private configurationService: IConfigurationService; private contextService: IWorkspaceContextService; @@ -141,6 +139,7 @@ export class WorkbenchShell { this.contextService = coreServices.contextService; this.configurationService = coreServices.configurationService; this.environmentService = coreServices.environmentService; + this.logService = coreServices.logService; this.timerService = coreServices.timerService; this.storageService = coreServices.storageService; @@ -167,8 +166,8 @@ export class WorkbenchShell { this.workbench.startup().done(startupInfos => this.onWorkbenchStarted(startupInfos, instantiationService)); } catch (error) { - // Print out error - console.error(toErrorMessage(error, true)); + // Log it + this.logService.error(toErrorMessage(error, true)); // Rethrow throw error; @@ -179,7 +178,7 @@ export class WorkbenchShell { // Handle case where workbench is not starting up properly const timeoutHandle = setTimeout(() => { - console.warn('Workbench did not finish loading in 10 seconds, that might be a problem that should be reported.'); + this.logService.warn('Workbench did not finish loading in 10 seconds, that might be a problem that should be reported.'); }, 10000); this.lifecycleService.when(LifecyclePhase.Running).then(() => { @@ -274,12 +273,13 @@ export class WorkbenchShell { } private initServiceCollection(container: HTMLElement): [IInstantiationService, ServiceCollection] { - const disposables: IDisposable[] = []; - const serviceCollection = new ServiceCollection(); serviceCollection.set(IWorkspaceContextService, this.contextService); serviceCollection.set(IConfigurationService, this.configurationService); serviceCollection.set(IEnvironmentService, this.environmentService); + serviceCollection.set(ILogService, this.logService); + this.toUnbind.push(this.logService); + serviceCollection.set(ITimerService, this.timerService); serviceCollection.set(IStorageService, this.storageService); this.mainProcessServices.forEach((serviceIdentifier, serviceInstance) => { @@ -288,13 +288,13 @@ export class WorkbenchShell { const instantiationService: IInstantiationService = new InstantiationService(serviceCollection, true); - this.broadcastService = new BroadcastService(currentWindow.id); + this.broadcastService = new BroadcastService(this.configuration.windowId); serviceCollection.set(IBroadcastService, this.broadcastService); - serviceCollection.set(IWindowService, new SyncDescriptor(WindowService, currentWindow.id, this.configuration)); + serviceCollection.set(IWindowService, new SyncDescriptor(WindowService, this.configuration.windowId, this.configuration)); const sharedProcess = (serviceCollection.get(IWindowsService)).whenSharedProcessReady() - .then(() => connectNet(this.environmentService.sharedIPCHandle, `window:${currentWindow.id}`)); + .then(() => connectNet(this.environmentService.sharedIPCHandle, `window:${this.configuration.windowId}`)); sharedProcess .done(client => client.registerChannel('choice', instantiationService.createInstance(ChoiceChannel))); @@ -311,7 +311,6 @@ export class WorkbenchShell { serviceCollection.set(IExperimentService, this.experimentService); // Telemetry - this.sendMachineIdToMain(this.storageService); if (this.environmentService.isBuilt && !this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) { const channel = getDelayedChannel(sharedProcess.then(c => c.getChannel('telemetryAppender'))); const commit = product.commit; @@ -319,7 +318,7 @@ export class WorkbenchShell { const config: ITelemetryServiceConfig = { appender: new TelemetryAppenderClient(channel), - commonProperties: resolveWorkbenchCommonProperties(this.storageService, commit, version, this.environmentService.installSource), + commonProperties: resolveWorkbenchCommonProperties(this.storageService, commit, version, this.configuration.machineId, this.environmentService.installSourcePath), piiPaths: [this.environmentService.appRoot, this.environmentService.extensionsPath] }; @@ -327,27 +326,14 @@ export class WorkbenchShell { this.telemetryService = telemetryService; const errorTelemetry = new ErrorTelemetry(telemetryService); - const idleMonitor = new IdleMonitor(2 * 60 * 1000); // 2 minutes - const listener = idleMonitor.onStatusChange(status => - /* __GDPR__ - "UserIdleStart" : {} - */ - /* __GDPR__ - "UserIdleStop" : {} - */ - this.telemetryService.publicLog(status === UserStatus.Active - ? TelemetryService.IDLE_STOP_EVENT_NAME - : TelemetryService.IDLE_START_EVENT_NAME - )); - - disposables.push(telemetryService, errorTelemetry, listener, idleMonitor); + this.toUnbind.push(telemetryService, errorTelemetry); } else { this.telemetryService = NullTelemetryService; } serviceCollection.set(ITelemetryService, this.telemetryService); - disposables.push(configurationTelemetry(this.telemetryService, this.configurationService)); + this.toUnbind.push(configurationTelemetry(this.telemetryService, this.configurationService)); let crashReporterService = NullCrashReporterService; if (!this.environmentService.disableCrashReporter && product.crashReporter && product.hockeyApp) { @@ -360,10 +346,8 @@ export class WorkbenchShell { serviceCollection.set(IChoiceService, this.messageService); const lifecycleService = instantiationService.createInstance(LifecycleService); - this.toUnbind.push(lifecycleService.onShutdown(reason => dispose(disposables))); - this.toUnbind.push(lifecycleService.onShutdown(reason => saveFontInfo(this.storageService))); + this.toUnbind.push(lifecycleService.onShutdown(reason => this.dispose(reason))); serviceCollection.set(ILifecycleService, lifecycleService); - disposables.push(lifecycleTelemetry(this.telemetryService, lifecycleService)); this.lifecycleService = lifecycleService; const extensionManagementChannel = getDelayedChannel(sharedProcess.then(c => c.getChannel('extensions'))); @@ -371,7 +355,7 @@ export class WorkbenchShell { const extensionEnablementService = instantiationService.createInstance(ExtensionEnablementService); serviceCollection.set(IExtensionEnablementService, extensionEnablementService); - disposables.push(extensionEnablementService); + this.toUnbind.push(extensionEnablementService); this.extensionService = instantiationService.createInstance(ExtensionService); serviceCollection.set(IExtensionService, this.extensionService); @@ -414,12 +398,6 @@ export class WorkbenchShell { return [instantiationService, serviceCollection]; } - private sendMachineIdToMain(storageService: IStorageService) { - getOrCreateMachineId(storageService).then(machineId => { - ipc.send(machineIdIpcChannel, machineId); - }).then(null, errors.onUnexpectedError); - } - public open(): void { // Listen on unexpected errors @@ -463,8 +441,8 @@ export class WorkbenchShell { this.previousErrorTime = now; this.previousErrorValue = errorMsg; - // Log to console - console.error(errorMsg); + // Log it + this.logService.error(errorMsg); // Show to user if friendly message provided if (error && error.friendlyMessage && this.messageService) { @@ -482,20 +460,18 @@ export class WorkbenchShell { this.workbench.layout(); } - public dispose(): void { + public dispose(reason = ShutdownReason.QUIT): void { - // Workbench - if (this.workbench) { - this.workbench.dispose(); - } - - this.contextViewService.dispose(); - - // Listeners + // Dispose bindings this.toUnbind = dispose(this.toUnbind); - // Container - $(this.container).empty(); + // Keep font info for next startup around + saveFontInfo(this.storageService); + + // Dispose Workbench + if (this.workbench) { + this.workbench.dispose(reason); + } } } diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 52f9f210d192..be4fdf873847 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -10,7 +10,7 @@ import 'vs/css!./media/workbench'; import { localize } from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import Event, { Emitter, chain } from 'vs/base/common/event'; +import Event, { Emitter } from 'vs/base/common/event'; import DOM = require('vs/base/browser/dom'); import { Builder, $ } from 'vs/base/browser/builder'; import { Delayer, RunOnceScheduler } from 'vs/base/common/async'; @@ -37,7 +37,7 @@ import { IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbe import { PanelRegistry, Extensions as PanelExtensions } from 'vs/workbench/browser/panel'; import { QuickOpenController } from 'vs/workbench/browser/parts/quickopen/quickOpenController'; import { getServices } from 'vs/platform/instantiation/common/extensions'; -import { Position, Parts, IPartService, ILayoutOptions } from 'vs/workbench/services/part/common/partService'; +import { Position, Parts, IPartService, ILayoutOptions, Dimension } from 'vs/workbench/services/part/common/partService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ContextMenuService } from 'vs/workbench/services/contextview/electron-browser/contextmenuService'; @@ -55,7 +55,6 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ViewletService } from 'vs/workbench/services/viewlet/browser/viewletService'; import { RemoteFileService } from 'vs/workbench/services/files/electron-browser/remoteFileService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IListService, ListService } from 'vs/platform/list/browser/listService'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { ConfigurationResolverService } from 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; @@ -96,6 +95,9 @@ import { FileDecorationsService } from 'vs/workbench/services/decorations/browse import { IDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; import { ActivityService } from 'vs/workbench/services/activity/browser/activityService'; import URI from 'vs/base/common/uri'; +import { IListService, ListService } from 'vs/platform/list/browser/listService'; +import { domEvent } from 'vs/base/browser/event'; +import { InputFocusedContext } from 'vs/platform/workbench/common/contextkeys'; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); @@ -135,6 +137,14 @@ const Identifiers = { STATUSBAR_PART: 'workbench.parts.statusbar' }; +function getWorkbenchStateString(state: WorkbenchState): string { + switch (state) { + case WorkbenchState.EMPTY: return 'empty'; + case WorkbenchState.FOLDER: return 'folder'; + case WorkbenchState.WORKSPACE: return 'workspace'; + } +} + /** * The workbench creates and lays out all parts that make up the workbench. */ @@ -180,8 +190,7 @@ export class Workbench implements IPartService { private statusbarPart: StatusbarPart; private quickOpen: QuickOpenController; private workbenchLayout: WorkbenchLayout; - private toDispose: IDisposable[]; - private toShutdown: { shutdown: () => void; }[]; + private toUnbind: IDisposable[]; private sideBarHidden: boolean; private statusBarHidden: boolean; private activityBarHidden: boolean; @@ -230,8 +239,7 @@ export class Workbench implements IPartService { (configuration.filesToOpen && configuration.filesToOpen.length > 0) || (configuration.filesToDiff && configuration.filesToDiff.length > 0); - this.toDispose = []; - this.toShutdown = []; + this.toUnbind = []; this.editorBackgroundDelayer = new Delayer(50); this.closeEmptyWindowScheduler = new RunOnceScheduler(() => this.onAllEditorsClosed(), 50); @@ -243,10 +251,8 @@ export class Workbench implements IPartService { return this._onTitleBarVisibilityChange.event; } - public get onEditorLayout(): Event { - return chain(this.editorPart.onLayout) - .map(() => void 0) - .event; + public get onEditorLayout(): Event { + return this.editorPart.onLayout; } /** @@ -271,6 +277,20 @@ export class Workbench implements IPartService { this.inZenMode = InZenModeContext.bindTo(this.contextKeyService); this.sideBarVisibleContext = SidebarVisibleContext.bindTo(this.contextKeyService); + const inputFocused = InputFocusedContext.bindTo(this.contextKeyService); + const onWindowsFocusIn = domEvent(window, 'focusin', true); + onWindowsFocusIn(() => inputFocused.set(document.activeElement && (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA')), null, this.toUnbind); + + // Set workbench state context + const WorkbenchStateContext = new RawContextKey('workbenchState', getWorkbenchStateString(this.configurationService.getWorkbenchState())); + const workbenchStateContext = WorkbenchStateContext.bindTo(this.contextKeyService); + + const WorkspaceFolderCountContext = new RawContextKey('workspaceFolderCount', this.configurationService.getWorkspace().folders.length); + const workspaceFolderCountContext = WorkspaceFolderCountContext.bindTo(this.contextKeyService); + + this.toUnbind.push(this.configurationService.onDidChangeWorkbenchState(() => workbenchStateContext.set(getWorkbenchStateString(this.configurationService.getWorkbenchState())))); + this.toUnbind.push(this.configurationService.onDidChangeWorkspaceFolders(() => workspaceFolderCountContext.set(this.configurationService.getWorkspace().folders.length))); + // Register Listeners this.registerListeners(); @@ -489,8 +509,6 @@ export class Workbench implements IPartService { private initServices(): void { const { serviceCollection } = this.workbenchParams; - this.toDispose.push(this.lifecycleService.onShutdown(this.shutdownComponents, this)); - // Services we contribute serviceCollection.set(IPartService, this); @@ -499,8 +517,7 @@ export class Workbench implements IPartService { // Status bar this.statusbarPart = this.instantiationService.createInstance(StatusbarPart, Identifiers.STATUSBAR_PART); - this.toDispose.push(this.statusbarPart); - this.toShutdown.push(this.statusbarPart); + this.toUnbind.push({ dispose: () => this.statusbarPart.shutdown() }); serviceCollection.set(IStatusbarService, this.statusbarPart); // Progress 2 @@ -524,8 +541,7 @@ export class Workbench implements IPartService { // Sidebar part this.sidebarPart = this.instantiationService.createInstance(SidebarPart, Identifiers.SIDEBAR_PART); - this.toDispose.push(this.sidebarPart); - this.toShutdown.push(this.sidebarPart); + this.toUnbind.push({ dispose: () => this.sidebarPart.shutdown() }); // Viewlet service this.viewletService = this.instantiationService.createInstance(ViewletService, this.sidebarPart); @@ -533,34 +549,30 @@ export class Workbench implements IPartService { // Panel service (panel part) this.panelPart = this.instantiationService.createInstance(PanelPart, Identifiers.PANEL_PART); - this.toDispose.push(this.panelPart); - this.toShutdown.push(this.panelPart); + this.toUnbind.push({ dispose: () => this.panelPart.shutdown() }); serviceCollection.set(IPanelService, this.panelPart); // Activity service (activitybar part) this.activitybarPart = this.instantiationService.createInstance(ActivitybarPart, Identifiers.ACTIVITYBAR_PART); - this.toDispose.push(this.activitybarPart); - this.toShutdown.push(this.activitybarPart); + this.toUnbind.push({ dispose: () => this.activitybarPart.shutdown() }); const activityService = this.instantiationService.createInstance(ActivityService, this.activitybarPart, this.panelPart); serviceCollection.set(IActivityService, activityService); // File Service this.fileService = this.instantiationService.createInstance(RemoteFileService); serviceCollection.set(IFileService, this.fileService); - this.toDispose.push(this.fileService.onFileChanges(e => this.configurationService.handleWorkspaceFileEvents(e))); + this.toUnbind.push(this.fileService.onFileChanges(e => this.configurationService.handleWorkspaceFileEvents(e))); // Editor service (editor part) this.editorPart = this.instantiationService.createInstance(EditorPart, Identifiers.EDITOR_PART, !this.hasFilesToCreateOpenOrDiff); - this.toDispose.push(this.editorPart); - this.toShutdown.push(this.editorPart); + this.toUnbind.push({ dispose: () => this.editorPart.shutdown() }); this.editorService = this.instantiationService.createInstance(WorkbenchEditorService, this.editorPart); serviceCollection.set(IWorkbenchEditorService, this.editorService); serviceCollection.set(IEditorGroupService, this.editorPart); // Title bar this.titlebarPart = this.instantiationService.createInstance(TitlebarPart, Identifiers.TITLEBAR_PART); - this.toDispose.push(this.titlebarPart); - this.toShutdown.push(this.titlebarPart); + this.toUnbind.push({ dispose: () => this.titlebarPart.shutdown() }); serviceCollection.set(ITitleService, this.titlebarPart); // History @@ -597,8 +609,7 @@ export class Workbench implements IPartService { // Quick open service (quick open controller) this.quickOpen = this.instantiationService.createInstance(QuickOpenController); - this.toDispose.push(this.quickOpen); - this.toShutdown.push(this.quickOpen); + this.toUnbind.push({ dispose: () => this.quickOpen.shutdown() }); serviceCollection.set(IQuickOpenService, this.quickOpen); // Contributed services @@ -940,26 +951,7 @@ export class Workbench implements IPartService { document.body.style['-webkit-font-smoothing'] = (aliasing === 'default' ? '' : aliasing); } - public dispose(): void { - if (this.isStarted()) { - this.shutdownComponents(); - this.workbenchShutdown = true; - } - - this.toDispose = dispose(this.toDispose); - } - - /** - * Asks the workbench and all its UI components inside to lay out according to - * the containers dimension the workbench is living in. - */ - public layout(options?: ILayoutOptions): void { - if (this.isStarted()) { - this.workbenchLayout.layout(options); - } - } - - private shutdownComponents(reason = ShutdownReason.QUIT): void { + public dispose(reason = ShutdownReason.QUIT): void { // Restore sidebar if we are being shutdown as a matter of a reload if (reason === ShutdownReason.RELOAD) { @@ -975,14 +967,27 @@ export class Workbench implements IPartService { this.storageService.remove(Workbench.zenModeActiveStorageKey, StorageScope.WORKSPACE); } + // Dispose bindings + this.toUnbind = dispose(this.toUnbind); + // Pass shutdown on to each participant - this.toShutdown.forEach(s => s.shutdown()); + this.workbenchShutdown = true; + } + + /** + * Asks the workbench and all its UI components inside to lay out according to + * the containers dimension the workbench is living in. + */ + public layout(options?: ILayoutOptions): void { + if (this.isStarted()) { + this.workbenchLayout.layout(options); + } } private registerListeners(): void { // Listen to editor changes - this.toDispose.push(this.editorPart.onEditorsChanged(() => this.onEditorsChanged())); + this.toUnbind.push(this.editorPart.onEditorsChanged(() => this.onEditorsChanged())); // Listen to editor closing (if we run with --wait) const filesToWait = this.workbenchParams.configuration.filesToWait; @@ -991,21 +996,21 @@ export class Workbench implements IPartService { const waitMarkerFile = URI.file(filesToWait.waitMarkerFilePath); const listenerDispose = this.editorPart.getStacksModel().onEditorClosed(() => this.onEditorClosed(listenerDispose, resourcesToWaitFor, waitMarkerFile)); - this.toDispose.push(listenerDispose); + this.toUnbind.push(listenerDispose); } // Handle message service and quick open events - this.toDispose.push((this.messageService).onMessagesShowing(() => this.messagesVisibleContext.set(true))); - this.toDispose.push((this.messageService).onMessagesCleared(() => this.messagesVisibleContext.reset())); + this.toUnbind.push((this.messageService).onMessagesShowing(() => this.messagesVisibleContext.set(true))); + this.toUnbind.push((this.messageService).onMessagesCleared(() => this.messagesVisibleContext.reset())); - this.toDispose.push(this.quickOpen.onShow(() => (this.messageService).suspend())); // when quick open is open, don't show messages behind - this.toDispose.push(this.quickOpen.onHide(() => (this.messageService).resume())); // resume messages once quick open is closed again + this.toUnbind.push(this.quickOpen.onShow(() => (this.messageService).suspend())); // when quick open is open, don't show messages behind + this.toUnbind.push(this.quickOpen.onHide(() => (this.messageService).resume())); // resume messages once quick open is closed again // Configuration changes - this.toDispose.push(this.configurationService.onDidChangeConfiguration(() => this.onDidUpdateConfiguration())); + this.toUnbind.push(this.configurationService.onDidChangeConfiguration(() => this.onDidUpdateConfiguration())); // Fullscreen changes - this.toDispose.push(browser.onDidChangeFullscreen(() => this.onFullscreenChanged())); + this.toUnbind.push(browser.onDidChangeFullscreen(() => this.onFullscreenChanged())); } private onFullscreenChanged(): void { @@ -1121,8 +1126,6 @@ export class Workbench implements IPartService { }, this.quickOpen // Quickopen ); - - this.toDispose.push(this.workbenchLayout); } private renderWorkbench(): void { diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index 6bd6c20bcc2b..952ef7e4f968 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -21,9 +21,14 @@ import { IInitData, IEnvironment, IWorkspaceData, MainContext } from 'vs/workben import * as errors from 'vs/base/common/errors'; import * as watchdog from 'native-watchdog'; import * as glob from 'vs/base/common/glob'; +import { ExtensionActivatedByEvent } from 'vs/workbench/api/node/extHostExtensionActivator'; +import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; +import { createLogService } from 'vs/platform/log/node/spdlogService'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { ILogService } from 'vs/platform/log/common/log'; // const nativeExit = process.exit.bind(process); -function patchExit(allowExit: boolean) { +function patchProcess(allowExit: boolean) { process.exit = function (code) { if (allowExit) { exit(code); @@ -32,6 +37,11 @@ function patchExit(allowExit: boolean) { console.warn(err.stack); } }; + + process.crash = function () { + const err = new Error('An extension called process.crash() and this was prevented.'); + console.warn(err.stack); + }; } export function exit(code?: number) { //nativeExit(code); @@ -67,19 +77,28 @@ export class ExtensionHostMain { private _environment: IEnvironment; private _extensionService: ExtHostExtensionService; private _extHostConfiguration: ExtHostConfiguration; + private _logService: ILogService; + private disposables: IDisposable[] = []; constructor(rpcProtocol: RPCProtocol, initData: IInitData) { this._environment = initData.environment; this._workspace = initData.workspace; const allowExit = !!this._environment.extensionTestsPath; // to support other test frameworks like Jasmin that use process.exit (https://github.com/Microsoft/vscode/issues/37708) - patchExit(allowExit); + patchProcess(allowExit); // services const threadService = new ExtHostThreadService(rpcProtocol); const extHostWorkspace = new ExtHostWorkspace(threadService, initData.workspace); + const environmentService = new EnvironmentService(initData.args, initData.execPath); + this._logService = createLogService(`exthost${initData.windowId}`, environmentService); + this.disposables.push(this._logService); + + this._logService.info('extension host started'); + this._logService.trace('initData', initData); + this._extHostConfiguration = new ExtHostConfiguration(threadService.get(MainContext.MainThreadConfiguration), extHostWorkspace, initData.configuration); - this._extensionService = new ExtHostExtensionService(initData, threadService, extHostWorkspace, this._extHostConfiguration); + this._extensionService = new ExtHostExtensionService(initData, threadService, extHostWorkspace, this._extHostConfiguration, this._logService); // error forwarding and stack trace scanning const extensionErrors = new WeakMap(); @@ -100,11 +119,16 @@ export class ExtensionHostMain { return `${error.name || 'Error'}: ${error.message || ''}${stackTraceMessage}`; }; }); + const mainThreadExtensions = threadService.get(MainContext.MainThreadExtensionService); const mainThreadErrors = threadService.get(MainContext.MainThreadErrors); errors.setUnexpectedErrorHandler(err => { const data = errors.transformErrorForSerialization(err); const extension = extensionErrors.get(err); - mainThreadErrors.$onUnexpectedError(data, extension && extension.id); + if (extension) { + mainThreadExtensions.$onExtensionRuntimeError(extension.id, data); + } else { + mainThreadErrors.$onUnexpectedError(data); + } }); // Configure the watchdog to kill our process if the JS event loop is unresponsive for more than 10s @@ -116,7 +140,10 @@ export class ExtensionHostMain { public start(): TPromise { return this._extensionService.onExtensionAPIReady() .then(() => this.handleEagerExtensions()) - .then(() => this.handleExtensionTests()); + .then(() => this.handleExtensionTests()) + .then(() => { + this._logService.info(`eager extensions activated`); + }); } public terminate(): void { @@ -126,6 +153,8 @@ export class ExtensionHostMain { } this._isTerminating = true; + this.disposables = dispose(this.disposables); + errors.setUnexpectedErrorHandler((err) => { // TODO: write to log once we have one }); @@ -208,7 +237,7 @@ export class ExtensionHostMain { if (await pfs.exists(join(uri.fsPath, fileName))) { // the file was found return ( - this._extensionService.activateById(extensionId, true) + this._extensionService.activateById(extensionId, new ExtensionActivatedByEvent(true, `workspaceContains:${fileName}`)) .done(null, err => console.error(err)) ); } @@ -250,7 +279,7 @@ export class ExtensionHostMain { if (result.limitHit) { // a file was found matching one of the glob patterns return ( - this._extensionService.activateById(extensionId, true) + this._extensionService.activateById(extensionId, new ExtensionActivatedByEvent(true, `workspaceContains:${globPatterns.join(',')}`)) .done(null, err => console.error(err)) ); } diff --git a/src/vs/workbench/node/extensionHostProcess.ts b/src/vs/workbench/node/extensionHostProcess.ts index 0e68ea4e1a75..d44ebcc379c3 100644 --- a/src/vs/workbench/node/extensionHostProcess.ts +++ b/src/vs/workbench/node/extensionHostProcess.ts @@ -120,6 +120,8 @@ function connectToRenderer(protocol: IMessagePassingProtocol): TPromise { // connect to main side return connectToRenderer(protocol); @@ -129,3 +131,18 @@ createExtHostProtocol().then(protocol => { onTerminate = () => extensionHostMain.terminate(); return extensionHostMain.start(); }).done(null, err => console.error(err)); + + + +function patchExecArgv() { + // when encountering the prevent-inspect flag we delete this + // and the prior flag + if (process.env.VSCODE_PREVENT_FOREIGN_INSPECT) { + for (let i = 0; i < process.execArgv.length; i++) { + if (process.execArgv[i].match(/--inspect-brk=\d+|--inspect=\d+/)) { + process.execArgv.splice(i, 1); + break; + } + } + } +} diff --git a/src/vs/workbench/parts/backup/common/backupRestorer.ts b/src/vs/workbench/parts/backup/common/backupRestorer.ts index d1b4010f586e..6e1d90e3e7e2 100644 --- a/src/vs/workbench/parts/backup/common/backupRestorer.ts +++ b/src/vs/workbench/parts/backup/common/backupRestorer.ts @@ -93,8 +93,6 @@ export class BackupRestorer implements IWorkbenchContribution { const options = { pinned: true, preserveFocus: true, inactive: index > 0 || hasOpenedEditors }; if (resource.scheme === UNTITLED_SCHEMA && !BackupRestorer.UNTITLED_REGEX.test(resource.fsPath)) { - // TODO@Ben debt: instead of guessing if an untitled file has an associated file path or not - // this information should be provided by the backup service and stored as meta data within return { filePath: resource.fsPath, options }; } diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts b/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts index 4b7695b68b92..b28acd01d565 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts @@ -344,6 +344,7 @@ export class LanguageConfigurationFileHandler { const schemaId = 'vscode://schemas/language-configuration'; const schema: IJSONSchema = { + allowComments: true, default: { comments: { blockComment: ['/*', '*/'], diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts b/src/vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts index f3187ce413d3..6e4df83796c2 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts @@ -7,7 +7,7 @@ import { clipboard } from 'electron'; import * as platform from 'vs/base/common/platform'; -import { ICodeEditor, IEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { Disposable } from 'vs/base/common/lifecycle'; import { EndOfLinePreference, IEditorContribution } from 'vs/editor/common/editorCommon'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; @@ -48,6 +48,10 @@ export class SelectionClipboard extends Disposable implements IEditorContributio editor.setPosition(e.target.position); } + if (e.target.type === MouseTargetType.SCROLLBAR) { + return; + } + process.nextTick(() => { // TODO@Alex: electron weirdness: calling clipboard.readText('selection') generates a paste event, so no need to execute paste ourselves clipboard.readText('selection'); diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index 11a1a6e75d1c..0e71397c23cd 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -531,12 +531,18 @@ export class AddFunctionBreakpointAction extends AbstractDebugAction { constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) { super(id, label, 'debug-action add-function-breakpoint', debugService, keybindingService); + this.toDispose.push(this.debugService.getModel().onDidChangeBreakpoints(() => this.updateEnablement())); } public run(): TPromise { this.debugService.addFunctionBreakpoint(); return TPromise.as(null); } + + protected isEnabled(state: State): boolean { + return !this.debugService.getViewModel().getSelectedFunctionBreakpoint() + && this.debugService.getModel().getFunctionBreakpoints().every(fbp => !!fbp.name); + } } export class AddConditionalBreakpointAction extends AbstractDebugAction { diff --git a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts index 0185c16a1eb8..10db5a16c853 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts @@ -19,7 +19,6 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IDebugConfiguration, IDebugService, State } from 'vs/workbench/parts/debug/common/debug'; import { AbstractDebugAction, PauseAction, ContinueAction, StepBackAction, ReverseContinueAction, StopAction, DisconnectAction, StepOverAction, StepIntoAction, StepOutAction, RestartAction, FocusProcessAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { FocusProcessActionItem } from 'vs/workbench/parts/debug/browser/debugActionItems'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IMessageService } from 'vs/platform/message/common/message'; @@ -28,6 +27,8 @@ import { Themable } from 'vs/workbench/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { registerColor, contrastBorder, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { localize } from 'vs/nls'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; const $ = builder.$; const DEBUG_ACTIONS_WIDGET_POSITION_KEY = 'debug.actionswidgetposition'; @@ -53,11 +54,12 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi @IMessageService private messageService: IMessageService, @ITelemetryService private telemetryService: ITelemetryService, @IDebugService private debugService: IDebugService, - @IInstantiationService private instantiationService: IInstantiationService, @IPartService private partService: IPartService, @IStorageService private storageService: IStorageService, @IConfigurationService private configurationService: IConfigurationService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IKeybindingService private keybindingService: IKeybindingService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { super(themeService); @@ -73,7 +75,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi orientation: ActionsOrientation.HORIZONTAL, actionItemProvider: (action: IAction) => { if (action.id === FocusProcessAction.ID) { - return this.instantiationService.createInstance(FocusProcessActionItem, action); + return new FocusProcessActionItem(action, this.debugService, this.themeService); } return null; @@ -145,12 +147,6 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi private storePosition(): void { const position = parseFloat(this.$el.getComputedStyle().left) / window.innerWidth; this.storageService.store(DEBUG_ACTIONS_WIDGET_POSITION_KEY, position, StorageScope.WORKSPACE); - /* __GDPR__ - "debug.actionswidgetposition" : { - "position" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(DEBUG_ACTIONS_WIDGET_POSITION_KEY, { position }); } protected updateStyles(): void { @@ -231,17 +227,17 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi private getActions(): AbstractDebugAction[] { if (!this.allActions) { this.allActions = []; - this.allActions.push(this.instantiationService.createInstance(ContinueAction, ContinueAction.ID, ContinueAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(PauseAction, PauseAction.ID, PauseAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(StopAction, StopAction.ID, StopAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(DisconnectAction, DisconnectAction.ID, DisconnectAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(StepOverAction, StepOverAction.ID, StepOverAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(StepIntoAction, StepIntoAction.ID, StepIntoAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(StepOutAction, StepOutAction.ID, StepOutAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(RestartAction, RestartAction.ID, RestartAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(StepBackAction, StepBackAction.ID, StepBackAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(ReverseContinueAction, ReverseContinueAction.ID, ReverseContinueAction.LABEL)); - this.allActions.push(this.instantiationService.createInstance(FocusProcessAction, FocusProcessAction.ID, FocusProcessAction.LABEL)); + this.allActions.push(new ContinueAction(ContinueAction.ID, ContinueAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new PauseAction(PauseAction.ID, PauseAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new StopAction(StopAction.ID, StopAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new DisconnectAction(DisconnectAction.ID, DisconnectAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new StepOverAction(StepOverAction.ID, StepOverAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new StepIntoAction(StepIntoAction.ID, StepIntoAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new StepOutAction(StepOutAction.ID, StepOutAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new RestartAction(RestartAction.ID, RestartAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new StepBackAction(StepBackAction.ID, StepBackAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new ReverseContinueAction(ReverseContinueAction.ID, ReverseContinueAction.LABEL, this.debugService, this.keybindingService)); + this.allActions.push(new FocusProcessAction(FocusProcessAction.ID, FocusProcessAction.LABEL, this.debugService, this.keybindingService, this.editorService)); this.allActions.forEach(a => { this.toUnbind.push(a); }); diff --git a/src/vs/workbench/parts/debug/browser/debugViewlet.ts b/src/vs/workbench/parts/debug/browser/debugViewlet.ts index 719caa8aa4d1..6107937695a0 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewlet.ts @@ -25,7 +25,6 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ViewLocation } from 'vs/workbench/browser/parts/views/viewsRegistry'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { Constants } from 'vs/editor/common/core/uint'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; export class DebugViewlet extends PersistentViewsViewlet { @@ -60,7 +59,6 @@ export class DebugViewlet extends PersistentViewsViewlet { const el = parent.getHTMLElement(); DOM.addClass(el, 'debug-viewlet'); - this.updateBreakpointsMaxSize(); } public focus(): void { @@ -117,6 +115,7 @@ export class DebugViewlet extends PersistentViewsViewlet { // attach event listener to if (panel.id === BREAKPOINTS_VIEW_ID) { this.breakpointView = panel; + this.updateBreakpointsMaxSize(); } else { this.panelListeners.set(panel.id, panel.onDidChange(() => this.updateBreakpointsMaxSize())); } @@ -129,8 +128,11 @@ export class DebugViewlet extends PersistentViewsViewlet { } private updateBreakpointsMaxSize(): void { - const allOtherCollapsed = this.views.every(view => !view.isExpanded() || view === this.breakpointView); - this.breakpointView.maximumBodySize = allOtherCollapsed ? Constants.MAX_SAFE_SMALL_INTEGER : this.breakpointView.minimumBodySize; + if (this.breakpointView) { + // We need to update the breakpoints view since all other views are collapsed #25384 + const allOtherCollapsed = this.views.every(view => !view.isExpanded() || view === this.breakpointView); + this.breakpointView.maximumBodySize = allOtherCollapsed ? Number.POSITIVE_INFINITY : this.breakpointView.minimumBodySize; + } } } diff --git a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css index c0f23e9662f9..a6318e82a301 100644 --- a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css +++ b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css @@ -146,6 +146,10 @@ color: #9B46B0; } +.monaco-workbench .monaco-tree-row:not(.selected) .expression .name.virtual { + opacity: 0.5; +} + .monaco-workbench > .monaco-tree-row:not(.selected) .expression .value { color: rgba(108, 108, 108, 0.8); } diff --git a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css index 208bf5a07163..355de7ae222f 100644 --- a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css @@ -110,6 +110,7 @@ } .debug-viewlet .monaco-tree .monaco-tree-row.selected .line-number, +.debug-viewlet .monaco-list .monaco-list-row.selected .line-number, .debug-viewlet .monaco-tree .monaco-tree-row.selected .thread > .state > .label, .debug-viewlet .monaco-tree .monaco-tree-row.selected .process > .state > .label { background-color: #ffffff; @@ -347,6 +348,10 @@ /* Breakpoints */ +.debug-viewlet .debug-breakpoints .monaco-list-row { + padding-left: 20px; +} + .debug-viewlet .debug-breakpoints .breakpoint { display: flex; padding-right: 0.8em; @@ -367,7 +372,6 @@ overflow: hidden; } - .debug-viewlet .debug-action.remove { background: url('remove.svg') center center no-repeat; } diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 9e08b4ff90bc..912b7131c86a 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -36,9 +36,9 @@ export const CONTEXT_NOT_IN_DEBUG_REPL: ContextKeyExpr = CONTEXT_IN_DEBUG_REPL.t export const CONTEXT_ON_FIRST_DEBUG_REPL_LINE = new RawContextKey('onFirsteDebugReplLine', false); export const CONTEXT_ON_LAST_DEBUG_REPL_LINE = new RawContextKey('onLastDebugReplLine', false); export const CONTEXT_BREAKPOINT_WIDGET_VISIBLE = new RawContextKey('breakpointWidgetVisible', false); -export const CONTEXT_BREAKPOINTS_FOCUSED = new RawContextKey('breakpointsFocused', false); -export const CONTEXT_WATCH_EXPRESSIONS_FOCUSED = new RawContextKey('watchExpressionsFocused', false); -export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey('variablesFocused', false); +export const CONTEXT_BREAKPOINTS_FOCUSED = new RawContextKey('breakpointsFocused', true); +export const CONTEXT_WATCH_EXPRESSIONS_FOCUSED = new RawContextKey('watchExpressionsFocused', true); +export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey('variablesFocused', true); export const EDITOR_CONTRIBUTION_ID = 'editor.contrib.debug'; export const DEBUG_SCHEME = 'debug'; @@ -288,7 +288,6 @@ export interface IViewModel extends ITreeElement { onDidFocusProcess: Event; onDidFocusStackFrame: Event<{ stackFrame: IStackFrame, explicit: boolean }>; onDidSelectExpression: Event; - onDidSelectFunctionBreakpoint: Event; } export interface IModel extends ITreeElement { @@ -300,12 +299,21 @@ export interface IModel extends ITreeElement { getWatchExpressions(): IExpression[]; getReplElements(): IReplElement[]; - onDidChangeBreakpoints: Event; + onDidChangeBreakpoints: Event; onDidChangeCallStack: Event; onDidChangeWatchExpressions: Event; onDidChangeReplElements: Event; } +/** + * An event describing a change to the set of [breakpoints](#debug.Breakpoint). + */ +export interface IBreakpointsChangeEvent { + added?: (IBreakpoint | IFunctionBreakpoint)[]; + removed?: (IBreakpoint | IFunctionBreakpoint)[]; + changed?: (IBreakpoint | IFunctionBreakpoint)[]; +} + // Debug enums export enum State { diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 8ca94fe2f2d8..620a46ecbc77 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -20,7 +20,7 @@ import { ISuggestion } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import { ITreeElement, IExpression, IExpressionContainer, IProcess, IStackFrame, IExceptionBreakpoint, IBreakpoint, IFunctionBreakpoint, IModel, IReplElementSource, - IConfig, ISession, IThread, IRawModelUpdate, IScope, IRawStoppedDetails, IEnablement, IRawBreakpoint, IExceptionInfo, IReplElement, ProcessState + IConfig, ISession, IThread, IRawModelUpdate, IScope, IRawStoppedDetails, IEnablement, IRawBreakpoint, IExceptionInfo, IReplElement, ProcessState, IBreakpointsChangeEvent } from 'vs/workbench/parts/debug/common/debug'; import { Source } from 'vs/workbench/parts/debug/common/debugSource'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -159,7 +159,7 @@ export class ExpressionContainer implements IExpressionContainer { for (let i = 0; i < numberOfChunks; i++) { const start = this.startOfVariables + i * chunkSize; const count = Math.min(chunkSize, this.indexedVariables - i * chunkSize); - childrenArray.push(new Variable(this.process, this, this.reference, `[${start}..${start + count - 1}]`, '', '', null, count, null, true, start)); + childrenArray.push(new Variable(this.process, this, this.reference, `[${start}..${start + count - 1}]`, '', '', null, count, { kind: 'virtual' }, null, true, start)); } return childrenArray; @@ -191,9 +191,9 @@ export class ExpressionContainer implements IExpressionContainer { filter }).then(response => { return response && response.body && response.body.variables ? distinct(response.body.variables.filter(v => !!v && v.name), v => v.name).map( - v => new Variable(this.process, this, v.variablesReference, v.name, v.evaluateName, v.value, v.namedVariables, v.indexedVariables, v.type) + v => new Variable(this.process, this, v.variablesReference, v.name, v.evaluateName, v.value, v.namedVariables, v.indexedVariables, v.presentationHint, v.type) ) : []; - }, (e: Error) => [new Variable(this.process, this, 0, null, e.message, '', 0, 0, null, false)]) : TPromise.as([]); + }, (e: Error) => [new Variable(this.process, this, 0, null, e.message, '', 0, 0, { kind: 'virtual' }, null, false)]) : TPromise.as([]); } // The adapter explicitly sents the children count of an expression only if there are lots of children which should be chunked. @@ -278,6 +278,7 @@ export class Variable extends ExpressionContainer implements IExpression { value: string, namedVariables: number, indexedVariables: number, + public presentationHint: DebugProtocol.VariablePresentationHint, public type: string = null, public available = true, startOfVariables = 0 @@ -739,7 +740,7 @@ export class Model implements IModel { private toDispose: lifecycle.IDisposable[]; private replElements: IReplElement[]; private schedulers = new Map(); - private _onDidChangeBreakpoints: Emitter; + private _onDidChangeBreakpoints: Emitter; private _onDidChangeCallStack: Emitter; private _onDidChangeWatchExpressions: Emitter; private _onDidChangeREPLElements: Emitter; @@ -754,7 +755,7 @@ export class Model implements IModel { this.processes = []; this.replElements = []; this.toDispose = []; - this._onDidChangeBreakpoints = new Emitter(); + this._onDidChangeBreakpoints = new Emitter(); this._onDidChangeCallStack = new Emitter(); this._onDidChangeWatchExpressions = new Emitter(); this._onDidChangeREPLElements = new Emitter(); @@ -780,7 +781,7 @@ export class Model implements IModel { this._onDidChangeCallStack.fire(); } - public get onDidChangeBreakpoints(): Event { + public get onDidChangeBreakpoints(): Event { return this._onDidChangeBreakpoints.event; } @@ -851,6 +852,7 @@ export class Model implements IModel { const ebp = this.exceptionBreakpoints.filter(ebp => ebp.filter === d.filter).pop(); return new ExceptionBreakpoint(d.filter, d.label, ebp ? ebp.enabled : d.default); }); + this._onDidChangeBreakpoints.fire(); } } @@ -867,9 +869,10 @@ export class Model implements IModel { const newBreakpoints = rawData.map(rawBp => new Breakpoint(uri, rawBp.lineNumber, rawBp.column, rawBp.enabled, rawBp.condition, rawBp.hitCondition, undefined)); this.breakpoints = this.breakpoints.concat(newBreakpoints); this.breakpointsActivated = true; - this.breakpoints = distinct(this.breakpoints, bp => `${bp.uri.toString()}:${bp.lineNumber}:${bp.column}`); + this.sortAndDeDup(); + if (fireEvent) { - this._onDidChangeBreakpoints.fire(); + this._onDidChangeBreakpoints.fire({ added: newBreakpoints }); } return newBreakpoints; @@ -877,10 +880,11 @@ export class Model implements IModel { public removeBreakpoints(toRemove: IBreakpoint[]): void { this.breakpoints = this.breakpoints.filter(bp => !toRemove.some(toRemove => toRemove.getId() === bp.getId())); - this._onDidChangeBreakpoints.fire(); + this._onDidChangeBreakpoints.fire({ removed: toRemove }); } public updateBreakpoints(data: { [id: string]: DebugProtocol.Breakpoint }): void { + const updated: IBreakpoint[] = []; this.breakpoints.forEach(bp => { const bpData = data[bp.getId()]; if (bpData) { @@ -888,45 +892,82 @@ export class Model implements IModel { bp.endLineNumber = bpData.endLine; bp.column = bpData.column; bp.endColumn = bpData.endColumn; - bp.verified = bpData.verified; + bp.verified = bp.verified || bpData.verified; bp.idFromAdapter = bpData.id; bp.message = bpData.message; bp.adapterData = bpData.source ? bpData.source.adapterData : bp.adapterData; + updated.push(bp); } }); - this.breakpoints = distinct(this.breakpoints, bp => `${bp.uri.toString()}:${bp.lineNumber}:${bp.column}`); + this.sortAndDeDup(); + this._onDidChangeBreakpoints.fire({ changed: updated }); + } - this._onDidChangeBreakpoints.fire(); + private sortAndDeDup(): void { + this.breakpoints = this.breakpoints.sort((first, second) => { + if (first.uri.toString() !== second.uri.toString()) { + return resources.basenameOrAuthority(first.uri).localeCompare(resources.basenameOrAuthority(second.uri)); + } + if (first.lineNumber === second.lineNumber) { + return first.column - second.column; + } + + return first.lineNumber - second.lineNumber; + }); + this.breakpoints = distinct(this.breakpoints, bp => `${bp.uri.toString()}:${bp.lineNumber}:${bp.column}`); } public setEnablement(element: IEnablement, enable: boolean): void { + + const changed: (IBreakpoint | IFunctionBreakpoint)[] = []; + if (element.enabled !== enable && (element instanceof Breakpoint || element instanceof FunctionBreakpoint)) { + changed.push(element); + } + element.enabled = enable; if (element instanceof Breakpoint && !element.enabled) { const breakpoint = element; breakpoint.verified = false; } - this._onDidChangeBreakpoints.fire(); + this._onDidChangeBreakpoints.fire({ changed: changed }); } public enableOrDisableAllBreakpoints(enable: boolean): void { + + const changed: (IBreakpoint | IFunctionBreakpoint)[] = []; + this.breakpoints.forEach(bp => { + if (bp.enabled !== enable) { + changed.push(bp); + } bp.enabled = enable; if (!enable) { bp.verified = false; } }); - this.functionBreakpoints.forEach(fbp => fbp.enabled = enable); + this.functionBreakpoints.forEach(fbp => { + if (fbp.enabled !== enable) { + changed.push(fbp); + } + fbp.enabled = enable; + }); - this._onDidChangeBreakpoints.fire(); + this._onDidChangeBreakpoints.fire({ changed: changed }); } - public addFunctionBreakpoint(functionName: string): void { - this.functionBreakpoints.push(new FunctionBreakpoint(functionName, true, null)); - this._onDidChangeBreakpoints.fire(); + public addFunctionBreakpoint(functionName: string): FunctionBreakpoint { + const newFunctionBreakpoint = new FunctionBreakpoint(functionName, true, null); + this.functionBreakpoints.push(newFunctionBreakpoint); + this._onDidChangeBreakpoints.fire({ added: [newFunctionBreakpoint] }); + + return newFunctionBreakpoint; } public updateFunctionBreakpoints(data: { [id: string]: { name?: string, verified?: boolean; id?: number; hitCondition?: string } }): void { + + const changed: IFunctionBreakpoint[] = []; + this.functionBreakpoints.forEach(fbp => { const fbpData = data[fbp.getId()]; if (fbpData) { @@ -934,15 +975,25 @@ export class Model implements IModel { fbp.verified = fbpData.verified; fbp.idFromAdapter = fbpData.id; fbp.hitCondition = fbpData.hitCondition; + + changed.push(fbp); } }); - this._onDidChangeBreakpoints.fire(); + this._onDidChangeBreakpoints.fire({ changed: changed }); } public removeFunctionBreakpoints(id?: string): void { - this.functionBreakpoints = id ? this.functionBreakpoints.filter(fbp => fbp.getId() !== id) : []; - this._onDidChangeBreakpoints.fire(); + + let removed: IFunctionBreakpoint[]; + if (id) { + removed = this.functionBreakpoints.filter(fbp => fbp.getId() === id); + this.functionBreakpoints = this.functionBreakpoints.filter(fbp => fbp.getId() !== id); + } else { + removed = this.functionBreakpoints; + this.functionBreakpoints = []; + } + this._onDidChangeBreakpoints.fire({ removed: removed }); } public getReplElements(): IReplElement[] { diff --git a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts index 449a78f86148..3713e38afd62 100644 --- a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts +++ b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts @@ -251,8 +251,8 @@ declare module DebugProtocol { cwd: string; /** List of arguments. The first argument is the command to run. */ args: string[]; - /** Environment key-value pairs that are added to the default environment. */ - env?: { [key: string]: string; }; + /** Environment key-value pairs that are added to or removed from the default environment. */ + env?: { [key: string]: string | null; }; } /** Response to Initialize request. */ diff --git a/src/vs/workbench/parts/debug/common/debugViewModel.ts b/src/vs/workbench/parts/debug/common/debugViewModel.ts index 2da97bc70b59..8cf6ba7bc330 100644 --- a/src/vs/workbench/parts/debug/common/debugViewModel.ts +++ b/src/vs/workbench/parts/debug/common/debugViewModel.ts @@ -15,14 +15,12 @@ export class ViewModel implements debug.IViewModel { private _onDidFocusProcess: Emitter; private _onDidFocusStackFrame: Emitter<{ stackFrame: debug.IStackFrame, explicit: boolean }>; private _onDidSelectExpression: Emitter; - private _onDidSelectFunctionBreakpoint: Emitter; private multiProcessView: boolean; constructor() { this._onDidFocusProcess = new Emitter(); this._onDidFocusStackFrame = new Emitter<{ stackFrame: debug.IStackFrame, explicit: boolean }>(); this._onDidSelectExpression = new Emitter(); - this._onDidSelectFunctionBreakpoint = new Emitter(); this.multiProcessView = false; } @@ -78,11 +76,6 @@ export class ViewModel implements debug.IViewModel { public setSelectedFunctionBreakpoint(functionBreakpoint: debug.IFunctionBreakpoint): void { this.selectedFunctionBreakpoint = functionBreakpoint; - this._onDidSelectFunctionBreakpoint.fire(functionBreakpoint); - } - - public get onDidSelectFunctionBreakpoint(): Event { - return this._onDidSelectFunctionBreakpoint.event; } public isMultiProcessView(): boolean { diff --git a/src/vs/workbench/parts/debug/electron-browser/baseDebugView.ts b/src/vs/workbench/parts/debug/electron-browser/baseDebugView.ts new file mode 100644 index 000000000000..1edf13d6ec5f --- /dev/null +++ b/src/vs/workbench/parts/debug/electron-browser/baseDebugView.ts @@ -0,0 +1,248 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { IExpression, IDebugService, IEnablement } from 'vs/workbench/parts/debug/common/debug'; +import { Expression, FunctionBreakpoint, Variable } from 'vs/workbench/parts/debug/common/debugModel'; +import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { ITree, ContextMenuEvent, IActionProvider } from 'vs/base/parts/tree/browser/tree'; +import { InputBox, IInputValidationOptions } from 'vs/base/browser/ui/inputbox/inputBox'; +import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { once } from 'vs/base/common/functional'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; +import { ClickBehavior, DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; +import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { onUnexpectedError } from 'vs/base/common/errors'; + +export const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024; +export const twistiePixels = 20; +const booleanRegex = /^true|false$/i; +const stringRegex = /^(['"]).*\1$/; +const $ = dom.$; + +export interface IRenderValueOptions { + preserveWhitespace?: boolean; + showChanged?: boolean; + maxValueLength?: number; + showHover?: boolean; + colorize?: boolean; +} + +export interface IVariableTemplateData { + expression: HTMLElement; + name: HTMLElement; + value: HTMLElement; +} + +export function renderViewTree(container: HTMLElement): HTMLElement { + const treeContainer = document.createElement('div'); + dom.addClass(treeContainer, 'debug-view-content'); + container.appendChild(treeContainer); + return treeContainer; +} + +function replaceWhitespace(value: string): string { + const map: { [x: string]: string } = { '\n': '\\n', '\r': '\\r', '\t': '\\t' }; + return value.replace(/[\n\r\t]/g, char => map[char]); +} + +export function renderExpressionValue(expressionOrValue: IExpression | string, container: HTMLElement, options: IRenderValueOptions): void { + let value = typeof expressionOrValue === 'string' ? expressionOrValue : expressionOrValue.value; + + // remove stale classes + container.className = 'value'; + // when resolving expressions we represent errors from the server as a variable with name === null. + if (value === null || ((expressionOrValue instanceof Expression || expressionOrValue instanceof Variable) && !expressionOrValue.available)) { + dom.addClass(container, 'unavailable'); + if (value !== Expression.DEFAULT_VALUE) { + dom.addClass(container, 'error'); + } + } + + if (options.colorize && typeof expressionOrValue !== 'string') { + if (expressionOrValue.type === 'number' || expressionOrValue.type === 'boolean' || expressionOrValue.type === 'string') { + dom.addClass(container, expressionOrValue.type); + } else if (!isNaN(+value)) { + dom.addClass(container, 'number'); + } else if (booleanRegex.test(value)) { + dom.addClass(container, 'boolean'); + } else if (stringRegex.test(value)) { + dom.addClass(container, 'string'); + } + } + + if (options.showChanged && (expressionOrValue).valueChanged && value !== Expression.DEFAULT_VALUE) { + // value changed color has priority over other colors. + container.className = 'value changed'; + } + + if (options.maxValueLength && value.length > options.maxValueLength) { + value = value.substr(0, options.maxValueLength) + '...'; + } + if (value && !options.preserveWhitespace) { + container.textContent = replaceWhitespace(value); + } else { + container.textContent = value; + } + if (options.showHover) { + container.title = value; + } +} + +export function renderVariable(tree: ITree, variable: Variable, data: IVariableTemplateData, showChanged: boolean): void { + if (variable.available) { + data.name.textContent = replaceWhitespace(variable.name); + data.name.title = variable.type ? variable.type : variable.name; + dom.toggleClass(data.name, 'virtual', !!variable.presentationHint && variable.presentationHint.kind === 'virtual'); + } + + if (variable.value) { + data.name.textContent += variable.name ? ':' : ''; + renderExpressionValue(variable, data.value, { + showChanged, + maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET, + preserveWhitespace: false, + showHover: true, + colorize: true + }); + } else { + data.value.textContent = ''; + data.value.title = ''; + } +} + +export interface IRenameBoxOptions { + initialValue: string; + ariaLabel: string; + placeholder?: string; + validationOptions?: IInputValidationOptions; +} + +export function renderRenameBox(debugService: IDebugService, contextViewService: IContextViewService, themeService: IThemeService, tree: ITree, element: any, container: HTMLElement, options: IRenameBoxOptions): void { + let inputBoxContainer = dom.append(container, $('.inputBoxContainer')); + let inputBox = new InputBox(inputBoxContainer, contextViewService, { + validationOptions: options.validationOptions, + placeholder: options.placeholder, + ariaLabel: options.ariaLabel + }); + const styler = attachInputBoxStyler(inputBox, themeService); + + tree.setHighlight(); + inputBox.value = options.initialValue ? options.initialValue : ''; + inputBox.focus(); + inputBox.select(); + + let disposed = false; + const toDispose: IDisposable[] = [inputBox, styler]; + + const wrapUp = once((renamed: boolean) => { + if (!disposed) { + disposed = true; + if (element instanceof Expression && renamed && inputBox.value) { + debugService.renameWatchExpression(element.getId(), inputBox.value).done(null, onUnexpectedError); + } else if (element instanceof Expression && !element.name) { + debugService.removeWatchExpressions(element.getId()); + } else if (element instanceof FunctionBreakpoint && inputBox.value) { + debugService.renameFunctionBreakpoint(element.getId(), renamed ? inputBox.value : element.name).done(null, onUnexpectedError); + } else if (element instanceof FunctionBreakpoint && !element.name) { + debugService.removeFunctionBreakpoints(element.getId()).done(null, onUnexpectedError); + } else if (element instanceof Variable) { + element.errorMessage = null; + if (renamed && element.value !== inputBox.value) { + element.setVariable(inputBox.value) + // if everything went fine we need to refresh ui elements since the variable update can change watch and variables view + .done(() => { + tree.refresh(element, false); + debugService.evaluateWatchExpressions(); + }, onUnexpectedError); + } + } + + tree.clearHighlight(); + tree.DOMFocus(); + tree.setFocus(element); + + // need to remove the input box since this template will be reused. + container.removeChild(inputBoxContainer); + dispose(toDispose); + } + }); + + toDispose.push(dom.addStandardDisposableListener(inputBox.inputElement, 'keydown', (e: IKeyboardEvent) => { + const isEscape = e.equals(KeyCode.Escape); + const isEnter = e.equals(KeyCode.Enter); + if (isEscape || isEnter) { + e.preventDefault(); + e.stopPropagation(); + wrapUp(isEnter); + } + })); + toDispose.push(dom.addDisposableListener(inputBox.inputElement, 'blur', () => { + wrapUp(true); + })); +} + +export class BaseDebugController extends DefaultController { + + private contributedContextMenu: IMenu; + + constructor( + private actionProvider: IActionProvider, + menuId: MenuId, + @IDebugService protected debugService: IDebugService, + @IWorkbenchEditorService protected editorService: IWorkbenchEditorService, + @IContextMenuService private contextMenuService: IContextMenuService, + @IContextKeyService contextKeyService: IContextKeyService, + @IMenuService menuService: IMenuService + ) { + super({ clickBehavior: ClickBehavior.ON_MOUSE_UP, keyboardSupport: false }); + + this.contributedContextMenu = menuService.createMenu(menuId, contextKeyService); + } + + public onContextMenu(tree: ITree, element: IEnablement, event: ContextMenuEvent, focusElement = true): boolean { + if (event.target && event.target.tagName && event.target.tagName.toLowerCase() === 'input') { + return false; + } + + event.preventDefault(); + event.stopPropagation(); + + if (focusElement) { + tree.setFocus(element); + } + + if (this.actionProvider.hasSecondaryActions(tree, element)) { + const anchor = { x: event.posx, y: event.posy }; + this.contextMenuService.showContextMenu({ + getAnchor: () => anchor, + getActions: () => this.actionProvider.getSecondaryActions(tree, element).then(actions => { + fillInActions(this.contributedContextMenu, { arg: this.getContext(element) }, actions); + return actions; + }), + onHide: (wasCancelled?: boolean) => { + if (wasCancelled) { + tree.DOMFocus(); + } + }, + getActionsContext: () => element + }); + + return true; + } + + return false; + } + + protected getContext(element: any): any { + return undefined; + } +} diff --git a/src/vs/workbench/parts/debug/electron-browser/breakpointsView.ts b/src/vs/workbench/parts/debug/electron-browser/breakpointsView.ts new file mode 100644 index 000000000000..04d49976b8c3 --- /dev/null +++ b/src/vs/workbench/parts/debug/electron-browser/breakpointsView.ts @@ -0,0 +1,518 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import * as resources from 'vs/base/common/resources'; +import * as dom from 'vs/base/browser/dom'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import { IAction, Action } from 'vs/base/common/actions'; +import { IDebugService, IBreakpoint, CONTEXT_BREAKPOINTS_FOCUSED, EDITOR_CONTRIBUTION_ID, State, DEBUG_SCHEME, IFunctionBreakpoint, IExceptionBreakpoint, IEnablement, IDebugEditorContribution } from 'vs/workbench/parts/debug/common/debug'; +import { ExceptionBreakpoint, FunctionBreakpoint, Breakpoint } from 'vs/workbench/parts/debug/common/debugModel'; +import { AddFunctionBreakpointAction, ToggleBreakpointsActivatedAction, RemoveAllBreakpointsAction, RemoveBreakpointAction, EnableAllBreakpointsAction, DisableAllBreakpointsAction, ReapplyBreakpointsAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { Constants } from 'vs/editor/common/core/uint'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { getPathLabel } from 'vs/base/common/labels'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { basename } from 'vs/base/common/paths'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IDelegate, IListContextMenuEvent, IRenderer } from 'vs/base/browser/ui/list/list'; +import { IEditorService, IEditor } from 'vs/platform/editor/common/editor'; +import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; +import { IKeyboardEvent, StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { WorkbenchList, IListService } from 'vs/platform/list/browser/listService'; +import { ViewsViewletPanel, IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; +import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; + +const $ = dom.$; + +export class BreakpointsView extends ViewsViewletPanel { + + private static readonly MAX_VISIBLE_FILES = 9; + private static readonly MEMENTO = 'breakopintsview.memento'; + private settings: any; + private list: WorkbenchList; + private needsRefresh: boolean; + + constructor( + options: IViewletViewOptions, + @IContextMenuService contextMenuService: IContextMenuService, + @IDebugService private debugService: IDebugService, + @IKeybindingService keybindingService: IKeybindingService, + @IInstantiationService private instantiationService: IInstantiationService, + @IListService private listService: IListService, + @IThemeService private themeService: IThemeService, + @IEditorService private editorService: IEditorService, + @IContextViewService private contextViewService: IContextViewService, + @IContextKeyService private contextKeyService: IContextKeyService + ) { + super(options, keybindingService, contextMenuService); + + this.minimumBodySize = this.maximumBodySize = this.getExpandedBodySize(); + this.settings = options.viewletSettings; + this.disposables.push(this.debugService.getModel().onDidChangeBreakpoints(() => this.onBreakpointsChange())); + } + + public renderBody(container: HTMLElement): void { + dom.addClass(container, 'debug-breakpoints'); + const delegate = new BreakpointsDelegate(this.debugService); + + this.list = new WorkbenchList(container, delegate, [ + this.instantiationService.createInstance(BreakpointsRenderer), + new ExceptionBreakpointsRenderer(this.debugService), + new FunctionBreakpointsRenderer(this.debugService), + new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService) + ], { + identityProvider: element => element.getId(), + multipleSelectionSupport: false + }, this.contextKeyService, this.listService, this.themeService); + + CONTEXT_BREAKPOINTS_FOCUSED.bindTo(this.list.contextKeyService); + + this.list.onContextMenu(this.onListContextMenu, this, this.disposables); + + const handleBreakpointFocus = (preserveFocuse: boolean, sideBySide: boolean, selectFunctionBreakpoint: boolean) => { + const focused = this.list.getFocusedElements(); + const element = focused.length ? focused[0] : undefined; + if (element instanceof Breakpoint) { + openBreakpointSource(element, sideBySide, preserveFocuse, this.debugService, this.editorService).done(undefined, onUnexpectedError); + } + if (selectFunctionBreakpoint && element instanceof FunctionBreakpoint && element !== this.debugService.getViewModel().getSelectedFunctionBreakpoint()) { + this.debugService.getViewModel().setSelectedFunctionBreakpoint(element); + this.onBreakpointsChange(); + } + }; + this.disposables.push(this.list.onKeyUp(e => { + const event = new StandardKeyboardEvent(e); + if (event.equals(KeyCode.Enter)) { + handleBreakpointFocus(false, event && (event.ctrlKey || event.metaKey), false); + } + })); + this.disposables.push(this.list.onMouseDblClick(e => { + handleBreakpointFocus(false, false, true); + })); + this.disposables.push(this.list.onMouseClick(e => { + handleBreakpointFocus(true, false, false); + })); + + this.list.splice(0, this.list.length, this.elements); + } + + protected layoutBody(size: number): void { + if (this.list) { + this.list.layout(size); + } + } + + private onListContextMenu(e: IListContextMenuEvent): void { + const actions: IAction[] = []; + const element = e.element; + + if (element instanceof Breakpoint) { + actions.push(new Action('workbench.action.debug.openEditorAndEditBreakpoint', nls.localize('editConditionalBreakpoint', "Edit Breakpoint..."), undefined, true, () => { + return openBreakpointSource(element, false, false, this.debugService, this.editorService).then(editor => { + const codeEditor = editor.getControl(); + if (isCodeEditor(codeEditor)) { + codeEditor.getContribution(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(element.lineNumber, element.column); + } + }); + })); + actions.push(new Separator()); + } + + actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL, this.debugService, this.keybindingService)); + + + if (this.debugService.getModel().getBreakpoints().length + this.debugService.getModel().getFunctionBreakpoints().length > 1) { + actions.push(new RemoveAllBreakpointsAction(RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new Separator()); + + actions.push(new EnableAllBreakpointsAction(EnableAllBreakpointsAction.ID, EnableAllBreakpointsAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new DisableAllBreakpointsAction(DisableAllBreakpointsAction.ID, DisableAllBreakpointsAction.LABEL, this.debugService, this.keybindingService)); + } + + actions.push(new Separator()); + actions.push(new ReapplyBreakpointsAction(ReapplyBreakpointsAction.ID, ReapplyBreakpointsAction.LABEL, this.debugService, this.keybindingService)); + + this.contextMenuService.showContextMenu({ + getAnchor: () => e.anchor, + getActions: () => TPromise.as(actions), + getActionsContext: () => element + }); + } + + public getActions(): IAction[] { + return [ + new AddFunctionBreakpointAction(AddFunctionBreakpointAction.ID, AddFunctionBreakpointAction.LABEL, this.debugService, this.keybindingService), + new ToggleBreakpointsActivatedAction(ToggleBreakpointsActivatedAction.ID, ToggleBreakpointsActivatedAction.ACTIVATE_LABEL, this.debugService, this.keybindingService), + new RemoveAllBreakpointsAction(RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL, this.debugService, this.keybindingService) + ]; + } + + public setExpanded(expanded: boolean): void { + super.setExpanded(expanded); + if (expanded && this.needsRefresh) { + this.onBreakpointsChange(); + } + } + + public setVisible(visible: boolean): TPromise { + return super.setVisible(visible).then(() => { + if (visible && this.needsRefresh) { + this.onBreakpointsChange(); + } + }); + } + + private onBreakpointsChange(): void { + if (this.isExpanded() && this.isVisible()) { + this.minimumBodySize = this.getExpandedBodySize(); + if (this.maximumBodySize < Number.POSITIVE_INFINITY) { + this.maximumBodySize = this.minimumBodySize; + } + if (this.list) { + this.list.splice(0, this.list.length, this.elements); + this.needsRefresh = false; + } + } else { + this.needsRefresh = true; + } + } + + private get elements(): IEnablement[] { + const model = this.debugService.getModel(); + const elements = (model.getExceptionBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints()); + + return elements; + } + + private getExpandedBodySize(): number { + const model = this.debugService.getModel(); + const length = model.getBreakpoints().length + model.getExceptionBreakpoints().length + model.getFunctionBreakpoints().length; + return Math.min(BreakpointsView.MAX_VISIBLE_FILES, length) * 22; + } + + public shutdown(): void { + this.settings[BreakpointsView.MEMENTO] = !this.isExpanded(); + } +} + +class BreakpointsDelegate implements IDelegate { + + constructor(private debugService: IDebugService) { + // noop + } + + getHeight(element: IEnablement): number { + return 22; + } + + getTemplateId(element: IEnablement): string { + if (element instanceof Breakpoint) { + return BreakpointsRenderer.ID; + } + if (element instanceof FunctionBreakpoint) { + const selected = this.debugService.getViewModel().getSelectedFunctionBreakpoint(); + if (!element.name || (selected && selected.getId() === element.getId())) { + return FunctionBreakpointInputRenderer.ID; + } + + return FunctionBreakpointsRenderer.ID; + } + if (element instanceof ExceptionBreakpoint) { + return ExceptionBreakpointsRenderer.ID; + } + + return undefined; + } +} + +interface IBaseBreakpointTemplateData { + breakpoint: HTMLElement; + name: HTMLElement; + checkbox: HTMLInputElement; + context: IEnablement; + toDispose: IDisposable[]; +} + +interface IBreakpointTemplateData extends IBaseBreakpointTemplateData { + lineNumber: HTMLElement; + filePath: HTMLElement; +} + +interface IInputTemplateData { + inputBox: InputBox; + breakpoint: IFunctionBreakpoint; + reactedOnEvent: boolean; + toDispose: IDisposable[]; +} + +class BreakpointsRenderer implements IRenderer { + + constructor( + @IDebugService private debugService: IDebugService, + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IEnvironmentService private environmentService: IEnvironmentService + ) { + // noop + } + + static ID = 'breakpoints'; + + get templateId() { + return BreakpointsRenderer.ID; + } + + renderTemplate(container: HTMLElement): IBreakpointTemplateData { + const data: IBreakpointTemplateData = Object.create(null); + data.breakpoint = dom.append(container, $('.breakpoint')); + + data.checkbox = $('input'); + data.checkbox.type = 'checkbox'; + data.toDispose = []; + data.toDispose.push(dom.addStandardDisposableListener(data.checkbox, 'change', (e) => { + this.debugService.enableOrDisableBreakpoints(!data.context.enabled, data.context); + })); + + dom.append(data.breakpoint, data.checkbox); + + data.name = dom.append(data.breakpoint, $('span.name')); + + data.filePath = dom.append(data.breakpoint, $('span.file-path')); + const lineNumberContainer = dom.append(data.breakpoint, $('.line-number-container')); + data.lineNumber = dom.append(lineNumberContainer, $('span.line-number')); + + return data; + } + + renderElement(breakpoint: IBreakpoint, index: number, data: IBreakpointTemplateData): void { + data.context = breakpoint; + dom.toggleClass(data.breakpoint, 'disabled', !this.debugService.getModel().areBreakpointsActivated()); + + data.name.textContent = basename(getPathLabel(breakpoint.uri, this.contextService)); + data.lineNumber.textContent = breakpoint.lineNumber.toString(); + if (breakpoint.column) { + data.lineNumber.textContent += `:${breakpoint.column}`; + } + data.filePath.textContent = getPathLabel(resources.dirname(breakpoint.uri), this.contextService, this.environmentService); + data.checkbox.checked = breakpoint.enabled; + + const debugActive = this.debugService.state === State.Running || this.debugService.state === State.Stopped; + if (debugActive && !breakpoint.verified) { + dom.addClass(data.breakpoint, 'disabled'); + if (breakpoint.message) { + data.breakpoint.title = breakpoint.message; + } + } else if (breakpoint.condition || breakpoint.hitCondition) { + data.breakpoint.title = breakpoint.condition ? breakpoint.condition : breakpoint.hitCondition; + } + } + + disposeTemplate(templateData: IBreakpointTemplateData): void { + dispose(templateData.toDispose); + } +} + +class ExceptionBreakpointsRenderer implements IRenderer { + + constructor( + private debugService: IDebugService + ) { + // noop + } + + static ID = 'exceptionbreakpoints'; + + get templateId() { + return ExceptionBreakpointsRenderer.ID; + } + + renderTemplate(container: HTMLElement): IBaseBreakpointTemplateData { + const data: IBreakpointTemplateData = Object.create(null); + data.breakpoint = dom.append(container, $('.breakpoint')); + + data.checkbox = $('input'); + data.checkbox.type = 'checkbox'; + data.toDispose = []; + data.toDispose.push(dom.addStandardDisposableListener(data.checkbox, 'change', (e) => { + this.debugService.enableOrDisableBreakpoints(!data.context.enabled, data.context); + })); + + dom.append(data.breakpoint, data.checkbox); + + data.name = dom.append(data.breakpoint, $('span.name')); + dom.addClass(data.breakpoint, 'exception'); + + return data; + } + + renderElement(exceptionBreakpoint: IExceptionBreakpoint, index: number, data: IBaseBreakpointTemplateData): void { + data.context = exceptionBreakpoint; + data.name.textContent = exceptionBreakpoint.label || `${exceptionBreakpoint.filter} exceptions`; + data.breakpoint.title = data.name.textContent; + data.checkbox.checked = exceptionBreakpoint.enabled; + } + + disposeTemplate(templateData: IBaseBreakpointTemplateData): void { + dispose(templateData.toDispose); + } +} + +class FunctionBreakpointsRenderer implements IRenderer { + + constructor( + private debugService: IDebugService + ) { + // noop + } + + static ID = 'functionbreakpoints'; + + get templateId() { + return FunctionBreakpointsRenderer.ID; + } + + renderTemplate(container: HTMLElement): IBaseBreakpointTemplateData { + const data: IBreakpointTemplateData = Object.create(null); + data.breakpoint = dom.append(container, $('.breakpoint')); + + data.checkbox = $('input'); + data.checkbox.type = 'checkbox'; + data.toDispose = []; + data.toDispose.push(dom.addStandardDisposableListener(data.checkbox, 'change', (e) => { + this.debugService.enableOrDisableBreakpoints(!data.context.enabled, data.context); + })); + + dom.append(data.breakpoint, data.checkbox); + + data.name = dom.append(data.breakpoint, $('span.name')); + + return data; + } + + renderElement(functionBreakpoint: IFunctionBreakpoint, index: number, data: IBaseBreakpointTemplateData): void { + data.context = functionBreakpoint; + data.name.textContent = functionBreakpoint.name; + data.checkbox.checked = functionBreakpoint.enabled; + data.breakpoint.title = functionBreakpoint.name; + + // Mark function breakpoints as disabled if deactivated or if debug type does not support them #9099 + const process = this.debugService.getViewModel().focusedProcess; + dom.toggleClass(data.breakpoint, 'disalbed', (process && !process.session.capabilities.supportsFunctionBreakpoints) || !this.debugService.getModel().areBreakpointsActivated()); + if (process && !process.session.capabilities.supportsFunctionBreakpoints) { + data.breakpoint.title = nls.localize('functionBreakpointsNotSupported', "Function breakpoints are not supported by this debug type"); + } + } + + disposeTemplate(templateData: IBaseBreakpointTemplateData): void { + dispose(templateData.toDispose); + } +} + +class FunctionBreakpointInputRenderer implements IRenderer { + + constructor( + private debugService: IDebugService, + private contextViewService: IContextViewService, + private themeService: IThemeService + ) { + // noop + } + + static ID = 'functionbreakpointinput'; + + get templateId() { + return FunctionBreakpointInputRenderer.ID; + } + + renderTemplate(container: HTMLElement): IInputTemplateData { + const template: IInputTemplateData = Object.create(null); + const inputBoxContainer = dom.append(container, $('.inputBoxContainer')); + const inputBox = new InputBox(inputBoxContainer, this.contextViewService, { + placeholder: nls.localize('functionBreakpointPlaceholder', "Function to break on"), + ariaLabel: nls.localize('functionBreakPointInputAriaLabel', "Type function breakpoint") + }); + const styler = attachInputBoxStyler(inputBox, this.themeService); + const toDispose: IDisposable[] = [inputBox, styler]; + + const wrapUp = (renamed: boolean) => { + if (!template.reactedOnEvent) { + template.reactedOnEvent = true; + this.debugService.getViewModel().setSelectedFunctionBreakpoint(undefined); + if (inputBox.value && (renamed || template.breakpoint.name)) { + this.debugService.renameFunctionBreakpoint(template.breakpoint.getId(), renamed ? inputBox.value : template.breakpoint.name).done(null, onUnexpectedError); + } else { + this.debugService.removeFunctionBreakpoints(template.breakpoint.getId()).done(null, onUnexpectedError); + } + } + }; + + toDispose.push(dom.addStandardDisposableListener(inputBox.inputElement, 'keydown', (e: IKeyboardEvent) => { + const isEscape = e.equals(KeyCode.Escape); + const isEnter = e.equals(KeyCode.Enter); + if (isEscape || isEnter) { + e.preventDefault(); + e.stopPropagation(); + wrapUp(isEnter); + } + })); + toDispose.push(dom.addDisposableListener(inputBox.inputElement, 'blur', () => { + wrapUp(true); + })); + + template.inputBox = inputBox; + template.toDispose = toDispose; + return template; + } + + renderElement(functionBreakpoint: IFunctionBreakpoint, index: number, data: IInputTemplateData): void { + data.breakpoint = functionBreakpoint; + data.reactedOnEvent = false; + data.inputBox.value = functionBreakpoint.name || ''; + data.inputBox.focus(); + data.inputBox.select(); + } + + disposeTemplate(templateData: IInputTemplateData): void { + dispose(templateData.toDispose); + } +} + +function openBreakpointSource(breakpoint: Breakpoint, sideBySide: boolean, preserveFocus: boolean, debugService: IDebugService, editorService: IEditorService): TPromise { + if (breakpoint.uri.scheme === DEBUG_SCHEME && debugService.state === State.Inactive) { + return TPromise.as(null); + } + + const selection = breakpoint.endLineNumber ? { + startLineNumber: breakpoint.lineNumber, + endLineNumber: breakpoint.endLineNumber, + startColumn: breakpoint.column, + endColumn: breakpoint.endColumn + } : { + startLineNumber: breakpoint.lineNumber, + startColumn: breakpoint.column || 1, + endLineNumber: breakpoint.lineNumber, + endColumn: breakpoint.column || Constants.MAX_SAFE_SMALL_INTEGER + }; + + return editorService.openEditor({ + resource: breakpoint.uri, + options: { + preserveFocus, + selection, + revealIfVisible: true, + revealInCenterIfOutsideViewport: true, + pinned: !preserveFocus + } + }, sideBySide); +} diff --git a/src/vs/workbench/parts/debug/electron-browser/callStackView.ts b/src/vs/workbench/parts/debug/electron-browser/callStackView.ts new file mode 100644 index 000000000000..e45bccd9b778 --- /dev/null +++ b/src/vs/workbench/parts/debug/electron-browser/callStackView.ts @@ -0,0 +1,543 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import * as dom from 'vs/base/browser/dom'; +import { TPromise } from 'vs/base/common/winjs.base'; +import * as errors from 'vs/base/common/errors'; +import { TreeViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IDebugService, State, IStackFrame, IProcess, IThread } from 'vs/workbench/parts/debug/common/debug'; +import { Thread, StackFrame, ThreadAndProcessIds, Process, Model } from 'vs/workbench/parts/debug/common/debugModel'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { BaseDebugController, twistiePixels, renderViewTree } from 'vs/workbench/parts/debug/electron-browser/baseDebugView'; +import { ITree, IActionProvider, IDataSource, IRenderer, IAccessibilityProvider } from 'vs/base/parts/tree/browser/tree'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { IAction, IActionItem } from 'vs/base/common/actions'; +import { RestartAction, StopAction, ContinueAction, StepOverAction, StepIntoAction, StepOutAction, PauseAction, RestartFrameAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { CopyStackTraceAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; +import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +import { basenameOrAuthority } from 'vs/base/common/resources'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; + +const $ = dom.$; + +export class CallStackView extends TreeViewsViewletPanel { + + private static readonly MEMENTO = 'callstackview.memento'; + private pauseMessage: HTMLSpanElement; + private pauseMessageLabel: HTMLSpanElement; + private onCallStackChangeScheduler: RunOnceScheduler; + private settings: any; + private needsRefresh: boolean; + + constructor( + private options: IViewletViewOptions, + @IContextMenuService contextMenuService: IContextMenuService, + @IContextKeyService private contextKeyService: IContextKeyService, + @IDebugService private debugService: IDebugService, + @IKeybindingService keybindingService: IKeybindingService, + @IInstantiationService private instantiationService: IInstantiationService, + @IThemeService private themeService: IThemeService, + @IListService private listService: IListService + ) { + super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('callstackSection', "Call Stack Section") }, keybindingService, contextMenuService); + this.settings = options.viewletSettings; + + // Create scheduler to prevent unnecessary flashing of tree when reacting to changes + this.onCallStackChangeScheduler = new RunOnceScheduler(() => { + let newTreeInput: any = this.debugService.getModel(); + const processes = this.debugService.getModel().getProcesses(); + if (!this.debugService.getViewModel().isMultiProcessView() && processes.length) { + const threads = processes[0].getAllThreads(); + // Only show the threads in the call stack if there is more than 1 thread. + newTreeInput = threads.length === 1 ? threads[0] : processes[0]; + } + + // Only show the global pause message if we do not display threads. + // Otherwise there will be a pause message per thread and there is no need for a global one. + if (newTreeInput instanceof Thread && newTreeInput.stoppedDetails) { + this.pauseMessageLabel.textContent = newTreeInput.stoppedDetails.description || nls.localize('debugStopped', "Paused on {0}", newTreeInput.stoppedDetails.reason); + if (newTreeInput.stoppedDetails.text) { + this.pauseMessageLabel.title = newTreeInput.stoppedDetails.text; + } + dom.toggleClass(this.pauseMessageLabel, 'exception', newTreeInput.stoppedDetails.reason === 'exception'); + this.pauseMessage.hidden = false; + } else { + this.pauseMessage.hidden = true; + } + + this.needsRefresh = false; + (this.tree.getInput() === newTreeInput ? this.tree.refresh() : this.tree.setInput(newTreeInput)) + .done(() => this.updateTreeSelection(), errors.onUnexpectedError); + }, 50); + } + + protected renderHeaderTitle(container: HTMLElement): void { + const title = dom.append(container, $('.title.debug-call-stack-title')); + const name = dom.append(title, $('span')); + name.textContent = this.options.name; + this.pauseMessage = dom.append(title, $('span.pause-message')); + this.pauseMessage.hidden = true; + this.pauseMessageLabel = dom.append(this.pauseMessage, $('span.label')); + } + + public renderBody(container: HTMLElement): void { + dom.addClass(container, 'debug-call-stack'); + this.treeContainer = renderViewTree(container); + const actionProvider = new CallStackActionProvider(this.debugService, this.keybindingService); + const controller = this.instantiationService.createInstance(CallStackController, actionProvider, MenuId.DebugCallStackContext); + + this.tree = new WorkbenchTree(this.treeContainer, { + dataSource: new CallStackDataSource(), + renderer: this.instantiationService.createInstance(CallStackRenderer), + accessibilityProvider: this.instantiationService.createInstance(CallstackAccessibilityProvider), + controller + }, { + ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'callStackAriaLabel' }, "Debug Call Stack"), + twistiePixels, + keyboardSupport: false + }, this.contextKeyService, this.listService, this.themeService); + + this.disposables.push(this.tree.onDidChangeSelection(event => { + if (event && event.payload && event.payload.origin === 'keyboard') { + const element = this.tree.getFocus(); + if (element instanceof ThreadAndProcessIds) { + controller.showMoreStackFrames(this.tree, element); + } else if (element instanceof StackFrame) { + controller.focusStackFrame(element, event, false); + } + } + })); + + this.disposables.push(this.debugService.getModel().onDidChangeCallStack(() => { + if (!this.isVisible()) { + this.needsRefresh = true; + return; + } + + if (!this.onCallStackChangeScheduler.isScheduled()) { + this.onCallStackChangeScheduler.schedule(); + } + })); + this.disposables.push(this.debugService.getViewModel().onDidFocusStackFrame(() => + this.updateTreeSelection().done(undefined, errors.onUnexpectedError))); + + // Schedule the update of the call stack tree if the viewlet is opened after a session started #14684 + if (this.debugService.state === State.Stopped) { + this.onCallStackChangeScheduler.schedule(); + } + } + + private updateTreeSelection(): TPromise { + if (!this.tree.getInput()) { + // Tree not initialized yet + return TPromise.as(null); + } + + const stackFrame = this.debugService.getViewModel().focusedStackFrame; + const thread = this.debugService.getViewModel().focusedThread; + const process = this.debugService.getViewModel().focusedProcess; + if (!thread) { + if (!process) { + this.tree.clearSelection(); + return TPromise.as(null); + } + + this.tree.setSelection([process]); + return this.tree.reveal(process); + } + + return this.tree.expandAll([thread.process, thread]).then(() => { + if (!stackFrame) { + return TPromise.as(null); + } + + this.tree.setSelection([stackFrame]); + return this.tree.reveal(stackFrame); + }); + } + + public setVisible(visible: boolean): TPromise { + return super.setVisible(visible).then(() => { + if (visible && this.needsRefresh) { + this.onCallStackChangeScheduler.schedule(); + } + }); + } + + public shutdown(): void { + this.settings[CallStackView.MEMENTO] = !this.isExpanded(); + super.shutdown(); + } +} + +class CallStackController extends BaseDebugController { + + protected onLeftClick(tree: ITree, element: any, event: IMouseEvent): boolean { + if (element instanceof ThreadAndProcessIds) { + return this.showMoreStackFrames(tree, element); + } + if (element instanceof StackFrame) { + super.onLeftClick(tree, element, event); + this.focusStackFrame(element, event, event.detail !== 2); + return true; + } + + return super.onLeftClick(tree, element, event); + } + + protected getContext(element: any): any { + if (element instanceof StackFrame) { + if (element.source.inMemory) { + return element.source.raw.path || element.source.reference; + } + + return element.source.uri.toString(); + } + if (element instanceof Thread) { + return element.threadId; + } + } + + // user clicked / pressed on 'Load More Stack Frames', get those stack frames and refresh the tree. + public showMoreStackFrames(tree: ITree, threadAndProcessIds: ThreadAndProcessIds): boolean { + const process = this.debugService.getModel().getProcesses().filter(p => p.getId() === threadAndProcessIds.processId).pop(); + const thread = process && process.getThread(threadAndProcessIds.threadId); + if (thread) { + (thread).fetchCallStack() + .done(() => tree.refresh(), errors.onUnexpectedError); + } + + return true; + } + + public focusStackFrame(stackFrame: IStackFrame, event: any, preserveFocus: boolean): void { + this.debugService.focusStackFrameAndEvaluate(stackFrame, undefined, true).then(() => { + const sideBySide = (event && (event.ctrlKey || event.metaKey)); + return stackFrame.openInEditor(this.editorService, preserveFocus, sideBySide); + }, errors.onUnexpectedError); + } +} + + +class CallStackActionProvider implements IActionProvider { + + constructor(private debugService: IDebugService, private keybindingService: IKeybindingService) { + // noop + } + + public hasActions(tree: ITree, element: any): boolean { + return false; + } + + public getActions(tree: ITree, element: any): TPromise { + return TPromise.as([]); + } + + public hasSecondaryActions(tree: ITree, element: any): boolean { + return element !== tree.getInput(); + } + + public getSecondaryActions(tree: ITree, element: any): TPromise { + const actions: IAction[] = []; + if (element instanceof Process) { + actions.push(new RestartAction(RestartAction.ID, RestartAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new StopAction(StopAction.ID, StopAction.LABEL, this.debugService, this.keybindingService)); + } else if (element instanceof Thread) { + const thread = element; + if (thread.stopped) { + actions.push(new ContinueAction(ContinueAction.ID, ContinueAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new StepOverAction(StepOverAction.ID, StepOverAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new StepIntoAction(StepIntoAction.ID, StepIntoAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new StepOutAction(StepOutAction.ID, StepOutAction.LABEL, this.debugService, this.keybindingService)); + } else { + actions.push(new PauseAction(PauseAction.ID, PauseAction.LABEL, this.debugService, this.keybindingService)); + } + } else if (element instanceof StackFrame) { + if (element.thread.process.session.capabilities.supportsRestartFrame) { + actions.push(new RestartFrameAction(RestartFrameAction.ID, RestartFrameAction.LABEL, this.debugService, this.keybindingService)); + } + actions.push(new CopyStackTraceAction(CopyStackTraceAction.ID, CopyStackTraceAction.LABEL)); + } + + return TPromise.as(actions); + } + + public getActionItem(tree: ITree, element: any, action: IAction): IActionItem { + return null; + } +} + +class CallStackDataSource implements IDataSource { + + public getId(tree: ITree, element: any): string { + if (typeof element === 'string') { + return element; + } + + return element.getId(); + } + + public hasChildren(tree: ITree, element: any): boolean { + return element instanceof Model || element instanceof Process || (element instanceof Thread && (element).stopped); + } + + public getChildren(tree: ITree, element: any): TPromise { + if (element instanceof Thread) { + return this.getThreadChildren(element); + } + if (element instanceof Model) { + return TPromise.as(element.getProcesses()); + } + + const process = element; + return TPromise.as(process.getAllThreads()); + } + + private getThreadChildren(thread: Thread): TPromise { + let callStack: any[] = thread.getCallStack(); + let callStackPromise: TPromise = TPromise.as(null); + if (!callStack || !callStack.length) { + callStackPromise = thread.fetchCallStack().then(() => callStack = thread.getCallStack()); + } + + return callStackPromise.then(() => { + if (callStack.length === 1 && thread.process.session.capabilities.supportsDelayedStackTraceLoading) { + // To reduce flashing of the call stack view simply append the stale call stack + // once we have the correct data the tree will refresh and we will no longer display it. + callStack = callStack.concat(thread.getStaleCallStack().slice(1)); + } + + if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) { + callStack = callStack.concat([thread.stoppedDetails.framesErrorMessage]); + } + if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length && callStack.length > 1) { + callStack = callStack.concat([new ThreadAndProcessIds(thread.process.getId(), thread.threadId)]); + } + + return callStack; + }); + } + + public getParent(tree: ITree, element: any): TPromise { + return TPromise.as(null); + } +} + +interface IThreadTemplateData { + thread: HTMLElement; + name: HTMLElement; + state: HTMLElement; + stateLabel: HTMLSpanElement; +} + +interface IProcessTemplateData { + process: HTMLElement; + name: HTMLElement; + state: HTMLElement; + stateLabel: HTMLSpanElement; +} + +interface IErrorTemplateData { + label: HTMLElement; +} + +interface ILoadMoreTemplateData { + label: HTMLElement; +} + +interface IStackFrameTemplateData { + stackFrame: HTMLElement; + label: HTMLElement; + file: HTMLElement; + fileName: HTMLElement; + lineNumber: HTMLElement; +} + +class CallStackRenderer implements IRenderer { + + private static readonly THREAD_TEMPLATE_ID = 'thread'; + private static readonly STACK_FRAME_TEMPLATE_ID = 'stackFrame'; + private static readonly ERROR_TEMPLATE_ID = 'error'; + private static readonly LOAD_MORE_TEMPLATE_ID = 'loadMore'; + private static readonly PROCESS_TEMPLATE_ID = 'process'; + + constructor( + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IEnvironmentService private environmentService: IEnvironmentService + ) { + // noop + } + + public getHeight(tree: ITree, element: any): number { + return 22; + } + + public getTemplateId(tree: ITree, element: any): string { + if (element instanceof Process) { + return CallStackRenderer.PROCESS_TEMPLATE_ID; + } + if (element instanceof Thread) { + return CallStackRenderer.THREAD_TEMPLATE_ID; + } + if (element instanceof StackFrame) { + return CallStackRenderer.STACK_FRAME_TEMPLATE_ID; + } + if (typeof element === 'string') { + return CallStackRenderer.ERROR_TEMPLATE_ID; + } + + return CallStackRenderer.LOAD_MORE_TEMPLATE_ID; + } + + public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { + if (templateId === CallStackRenderer.PROCESS_TEMPLATE_ID) { + let data: IProcessTemplateData = Object.create(null); + data.process = dom.append(container, $('.process')); + data.name = dom.append(data.process, $('.name')); + data.state = dom.append(data.process, $('.state')); + data.stateLabel = dom.append(data.state, $('span.label')); + + return data; + } + + if (templateId === CallStackRenderer.LOAD_MORE_TEMPLATE_ID) { + let data: ILoadMoreTemplateData = Object.create(null); + data.label = dom.append(container, $('.load-more')); + + return data; + } + if (templateId === CallStackRenderer.ERROR_TEMPLATE_ID) { + let data: ILoadMoreTemplateData = Object.create(null); + data.label = dom.append(container, $('.error')); + + return data; + } + if (templateId === CallStackRenderer.THREAD_TEMPLATE_ID) { + let data: IThreadTemplateData = Object.create(null); + data.thread = dom.append(container, $('.thread')); + data.name = dom.append(data.thread, $('.name')); + data.state = dom.append(data.thread, $('.state')); + data.stateLabel = dom.append(data.state, $('span.label')); + + return data; + } + + let data: IStackFrameTemplateData = Object.create(null); + data.stackFrame = dom.append(container, $('.stack-frame')); + data.label = dom.append(data.stackFrame, $('span.label.expression')); + data.file = dom.append(data.stackFrame, $('.file')); + data.fileName = dom.append(data.file, $('span.file-name')); + const wrapper = dom.append(data.file, $('span.line-number-wrapper')); + data.lineNumber = dom.append(wrapper, $('span.line-number')); + + return data; + } + + public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { + if (templateId === CallStackRenderer.PROCESS_TEMPLATE_ID) { + this.renderProcess(element, templateData); + } else if (templateId === CallStackRenderer.THREAD_TEMPLATE_ID) { + this.renderThread(element, templateData); + } else if (templateId === CallStackRenderer.STACK_FRAME_TEMPLATE_ID) { + this.renderStackFrame(element, templateData); + } else if (templateId === CallStackRenderer.ERROR_TEMPLATE_ID) { + this.renderError(element, templateData); + } else if (templateId === CallStackRenderer.LOAD_MORE_TEMPLATE_ID) { + this.renderLoadMore(element, templateData); + } + } + + private renderProcess(process: IProcess, data: IProcessTemplateData): void { + data.process.title = nls.localize({ key: 'process', comment: ['Process is a noun'] }, "Process"); + data.name.textContent = process.getName(this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE); + const stoppedThread = process.getAllThreads().filter(t => t.stopped).pop(); + + data.stateLabel.textContent = stoppedThread ? nls.localize('paused', "Paused") + : nls.localize({ key: 'running', comment: ['indicates state'] }, "Running"); + } + + private renderThread(thread: IThread, data: IThreadTemplateData): void { + data.thread.title = nls.localize('thread', "Thread"); + data.name.textContent = thread.name; + + if (thread.stopped) { + data.stateLabel.textContent = thread.stoppedDetails.description || + thread.stoppedDetails.reason ? nls.localize({ key: 'pausedOn', comment: ['indicates reason for program being paused'] }, "Paused on {0}", thread.stoppedDetails.reason) : nls.localize('paused', "Paused"); + } else { + data.stateLabel.textContent = nls.localize({ key: 'running', comment: ['indicates state'] }, "Running"); + } + } + + private renderError(element: string, data: IErrorTemplateData) { + data.label.textContent = element; + data.label.title = element; + } + + private renderLoadMore(element: any, data: ILoadMoreTemplateData): void { + data.label.textContent = nls.localize('loadMoreStackFrames', "Load More Stack Frames"); + } + + private renderStackFrame(stackFrame: IStackFrame, data: IStackFrameTemplateData): void { + dom.toggleClass(data.stackFrame, 'disabled', !stackFrame.source.available || stackFrame.source.presentationHint === 'deemphasize'); + dom.toggleClass(data.stackFrame, 'label', stackFrame.presentationHint === 'label'); + dom.toggleClass(data.stackFrame, 'subtle', stackFrame.presentationHint === 'subtle'); + + data.file.title = stackFrame.source.raw.path || stackFrame.source.name; + if (stackFrame.source.raw.origin) { + data.file.title += `\n${stackFrame.source.raw.origin}`; + } + data.label.textContent = stackFrame.name; + data.label.title = stackFrame.name; + data.fileName.textContent = getSourceName(stackFrame.source, this.contextService, this.environmentService); + if (stackFrame.range.startLineNumber !== undefined) { + data.lineNumber.textContent = `${stackFrame.range.startLineNumber}`; + if (stackFrame.range.startColumn) { + data.lineNumber.textContent += `:${stackFrame.range.startColumn}`; + } + dom.removeClass(data.lineNumber, 'unavailable'); + } else { + dom.addClass(data.lineNumber, 'unavailable'); + } + } + + public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { + // noop + } +} + +class CallstackAccessibilityProvider implements IAccessibilityProvider { + + constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) { + // noop + } + + public getAriaLabel(tree: ITree, element: any): string { + if (element instanceof Thread) { + return nls.localize('threadAriaLabel', "Thread {0}, callstack, debug", (element).name); + } + if (element instanceof StackFrame) { + return nls.localize('stackFrameAriaLabel', "Stack Frame {0} line {1} {2}, callstack, debug", (element).name, (element).range.startLineNumber, getSourceName((element).source, this.contextService)); + } + + return null; + } +} + +function getSourceName(source: Source, contextService: IWorkspaceContextService, environmentService?: IEnvironmentService): string { + if (source.name) { + return source.name; + } + + return basenameOrAuthority(source.uri); +} diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 1b2783ced7ba..b393541ca3fd 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -16,7 +16,10 @@ import { IWorkbenchActionRegistry, Extensions as WorkbenchActionRegistryExtensio import { ToggleViewletAction, Extensions as ViewletExtensions, ViewletRegistry, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { TogglePanelAction, Extensions as PanelExtensions, PanelRegistry, PanelDescriptor } from 'vs/workbench/browser/panel'; import { StatusbarItemDescriptor, StatusbarAlignment, IStatusbarRegistry, Extensions as StatusExtensions } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { VariablesView, WatchExpressionsView, CallStackView, BreakpointsView } from 'vs/workbench/parts/debug/electron-browser/debugViews'; +import { VariablesView } from 'vs/workbench/parts/debug/electron-browser/variablesView'; +import { BreakpointsView } from 'vs/workbench/parts/debug/electron-browser/breakpointsView'; +import { WatchExpressionsView } from 'vs/workbench/parts/debug/electron-browser/watchExpressionsView'; +import { CallStackView } from 'vs/workbench/parts/debug/electron-browser/callStackView'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { IDebugService, VIEWLET_ID, REPL_ID, CONTEXT_NOT_IN_DEBUG_MODE, CONTEXT_IN_DEBUG_MODE, INTERNAL_CONSOLE_OPTIONS_SCHEMA, @@ -190,6 +193,7 @@ configurationRegistry.registerConfiguration({ }, 'debug.showInStatusBar': { enum: ['never', 'always', 'onFirstSessionStart'], + enumDescriptions: [nls.localize('never', "Never show debug in status bar"), nls.localize('always', "Always show debug in status bar"), nls.localize('onFirstSessionStart', "Show debug in status bar only after debug was started for the first time")], description: nls.localize({ comment: ['This is the description for a setting'], key: 'showInStatusBar' }, "Controls when the debug status bar should be visible"), default: 'onFirstSessionStart' }, diff --git a/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts b/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts index d243033621bb..689ba933e35c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts @@ -44,7 +44,7 @@ export function registerCommands(): void { handler: (accessor) => { const listService = accessor.get(IListService); const debugService = accessor.get(IDebugService); - const focused = listService.getFocused(); + const focused = listService.lastFocusedList; // Tree only if (!(focused instanceof List)) { @@ -64,7 +64,7 @@ export function registerCommands(): void { handler: (accessor) => { const listService = accessor.get(IListService); const debugService = accessor.get(IDebugService); - const focused = listService.getFocused(); + const focused = listService.lastFocusedList; // Tree only if (!(focused instanceof List)) { @@ -85,7 +85,7 @@ export function registerCommands(): void { handler: (accessor) => { const listService = accessor.get(IListService); const debugService = accessor.get(IDebugService); - const focused = listService.getFocused(); + const focused = listService.lastFocusedList; // Tree only if (!(focused instanceof List)) { @@ -106,7 +106,7 @@ export function registerCommands(): void { handler: (accessor) => { const listService = accessor.get(IListService); const debugService = accessor.get(IDebugService); - const focused = listService.getFocused(); + const focused = listService.lastFocusedList; // Tree only if (!(focused instanceof List)) { @@ -127,7 +127,7 @@ export function registerCommands(): void { handler: (accessor) => { const listService = accessor.get(IListService); const debugService = accessor.get(IDebugService); - const focused = listService.getFocused(); + const focused = listService.lastFocusedList; // Tree only if (!(focused instanceof List)) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index d259464ea8d2..452bd2314cb5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -223,7 +223,8 @@ export class ConfigurationManager implements IConfigurationManager { @IInstantiationService private instantiationService: IInstantiationService, @ICommandService private commandService: ICommandService, @IStorageService private storageService: IStorageService, - @ILifecycleService lifecycleService: ILifecycleService + @ILifecycleService lifecycleService: ILifecycleService, + @IExtensionService private extensionService: IExtensionService ) { this.providers = []; this.adapters = []; @@ -292,7 +293,7 @@ export class ConfigurationManager implements IConfigurationManager { if (duplicate) { duplicate.merge(rawAdapter, extension.description); } else { - this.adapters.push(this.instantiationService.createInstance(Adapter, rawAdapter, extension.description)); + this.adapters.push(new Adapter(rawAdapter, extension.description, this.configurationService, this.commandService)); } }); }); @@ -379,7 +380,7 @@ export class ConfigurationManager implements IConfigurationManager { public canSetBreakpointsIn(model: IModel): boolean { const modeId = model ? model.getLanguageIdentifier().language : null; - if (!modeId || modeId === 'json') { + if (!modeId || modeId === 'jsonc') { // do not allow breakpoints in our settings files return false; } @@ -395,34 +396,36 @@ export class ConfigurationManager implements IConfigurationManager { } public guessAdapter(type?: string): TPromise { - if (type) { - const adapter = this.getAdapter(type); - return TPromise.as(adapter); - } + return this.extensionService.activateByEvent('onDebugInitialConfigurations').then(() => this.extensionService.activateByEvent('onDebug').then(() => { + if (type) { + const adapter = this.getAdapter(type); + return TPromise.as(adapter); + } - const editor = this.editorService.getActiveEditor(); - if (editor) { - const codeEditor = editor.getControl(); - if (isCodeEditor(codeEditor)) { - const model = codeEditor.getModel(); - const language = model ? model.getLanguageIdentifier().language : undefined; - const adapters = this.adapters.filter(a => a.languages && a.languages.indexOf(language) >= 0); - if (adapters.length === 1) { - return TPromise.as(adapters[0]); + const editor = this.editorService.getActiveEditor(); + if (editor) { + const codeEditor = editor.getControl(); + if (isCodeEditor(codeEditor)) { + const model = codeEditor.getModel(); + const language = model ? model.getLanguageIdentifier().language : undefined; + const adapters = this.adapters.filter(a => a.languages && a.languages.indexOf(language) >= 0); + if (adapters.length === 1) { + return TPromise.as(adapters[0]); + } } } - } - return this.quickOpenService.pick([...this.adapters.filter(a => a.hasInitialConfiguration() || a.hasConfigurationProvider), { label: 'More...', separator: { border: true } }], { placeHolder: nls.localize('selectDebug', "Select Environment") }) - .then(picked => { - if (picked instanceof Adapter) { - return picked; - } - if (picked) { - this.commandService.executeCommand('debug.installAdditionalDebuggers'); - } - return undefined; - }); + return this.quickOpenService.pick([...this.adapters.filter(a => a.hasInitialConfiguration() || a.hasConfigurationProvider), { label: 'More...', separator: { border: true } }], { placeHolder: nls.localize('selectDebug', "Select Environment") }) + .then(picked => { + if (picked instanceof Adapter) { + return picked; + } + if (picked) { + this.commandService.executeCommand('debug.installAdditionalDebuggers'); + } + return undefined; + }); + })); } private store(): void { @@ -445,8 +448,7 @@ class Launch implements ILaunch { @IFileService private fileService: IFileService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IConfigurationService private configurationService: IConfigurationService, - @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService, - @IExtensionService private extensionService: IExtensionService + @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService ) { // noop } @@ -514,59 +516,57 @@ class Launch implements ILaunch { } public openConfigFile(sideBySide: boolean, type?: string): TPromise { - return this.extensionService.activateByEvent('onDebug').then(() => { - const resource = this.uri; - let configFileCreated = false; + const resource = this.uri; + let configFileCreated = false; - return this.fileService.resolveContent(resource).then(content => content, err => { + return this.fileService.resolveContent(resource).then(content => content, err => { - // launch.json not found: create one by collecting launch configs from debugConfigProviders + // launch.json not found: create one by collecting launch configs from debugConfigProviders - return this.configurationManager.guessAdapter(type).then(adapter => { - if (adapter) { - return this.configurationManager.provideDebugConfigurations(this.workspace.uri, adapter.type).then(initialConfigs => { - return adapter.getInitialConfigurationContent(initialConfigs); - }); - } else { - return undefined; - } - }).then(content => { - - if (!content) { - return undefined; - } - - configFileCreated = true; - return this.fileService.updateContent(resource, content).then(() => { - // convert string into IContent; see #32135 - return { value: content }; + return this.configurationManager.guessAdapter(type).then(adapter => { + if (adapter) { + return this.configurationManager.provideDebugConfigurations(this.workspace.uri, adapter.type).then(initialConfigs => { + return adapter.getInitialConfigurationContent(initialConfigs); }); - }); + } else { + return undefined; + } }).then(content => { + if (!content) { return undefined; } - const index = content.value.indexOf(`"${this.configurationManager.selectedName}"`); - let startLineNumber = 1; - for (let i = 0; i < index; i++) { - if (content.value.charAt(i) === '\n') { - startLineNumber++; - } - } - const selection = startLineNumber > 1 ? { startLineNumber, startColumn: 4 } : undefined; - return this.editorService.openEditor({ - resource: resource, - options: { - forceOpen: true, - selection, - pinned: configFileCreated, // pin only if config file is created #8727 - revealIfVisible: true - }, - }, sideBySide); - }, (error) => { - throw new Error(nls.localize('DebugConfig.failed', "Unable to create 'launch.json' file inside the '.vscode' folder ({0}).", error)); + configFileCreated = true; + return this.fileService.updateContent(resource, content).then(() => { + // convert string into IContent; see #32135 + return { value: content }; + }); }); + }).then(content => { + if (!content) { + return undefined; + } + const index = content.value.indexOf(`"${this.configurationManager.selectedName}"`); + let startLineNumber = 1; + for (let i = 0; i < index; i++) { + if (content.value.charAt(i) === '\n') { + startLineNumber++; + } + } + const selection = startLineNumber > 1 ? { startLineNumber, startColumn: 4 } : undefined; + + return this.editorService.openEditor({ + resource: resource, + options: { + forceOpen: true, + selection, + pinned: configFileCreated, // pin only if config file is created #8727 + revealIfVisible: true + }, + }, sideBySide); + }, (error) => { + throw new Error(nls.localize('DebugConfig.failed', "Unable to create 'launch.json' file inside the '.vscode' folder ({0}).", error)); }); } } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index 55f8bd7fe503..f12f16ae6138 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -34,12 +34,13 @@ import { IDebugEditorContribution, IDebugService, State, IBreakpoint, EDITOR_CON import { BreakpointWidget } from 'vs/workbench/parts/debug/browser/breakpointWidget'; import { ExceptionWidget } from 'vs/workbench/parts/debug/browser/exceptionWidget'; import { FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; -import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; import { first } from 'vs/base/common/arrays'; import { IMarginData } from 'vs/editor/browser/controller/mouseTarget'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IListService } from 'vs/platform/list/browser/listService'; const HOVER_DELAY = 300; const LAUNCH_JSON_REGEX = /launch\.json$/; @@ -78,10 +79,11 @@ export class DebugEditorContribution implements IDebugEditorContribution { @ITelemetryService private telemetryService: ITelemetryService, @IListService listService: IListService, @IConfigurationService private configurationService: IConfigurationService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IKeybindingService private keybindingService: IKeybindingService ) { this.breakpointHintDecoration = []; - this.hoverWidget = new DebugHoverWidget(this.editor, this.debugService, listService, this.instantiationService, themeService); + this.hoverWidget = new DebugHoverWidget(this.editor, this.debugService, this.instantiationService, themeService, contextKeyService, listService); this.toDispose = []; this.showHoverScheduler = new RunOnceScheduler(() => this.showHover(this.hoverRange, false), HOVER_DELAY); this.hideHoverScheduler = new RunOnceScheduler(() => this.hoverWidget.hide(), HOVER_DELAY); @@ -96,12 +98,12 @@ export class DebugEditorContribution implements IDebugEditorContribution { private getContextMenuActions(breakpoints: IBreakpoint[], uri: uri, lineNumber: number): TPromise<(IAction | ContextSubMenu)[]> { const actions: (IAction | ContextSubMenu)[] = []; if (breakpoints.length === 1) { - actions.push(this.instantiationService.createInstance(RemoveBreakpointAction, RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL)); - actions.push(this.instantiationService.createInstance(EditConditionalBreakpointAction, EditConditionalBreakpointAction.ID, EditConditionalBreakpointAction.LABEL, this.editor)); + actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new EditConditionalBreakpointAction(EditConditionalBreakpointAction.ID, EditConditionalBreakpointAction.LABEL, this.editor, this.debugService, this.keybindingService)); if (breakpoints[0].enabled) { - actions.push(this.instantiationService.createInstance(DisableBreakpointAction, DisableBreakpointAction.ID, DisableBreakpointAction.LABEL)); + actions.push(new DisableBreakpointAction(DisableBreakpointAction.ID, DisableBreakpointAction.LABEL, this.debugService, this.keybindingService)); } else { - actions.push(this.instantiationService.createInstance(EnableBreakpointAction, EnableBreakpointAction.ID, EnableBreakpointAction.LABEL)); + actions.push(new EnableBreakpointAction(EnableBreakpointAction.ID, EnableBreakpointAction.LABEL, this.debugService, this.keybindingService)); } } else if (breakpoints.length > 1) { const sorted = breakpoints.sort((first, second) => first.column - second.column); @@ -138,7 +140,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { true, () => this.debugService.addBreakpoints(uri, [{ lineNumber }]) )); - actions.push(this.instantiationService.createInstance(AddConditionalBreakpointAction, AddConditionalBreakpointAction.ID, AddConditionalBreakpointAction.LABEL, this.editor, lineNumber)); + actions.push(new AddConditionalBreakpointAction(AddConditionalBreakpointAction.ID, AddConditionalBreakpointAction.LABEL, this.editor, lineNumber, this.debugService, this.keybindingService)); } return TPromise.as(actions); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts index ef9965935198..072347dc3b78 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts @@ -10,7 +10,6 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import * as dom from 'vs/base/browser/dom'; import { ITree } from 'vs/base/parts/tree/browser/tree'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { DefaultController, ICancelableEvent, ClickBehavior } from 'vs/base/parts/tree/browser/treeDefaults'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; @@ -20,12 +19,14 @@ import { IContentWidget, ICodeEditor, IContentWidgetPosition, ContentWidgetPosit import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IDebugService, IExpression, IExpressionContainer } from 'vs/workbench/parts/debug/common/debug'; import { Expression } from 'vs/workbench/parts/debug/common/debugModel'; -import { VariablesRenderer, renderExpressionValue, VariablesDataSource } from 'vs/workbench/parts/debug/electron-browser/debugViewer'; -import { IListService } from 'vs/platform/list/browser/listService'; +import { renderExpressionValue } from 'vs/workbench/parts/debug/electron-browser/baseDebugView'; +import { VariablesDataSource, VariablesRenderer } from 'vs/workbench/parts/debug/electron-browser/variablesView'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; -import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; const $ = dom.$; const MAX_ELEMENTS_SHOWN = 18; @@ -38,7 +39,7 @@ export class DebugHoverWidget implements IContentWidget { private _isVisible: boolean; private domNode: HTMLElement; - private tree: ITree; + private tree: WorkbenchTree; private showAtPosition: Position; private highlightDecorations: string[]; private complexValueContainer: HTMLElement; @@ -52,9 +53,10 @@ export class DebugHoverWidget implements IContentWidget { constructor( private editor: ICodeEditor, private debugService: IDebugService, - private listService: IListService, private instantiationService: IInstantiationService, - private themeService: IThemeService + private themeService: IThemeService, + private contextKeyService: IContextKeyService, + private listService: IListService ) { this.toDispose = []; @@ -69,7 +71,7 @@ export class DebugHoverWidget implements IContentWidget { this.complexValueTitle = dom.append(this.complexValueContainer, $('.title')); this.treeContainer = dom.append(this.complexValueContainer, $('.debug-hover-tree')); this.treeContainer.setAttribute('role', 'tree'); - this.tree = new Tree(this.treeContainer, { + this.tree = new WorkbenchTree(this.treeContainer, { dataSource: new VariablesDataSource(), renderer: this.instantiationService.createInstance(VariablesHoverRenderer), controller: new DebugHoverController(this.editor) @@ -78,7 +80,7 @@ export class DebugHoverWidget implements IContentWidget { twistiePixels: 15, ariaLabel: nls.localize('treeAriaLabel', "Debug Hover"), keyboardSupport: false - }); + }, this.contextKeyService, this.listService, this.themeService); this.valueContainer = $('.value'); this.valueContainer.tabIndex = 0; @@ -89,8 +91,6 @@ export class DebugHoverWidget implements IContentWidget { this.editor.applyFontInfo(this.domNode); - this.toDispose.push(attachListStyler(this.tree, this.themeService)); - this.toDispose.push(this.listService.register(this.tree)); this.toDispose.push(attachStylerCallback(this.themeService, { editorHoverBackground, editorHoverBorder }, colors => { this.domNode.style.backgroundColor = colors.editorHoverBackground; if (colors.editorHoverBorder) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 52b53e0ee779..59f9d612c4d9 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -595,7 +595,8 @@ export class DebugService implements debug.IDebugService { } public addFunctionBreakpoint(): void { - this.model.addFunctionBreakpoint(''); + const newFunctionBreakpoint = this.model.addFunctionBreakpoint(''); + this.viewModel.setSelectedFunctionBreakpoint(newFunctionBreakpoint); } public renameFunctionBreakpoint(id: string, newFunctionName: string): TPromise { @@ -609,10 +610,6 @@ export class DebugService implements debug.IDebugService { } public addReplExpression(name: string): TPromise { - /* __GDPR__ - "debugService/addReplExpression" : {} - */ - this.telemetryService.publicLog('debugService/addReplExpression'); return this.model.addReplExpression(this.viewModel.focusedProcess, this.viewModel.focusedStackFrame, name) // Evaluate all watch expressions and fetch variables again since repl evaluation might have changed some. .then(() => this.focusStackFrameAndEvaluate(this.viewModel.focusedStackFrame, this.viewModel.focusedProcess)); @@ -659,6 +656,7 @@ export class DebugService implements debug.IDebugService { if (this.model.getProcesses().length === 0) { this.removeReplExpressions(); this.allProcesses.clear(); + this.model.getBreakpoints().forEach(bp => bp.verified = false); } this.launchJsonChanged = false; const manager = this.getConfigurationManager(); @@ -688,7 +686,9 @@ export class DebugService implements debug.IDebugService { return TPromise.join(compound.configurations.map(name => name !== compound.name ? this.startDebugging(root, name, noDebug, topCompoundName || compound.name) : TPromise.as(null))); } if (configOrName && !config) { - return TPromise.wrapError(new Error(nls.localize('configMissing', "Configuration '{0}' is missing in 'launch.json'.", configOrName))); + const message = !!launch ? nls.localize('configMissing', "Configuration '{0}' is missing in 'launch.json'.", configOrName) : + nls.localize('launchJsonDoesNotExist', "'launch.json' does not exist."); + return TPromise.wrapError(new Error(message)); } // We keep the debug type in a separate variable 'type' so that a no-folder config has no attributes. @@ -713,21 +713,22 @@ export class DebugService implements debug.IDebugService { }; return (type ? TPromise.as(null) : this.configurationManager.guessAdapter().then(a => type = a && a.type)).then(() => - this.configurationManager.resolveConfigurationByProviders(launch ? launch.workspace.uri : undefined, type, config).then(config => { - // a falsy config indicates an aborted launch - if (config && config.type) { - return this.createProcess(root, config, sessionId); - } - if (launch) { - return launch.openConfigFile(false, type).then(editor => undefined); - } + (type ? this.extensionService.activateByEvent(`onDebugResolve:${type}`) : TPromise.as(null)).then(() => + this.configurationManager.resolveConfigurationByProviders(launch ? launch.workspace.uri : undefined, type, config).then(config => { + // a falsy config indicates an aborted launch + if (config && config.type) { + return this.createProcess(root, config, sessionId); + } + if (launch) { + return launch.openConfigFile(false, type).then(editor => undefined); + } - return undefined; - }) - ).then(() => wrapUpState(), err => { - wrapUpState(); - return TPromise.wrapError(err); - }); + return undefined; + }) + ).then(() => wrapUpState(), err => { + wrapUpState(); + return TPromise.wrapError(err); + })); }) ))); } @@ -1011,43 +1012,45 @@ export class DebugService implements debug.IDebugService { } public restartProcess(process: debug.IProcess, restartData?: any): TPromise { - if (process.session.capabilities.supportsRestartRequest) { - return this.textFileService.saveAll().then(() => process.session.custom('restart', null)); - } - const focusedProcess = this.viewModel.focusedProcess; - const preserveFocus = focusedProcess && process.getId() === focusedProcess.getId(); - - return process.session.disconnect(true).then(() => { - if (strings.equalsIgnoreCase(process.configuration.type, 'extensionHost')) { - return this.broadcastService.broadcast({ - channel: EXTENSION_RELOAD_BROADCAST_CHANNEL, - payload: [process.session.root.uri.fsPath] - }); + return this.textFileService.saveAll().then(() => { + if (process.session.capabilities.supportsRestartRequest) { + return process.session.custom('restart', null); } + const focusedProcess = this.viewModel.focusedProcess; + const preserveFocus = focusedProcess && process.getId() === focusedProcess.getId(); - return new TPromise((c, e) => { - setTimeout(() => { - // Read the configuration again if a launch.json has been changed, if not just use the inmemory configuration - let config = process.configuration; - if (this.launchJsonChanged && this.configurationManager.selectedLaunch) { - this.launchJsonChanged = false; - config = this.configurationManager.selectedLaunch.getConfiguration(process.configuration.name) || config; - // Take the type from the process since the debug extension might overwrite it #21316 - config.type = process.configuration.type; - config.noDebug = process.configuration.noDebug; - } - config.__restart = restartData; - this.createProcess(process.session.root, config, process.getId()).then(() => c(null), err => e(err)); - }, 300); - }); - }).then(() => { - if (preserveFocus) { - // Restart should preserve the focused process - const restartedProcess = this.model.getProcesses().filter(p => p.configuration.name === process.configuration.name).pop(); - if (restartedProcess && restartedProcess !== this.viewModel.focusedProcess) { - this.focusStackFrameAndEvaluate(null, restartedProcess); + return process.session.disconnect(true).then(() => { + if (strings.equalsIgnoreCase(process.configuration.type, 'extensionHost')) { + return this.broadcastService.broadcast({ + channel: EXTENSION_RELOAD_BROADCAST_CHANNEL, + payload: [process.session.root.uri.fsPath] + }); } - } + + return new TPromise((c, e) => { + setTimeout(() => { + // Read the configuration again if a launch.json has been changed, if not just use the inmemory configuration + let config = process.configuration; + if (this.launchJsonChanged && this.configurationManager.selectedLaunch) { + this.launchJsonChanged = false; + config = this.configurationManager.selectedLaunch.getConfiguration(process.configuration.name) || config; + // Take the type from the process since the debug extension might overwrite it #21316 + config.type = process.configuration.type; + config.noDebug = process.configuration.noDebug; + } + config.__restart = restartData; + this.createProcess(process.session.root, config, process.getId()).then(() => c(null), err => e(err)); + }, 300); + }); + }).then(() => { + if (preserveFocus) { + // Restart should preserve the focused process + const restartedProcess = this.model.getProcesses().filter(p => p.configuration.name === process.configuration.name).pop(); + if (restartedProcess && restartedProcess !== this.viewModel.focusedProcess) { + this.focusStackFrameAndEvaluate(null, restartedProcess); + } + } + }); }); } @@ -1238,8 +1241,11 @@ export class DebugService implements debug.IDebugService { } private onFileChanges(fileChangesEvent: FileChangesEvent): void { - this.model.removeBreakpoints(this.model.getBreakpoints().filter(bp => - fileChangesEvent.contains(bp.uri, FileChangeType.DELETED))); + const toRemove = this.model.getBreakpoints().filter(bp => + fileChangesEvent.contains(bp.uri, FileChangeType.DELETED)); + if (toRemove.length) { + this.model.removeBreakpoints(toRemove); + } fileChangesEvent.getUpdated().forEach(event => { if (this.breakpointsToSendOnResourceSaved.has(event.resource.toString())) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts deleted file mode 100644 index 4f7156c1cbc0..000000000000 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ /dev/null @@ -1,1323 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; -import { TPromise } from 'vs/base/common/winjs.base'; -import * as lifecycle from 'vs/base/common/lifecycle'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import * as paths from 'vs/base/common/paths'; -import * as resources from 'vs/base/common/resources'; -import * as errors from 'vs/base/common/errors'; -import { equalsIgnoreCase } from 'vs/base/common/strings'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import * as dom from 'vs/base/browser/dom'; -import { IMouseEvent, DragMouseEvent } from 'vs/base/browser/mouseEvent'; -import { getPathLabel } from 'vs/base/common/labels'; -import { IAction } from 'vs/base/common/actions'; -import { IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ITree, IAccessibilityProvider, ContextMenuEvent, IDataSource, IRenderer, DRAG_OVER_REJECT, IDragAndDropData, IDragOverReaction, IActionProvider } from 'vs/base/parts/tree/browser/tree'; -import { InputBox, IInputValidationOptions } from 'vs/base/browser/ui/inputbox/inputBox'; -import { DefaultController, DefaultDragAndDrop, ClickBehavior } from 'vs/base/parts/tree/browser/treeDefaults'; -import { Constants } from 'vs/editor/common/core/uint'; -import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IMenuService, IMenu, MenuId } from 'vs/platform/actions/common/actions'; -import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import * as debug from 'vs/workbench/parts/debug/common/debug'; -import { Expression, Variable, FunctionBreakpoint, StackFrame, Thread, Process, Breakpoint, ExceptionBreakpoint, Model, Scope, ThreadAndProcessIds } from 'vs/workbench/parts/debug/common/debugModel'; -import { ViewModel } from 'vs/workbench/parts/debug/common/debugViewModel'; -import { ContinueAction, StepOverAction, PauseAction, ReapplyBreakpointsAction, DisableAllBreakpointsAction, RemoveBreakpointAction, RemoveWatchExpressionAction, AddWatchExpressionAction, EditWatchExpressionAction, RemoveAllBreakpointsAction, EnableAllBreakpointsAction, StepOutAction, StepIntoAction, SetValueAction, RemoveAllWatchExpressionsAction, RestartFrameAction, AddToWatchExpressionsAction, StopAction, RestartAction } from 'vs/workbench/parts/debug/browser/debugActions'; -import { CopyValueAction, CopyStackTraceAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; -import { once } from 'vs/base/common/functional'; -import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; - -const $ = dom.$; -const booleanRegex = /^true|false$/i; -const stringRegex = /^(['"]).*\1$/; -const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024; - -export interface IRenderValueOptions { - preserveWhitespace?: boolean; - showChanged?: boolean; - maxValueLength?: number; - showHover?: boolean; - colorize?: boolean; -} - -function replaceWhitespace(value: string): string { - const map: { [x: string]: string } = { '\n': '\\n', '\r': '\\r', '\t': '\\t' }; - return value.replace(/[\n\r\t]/g, char => map[char]); -} - -export function renderExpressionValue(expressionOrValue: debug.IExpression | string, container: HTMLElement, options: IRenderValueOptions): void { - let value = typeof expressionOrValue === 'string' ? expressionOrValue : expressionOrValue.value; - - // remove stale classes - container.className = 'value'; - // when resolving expressions we represent errors from the server as a variable with name === null. - if (value === null || ((expressionOrValue instanceof Expression || expressionOrValue instanceof Variable) && !expressionOrValue.available)) { - dom.addClass(container, 'unavailable'); - if (value !== Expression.DEFAULT_VALUE) { - dom.addClass(container, 'error'); - } - } - - if (options.colorize && typeof expressionOrValue !== 'string') { - if (expressionOrValue.type === 'number' || expressionOrValue.type === 'boolean' || expressionOrValue.type === 'string') { - dom.addClass(container, expressionOrValue.type); - } else if (!isNaN(+value)) { - dom.addClass(container, 'number'); - } else if (booleanRegex.test(value)) { - dom.addClass(container, 'boolean'); - } else if (stringRegex.test(value)) { - dom.addClass(container, 'string'); - } - } - - if (options.showChanged && (expressionOrValue).valueChanged && value !== Expression.DEFAULT_VALUE) { - // value changed color has priority over other colors. - container.className = 'value changed'; - } - - if (options.maxValueLength && value.length > options.maxValueLength) { - value = value.substr(0, options.maxValueLength) + '...'; - } - if (value && !options.preserveWhitespace) { - container.textContent = replaceWhitespace(value); - } else { - container.textContent = value; - } - if (options.showHover) { - container.title = value; - } -} - -export function renderVariable(tree: ITree, variable: Variable, data: IVariableTemplateData, showChanged: boolean): void { - if (variable.available) { - data.name.textContent = replaceWhitespace(variable.name); - data.name.title = variable.type ? variable.type : variable.name; - } - - if (variable.value) { - data.name.textContent += variable.name ? ':' : ''; - renderExpressionValue(variable, data.value, { - showChanged, - maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET, - preserveWhitespace: false, - showHover: true, - colorize: true - }); - } else { - data.value.textContent = ''; - data.value.title = ''; - } -} - -interface IRenameBoxOptions { - initialValue: string; - ariaLabel: string; - placeholder?: string; - validationOptions?: IInputValidationOptions; -} - -function renderRenameBox(debugService: debug.IDebugService, contextViewService: IContextViewService, themeService: IThemeService, tree: ITree, element: any, container: HTMLElement, options: IRenameBoxOptions): void { - let inputBoxContainer = dom.append(container, $('.inputBoxContainer')); - let inputBox = new InputBox(inputBoxContainer, contextViewService, { - validationOptions: options.validationOptions, - placeholder: options.placeholder, - ariaLabel: options.ariaLabel - }); - const styler = attachInputBoxStyler(inputBox, themeService); - - tree.setHighlight(); - inputBox.value = options.initialValue ? options.initialValue : ''; - inputBox.focus(); - inputBox.select(); - - let disposed = false; - const toDispose: lifecycle.IDisposable[] = [inputBox, styler]; - - const wrapUp = once((renamed: boolean) => { - if (!disposed) { - disposed = true; - if (element instanceof Expression && renamed && inputBox.value) { - debugService.renameWatchExpression(element.getId(), inputBox.value).done(null, errors.onUnexpectedError); - } else if (element instanceof Expression && !element.name) { - debugService.removeWatchExpressions(element.getId()); - } else if (element instanceof FunctionBreakpoint && inputBox.value) { - debugService.renameFunctionBreakpoint(element.getId(), renamed ? inputBox.value : element.name).done(null, errors.onUnexpectedError); - } else if (element instanceof FunctionBreakpoint && !element.name) { - debugService.removeFunctionBreakpoints(element.getId()).done(null, errors.onUnexpectedError); - } else if (element instanceof Variable) { - element.errorMessage = null; - if (renamed && element.value !== inputBox.value) { - element.setVariable(inputBox.value) - // if everything went fine we need to refresh ui elements since the variable update can change watch and variables view - .done(() => { - tree.refresh(element, false); - debugService.evaluateWatchExpressions(); - }, errors.onUnexpectedError); - } - } - - tree.clearHighlight(); - tree.DOMFocus(); - tree.setFocus(element); - - // need to remove the input box since this template will be reused. - container.removeChild(inputBoxContainer); - lifecycle.dispose(toDispose); - } - }); - - toDispose.push(dom.addStandardDisposableListener(inputBox.inputElement, 'keydown', (e: IKeyboardEvent) => { - const isEscape = e.equals(KeyCode.Escape); - const isEnter = e.equals(KeyCode.Enter); - if (isEscape || isEnter) { - e.preventDefault(); - e.stopPropagation(); - wrapUp(isEnter); - } - })); - toDispose.push(dom.addDisposableListener(inputBox.inputElement, 'blur', () => { - wrapUp(true); - })); -} - -function getSourceName(source: Source, contextService: IWorkspaceContextService, environmentService?: IEnvironmentService): string { - if (source.name) { - return source.name; - } - - return resources.basenameOrAuthority(source.uri); -} - -export class BaseDebugController extends DefaultController { - - private contributedContextMenu: IMenu; - - constructor( - private actionProvider: IActionProvider, - menuId: MenuId, - @debug.IDebugService protected debugService: debug.IDebugService, - @IWorkbenchEditorService protected editorService: IWorkbenchEditorService, - @IContextMenuService private contextMenuService: IContextMenuService, - @IContextKeyService contextKeyService: IContextKeyService, - @IMenuService menuService: IMenuService - ) { - super({ clickBehavior: ClickBehavior.ON_MOUSE_UP, keyboardSupport: false }); - - this.contributedContextMenu = menuService.createMenu(menuId, contextKeyService); - } - - public onContextMenu(tree: ITree, element: debug.IEnablement, event: ContextMenuEvent, focusElement = true): boolean { - if (event.target && event.target.tagName && event.target.tagName.toLowerCase() === 'input') { - return false; - } - - event.preventDefault(); - event.stopPropagation(); - - if (focusElement) { - tree.setFocus(element); - } - - if (this.actionProvider.hasSecondaryActions(tree, element)) { - const anchor = { x: event.posx, y: event.posy }; - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - getActions: () => this.actionProvider.getSecondaryActions(tree, element).then(actions => { - fillInActions(this.contributedContextMenu, { arg: this.getContext(element) }, actions); - return actions; - }), - onHide: (wasCancelled?: boolean) => { - if (wasCancelled) { - tree.DOMFocus(); - } - }, - getActionsContext: () => element - }); - - return true; - } - - return false; - } - - protected getContext(element: any): any { - return undefined; - } -} - -// call stack - -export class CallStackController extends BaseDebugController { - - protected onLeftClick(tree: ITree, element: any, event: IMouseEvent): boolean { - if (element instanceof ThreadAndProcessIds) { - return this.showMoreStackFrames(tree, element); - } - if (element instanceof StackFrame) { - super.onLeftClick(tree, element, event); - this.focusStackFrame(element, event, event.detail !== 2); - return true; - } - - return super.onLeftClick(tree, element, event); - } - - protected getContext(element: any): any { - if (element instanceof StackFrame) { - if (element.source.inMemory) { - return element.source.raw.path || element.source.reference; - } - - return element.source.uri.toString(); - } - if (element instanceof Thread) { - return element.threadId; - } - } - - // user clicked / pressed on 'Load More Stack Frames', get those stack frames and refresh the tree. - public showMoreStackFrames(tree: ITree, threadAndProcessIds: ThreadAndProcessIds): boolean { - const process = this.debugService.getModel().getProcesses().filter(p => p.getId() === threadAndProcessIds.processId).pop(); - const thread = process && process.getThread(threadAndProcessIds.threadId); - if (thread) { - (thread).fetchCallStack() - .done(() => tree.refresh(), errors.onUnexpectedError); - } - - return true; - } - - public focusStackFrame(stackFrame: debug.IStackFrame, event: any, preserveFocus: boolean): void { - this.debugService.focusStackFrameAndEvaluate(stackFrame, undefined, true).then(() => { - const sideBySide = (event && (event.ctrlKey || event.metaKey)); - return stackFrame.openInEditor(this.editorService, preserveFocus, sideBySide); - }, errors.onUnexpectedError); - } -} - - -export class CallStackActionProvider implements IActionProvider { - - constructor( @IInstantiationService private instantiationService: IInstantiationService) { - // noop - } - - public hasActions(tree: ITree, element: any): boolean { - return false; - } - - public getActions(tree: ITree, element: any): TPromise { - return TPromise.as([]); - } - - public hasSecondaryActions(tree: ITree, element: any): boolean { - return element !== tree.getInput(); - } - - public getSecondaryActions(tree: ITree, element: any): TPromise { - const actions: IAction[] = []; - if (element instanceof Process) { - actions.push(this.instantiationService.createInstance(RestartAction, RestartAction.ID, RestartAction.LABEL)); - actions.push(this.instantiationService.createInstance(StopAction, StopAction.ID, StopAction.LABEL)); - } else if (element instanceof Thread) { - const thread = element; - if (thread.stopped) { - actions.push(this.instantiationService.createInstance(ContinueAction, ContinueAction.ID, ContinueAction.LABEL)); - actions.push(this.instantiationService.createInstance(StepOverAction, StepOverAction.ID, StepOverAction.LABEL)); - actions.push(this.instantiationService.createInstance(StepIntoAction, StepIntoAction.ID, StepIntoAction.LABEL)); - actions.push(this.instantiationService.createInstance(StepOutAction, StepOutAction.ID, StepOutAction.LABEL)); - } else { - actions.push(this.instantiationService.createInstance(PauseAction, PauseAction.ID, PauseAction.LABEL)); - } - } else if (element instanceof StackFrame) { - if (element.thread.process.session.capabilities.supportsRestartFrame) { - actions.push(this.instantiationService.createInstance(RestartFrameAction, RestartFrameAction.ID, RestartFrameAction.LABEL)); - } - actions.push(new CopyStackTraceAction(CopyStackTraceAction.ID, CopyStackTraceAction.LABEL)); - } - - return TPromise.as(actions); - } - - public getActionItem(tree: ITree, element: any, action: IAction): IActionItem { - return null; - } -} - -export class CallStackDataSource implements IDataSource { - - public getId(tree: ITree, element: any): string { - if (typeof element === 'string') { - return element; - } - - return element.getId(); - } - - public hasChildren(tree: ITree, element: any): boolean { - return element instanceof Model || element instanceof Process || (element instanceof Thread && (element).stopped); - } - - public getChildren(tree: ITree, element: any): TPromise { - if (element instanceof Thread) { - return this.getThreadChildren(element); - } - if (element instanceof Model) { - return TPromise.as(element.getProcesses()); - } - - const process = element; - return TPromise.as(process.getAllThreads()); - } - - private getThreadChildren(thread: Thread): TPromise { - let callStack: any[] = thread.getCallStack(); - let callStackPromise: TPromise = TPromise.as(null); - if (!callStack || !callStack.length) { - callStackPromise = thread.fetchCallStack().then(() => callStack = thread.getCallStack()); - } - - return callStackPromise.then(() => { - if (callStack.length === 1 && thread.process.session.capabilities.supportsDelayedStackTraceLoading) { - // To reduce flashing of the call stack view simply append the stale call stack - // once we have the correct data the tree will refresh and we will no longer display it. - callStack = callStack.concat(thread.getStaleCallStack().slice(1)); - } - - if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) { - callStack = callStack.concat([thread.stoppedDetails.framesErrorMessage]); - } - if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length && callStack.length > 1) { - callStack = callStack.concat([new ThreadAndProcessIds(thread.process.getId(), thread.threadId)]); - } - - return callStack; - }); - } - - public getParent(tree: ITree, element: any): TPromise { - return TPromise.as(null); - } -} - -interface IThreadTemplateData { - thread: HTMLElement; - name: HTMLElement; - state: HTMLElement; - stateLabel: HTMLSpanElement; -} - -interface IProcessTemplateData { - process: HTMLElement; - name: HTMLElement; - state: HTMLElement; - stateLabel: HTMLSpanElement; -} - -interface IErrorTemplateData { - label: HTMLElement; -} - -interface ILoadMoreTemplateData { - label: HTMLElement; -} - -interface IStackFrameTemplateData { - stackFrame: HTMLElement; - label: HTMLElement; - file: HTMLElement; - fileName: HTMLElement; - lineNumber: HTMLElement; -} - -export class CallStackRenderer implements IRenderer { - - private static readonly THREAD_TEMPLATE_ID = 'thread'; - private static readonly STACK_FRAME_TEMPLATE_ID = 'stackFrame'; - private static readonly ERROR_TEMPLATE_ID = 'error'; - private static readonly LOAD_MORE_TEMPLATE_ID = 'loadMore'; - private static readonly PROCESS_TEMPLATE_ID = 'process'; - - constructor( - @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IEnvironmentService private environmentService: IEnvironmentService - ) { - // noop - } - - public getHeight(tree: ITree, element: any): number { - return 22; - } - - public getTemplateId(tree: ITree, element: any): string { - if (element instanceof Process) { - return CallStackRenderer.PROCESS_TEMPLATE_ID; - } - if (element instanceof Thread) { - return CallStackRenderer.THREAD_TEMPLATE_ID; - } - if (element instanceof StackFrame) { - return CallStackRenderer.STACK_FRAME_TEMPLATE_ID; - } - if (typeof element === 'string') { - return CallStackRenderer.ERROR_TEMPLATE_ID; - } - - return CallStackRenderer.LOAD_MORE_TEMPLATE_ID; - } - - public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { - if (templateId === CallStackRenderer.PROCESS_TEMPLATE_ID) { - let data: IProcessTemplateData = Object.create(null); - data.process = dom.append(container, $('.process')); - data.name = dom.append(data.process, $('.name')); - data.state = dom.append(data.process, $('.state')); - data.stateLabel = dom.append(data.state, $('span.label')); - - return data; - } - - if (templateId === CallStackRenderer.LOAD_MORE_TEMPLATE_ID) { - let data: ILoadMoreTemplateData = Object.create(null); - data.label = dom.append(container, $('.load-more')); - - return data; - } - if (templateId === CallStackRenderer.ERROR_TEMPLATE_ID) { - let data: ILoadMoreTemplateData = Object.create(null); - data.label = dom.append(container, $('.error')); - - return data; - } - if (templateId === CallStackRenderer.THREAD_TEMPLATE_ID) { - let data: IThreadTemplateData = Object.create(null); - data.thread = dom.append(container, $('.thread')); - data.name = dom.append(data.thread, $('.name')); - data.state = dom.append(data.thread, $('.state')); - data.stateLabel = dom.append(data.state, $('span.label')); - - return data; - } - - let data: IStackFrameTemplateData = Object.create(null); - data.stackFrame = dom.append(container, $('.stack-frame')); - data.label = dom.append(data.stackFrame, $('span.label.expression')); - data.file = dom.append(data.stackFrame, $('.file')); - data.fileName = dom.append(data.file, $('span.file-name')); - const wrapper = dom.append(data.file, $('span.line-number-wrapper')); - data.lineNumber = dom.append(wrapper, $('span.line-number')); - - return data; - } - - public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { - if (templateId === CallStackRenderer.PROCESS_TEMPLATE_ID) { - this.renderProcess(element, templateData); - } else if (templateId === CallStackRenderer.THREAD_TEMPLATE_ID) { - this.renderThread(element, templateData); - } else if (templateId === CallStackRenderer.STACK_FRAME_TEMPLATE_ID) { - this.renderStackFrame(element, templateData); - } else if (templateId === CallStackRenderer.ERROR_TEMPLATE_ID) { - this.renderError(element, templateData); - } else if (templateId === CallStackRenderer.LOAD_MORE_TEMPLATE_ID) { - this.renderLoadMore(element, templateData); - } - } - - private renderProcess(process: debug.IProcess, data: IProcessTemplateData): void { - data.process.title = nls.localize({ key: 'process', comment: ['Process is a noun'] }, "Process"); - data.name.textContent = process.getName(this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE); - const stoppedThread = process.getAllThreads().filter(t => t.stopped).pop(); - - data.stateLabel.textContent = stoppedThread ? nls.localize('paused', "Paused") - : nls.localize({ key: 'running', comment: ['indicates state'] }, "Running"); - } - - private renderThread(thread: debug.IThread, data: IThreadTemplateData): void { - data.thread.title = nls.localize('thread', "Thread"); - data.name.textContent = thread.name; - - if (thread.stopped) { - data.stateLabel.textContent = thread.stoppedDetails.description || - thread.stoppedDetails.reason ? nls.localize({ key: 'pausedOn', comment: ['indicates reason for program being paused'] }, "Paused on {0}", thread.stoppedDetails.reason) : nls.localize('paused', "Paused"); - } else { - data.stateLabel.textContent = nls.localize({ key: 'running', comment: ['indicates state'] }, "Running"); - } - } - - private renderError(element: string, data: IErrorTemplateData) { - data.label.textContent = element; - data.label.title = element; - } - - private renderLoadMore(element: any, data: ILoadMoreTemplateData): void { - data.label.textContent = nls.localize('loadMoreStackFrames', "Load More Stack Frames"); - } - - private renderStackFrame(stackFrame: debug.IStackFrame, data: IStackFrameTemplateData): void { - dom.toggleClass(data.stackFrame, 'disabled', !stackFrame.source.available || stackFrame.source.presentationHint === 'deemphasize'); - dom.toggleClass(data.stackFrame, 'label', stackFrame.presentationHint === 'label'); - dom.toggleClass(data.stackFrame, 'subtle', stackFrame.presentationHint === 'subtle'); - - data.file.title = stackFrame.source.raw.path || stackFrame.source.name; - if (stackFrame.source.raw.origin) { - data.file.title += `\n${stackFrame.source.raw.origin}`; - } - data.label.textContent = stackFrame.name; - data.label.title = stackFrame.name; - data.fileName.textContent = getSourceName(stackFrame.source, this.contextService, this.environmentService); - if (stackFrame.range.startLineNumber !== undefined) { - data.lineNumber.textContent = `${stackFrame.range.startLineNumber}`; - if (stackFrame.range.startColumn) { - data.lineNumber.textContent += `:${stackFrame.range.startColumn}`; - } - dom.removeClass(data.lineNumber, 'unavailable'); - } else { - dom.addClass(data.lineNumber, 'unavailable'); - } - } - - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { - // noop - } -} - -export class CallstackAccessibilityProvider implements IAccessibilityProvider { - - constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) { - // noop - } - - public getAriaLabel(tree: ITree, element: any): string { - if (element instanceof Thread) { - return nls.localize('threadAriaLabel', "Thread {0}, callstack, debug", (element).name); - } - if (element instanceof StackFrame) { - return nls.localize('stackFrameAriaLabel', "Stack Frame {0} line {1} {2}, callstack, debug", (element).name, (element).range.startLineNumber, getSourceName((element).source, this.contextService)); - } - - return null; - } -} - -// variables - -export class VariablesActionProvider implements IActionProvider { - - constructor(private instantiationService: IInstantiationService) { - // noop - } - - public hasActions(tree: ITree, element: any): boolean { - return false; - } - - public getActions(tree: ITree, element: any): TPromise { - return TPromise.as([]); - } - - public hasSecondaryActions(tree: ITree, element: any): boolean { - // Only show context menu on "real" variables. Not on array chunk nodes. - return element instanceof Variable && !!element.value; - } - - public getSecondaryActions(tree: ITree, element: any): TPromise { - const actions: IAction[] = []; - const variable = element; - actions.push(this.instantiationService.createInstance(SetValueAction, SetValueAction.ID, SetValueAction.LABEL, variable)); - actions.push(this.instantiationService.createInstance(CopyValueAction, CopyValueAction.ID, CopyValueAction.LABEL, variable)); - actions.push(new Separator()); - actions.push(this.instantiationService.createInstance(AddToWatchExpressionsAction, AddToWatchExpressionsAction.ID, AddToWatchExpressionsAction.LABEL, variable)); - - return TPromise.as(actions); - } - - public getActionItem(tree: ITree, element: any, action: IAction): IActionItem { - return null; - } -} - -export class VariablesDataSource implements IDataSource { - - public getId(tree: ITree, element: any): string { - return element.getId(); - } - - public hasChildren(tree: ITree, element: any): boolean { - if (element instanceof ViewModel || element instanceof Scope) { - return true; - } - - let variable = element; - return variable.hasChildren && !equalsIgnoreCase(variable.value, 'null'); - } - - public getChildren(tree: ITree, element: any): TPromise { - if (element instanceof ViewModel) { - const focusedStackFrame = (element).focusedStackFrame; - return focusedStackFrame ? focusedStackFrame.getScopes() : TPromise.as([]); - } - - let scope = element; - return scope.getChildren(); - } - - public getParent(tree: ITree, element: any): TPromise { - return TPromise.as(null); - } -} - -interface IScopeTemplateData { - name: HTMLElement; -} - -export interface IVariableTemplateData { - expression: HTMLElement; - name: HTMLElement; - value: HTMLElement; -} - -export class VariablesRenderer implements IRenderer { - - private static readonly SCOPE_TEMPLATE_ID = 'scope'; - private static readonly VARIABLE_TEMPLATE_ID = 'variable'; - - constructor( - @debug.IDebugService private debugService: debug.IDebugService, - @IContextViewService private contextViewService: IContextViewService, - @IThemeService private themeService: IThemeService - ) { - // noop - } - - public getHeight(tree: ITree, element: any): number { - return 22; - } - - public getTemplateId(tree: ITree, element: any): string { - if (element instanceof Scope) { - return VariablesRenderer.SCOPE_TEMPLATE_ID; - } - if (element instanceof Variable) { - return VariablesRenderer.VARIABLE_TEMPLATE_ID; - } - - return null; - } - - public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { - if (templateId === VariablesRenderer.SCOPE_TEMPLATE_ID) { - let data: IScopeTemplateData = Object.create(null); - data.name = dom.append(container, $('.scope')); - - return data; - } - - let data: IVariableTemplateData = Object.create(null); - data.expression = dom.append(container, $('.expression')); - data.name = dom.append(data.expression, $('span.name')); - data.value = dom.append(data.expression, $('span.value')); - - return data; - } - - public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { - if (templateId === VariablesRenderer.SCOPE_TEMPLATE_ID) { - this.renderScope(element, templateData); - } else { - const variable = element; - if (variable === this.debugService.getViewModel().getSelectedExpression() || variable.errorMessage) { - renderRenameBox(this.debugService, this.contextViewService, this.themeService, tree, variable, (templateData).expression, { - initialValue: variable.value, - ariaLabel: nls.localize('variableValueAriaLabel', "Type new variable value"), - validationOptions: { - validation: (value: string) => variable.errorMessage ? ({ content: variable.errorMessage }) : null - } - }); - } else { - renderVariable(tree, variable, templateData, true); - } - } - } - - private renderScope(scope: Scope, data: IScopeTemplateData): void { - data.name.textContent = scope.name; - } - - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { - // noop - } -} - -export class VariablesAccessibilityProvider implements IAccessibilityProvider { - - public getAriaLabel(tree: ITree, element: any): string { - if (element instanceof Scope) { - return nls.localize('variableScopeAriaLabel', "Scope {0}, variables, debug", (element).name); - } - if (element instanceof Variable) { - return nls.localize('variableAriaLabel', "{0} value {1}, variables, debug", (element).name, (element).value); - } - - return null; - } -} - -export class VariablesController extends BaseDebugController { - - protected onLeftClick(tree: ITree, element: any, event: IMouseEvent): boolean { - // double click on primitive value: open input box to be able to set the value - const process = this.debugService.getViewModel().focusedProcess; - if (element instanceof Variable && event.detail === 2 && process && process.session.capabilities.supportsSetVariable) { - const expression = element; - this.debugService.getViewModel().setSelectedExpression(expression); - return true; - } - - return super.onLeftClick(tree, element, event); - } -} - -// watch expressions - -export class WatchExpressionsActionProvider implements IActionProvider { - - private instantiationService: IInstantiationService; - - constructor(instantiationService: IInstantiationService) { - this.instantiationService = instantiationService; - } - - public hasActions(tree: ITree, element: any): boolean { - return element instanceof Expression && !!element.name; - } - - public hasSecondaryActions(tree: ITree, element: any): boolean { - return true; - } - - public getActions(tree: ITree, element: any): TPromise { - return TPromise.as([]); - } - - public getSecondaryActions(tree: ITree, element: any): TPromise { - const actions: IAction[] = []; - if (element instanceof Expression) { - const expression = element; - actions.push(this.instantiationService.createInstance(AddWatchExpressionAction, AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL)); - actions.push(this.instantiationService.createInstance(EditWatchExpressionAction, EditWatchExpressionAction.ID, EditWatchExpressionAction.LABEL)); - if (!expression.hasChildren) { - actions.push(this.instantiationService.createInstance(CopyValueAction, CopyValueAction.ID, CopyValueAction.LABEL, expression.value)); - } - actions.push(new Separator()); - - actions.push(this.instantiationService.createInstance(RemoveWatchExpressionAction, RemoveWatchExpressionAction.ID, RemoveWatchExpressionAction.LABEL)); - actions.push(this.instantiationService.createInstance(RemoveAllWatchExpressionsAction, RemoveAllWatchExpressionsAction.ID, RemoveAllWatchExpressionsAction.LABEL)); - } else { - actions.push(this.instantiationService.createInstance(AddWatchExpressionAction, AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL)); - if (element instanceof Variable) { - const variable = element; - if (!variable.hasChildren) { - actions.push(this.instantiationService.createInstance(CopyValueAction, CopyValueAction.ID, CopyValueAction.LABEL, variable.value)); - } - actions.push(new Separator()); - } - actions.push(this.instantiationService.createInstance(RemoveAllWatchExpressionsAction, RemoveAllWatchExpressionsAction.ID, RemoveAllWatchExpressionsAction.LABEL)); - } - - return TPromise.as(actions); - } - - public getActionItem(tree: ITree, element: any, action: IAction): IActionItem { - return null; - } -} - -export class WatchExpressionsDataSource implements IDataSource { - - public getId(tree: ITree, element: any): string { - return element.getId(); - } - - public hasChildren(tree: ITree, element: any): boolean { - if (element instanceof Model) { - return true; - } - - const watchExpression = element; - return watchExpression.hasChildren && !equalsIgnoreCase(watchExpression.value, 'null'); - } - - public getChildren(tree: ITree, element: any): TPromise { - if (element instanceof Model) { - return TPromise.as((element).getWatchExpressions()); - } - - let expression = element; - return expression.getChildren(); - } - - public getParent(tree: ITree, element: any): TPromise { - return TPromise.as(null); - } -} - -interface IWatchExpressionTemplateData { - watchExpression: HTMLElement; - expression: HTMLElement; - name: HTMLSpanElement; - value: HTMLSpanElement; -} - -export class WatchExpressionsRenderer implements IRenderer { - - private static readonly WATCH_EXPRESSION_TEMPLATE_ID = 'watchExpression'; - private static readonly VARIABLE_TEMPLATE_ID = 'variables'; - private toDispose: lifecycle.IDisposable[]; - - constructor( - @debug.IDebugService private debugService: debug.IDebugService, - @IContextViewService private contextViewService: IContextViewService, - @IThemeService private themeService: IThemeService - ) { - this.toDispose = []; - } - - public getHeight(tree: ITree, element: any): number { - return 22; - } - - public getTemplateId(tree: ITree, element: any): string { - if (element instanceof Expression) { - return WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID; - } - - return WatchExpressionsRenderer.VARIABLE_TEMPLATE_ID; - } - - public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { - const createVariableTemplate = ((data: IVariableTemplateData, container: HTMLElement) => { - data.expression = dom.append(container, $('.expression')); - data.name = dom.append(data.expression, $('span.name')); - data.value = dom.append(data.expression, $('span.value')); - }); - - if (templateId === WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID) { - const data: IWatchExpressionTemplateData = Object.create(null); - data.watchExpression = dom.append(container, $('.watch-expression')); - createVariableTemplate(data, data.watchExpression); - - return data; - } - - const data: IVariableTemplateData = Object.create(null); - createVariableTemplate(data, container); - - return data; - } - - public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { - if (templateId === WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID) { - this.renderWatchExpression(tree, element, templateData); - } else { - renderVariable(tree, element, templateData, true); - } - } - - private renderWatchExpression(tree: ITree, watchExpression: debug.IExpression, data: IWatchExpressionTemplateData): void { - let selectedExpression = this.debugService.getViewModel().getSelectedExpression(); - if ((selectedExpression instanceof Expression && selectedExpression.getId() === watchExpression.getId()) || (watchExpression instanceof Expression && !watchExpression.name)) { - renderRenameBox(this.debugService, this.contextViewService, this.themeService, tree, watchExpression, data.expression, { - initialValue: watchExpression.name, - placeholder: nls.localize('watchExpressionPlaceholder', "Expression to watch"), - ariaLabel: nls.localize('watchExpressionInputAriaLabel', "Type watch expression") - }); - } - - data.name.textContent = watchExpression.name; - if (watchExpression.value) { - data.name.textContent += ':'; - renderExpressionValue(watchExpression, data.value, { - showChanged: true, - maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET, - preserveWhitespace: false, - showHover: true, - colorize: true - }); - data.name.title = watchExpression.type ? watchExpression.type : watchExpression.value; - } - } - - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { - // noop - } - - public dispose(): void { - this.toDispose = lifecycle.dispose(this.toDispose); - } -} - -export class WatchExpressionsAccessibilityProvider implements IAccessibilityProvider { - - public getAriaLabel(tree: ITree, element: any): string { - if (element instanceof Expression) { - return nls.localize('watchExpressionAriaLabel', "{0} value {1}, watch, debug", (element).name, (element).value); - } - if (element instanceof Variable) { - return nls.localize('watchVariableAriaLabel', "{0} value {1}, watch, debug", (element).name, (element).value); - } - - return null; - } -} - -export class WatchExpressionsController extends BaseDebugController { - - protected onLeftClick(tree: ITree, element: any, event: IMouseEvent): boolean { - // double click on primitive value: open input box to be able to select and copy value. - if (element instanceof Expression && event.detail === 2) { - const expression = element; - this.debugService.getViewModel().setSelectedExpression(expression); - return true; - } - - return super.onLeftClick(tree, element, event); - } -} - -export class WatchExpressionsDragAndDrop extends DefaultDragAndDrop { - - constructor( @debug.IDebugService private debugService: debug.IDebugService) { - super(); - } - - public getDragURI(tree: ITree, element: Expression): string { - if (!(element instanceof Expression)) { - return null; - } - - return element.getId(); - } - - public getDragLabel(tree: ITree, elements: Expression[]): string { - if (elements.length > 1) { - return String(elements.length); - } - - return elements[0].name; - } - - public onDragOver(tree: ITree, data: IDragAndDropData, target: Expression | Model, originalEvent: DragMouseEvent): IDragOverReaction { - if (target instanceof Expression || target instanceof Model) { - return { - accept: true, - autoExpand: false - }; - } - - return DRAG_OVER_REJECT; - } - - public drop(tree: ITree, data: IDragAndDropData, target: Expression | Model, originalEvent: DragMouseEvent): void { - const draggedData = data.getData(); - if (Array.isArray(draggedData)) { - const draggedElement = draggedData[0]; - const watches = this.debugService.getModel().getWatchExpressions(); - const position = target instanceof Model ? watches.length - 1 : watches.indexOf(target); - this.debugService.moveWatchExpression(draggedElement.getId(), position); - } - } -} - -// breakpoints - -export class BreakpointsActionProvider implements IActionProvider { - - constructor(private instantiationService: IInstantiationService, private debugService: debug.IDebugService) { - // noop - } - - public hasActions(tree: ITree, element: any): boolean { - return false; - } - - public hasSecondaryActions(tree: ITree, element: any): boolean { - return element instanceof Breakpoint || element instanceof ExceptionBreakpoint || element instanceof FunctionBreakpoint; - } - - public getActions(tree: ITree, element: any): TPromise { - return TPromise.as([]); - } - - public getSecondaryActions(tree: ITree, element: any): TPromise { - if (element instanceof ExceptionBreakpoint) { - return TPromise.as([]); - } - - const actions: IAction[] = []; - actions.push(this.instantiationService.createInstance(RemoveBreakpointAction, RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL)); - if (this.debugService.getModel().getBreakpoints().length + this.debugService.getModel().getFunctionBreakpoints().length > 1) { - actions.push(this.instantiationService.createInstance(RemoveAllBreakpointsAction, RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL)); - actions.push(new Separator()); - - actions.push(this.instantiationService.createInstance(EnableAllBreakpointsAction, EnableAllBreakpointsAction.ID, EnableAllBreakpointsAction.LABEL)); - actions.push(this.instantiationService.createInstance(DisableAllBreakpointsAction, DisableAllBreakpointsAction.ID, DisableAllBreakpointsAction.LABEL)); - } - - actions.push(new Separator()); - actions.push(this.instantiationService.createInstance(ReapplyBreakpointsAction, ReapplyBreakpointsAction.ID, ReapplyBreakpointsAction.LABEL)); - - return TPromise.as(actions); - } - - public getActionItem(tree: ITree, element: any, action: IAction): IActionItem { - return null; - } -} - -export class BreakpointsDataSource implements IDataSource { - - public getId(tree: ITree, element: any): string { - return element.getId(); - } - - public hasChildren(tree: ITree, element: any): boolean { - return element instanceof Model; - } - - public getChildren(tree: ITree, element: any): TPromise { - const model = element; - const exBreakpoints = model.getExceptionBreakpoints(); - - return TPromise.as(exBreakpoints.concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints())); - } - - public getParent(tree: ITree, element: any): TPromise { - return TPromise.as(null); - } -} - -interface IBaseBreakpointTemplateData { - breakpoint: HTMLElement; - name: HTMLElement; - checkbox: HTMLInputElement; - context: debug.IEnablement; - toDispose: lifecycle.IDisposable[]; -} - -interface IBreakpointTemplateData extends IBaseBreakpointTemplateData { - lineNumber: HTMLElement; - filePath: HTMLElement; -} - -export class BreakpointsRenderer implements IRenderer { - - private static readonly EXCEPTION_BREAKPOINT_TEMPLATE_ID = 'exceptionBreakpoint'; - private static readonly FUNCTION_BREAKPOINT_TEMPLATE_ID = 'functionBreakpoint'; - private static readonly BREAKPOINT_TEMPLATE_ID = 'breakpoint'; - - constructor( - @IWorkspaceContextService private contextService: IWorkspaceContextService, - @debug.IDebugService private debugService: debug.IDebugService, - @IContextViewService private contextViewService: IContextViewService, - @IThemeService private themeService: IThemeService, - @IEnvironmentService private environmentService: IEnvironmentService - ) { - // noop - } - - public getHeight(tree: ITree, element: any): number { - return 22; - } - - public getTemplateId(tree: ITree, element: any): string { - if (element instanceof Breakpoint) { - return BreakpointsRenderer.BREAKPOINT_TEMPLATE_ID; - } - if (element instanceof FunctionBreakpoint) { - return BreakpointsRenderer.FUNCTION_BREAKPOINT_TEMPLATE_ID; - } - if (element instanceof ExceptionBreakpoint) { - return BreakpointsRenderer.EXCEPTION_BREAKPOINT_TEMPLATE_ID; - } - - return null; - } - - public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { - const data: IBreakpointTemplateData = Object.create(null); - data.breakpoint = dom.append(container, $('.breakpoint')); - - data.checkbox = $('input'); - data.checkbox.type = 'checkbox'; - data.toDispose = []; - data.toDispose.push(dom.addStandardDisposableListener(data.checkbox, 'change', (e) => { - this.debugService.enableOrDisableBreakpoints(!data.context.enabled, data.context); - })); - - dom.append(data.breakpoint, data.checkbox); - - data.name = dom.append(data.breakpoint, $('span.name')); - - if (templateId === BreakpointsRenderer.BREAKPOINT_TEMPLATE_ID) { - data.filePath = dom.append(data.breakpoint, $('span.file-path')); - const lineNumberContainer = dom.append(data.breakpoint, $('.line-number-container')); - data.lineNumber = dom.append(lineNumberContainer, $('span.line-number')); - } - if (templateId === BreakpointsRenderer.EXCEPTION_BREAKPOINT_TEMPLATE_ID) { - dom.addClass(data.breakpoint, 'exception'); - } - - return data; - } - - public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { - templateData.context = element; - if (templateId === BreakpointsRenderer.EXCEPTION_BREAKPOINT_TEMPLATE_ID) { - this.renderExceptionBreakpoint(element, templateData); - } else if (templateId === BreakpointsRenderer.FUNCTION_BREAKPOINT_TEMPLATE_ID) { - this.renderFunctionBreakpoint(tree, element, templateData); - } else { - this.renderBreakpoint(tree, element, templateData); - } - } - - private renderExceptionBreakpoint(exceptionBreakpoint: debug.IExceptionBreakpoint, data: IBaseBreakpointTemplateData): void { - data.name.textContent = exceptionBreakpoint.label || `${exceptionBreakpoint.filter} exceptions`; - data.breakpoint.title = data.name.textContent; - data.checkbox.checked = exceptionBreakpoint.enabled; - } - - private renderFunctionBreakpoint(tree: ITree, functionBreakpoint: debug.IFunctionBreakpoint, data: IBaseBreakpointTemplateData): void { - const selected = this.debugService.getViewModel().getSelectedFunctionBreakpoint(); - if (!functionBreakpoint.name || (selected && selected.getId() === functionBreakpoint.getId())) { - data.name.textContent = ''; - renderRenameBox(this.debugService, this.contextViewService, this.themeService, tree, functionBreakpoint, data.breakpoint, { - initialValue: functionBreakpoint.name, - placeholder: nls.localize('functionBreakpointPlaceholder', "Function to break on"), - ariaLabel: nls.localize('functionBreakPointInputAriaLabel', "Type function breakpoint") - }); - } else { - data.name.textContent = functionBreakpoint.name; - data.checkbox.checked = functionBreakpoint.enabled; - data.breakpoint.title = functionBreakpoint.name; - - // Mark function breakpoints as disabled if deactivated or if debug type does not support them #9099 - const process = this.debugService.getViewModel().focusedProcess; - if ((process && !process.session.capabilities.supportsFunctionBreakpoints) || !this.debugService.getModel().areBreakpointsActivated()) { - tree.addTraits('disabled', [functionBreakpoint]); - if (process && !process.session.capabilities.supportsFunctionBreakpoints) { - data.breakpoint.title = nls.localize('functionBreakpointsNotSupported', "Function breakpoints are not supported by this debug type"); - } - } else { - tree.removeTraits('disabled', [functionBreakpoint]); - } - } - } - - private renderBreakpoint(tree: ITree, breakpoint: debug.IBreakpoint, data: IBreakpointTemplateData): void { - this.debugService.getModel().areBreakpointsActivated() ? tree.removeTraits('disabled', [breakpoint]) : tree.addTraits('disabled', [breakpoint]); - - data.name.textContent = paths.basename(getPathLabel(breakpoint.uri, this.contextService)); - data.lineNumber.textContent = breakpoint.lineNumber.toString(); - if (breakpoint.column) { - data.lineNumber.textContent += `:${breakpoint.column}`; - } - data.filePath.textContent = getPathLabel(resources.dirname(breakpoint.uri), this.contextService, this.environmentService); - data.checkbox.checked = breakpoint.enabled; - - const debugActive = this.debugService.state === debug.State.Running || this.debugService.state === debug.State.Stopped; - if (debugActive && !breakpoint.verified) { - tree.addTraits('disabled', [breakpoint]); - if (breakpoint.message) { - data.breakpoint.title = breakpoint.message; - } - } else if (breakpoint.condition || breakpoint.hitCondition) { - data.breakpoint.title = breakpoint.condition ? breakpoint.condition : breakpoint.hitCondition; - } - } - - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { - lifecycle.dispose(templateData.toDispose); - } -} - -export class BreakpointsAccessibilityProvider implements IAccessibilityProvider { - - constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) { - // noop - } - - public getAriaLabel(tree: ITree, element: any): string { - if (element instanceof Breakpoint) { - return nls.localize('breakpointAriaLabel', "Breakpoint line {0} {1}, breakpoints, debug", (element).lineNumber, getPathLabel(resources.basenameOrAuthority((element).uri), this.contextService), this.contextService); - } - if (element instanceof FunctionBreakpoint) { - return nls.localize('functionBreakpointAriaLabel', "Function breakpoint {0}, breakpoints, debug", (element).name); - } - if (element instanceof ExceptionBreakpoint) { - return nls.localize('exceptionBreakpointAriaLabel', "Exception breakpoint {0}, breakpoints, debug", (element).filter); - } - - return null; - } -} - -export class BreakpointsController extends BaseDebugController { - - protected onLeftClick(tree: ITree, element: any, event: IMouseEvent): boolean { - if (element instanceof FunctionBreakpoint && event.detail === 2) { - this.debugService.getViewModel().setSelectedFunctionBreakpoint(element); - return true; - } - if (element instanceof Breakpoint) { - super.onLeftClick(tree, element, event); - this.openBreakpointSource(element, event, event.detail !== 2); - return true; - } - - return super.onLeftClick(tree, element, event); - } - - public openBreakpointSource(breakpoint: Breakpoint, event: any, preserveFocus: boolean): void { - if (breakpoint.uri.scheme === debug.DEBUG_SCHEME && this.debugService.state === debug.State.Inactive) { - return; - } - - const sideBySide = (event && (event.ctrlKey || event.metaKey)); - const selection = breakpoint.endLineNumber ? { - startLineNumber: breakpoint.lineNumber, - endLineNumber: breakpoint.endLineNumber, - startColumn: breakpoint.column, - endColumn: breakpoint.endColumn - } : { - startLineNumber: breakpoint.lineNumber, - startColumn: breakpoint.column || 1, - endLineNumber: breakpoint.lineNumber, - endColumn: breakpoint.column || Constants.MAX_SAFE_SMALL_INTEGER - }; - - this.editorService.openEditor({ - resource: breakpoint.uri, - options: { - preserveFocus, - selection, - revealIfVisible: true, - revealInCenterIfOutsideViewport: true, - pinned: !preserveFocus - } - }, sideBySide).done(undefined, errors.onUnexpectedError); - } -} diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts deleted file mode 100644 index e457ed0cf80f..000000000000 --- a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts +++ /dev/null @@ -1,511 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; -import * as resources from 'vs/base/common/resources'; -import { RunOnceScheduler, sequence } from 'vs/base/common/async'; -import * as dom from 'vs/base/browser/dom'; -import * as builder from 'vs/base/browser/builder'; -import { TPromise } from 'vs/base/common/winjs.base'; -import * as errors from 'vs/base/common/errors'; -import { IAction } from 'vs/base/common/actions'; -import { prepareActions } from 'vs/workbench/browser/actions'; -import { IHighlightEvent, ITree } from 'vs/base/parts/tree/browser/tree'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; -import { CollapseAction } from 'vs/workbench/browser/viewlet'; -import { ViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IDebugService, State, IBreakpoint, IExpression, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED } from 'vs/workbench/parts/debug/common/debug'; -import { Expression, Variable, ExceptionBreakpoint, FunctionBreakpoint, Thread, StackFrame, Breakpoint, ThreadAndProcessIds } from 'vs/workbench/parts/debug/common/debugModel'; -import * as viewer from 'vs/workbench/parts/debug/electron-browser/debugViewer'; -import { AddWatchExpressionAction, RemoveAllWatchExpressionsAction, AddFunctionBreakpointAction, ToggleBreakpointsActivatedAction, RemoveAllBreakpointsAction } from 'vs/workbench/parts/debug/browser/debugActions'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { MenuId } from 'vs/platform/actions/common/actions'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IListService } from 'vs/platform/list/browser/listService'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { once } from 'vs/base/common/event'; - -function renderViewTree(container: HTMLElement): HTMLElement { - const treeContainer = document.createElement('div'); - dom.addClass(treeContainer, 'debug-view-content'); - container.appendChild(treeContainer); - return treeContainer; -} - -const $ = builder.$; -const twistiePixels = 20; - -export class VariablesView extends ViewsViewletPanel { - - private static readonly MEMENTO = 'variablesview.memento'; - private onFocusStackFrameScheduler: RunOnceScheduler; - private variablesFocusedContext: IContextKey; - private settings: any; - private expandedElements: any[]; - - constructor( - options: IViewletViewOptions, - @IContextMenuService contextMenuService: IContextMenuService, - @IDebugService private debugService: IDebugService, - @IKeybindingService keybindingService: IKeybindingService, - @IInstantiationService private instantiationService: IInstantiationService, - @IContextKeyService contextKeyService: IContextKeyService, - @IListService private listService: IListService, - @IThemeService private themeService: IThemeService - ) { - super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('variablesSection', "Variables Section") }, keybindingService, contextMenuService); - - this.settings = options.viewletSettings; - this.variablesFocusedContext = CONTEXT_VARIABLES_FOCUSED.bindTo(contextKeyService); - this.expandedElements = []; - // Use scheduler to prevent unnecessary flashing - this.onFocusStackFrameScheduler = new RunOnceScheduler(() => { - // Remember expanded elements when there are some (otherwise don't override/erase the previous ones) - const expanded = this.tree.getExpandedElements(); - if (expanded.length > 0) { - this.expandedElements = expanded; - } - - // Always clear tree highlight to avoid ending up in a broken state #12203 - this.tree.clearHighlight(); - this.tree.refresh().then(() => { - const stackFrame = this.debugService.getViewModel().focusedStackFrame; - return sequence(this.expandedElements.map(e => () => this.tree.expand(e))).then(() => { - // If there is no preserved expansion state simply expand the first scope - if (stackFrame && this.tree.getExpandedElements().length === 0) { - return stackFrame.getScopes().then(scopes => { - if (scopes.length > 0 && !scopes[0].expensive) { - return this.tree.expand(scopes[0]); - } - return undefined; - }); - } - return undefined; - }); - }).done(null, errors.onUnexpectedError); - }, 400); - } - - public renderBody(container: HTMLElement): void { - dom.addClass(container, 'debug-variables'); - this.treeContainer = renderViewTree(container); - - this.tree = new Tree(this.treeContainer, { - dataSource: new viewer.VariablesDataSource(), - renderer: this.instantiationService.createInstance(viewer.VariablesRenderer), - accessibilityProvider: new viewer.VariablesAccessibilityProvider(), - controller: this.instantiationService.createInstance(viewer.VariablesController, new viewer.VariablesActionProvider(this.instantiationService), MenuId.DebugVariablesContext) - }, { - ariaLabel: nls.localize('variablesAriaTreeLabel', "Debug Variables"), - twistiePixels, - keyboardSupport: false - }); - - this.disposables.push(attachListStyler(this.tree, this.themeService)); - this.disposables.push(this.listService.register(this.tree, [this.variablesFocusedContext])); - - const viewModel = this.debugService.getViewModel(); - - this.tree.setInput(viewModel); - - const collapseAction = this.instantiationService.createInstance(CollapseAction, this.tree, false, 'explorer-action collapse-explorer'); - this.toolbar.setActions(prepareActions([collapseAction]))(); - - this.disposables.push(viewModel.onDidFocusStackFrame(sf => { - // Refresh the tree immediately if it is not visible. - // Otherwise postpone the refresh until user stops stepping. - if (!this.tree.getContentHeight() || sf.explicit) { - this.onFocusStackFrameScheduler.schedule(0); - } else { - this.onFocusStackFrameScheduler.schedule(); - } - })); - this.disposables.push(this.debugService.onDidChangeState(state => { - collapseAction.enabled = state === State.Running || state === State.Stopped; - })); - - this.disposables.push(this.debugService.getViewModel().onDidSelectExpression(expression => { - if (!expression || !(expression instanceof Variable)) { - return; - } - - this.tree.refresh(expression, false).then(() => { - this.tree.setHighlight(expression); - once(this.tree.onDidChangeHighlight)((e: IHighlightEvent) => { - if (!e.highlight) { - this.debugService.getViewModel().setSelectedExpression(null); - } - }); - }).done(null, errors.onUnexpectedError); - })); - } - - public shutdown(): void { - this.settings[VariablesView.MEMENTO] = !this.isExpanded(); - super.shutdown(); - } -} - -export class WatchExpressionsView extends ViewsViewletPanel { - - private static readonly MEMENTO = 'watchexpressionsview.memento'; - private onWatchExpressionsUpdatedScheduler: RunOnceScheduler; - private toReveal: IExpression; - private watchExpressionsFocusedContext: IContextKey; - private settings: any; - - constructor( - options: IViewletViewOptions, - @IContextMenuService contextMenuService: IContextMenuService, - @IDebugService private debugService: IDebugService, - @IKeybindingService keybindingService: IKeybindingService, - @IInstantiationService private instantiationService: IInstantiationService, - @IContextKeyService contextKeyService: IContextKeyService, - @IListService private listService: IListService, - @IThemeService private themeService: IThemeService - ) { - super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('expressionsSection', "Expressions Section") }, keybindingService, contextMenuService); - this.settings = options.viewletSettings; - - this.disposables.push(this.debugService.getModel().onDidChangeWatchExpressions(we => { - // only expand when a new watch expression is added. - if (we instanceof Expression) { - this.setExpanded(true); - } - })); - this.watchExpressionsFocusedContext = CONTEXT_WATCH_EXPRESSIONS_FOCUSED.bindTo(contextKeyService); - - this.onWatchExpressionsUpdatedScheduler = new RunOnceScheduler(() => { - this.tree.refresh().done(() => { - return this.toReveal instanceof Expression ? this.tree.reveal(this.toReveal) : TPromise.as(true); - }, errors.onUnexpectedError); - }, 50); - } - - public renderBody(container: HTMLElement): void { - dom.addClass(container, 'debug-watch'); - this.treeContainer = renderViewTree(container); - - const actionProvider = new viewer.WatchExpressionsActionProvider(this.instantiationService); - this.tree = new Tree(this.treeContainer, { - dataSource: new viewer.WatchExpressionsDataSource(), - renderer: this.instantiationService.createInstance(viewer.WatchExpressionsRenderer), - accessibilityProvider: new viewer.WatchExpressionsAccessibilityProvider(), - controller: this.instantiationService.createInstance(viewer.WatchExpressionsController, actionProvider, MenuId.DebugWatchContext), - dnd: this.instantiationService.createInstance(viewer.WatchExpressionsDragAndDrop) - }, { - ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'watchAriaTreeLabel' }, "Debug Watch Expressions"), - twistiePixels, - keyboardSupport: false - }); - - this.disposables.push(attachListStyler(this.tree, this.themeService)); - this.disposables.push(this.listService.register(this.tree, [this.watchExpressionsFocusedContext])); - - this.tree.setInput(this.debugService.getModel()); - - const addWatchExpressionAction = this.instantiationService.createInstance(AddWatchExpressionAction, AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL); - const collapseAction = this.instantiationService.createInstance(CollapseAction, this.tree, true, 'explorer-action collapse-explorer'); - const removeAllWatchExpressionsAction = this.instantiationService.createInstance(RemoveAllWatchExpressionsAction, RemoveAllWatchExpressionsAction.ID, RemoveAllWatchExpressionsAction.LABEL); - this.toolbar.setActions(prepareActions([addWatchExpressionAction, collapseAction, removeAllWatchExpressionsAction]))(); - - this.disposables.push(this.debugService.getModel().onDidChangeWatchExpressions(we => { - if (!this.onWatchExpressionsUpdatedScheduler.isScheduled()) { - this.onWatchExpressionsUpdatedScheduler.schedule(); - } - this.toReveal = we; - })); - - this.disposables.push(this.debugService.getViewModel().onDidSelectExpression(expression => { - if (!expression || !(expression instanceof Expression)) { - return; - } - - this.tree.refresh(expression, false).then(() => { - this.tree.setHighlight(expression); - once(this.tree.onDidChangeHighlight)((e: IHighlightEvent) => { - if (!e.highlight) { - this.debugService.getViewModel().setSelectedExpression(null); - } - }); - }).done(null, errors.onUnexpectedError); - })); - } - - public shutdown(): void { - this.settings[WatchExpressionsView.MEMENTO] = !this.isExpanded(); - super.shutdown(); - } -} - -export class CallStackView extends ViewsViewletPanel { - - private static readonly MEMENTO = 'callstackview.memento'; - private pauseMessage: builder.Builder; - private pauseMessageLabel: builder.Builder; - private onCallStackChangeScheduler: RunOnceScheduler; - private settings: any; - - constructor( - private options: IViewletViewOptions, - @IContextMenuService contextMenuService: IContextMenuService, - @IDebugService private debugService: IDebugService, - @IKeybindingService keybindingService: IKeybindingService, - @IInstantiationService private instantiationService: IInstantiationService, - @IListService private listService: IListService, - @IThemeService private themeService: IThemeService - ) { - super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('callstackSection', "Call Stack Section") }, keybindingService, contextMenuService); - this.settings = options.viewletSettings; - - // Create scheduler to prevent unnecessary flashing of tree when reacting to changes - this.onCallStackChangeScheduler = new RunOnceScheduler(() => { - let newTreeInput: any = this.debugService.getModel(); - const processes = this.debugService.getModel().getProcesses(); - if (!this.debugService.getViewModel().isMultiProcessView() && processes.length) { - const threads = processes[0].getAllThreads(); - // Only show the threads in the call stack if there is more than 1 thread. - newTreeInput = threads.length === 1 ? threads[0] : processes[0]; - } - - // Only show the global pause message if we do not display threads. - // Otherwise there will be a pause message per thread and there is no need for a global one. - if (newTreeInput instanceof Thread && newTreeInput.stoppedDetails) { - this.pauseMessageLabel.text(newTreeInput.stoppedDetails.description || nls.localize('debugStopped', "Paused on {0}", newTreeInput.stoppedDetails.reason)); - if (newTreeInput.stoppedDetails.text) { - this.pauseMessageLabel.title(newTreeInput.stoppedDetails.text); - } - newTreeInput.stoppedDetails.reason === 'exception' ? this.pauseMessageLabel.addClass('exception') : this.pauseMessageLabel.removeClass('exception'); - this.pauseMessage.show(); - } else { - this.pauseMessage.hide(); - } - - (this.tree.getInput() === newTreeInput ? this.tree.refresh() : this.tree.setInput(newTreeInput)) - .done(() => this.updateTreeSelection(), errors.onUnexpectedError); - }, 50); - } - - protected renderHeaderTitle(container: HTMLElement): void { - const title = $('.title.debug-call-stack-title').appendTo(container); - $('span').text(this.options.name).appendTo(title); - this.pauseMessage = $('span.pause-message').appendTo(title); - this.pauseMessage.hide(); - this.pauseMessageLabel = $('span.label').appendTo(this.pauseMessage); - } - - public renderBody(container: HTMLElement): void { - dom.addClass(container, 'debug-call-stack'); - this.treeContainer = renderViewTree(container); - const actionProvider = this.instantiationService.createInstance(viewer.CallStackActionProvider); - const controller = this.instantiationService.createInstance(viewer.CallStackController, actionProvider, MenuId.DebugCallStackContext); - - this.tree = new Tree(this.treeContainer, { - dataSource: this.instantiationService.createInstance(viewer.CallStackDataSource), - renderer: this.instantiationService.createInstance(viewer.CallStackRenderer), - accessibilityProvider: this.instantiationService.createInstance(viewer.CallstackAccessibilityProvider), - controller - }, { - ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'callStackAriaLabel' }, "Debug Call Stack"), - twistiePixels, - keyboardSupport: false - }); - - this.disposables.push(attachListStyler(this.tree, this.themeService)); - this.disposables.push(this.listService.register(this.tree)); - - this.disposables.push(this.tree.onDidChangeSelection(event => { - if (event && event.payload && event.payload.origin === 'keyboard') { - const element = this.tree.getFocus(); - if (element instanceof ThreadAndProcessIds) { - controller.showMoreStackFrames(this.tree, element); - } else if (element instanceof StackFrame) { - controller.focusStackFrame(element, event, false); - } - } - })); - - this.disposables.push(this.debugService.getModel().onDidChangeCallStack(() => { - if (!this.onCallStackChangeScheduler.isScheduled()) { - this.onCallStackChangeScheduler.schedule(); - } - })); - this.disposables.push(this.debugService.getViewModel().onDidFocusStackFrame(() => - this.updateTreeSelection().done(undefined, errors.onUnexpectedError))); - - // Schedule the update of the call stack tree if the viewlet is opened after a session started #14684 - if (this.debugService.state === State.Stopped) { - this.onCallStackChangeScheduler.schedule(); - } - } - - private updateTreeSelection(): TPromise { - if (!this.tree.getInput()) { - // Tree not initialized yet - return TPromise.as(null); - } - - const stackFrame = this.debugService.getViewModel().focusedStackFrame; - const thread = this.debugService.getViewModel().focusedThread; - const process = this.debugService.getViewModel().focusedProcess; - if (!thread) { - if (!process) { - this.tree.clearSelection(); - return TPromise.as(null); - } - - this.tree.setSelection([process]); - return this.tree.reveal(process); - } - - return this.tree.expandAll([thread.process, thread]).then(() => { - if (!stackFrame) { - return TPromise.as(null); - } - - this.tree.setSelection([stackFrame]); - return this.tree.reveal(stackFrame); - }); - } - - public shutdown(): void { - this.settings[CallStackView.MEMENTO] = !this.isExpanded(); - super.shutdown(); - } -} - -export class BreakpointsView extends ViewsViewletPanel { - - private static readonly MAX_VISIBLE_FILES = 9; - private static readonly MEMENTO = 'breakopintsview.memento'; - private breakpointsFocusedContext: IContextKey; - private settings: any; - - constructor( - options: IViewletViewOptions, - @IContextMenuService contextMenuService: IContextMenuService, - @IDebugService private debugService: IDebugService, - @IKeybindingService keybindingService: IKeybindingService, - @IInstantiationService private instantiationService: IInstantiationService, - @IContextKeyService contextKeyService: IContextKeyService, - @IListService private listService: IListService, - @IThemeService private themeService: IThemeService - ) { - super({ - ...(options as IViewOptions), - ariaHeaderLabel: nls.localize('breakpointsSection', "Breakpoints Section") - }, keybindingService, contextMenuService); - - this.minimumBodySize = this.maximumBodySize = this.getExpandedBodySize(); - this.settings = options.viewletSettings; - this.breakpointsFocusedContext = CONTEXT_BREAKPOINTS_FOCUSED.bindTo(contextKeyService); - this.disposables.push(this.debugService.getModel().onDidChangeBreakpoints(() => this.onBreakpointsChange())); - } - - public renderBody(container: HTMLElement): void { - dom.addClass(container, 'debug-breakpoints'); - this.treeContainer = renderViewTree(container); - const actionProvider = new viewer.BreakpointsActionProvider(this.instantiationService, this.debugService); - const controller = this.instantiationService.createInstance(viewer.BreakpointsController, actionProvider, MenuId.DebugBreakpointsContext); - - this.tree = new Tree(this.treeContainer, { - dataSource: new viewer.BreakpointsDataSource(), - renderer: this.instantiationService.createInstance(viewer.BreakpointsRenderer), - accessibilityProvider: this.instantiationService.createInstance(viewer.BreakpointsAccessibilityProvider), - controller, - sorter: { - compare(tree: ITree, element: any, otherElement: any): number { - const first = element; - const second = otherElement; - if (first instanceof ExceptionBreakpoint) { - return -1; - } - if (second instanceof ExceptionBreakpoint) { - return 1; - } - if (first instanceof FunctionBreakpoint) { - return -1; - } - if (second instanceof FunctionBreakpoint) { - return 1; - } - - if (first.uri.toString() !== second.uri.toString()) { - return resources.basenameOrAuthority(first.uri).localeCompare(resources.basenameOrAuthority(second.uri)); - } - if (first.lineNumber === second.lineNumber) { - return first.column - second.column; - } - - return first.lineNumber - second.lineNumber; - } - } - }, { - ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'breakpointsAriaTreeLabel' }, "Debug Breakpoints"), - twistiePixels, - keyboardSupport: false - }); - - this.disposables.push(attachListStyler(this.tree, this.themeService)); - this.disposables.push(this.listService.register(this.tree, [this.breakpointsFocusedContext])); - - this.disposables.push(this.tree.onDidChangeSelection(event => { - if (event && event.payload && event.payload.origin === 'keyboard') { - const element = this.tree.getFocus(); - if (element instanceof Breakpoint) { - controller.openBreakpointSource(element, event, false); - } - } - })); - - const debugModel = this.debugService.getModel(); - - this.tree.setInput(debugModel); - - this.disposables.push(this.debugService.getViewModel().onDidSelectFunctionBreakpoint(fbp => { - if (!fbp || !(fbp instanceof FunctionBreakpoint)) { - return; - } - - this.tree.refresh(fbp, false).then(() => { - this.tree.setHighlight(fbp); - once(this.tree.onDidChangeHighlight)((e: IHighlightEvent) => { - if (!e.highlight) { - this.debugService.getViewModel().setSelectedFunctionBreakpoint(null); - } - }); - }).done(null, errors.onUnexpectedError); - })); - } - - public getActions(): IAction[] { - return [ - this.instantiationService.createInstance(AddFunctionBreakpointAction, AddFunctionBreakpointAction.ID, AddFunctionBreakpointAction.LABEL), - this.instantiationService.createInstance(ToggleBreakpointsActivatedAction, ToggleBreakpointsActivatedAction.ID, ToggleBreakpointsActivatedAction.ACTIVATE_LABEL), - this.instantiationService.createInstance(RemoveAllBreakpointsAction, RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL) - ]; - } - - private onBreakpointsChange(): void { - this.minimumBodySize = this.maximumBodySize = this.getExpandedBodySize(); - if (this.tree) { - this.tree.refresh(); - } - } - - private getExpandedBodySize(): number { - const model = this.debugService.getModel(); - const length = model.getBreakpoints().length + model.getExceptionBreakpoints().length + model.getFunctionBreakpoints().length; - return Math.min(BreakpointsView.MAX_VISIBLE_FILES, length) * 22; - } - - public shutdown(): void { - this.settings[BreakpointsView.MEMENTO] = !this.isExpanded(); - super.shutdown(); - } -} diff --git a/src/vs/workbench/parts/debug/electron-browser/repl.ts b/src/vs/workbench/parts/debug/electron-browser/repl.ts index 3d8dba4e41e3..812647333192 100644 --- a/src/vs/workbench/parts/debug/electron-browser/repl.ts +++ b/src/vs/workbench/parts/debug/electron-browser/repl.ts @@ -16,7 +16,6 @@ import { isMacintosh } from 'vs/base/common/platform'; import { CancellationToken } from 'vs/base/common/cancellation'; import { KeyCode } from 'vs/base/common/keyCodes'; import { ITree, ITreeOptions } from 'vs/base/parts/tree/browser/tree'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { Context as SuggestContext } from 'vs/editor/contrib/suggest/suggest'; import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; import { IReadOnlyModel } from 'vs/editor/common/editorCommon'; @@ -38,12 +37,12 @@ import { ClearReplAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { ReplHistory } from 'vs/workbench/parts/debug/common/replHistory'; import { Panel } from 'vs/workbench/browser/panel'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { IListService } from 'vs/platform/list/browser/listService'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { clipboard } from 'electron'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; +import { memoize } from 'vs/base/common/decorators'; const $ = dom.$; @@ -75,7 +74,7 @@ export class Repl extends Panel implements IPrivateReplService { private tree: ITree; private renderer: ReplExpressionsRenderer; - private characterWidthSurveyor: HTMLElement; + private container: HTMLElement; private treeContainer: HTMLElement; private replInput: ReplInputEditor; private replInputContainer: HTMLElement; @@ -130,30 +129,20 @@ export class Repl extends Panel implements IPrivateReplService { public create(parent: Builder): TPromise { super.create(parent); - const container = dom.append(parent.getHTMLElement(), $('.repl')); - this.treeContainer = dom.append(container, $('.repl-tree')); - this.createReplInput(container); - - this.characterWidthSurveyor = dom.append(container, $('.surveyor')); - this.characterWidthSurveyor.textContent = Repl.HALF_WIDTH_TYPICAL; - for (let i = 0; i < 10; i++) { - this.characterWidthSurveyor.textContent += this.characterWidthSurveyor.textContent; - } - this.characterWidthSurveyor.style.fontSize = isMacintosh ? '12px' : '14px'; + this.container = dom.append(parent.getHTMLElement(), $('.repl')); + this.treeContainer = dom.append(this.container, $('.repl-tree')); + this.createReplInput(this.container); this.renderer = this.instantiationService.createInstance(ReplExpressionsRenderer); const controller = this.instantiationService.createInstance(ReplExpressionsController, new ReplExpressionsActionProvider(this.instantiationService), MenuId.DebugConsoleContext); controller.toFocusOnClick = this.replInput; - this.tree = new Tree(this.treeContainer, { + this.tree = new WorkbenchTree(this.treeContainer, { dataSource: new ReplExpressionsDataSource(), renderer: this.renderer, accessibilityProvider: new ReplExpressionsAccessibilityProvider(), controller - }, replTreeOptions); - - this.toUnbind.push(attachListStyler(this.tree, this.themeService)); - this.toUnbind.push(this.listService.register(this.tree)); + }, replTreeOptions, this.contextKeyService, this.listService, this.themeService); if (!Repl.HISTORY) { Repl.HISTORY = new ReplHistory(JSON.parse(this.storageService.get(HISTORY_STORAGE_KEY, StorageScope.WORKSPACE, '[]'))); @@ -247,7 +236,7 @@ export class Repl extends Panel implements IPrivateReplService { public layout(dimension: Dimension): void { this.dimension = dimension; if (this.tree) { - this.renderer.setWidth(dimension.width - 25, this.characterWidthSurveyor.clientWidth / this.characterWidthSurveyor.textContent.length); + this.renderer.setWidth(dimension.width - 25, this.characterWidth); const treeHeight = dimension.height - this.replInputHeight; this.treeContainer.style.height = `${treeHeight}px`; this.tree.layout(treeHeight); @@ -257,6 +246,18 @@ export class Repl extends Panel implements IPrivateReplService { this.replInput.layout({ width: dimension.width - 20, height: this.replInputHeight }); } + @memoize + private get characterWidth(): number { + const characterWidthSurveyor = dom.append(this.container, $('.surveyor')); + characterWidthSurveyor.textContent = Repl.HALF_WIDTH_TYPICAL; + for (let i = 0; i < 10; i++) { + characterWidthSurveyor.textContent += characterWidthSurveyor.textContent; + } + characterWidthSurveyor.style.fontSize = isMacintosh ? '12px' : '14px'; + + return characterWidthSurveyor.clientWidth / characterWidthSurveyor.textContent.length; + } + public focus(): void { this.replInput.focus(); } diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index d761ceea00e3..d382679b1707 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -17,7 +17,7 @@ import { ITree, IAccessibilityProvider, ContextMenuEvent, IDataSource, IRenderer import { ICancelableEvent } from 'vs/base/parts/tree/browser/treeDefaults'; import { IExpressionContainer, IExpression, IReplElementSource } from 'vs/workbench/parts/debug/common/debug'; import { Model, RawObjectReplElement, Expression, SimpleReplElement, Variable } from 'vs/workbench/parts/debug/common/debugModel'; -import { renderVariable, renderExpressionValue, IVariableTemplateData, BaseDebugController } from 'vs/workbench/parts/debug/electron-browser/debugViewer'; +import { renderVariable, renderExpressionValue, IVariableTemplateData, BaseDebugController } from 'vs/workbench/parts/debug/electron-browser/baseDebugView'; import { ClearReplAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { CopyAction, CopyAllAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -298,34 +298,46 @@ export class ReplExpressionsRenderer implements IRenderer { if (text.charCodeAt(i) === 27) { let index = i; let chr = (++index < len ? text.charAt(index) : null); + let codes = []; if (chr && chr === '[') { let code: string = null; - chr = (++index < len ? text.charAt(index) : null); - - if (chr && chr >= '0' && chr <= '9') { - code = chr; + while (chr !== 'm' && codes.length <= 7) { chr = (++index < len ? text.charAt(index) : null); - } - if (chr && chr >= '0' && chr <= '9') { - code += chr; - chr = (++index < len ? text.charAt(index) : null); - } + if (chr && chr >= '0' && chr <= '9') { + code = chr; + chr = (++index < len ? text.charAt(index) : null); + } - if (code === null) { - code = '0'; + if (chr && chr >= '0' && chr <= '9') { + code += chr; + chr = (++index < len ? text.charAt(index) : null); + } + + if (code === null) { + code = '0'; + } + + codes.push(code); } if (chr === 'm') { // set text color/mode. - + code = null; // only respect text-foreground ranges and ignore the values for "black" & "white" because those // only make sense in combination with text-background ranges which we currently not support - let parsedMode = parseInt(code, 10); let token = document.createElement('span'); - if ((parsedMode >= 30 && parsedMode <= 37) || (parsedMode >= 90 && parsedMode <= 97)) { - token.className = 'code' + parsedMode; - } else if (parsedMode === 1) { - token.className = 'code-bold'; + token.className = ''; + while (codes.length > 0) { + code = codes.pop(); + let parsedMode = parseInt(code, 10); + if (token.className.length > 0) { + token.className += ' '; + } + if ((parsedMode >= 30 && parsedMode <= 37) || (parsedMode >= 90 && parsedMode <= 97)) { + token.className += 'code' + parsedMode; + } else if (parsedMode === 1) { + token.className += 'code-bold'; + } } // we need a tokens container now diff --git a/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts b/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts index d4b478ccb17a..25ca3cf7a4b7 100644 --- a/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts +++ b/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts @@ -102,7 +102,12 @@ export class TerminalSupport { } if (args.env) { for (let key in args.env) { - command += `$env:${key}='${args.env[key]}'; `; + const value = args.env[key]; + if (value === null) { + command += `Remove-Item env:${key}; `; + } else { + command += `\${env:${key}}='${value}'; `; + } } } if (args.args && args.args.length > 0) { @@ -127,7 +132,12 @@ export class TerminalSupport { if (args.env) { command += 'cmd /C "'; for (let key in args.env) { - command += `set "${key}=${args.env[key]}" && `; + const value = args.env[key]; + if (value === null) { + command += `set "${key}=" && `; + } else { + command += `set "${key}=${args.env[key]}" && `; + } } } for (let a of args.args) { @@ -151,7 +161,12 @@ export class TerminalSupport { if (args.env) { command += 'env'; for (let key in args.env) { - command += ` "${key}=${args.env[key]}"`; + const value = args.env[key]; + if (value === null) { + command += ` -u "${key}"`; + } else { + command += ` "${key}=${value}"`; + } } command += ' '; } diff --git a/src/vs/workbench/parts/debug/electron-browser/variablesView.ts b/src/vs/workbench/parts/debug/electron-browser/variablesView.ts new file mode 100644 index 000000000000..2ed48ab66cb3 --- /dev/null +++ b/src/vs/workbench/parts/debug/electron-browser/variablesView.ts @@ -0,0 +1,334 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { RunOnceScheduler, sequence } from 'vs/base/common/async'; +import * as dom from 'vs/base/browser/dom'; +import * as errors from 'vs/base/common/errors'; +import { prepareActions } from 'vs/workbench/browser/actions'; +import { IHighlightEvent, IActionProvider, ITree, IDataSource, IRenderer, IAccessibilityProvider } from 'vs/base/parts/tree/browser/tree'; +import { CollapseAction } from 'vs/workbench/browser/viewlet'; +import { TreeViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IDebugService, State, CONTEXT_VARIABLES_FOCUSED, IExpression } from 'vs/workbench/parts/debug/common/debug'; +import { Variable, Scope } from 'vs/workbench/parts/debug/common/debugModel'; +import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { once } from 'vs/base/common/event'; +import { twistiePixels, renderViewTree, IVariableTemplateData, BaseDebugController, renderRenameBox, renderVariable } from 'vs/workbench/parts/debug/electron-browser/baseDebugView'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IAction, IActionItem } from 'vs/base/common/actions'; +import { SetValueAction, AddToWatchExpressionsAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { CopyValueAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; +import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ViewModel } from 'vs/workbench/parts/debug/common/debugViewModel'; +import { equalsIgnoreCase } from 'vs/base/common/strings'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; + +const $ = dom.$; + +export class VariablesView extends TreeViewsViewletPanel { + + private static readonly MEMENTO = 'variablesview.memento'; + private onFocusStackFrameScheduler: RunOnceScheduler; + private settings: any; + private expandedElements: any[]; + private needsRefresh: boolean; + + constructor( + options: IViewletViewOptions, + @IContextMenuService contextMenuService: IContextMenuService, + @IDebugService private debugService: IDebugService, + @IKeybindingService keybindingService: IKeybindingService, + @IInstantiationService private instantiationService: IInstantiationService, + @IListService private listService: IListService, + @IContextKeyService private contextKeyService: IContextKeyService, + @IThemeService private themeService: IThemeService + ) { + super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('variablesSection', "Variables Section") }, keybindingService, contextMenuService); + + this.settings = options.viewletSettings; + this.expandedElements = []; + // Use scheduler to prevent unnecessary flashing + this.onFocusStackFrameScheduler = new RunOnceScheduler(() => { + // Remember expanded elements when there are some (otherwise don't override/erase the previous ones) + const expanded = this.tree.getExpandedElements(); + if (expanded.length > 0) { + this.expandedElements = expanded; + } + + // Always clear tree highlight to avoid ending up in a broken state #12203 + this.tree.clearHighlight(); + this.needsRefresh = false; + this.tree.refresh().then(() => { + const stackFrame = this.debugService.getViewModel().focusedStackFrame; + return sequence(this.expandedElements.map(e => () => this.tree.expand(e))).then(() => { + // If there is no preserved expansion state simply expand the first scope + if (stackFrame && this.tree.getExpandedElements().length === 0) { + return stackFrame.getScopes().then(scopes => { + if (scopes.length > 0 && !scopes[0].expensive) { + return this.tree.expand(scopes[0]); + } + return undefined; + }); + } + return undefined; + }); + }).done(null, errors.onUnexpectedError); + }, 400); + } + + public renderBody(container: HTMLElement): void { + dom.addClass(container, 'debug-variables'); + this.treeContainer = renderViewTree(container); + + this.tree = new WorkbenchTree(this.treeContainer, { + dataSource: new VariablesDataSource(), + renderer: this.instantiationService.createInstance(VariablesRenderer), + accessibilityProvider: new VariablesAccessibilityProvider(), + controller: this.instantiationService.createInstance(VariablesController, new VariablesActionProvider(this.debugService, this.keybindingService), MenuId.DebugVariablesContext) + }, { + ariaLabel: nls.localize('variablesAriaTreeLabel', "Debug Variables"), + twistiePixels, + keyboardSupport: false + }, this.contextKeyService, this.listService, this.themeService); + + CONTEXT_VARIABLES_FOCUSED.bindTo(this.tree.contextKeyService); + + const viewModel = this.debugService.getViewModel(); + + this.tree.setInput(viewModel); + + const collapseAction = new CollapseAction(this.tree, false, 'explorer-action collapse-explorer'); + this.toolbar.setActions(prepareActions([collapseAction]))(); + + this.disposables.push(viewModel.onDidFocusStackFrame(sf => { + if (!this.isVisible() || !this.isExpanded()) { + this.needsRefresh = true; + return; + } + + // Refresh the tree immediately if it is not visible. + // Otherwise postpone the refresh until user stops stepping. + if (!this.tree.getContentHeight() || sf.explicit) { + this.onFocusStackFrameScheduler.schedule(0); + } else { + this.onFocusStackFrameScheduler.schedule(); + } + })); + this.disposables.push(this.debugService.onDidChangeState(state => { + collapseAction.enabled = state === State.Running || state === State.Stopped; + })); + + this.disposables.push(this.debugService.getViewModel().onDidSelectExpression(expression => { + if (!expression || !(expression instanceof Variable)) { + return; + } + + this.tree.refresh(expression, false).then(() => { + this.tree.setHighlight(expression); + once(this.tree.onDidChangeHighlight)((e: IHighlightEvent) => { + if (!e.highlight) { + this.debugService.getViewModel().setSelectedExpression(null); + } + }); + }).done(null, errors.onUnexpectedError); + })); + } + + public setExpanded(expanded: boolean): void { + super.setExpanded(expanded); + if (expanded && this.needsRefresh) { + this.onFocusStackFrameScheduler.schedule(); + } + } + + public setVisible(visible: boolean): TPromise { + return super.setVisible(visible).then(() => { + if (visible && this.needsRefresh) { + this.onFocusStackFrameScheduler.schedule(); + } + }); + } + + public shutdown(): void { + this.settings[VariablesView.MEMENTO] = !this.isExpanded(); + super.shutdown(); + } +} + +class VariablesActionProvider implements IActionProvider { + + constructor(private debugService: IDebugService, private keybindingService: IKeybindingService) { + // noop + } + + public hasActions(tree: ITree, element: any): boolean { + return false; + } + + public getActions(tree: ITree, element: any): TPromise { + return TPromise.as([]); + } + + public hasSecondaryActions(tree: ITree, element: any): boolean { + // Only show context menu on "real" variables. Not on array chunk nodes. + return element instanceof Variable && !!element.value; + } + + public getSecondaryActions(tree: ITree, element: any): TPromise { + const actions: IAction[] = []; + const variable = element; + actions.push(new SetValueAction(SetValueAction.ID, SetValueAction.LABEL, variable, this.debugService, this.keybindingService)); + actions.push(new CopyValueAction(CopyValueAction.ID, CopyValueAction.LABEL, variable, this.debugService)); + actions.push(new Separator()); + actions.push(new AddToWatchExpressionsAction(AddToWatchExpressionsAction.ID, AddToWatchExpressionsAction.LABEL, variable, this.debugService, this.keybindingService)); + + return TPromise.as(actions); + } + + public getActionItem(tree: ITree, element: any, action: IAction): IActionItem { + return null; + } +} + +export class VariablesDataSource implements IDataSource { + + public getId(tree: ITree, element: any): string { + return element.getId(); + } + + public hasChildren(tree: ITree, element: any): boolean { + if (element instanceof ViewModel || element instanceof Scope) { + return true; + } + + let variable = element; + return variable.hasChildren && !equalsIgnoreCase(variable.value, 'null'); + } + + public getChildren(tree: ITree, element: any): TPromise { + if (element instanceof ViewModel) { + const focusedStackFrame = (element).focusedStackFrame; + return focusedStackFrame ? focusedStackFrame.getScopes() : TPromise.as([]); + } + + let scope = element; + return scope.getChildren(); + } + + public getParent(tree: ITree, element: any): TPromise { + return TPromise.as(null); + } +} + +interface IScopeTemplateData { + name: HTMLElement; +} + +export class VariablesRenderer implements IRenderer { + + private static readonly SCOPE_TEMPLATE_ID = 'scope'; + private static readonly VARIABLE_TEMPLATE_ID = 'variable'; + + constructor( + @IDebugService private debugService: IDebugService, + @IContextViewService private contextViewService: IContextViewService, + @IThemeService private themeService: IThemeService + ) { + // noop + } + + public getHeight(tree: ITree, element: any): number { + return 22; + } + + public getTemplateId(tree: ITree, element: any): string { + if (element instanceof Scope) { + return VariablesRenderer.SCOPE_TEMPLATE_ID; + } + if (element instanceof Variable) { + return VariablesRenderer.VARIABLE_TEMPLATE_ID; + } + + return null; + } + + public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { + if (templateId === VariablesRenderer.SCOPE_TEMPLATE_ID) { + let data: IScopeTemplateData = Object.create(null); + data.name = dom.append(container, $('.scope')); + + return data; + } + + let data: IVariableTemplateData = Object.create(null); + data.expression = dom.append(container, $('.expression')); + data.name = dom.append(data.expression, $('span.name')); + data.value = dom.append(data.expression, $('span.value')); + + return data; + } + + public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { + if (templateId === VariablesRenderer.SCOPE_TEMPLATE_ID) { + this.renderScope(element, templateData); + } else { + const variable = element; + if (variable === this.debugService.getViewModel().getSelectedExpression() || variable.errorMessage) { + renderRenameBox(this.debugService, this.contextViewService, this.themeService, tree, variable, (templateData).expression, { + initialValue: variable.value, + ariaLabel: nls.localize('variableValueAriaLabel', "Type new variable value"), + validationOptions: { + validation: (value: string) => variable.errorMessage ? ({ content: variable.errorMessage }) : null + } + }); + } else { + renderVariable(tree, variable, templateData, true); + } + } + } + + private renderScope(scope: Scope, data: IScopeTemplateData): void { + data.name.textContent = scope.name; + } + + public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { + // noop + } +} + +class VariablesAccessibilityProvider implements IAccessibilityProvider { + + public getAriaLabel(tree: ITree, element: any): string { + if (element instanceof Scope) { + return nls.localize('variableScopeAriaLabel', "Scope {0}, variables, debug", (element).name); + } + if (element instanceof Variable) { + return nls.localize('variableAriaLabel', "{0} value {1}, variables, debug", (element).name, (element).value); + } + + return null; + } +} + +class VariablesController extends BaseDebugController { + + protected onLeftClick(tree: ITree, element: any, event: IMouseEvent): boolean { + // double click on primitive value: open input box to be able to set the value + const process = this.debugService.getViewModel().focusedProcess; + if (element instanceof Variable && event.detail === 2 && process && process.session.capabilities.supportsSetVariable) { + const expression = element; + this.debugService.getViewModel().setSelectedExpression(expression); + return true; + } + + return super.onLeftClick(tree, element, event); + } +} diff --git a/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts b/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts new file mode 100644 index 000000000000..aba0c419a6dc --- /dev/null +++ b/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts @@ -0,0 +1,395 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import * as dom from 'vs/base/browser/dom'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { TPromise } from 'vs/base/common/winjs.base'; +import * as errors from 'vs/base/common/errors'; +import { prepareActions } from 'vs/workbench/browser/actions'; +import { IHighlightEvent, IActionProvider, ITree, IDataSource, IRenderer, IAccessibilityProvider, IDragAndDropData, IDragOverReaction, DRAG_OVER_REJECT } from 'vs/base/parts/tree/browser/tree'; +import { CollapseAction } from 'vs/workbench/browser/viewlet'; +import { TreeViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IDebugService, IExpression, CONTEXT_WATCH_EXPRESSIONS_FOCUSED } from 'vs/workbench/parts/debug/common/debug'; +import { Expression, Variable, Model } from 'vs/workbench/parts/debug/common/debugModel'; +import { AddWatchExpressionAction, RemoveAllWatchExpressionsAction, EditWatchExpressionAction, RemoveWatchExpressionAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { once } from 'vs/base/common/event'; +import { IAction, IActionItem } from 'vs/base/common/actions'; +import { CopyValueAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; +import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; +import { equalsIgnoreCase } from 'vs/base/common/strings'; +import { IMouseEvent, DragMouseEvent } from 'vs/base/browser/mouseEvent'; +import { DefaultDragAndDrop } from 'vs/base/parts/tree/browser/treeDefaults'; +import { IVariableTemplateData, renderVariable, renderRenameBox, renderExpressionValue, BaseDebugController, twistiePixels, renderViewTree } from 'vs/workbench/parts/debug/electron-browser/baseDebugView'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; + +const $ = dom.$; +const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024; + +export class WatchExpressionsView extends TreeViewsViewletPanel { + + private static readonly MEMENTO = 'watchexpressionsview.memento'; + private onWatchExpressionsUpdatedScheduler: RunOnceScheduler; + private toReveal: IExpression; + private settings: any; + private needsRefresh: boolean; + + constructor( + options: IViewletViewOptions, + @IContextMenuService contextMenuService: IContextMenuService, + @IDebugService private debugService: IDebugService, + @IKeybindingService keybindingService: IKeybindingService, + @IContextKeyService private contextKeyService: IContextKeyService, + @IListService private listService: IListService, + @IInstantiationService private instantiationService: IInstantiationService, + @IThemeService private themeService: IThemeService + ) { + super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('expressionsSection', "Expressions Section") }, keybindingService, contextMenuService); + this.settings = options.viewletSettings; + + this.disposables.push(this.debugService.getModel().onDidChangeWatchExpressions(we => { + // only expand when a new watch expression is added. + if (we instanceof Expression) { + this.setExpanded(true); + } + })); + + this.onWatchExpressionsUpdatedScheduler = new RunOnceScheduler(() => { + this.needsRefresh = false; + this.tree.refresh().done(() => { + return this.toReveal instanceof Expression ? this.tree.reveal(this.toReveal) : TPromise.as(true); + }, errors.onUnexpectedError); + }, 50); + } + + public renderBody(container: HTMLElement): void { + dom.addClass(container, 'debug-watch'); + this.treeContainer = renderViewTree(container); + + const actionProvider = new WatchExpressionsActionProvider(this.debugService, this.keybindingService); + this.tree = new WorkbenchTree(this.treeContainer, { + dataSource: new WatchExpressionsDataSource(), + renderer: this.instantiationService.createInstance(WatchExpressionsRenderer), + accessibilityProvider: new WatchExpressionsAccessibilityProvider(), + controller: this.instantiationService.createInstance(WatchExpressionsController, actionProvider, MenuId.DebugWatchContext), + dnd: new WatchExpressionsDragAndDrop(this.debugService) + }, { + ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'watchAriaTreeLabel' }, "Debug Watch Expressions"), + twistiePixels, + keyboardSupport: false + }, this.contextKeyService, this.listService, this.themeService); + + CONTEXT_WATCH_EXPRESSIONS_FOCUSED.bindTo(this.tree.contextKeyService); + + this.tree.setInput(this.debugService.getModel()); + + const addWatchExpressionAction = new AddWatchExpressionAction(AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL, this.debugService, this.keybindingService); + const collapseAction = new CollapseAction(this.tree, true, 'explorer-action collapse-explorer'); + const removeAllWatchExpressionsAction = new RemoveAllWatchExpressionsAction(RemoveAllWatchExpressionsAction.ID, RemoveAllWatchExpressionsAction.LABEL, this.debugService, this.keybindingService); + this.toolbar.setActions(prepareActions([addWatchExpressionAction, collapseAction, removeAllWatchExpressionsAction]))(); + + this.disposables.push(this.debugService.getModel().onDidChangeWatchExpressions(we => { + if (!this.isExpanded() || !this.isVisible()) { + this.needsRefresh = true; + return; + } + + if (!this.onWatchExpressionsUpdatedScheduler.isScheduled()) { + this.onWatchExpressionsUpdatedScheduler.schedule(); + } + this.toReveal = we; + })); + + this.disposables.push(this.debugService.getViewModel().onDidSelectExpression(expression => { + if (!expression || !(expression instanceof Expression)) { + return; + } + + this.tree.refresh(expression, false).then(() => { + this.tree.setHighlight(expression); + once(this.tree.onDidChangeHighlight)((e: IHighlightEvent) => { + if (!e.highlight) { + this.debugService.getViewModel().setSelectedExpression(null); + } + }); + }).done(null, errors.onUnexpectedError); + })); + } + + public setExpanded(expanded: boolean): void { + super.setExpanded(expanded); + if (expanded && this.needsRefresh) { + this.onWatchExpressionsUpdatedScheduler.schedule(); + } + } + + public setVisible(visible: boolean): TPromise { + return super.setVisible(visible).then(() => { + if (visible && this.needsRefresh) { + this.onWatchExpressionsUpdatedScheduler.schedule(); + } + }); + } + + public shutdown(): void { + this.settings[WatchExpressionsView.MEMENTO] = !this.isExpanded(); + super.shutdown(); + } +} + + +class WatchExpressionsActionProvider implements IActionProvider { + + constructor(private debugService: IDebugService, private keybindingService: IKeybindingService) { + // noop + } + + public hasActions(tree: ITree, element: any): boolean { + return element instanceof Expression && !!element.name; + } + + public hasSecondaryActions(tree: ITree, element: any): boolean { + return true; + } + + public getActions(tree: ITree, element: any): TPromise { + return TPromise.as([]); + } + + public getSecondaryActions(tree: ITree, element: any): TPromise { + const actions: IAction[] = []; + if (element instanceof Expression) { + const expression = element; + actions.push(new AddWatchExpressionAction(AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new EditWatchExpressionAction(EditWatchExpressionAction.ID, EditWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); + if (!expression.hasChildren) { + actions.push(new CopyValueAction(CopyValueAction.ID, CopyValueAction.LABEL, expression.value, this.debugService)); + } + actions.push(new Separator()); + + actions.push(new RemoveWatchExpressionAction(RemoveWatchExpressionAction.ID, RemoveWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new RemoveAllWatchExpressionsAction(RemoveAllWatchExpressionsAction.ID, RemoveAllWatchExpressionsAction.LABEL, this.debugService, this.keybindingService)); + } else { + actions.push(new AddWatchExpressionAction(AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); + if (element instanceof Variable) { + const variable = element; + if (!variable.hasChildren) { + actions.push(new CopyValueAction(CopyValueAction.ID, CopyValueAction.LABEL, variable.value, this.debugService)); + } + actions.push(new Separator()); + } + actions.push(new RemoveAllWatchExpressionsAction(RemoveAllWatchExpressionsAction.ID, RemoveAllWatchExpressionsAction.LABEL, this.debugService, this.keybindingService)); + } + + return TPromise.as(actions); + } + + public getActionItem(tree: ITree, element: any, action: IAction): IActionItem { + return null; + } +} + +class WatchExpressionsDataSource implements IDataSource { + + public getId(tree: ITree, element: any): string { + return element.getId(); + } + + public hasChildren(tree: ITree, element: any): boolean { + if (element instanceof Model) { + return true; + } + + const watchExpression = element; + return watchExpression.hasChildren && !equalsIgnoreCase(watchExpression.value, 'null'); + } + + public getChildren(tree: ITree, element: any): TPromise { + if (element instanceof Model) { + return TPromise.as((element).getWatchExpressions()); + } + + let expression = element; + return expression.getChildren(); + } + + public getParent(tree: ITree, element: any): TPromise { + return TPromise.as(null); + } +} + +interface IWatchExpressionTemplateData { + watchExpression: HTMLElement; + expression: HTMLElement; + name: HTMLSpanElement; + value: HTMLSpanElement; +} + +class WatchExpressionsRenderer implements IRenderer { + + private static readonly WATCH_EXPRESSION_TEMPLATE_ID = 'watchExpression'; + private static readonly VARIABLE_TEMPLATE_ID = 'variables'; + private toDispose: IDisposable[]; + + constructor( + @IDebugService private debugService: IDebugService, + @IContextViewService private contextViewService: IContextViewService, + @IThemeService private themeService: IThemeService + ) { + this.toDispose = []; + } + + public getHeight(tree: ITree, element: any): number { + return 22; + } + + public getTemplateId(tree: ITree, element: any): string { + if (element instanceof Expression) { + return WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID; + } + + return WatchExpressionsRenderer.VARIABLE_TEMPLATE_ID; + } + + public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { + const createVariableTemplate = ((data: IVariableTemplateData, container: HTMLElement) => { + data.expression = dom.append(container, $('.expression')); + data.name = dom.append(data.expression, $('span.name')); + data.value = dom.append(data.expression, $('span.value')); + }); + + if (templateId === WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID) { + const data: IWatchExpressionTemplateData = Object.create(null); + data.watchExpression = dom.append(container, $('.watch-expression')); + createVariableTemplate(data, data.watchExpression); + + return data; + } + + const data: IVariableTemplateData = Object.create(null); + createVariableTemplate(data, container); + + return data; + } + + public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { + if (templateId === WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID) { + this.renderWatchExpression(tree, element, templateData); + } else { + renderVariable(tree, element, templateData, true); + } + } + + private renderWatchExpression(tree: ITree, watchExpression: IExpression, data: IWatchExpressionTemplateData): void { + let selectedExpression = this.debugService.getViewModel().getSelectedExpression(); + if ((selectedExpression instanceof Expression && selectedExpression.getId() === watchExpression.getId()) || (watchExpression instanceof Expression && !watchExpression.name)) { + renderRenameBox(this.debugService, this.contextViewService, this.themeService, tree, watchExpression, data.expression, { + initialValue: watchExpression.name, + placeholder: nls.localize('watchExpressionPlaceholder', "Expression to watch"), + ariaLabel: nls.localize('watchExpressionInputAriaLabel', "Type watch expression") + }); + } + + data.name.textContent = watchExpression.name; + if (watchExpression.value) { + data.name.textContent += ':'; + renderExpressionValue(watchExpression, data.value, { + showChanged: true, + maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET, + preserveWhitespace: false, + showHover: true, + colorize: true + }); + data.name.title = watchExpression.type ? watchExpression.type : watchExpression.value; + } + } + + public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { + // noop + } + + public dispose(): void { + this.toDispose = dispose(this.toDispose); + } +} + +class WatchExpressionsAccessibilityProvider implements IAccessibilityProvider { + + public getAriaLabel(tree: ITree, element: any): string { + if (element instanceof Expression) { + return nls.localize('watchExpressionAriaLabel', "{0} value {1}, watch, debug", (element).name, (element).value); + } + if (element instanceof Variable) { + return nls.localize('watchVariableAriaLabel', "{0} value {1}, watch, debug", (element).name, (element).value); + } + + return null; + } +} + +class WatchExpressionsController extends BaseDebugController { + + protected onLeftClick(tree: ITree, element: any, event: IMouseEvent): boolean { + // double click on primitive value: open input box to be able to select and copy value. + if (element instanceof Expression && event.detail === 2) { + const expression = element; + this.debugService.getViewModel().setSelectedExpression(expression); + return true; + } + + return super.onLeftClick(tree, element, event); + } +} + +class WatchExpressionsDragAndDrop extends DefaultDragAndDrop { + + constructor(private debugService: IDebugService) { + super(); + } + + public getDragURI(tree: ITree, element: Expression): string { + if (!(element instanceof Expression)) { + return null; + } + + return element.getId(); + } + + public getDragLabel(tree: ITree, elements: Expression[]): string { + if (elements.length > 1) { + return String(elements.length); + } + + return elements[0].name; + } + + public onDragOver(tree: ITree, data: IDragAndDropData, target: Expression | Model, originalEvent: DragMouseEvent): IDragOverReaction { + if (target instanceof Expression || target instanceof Model) { + return { + accept: true, + autoExpand: false + }; + } + + return DRAG_OVER_REJECT; + } + + public drop(tree: ITree, data: IDragAndDropData, target: Expression | Model, originalEvent: DragMouseEvent): void { + const draggedData = data.getData(); + if (Array.isArray(draggedData)) { + const draggedElement = draggedData[0]; + const watches = this.debugService.getModel().getWatchExpressions(); + const position = target instanceof Model ? watches.length - 1 : watches.indexOf(target); + this.debugService.moveWatchExpression(draggedElement.getId(), position); + } + } +} diff --git a/src/vs/workbench/parts/execution/electron-browser/TerminalHelper.scpt b/src/vs/workbench/parts/execution/electron-browser/TerminalHelper.scpt index 98d4f76d3aaffd854714ab3c66851597bb2d4f6c..1130091f6000e2e47167d1ac3054fbbdad827578 100644 GIT binary patch literal 15672 zcmeHucYIYv)Bns#Xy>qj3rH_l6a?uC7DTB*5H%Kf5Eb!~+&~~Cc<-etDi%=028xP} zu7VX26g!9oJBTP2#6l75z3%+Jb2iD1JRv;q=l6a-@B7Ca*vUCtW@o4Eo|#SmSTb)& z?=z!aI(F%-C5wnMYl#q(M;VLWp7h6Hk5V z_zwR+KbU~Bs54+u+BOOAQD}tf$@oyxsue2rC^RGyj&$`&)F&}Q^+4N7bxV8Zp)DW(R8!)>t-6_@ z33$?0)jmguVu;expJ&Ugj&$#5=!H+ zsx${CfGW4{RLCz~rK?NxHwm7ML%r50AJXgFms`sHiNKRv&IXenH3cnEI@kbsV^q<| zlV7N108pnhRV$1oQ>oMx_b@m$#ZXJ)abZ7}pMCk6GW~JMqEQ|l3`B>}p#~sCltESG zCu$V{H0?|^6%n*A4=R}F-iC&61N#|j`aLb2NI|Gn0uw>-7)Ly>v9A(w8qw7H{atG$p$O*-f>UGoS`PXdN1m20Kyrtc~PG%*cfK$tDYV2z0)&%5y%%*volqX z7fl>7F_uUw)jd)AQMLgH1yP%7%jfc$e9H2<%HT5vpK8x+l>T(00jM$zf~ZZ8&;Z#^ z1L-9B#K0|thl%ENKMnF|5IUbsrx<{c)aG<3ok}?d0Mk^V<}ioTWSe|!=rr<*fKF>p zr!x$I*A?$AsHJ>FXZiq{es1x|F^0}`Yk}3thk<-ZRXP(xX$_s>8k$oJ`5=%F$|)bq zHeJBS+AAl`imicc4Tr~cWv8GFrXdC(%ql&lrL`^>;d6yT|fkmDh42wQWrWJ&K|NTAntA)bwb?b85+0_y=I zxPTG{Ae^QL9WSp0@=97@3CF?XVR*?bY%UO3DuRte1s3zL_j%Y~CK`ZHa($pklRRwJ z9yTa={>hG)edt7-jxI6)q2&6&q^8ov1|Xcb5A~Io19>^U?u*^LeW{LVl)Mk3E9goC5Y9e;2FeS8 zyilnRGIXUQ2}V!TvuL`qVn&2!VDhM;%blnP!G^D*s|`S?Bsp}ttn+1EnUY-Xlw=U) z&`en?&l{RqIx>f@p;-nXRFab^N1mf=eSlIWxz>?;3Y{v?2J&nv0}Rb_4TI=pc_xr& z{-GpmRY{&#C7G7y-_wCSUFm8)S+Dvs5#>6%-T;L9G87tg1Knr zjgCp`8D?kEY-Q4%2+axgCGOGnKzI|~Yyd)i84gXH>(N|P-$J($x6>U4Ae?tNohMHQ@?@F?cer`aqY<(uL)NIi%uBELi9ntx?d#F4nC(t^+|ZqF zwpWWH4==Ek?lAzNhK!*?S>?;BG7Y)MX-Gc&$-VNJtTc3Q>Bup3A1yNgp@xj2 zG4d!a_W?>ZWVs`7G!@8-KvtA4*}zwal;_hZc_ffW{-Gg{sfMgn4Y@nbv4;bBc%Suo z^0?~6%_#TN0|p?}i3F_uL3+plgmWY)DGvqmP+BJ*a%@RLogU7jhm|dlM6iXb51HW6 z13BNO}F+D+R3_v(9{EIvo$b;!c zLkslSc@a&O2QuUV)rrT`E4)9D`%C+Jv1LY-BA%kB4M3;^)96}yhMqM5 zCGXSeIeOjzgtJeh%Vb#~%l6@!q30bDm%)9k&7!rs_;nFlhgd*Vm#>=ftds9_*zpSl zH}-VK!;u|9XXR;qL&Ros2MZhTb9x*K0v8vyyD1& zZ;~Z}EGb>Mp_g65bebWH16lkJ&A3-J;~v$Fr_+2}6v(1|R_V!d)r?0`HqfgEAk>W6 zFz46kbpsIcXg1A}g@G(gYsTx2Idk9u-pHailsRuk=*>_w@KN5Xq>l_hD2@fR zSmx2kK0v8BK6bOgtH^DE+*Uf9p^sbx+>hKE$gTen#~mt;+f^J})5P8q$SoBe^yN;7 zL>B0fcU3q;QMSokL)(;WkCxMNxmj+KIV?A8r<)Ya(J^z00vvA3j+g@-v+7bknVlhU z=>|Jsxb%AXg8xKrlp73vq909+;6o$1p0>+%K7KXqm|L8P=N6^n`k@3%#82&#kEZQz z1&CP4wSin)Zk?W7r=;Ad;06VsDETL%d`h1gfROwZv_fXdH8PWBmUg;E!A$M>8OrDM zg#ie)V+9<<4%%q|LU*tN4rNys?NVji9iiRI&z)(0ULDBQRIM{*sC|xJr*G*y0}%R|=javso_;U@CGYF$NBYSCgsXWDuH@$|`dL@=ON4&GXDqfS z^(sF(TGr7Eaz!9lR7A@U4##>pfnT%eSHWh`rUo)~ABSTYSk_ym9VOqz@t+bOfIMZ;3>UqEEO+7T3^O{0RGCvIdVP8m{WbZl_P> z!ay$kH!?HRESwSuVj^XVC6_2;E>_0;MIHxS({SKexR>_IWSJxrSte_zNeVQaz%@|} zXBn7a$ilr?crC6i6C`E0mSf>w`i>)9$8f~Wt;(7VBw6Ws&u|^L)UW7UuA9Ymb*c3t zTn`N8+K!<=(qDWK*Ef8SW8jbU8#myFh8wtvexzR{5lAAvNW%?X(=YU^ToA|w2cV&T znp@)o8J|Yv$pqy=N_mil(uf-yZWMBh@gv1jB;)W)JK>9(1yb|4F-j9|YPbn`IjCh` z#m%_6;b!4>0_i`-Ej(_4Zc#qiaMU5J#?_=y#>yBLM0!||C}0_*2obO1mVAiemLW%g zpfMlHtqddTgfBR}*XP!Jm|+B;24Ylot}g}LMn(rxK&?AdBp>msqT-^F6OvO9Axp(Z zx~fx)i~67nv9iIjksc!;#cla;!)-%;0F9ARfs8spP|V}QF|eKF8%D%Qc>$?PJdk*W zVL4Cou_hU<5^u0aB~?E z$cX(CV7P0jv)r5ymh*f;6v5Z%oWZ$T50c!9dvG_8yJ7O9_-MmNDVdDwRx+HA;bU2b z6V>En5D~9c8i_3lz``mii;q<+=pNzj2+?SqxO^=2ACXg!kH#d&aSy}Cl}^%;kLMG( zr{UwBva|vRdU0>Vy&To8xV4=)sF zh?hq3(WUY1(ujKu?@@Abh8fNd)Nt2Q6u#NQK2Hqc|la`_}4WH>yuF!$u1aweb5r?8x<;y)SbhkDW6 zL_C&?M~mW<%7XAt2ToBAof_d&5!;GlZ&fYOjFiUDivTBuJlaPa5Ch~KKFx5BlYLK6 za5|r1_;l5dDxjf1pDAa^>4wjATttnW#)Botm(wcc;$X*>p4>-H4dm1`7d=rQCub-) zUDq3L1mXK;*18jd;BJC)Cn{=W2A)5CHM zk8}bU#HUJjAldt6E6V_7+leZQ5ouBM3#4Dg{+Ne@*j&ytoa=}k#-ljSaOZKiy$nO^ zC?0Kil-pj;=3ME^1=1&wz7*+9rX<#1oIgTcHLw++j1l;pF^=f7d4%)|q*uiRNN+Wv zK1wil1>F!JSi|{g;(G?t(=B*(+)aiJVRU?Gn3nN457UihnC@8T=1222JdTUx1UcT| zAf;zz9?ix0H{QUuL-QWZW2HwRJ@$*%@ObAi#{$!Fz8qKP=8GJg518Ef~WEX#vyKkV`q}5%CS62jtS)0irF~{>zgdt zNhUkmlXyESkfZj)&ZCu`$0$2-cvE&JIB7VMW@ooRx*cd!7iF3ty6&-><`llr@DyjJ zvv`(tl_TW{maf|ANCih|&kIp5k}ifXa)OuzS2&d~md=7bc&Zb`EWVyE;Y$r);ubTD zua%C0bgbZG((t8D1lRI)(!rMwU}gB#!U)sqPCJ_);%OdF!?c(2<%SVxMPdlmxAPTz zrQs{w@Yy^^+WXS}A6wp)q14n(@pPVHc)F9?T%ITGd}*h4mzN7^&TwST;kj~nAcybQ z?mR{;mapQg4PWKRxPzDQOuokOOh?8Ye5bVarELir`LRNX1z}gs#V8rzgki)~b?2SW zi=~Y(Z9+1VP+J#-a1iXuau~?5M<(`+Ovg%=Gy&W zHO=NuCzvz&wpx4}&!`?M!GAmG%fPR(E(x)E?#ZS%B8x$Rpey(&x z#f^%ie2aVcqq+E|D)&=kNUET)K(BXzH`KaQ_uk{j7Z#MRqD&*rV&vA?5LPD#O>QJU+rL8VFG7^|&d@JiguVJSWK2yjq$` zQ)$A|Ol8CEDaT10|oWbQyKwKTXdh#3k=T>yDPWkAgL#HSq{>k_&jE*tB4n%EaXLo7m|m> zEUs1=Ud&4X!p$WdSqBav5=fo@!l&R;puLChHGEHK6Cs+~fz%FnoLI>gTrF0*0V7ku z_em|o_ocgM1(Kz4iOd*|FM#;U^rV(9F{1jvB=q1wJd&4rybK7I^ZkaGho8)-9>EXr zgN7fVjI;2TN$2rHV)$Xhi0Z@j;}X#@e#GNPFmMGwY7jySqi*%739sbG3?q!MMqeM- zi&pV!!>dB0$9)7zxTwCIj<4MsON>P{Z)!E_BiqbUy*dUR45z6Ya9n#(hz=HGWi+92&yXwyV7a=tjEX#@N@jU z;pZF&yV9||me(0x>p0kzj^-D5z2TDdfaaewe8CNvl7s1bM+Po;h!==Q4Lg%x!a+R_ zmOf)AF}yC#I}Q+V!%dN@V3%r${#G5~=Rwem0u_1DajZM&e2HJSVy$6h8v29w?sOu* z!W#^~q6Sh0@5l42_HX-_;a43`wdOT`-Ec_~0QW-dpMm|ef+-CnAE10cj(XTX0{h24 zYRmR-*qg=eJ;NK^e7z`}->|>i-weN@#~P2c=1qRf@SBcpy{Iq0%^MBB?G&#!^|inH z_E)e?!!U+7x;cAMZ~IGNf2ovh$U|s65Ls#avu}SccaCBEyVCZX(uR}@ybyxqC-Wx5 zn;ia=XpsFWus>CT-?Q+0Y^~ZR#s`vFNoT{zM5$%r(gnZ6n+?B1`sIrc`8M`P-|Cep zjo298>k9Jd4esFrJ9maL&-1)90G^nCa*@m{T}}@c`gjmFp`4GF(Bl3 zYw^4Px4r(a*>f2dWYyH6;>HJW_jo%He9E60{vSNyeM zWNp+2+fY0HhQBq8><$j0I5)JjJAAt%v_TCTeCyVL`-b+5zl-2WOk_ZckZ4-3ckhttyja1MVO{?iEzw>s?> z-)<>$bMLA1Lf)SL;=c|5Rd(#R@7m4w9k%bPu5MQFj`l>_5*s#ld7JLJ(Y|fpV!Kg0 zy{+IaRqaiB;T;~cR&C0l`u0u63C+IYvFCXi_I3LjZpZeaU0$YF#lC7c*jMb!_9gqG zU2k7t`zG?{EL6{~vuo}1_Bs2kea1d*pR!NdHTDVnxLs{m*~jck`>0)EAF&Syc3p)b zslcv1K)A`b&sTESIk3^E`{*vDO4>E}YZFecm8DzsG!9#gPV!J`URD0oD{!;mI~$t%375w9x# zWTI0^bfpvGFB-2-;;w3EIx54yk=Y{)pZ?Wq+lR0zJZK;As(IDz{XSkB?)Or8U>_`h zBf>ra1@NjtiSLGK#deWhNW<*{5Hy`; z<6_FgxP$Zt?XvT6XW&<)L~C$ezRlik@3ME=JM8Utp1sZ9YHzV~?alTkJIA+r|44&< zfxWjv$=y?tS=KkI>2i5VoD5O*jSXidK+LdWr_8` z-u++D(YyAmBEG$|#3}gp4m@ez&9}GXNwZVFomWYg#<#cW2z*Ti_STB6;FkUBpKs@4 zuznQ#_GU$c=%;UQ3ZIhWeT%!4VVo>t@8_qsXK&2ep1mpO^X$zzJF>UrG@$uo7mUGQ ztc@Mrlz74Jg`Kju=4{x5KR>CvaBTDJ6**e9w|(}eVN|@~D^xdd)$6}*S?2jLtdjoSb1YE+;(2(-<|wh^F!Iv3dLcr~}p(crC0+(P1SzF_2ZTNIp`~Hp*LvqH{ z$~mo8mglKgn9WP8AwLSd#BEM^|v{%^6?PYeFz0_V}FSb+dMZVQ5Rr>Ae+bi%iwm28Ydb!rYefajW zO5Myf^mCSXDW3H6*|(R3PpK)sy%p>rG1u){y? zaL#9+L&Y-3j>grKMLXJOugqDz0A_Ja13F^S&ho99OLn!-UX`jrSE!7n@nQf&Hj}OV&Qwv&?p;~hxe{84N$zDy**hzuCup%duWpOb+(@ylVGVDa+ zEH4Y1Z6^eF!aid3>||8~&}&mRX%qH>z^3-;6WHW`AnHV=qP(C&Q5yW2?eBKHEw)8= zoGr9tEyOe)Y;{5`#*-6bk=BJm99O9j3(?Ps4r$2H3;T8qp7c95Vkgl+h^bEl>iJJG z;TBVyg*(cN##^+rOmNi}mI-9HN@e4aoL#kQ`Sx|-)y>hz0nR;Td6~rZJO~PZciPaa zZ42z^EUz|YHo`VL%I4d+Z%3i8t}esoXZG-I9C4(v`H68(^9sI^@*{&!C(mOECF1PoKb@42$eB+gJ6JvO&Qs3SL(5l7bf%;Br6P7l>l` PYfLCb%|Etnd+`4O(TH8~ literal 14736 zcmeHO2b5IBwms(#$$P088jvKRMNyC}U_gA52H}AYDu}3v%}fsr3^Ul>fMCLe@fk3n zm`LV;fQk_XOemrt5)6nSNHB+I!a9GSThr6P8;1AR|7-pA*ZQq>rf%K3Rj2j|RduT9 z6H68h?r}!6W4n$WG-VS}l^hXb@+gauA%i@RLAm~_cvJ;%s!}xrl2wd%_=%7WQ5M3brQ|JHvVRRcFZ1qP&ixPM`ohUG6EZcXY=U8B89 z$4yEUjU1JVw(Qj^dP-4#qBL1rm_m7CTxlYfDk?2$7wu7891SZaqltJjo|q6XXy?WX zjOSB!1fxz-6!?|WIGRKWDx#4zDlBV>(pGqP3d-{Frj(LMh2`}V_@Wf$F_aV`S3>Pj zy9X8Hzvvz8-l>AP3b1+gps&7Ebf%%OZP(zmA6qp7;aCkH| zDjqE?EiNvdSX44HnwnS|9hWE_7f+;$;>l<%5sxCDEJ~*01<{zQMlxDZR9F~K#7k1q z#Q2hAw6qXy6eXjB;)$_EC9&eZ@nU=uP39+x#-)_OY-*^`HHuIpS_~PcpcircErhI9 z#-%h7axa0t=(~w{jzS|;PsW9kR;^H}N1-8!@Jm;oM0pZls2=FMv~Fq50=z54f2t{Q zw5__Cpz+A*Th%_thqe%tt*!GG$n$AuTGIP?{f_TGAobR1s?yp=NYp z8K-erRR)3a;L43V72>6%bY&TQlfYyw%C$ss$c%4av=sdbXeWOU8%%oC7`#O3Py^zP zRz)LE{z=UPklG!ndT}h7N~I>b%%IdHL(PfDhV@u}@#Pn);*U+1jP&SGG;|mpZa~6@ zvZ$*3Of3SC#vQ1pHU#Y}fC?74ry=1}zutygxF)lxiu~luPvuP>jwX+wBMk`T;LPAh z`9Z#C`B5$42PNOD861h!l3E!MuL#^#gIhj|S{sn8eq~>NM{VR=U%sOT?PBo>snXcE zaV6u6i;1S-gInk*{0y}rE)7RV@=YM$P>l{$C6*XDL1Fn;C!5w~lMUZPZ9TYs500$8 z0V(J3YuP0`S-w{0b}8AZ9JWX5KphQ;mk4{vqNAyk0V&6Ghc7$I25+cShLi1qY^PcP z(E&I-Rg@}@Yoi^JI#U+|5;j@|v)eIrtN{rdtpXW*<;z#)jUJn6bXy?XD5nDj6H60g z;1-4#6oD^~x*#1##~YBa%^GmNUFie^61G_b(00qFZmPT|M(9KZ<%CSLTLaljjnFJS z%*aG+EWk^aKlH$ZN5`XwztKqsBP1> zRI>xsh?h(lJ|UJ!D%U3=^`=|{5(=Ug)sii;S-xP|qB7X5W|6;=oAAIvf7jmr&B4ZY;1m`6Q4}sA>mdD6OH>-HWEwOg;|e z<2{s*Wup$@Gp&`Efnq}-8^X_HI>O>(}d)tks%>k%ql&R45-9%mHC<9l->aDh4E!Qb#%#&K|NT zBJPOZyU?-nzAx`XM#)s-0z;#nd^_UJ7+ERr85)!RvJ0k-u?8fR@6psnR#1r#l9q3Y zPTQTafHcs3HIPXiJP ztQ(Br0!kQ=u$yjlqP!i*+Zll+9D*mp@RHe>Tp+Mi1QUk}EaqYE^Dw_mFd(7idP0#V zdYG&|Oi=Lr7dk9^(#cpIU1UH)$@PRuT}+o4kg(sL)Jxt9dVq{CAroq zNq@?t>tu<%X6U-~mwB+L8w^OOBm*c4{NT@Hvpow>QbO(y>r0E7Ew7p?4@w@15 z0}|@XFt~sjbdLcE`yEE-$%}!!n1SFP*Y9~WTwchM7gS&F&W!i@K%P(6^=LYJyH^$& zy4UrV4<_!T`wd8_ANjDl2WX}NDSIxYSv1>#guUlefjk$;bNkFFhGsh^;FD-hHqFt& z&yCPrbO#NY>Ev7pFYq8eWI#d<8BN9VtS`@&Ysf=RLki(f9+qchp`nM%hM5hI@Ad) zou5F1^W{lH^PNsihD|N-XaR~B(lZ7m)QQP3=V$3T0}|@QWV(bF(enl*>=*t;o(SZL z%%Gol{a!>D%i~${xa!1nnGrq~$Ybfc9zBEJUJ!u$g6nMxn0S$1G9clsJq70fvOFRW z8+zG^LrY$v#Reo4$K`aDJVdYhAZc;D>Uz6^u9OD@c`)6Z!FDHPc?w-Fa|4;XmpC3# zaXhTzcqzl|oIvJOw49SiArg5~Klw<7GX&{1fvUcyYRxJfPpq zCJL~GDPKtRb70k>x^jP(Kobo7TsZW)*rzR#`{Z6jOLS?>*kU%6duXZ5@bRZXyZq8b zJijCr*X1zWEq=Aimc~on2(T}ey92pphS$L&lQ%PLxJKtc~Q69)PrtuY{F&kxc^wAO%xqnQb3 zvM!s}>1ftRXgxM7a6;-;);eD1&|JACkXtI^WsPg&LHLag*|b61_&7oz!~9Or7O*Nx zZ(nW>F2abZjkE@G9i)+V6$J)W&;xTy?_?Vb%9*BkHayv*|EM5cDp5;wkYdgM(9fw<|c>a zixBu$+GapP?$hDba8rtc4c?CwZE1Py{FJDLK zYk;gF0xWK}yKk33<*y0kntx$)TL!|ZflSS`?a2)a%=HS)Mx<}(TLTh8xPn&5)pC_w z$#S(;x=P8FTJu|^@92925<<8FIQ>9B$`x|CK_-N71ytuJ`q_Yl<61%Q$&^5*R6460 z`q>TjJt*ie+4PGJ^`8;?rvmz;19S}p_bdHoKtcf5Kx2NVKMY9N(HdGOmj!ZJW{`&d zaIech_|Qnw zz(a=;`Idf?L?DR@gD;-wURTCL!h8^6Z=>VcVYqrm2p0r$0oCh32c@v_j;EC0vTVp_ zRdkolIfkFoDVbHJmgvxM~ZwYq8h=7($Wd3#Q3;jgu8U#j~^e-EeszX zE(O`=Y#HUtD2y;QB8d?q$ff93hjNV!WaNG^s>xBz(RHFD5@D=1HbO&-g^AJ<7iZ-| zb%aMm_y|PBqF7pM)G{4cjo~?p4V^|;3-Lzd>?x0%Vx&h(q2VLLXc*+$MB?0%Tlo?% zoAL`vlldwMf!EQLpSmz*xTWK{7UW(KNI}NBt8pvJl6*c&M);DCF^(xL!WfTo_3Lp% zi3Jkd?-;8IwsM|8fjz+lZ@8`#e-ujA+T+&Xw+**7+{Q^J%27F=+i`oA^Hu!q5M-_! z%}>N*sd%&`KCwL1>U5yJBGe(m9T35YhH>3^81vL9X$dr9Vu;Z`+Rzq#cI2ZC*752n zILfWL6L&V;NqMM>=Oej`443l^cX249M27J(a;`7KDn${&IF)>q50i5OIVXdnC+DJE zhATNwVdxyzB>d#;K+fJTejXnUc8}%b3?HlPDO_!2sGKE3SP;}=IZMe9HDrYG_;~JW z_;?4V);yC>;BG8uDwrowJ8B7A8XF%w0wH}kxoE7UAnHPm(SE&gaF77V7ltPR4q%P_ z@re;W5kW6!WEz4V3*}Q#RRL3Ff$S1p*Z^=<(E_NWLf;QDI(IOjbyXl2qJCNE-s7&| z_iucXVHX|5$d2dk+{18pCx|u>OHUargADf!O%F9XaWC#|xR*1%_S{Jja63ay55qCs z+X=#(Blb)`)2fLKp+F$fJen$XP6L1#fOB!caQs^yHgn5of5ivFgu3x zc%bwbFr62=d6W(0)A)45r#Y7Tfx&)(^xJQk}6DR@JJ*` z@C+xxGdRYB`Aoxuodkz*OiuRYWPAq&j2b@E!FdJ`;~{*O;UNyrK|D8!!kMdZ!hqnO9G8PKaP|zO=Yb}5>5mTu^6>anq;vRO z!{<0NE#_kBA>HL9mL6KEyONW%=DA42wY!3ROdq2hn@OG^#|Coje(lcV z0g1vmuhoQ$WU;Ry^5 zNt5G>W0P=N8lO;^b@C5hwca7*SnL2_`nI zAJq1yLh$2xg5mK_I#c-?=@>}I3Y7>k!!*Pb`9i}J9mLo3P13;^oQ?U4gy9QaTi5XQ z(ms&(`-fPLRtv-V0!uf|VK44+1Zk4AGd#&z$?bf*w3Rl}nx(DQY@?*LR&S@Ki6=N0 z>?gPKY?DbMkgL zWZX~v%8Ikz_amzZK7iTC{RBUvgQDr@vcCrnP8Agw=^?&GX@J7Y>5nhNyNKpj54^Gq z@=P_9qpX#6mSO}g`}XeIW8ApnqOybNu2kMcSK5o|Y^eJywDatFhthGu00X zXw{13x7x{Wo_aK4FeHhdFhVX8y? z=sdnf8u6`$5%t%tc0C%((>$Jr4{zh!4c`{J4-_AQJ@}o55$0FdP!Cs4APB?LL)U=2 z6Ah)IFAd=u+|+%S;~1Azq(LAJs3}%G`QsCMx1?;C=|?wMgDro!6-MJyKal!i1OiJI zR~xqng7WoCzXFdD!sfdLo6x)6Mzt~cp27FX!BW@o3>VgJOwIUSzR&QzuIa|qMCt@m zr_!bk-{)%M;)m1@q;`d}F}Mg2BG{Y;^ZgRx2Miw#m(D!x(pBToepLSlId~5MPI?sn88pffaB8CQeQ4TNq|4I1&)+Ee01m@@M zUxsn8hN+d#$2{?ZVH~!qSaDOs?)L3&h+CsVp8X3-!&f1_$S)ZV&(S=UzWvkwVSi`) zCltZ{q2zb1`4ZC0{EFe1-K?2S5njx%8eUvJYuexVHT!E|f2(-o_8MAPV*hD)iPLiJ z>zBa(vXATVEaKgs{Z-8qCv@s|aYulcdW_``FXPt@FH6sOx%>vdY50xwjMtmrvOn|N zhTn1}_2?vCZhzu;4CAOtn`%j2`CX6SMN=#IJ;N)U2X9Gjc_qJZ7$-n#sV%8Bf558@ zL0*`F#! z=N*T5Lu$+$_+!I30aN$Xh#K3ke5)7ToNxTtvC)tk*=>Q{c0e`)`||MTm6o(K{3M4z`G05lf6N)a4tx64erfnqr^|idLOwJ6nG-8+3)(Hd-BRuhzf>28 zn*zL%KR3Lwd<$VW+b`@UwwqO>zfiJCYvQ1kH(Au&l&QJVer7*qyHP8BrsPvKfY0?J zHT-H$Ey|+m_7ncXerz}JX5PYIvi$_RJpO{J+VyswU28wGYXZBz!a!DF*Bu~8<=eHD z+=C75NB{O-Ca`NN^5DM3p>!B>^6iGQTsCi}>b2~LaF46)D&ET5><2y`8|?Q&ZeUmM zdC$PEQV4K5Y~Qyl1N;6S?*h9regB~rZ^M%4J-fobOWo`{)YC4vZ`-%*n>5V6fuP9M zbSsYF=h1TeI!@s?;3#?*{lb&&GP~3+v9H-z?PB|iec8TbU$igS=j|fjzE?Jaz^+hl zxz9!103H3yP1*oGS9T9Ju*=n{?s1FNw{Mr7BUE$&!?$mN3B5rYU?h6gBZl252IQ_R z1{h5F9f-g#`w!%|bid&m-!4J(x&rX+Ysl$ImT&bEo1XXhc5x-=9=?4=zrfBTurF7n zA%T6#b)4SX?Gc#v?Th$WH;}%4L7PE5(YMcsx#T$CF47z#PZ9e8-@7SyRoo|89JZp@2O zB=>x(owsxo4i{_3sLs+BF{;}_%ff1J#^_*uGhAQRYw>30&Fe9$k2l$P^LnN~jP~&)*ZQQ00%Ft>PJQmlarbB5wo`FWwO#NnU za`Uy7ys$+Y)0(1qc_=sHpW&}~yImOA=l*T&%(l28R>dyh9a(k(dD*-}14#4j(}A5| z;eI@@Pw%r<@hmRI)#9(Hnw@8#vQOG4?Bn*az|Pyx_fPHfePEwF;L;$lPgEL92<+pP zENcS$SOsgaTD+YCUSuD&kJyLpL-s*C*UquC?JPUfw~xXAbR*{5N01v+nh$Hlc0TkE zzI~`tKk^{zIn$bpoUWIAJ15MgCi!+Ya=L-`?JUiemZIgE$f*~I*oBn8sWzQkpN1aw zMcZ>WZ-I(c88hk-@@8*sle;i)&P0HOZ_0G zp7rUZy~Tu^6)k6N-BUE)>}}kgB*gb}Ckxr*uxS+eL}LqesS8@7qT--}id!5*gg{7Q7EnUf#SRkvT ze9Gffh<6A(Sfu6_bB)2`z}!UjVhNTS1?L)-pNQ#LhUG?~qdyrd@T5`j%}>N6uJ*VZ z8D&VXsvTD`F4oX!y?8S4ViIo0$}m!*6V;Wkq+9=3z z+MkMPY<1a+6t}Ud;W~rW2-P4}<)&f{S8=7mn$DF|@f4mm3Qj*=IR#VsB-XkLDQ;!m zHKPsI27cawJGsK+ih!oL^-!6y1Wv{jF88<`>19ZXHH;hw2v=EHX{DAXsaxi8*+FqS zTmxlrfwn*58KdBwqB>{demslkjDl}tCT4M|$ECjY7!WsjF5qVtW@B9#>nuOdXXAOK zpf8#nJfj+4;1Yuug6f!~IegKFBt{DI_BUJ{0SS3f?pkT@DN_cMx)>xo`bnu z>~V3jIyPFn8vk6(;}aoju^4Pf#`w6$$2)}`yrkw{p%&jOfw}qW#U{LJ6#R_L*ZO&l zk5bF^wICyQWHVkj3VucwU=bJM4OgKvBX2l0Vs+(%6G$DMXCn8oY(jAP97X58!Ry@A84f zsBk3ycHmVm@;KY$>;rsvc)!&?$HIdac3GGDYx^_aF$%s*t!U+aOmLR)J}Z>4Fw085 zqpb~FjDnx@RxOUd;9aBOZ}e8J{`cZxyk~1@Yc{r8lHN^{G}GfubSXoqa_k7JZ;Q6S z;(eo#a+&7gS+%eYAMjq@WAwv0)gOBvf5Ud8;Mb8BGiP|5fy^>^DHPK@mYeyP<5cs=ZS^p3_jDmlJtk+ukJKBvxM}H$e!pBCzk7vEs z<0oN!V#E0~8=oQ#l^9{qi;n|mHsEDW_c;APXX2gSvpfX&$E?zzgrSjNfA!dSBZ=u*)d;xoJZi@8VS6DZI-HO|@{RmE5K6b9`YC|2!bG z4PRh4zT_R8V)Vl&vrSX-6}~nKKAD%jLdn#w(4?6JOolZ|gI$zKLs zZqrEqiEoX9&)qiVWG}u``+GYF+VL;!GYY<~ZP?D+J>H%S)L>s=X1gX}e;E6%neVgl zz4BazT8uOJE?C=+k9eEM+kWNew@DIj^?0k*9q*_v-eI|!V!8Q3+rROHQSe#ZjoqBY ziHr*;S)qv*^dxfdgSP+RN2B0Zn{tcj7ej~=wGs)4&GV_dt?MY;{XRw(~Y;@V2 z_^`0#9AT5{qu#=fWNOQjY$I8I^kO7ma-^$~9P3W1_H!hc4ZO}sZlF#_SkF4vx~xyk z>>9C0wL`t8g}U2?*D06MH5vL?k7NA;sjbrUx2i#(9*$&d%VUj^ydahW^*vt-)Oyg5 z$Z=9AMMeq(qoq>DF&r($F2|tom_bbqdV(}vU)x+$lQ_R9Ln~%9kS4_lv06$v%4M~l zGDEAbZ!%Ki`yxll(H!Y$3MIxE1Zd7{WqudLMF=*(8gOvcpYN|B} zs?^m&5a;ZHIvq(rW1w2mU!p#5K(YO>BAvgW@Ajx{PQ0F15^+#;>`ABB*Vj~6#+s_@ zY8y|g9;y@{6RWR37KvW@XT_~<=_cKcbPEcspY-E3jPYurzTbrU+7MoClhR#V59w*7 z2jn~*?I*vJUPgKaQS_7ktO&8fO7_%t7_TyNSfKNGIi6SY3SKU}QWx?H3;Gy!7{5vp z1uB2Ilo~nQm$$+2G7jgZLcL&w!!2BDHJ55Tf|nRMA}M(>hjFOzVktmATO6g<2_zA)&&8u=GZkEMA~j@(@O~68i9bmlq@khf3le zhy3Cy)}56lN2&h7JkR6c1Li!Q*ZC63l0N9kb9oL2p%2eS8PDRGEayO+%ReB7Mtwld z#KZckU5EF0hF(=W^|aovl@Q_S9Kh3fDo^3bF3;`XaT$6%=l{G@Jk|fJ3)SP-qdcB=PK0=je2HFl`r>w+%;VRCLJY(cv5$jiGD#)yR!*XqO0bV#wQ28bf}m9rMLD#ZXXh zrz(&eLt*KrWy6^P^@zfTO^j?RJ6|L(e~ dCIdZ&4I366of#dH8EdR;&^KVl4?A|O_!(;|xy1kg delta 3024 zcmZuzYj9Q775?_QNeJg;C%GZvhNPkN2Q!MI=}ehv>C|aw%#1wrQiWnb36~H;Ah`)i zc*w&W9wGuN`=S!%vJKJk*8+gzM+LBu|^A6)!uLnYq3rXSVO)3G_1!4EubpB{uJ(UxCe>(P-TF|2B-=VOu(O<4kyx4@zS|Cu4MATsxwy=@AG`7HsiUl*W z72C9c^$Y1w$1Lu|c3U99F0LFgMq|6b+zia*4u?D9u5I%Lbumomc8A-MoR5S^b?F2^ zvC+UT6T#-VyW1RYLwY_^CYD7>O>!!EA1xz1gf zlN;06<$IQiEUt05<|h9wt~E<+FtFahdE-_uX^jwi8-2IxQP0(E;3~z{MybKTDx=vX ztr@$ufS31rEX5v3dF=7iS&zk|u`d<-pc?UF5HA{{_Qr{N!Ql(&kdHud#Ykgsx3rhA zUkfA*ku)t67hc9IT*(z$KCFAZv6VQ0SG9mwOUtmF%N;Iv(=#$-ulnmQ#|kd9xlEE< zQ4=lIc*XaxL9+Zuyru=L5n`)Bvi2t&)B-p9>+w1cX#uYs8>E2WNW~k*{lh^VMiPoK z65TWo`HM@DbE(6nNXv&avC<7?=-5Gj?s}=lBdIuI=Dr!kn@GT~&CJ*0;Xm*2`J2M$ zN<-`lL&Sb*NAZ>x@G7GTOmAl3B_GKp(FsKpBGok}H}CkqH%pREq~e6}{bUd)jp(>f;eLsz z6>VC;qinx$^%tDd0)9UxWWI~{w1BtPejMOJhYRC@YP{z!b3n*Aor=?DnfHTuU+67C z6caQ~`Ew;VT;OoQ|M=M!C-GT_&&F+Aj4d+UxQ3e+X&>N2E#R@(f)+l*r#WBo8Kd;H zf%!)BLur4-87<(k*n*GnH=N}>&eihak=P=9e1vu_;04x#V|>ctQ^=9rS5;S*R!1u2 zSa7>#rj0_oAK@`!^js>=nFv1);$uVPS)a%@S?d#gss%ja+JuL{ZFsw!_(ReT(xx&RVFUsvKH`;{PU_4u2{GtYX8LNI#W;%9!q??#2K8IN2+cXo(!SCDn49SYp(|*L+ONYF;c?#rLcDMhkfT z>na1^;+hsPF{mUJ`>sB<)pC5)PKu5%FL(Rrro@!Uq)5L*fD`aN$J_Fk zU=J*rRIBm5=ZmtHX05~8cp8#8-uQY=B2~b36~J}Yuv+6f)X#-r8R0ma_kPmMm4_iZ@+Oo=M4bqVe z9AC2ab&&?mcWdk0a&pVPlVA)B-8uK&+xzAzy-_w$vT;|WstT!cJ9R`E2Ff;fZ_n-> z!$lz-N@*d+l%>j2S*&D~6^imsP?Wn{(WFu-X_g9TWkL0q(JU2G30ft1u}iNr%L6Po zngMBv9II8LZ!=qEa}3KkT5*gqC+`i#(WaVW@`SMv68$9AL8~NB-^9&Qj$(;osZkwe zz+B&|gS2Fh)G9fyS9$fxl$A(#|;dI7j^X@g-pM0XahQ)cvyab8mOp|CYkH+3&_~vDsI?%nr2K$Nf!i zUgx1I=WM}=@Y#Zs;d2FT;ZF)qg+r)wt8#CP4LEucc?hi@+qIxEeCSg5hV!fMzHn#v zg0@2RI(j)SI(+3v(Wye@9F0ib=OO6NGm{EV6e2J>JYZ26MzzZny}! r8R*<2f}h-(0WJS|GOIiVT?Y*s6dscn9*~AeO>wpCMg8rWGu!_IC&6Ry diff --git a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts index f8dd3a66f5fb..1d25e068cbe3 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts @@ -60,6 +60,9 @@ export class WinTerminalService implements ITerminalService { // merge environment variables into a copy of the process.env const env = assign({}, process.env, envVars); + // delete environment variables that have a null value + Object.keys(env).filter(v => env[v] === null).forEach(key => delete env[key]); + const options: any = { cwd: dir, env: env, @@ -155,8 +158,14 @@ export class MacTerminalService implements ITerminalService { if (envVars) { for (let key in envVars) { - osaArgs.push('-e'); - osaArgs.push(key + '=' + envVars[key]); + const value = envVars[key]; + if (value === null) { + osaArgs.push('-u'); + osaArgs.push(key); + } else { + osaArgs.push('-e'); + osaArgs.push(`${key}=${value}`); + } } } @@ -239,6 +248,9 @@ export class LinuxTerminalService implements ITerminalService { // merge environment variables into a copy of the process.env const env = assign({}, process.env, envVars); + // delete environment variables that have a null value + Object.keys(env).filter(v => env[v] === null).forEach(key => delete env[key]); + const options: any = { cwd: dir, env: env diff --git a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts index d2102082d063..af0184e53df9 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts @@ -42,17 +42,16 @@ import { IMessageService } from 'vs/platform/message/common/message'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { Position } from 'vs/platform/editor/common/editor'; -import { IListService } from 'vs/platform/list/browser/listService'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService, RawContextKey, ContextKeyExpr, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Command, ICommandOptions } from 'vs/editor/browser/editorExtensions'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Color } from 'vs/base/common/color'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; /** A context key that is set when an extension editor webview has focus. */ export const KEYBINDING_CONTEXT_EXTENSIONEDITOR_WEBVIEW_FOCUS = new RawContextKey('extensionEditorWebviewFocus', undefined); @@ -379,12 +378,6 @@ export class ExtensionEditor extends BaseEditor { } } - hideFind(): void { - if (this.activeWebview) { - this.activeWebview.hideFind(); - } - } - public showNextFindTerm() { if (this.activeWebview) { this.activeWebview.showNextFindTerm(); @@ -518,7 +511,7 @@ export class ExtensionEditor extends BaseEditor { private renderDependencies(container: HTMLElement, extensionDependencies: IExtensionDependencies): Tree { const renderer = this.instantiationService.createInstance(Renderer); const controller = this.instantiationService.createInstance(Controller); - const tree = new Tree(container, { + const tree = new WorkbenchTree(container, { dataSource: new DataSource(), renderer, controller @@ -526,9 +519,7 @@ export class ExtensionEditor extends BaseEditor { indentPixels: 40, twistiePixels: 20, keyboardSupport: false - }); - - this.contentDisposables.push(attachListStyler(tree, this.themeService)); + }, this.contextKeyService, this.listService, this.themeService); tree.setInput(extensionDependencies); @@ -538,8 +529,6 @@ export class ExtensionEditor extends BaseEditor { } })); - this.contentDisposables.push(this.listService.register(tree)); - return tree; } @@ -941,15 +930,6 @@ const showCommand = new ShowExtensionEditorFindCommand({ }); KeybindingsRegistry.registerCommandAndKeybindingRule(showCommand.toCommandAndKeybindingRule(KeybindingsRegistry.WEIGHT.editorContrib())); -const hideCommand = new ShowExtensionEditorFindCommand({ - id: 'editor.action.extensioneditor.hidefind', - precondition: KEYBINDING_CONTEXT_EXTENSIONEDITOR_WEBVIEW_FOCUS, - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_F - } -}); -KeybindingsRegistry.registerCommandAndKeybindingRule(hideCommand.toCommandAndKeybindingRule(KeybindingsRegistry.WEIGHT.editorContrib())); - class ShowExtensionEditorFindTermCommand extends Command { constructor(opts: ICommandOptions, private _next: boolean) { super(opts); diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 200b4e2b301d..677b4981ba6c 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -14,10 +14,10 @@ import Event from 'vs/base/common/event'; import * as json from 'vs/base/common/json'; import { ActionItem, IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions'; import { ExtensionsConfigurationInitialContent } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; -import { LocalExtensionType, IExtensionEnablementService, IExtensionTipsService, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { LocalExtensionType, IExtensionEnablementService, IExtensionTipsService, EnablementState, ExtensionsLabel } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IMessageService } from 'vs/platform/message/common/message'; @@ -41,6 +41,9 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { PICK_WORKSPACE_FOLDER_COMMAND } from 'vs/workbench/browser/actions/workspaceActions'; import Severity from 'vs/base/common/severity'; import { PagedModel } from 'vs/base/common/paging'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; export class InstallAction extends Action { @@ -1303,6 +1306,53 @@ export class ChangeSortAction extends Action { } } +export class ConfigureRecommendedExtensionsCommandsContributor extends Disposable implements IWorkbenchContribution { + + private workspaceContextKey = new RawContextKey('workspaceRecommendations', true); + private workspaceFolderContextKey = new RawContextKey('workspaceFolderRecommendations', true); + + constructor( + @IContextKeyService contextKeyService: IContextKeyService, + @IWorkspaceContextService workspaceContextService: IWorkspaceContextService + ) { + super(); + const boundWorkspaceContextKey = this.workspaceContextKey.bindTo(contextKeyService); + boundWorkspaceContextKey.set(workspaceContextService.getWorkbenchState() === WorkbenchState.WORKSPACE); + this._register(workspaceContextService.onDidChangeWorkbenchState(() => boundWorkspaceContextKey.set(workspaceContextService.getWorkbenchState() === WorkbenchState.WORKSPACE))); + + + const boundWorkspaceFolderContextKey = this.workspaceFolderContextKey.bindTo(contextKeyService); + boundWorkspaceFolderContextKey.set(workspaceContextService.getWorkspace().folders.length > 0); + this._register(workspaceContextService.onDidChangeWorkspaceFolders(() => boundWorkspaceFolderContextKey.set(workspaceContextService.getWorkspace().folders.length > 0))); + + this.registerCommands(); + } + + private registerCommands(): void { + CommandsRegistry.registerCommand(ConfigureWorkspaceRecommendedExtensionsAction.ID, serviceAccessor => { + serviceAccessor.get(IInstantiationService).createInstance(ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceRecommendedExtensionsAction.ID, ConfigureWorkspaceRecommendedExtensionsAction.LABEL).run(); + }); + MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id: ConfigureWorkspaceRecommendedExtensionsAction.ID, + title: `${ExtensionsLabel}: ${ConfigureWorkspaceRecommendedExtensionsAction.LABEL}`, + }, + when: this.workspaceContextKey + }); + + CommandsRegistry.registerCommand(ConfigureWorkspaceFolderRecommendedExtensionsAction.ID, serviceAccessor => { + serviceAccessor.get(IInstantiationService).createInstance(ConfigureWorkspaceFolderRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction.ID, ConfigureWorkspaceFolderRecommendedExtensionsAction.LABEL).run(); + }); + MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id: ConfigureWorkspaceFolderRecommendedExtensionsAction.ID, + title: `${ExtensionsLabel}: ${ConfigureWorkspaceFolderRecommendedExtensionsAction.LABEL}`, + }, + when: this.workspaceFolderContextKey + }); + } +} + interface IExtensionsContent { recommendations: string[]; } @@ -1323,20 +1373,22 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio protected openExtensionsFile(extensionsFileResource: URI): TPromise { return this.getOrCreateExtensionsFile(extensionsFileResource) - .then(({ created }) => { - return this.editorService.openEditor({ - resource: extensionsFileResource, - options: { - forceOpen: true, - pinned: created - }, - }); - }, error => TPromise.wrapError(new Error(localize('OpenExtensionsFile.failed', "Unable to create 'extensions.json' file inside the '.vscode' folder ({0}).", error)))); + .then(({ created, content }) => + this.getSelectionPosition(content, extensionsFileResource, ['recommendations']) + .then(selection => this.editorService.openEditor({ + resource: extensionsFileResource, + options: { + forceOpen: true, + pinned: created, + selection + } + })), + error => TPromise.wrapError(new Error(localize('OpenExtensionsFile.failed', "Unable to create 'extensions.json' file inside the '.vscode' folder ({0}).", error)))); } protected openWorkspaceConfigurationFile(workspaceConfigurationFile: URI): TPromise { return this.getOrUpdateWorkspaceConfigurationFile(workspaceConfigurationFile) - .then(content => this.getSelectionPosition(content)) + .then(content => this.getSelectionPosition(content.value, content.resource, ['extensions', 'recommendations'])) .then(selection => this.editorService.openEditor({ resource: workspaceConfigurationFile, options: { @@ -1358,12 +1410,14 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio }); } - private getSelectionPosition(content: IContent): TPromise { - const tree = json.parseTree(content.value); - const node = json.findNodeAtLocation(tree, ['extensions', 'recommendations']); + private getSelectionPosition(content: string, resource: URI, path: json.JSONPath): TPromise { + const tree = json.parseTree(content); + const node = json.findNodeAtLocation(tree, path); if (node && node.parent.children[1]) { - const offset = node.parent.children[1].offset; - return this.textModelResolverService.createModelReference(content.resource) + const recommendationsValueNode = node.parent.children[1]; + const lastExtensionNode = recommendationsValueNode.children && recommendationsValueNode.children.length ? recommendationsValueNode.children[recommendationsValueNode.children.length - 1] : null; + const offset = lastExtensionNode ? lastExtensionNode.offset + lastExtensionNode.length : recommendationsValueNode.offset + 1; + return this.textModelResolverService.createModelReference(resource) .then(reference => { const position = reference.object.textEditorModel.getPositionAt(offset); reference.dispose(); @@ -1378,12 +1432,12 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio return TPromise.as(null); } - private getOrCreateExtensionsFile(extensionsFileResource: URI): TPromise<{ created: boolean, extensionsFileResource: URI }> { + private getOrCreateExtensionsFile(extensionsFileResource: URI): TPromise<{ created: boolean, extensionsFileResource: URI, content: string }> { return this.fileService.resolveContent(extensionsFileResource).then(content => { - return { created: false, extensionsFileResource }; + return { created: false, extensionsFileResource, content: content.value }; }, err => { return this.fileService.updateContent(extensionsFileResource, ExtensionsConfigurationInitialContent).then(() => { - return { created: true, extensionsFileResource }; + return { created: true, extensionsFileResource, content: ExtensionsConfigurationInitialContent }; }); }); } @@ -1414,7 +1468,7 @@ export class ConfigureWorkspaceRecommendedExtensionsAction extends AbstractConfi this.enabled = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY; } - public run(event: any): TPromise { + public run(): TPromise { switch (this.contextService.getWorkbenchState()) { case WorkbenchState.FOLDER: return this.openExtensionsFile(this.contextService.getWorkspace().folders[0].toResource(paths.join('.vscode', 'extensions.json'))); @@ -1476,7 +1530,7 @@ export class ConfigureWorkspaceFolderRecommendedExtensionsAction extends Abstrac export class BuiltinStatusLabelAction extends Action { - private static readonly Class = 'extension-action built-in-status'; + private static readonly Class = 'built-in-status'; private _extension: IExtension; get extension(): IExtension { return this._extension; } @@ -1694,4 +1748,4 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (extensionButtonProminentHoverBackground) { collector.addRule(`.monaco-action-bar .action-item:hover .action-label.extension-action.prominent { background-color: ${extensionButtonProminentHoverBackgroundColor}; }`); } -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts index 12d0a66aa7a6..3167b710f492 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts @@ -10,6 +10,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IExtension, IExtensionsWorkbenchService } from '../common/extensions'; import { append, $, addClass } from 'vs/base/browser/dom'; import * as platform from 'vs/base/common/platform'; +import { localize } from 'vs/nls'; export interface IOptions { extension?: IExtension; @@ -142,6 +143,7 @@ export class RatingsWidget implements IDisposable { const count = append(this.container, $('span.count')); count.textContent = String(rating); + this.container.title = this.extension.ratingCount > 1 ? localize('ratedByUsers', "Rated by {0} users", this.extension.ratingCount) : localize('ratedBySingleUser', "Rated by 1 user"); } else { for (let i = 1; i <= 5; i++) { if (rating >= i) { diff --git a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css index c9b9d8508a2a..8314dddb3315 100644 --- a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css @@ -30,19 +30,21 @@ .monaco-action-bar .action-item.disabled .action-label.extension-action.enable, .monaco-action-bar .action-item.disabled .action-label.extension-action.disable, .monaco-action-bar .action-item.disabled .action-label.extension-action.reload, -.monaco-action-bar .action-item.disabled .action-label.extension-action.built-in-status.user { +.monaco-action-bar .action-item.disabled .action-label.built-in-status.user { display: none; } -.monaco-action-bar .action-item .action-label.extension-action.built-in-status { +.monaco-action-bar .action-item .action-label.built-in-status { border-radius: 4px; color: inherit; background-color: transparent; opacity: 0.9; font-style: italic; + padding: 0 5px; + line-height: initial; } -.extension-editor>.header>.details>.actions>.monaco-action-bar .action-item .action-label.extension-action.built-in-status { +.extension-editor>.header>.details>.actions>.monaco-action-bar .action-item .action-label.built-in-status { font-weight: normal; } diff --git a/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css b/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css index 5d8a88b28a9d..01dd0458f1d3 100644 --- a/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css +++ b/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css @@ -15,7 +15,6 @@ .extension-editor > .header { display: flex; height: 128px; - background: rgba(128, 128, 128, 0.15); padding: 20px; overflow: hidden; font-size: 14px; diff --git a/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.ts b/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.ts index 0cb5367299e3..fc81cb063d1b 100644 --- a/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.ts +++ b/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.ts @@ -10,6 +10,7 @@ import { EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/co export const ExtensionsConfigurationSchemaId = 'vscode://schemas/extensions'; export const ExtensionsConfigurationSchema: IJSONSchema = { id: ExtensionsConfigurationSchemaId, + allowComments: true, type: 'object', title: localize('app.extensions.json.title', "Extensions"), properties: { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts new file mode 100644 index 000000000000..307d628fdd35 --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts @@ -0,0 +1,182 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as nls from 'vs/nls'; +import Event, { Emitter } from 'vs/base/common/event'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IExtensionHostProfile, ProfileSession, IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import { append, $, addDisposableListener } from 'vs/base/browser/dom'; +import { StatusbarAlignment, IStatusbarRegistry, StatusbarItemDescriptor, Extensions, IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IExtensionHostProfileService, ProfileSessionState, RuntimeExtensionsInput } from 'vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; + +export class ExtensionHostProfileService extends Disposable implements IExtensionHostProfileService { + + _serviceBrand: any; + + private readonly _onDidChangeState: Emitter = this._register(new Emitter()); + public readonly onDidChangeState: Event = this._onDidChangeState.event; + + private readonly _onDidChangeLastProfile: Emitter = this._register(new Emitter()); + public readonly onDidChangeLastProfile: Event = this._onDidChangeLastProfile.event; + + private _profile: IExtensionHostProfile; + private _profileSession: ProfileSession; + private _state: ProfileSessionState; + + public get state() { return this._state; } + public get lastProfile() { return this._profile; } + + constructor( + @IExtensionService private readonly _extensionService: IExtensionService, + @IWorkbenchEditorService private readonly _editorService: IWorkbenchEditorService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + ) { + super(); + this._profile = null; + this._profileSession = null; + this._setState(ProfileSessionState.None); + } + + private _setState(state: ProfileSessionState): void { + if (this._state === state) { + return; + } + this._state = state; + + if (this._state === ProfileSessionState.Running) { + ProfileExtHostStatusbarItem.instance.show(() => { + this.stopProfiling(); + this._editorService.openEditor(this._instantiationService.createInstance(RuntimeExtensionsInput), { revealIfOpened: true }); + }); + } else if (this._state === ProfileSessionState.Stopping) { + ProfileExtHostStatusbarItem.instance.hide(); + } + + this._onDidChangeState.fire(void 0); + } + + public startProfiling(): void { + if (this._state !== ProfileSessionState.None) { + return; + } + this._setState(ProfileSessionState.Starting); + + this._extensionService.startExtensionHostProfile().then((value) => { + this._profileSession = value; + this._setState(ProfileSessionState.Running); + }, (err) => { + onUnexpectedError(err); + this._setState(ProfileSessionState.None); + }); + } + + public stopProfiling(): void { + if (this._state !== ProfileSessionState.Running) { + return; + } + + this._setState(ProfileSessionState.Stopping); + this._profileSession.stop().then((result) => { + this._setLastProfile(result); + this._setState(ProfileSessionState.None); + }, (err) => { + onUnexpectedError(err); + this._setState(ProfileSessionState.None); + }); + this._profileSession = null; + } + + private _setLastProfile(profile: IExtensionHostProfile) { + this._profile = profile; + this._onDidChangeLastProfile.fire(void 0); + } + + public getLastProfile(): IExtensionHostProfile { + return this._profile; + } + + public clearLastProfile(): void { + this._setLastProfile(null); + } +} + +export class ProfileExtHostStatusbarItem implements IStatusbarItem { + + public static instance: ProfileExtHostStatusbarItem; + + private toDispose: IDisposable[]; + private statusBarItem: HTMLElement; + private label: HTMLElement; + private timeStarted: number; + private labelUpdater: number; + private clickHandler: () => void; + + constructor() { + ProfileExtHostStatusbarItem.instance = this; + this.toDispose = []; + this.timeStarted = 0; + } + + public show(clickHandler: () => void) { + this.clickHandler = clickHandler; + if (this.timeStarted === 0) { + this.timeStarted = new Date().getTime(); + this.statusBarItem.hidden = false; + this.labelUpdater = setInterval(() => { + this.updateLabel(); + }, 1000); + this.updateLabel(); + } + } + + public hide() { + this.clickHandler = null; + this.statusBarItem.hidden = true; + this.timeStarted = 0; + clearInterval(this.labelUpdater); + this.labelUpdater = null; + } + + public render(container: HTMLElement): IDisposable { + if (!this.statusBarItem && container) { + this.statusBarItem = append(container, $('.profileExtHost-statusbar-item')); + this.toDispose.push(addDisposableListener(this.statusBarItem, 'click', () => { + if (this.clickHandler) { + this.clickHandler(); + } + })); + this.statusBarItem.title = nls.localize('selectAndStartDebug', "Click to stop profiling."); + const a = append(this.statusBarItem, $('a')); + append(a, $('.icon')); + this.label = append(a, $('span.label')); + this.updateLabel(); + this.statusBarItem.hidden = true; + } + return this; + } + + private updateLabel() { + let label = 'Profiling Extension Host'; + if (this.timeStarted > 0) { + let secondsRecoreded = (new Date().getTime() - this.timeStarted) / 1000; + label = `Profiling Extension Host (${Math.round(secondsRecoreded)} sec)`; + } + this.label.textContent = label; + } + + public dispose(): void { + this.toDispose = dispose(this.toDispose); + } +} + +Registry.as(Extensions.Statusbar).registerStatusbarItem( + new StatusbarItemDescriptor(ProfileExtHostStatusbarItem, StatusbarAlignment.RIGHT) +); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 3de767e604b1..d0fc19c59fba 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -28,6 +28,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import * as pfs from 'vs/base/node/pfs'; import * as os from 'os'; import { flatten, distinct } from 'vs/base/common/arrays'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; interface IExtensionsContent { recommendations: string[]; @@ -61,11 +62,12 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe @IWorkspaceContextService private contextService: IWorkspaceContextService, @IConfigurationService private configurationService: IConfigurationService, @IMessageService private messageService: IMessageService, - @ITelemetryService private telemetryService: ITelemetryService + @ITelemetryService private telemetryService: ITelemetryService, + @IEnvironmentService private environmentService: IEnvironmentService ) { super(); - if (!this._galleryService.isEnabled()) { + if (!this._galleryService.isEnabled() || this.environmentService.extensionDevelopmentPath) { return; } @@ -353,7 +355,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe this.extensionsService.getInstalled(LocalExtensionType.User).done(local => { const recommendations = allRecommendations - .filter(id => local.every(local => `${local.manifest.publisher}.${local.manifest.name}` !== id)); + .filter(id => local.every(local => `${local.manifest.publisher.toLowerCase()}.${local.manifest.name.toLowerCase()}` !== id)); if (!recommendations.length) { return; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index d865b71dfa60..18f4e4a6d565 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -21,8 +21,8 @@ import { VIEWLET_ID, IExtensionsWorkbenchService } from '../common/extensions'; import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService'; import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, - ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, UpdateAllAction, ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, - EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction + ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, UpdateAllAction, + EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { OpenExtensionsFolderAction, InstallVSIXAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; @@ -34,20 +34,25 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'v import jsonContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry'); import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { KeymapExtensions, BetterMergeDisabled } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; import { adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { GalleryExtensionsHandler, ExtensionsHandler } from 'vs/workbench/parts/extensions/browser/extensionsQuickOpen'; import { EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { RuntimeExtensionsEditor, RuntimeExtensionsInput, ShowRuntimeExtensionsAction, IExtensionHostProfileService } from 'vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor'; +import { EditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions } from 'vs/workbench/common/editor'; +import { ExtensionHostProfileService } from 'vs/workbench/parts/extensions/electron-browser/extensionProfileService'; // Singletons registerSingleton(IExtensionGalleryService, ExtensionGalleryService); registerSingleton(IExtensionTipsService, ExtensionTipsService); registerSingleton(IExtensionsWorkbenchService, ExtensionsWorkbenchService); +registerSingleton(IExtensionHostProfileService, ExtensionHostProfileService); const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(StatusUpdater, LifecyclePhase.Running); +workbenchRegistry.registerWorkbenchContribution(ConfigureRecommendedExtensionsCommandsContributor, LifecyclePhase.Eventually); workbenchRegistry.registerWorkbenchContribution(KeymapExtensions, LifecyclePhase.Running); workbenchRegistry.registerWorkbenchContribution(BetterMergeDisabled, LifecyclePhase.Running); @@ -87,6 +92,29 @@ const editorDescriptor = new EditorDescriptor( Registry.as(EditorExtensions.Editors) .registerEditor(editorDescriptor, [new SyncDescriptor(ExtensionsInput)]); +// Running Extensions Editor + +const runtimeExtensionsEditorDescriptor = new EditorDescriptor( + RuntimeExtensionsEditor, + RuntimeExtensionsEditor.ID, + localize('runtimeExtension', "Running Extensions") +); + +Registry.as(EditorExtensions.Editors) + .registerEditor(runtimeExtensionsEditorDescriptor, [new SyncDescriptor(RuntimeExtensionsInput)]); + +class RuntimeExtensionsInputFactory implements IEditorInputFactory { + serialize(editorInput: EditorInput): string { + return ''; + } + deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput { + return new RuntimeExtensionsInput(); + } +} + +Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(RuntimeExtensionsInput.ID, RuntimeExtensionsInputFactory); + + // Viewlet const viewletDescriptor = new ViewletDescriptor( ExtensionsViewlet, @@ -141,12 +169,6 @@ actionRegistry.registerWorkbenchAction(updateAllActionDescriptor, 'Extensions: U const openExtensionsFolderActionDescriptor = new SyncActionDescriptor(OpenExtensionsFolderAction, OpenExtensionsFolderAction.ID, OpenExtensionsFolderAction.LABEL); actionRegistry.registerWorkbenchAction(openExtensionsFolderActionDescriptor, 'Extensions: Open Extensions Folder', ExtensionsLabel); -const configureWorkspaceExtensionsDescriptor = new SyncActionDescriptor(ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceRecommendedExtensionsAction.ID, ConfigureWorkspaceRecommendedExtensionsAction.LABEL); -actionRegistry.registerWorkbenchAction(configureWorkspaceExtensionsDescriptor, 'Extensions: Configure Recommended Extensions (Workspace)', ExtensionsLabel); - -const configureWorkspaceFolderRecommendationsDescriptor = new SyncActionDescriptor(ConfigureWorkspaceFolderRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction.ID, ConfigureWorkspaceFolderRecommendedExtensionsAction.LABEL); -actionRegistry.registerWorkbenchAction(configureWorkspaceFolderRecommendationsDescriptor, 'Extensions: Configure Recommended Extensions (Workspace Folder)', ExtensionsLabel); - const installVSIXActionDescriptor = new SyncActionDescriptor(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL); actionRegistry.registerWorkbenchAction(installVSIXActionDescriptor, 'Extensions: Install from VSIX...', ExtensionsLabel); @@ -167,6 +189,7 @@ actionRegistry.registerWorkbenchAction(checkForUpdatesAction, `Extensions: Check actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(EnableAutoUpdateAction, EnableAutoUpdateAction.ID, EnableAutoUpdateAction.LABEL), `Extensions: Enable Auto Updating Extensions`, ExtensionsLabel); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisableAutoUpdateAction, DisableAutoUpdateAction.ID, DisableAutoUpdateAction.LABEL), `Extensions: Disable Auto Updating Extensions`, ExtensionsLabel); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowRuntimeExtensionsAction, ShowRuntimeExtensionsAction.ID, ShowRuntimeExtensionsAction.LABEL), 'Show Running Extensions', localize('developer', "Developer")); Registry.as(ConfigurationExtensions.Configuration) .registerConfiguration({ @@ -182,7 +205,7 @@ Registry.as(ConfigurationExtensions.Configuration) }, 'extensions.ignoreRecommendations': { type: 'boolean', - description: localize('extensionsIgnoreRecommendations', "Ignore extension recommendations"), + description: localize('extensionsIgnoreRecommendations', "If set to true, the notifications for extension recommendations will stop showing up."), default: false } } @@ -199,4 +222,4 @@ CommandsRegistry.registerCommand('_extensions.manage', (accessor: ServicesAccess if (extension.length === 1) { extensionService.open(extension[0]).done(null, errors.onUnexpectedError); } -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index e76d511962b4..e128026b9e05 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -47,10 +47,6 @@ export class OpenExtensionsFolderAction extends Action { return this.windowsService.showItemInFolder(itemToShow); }); } - - protected isEnabled(): boolean { - return true; - } } export class InstallVSIXAction extends Action { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts index 0b2b76fc740a..de679af99459 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts @@ -20,7 +20,8 @@ import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiati import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IMessageService, Severity, IChoiceService } from 'vs/platform/message/common/message'; import { Action } from 'vs/base/common/actions'; -import { BetterMergeDisabledNowKey, BetterMergeId, getIdAndVersionFromLocalExtensionId, areSameExtensions, adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { BetterMergeDisabledNowKey, BetterMergeId, areSameExtensions, adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { getIdAndVersionFromLocalExtensionId } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; export interface IExtensionStatus { identifier: IExtensionIdentifier; @@ -52,9 +53,9 @@ export class KeymapExtensions implements IWorkbenchContribution { private checkForOtherKeymaps(extensionIdentifier: IExtensionIdentifier): TPromise { return this.instantiationService.invokeFunction(getInstalledExtensions).then(extensions => { const keymaps = extensions.filter(extension => isKeymapExtension(this.tipsService, extension)); - const extension = arrays.first(keymaps, extension => extension.identifier.id === extensionIdentifier.id); + const extension = arrays.first(keymaps, extension => stripVersion(extension.identifier.id) === extensionIdentifier.id); if (extension && extension.globallyEnabled) { - const otherKeymaps = keymaps.filter(extension => extension.identifier.id !== extensionIdentifier.id && extension.globallyEnabled); + const otherKeymaps = keymaps.filter(extension => stripVersion(extension.identifier.id) !== extensionIdentifier.id && extension.globallyEnabled); if (otherKeymaps.length) { return this.promptForDisablingOtherKeymaps(extension, otherKeymaps); } @@ -64,25 +65,8 @@ export class KeymapExtensions implements IWorkbenchContribution { } private promptForDisablingOtherKeymaps(newKeymap: IExtensionStatus, oldKeymaps: IExtensionStatus[]): TPromise { - /* __GDPR__FRAGMENT__ - "KeyMapsData" : { - "newKeymap" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "oldKeymaps": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - const telemetryData: { [key: string]: any; } = { - newKeymap: newKeymap.identifier, - oldKeymaps: oldKeymaps.map(k => k.identifier) - }; - /* __GDPR__ - "disableOtherKeymapsConfirmation" : { - "${include}": [ - "${KeyMapsData}" - ] - } - */ - this.telemetryService.publicLog('disableOtherKeymapsConfirmation', telemetryData); + const message = localize('disableOtherKeymapsConfirmation', "Disable other keymaps ({0}) to avoid conflicts between keybindings?", oldKeymaps.map(k => `'${k.local.manifest.displayName}'`).join(', ')); const options = [ localize('yes', "Yes"), @@ -91,13 +75,16 @@ export class KeymapExtensions implements IWorkbenchContribution { return this.choiceService.choose(Severity.Info, message, options, 1, false) .then(value => { const confirmed = value === 0; - telemetryData['confirmed'] = confirmed; + const telemetryData: { [key: string]: any; } = { + newKeymap: newKeymap.identifier, + oldKeymaps: oldKeymaps.map(k => k.identifier), + confirmed + }; /* __GDPR__ "disableOtherKeymaps" : { - "confirmed" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "${include}": [ - "${KeyMapsData}" - ] + "newKeymap" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "oldKeymaps": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "confirmed" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ this.telemetryService.publicLog('disableOtherKeymaps', telemetryData); @@ -142,7 +129,7 @@ export function getInstalledExtensions(accessor: ServicesAccessor): TPromise { return extensions.map(extension => { return { - identifier: { id: adoptToGalleryExtensionId(extension.identifier.id), uuid: extension.identifier.uuid }, + identifier: { id: adoptToGalleryExtensionId(stripVersion(extension.identifier.id)), uuid: extension.identifier.uuid }, local: extension, globallyEnabled: disabledExtensions.every(disabled => !areSameExtensions(disabled, extension.identifier)) }; @@ -153,7 +140,7 @@ export function getInstalledExtensions(accessor: ServicesAccessor): TPromise { if (storageService.getBoolean(BetterMergeDisabledNowKey, StorageScope.GLOBAL, false)) { storageService.remove(BetterMergeDisabledNowKey, StorageScope.GLOBAL); - /* __GDPR__ - "betterMergeDisabled" : {} - */ - telemetryService.publicLog('betterMergeDisabled'); messageService.show(Severity.Info, { message: localize('betterMergeDisabled', "The Better Merge extension is now built-in, the installed extension was disabled and can be uninstalled."), actions: [ new Action('uninstall', localize('uninstall', "Uninstall"), null, true, () => { - /* __GDPR__ - "betterMergeUninstall" : { - "outcome" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('betterMergeUninstall', { - outcome: 'uninstall', - }); return extensionManagementService.getInstalled(LocalExtensionType.User).then(extensions => { return Promise.all(extensions.filter(e => stripVersion(e.identifier.id) === BetterMergeId) .map(e => extensionManagementService.uninstall(e, true))); }); }), - new Action('later', localize('later', "Later"), null, true, () => { - /* __GDPR__ - "betterMergeUninstall" : { - "outcome" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('betterMergeUninstall', { - outcome: 'later', - }); - return TPromise.as(true); - }) + new Action('later', localize('later', "Later"), null, true) ] }); } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts index 6dfba15a733f..8f6cb11fba0f 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts @@ -19,16 +19,14 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { append, $, toggleClass } from 'vs/base/browser/dom'; -import { PagedList } from 'vs/base/browser/ui/list/listPaging'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Delegate, Renderer } from 'vs/workbench/parts/extensions/browser/extensionsList'; import { IExtension, IExtensionsWorkbenchService } from '../common/extensions'; import { Query } from '../common/extensionQuery'; -import { IListService } from 'vs/platform/list/browser/listService'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachListStyler, attachBadgeStyler } from 'vs/platform/theme/common/styler'; -import { ViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; +import { IViewletViewOptions, IViewOptions, ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { OpenGlobalSettingsAction } from 'vs/workbench/parts/preferences/browser/preferencesActions'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; @@ -37,6 +35,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; +import { WorkbenchPagedList, IListService } from 'vs/platform/list/browser/listService'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; export class ExtensionsListView extends ViewsViewletPanel { @@ -44,7 +44,7 @@ export class ExtensionsListView extends ViewsViewletPanel { private extensionsList: HTMLElement; private badge: CountBadge; protected badgeContainer: HTMLElement; - private list: PagedList; + private list: WorkbenchPagedList; constructor( private options: IViewletViewOptions, @@ -60,7 +60,8 @@ export class ExtensionsListView extends ViewsViewletPanel { @IEditorGroupService private editorInputService: IEditorGroupService, @IExtensionTipsService private tipsService: IExtensionTipsService, @IModeService private modeService: IModeService, - @ITelemetryService private telemetryService: ITelemetryService + @ITelemetryService private telemetryService: ITelemetryService, + @IContextKeyService private contextKeyService: IContextKeyService ) { super({ ...(options as IViewOptions), ariaHeaderLabel: options.name }, keybindingService, contextMenuService); } @@ -79,13 +80,10 @@ export class ExtensionsListView extends ViewsViewletPanel { this.messageBox = append(container, $('.message')); const delegate = new Delegate(); const renderer = this.instantiationService.createInstance(Renderer); - this.list = new PagedList(this.extensionsList, delegate, [renderer], { + this.list = new WorkbenchPagedList(this.extensionsList, delegate, [renderer], { ariaLabel: localize('extensions', "Extensions"), keyboardSupport: false - }); - - this.disposables.push(attachListStyler(this.list.widget, this.themeService)); - this.disposables.push(this.listService.register(this.list.widget)); + }, this.contextKeyService, this.listService, this.themeService); chain(this.list.onSelectionChange) .map(e => e.elements[0]) @@ -156,27 +154,10 @@ export class ExtensionsListView extends ViewsViewletPanel { let result = await this.extensionsWorkbenchService.queryLocal(); - switch (options.sortBy) { - case SortBy.InstallCount: - result = result.sort((e1, e2) => e2.installCount - e1.installCount); - break; - case SortBy.AverageRating: - case SortBy.WeightedRating: - result = result.sort((e1, e2) => e2.rating - e1.rating); - break; - default: - result = result.sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)); - break; - } - - if (options.sortOrder === SortOrder.Descending) { - result = result.reverse(); - } - result = result .filter(e => e.type === LocalExtensionType.User && e.name.toLowerCase().indexOf(value) > -1); - return new PagedModel(result); + return new PagedModel(this.sortExtensions(result, options)); } const idMatch = /@id:([a-z0-9][a-z0-9\-]*\.[a-z0-9][a-z0-9\-]*)/.exec(value); @@ -189,18 +170,18 @@ export class ExtensionsListView extends ViewsViewletPanel { } if (/@outdated/i.test(value)) { - value = value.replace(/@outdated/g, '').trim().toLowerCase(); + value = value.replace(/@outdated/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); const local = await this.extensionsWorkbenchService.queryLocal(); const result = local .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) .filter(extension => extension.outdated && extension.name.toLowerCase().indexOf(value) > -1); - return new PagedModel(result); + return new PagedModel(this.sortExtensions(result, options)); } if (/@disabled/i.test(value)) { - value = value.replace(/@disabled/g, '').trim().toLowerCase(); + value = value.replace(/@disabled/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); const local = await this.extensionsWorkbenchService.queryLocal(); const runningExtensions = await this.extensionService.getExtensions(); @@ -209,22 +190,22 @@ export class ExtensionsListView extends ViewsViewletPanel { .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) .filter(e => runningExtensions.every(r => !areSameExtensions(r, e)) && e.name.toLowerCase().indexOf(value) > -1); - return new PagedModel(result); + return new PagedModel(this.sortExtensions(result, options)); } if (/@enabled/i.test(value)) { - value = value ? value.replace(/@enabled/g, '').trim().toLowerCase() : ''; + value = value ? value.replace(/@enabled/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase() : ''; const local = await this.extensionsWorkbenchService.queryLocal(); - const result = local + let result = local .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) .filter(e => e.type === LocalExtensionType.User && (e.enablementState === EnablementState.Enabled || e.enablementState === EnablementState.WorkspaceEnabled) && e.name.toLowerCase().indexOf(value) > -1 ); - return new PagedModel(result); + return new PagedModel(this.sortExtensions(result, options)); } if (ExtensionsListView.isWorkspaceRecommendedExtensionsQuery(query.value)) { @@ -279,6 +260,25 @@ export class ExtensionsListView extends ViewsViewletPanel { return new PagedModel(pager); } + private sortExtensions(extensions: IExtension[], options: IQueryOptions): IExtension[] { + switch (options.sortBy) { + case SortBy.InstallCount: + extensions = extensions.sort((e1, e2) => e2.installCount - e1.installCount); + break; + case SortBy.AverageRating: + case SortBy.WeightedRating: + extensions = extensions.sort((e1, e2) => e2.rating - e1.rating); + break; + default: + extensions = extensions.sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)); + break; + } + if (options.sortOrder === SortOrder.Descending) { + extensions = extensions.reverse(); + } + return extensions; + } + private getAllRecommendationsModel(query: Query, options: IQueryOptions): TPromise> { const value = query.value.replace(/@recommended:all/g, '').replace(/@recommended/g, '').trim().toLowerCase(); @@ -404,12 +404,6 @@ export class ExtensionsListView extends ViewsViewletPanel { const value = query.value.replace(/@recommended:keymaps/g, '').trim().toLowerCase(); const names = this.tipsService.getKeymapRecommendations() .filter(name => name.toLowerCase().indexOf(value) > -1); - /* __GDPR__ - "extensionKeymapRecommendations:open" : { - "count" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('extensionKeymapRecommendations:open', { count: names.length }); if (!names.length) { return TPromise.as(new PagedModel([])); diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg b/src/vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg new file mode 100644 index 000000000000..6fa378a7fa55 --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-start.svg b/src/vs/workbench/parts/extensions/electron-browser/media/profile-start.svg new file mode 100644 index 000000000000..184a953726cb --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/media/profile-start.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg b/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg new file mode 100644 index 000000000000..ed989422ee9d --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg b/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg new file mode 100644 index 000000000000..22656a29c7df --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css b/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css new file mode 100644 index 000000000000..54046a8f2a17 --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css @@ -0,0 +1,126 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.runtime-extensions-editor .monaco-list .monaco-list-rows > .monaco-list-row.odd { + background-color: #f5f5f5; +} + +.runtime-extensions-editor .monaco-list .monaco-list-rows > .monaco-list-row:hover:not(.odd) { + background-color: transparent; +} + +.runtime-extensions-editor .extension { + display: flex; + padding-left: 20px; + padding-right: 20px; +} + +.runtime-extensions-editor .extension .desc { + flex: 1; + padding: 4px 0; +} + +.runtime-extensions-editor .extension .desc .name { + font-weight: bold; +} + +.runtime-extensions-editor .extension .time { + padding: 4px; + text-align: right; +} + +.runtime-extensions-editor .extension .desc .msg-label { + padding-left: 4px; +} + + +.runtime-extensions-editor .extension .profile-timeline { + width: 100px; + margin: auto; + padding: 0 4px; +} + +.runtime-extensions-editor .extension .profile-timeline-svg { + width: 100%; + pointer-events: none; +} + +.runtime-extensions-editor .extension .profile-timeline rect { + fill: rgb(181, 181, 255); +} + +.runtime-extensions-editor .extension > .icon { + width: 42px; + height: 42px; + padding: 10px 14px 10px 0; +} + +.monaco-action-bar .extension-host-profile-start { + background: url('profile-start.svg') center center no-repeat; +} + +.monaco-action-bar .extension-host-profile-stop { + background: url('profile-stop.svg') center center no-repeat; +} + +.vs-dark .monaco-action-bar .extension-host-profile-start, +.hc-black .monaco-action-bar .extension-host-profile-start { + background: url('profile-start-inverse.svg') center center no-repeat; +} + +.vs-dark .monaco-action-bar .extension-host-profile-stop, +.hc-black .monaco-action-bar .extension-host-profile-stop { + background: url('profile-stop-inverse.svg') center center no-repeat; + animation:fade 1000ms infinite; + -webkit-animation:fade 1000ms infinite; +} + +.monaco-action-bar .save-extension-host-profile { + background: url('save.svg') center center no-repeat; +} + +.vs-dark .monaco-action-bar .save-extension-host-profile, +.hc-black .monaco-action-bar .save-extension-host-profile { + background: url('save-inverse.svg') center center no-repeat; +} + +.vs-dark .runtime-extensions-editor .monaco-list .monaco-list-rows > .monaco-list-row.odd, +.hc-black .runtime-extensions-editor .monaco-list .monaco-list-rows > .monaco-list-row.odd { + background-color: #262829; +} + +.runtime-extensions-editor .monaco-action-bar { + padding-top: 21px; + flex-shrink: 0; +} + +.runtime-extensions-editor .monaco-action-bar.hidden { + visibility: hidden; +} + + +.monaco-workbench .part.statusbar .profileExtHost-statusbar-item .icon { + background: url('profile-stop.svg') no-repeat; + display: inline-block; + padding-right: 2px; + padding-bottom: 2px; + width: 16px; + height: 16px; + vertical-align: middle; + animation:fade 1000ms infinite; + -webkit-animation:fade 1000ms infinite; +} + +@keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.5; } + to { opacity: 1.0; } +} + +@-webkit-keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.5; } + to { opacity: 1.0; } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg b/src/vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg new file mode 100644 index 000000000000..01c42bce304e --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/save.svg b/src/vs/workbench/parts/extensions/electron-browser/media/save.svg new file mode 100644 index 000000000000..01e1ca99bdff --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/media/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts new file mode 100644 index 000000000000..ed0034b4bb32 --- /dev/null +++ b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -0,0 +1,593 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./media/runtimeExtensionsEditor'; +import * as nls from 'vs/nls'; +import * as os from 'os'; +import product from 'vs/platform/node/product'; +import URI from 'vs/base/common/uri'; +import { EditorInput } from 'vs/workbench/common/editor'; +import pkg from 'vs/platform/node/package'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { Action, IAction } from 'vs/base/common/actions'; +import { Builder, Dimension } from 'vs/base/browser/builder'; +import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IExtensionsWorkbenchService, IExtension } from 'vs/workbench/parts/extensions/common/extensions'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IExtensionService, IExtensionDescription, IExtensionsStatus, IExtensionHostProfile } from 'vs/platform/extensions/common/extensions'; +import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; +import { WorkbenchList, IListService } from 'vs/platform/list/browser/listService'; +import { append, $, addClass, toggleClass } from 'vs/base/browser/dom'; +import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IMessageService, Severity } from 'vs/platform/message/common/message'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import { clipboard } from 'electron'; +import { LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IWindowService } from 'vs/platform/windows/common/windows'; +import { writeFile } from 'vs/base/node/pfs'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { memoize } from 'vs/base/common/decorators'; +import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import Event from 'vs/base/common/event'; + +export const IExtensionHostProfileService = createDecorator('extensionHostProfileService'); + +export const enum ProfileSessionState { + None = 0, + Starting = 1, + Running = 2, + Stopping = 3 +} + +export interface IExtensionHostProfileService { + _serviceBrand: any; + + readonly onDidChangeState: Event; + readonly onDidChangeLastProfile: Event; + + readonly state: ProfileSessionState; + readonly lastProfile: IExtensionHostProfile; + + startProfiling(): void; + stopProfiling(): void; + + clearLastProfile(): void; +} + +interface IExtensionProfileInformation { + /** + * segment when the extension was running. + * 2*i = segment start time + * 2*i+1 = segment end time + */ + segments: number[]; + /** + * total time when the extension was running. + * (sum of all segment lengths). + */ + totalTime: number; +} + +interface IRuntimeExtension { + originalIndex: number; + description: IExtensionDescription; + marketplaceInfo: IExtension; + status: IExtensionsStatus; + profileInfo: IExtensionProfileInformation; +} + +export class RuntimeExtensionsEditor extends BaseEditor { + + static ID: string = 'workbench.editor.runtimeExtensions'; + + private _list: WorkbenchList; + private _profileInfo: IExtensionHostProfile; + + private _elements: IRuntimeExtension[]; + private _extensionsDescriptions: IExtensionDescription[]; + private _updateSoon: RunOnceScheduler; + + constructor( + @ITelemetryService telemetryService: ITelemetryService, + @IThemeService themeService: IThemeService, + @IExtensionsWorkbenchService private readonly _extensionsWorkbenchService: IExtensionsWorkbenchService, + @IExtensionService private readonly _extensionService: IExtensionService, + @IListService private readonly _listService: IListService, + @IContextKeyService private readonly _contextKeyService: IContextKeyService, + @IMessageService private readonly _messageService: IMessageService, + @IContextMenuService private readonly _contextMenuService: IContextMenuService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IExtensionHostProfileService private readonly _extensionHostProfileService: IExtensionHostProfileService, + ) { + super(RuntimeExtensionsEditor.ID, telemetryService, themeService); + + this._list = null; + this._profileInfo = this._extensionHostProfileService.lastProfile; + this._register(this._extensionHostProfileService.onDidChangeLastProfile(() => { + this._profileInfo = this._extensionHostProfileService.lastProfile; + this._updateExtensions(); + })); + + this._elements = null; + + this._extensionsDescriptions = []; + this._updateExtensions(); + + this._updateSoon = this._register(new RunOnceScheduler(() => this._updateExtensions(), 200)); + + this._extensionService.getExtensions().then((extensions) => { + // We only deal with extensions with source code! + this._extensionsDescriptions = extensions.filter((extension) => { + return !!extension.main; + }); + this._updateExtensions(); + }); + this._register(this._extensionService.onDidChangeExtensionsStatus(() => this._updateSoon.schedule())); + } + + private _updateExtensions(): void { + this._elements = this._resolveExtensions(); + if (this._list) { + this._list.splice(0, this._list.length, this._elements); + } + } + + private _resolveExtensions(): IRuntimeExtension[] { + let marketplaceMap: { [id: string]: IExtension; } = Object.create(null); + for (let extension of this._extensionsWorkbenchService.local) { + marketplaceMap[extension.id] = extension; + } + + let statusMap = this._extensionService.getExtensionsStatus(); + + // group profile segments by extension + let segments: { [id: string]: number[]; } = Object.create(null); + + if (this._profileInfo) { + let currentStartTime = this._profileInfo.startTime; + for (let i = 0, len = this._profileInfo.deltas.length; i < len; i++) { + const id = this._profileInfo.ids[i]; + const delta = this._profileInfo.deltas[i]; + + let extensionSegments = segments[id]; + if (!extensionSegments) { + extensionSegments = []; + segments[id] = extensionSegments; + } + + extensionSegments.push(currentStartTime); + currentStartTime = currentStartTime + delta; + extensionSegments.push(currentStartTime); + } + } + + let result: IRuntimeExtension[] = []; + for (let i = 0, len = this._extensionsDescriptions.length; i < len; i++) { + const extensionDescription = this._extensionsDescriptions[i]; + + let profileInfo: IExtensionProfileInformation = null; + if (this._profileInfo) { + let extensionSegments = segments[extensionDescription.id] || []; + let extensionTotalTime = 0; + for (let j = 0, lenJ = extensionSegments.length / 2; j < lenJ; j++) { + const startTime = extensionSegments[2 * j]; + const endTime = extensionSegments[2 * j + 1]; + extensionTotalTime += (endTime - startTime); + } + profileInfo = { + segments: extensionSegments, + totalTime: extensionTotalTime + }; + } + + result[i] = { + originalIndex: i, + description: extensionDescription, + marketplaceInfo: marketplaceMap[extensionDescription.id], + status: statusMap[extensionDescription.id], + profileInfo: profileInfo + }; + } + + result = result.filter((element) => element.status.activationTimes); + + if (this._profileInfo) { + // sort descending by time spent in the profiler + result = result.sort((a, b) => { + if (a.profileInfo.totalTime === b.profileInfo.totalTime) { + return a.originalIndex - b.originalIndex; + } + return b.profileInfo.totalTime - a.profileInfo.totalTime; + }); + } + + return result; + } + + protected createEditor(parent: Builder): void { + const container = parent.getHTMLElement(); + + addClass(container, 'runtime-extensions-editor'); + + const TEMPLATE_ID = 'runtimeExtensionElementTemplate'; + + const delegate = new class implements IDelegate{ + getHeight(element: IRuntimeExtension): number { + return 62; + } + getTemplateId(element: IRuntimeExtension): string { + return TEMPLATE_ID; + } + }; + + interface IRuntimeExtensionTemplateData { + root: HTMLElement; + element: HTMLElement; + name: HTMLElement; + + activationTime: HTMLElement; + profileTime: HTMLElement; + + profileTimeline: HTMLElement; + + msgIcon: HTMLElement; + msgLabel: HTMLElement; + + actionbar: ActionBar; + disposables: IDisposable[]; + elementDisposables: IDisposable[]; + } + + const renderer: IRenderer = { + templateId: TEMPLATE_ID, + renderTemplate: (root: HTMLElement): IRuntimeExtensionTemplateData => { + const element = append(root, $('.extension')); + + const desc = append(element, $('div.desc')); + const name = append(desc, $('div.name')); + + const msgContainer = append(desc, $('div.msg')); + const msgIcon = append(msgContainer, $('.')); + const msgLabel = append(msgContainer, $('span.msg-label')); + + const timeContainer = append(element, $('.time')); + const activationTime = append(timeContainer, $('div.activation-time')); + const profileTime = append(timeContainer, $('div.profile-time')); + + const profileTimeline = append(element, $('div.profile-timeline')); + + const actionbar = new ActionBar(element, { + animated: false + }); + actionbar.onDidRun(({ error }) => error && this._messageService.show(Severity.Error, error)); + actionbar.push(new ReportExtensionIssueAction(), { icon: true, label: true }); + + const disposables = [actionbar]; + + return { + root, + element, + name, + actionbar, + activationTime, + profileTime, + profileTimeline, + msgIcon, + msgLabel, + disposables, + elementDisposables: [] + }; + }, + + renderElement: (element: IRuntimeExtension, index: number, data: IRuntimeExtensionTemplateData): void => { + + data.elementDisposables = dispose(data.elementDisposables); + + toggleClass(data.root, 'odd', index % 2 === 1); + + data.name.textContent = element.marketplaceInfo ? element.marketplaceInfo.displayName : element.description.displayName; + + const activationTimes = element.status.activationTimes; + let syncTime = activationTimes.codeLoadingTime + activationTimes.activateCallTime; + data.activationTime.textContent = activationTimes.startup ? `Startup Activation: ${syncTime}ms` : `Activation: ${syncTime}ms`; + data.actionbar.context = element; + toggleClass(data.actionbar.getContainer().getHTMLElement(), 'hidden', element.marketplaceInfo && element.marketplaceInfo.type === LocalExtensionType.User && (!element.description.repository || !element.description.repository.url)); + + let title: string; + if (activationTimes.activationEvent === '*') { + title = nls.localize('starActivation', "Activated on start-up"); + } else if (/^workspaceContains:/.test(activationTimes.activationEvent)) { + let fileNameOrGlob = activationTimes.activationEvent.substr('workspaceContains:'.length); + if (fileNameOrGlob.indexOf('*') >= 0 || fileNameOrGlob.indexOf('?') >= 0) { + title = nls.localize('workspaceContainsGlobActivation', "Activated because a file matching {0} exists in your workspace", fileNameOrGlob); + } else { + title = nls.localize('workspaceContainsFileActivation', "Activated because file {0} exists in your workspace", fileNameOrGlob); + } + } else if (/^onLanguage:/.test(activationTimes.activationEvent)) { + let language = activationTimes.activationEvent.substr('onLanguage:'.length); + title = nls.localize('languageActivation', "Activated because you opened a {0} file", language); + } else { + title = nls.localize('workspaceGenericActivation', "Activated on {0}", activationTimes.activationEvent); + } + data.activationTime.title = title; + if (!isFalsyOrEmpty(element.status.runtimeErrors)) { + data.msgIcon.className = 'octicon octicon-bug'; + data.msgLabel.textContent = nls.localize('errors', "{0} uncaught errors", element.status.runtimeErrors.length); + } else if (element.status.messages && element.status.messages.length > 0) { + data.msgIcon.className = 'octicon octicon-alert'; + data.msgLabel.textContent = element.status.messages[0].message; + } else { + data.msgIcon.className = ''; + data.msgLabel.textContent = ''; + } + + if (this._profileInfo) { + data.profileTime.textContent = `Profile: ${(element.profileInfo.totalTime / 1000).toFixed(2)}ms`; + const elementSegments = element.profileInfo.segments; + let inner = ''; + for (let i = 0, len = elementSegments.length / 2; i < len; i++) { + const absoluteStart = elementSegments[2 * i]; + const absoluteEnd = elementSegments[2 * i + 1]; + + const start = absoluteStart - this._profileInfo.startTime; + const end = absoluteEnd - this._profileInfo.startTime; + + const absoluteDuration = this._profileInfo.endTime - this._profileInfo.startTime; + + const xStart = start / absoluteDuration * 100; + const xEnd = end / absoluteDuration * 100; + + inner += ``; + } + let svg = `${inner}`; + + data.profileTimeline.innerHTML = svg; + data.profileTimeline.style.display = 'inherit'; + } else { + data.profileTime.textContent = ''; + data.profileTimeline.innerHTML = ''; + } + }, + + disposeTemplate: (data: IRuntimeExtensionTemplateData): void => { + data.disposables = dispose(data.disposables); + } + }; + + this._list = new WorkbenchList(container, delegate, [renderer], { + multipleSelectionSupport: false + }, this._contextKeyService, this._listService, this.themeService); + + this._list.splice(0, this._list.length, this._elements); + + this._list.onContextMenu((e) => { + const actions: IAction[] = []; + + actions.push(this.saveExtensionHostProfileAction, this.extensionHostProfileAction); + + this._contextMenuService.showContextMenu({ + getAnchor: () => e.anchor, + getActions: () => TPromise.as(actions) + }); + }); + } + + public getActions(): IAction[] { + return [ + this.saveExtensionHostProfileAction, + this.extensionHostProfileAction + ]; + } + + @memoize + private get extensionHostProfileAction(): IAction { + return this._instantiationService.createInstance(ExtensionHostProfileAction, ExtensionHostProfileAction.ID, ExtensionHostProfileAction.LABEL_START); + } + + @memoize + private get saveExtensionHostProfileAction(): IAction { + return this._instantiationService.createInstance(SaveExtensionHostProfileAction, SaveExtensionHostProfileAction.ID, SaveExtensionHostProfileAction.LABEL); + } + + public layout(dimension: Dimension): void { + this._list.layout(dimension.height); + } +} + +export class RuntimeExtensionsInput extends EditorInput { + + static ID = 'workbench.runtimeExtensions.input'; + + constructor() { + super(); + } + + getTypeId(): string { + return RuntimeExtensionsInput.ID; + } + + getName(): string { + return nls.localize('extensionsInputName', "Running Extensions"); + } + + matches(other: any): boolean { + if (!(other instanceof RuntimeExtensionsInput)) { + return false; + } + return true; + } + + resolve(refresh?: boolean): TPromise { + return TPromise.as(null); + } + + supportsSplitEditor(): boolean { + return false; + } + + getResource(): URI { + return URI.from({ + scheme: 'runtime-extensions', + path: 'default' + }); + } +} + +export class ShowRuntimeExtensionsAction extends Action { + static ID = 'workbench.action.showRuntimeExtensions'; + static LABEL = nls.localize('showRuntimeExtensions', "Show Running Extensions"); + + constructor( + id: string, label: string, + @IWorkbenchEditorService private readonly _editorService: IWorkbenchEditorService, + @IInstantiationService private readonly _instantiationService: IInstantiationService + ) { + super(id, label); + } + + public run(e?: any): TPromise { + return this._editorService.openEditor(this._instantiationService.createInstance(RuntimeExtensionsInput), { revealIfOpened: true }); + } +} + +class ReportExtensionIssueAction extends Action { + static ID = 'workbench.extensions.action.reportExtensionIssue'; + static LABEL = nls.localize('reportExtensionIssue', "Report Issue"); + + constructor( + id: string = ReportExtensionIssueAction.ID, label: string = ReportExtensionIssueAction.LABEL + ) { + super(id, label, 'extension-action report-issue'); + } + + run(extension: IRuntimeExtension): TPromise { + clipboard.writeText('```json \n' + JSON.stringify(extension.status, null, '\t') + '\n```'); + window.open(this.generateNewIssueUrl(extension)); + + return TPromise.as(null); + } + + private generateNewIssueUrl(extension: IRuntimeExtension): string { + let baseUrl = extension.marketplaceInfo && extension.marketplaceInfo.type === LocalExtensionType.User && extension.description.repository ? extension.description.repository.url : undefined; + if (!!baseUrl) { + baseUrl = `${baseUrl.indexOf('.git') !== -1 ? baseUrl.substr(0, baseUrl.length - 4) : baseUrl}/issues/new/`; + } else { + baseUrl = product.reportIssueUrl; + } + + const osVersion = `${os.type()} ${os.arch()} ${os.release()}`; + const queryStringPrefix = baseUrl.indexOf('?') === -1 ? '?' : '&'; + const body = encodeURIComponent( + `- Extension Name: ${extension.description.name} +- Extension Version: ${extension.description.version} +- OS Version: ${osVersion} +- VSCode version: ${pkg.version}` + '\n\n We have written the needed data into your clipboard. Please paste:' + ); + + return `${baseUrl}${queryStringPrefix}body=${body}`; + } +} + +class ExtensionHostProfileAction extends Action { + static ID = 'workbench.extensions.action.extensionHostProfile'; + static LABEL_START = nls.localize('extensionHostProfileStart', "Start Extension Host Profile"); + static LABEL_STOP = nls.localize('extensionHostProfileStop', "Stop Extension Host Profile"); + static STOP_CSS_CLASS = 'extension-host-profile-stop'; + static START_CSS_CLASS = 'extension-host-profile-start'; + + constructor( + id: string = ExtensionHostProfileAction.ID, label: string = ExtensionHostProfileAction.LABEL_START, + @IExtensionHostProfileService private readonly _extensionHostProfileService: IExtensionHostProfileService, + ) { + super(id, label, ExtensionHostProfileAction.START_CSS_CLASS); + + this._extensionHostProfileService.onDidChangeState(() => this._update()); + } + + private _update(): void { + const state = this._extensionHostProfileService.state; + + if (state === ProfileSessionState.Running) { + this.class = ExtensionHostProfileAction.STOP_CSS_CLASS; + this.label = ExtensionHostProfileAction.LABEL_STOP; + } else { + this.class = ExtensionHostProfileAction.START_CSS_CLASS; + this.label = ExtensionHostProfileAction.LABEL_START; + } + } + + run(): TPromise { + const state = this._extensionHostProfileService.state; + + if (state === ProfileSessionState.Running) { + this._extensionHostProfileService.stopProfiling(); + } else if (state === ProfileSessionState.None) { + this._extensionHostProfileService.startProfiling(); + } + + return TPromise.as(null); + } +} + +class SaveExtensionHostProfileAction extends Action { + + static LABEL = nls.localize('saveExtensionHostProfile', "Save Extension Host Profile"); + static ID = 'workbench.extensions.action.saveExtensionHostProfile'; + + constructor( + id: string = SaveExtensionHostProfileAction.ID, label: string = SaveExtensionHostProfileAction.LABEL, + @IWindowService private readonly _windowService: IWindowService, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, + @IExtensionHostProfileService private readonly _extensionHostProfileService: IExtensionHostProfileService, + ) { + super(id, label, 'save-extension-host-profile', false); + this.enabled = (this._extensionHostProfileService.lastProfile !== null); + this._extensionHostProfileService.onDidChangeLastProfile(() => { + this.enabled = (this._extensionHostProfileService.lastProfile !== null); + }); + } + + async run(): TPromise { + let picked = this._windowService.showSaveDialog({ + title: 'Save Extension Host Profile', + buttonLabel: 'Save', + defaultPath: `CPU-${new Date().toISOString().replace(/[\-:]/g, '')}.cpuprofile`, + filters: [{ + name: 'CPU Profiles', + extensions: ['cpuprofile', 'txt'] + }] + }); + + if (!picked) { + return; + } + + const profileInfo = this._extensionHostProfileService.lastProfile; + let dataToWrite: object = profileInfo.data; + + if (this._environmentService.isBuilt) { + const profiler = await import('v8-inspect-profiler'); + // when running from a not-development-build we remove + // absolute filenames because we don't want to reveal anything + // about users. We also append the `.txt` suffix to make it + // easier to attach these files to GH issues + + let tmp = profiler.rewriteAbsolutePaths({ profile: dataToWrite }, 'piiRemoved'); + dataToWrite = tmp.profile; + + picked = picked + '.txt'; + } + + return writeFile(picked, JSON.stringify(profileInfo.data, null, '\t')); + } +} diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index 2bf8ce1397b2..9208d1a21ede 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -181,8 +181,12 @@ class Extension implements IExtension { return this.gallery ? this.gallery.preview : false; } + private isGalleryOutdated(): boolean { + return this.local && this.gallery && semver.gt(this.local.manifest.version, this.gallery.version); + } + getManifest(): TPromise { - if (this.gallery) { + if (this.gallery && !this.isGalleryOutdated()) { if (this.gallery.assets.manifest) { return this.galleryService.getManifest(this.gallery); } @@ -194,7 +198,7 @@ class Extension implements IExtension { } getReadme(): TPromise { - if (this.gallery) { + if (this.gallery && !this.isGalleryOutdated()) { if (this.gallery.assets.readme) { return this.galleryService.getReadme(this.gallery); } @@ -210,7 +214,7 @@ class Extension implements IExtension { } getChangelog(): TPromise { - if (this.gallery && this.gallery.assets.changelog) { + if (this.gallery && this.gallery.assets.changelog && !this.isGalleryOutdated()) { return this.galleryService.getChangelog(this.gallery); } @@ -231,12 +235,12 @@ class Extension implements IExtension { get dependencies(): string[] { const { local, gallery } = this; + if (gallery && !this.isGalleryOutdated()) { + return gallery.properties.dependencies; + } if (local && local.manifest.extensionDependencies) { return local.manifest.extensionDependencies; } - if (gallery) { - return gallery.properties.dependencies; - } return []; } } @@ -420,14 +424,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { } open(extension: IExtension, sideByside: boolean = false): TPromise { - /* __GDPR__ - "extensionGallery:open" : { - "${include}": [ - "${GalleryExtensionTelemetryData}" - ] - } - */ - this.telemetryService.publicLog('extensionGallery:open', extension.telemetryData); return this.editorService.openEditor(this.instantiationService.createInstance(ExtensionsInput, extension), null, sideByside); } @@ -438,7 +434,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { // Loading the compatible version only there is an engine property // Otherwise falling back to old way so that we will not make many roundtrips if (gallery.properties.engine) { - this.galleryService.loadCompatibleVersion(gallery).then(compatible => this.syncLocalWithGalleryExtension(installed, compatible)); + this.galleryService.loadCompatibleVersion(gallery) + .then(compatible => compatible ? this.syncLocalWithGalleryExtension(installed, compatible) : null); } else { this.syncLocalWithGalleryExtension(installed, gallery); } @@ -748,9 +745,16 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { if (extension) { this.installing = installing ? this.installing.filter(e => e !== installing) : this.installing; - if (!error) { + if (error) { + if (extension.gallery) { + // Updating extension can be only a gallery extension + const installed = this.installed.filter(e => e.id === extension.id)[0]; + if (installed && installing) { + installing.operation = Operation.Updating; + } + } + } else { extension.local = local; - const installed = this.installed.filter(e => e.id === extension.id)[0]; if (installed) { if (installing) { diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index fa5f2c65fdd9..38d0d179cfe7 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -279,7 +279,7 @@ suite('ExtensionsWorkbenchService Test', () => { assert.equal(4, actual.rating); assert.equal(100, actual.ratingCount); assert.equal(true, actual.outdated); - assert.deepEqual(['pub.1', 'pub.2'], actual.dependencies); + assert.deepEqual(['pub.1'], actual.dependencies); actual = actuals[1]; assert.equal(LocalExtensionType.System, actual.type); diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts index 6af8ce910c7f..ab024a2c681e 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts @@ -44,7 +44,7 @@ class TwitterFeedbackService implements IFeedbackService { length += ` via @${TwitterFeedbackService.VIA_NAME}`.length; } - return 140 - length; + return 280 - length; } } @@ -88,4 +88,4 @@ export class FeedbackStatusbarItem extends Themable implements IStatusbarItem { return null; } -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts b/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts index 56624ba490d8..a4b89ff6e860 100644 --- a/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts +++ b/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts @@ -27,6 +27,7 @@ import { ResourceQueue } from 'vs/base/common/async'; import { ResourceMap } from 'vs/base/common/map'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; +import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; export class FileEditorTracker implements IWorkbenchContribution { @@ -141,8 +142,7 @@ export class FileEditorTracker implements IWorkbenchContribution { // We have received reports of users seeing delete events even though the file still // exists (network shares issue: https://github.com/Microsoft/vscode/issues/13665). // Since we do not want to close an editor without reason, we have to check if the - // file is really gone and not just a faulty file event (TODO@Ben revisit when we - // have a more stable file watcher in place for this scenario). + // file is really gone and not just a faulty file event. // This only applies to external file events, so we need to check for the isExternal // flag. let checkExists: TPromise; @@ -263,8 +263,16 @@ export class FileEditorTracker implements IWorkbenchContribution { editors.forEach(editor => { const resource = toResource(editor.input, { supportSideBySide: true }); + // Support side-by-side binary editors too + let isBinaryEditor = false; + if (editor instanceof SideBySideEditor) { + isBinaryEditor = editor.getMasterEditor().getId() === BINARY_FILE_EDITOR_ID; + } else { + isBinaryEditor = editor.getId() === BINARY_FILE_EDITOR_ID; + } + // Binary editor that should reload from event - if (resource && editor.getId() === BINARY_FILE_EDITOR_ID && (e.contains(resource, FileChangeType.UPDATED) || e.contains(resource, FileChangeType.ADDED))) { + if (resource && isBinaryEditor && (e.contains(resource, FileChangeType.UPDATED) || e.contains(resource, FileChangeType.ADDED))) { this.editorService.openEditor(editor.input, { forceOpen: true, preserveFocus: true }, editor.position).done(null, errors.onUnexpectedError); } }); diff --git a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts b/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts index 0b7c07c9f749..37df37a64d75 100644 --- a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts +++ b/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts @@ -21,7 +21,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable, dispose, IReference } from 'vs/base/common/lifecycle'; import { telemetryURIDescriptor } from 'vs/platform/telemetry/common/telemetryUtils'; -import { Verbosity } from 'vs/platform/editor/common/editor'; +import { Verbosity, IRevertOptions } from 'vs/platform/editor/common/editor'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; @@ -222,8 +222,8 @@ export class FileEditorInput extends EditorInput implements IFileEditorInput { return this.textFileService.save(this.resource); } - public revert(): TPromise { - return this.textFileService.revert(this.resource); + public revert(options?: IRevertOptions): TPromise { + return this.textFileService.revert(this.resource, options); } public getPreferredEditorId(candidates: string[]): string { @@ -240,7 +240,7 @@ export class FileEditorInput extends EditorInput implements IFileEditorInput { // Resolve as text return this.textFileService.models.loadOrCreate(this.resource, { encoding: this.preferredEncoding, reload: refresh }).then(model => { - // TODO@Ben this is a bit ugly, because we first resolve the model and then resolve a model reference. the reason being that binary + // This is a bit ugly, because we first resolve the model and then resolve a model reference. the reason being that binary // or very large files do not resolve to a text file model but should be opened as binary files without text. First calling into // loadOrCreate ensures we are not creating model references for these kind of resources. // In addition we have a bit of payload to take into account (encoding, reload) that the text resolver does not handle yet. diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index 0bb9d5ee7f15..b817c7091926 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -20,6 +20,7 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IViewlet } from 'vs/workbench/common/viewlet'; +import { InputFocusedContextKey } from 'vs/platform/workbench/common/contextkeys'; /** * Explorer viewlet id. @@ -46,14 +47,14 @@ const explorerResourceIsFolderId = 'explorerResourceIsFolder'; export const ExplorerViewletVisibleContext = new RawContextKey(explorerViewletVisibleId, true); export const ExplorerFolderContext = new RawContextKey(explorerResourceIsFolderId, false); -export const FilesExplorerFocusedContext = new RawContextKey(filesExplorerFocusId, false); +export const FilesExplorerFocusedContext = new RawContextKey(filesExplorerFocusId, true); export const OpenEditorsVisibleContext = new RawContextKey(openEditorsVisibleId, false); -export const OpenEditorsFocusedContext = new RawContextKey(openEditorsFocusId, false); -export const ExplorerFocusedContext = new RawContextKey(explorerViewletFocusId, false); +export const OpenEditorsFocusedContext = new RawContextKey(openEditorsFocusId, true); +export const ExplorerFocusedContext = new RawContextKey(explorerViewletFocusId, true); export const OpenEditorsVisibleCondition = ContextKeyExpr.has(openEditorsVisibleId); -export const FilesExplorerFocusCondition = ContextKeyExpr.and(ContextKeyExpr.has(explorerViewletVisibleId), ContextKeyExpr.has(filesExplorerFocusId)); -export const ExplorerFocusCondition = ContextKeyExpr.and(ContextKeyExpr.has(explorerViewletVisibleId), ContextKeyExpr.has(explorerViewletFocusId)); +export const FilesExplorerFocusCondition = ContextKeyExpr.and(ContextKeyExpr.has(explorerViewletVisibleId), ContextKeyExpr.has(filesExplorerFocusId), ContextKeyExpr.not(InputFocusedContextKey)); +export const ExplorerFocusCondition = ContextKeyExpr.and(ContextKeyExpr.has(explorerViewletVisibleId), ContextKeyExpr.has(explorerViewletFocusId), ContextKeyExpr.not(InputFocusedContextKey)); /** * File editor input id. diff --git a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts b/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts index e06c2e39dc93..b7b9b3cd8d8e 100644 --- a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts @@ -12,7 +12,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as DOM from 'vs/base/browser/dom'; import { Builder } from 'vs/base/browser/builder'; import { VIEWLET_ID, ExplorerViewletVisibleContext, IFilesConfiguration, OpenEditorsVisibleContext, OpenEditorsVisibleCondition, IExplorerViewlet } from 'vs/workbench/parts/files/common/files'; -import { PersistentViewsViewlet, ViewsViewletPanel, IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { PersistentViewsViewlet, IViewletViewOptions, ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { ActionRunner, FileViewletState } from 'vs/workbench/parts/files/electron-browser/views/explorerViewer'; import { ExplorerView, IExplorerViewOptions } from 'vs/workbench/parts/files/electron-browser/views/explorerView'; @@ -271,7 +271,7 @@ export class ExplorerViewlet extends PersistentViewsViewlet implements IExplorer return false; } - if (view instanceof ExplorerView || view instanceof OpenEditorsView) { + if (view instanceof ExplorerView) { const viewer = view.getViewer(); if (!viewer) { return false; @@ -280,6 +280,9 @@ export class ExplorerViewlet extends PersistentViewsViewlet implements IExplorer return !!viewer.getFocus() || (viewer.getSelection() && viewer.getSelection().length > 0); } + if (view instanceof OpenEditorsView && !!view.getList()) { + return view.getList().isDOMFocused(); + } return false; } diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 5dbf38e45153..2b3598a96bab 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -693,7 +693,7 @@ export class BaseDeleteFileAction extends BaseFileAction { message = nls.localize('dirtyMessageFileDelete', "You are deleting a file with unsaved changes. Do you want to continue?"); } - const res = this.messageService.confirmSync({ + const res = this.messageService.confirm({ message, type: 'warning', detail: nls.localize('dirtyWarning', "Your changes will be lost if you don't save them."), @@ -719,7 +719,7 @@ export class BaseDeleteFileAction extends BaseFileAction { // Confirm for moving to trash else if (this.useTrash) { - confirmPromise = this.messageService.confirm({ + confirmPromise = this.messageService.confirmWithCheckbox({ message: this.element.isDirectory ? nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", this.element.name) : nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", this.element.name), detail: isWindows ? nls.localize('undoBin', "You can restore from the recycle bin.") : nls.localize('undoTrash', "You can restore from the trash."), primaryButton, @@ -732,7 +732,7 @@ export class BaseDeleteFileAction extends BaseFileAction { // Confirm for deleting permanently else { - confirmPromise = this.messageService.confirm({ + confirmPromise = this.messageService.confirmWithCheckbox({ message: this.element.isDirectory ? nls.localize('confirmDeleteMessageFolder', "Are you sure you want to permanently delete '{0}' and its contents?", this.element.name) : nls.localize('confirmDeleteMessageFile', "Are you sure you want to permanently delete '{0}'?", this.element.name), detail: nls.localize('irreversible', "This action is irreversible!"), primaryButton, @@ -861,7 +861,7 @@ export class ImportFileAction extends BaseFileAction { type: 'warning' }; - overwrite = this.messageService.confirmSync(confirm); + overwrite = this.messageService.confirm(confirm); } if (!overwrite) { @@ -1141,7 +1141,9 @@ export class OpenToSideAction extends Action { public run(): TPromise { // Remove highlight - this.tree.clearHighlight(); + if (this.tree) { + this.tree.clearHighlight(); + } // Set side input return this.editorService.openEditor({ @@ -1668,7 +1670,8 @@ export class RevertFileAction extends Action { id: string, label: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @ITextFileService private textFileService: ITextFileService + @ITextFileService private textFileService: ITextFileService, + @IMessageService private messageService: IMessageService ) { super(id, label); @@ -1688,7 +1691,9 @@ export class RevertFileAction extends Action { } if (resource && resource.scheme !== 'untitled') { - return this.textFileService.revert(resource, { force: true }); + return this.textFileService.revert(resource, { force: true }).then(null, error => { + this.messageService.show(Severity.Error, nls.localize('genericRevertError', "Failed to revert '{0}': {1}", paths.basename(resource.fsPath), toErrorMessage(error, false))); + }); } return TPromise.as(true); @@ -1713,7 +1718,7 @@ export class FocusOpenEditorsView extends Action { const openEditorsView = viewlet.getOpenEditorsView(); if (openEditorsView) { openEditorsView.setExpanded(true); - openEditorsView.getViewer().DOMFocus(); + openEditorsView.getList().domFocus(); } }); } diff --git a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts index b2eeab111dd6..40455bd3cb2b 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts @@ -174,21 +174,22 @@ export function withFocusedFilesExplorer(accessor: ServicesAccessor): TPromise<{ }); } -function withFocusedOpenEditorsViewItem(accessor: ServicesAccessor): TPromise<{ explorer: ExplorerViewlet, tree: ITree, item: OpenEditor }> { +function withFocusedOpenEditorsViewItem(accessor: ServicesAccessor): TPromise<{ explorer: ExplorerViewlet, item: OpenEditor }> { return withVisibleExplorer(accessor).then(explorer => { - if (!explorer || !explorer.getOpenEditorsView()) { + if (!explorer || !explorer.getOpenEditorsView() || !explorer.getOpenEditorsView().getList()) { return void 0; // empty folder or hidden explorer } - const tree = explorer.getOpenEditorsView().getViewer(); + const list = explorer.getOpenEditorsView().getList(); // Ignore if in highlight mode or not focused - const focus = tree.getFocus(); - if (tree.getHighlight() || !tree.isDOMFocused() || !(focus instanceof OpenEditor)) { + const focused = list.getFocusedElements(); + const focus = focused.length ? focused[0] : undefined; + if (!list.isDOMFocused() || !(focus instanceof OpenEditor)) { return void 0; } - return { explorer, tree, item: focus }; + return { explorer, item: focus }; }); } diff --git a/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css b/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css index 07ff1c0ca4b4..ef3c88021fd6 100644 --- a/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css +++ b/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css @@ -41,11 +41,12 @@ flex: 0; /* do not steal space when label is hidden because we are in edit mode */ } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row { + padding-left: 22px; display: flex; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content > .monaco-action-bar { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row > .monaco-action-bar { visibility: hidden; } @@ -106,32 +107,32 @@ display: none; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row:hover > .content .monaco-action-bar, -.explorer-viewlet .explorer-open-editors .monaco-tree.focused .monaco-tree-row.focused > .content .monaco-action-bar, -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content.dirty > .monaco-action-bar { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row:hover > .monaco-action-bar, +.explorer-viewlet .explorer-open-editors .monaco-list.focused .monaco-list-row.focused > .monaco-action-bar, +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row.dirty > .monaco-action-bar { visibility: visible; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content .monaco-action-bar .action-label { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row > .monaco-action-bar .action-label { display: block; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content .monaco-action-bar .close-editor-action { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row > .monaco-action-bar .close-editor-action { width: 8px; height: 22px; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content .monaco-action-bar .action-close-all-files, -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content .monaco-action-bar .save-all { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row > .monaco-action-bar .action-close-all-files, +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row > .monaco-action-bar .save-all { width: 23px; height: 22px; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content > .open-editor { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row > .open-editor { flex: 1; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content > .editor-group { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row > .editor-group { flex: 1; } @@ -169,7 +170,7 @@ height: 20px; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row .editor-group { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row .editor-group { font-size: 11px; font-weight: bold; text-transform: uppercase; @@ -177,10 +178,10 @@ } /* Bold font style does not go well with CJK fonts */ -.explorer-viewlet:lang(zh-Hans) .explorer-open-editors .monaco-tree .monaco-tree-row .editor-group, -.explorer-viewlet:lang(zh-Hant) .explorer-open-editors .monaco-tree .monaco-tree-row .editor-group, -.explorer-viewlet:lang(ja) .explorer-open-editors .monaco-tree .monaco-tree-row .editor-group, -.explorer-viewlet:lang(ko) .explorer-open-editors .monaco-tree .monaco-tree-row .editor-group { +.explorer-viewlet:lang(zh-Hans) .explorer-open-editors .monaco-list .monaco-list-row .editor-group, +.explorer-viewlet:lang(zh-Hant) .explorer-open-editors .monaco-list .monaco-list-row .editor-group, +.explorer-viewlet:lang(ja) .explorer-open-editors .monaco-list .monaco-list-row .editor-group, +.explorer-viewlet:lang(ko) .explorer-open-editors .monaco-list .monaco-list-row .editor-group { font-weight: normal; } diff --git a/src/vs/workbench/parts/files/electron-browser/media/fileactions.css b/src/vs/workbench/parts/files/electron-browser/media/fileactions.css index 0954b8841ce7..a073640bc8f5 100644 --- a/src/vs/workbench/parts/files/electron-browser/media/fileactions.css +++ b/src/vs/workbench/parts/files/electron-browser/media/fileactions.css @@ -104,20 +104,20 @@ background: url("action-close.svg") center center no-repeat; } -.explorer-viewlet .explorer-open-editors .focused .monaco-tree-row.selected:not(.highlighted) > .content .close-editor-action { +.explorer-viewlet .explorer-open-editors .focused .monaco-list-row.selected:not(.highlighted) .close-editor-action { background: url("action-close-focus.svg") center center no-repeat; } -.explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row:not(:hover) > .content.dirty > .monaco-action-bar .close-editor-action { +.explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row.dirty:not(:hover) > .monaco-action-bar .close-editor-action { background: url("action-close-dirty.svg") center center no-repeat; } -.vs-dark .explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row:not(:hover) > .content.dirty > .monaco-action-bar .close-editor-action, -.hc-black .monaco-workbench .explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row:not(:hover) > .content.dirty > .monaco-action-bar .close-editor-action { +.vs-dark .explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row.dirty:not(:hover) > .monaco-action-bar .close-editor-action, +.hc-black .monaco-workbench .explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row.dirty:not(:hover) > .monaco-action-bar .close-editor-action { background: url("action-close-dirty-dark.svg") center center no-repeat; } -.explorer-viewlet .explorer-open-editors .monaco-tree.focused .monaco-tree-row.selected:not(:hover) > .content.dirty > .monaco-action-bar .close-editor-action { +.explorer-viewlet .explorer-open-editors .monaco-list.focused .monaco-list-row.selected.dirty:not(:hover) > .monaco-action-bar .close-editor-action { background: url("action-close-dirty-focus.svg") center center no-repeat; } diff --git a/src/vs/workbench/parts/files/electron-browser/views/emptyView.ts b/src/vs/workbench/parts/files/electron-browser/views/emptyView.ts index 95667aa866e3..50804c6c0cdf 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/emptyView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/emptyView.ts @@ -13,7 +13,7 @@ import { IAction } from 'vs/base/common/actions'; import { Button } from 'vs/base/browser/ui/button/button'; import { $, Builder } from 'vs/base/browser/builder'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IViewletViewOptions, IViewOptions, ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { OpenFolderAction, OpenFileFolderAction, AddRootFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; import { attachButtonStyler } from 'vs/platform/theme/common/styler'; diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts index 9ac2116768f4..7823cae29c38 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts @@ -8,7 +8,7 @@ import nls = require('vs/nls'); import { TPromise } from 'vs/base/common/winjs.base'; import { Builder, $ } from 'vs/base/browser/builder'; import URI from 'vs/base/common/uri'; -import { ThrottledDelayer, sequence, Delayer } from 'vs/base/common/async'; +import { ThrottledDelayer, Delayer } from 'vs/base/common/async'; import errors = require('vs/base/common/errors'); import paths = require('vs/base/common/paths'); import resources = require('vs/base/common/resources'); @@ -16,8 +16,6 @@ import glob = require('vs/base/common/glob'); import { Action, IAction } from 'vs/base/common/actions'; import { prepareActions } from 'vs/workbench/browser/actions'; import { memoize } from 'vs/base/common/decorators'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocusedContext, ExplorerFocusedContext, SortOrderConfiguration, SortOrder, IExplorerView } from 'vs/workbench/parts/files/common/files'; import { FileOperation, FileOperationEvent, IResolveFileOptions, FileChangeType, FileChangesEvent, IFileService, FILES_EXCLUDE_CONFIG } from 'vs/platform/files/common/files'; import { RefreshViewExplorerAction, NewFolderAction, NewFileAction } from 'vs/workbench/parts/files/electron-browser/fileActions'; @@ -27,9 +25,8 @@ import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import * as DOM from 'vs/base/browser/dom'; import { CollapseAction } from 'vs/workbench/browser/viewlet'; -import { ViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { TreeViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { FileStat, Model } from 'vs/workbench/parts/files/common/explorerModel'; -import { IListService } from 'vs/platform/list/browser/listService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { ExplorerDecorationsProvider } from 'vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider'; @@ -45,14 +42,14 @@ import { ResourceContextKey } from 'vs/workbench/common/resources'; import { ResourceGlobMatcher } from 'vs/workbench/electron-browser/resources'; import { IWorkbenchThemeService, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { isLinux } from 'vs/base/common/platform'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; export interface IExplorerViewOptions extends IViewletViewOptions { viewletState: FileViewletState; } -export class ExplorerView extends ViewsViewletPanel implements IExplorerView { +export class ExplorerView extends TreeViewsViewletPanel implements IExplorerView { public static ID: string = 'workbench.explorer.fileView'; private static readonly EXPLORER_FILE_CHANGES_REACT_DELAY = 500; // delay in ms to react to file changes to give our internal events a chance to react first @@ -63,7 +60,7 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { public readonly id: string = ExplorerView.ID; - private explorerViewer: ITree; + private explorerViewer: WorkbenchTree; private filter: FileFilter; private viewletState: FileViewletState; @@ -72,9 +69,6 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { private resourceContext: ResourceContextKey; private folderContext: IContextKey; - private filesExplorerFocusedContext: IContextKey; - private explorerFocusedContext: IContextKey; - private fileEventsFilter: ResourceGlobMatcher; private shouldRefresh: boolean; @@ -95,7 +89,7 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { @IFileService private fileService: IFileService, @IPartService private partService: IPartService, @IKeybindingService keybindingService: IKeybindingService, - @IContextKeyService contextKeyService: IContextKeyService, + @IContextKeyService private contextKeyService: IContextKeyService, @IConfigurationService private configurationService: IConfigurationService, @IWorkbenchThemeService private themeService: IWorkbenchThemeService, @IDecorationsService decorationService: IDecorationsService @@ -111,9 +105,6 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { this.resourceContext = instantiationService.createInstance(ResourceContextKey); this.folderContext = ExplorerFolderContext.bindTo(contextKeyService); - this.filesExplorerFocusedContext = FilesExplorerFocusedContext.bindTo(contextKeyService); - this.explorerFocusedContext = ExplorerFocusedContext.bindTo(contextKeyService); - this.fileEventsFilter = instantiationService.createInstance( ResourceGlobMatcher, (root: URI) => this.getFileEventsExcludes(root), @@ -406,7 +397,7 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { return model; } - public createViewer(container: Builder): ITree { + public createViewer(container: Builder): WorkbenchTree { const dataSource = this.instantiationService.createInstance(FileDataSource); const renderer = this.instantiationService.createInstance(FileRenderer, this.viewletState); const controller = this.instantiationService.createInstance(FileController, this.viewletState); @@ -417,7 +408,7 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { const dnd = this.instantiationService.createInstance(FileDragAndDrop); const accessibilityProvider = this.instantiationService.createInstance(FileAccessibilityProvider); - this.explorerViewer = new Tree(container.getHTMLElement(), { + this.explorerViewer = new WorkbenchTree(container.getHTMLElement(), { dataSource, renderer, controller, @@ -431,13 +422,17 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { twistiePixels: 12, showTwistie: false, keyboardSupport: false - }); + }, this.contextKeyService, this.listService, this.themeService); - // Theme styler - this.disposables.push(attachListStyler(this.explorerViewer, this.themeService)); + // Bind context keys + const filesExplorerFocusedContextKey = FilesExplorerFocusedContext.bindTo(this.explorerViewer.contextKeyService); + const explorerFocusedContextKey = ExplorerFocusedContext.bindTo(this.explorerViewer.contextKeyService); - // Register to list service - this.disposables.push(this.listService.register(this.explorerViewer, [this.explorerFocusedContext, this.filesExplorerFocusedContext])); + // Update context keys + this.disposables.push(this.explorerViewer.onFocusChange(focused => { + filesExplorerFocusedContextKey.set(focused); + explorerFocusedContextKey.set(focused); + })); // Update Viewer based on File Change Events this.disposables.push(this.fileService.onAfterOperation(e => this.onFileOperation(e))); @@ -784,31 +779,70 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { }); } - // Load Root Stat with given target path configured + const promise = this.resolveRoots(targetsToResolve, targetsToExpand); + this.progressService.showWhile(promise, this.partService.isCreated() ? 800 : 3200 /* less ugly initial startup */); + + return promise; + } + + private resolveRoots(targetsToResolve: { root: FileStat, resource: URI, options: { resolveTo: any[] } }[], targetsToExpand: URI[]): TPromise { + + // Display roots only when multi folder workspace + const input = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER ? this.model.roots[0] : this.model; + const errorFileStat = (resource: URI, root: FileStat) => FileStat.create({ + resource: resource, + name: paths.basename(resource.fsPath), + mtime: 0, + etag: undefined, + isDirectory: true, + hasChildren: false + }, root); + + if (targetsToResolve.every(t => t.root.resource.scheme === 'file')) { + // All the roots are local, resolve them in parallel + return this.fileService.resolveFiles(targetsToResolve).then(results => { + // Convert to model + const modelStats = results.map((result, index) => { + if (result.success) { + return FileStat.create(result.stat, targetsToResolve[index].root, targetsToResolve[index].options.resolveTo); + } + + return errorFileStat(targetsToResolve[index].resource, targetsToResolve[index].root); + }); + // Subsequent refresh: Merge stat into our local model and refresh tree + modelStats.forEach((modelStat, index) => FileStat.mergeLocalWithDisk(modelStat, this.model.roots[index])); + + const statsToExpand: FileStat[] = this.explorerViewer.getExpandedElements().concat(targetsToExpand.map(expand => this.model.findClosest(expand))); + + if (input === this.explorerViewer.getInput()) { + return this.explorerViewer.refresh().then(() => statsToExpand.length ? this.explorerViewer.expandAll(statsToExpand) : undefined); + } + + // Make sure to expand all folders that where expanded in the previous session + // Special case: there is nothing to expand, thus expand all the roots (they might just be added) + if (statsToExpand.length === 0) { + statsToExpand.push(...this.model.roots); + } + return this.explorerViewer.setInput(input).then(() => statsToExpand.length ? this.explorerViewer.expandAll(statsToExpand) : undefined); + }); + } + + // There is a remote root, resolve the roots sequantally let statsToExpand: FileStat[] = []; let delayer = new Delayer(100); let delayerPromise: TPromise; - - const promise = TPromise.join(targetsToResolve.map((target, index) => this.fileService.resolveFile(target.resource, target.options) - .then(result => FileStat.create(result, target.root, target.options.resolveTo), err => FileStat.create({ - resource: target.resource, - name: resources.basenameOrAuthority(target.resource), - mtime: 0, - etag: undefined, - isDirectory: true, - hasChildren: false - }, target.root)) + return TPromise.join(targetsToResolve.map((target, index) => this.fileService.resolveFile(target.resource, target.options) + .then(result => FileStat.create(result, target.root, target.options.resolveTo), err => errorFileStat(target.resource, target.root)) .then(modelStat => { // Subsequent refresh: Merge stat into our local model and refresh tree FileStat.mergeLocalWithDisk(modelStat, this.model.roots[index]); - const input = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER ? this.model.roots[0] : this.model; let toExpand: FileStat[] = this.explorerViewer.getExpandedElements().concat(targetsToExpand.map(target => this.model.findClosest(target))); if (input === this.explorerViewer.getInput()) { statsToExpand = statsToExpand.concat(toExpand); if (!delayer.isTriggered()) { delayerPromise = delayer.trigger(() => this.explorerViewer.refresh() - .then(() => sequence(statsToExpand.map(e => () => this.explorerViewer.expand(e)))) + .then(() => this.explorerViewer.expandAll(statsToExpand)) .then(() => statsToExpand = []) ); } @@ -822,12 +856,8 @@ export class ExplorerView extends ViewsViewletPanel implements IExplorerView { // We have transitioned into workspace view -> expand all roots toExpand = this.model.roots.concat(toExpand); } - return this.explorerViewer.setInput(input).then(() => sequence(toExpand.map(e => () => this.explorerViewer.expand(e)))); + return this.explorerViewer.setInput(input).then(() => this.explorerViewer.expandAll(toExpand)); }))); - - this.progressService.showWhile(promise, this.partService.isCreated() ? 800 : 3200 /* less ugly initial startup */); - - return promise; } /** diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 766fcc010ad2..242683e3f091 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -56,6 +56,7 @@ import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common import { getPathLabel } from 'vs/base/common/labels'; import { extractResources } from 'vs/workbench/browser/editor'; import { relative } from 'path'; +import { DataTransfers } from 'vs/base/browser/dnd'; export class FileDataSource implements IDataSource { constructor( @@ -793,10 +794,10 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { // Apply some datatransfer types to allow for dragging the element outside of the application if (source) { if (!source.isDirectory) { - originalEvent.dataTransfer.setData('DownloadURL', [MIME_BINARY, source.name, source.resource.toString()].join(':')); + originalEvent.dataTransfer.setData(DataTransfers.DOWNLOAD_URL, [MIME_BINARY, source.name, source.resource.toString()].join(':')); } - originalEvent.dataTransfer.setData('text/plain', getPathLabel(source.resource)); + originalEvent.dataTransfer.setData(DataTransfers.TEXT, getPathLabel(source.resource)); } } @@ -915,7 +916,7 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { // If we are in no-workspace context, ask for confirmation to create a workspace let confirmed = true; if (this.contextService.getWorkbenchState() !== WorkbenchState.WORKSPACE) { - confirmed = this.messageService.confirmSync({ + confirmed = this.messageService.confirm({ message: folders.length > 1 ? nls.localize('dropFolders', "Do you want to add the folders to the workspace?") : nls.localize('dropFolder', "Do you want to add the folder to the workspace?"), type: 'question', primaryButton: folders.length > 1 ? nls.localize('addFolders', "&&Add Folders") : nls.localize('addFolder', "&&Add Folder") @@ -947,7 +948,7 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { // Handle confirm setting const confirmDragAndDrop = !isCopy && this.configurationService.getValue(FileDragAndDrop.CONFIRM_DND_SETTING_KEY); if (confirmDragAndDrop) { - confirmPromise = this.messageService.confirm({ + confirmPromise = this.messageService.confirmWithCheckbox({ message: nls.localize('confirmMove', "Are you sure you want to move '{0}'?", source.name), checkbox: { label: nls.localize('doNotAskAgain', "Do not ask me again") @@ -1039,7 +1040,7 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { }; // Move with overwrite if the user confirms - if (this.messageService.confirmSync(confirm)) { + if (this.messageService.confirm(confirm)) { const targetDirty = this.textFileService.getDirty().filter(d => resources.isEqualOrParent(d, targetResource, !isLinux /* ignorecase */)); // Make sure to revert all dirty in target first to be able to overwrite properly diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts index 31a79eec4233..8d23f75ad383 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts @@ -3,36 +3,43 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import nls = require('vs/nls'); -import errors = require('vs/base/common/errors'); +import * as nls from 'vs/nls'; +import * as errors from 'vs/base/common/errors'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { TPromise } from 'vs/base/common/winjs.base'; import { IAction } from 'vs/base/common/actions'; -import dom = require('vs/base/browser/dom'); -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; -import { IItemCollapseEvent } from 'vs/base/parts/tree/browser/treeModel'; +import * as dom from 'vs/base/browser/dom'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { Position, IEditorInput } from 'vs/platform/editor/common/editor'; import { IEditorStacksModel, IStacksModelChangeEvent, IEditorGroup } from 'vs/workbench/common/editor'; -import { SaveAllAction } from 'vs/workbench/parts/files/electron-browser/fileActions'; -import { ViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { VIEWLET_ID, OpenEditorsFocusedContext, ExplorerFocusedContext } from 'vs/workbench/parts/files/common/files'; +import { SaveAllAction, SaveAllInGroupAction, OpenToSideAction, SaveFileAction, RevertFileAction, SaveFileAsAction, CompareWithSavedAction, CompareResourcesAction, SelectResourceForCompareAction } from 'vs/workbench/parts/files/electron-browser/fileActions'; +import { IViewletViewOptions, IViewOptions, ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { OpenEditorsFocusedContext, ExplorerFocusedContext, IFilesConfiguration } from 'vs/workbench/parts/files/common/files'; import { ITextFileService, AutoSaveMode } from 'vs/workbench/services/textfile/common/textfiles'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { OpenEditor } from 'vs/workbench/parts/files/common/explorerModel'; -import { Renderer, DataSource, Controller, AccessibilityProvider, ActionProvider, DragAndDrop } from 'vs/workbench/parts/files/electron-browser/views/openEditorsViewer'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { CloseAllEditorsAction } from 'vs/workbench/browser/parts/editor/editorActions'; +import { CloseAllEditorsAction, CloseUnmodifiedEditorsInGroupAction, CloseEditorsInGroupAction, CloseOtherEditorsInGroupAction, CloseEditorAction } from 'vs/workbench/browser/parts/editor/editorActions'; import { ToggleEditorLayoutAction } from 'vs/workbench/browser/actions/toggleEditorLayout'; -import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IListService } from 'vs/platform/list/browser/listService'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; -import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { IListService, WorkbenchList } from 'vs/platform/list/browser/listService'; +import { IDelegate, IRenderer, IListContextMenuEvent, IListMouseEvent } from 'vs/base/browser/ui/list/list'; +import { EditorLabel } from 'vs/workbench/browser/labels'; +import { ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { ContributableActionProvider } from 'vs/workbench/browser/actions'; +import { memoize } from 'vs/base/common/decorators'; const $ = dom.$; @@ -45,27 +52,25 @@ export class OpenEditorsView extends ViewsViewletPanel { private model: IEditorStacksModel; private dirtyCountElement: HTMLElement; - private structuralTreeRefreshScheduler: RunOnceScheduler; + private listRefreshScheduler: RunOnceScheduler; private structuralRefreshDelay: number; - private groupToRefresh: IEditorGroup; - private fullRefreshNeeded: boolean; - - private openEditorsFocusedContext: IContextKey; - private explorerFocusedContext: IContextKey; + private list: WorkbenchList; + private needsRefresh: boolean; constructor( options: IViewletViewOptions, @IInstantiationService private instantiationService: IInstantiationService, @IContextMenuService contextMenuService: IContextMenuService, @ITextFileService private textFileService: ITextFileService, - @IEditorGroupService editorGroupService: IEditorGroupService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IEditorGroupService private editorGroupService: IEditorGroupService, @IConfigurationService private configurationService: IConfigurationService, @IKeybindingService keybindingService: IKeybindingService, @IListService private listService: IListService, @IUntitledEditorService private untitledEditorService: IUntitledEditorService, - @IContextKeyService contextKeyService: IContextKeyService, - @IViewletService private viewletService: IViewletService, - @IThemeService private themeService: IThemeService + @IContextKeyService private contextKeyService: IContextKeyService, + @IThemeService private themeService: IThemeService, + @ITelemetryService private telemetryService: ITelemetryService ) { super({ ...(options as IViewOptions), @@ -74,11 +79,29 @@ export class OpenEditorsView extends ViewsViewletPanel { this.model = editorGroupService.getStacksModel(); - this.openEditorsFocusedContext = OpenEditorsFocusedContext.bindTo(contextKeyService); - this.explorerFocusedContext = ExplorerFocusedContext.bindTo(contextKeyService); - this.structuralRefreshDelay = 0; - this.structuralTreeRefreshScheduler = new RunOnceScheduler(() => this.structuralTreeUpdate(), this.structuralRefreshDelay); + this.listRefreshScheduler = new RunOnceScheduler(() => { + const previousLength = this.list.length; + this.list.splice(0, this.list.length, this.elements); + this.focusActiveEditor(); + if (previousLength !== this.list.length) { + this.updateSize(); + } + this.needsRefresh = false; + }, this.structuralRefreshDelay); + + // update on model changes + this.disposables.push(this.model.onModelChanged(e => this.onEditorStacksModelChanged(e))); + + // Also handle configuration updates + this.disposables.push(this.configurationService.onDidChangeConfiguration(e => this.onConfigurationChange(e))); + + // Handle dirty counter + this.disposables.push(this.untitledEditorService.onDidChangeDirty(e => this.updateDirtyIndicator())); + this.disposables.push(this.textFileService.models.onModelsDirty(e => this.updateDirtyIndicator())); + this.disposables.push(this.textFileService.models.onModelsSaved(e => this.updateDirtyIndicator())); + this.disposables.push(this.textFileService.models.onModelsSaveError(e => this.updateDirtyIndicator())); + this.disposables.push(this.textFileService.models.onModelsReverted(e => this.updateDirtyIndicator())); } protected renderHeaderTitle(container: HTMLElement): void { @@ -104,6 +127,43 @@ export class OpenEditorsView extends ViewsViewletPanel { this.updateDirtyIndicator(); } + public renderBody(container: HTMLElement): void { + dom.addClass(container, 'explorer-open-editors'); + dom.addClass(container, 'show-file-icons'); + + const delegate = new OpenEditorsDelegate(); + this.list = new WorkbenchList(container, delegate, [ + new EditorGroupRenderer(this.keybindingService, this.instantiationService, this.editorGroupService), + new OpenEditorRenderer(this.instantiationService, this.keybindingService, this.configurationService, this.editorGroupService) + ], { + identityProvider: element => element instanceof OpenEditor ? element.getId() : element.id.toString(), + multipleSelectionSupport: false + }, this.contextKeyService, this.listService, this.themeService); + + this.updateSize(); + // Bind context keys + OpenEditorsFocusedContext.bindTo(this.list.contextKeyService); + ExplorerFocusedContext.bindTo(this.list.contextKeyService); + + this.disposables.push(this.list.onContextMenu(e => this.onListContextMenu(e))); + + // Open when selecting via keyboard + this.disposables.push(this.list.onMouseClick(e => this.onMouseClick(e, false))); + this.disposables.push(this.list.onMouseDblClick(e => this.onMouseClick(e, true))); + this.disposables.push(this.list.onKeyDown(e => { + const event = new StandardKeyboardEvent(e); + if (event.keyCode === KeyCode.Enter) { + const focused = this.list.getFocusedElements(); + const element = focused.length ? focused[0] : undefined; + if (element instanceof OpenEditor) { + this.openEditor(element, { pinned: false, sideBySide: !!event.ctrlKey, preserveFocus: false }); + } + } + })); + + this.listRefreshScheduler.schedule(0); + } + public getActions(): IAction[] { return [ this.instantiationService.createInstance(ToggleEditorLayoutAction, ToggleEditorLayoutAction.ID, ToggleEditorLayoutAction.LABEL), @@ -112,161 +172,147 @@ export class OpenEditorsView extends ViewsViewletPanel { ]; } - public renderBody(container: HTMLElement): void { - this.treeContainer = super.renderViewTree(container); - dom.addClass(this.treeContainer, 'explorer-open-editors'); - dom.addClass(this.treeContainer, 'show-file-icons'); - - const dataSource = this.instantiationService.createInstance(DataSource); - const actionProvider = this.instantiationService.createInstance(ActionProvider, this.model); - const renderer = this.instantiationService.createInstance(Renderer, actionProvider); - const controller = this.instantiationService.createInstance(Controller, actionProvider, this.model); - const accessibilityProvider = this.instantiationService.createInstance(AccessibilityProvider); - const dnd = this.instantiationService.createInstance(DragAndDrop); - - this.tree = new Tree(this.treeContainer, { - dataSource, - renderer, - controller, - accessibilityProvider, - dnd - }, { - indentPixels: 0, - twistiePixels: 22, - ariaLabel: nls.localize({ key: 'treeAriaLabel', comment: ['Open is an adjective'] }, "Open Editors: List of Active Files"), - showTwistie: false, - keyboardSupport: false - }); - - // Theme styler - this.disposables.push(attachListStyler(this.tree, this.themeService)); - - // Register to list service - this.disposables.push(this.listService.register(this.tree, [this.explorerFocusedContext, this.openEditorsFocusedContext])); - - // Open when selecting via keyboard - this.disposables.push(this.tree.onDidChangeSelection(event => { - if (event && event.payload && event.payload.origin === 'keyboard') { - controller.openEditor(this.tree.getFocus(), { pinned: false, sideBySide: false, preserveFocus: false }); - } - })); - - // Prevent collapsing of editor groups - this.disposables.push(this.tree.onDidCollapseItem((event: IItemCollapseEvent) => { - if (event.item && event.item.getElement() instanceof EditorGroup) { - setTimeout(() => this.tree.expand(event.item.getElement())); // unwind from callback - } - })); - - this.fullRefreshNeeded = true; - this.structuralTreeUpdate(); + public setExpanded(expanded: boolean): void { + super.setExpanded(expanded); + if (expanded && this.needsRefresh) { + this.listRefreshScheduler.schedule(0); + } } - public create(): TPromise { - - // Load Config - this.updateSize(); - - // listeners - this.registerListeners(); - - return super.create(); + public setVisible(visible: boolean): TPromise { + return super.setVisible(visible).then(() => { + if (visible && this.needsRefresh) { + this.listRefreshScheduler.schedule(0); + } + }); } - private registerListeners(): void { + public getList(): WorkbenchList { + return this.list; + } - // update on model changes - this.disposables.push(this.model.onModelChanged(e => this.onEditorStacksModelChanged(e))); + protected layoutBody(size: number): void { + if (this.list) { + this.list.layout(size); + } + } - // Also handle configuration updates - this.disposables.push(this.configurationService.onDidChangeConfiguration(e => this.onConfigurationChange(e))); + @memoize + private get actionProvider(): ActionProvider { + return new ActionProvider(this.instantiationService, this.textFileService, this.untitledEditorService); + } - // Handle dirty counter - this.disposables.push(this.untitledEditorService.onDidChangeDirty(e => this.updateDirtyIndicator())); - this.disposables.push(this.textFileService.models.onModelsDirty(e => this.updateDirtyIndicator())); - this.disposables.push(this.textFileService.models.onModelsSaved(e => this.updateDirtyIndicator())); - this.disposables.push(this.textFileService.models.onModelsSaveError(e => this.updateDirtyIndicator())); - this.disposables.push(this.textFileService.models.onModelsReverted(e => this.updateDirtyIndicator())); - - // We are not updating the tree while the viewlet is not visible. Thus refresh when viewlet becomes visible #6702 - this.disposables.push(this.viewletService.onDidViewletOpen(viewlet => { - if (viewlet.getId() === VIEWLET_ID) { - this.fullRefreshNeeded = true; - this.structuralTreeUpdate(); - this.updateDirtyIndicator(); + private get elements(): (IEditorGroup | OpenEditor)[] { + const result: (IEditorGroup | OpenEditor)[] = []; + this.model.groups.forEach(g => { + if (this.model.groups.length > 1) { + result.push(g); } - })); + result.push(...g.getEditors().map(ei => new OpenEditor(ei, g))); + }); + + return result; + } + + private getIndex(group: IEditorGroup, editor: IEditorInput): number { + let index = editor ? group.indexOf(editor) : 0; + if (this.model.groups.length === 1) { + return index; + } + + for (let g of this.model.groups) { + if (g.id === group.id) { + return index + (!!editor ? 1 : 0); + } else { + index += g.count + 1; + } + } + + return -1; + } + + private onMouseClick(event: IListMouseEvent, isDoubleClick: boolean): void { + const element = event.element; + if (!(element instanceof OpenEditor)) { + return; + } + + if (event.browserEvent && event.browserEvent.button === 1 /* Middle Button */) { + const position = this.model.positionOfGroup(element.editorGroup); + this.editorService.closeEditor(position, element.editorInput).done(null, errors.onUnexpectedError); + } else { + this.openEditor(element, { preserveFocus: !isDoubleClick, pinned: isDoubleClick, sideBySide: event.browserEvent.ctrlKey || event.browserEvent.metaKey }); + } + } + + private openEditor(element: OpenEditor, options: { preserveFocus: boolean; pinned: boolean; sideBySide: boolean; }): void { + if (element) { + /* __GDPR__ + "workbenchActionExecuted" : { + "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this.telemetryService.publicLog('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); + let position = this.model.positionOfGroup(element.editorGroup); + if (options.sideBySide && position !== Position.THREE) { + position++; + } + this.editorGroupService.activateGroup(this.model.groupAt(position)); + this.editorService.openEditor(element.editorInput, options, position) + .done(() => this.editorGroupService.activateGroup(this.model.groupAt(position)), errors.onUnexpectedError); + } + } + + private onListContextMenu(e: IListContextMenuEvent): void { + const element = e.element; + this.contextMenuService.showContextMenu({ + getAnchor: () => e.anchor, + getActions: () => this.actionProvider.getSecondaryActions(element), + getActionsContext: () => element instanceof OpenEditor ? { group: element.editorGroup, editor: element.editorInput } : { group: element } + }); } private onEditorStacksModelChanged(e: IStacksModelChangeEvent): void { - if (this.isDisposed || !this.isVisible() || !this.tree) { + if (!this.isVisible() || !this.list || !this.isExpanded()) { + this.needsRefresh = true; return; } // Do a minimal tree update based on if the change is structural or not #6670 if (e.structural) { - // If an editor changed structurally it is enough to refresh the group, otherwise a group changed structurally and we need the full refresh. - // If there are multiple groups to refresh - refresh the whole tree. - if (e.editor && !this.groupToRefresh) { - this.groupToRefresh = e.group; - } else { - this.fullRefreshNeeded = true; + this.listRefreshScheduler.schedule(this.structuralRefreshDelay); + } else if (!this.listRefreshScheduler.isScheduled()) { + + const newElement = e.editor ? new OpenEditor(e.editor, e.group) : e.group; + const index = this.getIndex(e.group, e.editor); + const previousLength = this.list.length; + this.list.splice(index, 1, [newElement]); + + if (previousLength !== this.list.length) { + this.updateSize(); } - this.structuralTreeRefreshScheduler.schedule(this.structuralRefreshDelay); - } else { - const toRefresh = e.editor ? new OpenEditor(e.editor, e.group) : e.group; - this.tree.refresh(toRefresh, false).done(() => this.highlightActiveEditor(), errors.onUnexpectedError); + this.focusActiveEditor(); } } - private structuralTreeUpdate(): void { - // View size - this.minimumBodySize = this.maximumBodySize = this.getExpandedBodySize(this.model); - // Show groups only if there is more than 1 group - const treeInput = this.model.groups.length === 1 ? this.model.groups[0] : this.model; - // TODO@Isidor temporary workaround due to a partial tree refresh issue - this.fullRefreshNeeded = true; - const toRefresh = this.fullRefreshNeeded ? null : this.groupToRefresh; - - (treeInput !== this.tree.getInput() ? this.tree.setInput(treeInput) : this.tree.refresh(toRefresh)).done(() => { - this.fullRefreshNeeded = false; - this.groupToRefresh = null; - - // Always expand all the groups as they are unclickable - return this.tree.expandAll(this.model.groups).then(() => this.highlightActiveEditor()); - }, errors.onUnexpectedError); - } - - private highlightActiveEditor(): void { + private focusActiveEditor(): void { if (this.model.activeGroup && this.model.activeGroup.activeEditor /* could be empty */) { - const openEditor = new OpenEditor(this.model.activeGroup.activeEditor, this.model.activeGroup); - this.tree.clearFocus(); - this.tree.clearSelection(); - - if (openEditor) { - this.tree.setFocus(openEditor); - this.tree.setSelection([openEditor]); - const relativeTop = this.tree.getRelativeTop(openEditor); - if (relativeTop <= 0 || relativeTop >= 1) { - // Only reveal the element if it is not visible #8279 - this.tree.reveal(openEditor).done(null, errors.onUnexpectedError); - } - } + const index = this.getIndex(this.model.activeGroup, this.model.activeGroup.activeEditor); + this.list.setFocus([index]); + this.list.setSelection([index]); + this.list.reveal(index); } } private onConfigurationChange(event: IConfigurationChangeEvent): void { - if (this.isDisposed) { - return; // guard against possible race condition when config change causes recreate of views - } - if (event.affectsConfiguration('explorer.openEditors')) { this.updateSize(); } // Trigger a 'repaint' when decoration settings change if (event.affectsConfiguration('explorer.decorations')) { - this.tree.refresh(); + this.listRefreshScheduler.schedule(); } } @@ -296,24 +342,21 @@ export class OpenEditorsView extends ViewsViewletPanel { if (typeof dynamicHeight !== 'boolean') { dynamicHeight = OpenEditorsView.DEFAULT_DYNAMIC_HEIGHT; } - return OpenEditorsView.computeExpandedBodySize(model, visibleOpenEditors, dynamicHeight); + + return this.computeExpandedBodySize(visibleOpenEditors, dynamicHeight); } - private static computeExpandedBodySize(model: IEditorStacksModel, visibleOpenEditors = OpenEditorsView.DEFAULT_VISIBLE_OPEN_EDITORS, dynamicHeight = OpenEditorsView.DEFAULT_DYNAMIC_HEIGHT): number { - let entryCount = model.groups.reduce((sum, group) => sum + group.count, 0); - // We only show the group labels if there is more than 1 group - if (model.groups.length > 1) { - entryCount += model.groups.length; - } - + private computeExpandedBodySize(visibleOpenEditors = OpenEditorsView.DEFAULT_VISIBLE_OPEN_EDITORS, dynamicHeight = OpenEditorsView.DEFAULT_DYNAMIC_HEIGHT): number { let itemsToShow: number; if (dynamicHeight) { - itemsToShow = Math.min(Math.max(visibleOpenEditors, 1), entryCount); + const elementCount = this.model.groups.map(g => g.count) + .reduce((first, second) => first + second, this.model.groups.length > 1 ? this.model.groups.length : 0); + itemsToShow = Math.min(Math.max(visibleOpenEditors, 1), elementCount); } else { itemsToShow = Math.max(visibleOpenEditors, 1); } - return itemsToShow * Renderer.ITEM_HEIGHT; + return itemsToShow * OpenEditorsDelegate.ITEM_HEIGHT; } public setStructuralRefreshDelay(delay: number): void { @@ -321,9 +364,289 @@ export class OpenEditorsView extends ViewsViewletPanel { } public getOptimalWidth(): number { - let parentNode = this.tree.getHTMLElement(); + let parentNode = this.list.getHTMLElement(); let childNodes = [].slice.call(parentNode.querySelectorAll('.open-editor > a')); return dom.getLargestChildWidth(parentNode, childNodes); } } + +interface IOpenEditorTemplateData { + container: HTMLElement; + root: EditorLabel; + actionBar: ActionBar; + openEditor: OpenEditor; + toDispose: IDisposable[]; +} + +interface IEditorGroupTemplateData { + root: HTMLElement; + name: HTMLSpanElement; + actionBar: ActionBar; + editorGroup: IEditorGroup; + toDispose: IDisposable[]; +} + +class OpenEditorsDelegate implements IDelegate { + + public static readonly ITEM_HEIGHT = 22; + + getHeight(element: OpenEditor | IEditorGroup): number { + return OpenEditorsDelegate.ITEM_HEIGHT; + } + + getTemplateId(element: OpenEditor | IEditorGroup): string { + if (element instanceof EditorGroup) { + return EditorGroupRenderer.ID; + } + + return OpenEditorRenderer.ID; + } +} + +class EditorGroupRenderer implements IRenderer { + static ID = 'editorgroup'; + + constructor( + private keybindingService: IKeybindingService, + private instantiationService: IInstantiationService, + private editorGroupService: IEditorGroupService + ) { + // noop + } + + get templateId() { + return EditorGroupRenderer.ID; + } + + renderTemplate(container: HTMLElement): IEditorGroupTemplateData { + const editorGroupTemplate: IEditorGroupTemplateData = Object.create(null); + editorGroupTemplate.root = dom.append(container, $('.editor-group')); + editorGroupTemplate.name = dom.append(editorGroupTemplate.root, $('span.name')); + editorGroupTemplate.actionBar = new ActionBar(container); + + const editorGroupActions = [ + this.instantiationService.createInstance(SaveAllInGroupAction, SaveAllInGroupAction.ID, SaveAllInGroupAction.LABEL), + this.instantiationService.createInstance(CloseUnmodifiedEditorsInGroupAction, CloseUnmodifiedEditorsInGroupAction.ID, CloseUnmodifiedEditorsInGroupAction.LABEL), + this.instantiationService.createInstance(CloseEditorsInGroupAction, CloseEditorsInGroupAction.ID, CloseEditorsInGroupAction.LABEL) + ]; + editorGroupActions.forEach(a => { + const key = this.keybindingService.lookupKeybinding(a.id); + editorGroupTemplate.actionBar.push(a, { icon: true, label: false, keybinding: key ? key.getLabel() : void 0 }); + }); + + editorGroupTemplate.toDispose = []; + editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, (e: DragEvent) => { + if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { + dom.addClass(container, 'focused'); + } + })); + editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_LEAVE, (e: DragEvent) => { + dom.removeClass(container, 'focused'); + })); + editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DROP, () => { + dom.removeClass(container, 'focused'); + if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { + const model = this.editorGroupService.getStacksModel(); + const positionOfTargetGroup = model.positionOfGroup(editorGroupTemplate.editorGroup); + this.editorGroupService.moveEditor(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorInput, model.positionOfGroup(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorGroup), positionOfTargetGroup, { preserveFocus: true }); + this.editorGroupService.activateGroup(positionOfTargetGroup); + } + })); + + return editorGroupTemplate; + } + + renderElement(editorGroup: IEditorGroup, index: number, templateData: IEditorGroupTemplateData): void { + templateData.editorGroup = editorGroup; + templateData.name.textContent = editorGroup.label; + templateData.actionBar.context = { group: editorGroup }; + } + + disposeTemplate(templateData: IEditorGroupTemplateData): void { + templateData.actionBar.dispose(); + dispose(templateData.toDispose); + } +} + +class OpenEditorRenderer implements IRenderer { + static ID = 'openeditor'; + public static DRAGGED_OPEN_EDITOR: OpenEditor; + + constructor( + private instantiationService: IInstantiationService, + private keybindingService: IKeybindingService, + private configurationService: IConfigurationService, + private editorGroupService: IEditorGroupService + ) { + // noop + } + + get templateId() { + return OpenEditorRenderer.ID; + } + + renderTemplate(container: HTMLElement): IOpenEditorTemplateData { + const editorTemplate: IOpenEditorTemplateData = Object.create(null); + editorTemplate.container = container; + editorTemplate.actionBar = new ActionBar(container); + container.draggable = true; + + const closeEditorAction = this.instantiationService.createInstance(CloseEditorAction, CloseEditorAction.ID, CloseEditorAction.LABEL); + const key = this.keybindingService.lookupKeybinding(closeEditorAction.id); + editorTemplate.actionBar.push(closeEditorAction, { icon: true, label: false, keybinding: key ? key.getLabel() : void 0 }); + + editorTemplate.root = this.instantiationService.createInstance(EditorLabel, container, void 0); + + editorTemplate.toDispose = []; + + editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_START, (e: DragEvent) => { + + const dragImage = document.createElement('div'); + e.dataTransfer.effectAllowed = 'copyMove'; + dragImage.className = 'monaco-tree-drag-image'; + dragImage.textContent = editorTemplate.openEditor.editorInput.getName(); + document.body.appendChild(dragImage); + e.dataTransfer.setDragImage(dragImage, -10, -10); + setTimeout(() => document.body.removeChild(dragImage), 0); + + OpenEditorRenderer.DRAGGED_OPEN_EDITOR = editorTemplate.openEditor; + })); + editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, () => { + if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { + dom.addClass(container, 'focused'); + } + })); + editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_LEAVE, () => { + dom.removeClass(container, 'focused'); + })); + editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DROP, (e: DragEvent) => { + dom.removeClass(container, 'focused'); + if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { + const model = this.editorGroupService.getStacksModel(); + const positionOfTargetGroup = model.positionOfGroup(editorTemplate.openEditor.editorGroup); + const index = editorTemplate.openEditor.editorGroup.indexOf(editorTemplate.openEditor.editorInput); + + this.editorGroupService.moveEditor(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorInput, + model.positionOfGroup(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorGroup), positionOfTargetGroup, { index, preserveFocus: true }); + this.editorGroupService.activateGroup(positionOfTargetGroup); + } + })); + editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_END, () => { + OpenEditorRenderer.DRAGGED_OPEN_EDITOR = undefined; + })); + + return editorTemplate; + } + + renderElement(editor: OpenEditor, index: number, templateData: IOpenEditorTemplateData): void { + templateData.openEditor = editor; + editor.isDirty() ? dom.addClass(templateData.container, 'dirty') : dom.removeClass(templateData.container, 'dirty'); + templateData.root.setEditor(editor.editorInput, { + italic: editor.isPreview(), + extraClasses: ['open-editor'], + fileDecorations: this.configurationService.getValue().explorer.decorations + }); + templateData.actionBar.context = { group: editor.editorGroup, editor: editor.editorInput }; + } + + disposeTemplate(templateData: IOpenEditorTemplateData): void { + templateData.actionBar.dispose(); + templateData.root.dispose(); + dispose(templateData.toDispose); + } +} + +export class ActionProvider extends ContributableActionProvider { + + constructor( + @IInstantiationService private instantiationService: IInstantiationService, + @ITextFileService private textFileService: ITextFileService, + @IUntitledEditorService private untitledEditorService: IUntitledEditorService + ) { + super(); + } + + public getSecondaryActions(element: any): TPromise { + return super.getSecondaryActions(undefined, element).then(result => { + const autoSaveEnabled = this.textFileService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY; + + if (element instanceof EditorGroup) { + if (!autoSaveEnabled) { + result.push(this.instantiationService.createInstance(SaveAllInGroupAction, SaveAllInGroupAction.ID, nls.localize('saveAll', "Save All"))); + result.push(new Separator()); + } + + result.push(this.instantiationService.createInstance(CloseUnmodifiedEditorsInGroupAction, CloseUnmodifiedEditorsInGroupAction.ID, nls.localize('closeAllUnmodified', "Close Unmodified"))); + result.push(this.instantiationService.createInstance(CloseEditorsInGroupAction, CloseEditorsInGroupAction.ID, nls.localize('closeAll', "Close All"))); + } else { + const openEditor = element; + const resource = openEditor.getResource(); + if (resource) { + // Open to side + result.unshift(this.instantiationService.createInstance(OpenToSideAction, undefined, resource, false)); + + if (!openEditor.isUntitled()) { + + // Files: Save / Revert + if (!autoSaveEnabled) { + result.push(new Separator()); + + const saveAction = this.instantiationService.createInstance(SaveFileAction, SaveFileAction.ID, SaveFileAction.LABEL); + saveAction.setResource(resource); + saveAction.enabled = openEditor.isDirty(); + result.push(saveAction); + + const revertAction = this.instantiationService.createInstance(RevertFileAction, RevertFileAction.ID, RevertFileAction.LABEL); + revertAction.setResource(resource); + revertAction.enabled = openEditor.isDirty(); + result.push(revertAction); + } + } + + // Untitled: Save / Save As + if (openEditor.isUntitled()) { + result.push(new Separator()); + + if (this.untitledEditorService.hasAssociatedFilePath(resource)) { + let saveUntitledAction = this.instantiationService.createInstance(SaveFileAction, SaveFileAction.ID, SaveFileAction.LABEL); + saveUntitledAction.setResource(resource); + result.push(saveUntitledAction); + } + + let saveAsAction = this.instantiationService.createInstance(SaveFileAsAction, SaveFileAsAction.ID, SaveFileAsAction.LABEL); + saveAsAction.setResource(resource); + result.push(saveAsAction); + } + + // Compare Actions + result.push(new Separator()); + + if (!openEditor.isUntitled()) { + const compareWithSavedAction = this.instantiationService.createInstance(CompareWithSavedAction, CompareWithSavedAction.ID, nls.localize('compareWithSaved', "Compare with Saved")); + compareWithSavedAction.setResource(resource); + compareWithSavedAction.enabled = openEditor.isDirty(); + result.push(compareWithSavedAction); + } + + const runCompareAction = this.instantiationService.createInstance(CompareResourcesAction, resource, undefined); + if (runCompareAction._isEnabled()) { + result.push(runCompareAction); + } + result.push(this.instantiationService.createInstance(SelectResourceForCompareAction, resource, undefined)); + + result.push(new Separator()); + } + + result.push(this.instantiationService.createInstance(CloseEditorAction, CloseEditorAction.ID, nls.localize('close', "Close"))); + const closeOtherEditorsInGroupAction = this.instantiationService.createInstance(CloseOtherEditorsInGroupAction, CloseOtherEditorsInGroupAction.ID, nls.localize('closeOthers', "Close Others")); + closeOtherEditorsInGroupAction.enabled = openEditor.editorGroup.count > 1; + result.push(closeOtherEditorsInGroupAction); + result.push(this.instantiationService.createInstance(CloseUnmodifiedEditorsInGroupAction, CloseUnmodifiedEditorsInGroupAction.ID, nls.localize('closeAllUnmodified', "Close Unmodified"))); + result.push(this.instantiationService.createInstance(CloseEditorsInGroupAction, CloseEditorsInGroupAction.ID, nls.localize('closeAll', "Close All"))); + } + + return result; + }); + } +} diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.ts deleted file mode 100644 index 6c0ac532f9a2..000000000000 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsViewer.ts +++ /dev/null @@ -1,521 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import nls = require('vs/nls'); -import errors = require('vs/base/common/errors'); -import { TPromise } from 'vs/base/common/winjs.base'; -import { IAction } from 'vs/base/common/actions'; -import { EditorLabel } from 'vs/workbench/browser/labels'; -import { DefaultController, ClickBehavior, DefaultDragAndDrop } from 'vs/base/parts/tree/browser/treeDefaults'; -import { IDataSource, ITree, IAccessibilityProvider, IDragAndDropData, IDragOverReaction, DRAG_OVER_ACCEPT, DRAG_OVER_REJECT, ContextMenuEvent, IRenderer } from 'vs/base/parts/tree/browser/tree'; -import { ExternalElementsDragAndDropData, ElementsDragAndDropData, DesktopDragAndDropData } from 'vs/base/parts/tree/browser/treeDnd'; -import { ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import dom = require('vs/base/browser/dom'); -import { IMouseEvent, DragMouseEvent } from 'vs/base/browser/mouseEvent'; -import { IResourceInput, Position } from 'vs/platform/editor/common/editor'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IEditorGroup, IEditorStacksModel } from 'vs/workbench/common/editor'; -import { OpenEditor } from 'vs/workbench/parts/files/common/explorerModel'; -import { ContributableActionProvider } from 'vs/workbench/browser/actions'; -import { explorerItemToFileResource, IFilesConfiguration } from 'vs/workbench/parts/files/common/files'; -import { ITextFileService, AutoSaveMode } from 'vs/workbench/services/textfile/common/textfiles'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { EditorStacksModel, EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; -import { SaveFileAction, RevertFileAction, SaveFileAsAction, OpenToSideAction, SelectResourceForCompareAction, CompareResourcesAction, SaveAllInGroupAction, CompareWithSavedAction } from 'vs/workbench/parts/files/electron-browser/fileActions'; -import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { CloseOtherEditorsInGroupAction, CloseEditorAction, CloseEditorsInGroupAction, CloseUnmodifiedEditorsInGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; - -const $ = dom.$; - -export class DataSource implements IDataSource { - - public getId(tree: ITree, element: any): string { - if (element instanceof EditorStacksModel) { - return 'root'; - } - if (element instanceof EditorGroup) { - return (element).id.toString(); - } - - return (element).getId(); - } - - public hasChildren(tree: ITree, element: any): boolean { - return element instanceof EditorStacksModel || element instanceof EditorGroup; - } - - public getChildren(tree: ITree, element: any): TPromise { - if (element instanceof EditorStacksModel) { - return TPromise.as((element).groups); - } - - const editorGroup = element; - return TPromise.as(editorGroup.getEditors().map(ei => new OpenEditor(ei, editorGroup))); - } - - public getParent(tree: ITree, element: any): TPromise { - return TPromise.as(null); - } -} - -interface IOpenEditorTemplateData { - container: HTMLElement; - root: EditorLabel; - actionBar: ActionBar; -} - -interface IEditorGroupTemplateData { - root: HTMLElement; - name: HTMLSpanElement; - actionBar: ActionBar; -} - -export class Renderer implements IRenderer { - - public static readonly ITEM_HEIGHT = 22; - private static readonly EDITOR_GROUP_TEMPLATE_ID = 'editorgroup'; - private static readonly OPEN_EDITOR_TEMPLATE_ID = 'openeditor'; - - constructor( - private actionProvider: ActionProvider, - @IInstantiationService private instantiationService: IInstantiationService, - @IKeybindingService private keybindingService: IKeybindingService, - @IConfigurationService private configurationService: IConfigurationService - ) { - // noop - } - - public getHeight(tree: ITree, element: any): number { - return Renderer.ITEM_HEIGHT; - } - - public getTemplateId(tree: ITree, element: any): string { - if (element instanceof EditorGroup) { - return Renderer.EDITOR_GROUP_TEMPLATE_ID; - } - - return Renderer.OPEN_EDITOR_TEMPLATE_ID; - } - - public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { - if (templateId === Renderer.EDITOR_GROUP_TEMPLATE_ID) { - const editorGroupTemplate: IEditorGroupTemplateData = Object.create(null); - editorGroupTemplate.root = dom.append(container, $('.editor-group')); - editorGroupTemplate.name = dom.append(editorGroupTemplate.root, $('span.name')); - editorGroupTemplate.actionBar = new ActionBar(container); - - const editorGroupActions = this.actionProvider.getEditorGroupActions(); - editorGroupActions.forEach(a => { - const key = this.keybindingService.lookupKeybinding(a.id); - editorGroupTemplate.actionBar.push(a, { icon: true, label: false, keybinding: key ? key.getLabel() : void 0 }); - }); - - return editorGroupTemplate; - } - - const editorTemplate: IOpenEditorTemplateData = Object.create(null); - editorTemplate.container = container; - editorTemplate.actionBar = new ActionBar(container); - - const openEditorActions = this.actionProvider.getOpenEditorActions(); - openEditorActions.forEach(a => { - const key = this.keybindingService.lookupKeybinding(a.id); - editorTemplate.actionBar.push(a, { icon: true, label: false, keybinding: key ? key.getLabel() : void 0 }); - }); - - editorTemplate.root = this.instantiationService.createInstance(EditorLabel, container, void 0); - - return editorTemplate; - } - - public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { - if (templateId === Renderer.EDITOR_GROUP_TEMPLATE_ID) { - this.renderEditorGroup(tree, element, templateData); - } else { - this.renderOpenEditor(tree, element, templateData); - } - } - - private renderEditorGroup(tree: ITree, editorGroup: IEditorGroup, templateData: IEditorGroupTemplateData): void { - templateData.name.textContent = editorGroup.label; - templateData.actionBar.context = { group: editorGroup }; - } - - private renderOpenEditor(tree: ITree, editor: OpenEditor, templateData: IOpenEditorTemplateData): void { - editor.isDirty() ? dom.addClass(templateData.container, 'dirty') : dom.removeClass(templateData.container, 'dirty'); - templateData.root.setEditor(editor.editorInput, { - italic: editor.isPreview(), - extraClasses: ['open-editor'], - fileDecorations: this.configurationService.getValue().explorer.decorations - }); - templateData.actionBar.context = { group: editor.editorGroup, editor: editor.editorInput }; - } - - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { - if (templateId === Renderer.OPEN_EDITOR_TEMPLATE_ID) { - (templateData).actionBar.dispose(); - (templateData).root.dispose(); - } - if (templateId === Renderer.EDITOR_GROUP_TEMPLATE_ID) { - (templateData).actionBar.dispose(); - } - } -} - -export class Controller extends DefaultController { - - constructor(private actionProvider: ActionProvider, private model: IEditorStacksModel, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IEditorGroupService private editorGroupService: IEditorGroupService, - @IContextMenuService private contextMenuService: IContextMenuService, - @ITelemetryService private telemetryService: ITelemetryService - ) { - super({ clickBehavior: ClickBehavior.ON_MOUSE_DOWN, keyboardSupport: false }); - } - - public onClick(tree: ITree, element: any, event: IMouseEvent): boolean { - - // Close opened editor on middle mouse click - if (element instanceof OpenEditor && event.browserEvent && event.browserEvent.button === 1 /* Middle Button */) { - const position = this.model.positionOfGroup(element.editorGroup); - - this.editorService.closeEditor(position, element.editorInput).done(null, errors.onUnexpectedError); - - return true; - } - - return super.onClick(tree, element, event); - } - - protected onLeftClick(tree: ITree, element: any, event: IMouseEvent, origin: string = 'mouse'): boolean { - const payload = { origin: origin }; - const isDoubleClick = (origin === 'mouse' && event.detail === 2); - - // Cancel Event - const isMouseDown = event && event.browserEvent && event.browserEvent.type === 'mousedown'; - if (!isMouseDown) { - event.preventDefault(); // we cannot preventDefault onMouseDown because this would break DND otherwise - } - event.stopPropagation(); - - // Status group should never get selected nor expanded/collapsed - if (!(element instanceof OpenEditor)) { - return true; - } - - // Set DOM focus - tree.DOMFocus(); - - // Allow to unselect - if (event.shiftKey) { - const selection = tree.getSelection(); - if (selection && selection.length > 0 && selection[0] === element) { - tree.clearSelection(payload); - } - } - - // Select, Focus and open files - else { - tree.setFocus(element, payload); - - if (isDoubleClick) { - event.preventDefault(); // focus moves to editor, we need to prevent default - } - - tree.setSelection([element], payload); - this.openEditor(element, { preserveFocus: !isDoubleClick, pinned: isDoubleClick, sideBySide: event.ctrlKey || event.metaKey }); - } - - return true; - } - - // Do not allow left / right to expand and collapse groups #7848 - protected onLeft(tree: ITree, event: IKeyboardEvent): boolean { - return true; - } - - protected onRight(tree: ITree, event: IKeyboardEvent): boolean { - return true; - } - - public onContextMenu(tree: ITree, element: any, event: ContextMenuEvent): boolean { - if (event.target && event.target.tagName && event.target.tagName.toLowerCase() === 'input') { - return false; - } - // Check if clicked on some element - if (element === tree.getInput()) { - return false; - } - - event.preventDefault(); - event.stopPropagation(); - - tree.setFocus(element); - const group = element instanceof EditorGroup ? element : (element).editorGroup; - const editor = element instanceof OpenEditor ? (element).editorInput : undefined; - - let anchor = { x: event.posx, y: event.posy }; - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - getActions: () => this.actionProvider.getSecondaryActions(tree, element), - onHide: (wasCancelled?: boolean) => { - if (wasCancelled) { - tree.DOMFocus(); - } - }, - getActionsContext: () => ({ group, editor }) - }); - - return true; - } - - public openEditor(element: OpenEditor, options: { preserveFocus: boolean; pinned: boolean; sideBySide: boolean; }): void { - if (element) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); - let position = this.model.positionOfGroup(element.editorGroup); - if (options.sideBySide && position !== Position.THREE) { - position++; - } - this.editorGroupService.activateGroup(this.model.groupAt(position)); - this.editorService.openEditor(element.editorInput, options, position) - .done(() => this.editorGroupService.activateGroup(this.model.groupAt(position)), errors.onUnexpectedError); - } - } -} - -export class AccessibilityProvider implements IAccessibilityProvider { - - getAriaLabel(tree: ITree, element: any): string { - if (element instanceof EditorGroup) { - return nls.localize('editorGroupAriaLabel', "{0}, Editor Group", (element).label); - } - - return nls.localize('openEditorAriaLabel', "{0}, Open Editor", (element).editorInput.getName()); - } -} - -export class ActionProvider extends ContributableActionProvider { - - constructor( - private model: IEditorStacksModel, - @IInstantiationService private instantiationService: IInstantiationService, - @ITextFileService private textFileService: ITextFileService, - @IUntitledEditorService private untitledEditorService: IUntitledEditorService - ) { - super(); - } - - public hasActions(tree: ITree, element: any): boolean { - const multipleGroups = this.model.groups.length > 1; - return element instanceof OpenEditor || (element instanceof EditorGroup && multipleGroups); - } - - public getActions(tree: ITree, element: any): TPromise { - if (element instanceof OpenEditor) { - return TPromise.as(this.getOpenEditorActions()); - } - if (element instanceof EditorGroup) { - return TPromise.as(this.getEditorGroupActions()); - } - - return TPromise.as([]); - } - - public getOpenEditorActions(): IAction[] { - return [this.instantiationService.createInstance(CloseEditorAction, CloseEditorAction.ID, CloseEditorAction.LABEL)]; - } - - public getEditorGroupActions(): IAction[] { - const saveAllAction = this.instantiationService.createInstance(SaveAllInGroupAction, SaveAllInGroupAction.ID, SaveAllInGroupAction.LABEL); - - return [ - saveAllAction, - this.instantiationService.createInstance(CloseUnmodifiedEditorsInGroupAction, CloseUnmodifiedEditorsInGroupAction.ID, CloseUnmodifiedEditorsInGroupAction.LABEL), - this.instantiationService.createInstance(CloseEditorsInGroupAction, CloseEditorsInGroupAction.ID, CloseEditorsInGroupAction.LABEL) - ]; - } - - public hasSecondaryActions(tree: ITree, element: any): boolean { - return element instanceof OpenEditor || element instanceof EditorGroup; - } - - public getSecondaryActions(tree: ITree, element: any): TPromise { - return super.getSecondaryActions(tree, element).then(result => { - const autoSaveEnabled = this.textFileService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY; - - if (element instanceof EditorGroup) { - if (!autoSaveEnabled) { - result.push(this.instantiationService.createInstance(SaveAllInGroupAction, SaveAllInGroupAction.ID, nls.localize('saveAll', "Save All"))); - result.push(new Separator()); - } - - result.push(this.instantiationService.createInstance(CloseUnmodifiedEditorsInGroupAction, CloseUnmodifiedEditorsInGroupAction.ID, nls.localize('closeAllUnmodified', "Close Unmodified"))); - result.push(this.instantiationService.createInstance(CloseEditorsInGroupAction, CloseEditorsInGroupAction.ID, nls.localize('closeAll', "Close All"))); - } else { - const openEditor = element; - const resource = openEditor.getResource(); - if (resource) { - // Open to side - result.unshift(this.instantiationService.createInstance(OpenToSideAction, tree, resource, false)); - - if (!openEditor.isUntitled()) { - - // Files: Save / Revert - if (!autoSaveEnabled) { - result.push(new Separator()); - - const saveAction = this.instantiationService.createInstance(SaveFileAction, SaveFileAction.ID, SaveFileAction.LABEL); - saveAction.setResource(resource); - saveAction.enabled = openEditor.isDirty(); - result.push(saveAction); - - const revertAction = this.instantiationService.createInstance(RevertFileAction, RevertFileAction.ID, RevertFileAction.LABEL); - revertAction.setResource(resource); - revertAction.enabled = openEditor.isDirty(); - result.push(revertAction); - } - } - - // Untitled: Save / Save As - if (openEditor.isUntitled()) { - result.push(new Separator()); - - if (this.untitledEditorService.hasAssociatedFilePath(resource)) { - let saveUntitledAction = this.instantiationService.createInstance(SaveFileAction, SaveFileAction.ID, SaveFileAction.LABEL); - saveUntitledAction.setResource(resource); - result.push(saveUntitledAction); - } - - let saveAsAction = this.instantiationService.createInstance(SaveFileAsAction, SaveFileAsAction.ID, SaveFileAsAction.LABEL); - saveAsAction.setResource(resource); - result.push(saveAsAction); - } - - // Compare Actions - result.push(new Separator()); - - if (!openEditor.isUntitled()) { - const compareWithSavedAction = this.instantiationService.createInstance(CompareWithSavedAction, CompareWithSavedAction.ID, nls.localize('compareWithSaved', "Compare with Saved")); - compareWithSavedAction.setResource(resource); - compareWithSavedAction.enabled = openEditor.isDirty(); - result.push(compareWithSavedAction); - } - - const runCompareAction = this.instantiationService.createInstance(CompareResourcesAction, resource, tree); - if (runCompareAction._isEnabled()) { - result.push(runCompareAction); - } - result.push(this.instantiationService.createInstance(SelectResourceForCompareAction, resource, tree)); - - result.push(new Separator()); - } - - result.push(this.instantiationService.createInstance(CloseEditorAction, CloseEditorAction.ID, nls.localize('close', "Close"))); - const closeOtherEditorsInGroupAction = this.instantiationService.createInstance(CloseOtherEditorsInGroupAction, CloseOtherEditorsInGroupAction.ID, nls.localize('closeOthers', "Close Others")); - closeOtherEditorsInGroupAction.enabled = openEditor.editorGroup.count > 1; - result.push(closeOtherEditorsInGroupAction); - result.push(this.instantiationService.createInstance(CloseUnmodifiedEditorsInGroupAction, CloseUnmodifiedEditorsInGroupAction.ID, nls.localize('closeAllUnmodified', "Close Unmodified"))); - result.push(this.instantiationService.createInstance(CloseEditorsInGroupAction, CloseEditorsInGroupAction.ID, nls.localize('closeAll', "Close All"))); - } - - return result; - }); - } -} - -export class DragAndDrop extends DefaultDragAndDrop { - - constructor( - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IEditorGroupService private editorGroupService: IEditorGroupService - ) { - super(); - } - - public getDragURI(tree: ITree, element: OpenEditor): string { - if (!(element instanceof OpenEditor)) { - return null; - } - - const resource = element.getResource(); - // Some open editors do not have a resource so use the name as drag identifier instead #7021 - return resource ? resource.toString() : element.editorInput.getName(); - } - - public getDragLabel(tree: ITree, elements: OpenEditor[]): string { - if (elements.length > 1) { - return String(elements.length); - } - - return elements[0].editorInput.getName(); - } - - public onDragOver(tree: ITree, data: IDragAndDropData, target: OpenEditor | EditorGroup, originalEvent: DragMouseEvent): IDragOverReaction { - if (!(target instanceof OpenEditor) && !(target instanceof EditorGroup)) { - return DRAG_OVER_REJECT; - } - - if (data instanceof ExternalElementsDragAndDropData) { - let resource = explorerItemToFileResource(data.getData()[0]); - - if (!resource) { - return DRAG_OVER_REJECT; - } - - return resource.isDirectory ? DRAG_OVER_REJECT : DRAG_OVER_ACCEPT; - } - - if (data instanceof DesktopDragAndDropData) { - return DRAG_OVER_REJECT; - } - - if (!(data instanceof ElementsDragAndDropData)) { - return DRAG_OVER_REJECT; - } - - return DRAG_OVER_ACCEPT; - } - - public drop(tree: ITree, data: IDragAndDropData, target: OpenEditor | EditorGroup, originalEvent: DragMouseEvent): void { - let draggedElement: OpenEditor | EditorGroup; - const model = this.editorGroupService.getStacksModel(); - const positionOfTargetGroup = model.positionOfGroup(target instanceof EditorGroup ? target : target.editorGroup); - const index = target instanceof OpenEditor ? target.editorGroup.indexOf(target.editorInput) : undefined; - // Support drop from explorer viewer - if (data instanceof ExternalElementsDragAndDropData) { - let resource = explorerItemToFileResource(data.getData()[0]); - (resource as IResourceInput).options = { index, pinned: true }; - this.editorService.openEditor(resource, positionOfTargetGroup).done(null, errors.onUnexpectedError); - } - - // Drop within viewer - else { - let source: OpenEditor | EditorGroup[] = data.getData(); - if (Array.isArray(source)) { - draggedElement = source[0]; - } - } - - if (draggedElement) { - if (draggedElement instanceof OpenEditor) { - this.editorGroupService.moveEditor(draggedElement.editorInput, model.positionOfGroup(draggedElement.editorGroup), positionOfTargetGroup, { index }); - } else { - this.editorGroupService.moveGroup(model.positionOfGroup(draggedElement), positionOfTargetGroup); - } - } - } -} diff --git a/src/vs/workbench/parts/html/browser/html.contribution.ts b/src/vs/workbench/parts/html/browser/html.contribution.ts index 8201c1cfe1d1..cebedb5d2478 100644 --- a/src/vs/workbench/parts/html/browser/html.contribution.ts +++ b/src/vs/workbench/parts/html/browser/html.contribution.ts @@ -17,7 +17,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { MenuRegistry } from 'vs/platform/actions/common/actions'; -import { WebviewElement } from 'vs/workbench/parts/html/browser/webview'; import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; @@ -118,7 +117,7 @@ CommandsRegistry.registerCommand('_webview.openDevTools', function () { const elements = document.querySelectorAll('webview.ready'); for (let i = 0; i < elements.length; i++) { try { - (elements.item(i) as WebviewElement).openDevTools(); + (elements.item(i) as Electron.WebviewTag).openDevTools(); } catch (e) { console.error(e); } diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index 37882cb62c99..3cfc357897aa 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -50,16 +50,16 @@ var node = event.target; while (node) { if (node.tagName && node.tagName.toLowerCase() === 'a' && node.href) { - var baseElement = event.view.document.getElementsByTagName("base")[0]; - if (node.getAttribute("href") === "#") { + var baseElement = event.view.document.getElementsByTagName('base')[0]; + if (node.getAttribute('href') === '#') { event.view.scrollTo(0, 0); - } else if (node.hash && (node.getAttribute("href") === node.hash || (baseElement && node.href.indexOf(baseElement.href) >= 0))) { + } else if (node.hash && (node.getAttribute('href') === node.hash || (baseElement && node.href.indexOf(baseElement.href) >= 0))) { var scrollTarget = event.view.document.getElementById(node.hash.substr(1, node.hash.length - 1)); if (scrollTarget) { scrollTarget.scrollIntoView(); } } else { - ipcRenderer.sendToHost("did-click-link", node.href); + ipcRenderer.sendToHost('did-click-link', node.href); } event.preventDefault(); break; @@ -95,8 +95,8 @@ initData.baseUrl = value; }); - ipcRenderer.on('styles', function (event, value, activeTheme) { - initData.styles = value; + ipcRenderer.on('styles', function (event, variables, activeTheme) { + initData.styles = variables; initData.activeTheme = activeTheme; // webview @@ -108,10 +108,9 @@ styleBody(body[0]); // iframe - var defaultStyles = target.contentDocument.getElementById('_defaultStyles'); - if (defaultStyles) { - defaultStyles.innerHTML = initData.styles; - } + Object.keys(variables).forEach(function(variable) { + target.contentDocument.documentElement.style.setProperty(`--${variable}`,variables[variable]); + }); }); // propagate focus @@ -138,7 +137,48 @@ // apply default styles const defaultStyles = newDocument.createElement('style'); defaultStyles.id = '_defaultStyles'; - defaultStyles.innerHTML = initData.styles; + + const vars = Object.keys(initData.styles).map(function(variable) { + return `--${variable}: ${initData.styles[variable]};`; + }); + defaultStyles.innerHTML = ` + :root { ${vars.join(' ')} } + + body { + background-color: var(--background-color); + color: var(--color); + font-family: var(--font-family); + font-weight: var(--font-weight); + font-size: var(--font-size); + margin: 0; + padding: 0 20px; + } + + img { + max-width: 100%; + max-height: 100%; + } + a:focus, + input:focus, + select:focus, + textarea:focus { + outline: 1px solid -webkit-focus-ring-color; + outline-offset: -1px; + } + ::-webkit-scrollbar { + width: 10px; + height: 10px; + } + ::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-thumb); + } + ::-webkit-scrollbar-thumb:hover { + background-color: var(--scrollbar-thumb-hover); + } + ::-webkit-scrollbar-thumb:active { + background-color: var(--scrollbar-thumb-active); + } + `; if (newDocument.head.hasChildNodes()) { newDocument.head.insertBefore(defaultStyles, newDocument.head.firstChild); } else { @@ -181,7 +221,7 @@ newFrame.setAttribute('id', 'pending-frame'); newFrame.setAttribute('frameborder', '0'); newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin'); - newFrame.style.cssText = "display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden"; + newFrame.style.cssText = 'display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden'; document.body.appendChild(newFrame); // write new content onto iframe diff --git a/src/vs/workbench/parts/html/browser/webview.ts b/src/vs/workbench/parts/html/browser/webview.ts index 76809e246eb5..4e207e563b92 100644 --- a/src/vs/workbench/parts/html/browser/webview.ts +++ b/src/vs/workbench/parts/html/browser/webview.ts @@ -16,22 +16,6 @@ import { WebviewFindWidget } from './webviewFindWidget'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; -export declare interface WebviewElement extends HTMLElement { - src: string; - preload: string; - send(channel: string, ...args: any[]); - openDevTools(): any; - getWebContents(): any; - findInPage(value: string, options?: WebviewElementFindInPageOptions); - stopFindInPage(action: string); -} - -export class StopFindInPageActions { - static clearSelection = 'clearSelection'; - static keepSelection = 'keepSelection'; - static activateSelection = 'activateSelection'; -} - export interface WebviewElementFindInPageOptions { forward?: boolean; findNext?: boolean; @@ -58,7 +42,7 @@ export interface WebviewOptions { export default class Webview { private static index: number = 0; - private _webview: WebviewElement; + private readonly _webview: Electron.WebviewTag; private _ready: TPromise; private _disposables: IDisposable[] = []; private _onDidClickLink = new Emitter(); @@ -70,14 +54,14 @@ export default class Webview { private _findStarted: boolean = false; constructor( - private parent: HTMLElement, - private _styleElement: Element, - @IContextViewService private _contextViewService: IContextViewService, - private _contextKey: IContextKey, - private _findInputContextKey: IContextKey, + private readonly parent: HTMLElement, + private readonly _styleElement: Element, + @IContextViewService private readonly _contextViewService: IContextViewService, + private readonly _contextKey: IContextKey, + private readonly _findInputContextKey: IContextKey, private _options: WebviewOptions = {}, ) { - this._webview = document.createElement('webview'); + this._webview = document.createElement('webview'); this._webview.setAttribute('partition', this._options.allowSvgs ? 'webview' : `webview${Webview.index++}`); // disable auxclick events (see https://developers.google.com/web/updates/2016/10/auxclick) @@ -119,7 +103,7 @@ export default class Webview { return; } - contents.session.webRequest.onBeforeRequest((details, callback) => { + (contents.session.webRequest as any).onBeforeRequest((details, callback) => { if (details.url.indexOf('.svg') > 0) { const uri = URI.parse(details.url); if (uri && !uri.scheme.match(/file/i) && (uri.path as any).endsWith('.svg') && !this.isAllowedSvg(uri)) { @@ -130,7 +114,7 @@ export default class Webview { return callback({}); }); - contents.session.webRequest.onHeadersReceived((details, callback) => { + (contents.session.webRequest as any).onHeadersReceived((details, callback) => { const contentType: string[] = (details.responseHeaders['content-type'] || details.responseHeaders['Content-Type']) as any; if (contentType && Array.isArray(contentType) && contentType.some(x => x.toLowerCase().indexOf('image/svg') >= 0)) { const uri = URI.parse(details.url); @@ -157,25 +141,24 @@ export default class Webview { console.error('embedded page crashed'); }), addDisposableListener(this._webview, 'ipc-message', (event) => { - if (event.channel === 'did-click-link') { - let [uri] = event.args; - this._onDidClickLink.fire(URI.parse(uri)); - return; - } + switch (event.channel) { + case 'did-click-link': + let [uri] = event.args; + this._onDidClickLink.fire(URI.parse(uri)); + return; - if (event.channel === 'did-set-content') { - this._webview.style.flex = ''; - this._webview.style.width = '100%'; - this._webview.style.height = '100%'; - this.layout(); - return; - } + case 'did-set-content': + this._webview.style.flex = ''; + this._webview.style.width = '100%'; + this._webview.style.height = '100%'; + this.layout(); + return; - if (event.channel === 'did-scroll') { - if (event.args && typeof event.args[0] === 'number') { - this._onDidScroll.fire({ scrollYPercentage: event.args[0] }); - } - return; + case 'did-scroll': + if (event.args && typeof event.args[0] === 'number') { + this._onDidScroll.fire({ scrollYPercentage: event.args[0] }); + } + return; } }), addDisposableListener(this._webview, 'focus', () => { @@ -276,87 +259,33 @@ export default class Webview { style(theme: ITheme): void { const { fontFamily, fontWeight, fontSize } = window.getComputedStyle(this._styleElement); // TODO@theme avoid styleElement - let value = ` - :root { - --background-color: ${theme.getColor(editorBackground)}; - --color: ${theme.getColor(editorForeground)}; - --font-family: ${fontFamily}; - --font-weight: ${fontWeight}; - --font-size: ${fontSize}; - } - body { - background-color: var(--background-color); - color: var(--color); - font-family: var(--font-family); - font-weight: var(--font-weight); - font-size: var(--font-size); - margin: 0; - padding: 0 20px; - } - - img { - max-width: 100%; - max-height: 100%; - } - a:focus, - input:focus, - select:focus, - textarea:focus { - outline: 1px solid -webkit-focus-ring-color; - outline-offset: -1px; - } - ::-webkit-scrollbar { - width: 10px; - height: 10px; - }`; - + const styles = { + 'background-color': theme.getColor(editorBackground).toString(), + 'color': theme.getColor(editorForeground).toString(), + 'font-family': fontFamily, + 'font-weight': fontWeight, + 'font-size': fontSize, + }; let activeTheme: ApiThemeClassName; - if (theme.type === LIGHT) { - value += ` - ::-webkit-scrollbar-thumb { - background-color: rgba(100, 100, 100, 0.4); - } - ::-webkit-scrollbar-thumb:hover { - background-color: rgba(100, 100, 100, 0.7); - } - ::-webkit-scrollbar-thumb:active { - background-color: rgba(0, 0, 0, 0.6); - }`; - + styles['scrollbar-thumb'] = 'rgba(100, 100, 100, 0.4)'; + styles['scrollbar-thumb-hover'] = 'rgba(100, 100, 100, 0.7)'; + styles['scrollbar-thumb-active'] = 'rgba(0, 0, 0, 0.6)'; activeTheme = 'vscode-light'; - } else if (theme.type === DARK) { - value += ` - ::-webkit-scrollbar-thumb { - background-color: rgba(121, 121, 121, 0.4); - } - ::-webkit-scrollbar-thumb:hover { - background-color: rgba(100, 100, 100, 0.7); - } - ::-webkit-scrollbar-thumb:active { - background-color: rgba(85, 85, 85, 0.8); - }`; - + styles['scrollbar-thumb'] = 'rgba(121, 121, 121, 0.4)'; + styles['scrollbar-thumb-hover'] = 'rgba(100, 100, 100, 0.7)'; + styles['scrollbar-thumb-active'] = 'rgba(85, 85, 85, 0.8)'; activeTheme = 'vscode-dark'; - } else { - value += ` - ::-webkit-scrollbar-thumb { - background-color: rgba(111, 195, 223, 0.3); - } - ::-webkit-scrollbar-thumb:hover { - background-color: rgba(111, 195, 223, 0.8); - } - ::-webkit-scrollbar-thumb:active { - background-color: rgba(111, 195, 223, 0.8); - }`; - + styles['scrollbar-thumb'] = 'rgba(111, 195, 223, 0.3)'; + styles['scrollbar-thumb-hover'] = 'rgba(111, 195, 223, 0.8)'; + styles['scrollbar-thumb-active'] = 'rgba(111, 195, 223, 0.8)'; activeTheme = 'vscode-high-contrast'; } - this._send('styles', value, activeTheme); + this._send('styles', styles, activeTheme); this._webviewFindWidget.updateTheme(theme); } @@ -445,7 +374,7 @@ export default class Webview { public stopFind(keepSelection?: boolean): void { this._findStarted = false; - this._webview.stopFindInPage(keepSelection ? StopFindInPageActions.keepSelection : StopFindInPageActions.clearSelection); + this._webview.stopFindInPage(keepSelection ? 'keepSelection' : 'clearSelection'); } public showFind() { diff --git a/src/vs/workbench/parts/markers/browser/markersPanel.ts b/src/vs/workbench/parts/markers/browser/markersPanel.ts index 06ccfc040b09..bc160c94e8e8 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanel.ts @@ -21,22 +21,21 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import Constants from 'vs/workbench/parts/markers/common/constants'; import { MarkersModel, Marker, Resource, FilterOptions } from 'vs/workbench/parts/markers/common/markersModel'; import { Controller } from 'vs/workbench/parts/markers/browser/markersTreeController'; -import Tree = require('vs/base/parts/tree/browser/tree'); -import TreeImpl = require('vs/base/parts/tree/browser/treeImpl'); import * as Viewer from 'vs/workbench/parts/markers/browser/markersTreeViewer'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CollapseAllAction, FilterAction, FilterInputBoxActionItem } from 'vs/workbench/parts/markers/browser/markersPanelActions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import Messages from 'vs/workbench/parts/markers/common/messages'; import { RangeHighlightDecorations } from 'vs/workbench/browser/parts/editor/rangeDecorations'; -import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IListService } from 'vs/platform/list/browser/listService'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import FileResultsNavigation from 'vs/workbench/parts/files/browser/fileResultsNavigation'; import { debounceEvent } from 'vs/base/common/event'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; import { SimpleFileResourceDragAndDrop } from 'vs/base/parts/tree/browser/treeDnd'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; +import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; +import { localize } from 'vs/nls'; export class MarkersPanel extends Panel { @@ -47,7 +46,7 @@ export class MarkersPanel extends Panel { private lastSelectedRelativeTop: number = 0; private currentActiveResource: URI = null; - private tree: Tree.ITree; + private tree: WorkbenchTree; private autoExpanded: Set; private rangeHighlightDecorations: RangeHighlightDecorations; @@ -59,7 +58,6 @@ export class MarkersPanel extends Panel { private messageBoxContainer: HTMLElement; private messageBox: HTMLElement; - private markerFocusContextKey: IContextKey; private currentResourceGotAddedToMarkersData: boolean = false; constructor( @@ -68,15 +66,15 @@ export class MarkersPanel extends Panel { @IEditorGroupService private editorGroupService: IEditorGroupService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IConfigurationService private configurationService: IConfigurationService, - @IContextKeyService contextKeyService: IContextKeyService, + @IContextKeyService private contextKeyService: IContextKeyService, @ITelemetryService telemetryService: ITelemetryService, @IListService private listService: IListService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IActivityService private activityService: IActivityService ) { super(Constants.MARKERS_PANEL_ID, telemetryService, themeService); this.delayedRefresh = new Delayer(500); this.autoExpanded = new Set(); - this.markerFocusContextKey = Constants.MarkerFocusContextKey.bindTo(contextKeyService); } public create(parent: builder.Builder): TPromise { @@ -127,11 +125,17 @@ export class MarkersPanel extends Panel { } public setVisible(visible: boolean): TPromise { - let promise: TPromise = super.setVisible(visible); - if (!visible) { - this.rangeHighlightDecorations.removeHighlightRange(); - } - return promise; + const wasVisible = this.isVisible(); + return super.setVisible(visible) + .then(() => { + if (this.isVisible()) { + if (!wasVisible) { + this.refreshPanel(); + } + } else { + this.rangeHighlightDecorations.removeHighlightRange(); + } + }); } public getActions(): IAction[] { @@ -171,13 +175,16 @@ export class MarkersPanel extends Panel { } private refreshPanel(): TPromise { - this.collapseAllAction.enabled = this.markersModel.hasFilteredResources(); - dom.toggleClass(this.treeContainer, 'hidden', !this.markersModel.hasFilteredResources()); - this.renderMessage(); - if (this.markersModel.hasFilteredResources()) { - return this.tree.refresh().then(() => { - this.autoExpand(); - }); + this.refreshBadge(); + if (this.isVisible()) { + this.collapseAllAction.enabled = this.markersModel.hasFilteredResources(); + dom.toggleClass(this.treeContainer, 'hidden', !this.markersModel.hasFilteredResources()); + this.renderMessage(); + if (this.markersModel.hasFilteredResources()) { + return this.tree.refresh().then(() => { + this.autoExpand(); + }); + } } return TPromise.as(null); } @@ -189,6 +196,13 @@ export class MarkersPanel extends Panel { this.autoReveal(); } + private refreshBadge(): void { + const total = this.markersModel.total(); + const count = this.markersModel.count(); + const message = total === count ? localize('totalProblems', 'Total {0} Problems', total) : localize('filteredProblems', 'Showing {0} of {1} Problems', count, total); + this.activityService.showActivity(this.getId(), new NumberBadge(count, () => message)); + } + private createMessageBox(parent: HTMLElement): void { this.messageBoxContainer = dom.append(parent, dom.$('.message-box-container')); this.messageBox = dom.append(this.messageBoxContainer, dom.$('span')); @@ -201,7 +215,7 @@ export class MarkersPanel extends Panel { const renderer = this.instantiationService.createInstance(Viewer.Renderer); const dnd = new SimpleFileResourceDragAndDrop(obj => obj instanceof Resource ? obj.uri : void 0); let controller = this.instantiationService.createInstance(Controller); - this.tree = new TreeImpl.Tree(this.treeContainer, { + this.tree = new WorkbenchTree(this.treeContainer, { dataSource: new Viewer.DataSource(), renderer, controller, @@ -213,24 +227,14 @@ export class MarkersPanel extends Panel { twistiePixels: 20, ariaLabel: Messages.MARKERS_PANEL_ARIA_LABEL_PROBLEMS_TREE, keyboardSupport: false - }); + }, this.contextKeyService, this.listService, this.themeService); - this._register(attachListStyler(this.tree, this.themeService)); - - this._register(this.tree.onDidChangeFocus((e: { focus: any }) => { - this.markerFocusContextKey.set(e.focus instanceof Marker); - })); + Constants.MarkerFocusContextKey.bindTo(this.tree.contextKeyService); const fileResultsNavigation = this._register(new FileResultsNavigation(this.tree)); this._register(debounceEvent(fileResultsNavigation.openFile, (last, event) => event, 75, true)(options => { this.openFileAtElement(options.element, options.editorOptions.preserveFocus, options.editorOptions.pinned, options.sideBySide); })); - - const focusTracker = this._register(dom.trackFocus(this.tree.getHTMLElement())); - this._register(focusTracker.onDidBlur(() => this.markerFocusContextKey.set(false))); - this._register(focusTracker); - - this.toUnbind.push(this.listService.register(this.tree)); } private createActions(): void { diff --git a/src/vs/workbench/parts/markers/browser/markersPanelActions.ts b/src/vs/workbench/parts/markers/browser/markersPanelActions.ts index 207be79c10e9..9f1412c42184 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanelActions.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanelActions.ts @@ -33,21 +33,9 @@ export class ToggleMarkersPanelAction extends TogglePanelAction { constructor(id: string, label: string, @IPartService partService: IPartService, @IPanelService panelService: IPanelService, - @ITelemetryService private telemetryService: ITelemetryService ) { super(id, label, Constants.MARKERS_PANEL_ID, panelService, partService); } - - public run(): TPromise { - let promise = super.run(); - if (this.isPanelFocused()) { - /* __GDPR__ - "problems.used" : {} - */ - this.telemetryService.publicLog('problems.used'); - } - return promise; - } } export class ShowProblemsPanelAction extends Action { @@ -56,17 +44,12 @@ export class ShowProblemsPanelAction extends Action { public static readonly LABEL = Messages.MARKERS_PANEL_SHOW_LABEL; constructor(id: string, label: string, - @IPanelService private panelService: IPanelService, - @ITelemetryService private telemetryService: ITelemetryService + @IPanelService private panelService: IPanelService ) { super(id, label); } public run(): TPromise { - /* __GDPR__ - "problems.used" : {} - */ - this.telemetryService.publicLog('problems.used'); return this.panelService.openPanel(Constants.MARKERS_PANEL_ID, true); } } @@ -79,38 +62,16 @@ export class ToggleErrorsAndWarningsAction extends TogglePanelAction { constructor(id: string, label: string, @IPartService partService: IPartService, @IPanelService panelService: IPanelService, - @ITelemetryService private telemetryService: ITelemetryService ) { super(id, label, Constants.MARKERS_PANEL_ID, panelService, partService); } - - public run(): TPromise { - let promise = super.run(); - if (this.isPanelFocused()) { - /* __GDPR__ - "problems.used" : {} - */ - this.telemetryService.publicLog('problems.used'); - } - return promise; - } } export class CollapseAllAction extends TreeCollapseAction { - constructor(viewer: Tree.ITree, enabled: boolean, - @ITelemetryService private telemetryService: ITelemetryService) { + constructor(viewer: Tree.ITree, enabled: boolean) { super(viewer, enabled); } - - public run(context?: any): TPromise { - /* __GDPR__ - "problems.collapseAll.used" : {} - */ - this.telemetryService.publicLog('problems.collapseAll.used'); - return super.run(context); - } - } export class FilterAction extends Action { diff --git a/src/vs/workbench/parts/markers/common/constants.ts b/src/vs/workbench/parts/markers/common/constants.ts index d470ebfc8b02..e1edde7ad006 100644 --- a/src/vs/workbench/parts/markers/common/constants.ts +++ b/src/vs/workbench/parts/markers/common/constants.ts @@ -11,5 +11,5 @@ export default { MARKER_COPY_MESSAGE_ACTION_ID: 'problems.action.copyMessage', MARKER_OPEN_SIDE_ACTION_ID: 'problems.action.openToSide', - MarkerFocusContextKey: new RawContextKey('problemFocus', false) + MarkerFocusContextKey: new RawContextKey('problemFocus', true) }; diff --git a/src/vs/workbench/parts/markers/common/markersModel.ts b/src/vs/workbench/parts/markers/common/markersModel.ts index 6ffeaf6792ad..f17a6faac71d 100644 --- a/src/vs/workbench/parts/markers/common/markersModel.ts +++ b/src/vs/workbench/parts/markers/common/markersModel.ts @@ -159,6 +159,18 @@ export class MarkersModel { return this.markersByResource.has(resource.toString()); } + public total(): number { + let total = 0; + this.markersByResource.forEach(markers => total = total + markers.length); + return total; + } + + public count(): number { + let count = 0; + this.filteredResources.forEach(resource => count = count + resource.markers.length); + return count; + } + public get nonFilteredResources(): Resource[] { return this._nonFilteredResources; } @@ -310,25 +322,6 @@ export class MarkersModel { return Messages.MARKERS_PANEL_NO_PROBLEMS_BUILT; } - public static getStatisticsLabel(markerStatistics: MarkerStatistics, onlyErrors: boolean = false): string { - let label = this.getLabel('', markerStatistics.errors, Messages.MARKERS_PANEL_SINGLE_ERROR_LABEL, Messages.MARKERS_PANEL_MULTIPLE_ERRORS_LABEL); - if (!onlyErrors) { - label = this.getLabel(label, markerStatistics.warnings, Messages.MARKERS_PANEL_SINGLE_WARNING_LABEL, Messages.MARKERS_PANEL_MULTIPLE_WARNINGS_LABEL); - label = this.getLabel(label, markerStatistics.infos, Messages.MARKERS_PANEL_SINGLE_INFO_LABEL, Messages.MARKERS_PANEL_MULTIPLE_INFOS_LABEL); - label = this.getLabel(label, markerStatistics.unknowns, Messages.MARKERS_PANEL_SINGLE_UNKNOWN_LABEL, Messages.MARKERS_PANEL_MULTIPLE_UNKNOWNS_LABEL); - } - return label; - } - - private static getLabel(title: string, markersCount: number, singleMarkerString: string, multipleMarkersFunction: (markersCount: number) => string): string { - if (markersCount <= 0) { - return title; - } - title = title ? title + ', ' : ''; - title += markersCount === 1 ? singleMarkerString : multipleMarkersFunction(markersCount); - return title; - } - public static compare(a: any, b: any): number { if (a instanceof Resource && b instanceof Resource) { return MarkersModel.compareResources(a, b); diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index e14449899781..4850d22984f0 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -5,84 +5,4 @@ 'use strict'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IExtensionService } from 'vs/platform/extensions/common/extensions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; -import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { ReportPerformanceIssueAction } from 'vs/workbench/electron-browser/actions'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { join } from 'path'; -import { localize } from 'vs/nls'; -import { readdir } from 'vs/base/node/pfs'; -import { stopProfiling } from 'vs/base/node/profiler'; - -class StartupProfiler implements IWorkbenchContribution { - - constructor( - @IWindowsService private readonly _windowsService: IWindowsService, - @IMessageService private readonly _messageService: IMessageService, - @IEnvironmentService private readonly _environmentService: IEnvironmentService, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @ILifecycleService lifecycleService: ILifecycleService, - @IExtensionService extensionService: IExtensionService, - ) { - // wait for everything to be ready - extensionService.whenInstalledExtensionsRegistered().then(() => { - this._stopProfiling(); - }); - } - - private _stopProfiling(): void { - - const { profileStartup } = this._environmentService; - if (!profileStartup) { - return; - } - - stopProfiling(profileStartup.dir, profileStartup.prefix).then(() => { - readdir(profileStartup.dir).then(files => { - return files.filter(value => value.indexOf(profileStartup.prefix) === 0); - }).then(files => { - const profileFiles = files.reduce((prev, cur) => `${prev}${join(profileStartup.dir, cur)}\n`, '\n'); - - const primaryButton = this._messageService.confirmSync({ - type: 'info', - message: localize('prof.message', "Successfully created profiles."), - detail: localize('prof.detail', "Please create an issue and manually attach the following files:\n{0}", profileFiles), - primaryButton: localize('prof.restartAndFileIssue', "Create Issue and Restart"), - secondaryButton: localize('prof.restart', "Restart") - }); - - if (primaryButton) { - const action = this._instantiationService.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL); - TPromise.join([ - this._windowsService.showItemInFolder(join(profileStartup.dir, files[0])), - action.run(`:warning: Make sure to **attach** these files from your *home*-directory: :warning:\n${files.map(file => `-\`${file}\``).join('\n')}`) - ]).then(() => { - // keep window stable until restart is selected - this._messageService.confirmSync({ - type: 'info', - message: localize('prof.thanks', "Thanks for helping us."), - detail: localize('prof.detail.restart', "A final restart is required to continue to use '{0}'. Again, thank you for your contribution.", this._environmentService.appNameLong), - primaryButton: localize('prof.restart', "Restart"), - secondaryButton: null - }); - // now we are ready to restart - this._windowsService.relaunch({ removeArgs: ['--prof-startup'] }); - }); - - } else { - // simply restart - this._windowsService.relaunch({ removeArgs: ['--prof-startup'] }); - } - }); - }); - } -} - -const registry = Registry.as(Extensions.Workbench); -registry.registerWorkbenchContribution(StartupProfiler, LifecyclePhase.Running); +import './startupProfiler'; diff --git a/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts b/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts new file mode 100644 index 000000000000..242c7c0e1c8e --- /dev/null +++ b/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts @@ -0,0 +1,97 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IMessageService } from 'vs/platform/message/common/message'; +import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { ReportPerformanceIssueAction } from 'vs/workbench/electron-browser/actions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { join, dirname } from 'path'; +import { localize } from 'vs/nls'; +import { readdir, del, readFile } from 'vs/base/node/pfs'; +import { basename } from 'vs/base/common/paths'; + +class StartupProfiler implements IWorkbenchContribution { + + constructor( + @IWindowsService private readonly _windowsService: IWindowsService, + @IMessageService private readonly _messageService: IMessageService, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @ILifecycleService lifecycleService: ILifecycleService, + @IExtensionService extensionService: IExtensionService, + ) { + // wait for everything to be ready + Promise.all([ + lifecycleService.when(LifecyclePhase.Eventually), + extensionService.whenInstalledExtensionsRegistered() + ]).then(() => { + this._stopProfiling(); + }); + } + + private _stopProfiling(): void { + + const profileFilenamePrefix = this._environmentService.args['prof-startup-prefix']; + if (!profileFilenamePrefix) { + return; + } + + const dir = dirname(profileFilenamePrefix); + const prefix = basename(profileFilenamePrefix); + + const removeArgs: string[] = ['--prof-startup']; + const markerFile = readFile(profileFilenamePrefix).then(value => removeArgs.push(...value.toString().split('|'))) + .then(() => del(profileFilenamePrefix)) + .then(() => TPromise.timeout(1000)); + + markerFile.then(() => { + return readdir(dir).then(files => files.filter(value => value.indexOf(prefix) === 0)); + }).then(files => { + const profileFiles = files.reduce((prev, cur) => `${prev}${join(dir, cur)}\n`, '\n'); + + const primaryButton = this._messageService.confirm({ + type: 'info', + message: localize('prof.message', "Successfully created profiles."), + detail: localize('prof.detail', "Please create an issue and manually attach the following files:\n{0}", profileFiles), + primaryButton: localize('prof.restartAndFileIssue', "Create Issue and Restart"), + secondaryButton: localize('prof.restart', "Restart") + }); + + if (primaryButton) { + const action = this._instantiationService.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL); + TPromise.join([ + this._windowsService.showItemInFolder(join(dir, files[0])), + action.run(`:warning: Make sure to **attach** these files from your *home*-directory: :warning:\n${files.map(file => `-\`${file}\``).join('\n')}`) + ]).then(() => { + // keep window stable until restart is selected + this._messageService.confirm({ + type: 'info', + message: localize('prof.thanks', "Thanks for helping us."), + detail: localize('prof.detail.restart', "A final restart is required to continue to use '{0}'. Again, thank you for your contribution.", this._environmentService.appNameLong), + primaryButton: localize('prof.restart', "Restart"), + secondaryButton: null + }); + // now we are ready to restart + this._windowsService.relaunch({ removeArgs }); + }); + + } else { + // simply restart + this._windowsService.relaunch({ removeArgs }); + } + }); + } +} + +const registry = Registry.as(Extensions.Workbench); +registry.registerWorkbenchContribution(StartupProfiler, LifecyclePhase.Running); diff --git a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts index 596eb1466901..50cfe71341a9 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts @@ -203,7 +203,7 @@ export class DefineKeybindingWidget extends Widget { this._domNode.setClassName('defineKeybindingWidget'); this._domNode.setWidth(DefineKeybindingWidget.WIDTH); this._domNode.setHeight(DefineKeybindingWidget.HEIGHT); - dom.append(this._domNode.domNode, dom.$('.message', null, nls.localize('defineKeybinding.initial', "Press desired key combination and ENTER. ESCAPE to cancel."))); + dom.append(this._domNode.domNode, dom.$('.message', null, nls.localize('defineKeybinding.initial', "Press desired key combination and then press ENTER."))); this._register(attachStylerCallback(this.themeService, { editorWidgetBackground, widgetShadow }, colors => { this._domNode.domNode.style.backgroundColor = colors.editorWidgetBackground; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts index a462da1c4282..ea68e3b1e2f1 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts @@ -16,7 +16,7 @@ import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLa import { IAction } from 'vs/base/common/actions'; import { ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { EditorInput } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { KeybindingsEditorModel, IKeybindingItemEntry, IListEntry, KEYBINDING_ENTRY_TEMPLATE_ID, KEYBINDING_HEADER_TEMPLATE_ID } from 'vs/workbench/parts/preferences/common/keybindingsEditorModel'; @@ -30,7 +30,6 @@ import { } from 'vs/workbench/parts/preferences/common/preferences'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; -import { IListService } from 'vs/platform/list/browser/listService'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { IDelegate, IRenderer, IListContextMenuEvent, IListEvent } from 'vs/base/browser/ui/list/list'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; @@ -38,10 +37,10 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; import { listHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { WorkbenchList, IListService } from 'vs/platform/list/browser/listService'; let $ = DOM.$; @@ -136,19 +135,18 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor this._register(focusTracker.onDidBlur(() => this.keybindingsEditorContextKey.reset())); } - setInput(input: KeybindingsEditorInput): TPromise { + setInput(input: KeybindingsEditorInput, options: EditorOptions): TPromise { const oldInput = this.input; return super.setInput(input) .then(() => { if (!input.matches(oldInput)) { - this.render(); + this.render(options && options.preserveFocus); } }); } clearInput(): void { super.clearInput(); - this.searchWidget.clear(); this.keybindingsEditorContextKey.reset(); this.keybindingFocusContextKey.reset(); } @@ -328,8 +326,8 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor private createList(parent: HTMLElement): void { this.keybindingsListContainer = DOM.append(parent, $('.keybindings-list-container')); - this.keybindingsList = this._register(new List(this.keybindingsListContainer, new Delegate(), [new KeybindingHeaderRenderer(), new KeybindingItemRenderer(this, this.keybindingsService)], - { identityProvider: e => e.id, keyboardSupport: false, mouseSupport: true, ariaLabel: localize('keybindingsLabel', "Keybindings") })); + this.keybindingsList = this._register(new WorkbenchList(this.keybindingsListContainer, new Delegate(), [new KeybindingHeaderRenderer(), new KeybindingItemRenderer(this, this.keybindingsService)], + { identityProvider: e => e.id, keyboardSupport: false, mouseSupport: true, ariaLabel: localize('keybindingsLabel', "Keybindings") }, this.contextKeyService, this.listService, this.themeService)); this._register(this.keybindingsList.onContextMenu(e => this.onContextMenu(e))); this._register(this.keybindingsList.onFocusChange(e => this.onFocusChange(e))); this._register(this.keybindingsList.onDidFocus(() => { @@ -339,12 +337,20 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor DOM.removeClass(this.keybindingsList.getHTMLElement(), 'focused'); this.keybindingFocusContextKey.reset(); })); - - this._register(attachListStyler(this.keybindingsList, this.themeService)); - this._register(this.listService.register(this.keybindingsList)); + this._register(this.keybindingsList.onMouseDblClick(() => this.defineKeybinding(this.activeKeybindingEntry))); + this._register(this.keybindingsList.onKeyDown(e => { + const event = new StandardKeyboardEvent(e); + if (event.keyCode === KeyCode.Enter) { + const keybindingEntry = this.activeKeybindingEntry; + if (keybindingEntry) { + this.defineKeybinding(this.activeKeybindingEntry); + } + e.stopPropagation(); + } + })); } - private render(): TPromise { + private render(preserveFocus?: boolean): TPromise { if (this.input) { return this.input.resolve() .then((keybindingsModel: KeybindingsEditorModel) => this.keybindingsEditorModel = keybindingsModel) @@ -355,7 +361,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor }, {}); return this.keybindingsEditorModel.resolve(editorActionsLabels); }) - .then(() => this.renderKeybindingsEntries(false)); + .then(() => this.renderKeybindingsEntries(false, preserveFocus)); } return TPromise.as(null); } @@ -365,7 +371,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor this.delayedFilterLogging.trigger(() => this.reportFilteringUsed(this.searchWidget.getValue())); } - private renderKeybindingsEntries(reset: boolean): void { + private renderKeybindingsEntries(reset: boolean, preserveFocus?: boolean): void { if (this.keybindingsEditorModel) { const filter = this.searchWidget.getValue(); const keybindingsEntries: IKeybindingItemEntry[] = this.keybindingsEditorModel.fetch(filter, this.sortByPrecedence.checked); @@ -390,7 +396,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor this.unAssignedKeybindingItemToRevealAndFocus = null; } else if (currentSelectedIndex !== -1 && currentSelectedIndex < this.listEntries.length) { this.selectEntry(currentSelectedIndex); - } else if (this.editorService.getActiveEditor() === this) { + } else if (this.editorService.getActiveEditor() === this && !preserveFocus) { this.focus(); } } @@ -743,7 +749,7 @@ class CommandColumn extends Column { commandLabel.set(keybindingItem.command, keybindingItemEntry.commandIdMatches); } if (commandLabel) { - commandLabel.element.title = keybindingItem.command; + commandLabel.element.title = keybindingItem.commandLabel ? localize('title', "{0} ({1})", keybindingItem.commandLabel, keybindingItem.command) : keybindingItem.command; } } diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index c758b65f083a..4faa43a06fc0 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -41,13 +41,21 @@ text-transform: uppercase; font-size: 11px; margin-left: 33px; - margin-right: 0px; + margin-right: 5px; cursor: pointer; display: flex; overflow: hidden; text-overflow: ellipsis; } +.settings-tabs-widget > .monaco-action-bar .actions-container { + justify-content: flex-start; +} + +.settings-tabs-widget > .monaco-action-bar .action-item { + padding: 3px 0px; +} + .settings-tabs-widget > .monaco-action-bar .action-item .action-title { text-overflow: ellipsis; overflow: hidden; @@ -89,18 +97,6 @@ opacity: 1; } -.settings-tabs-widget > .monaco-action-bar:not(.empty-workbench) .action-item .action-label.checked { - border-bottom: 1px solid; -} - -.vs .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked { - border-bottom-color: #ccceda; -} - -.vs-dark .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked { - border-bottom-color: #404047; -} - .preferences-header > .settings-header-widget { flex: 1; display: flex; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index a195b75a566d..5525dd14aad3 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -25,7 +25,7 @@ import { CodeEditor } from 'vs/editor/browser/codeEditor'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IPreferencesService, ISettingsGroup, ISetting, IFilterResult, IPreferencesSearchService, - CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, SETTINGS_EDITOR_COMMAND_SEARCH, SETTINGS_EDITOR_COMMAND_FOCUS_FILE, ISettingsEditorModel, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING, IFilterMetadata + CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, SETTINGS_EDITOR_COMMAND_SEARCH, SETTINGS_EDITOR_COMMAND_FOCUS_FILE, ISettingsEditorModel, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING, IFilterMetadata, IPreferencesSearchModel } from 'vs/workbench/parts/preferences/common/preferences'; import { SettingsEditorModel, DefaultSettingsEditorModel } from 'vs/workbench/parts/preferences/common/preferencesModels'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -66,6 +66,10 @@ export class PreferencesEditorInput extends SideBySideEditorInput { return PreferencesEditorInput.ID; } + public supportsSplitEditor(): boolean { + return true; + } + public getTitle(verbosity: Verbosity): string { return this.master.getTitle(verbosity); } @@ -387,6 +391,7 @@ class PreferencesRenderers extends Disposable { private _settingsNavigator: SettingsNavigator; private _filtersInProgress: TPromise[]; private _searchCriteria: ISearchCriteria; + private _currentSearchModel: IPreferencesSearchModel; private _onTriggeredFuzzy: Emitter = this._register(new Emitter()); public onTriggeredFuzzy: Event = this._onTriggeredFuzzy.event; @@ -404,6 +409,10 @@ class PreferencesRenderers extends Disposable { return this._defaultPreferencesRenderer; } + get editablePreferencesRenderer(): IPreferencesRenderer { + return this._editablePreferencesRenderer; + } + set defaultPreferencesRenderer(defaultPreferencesRenderer: IPreferencesRenderer) { if (this._defaultPreferencesRenderer !== defaultPreferencesRenderer) { this._defaultPreferencesRenderer = defaultPreferencesRenderer; @@ -427,11 +436,13 @@ class PreferencesRenderers extends Disposable { this._editablePreferencesRendererDisposables = dispose(this._editablePreferencesRendererDisposables); if (this._editablePreferencesRenderer) { (this._editablePreferencesRenderer.preferencesModel).onDidChangeGroups(() => { - this._filterEditablePreferences() - .then(() => { - const count = this.consolidateAndUpdate(); - this._onDidFilterResultsCountChange.fire(count); - }); + if (this._currentSearchModel) { + this._filterEditablePreferences() + .then(() => { + const count = this.consolidateAndUpdate(); + this._onDidFilterResultsCountChange.fire(count); + }); + } }, this, this._editablePreferencesRendererDisposables); } } @@ -445,6 +456,7 @@ class PreferencesRenderers extends Disposable { this._filtersInProgress.forEach(p => p.cancel && p.cancel()); } + this._currentSearchModel = this.preferencesSearchService.startSearch(this._searchCriteria.filter, criteria.fuzzy); this._filtersInProgress = [this._filterDefaultPreferences(), this._filterEditablePreferences()]; return TPromise.join(this._filtersInProgress).then(() => { @@ -473,7 +485,7 @@ class PreferencesRenderers extends Disposable { private _filterDefaultPreferences(): TPromise { if (this._searchCriteria && this._defaultPreferencesRenderer) { - return this._filterPreferences(this._searchCriteria, this._defaultPreferencesRenderer) + return this._filterPreferences(this._searchCriteria, this._defaultPreferencesRenderer, this._currentSearchModel) .then(filterResult => { this._defaultPreferencesFilterResult = filterResult; }); } return TPromise.wrap(null); @@ -481,7 +493,7 @@ class PreferencesRenderers extends Disposable { private _filterEditablePreferences(): TPromise { if (this._searchCriteria && this._editablePreferencesRenderer) { - return this._filterPreferences({ filter: this._searchCriteria.filter, fuzzy: false }, this._editablePreferencesRenderer) + return this._filterPreferences(this._searchCriteria, this._editablePreferencesRenderer, this._currentSearchModel) .then(filterResult => { this._editablePreferencesFilterResult = filterResult; }); } return TPromise.wrap(null); @@ -500,9 +512,8 @@ class PreferencesRenderers extends Disposable { return preferencesRenderer ? (preferencesRenderer.preferencesModel).settingsGroups : []; } - private _filterPreferences(searchCriteria: ISearchCriteria, preferencesRenderer: IPreferencesRenderer): TPromise { - if (preferencesRenderer) { - const searchModel = this.preferencesSearchService.startSearch(searchCriteria.filter, searchCriteria.fuzzy); + private _filterPreferences(searchCriteria: ISearchCriteria, preferencesRenderer: IPreferencesRenderer, searchModel: IPreferencesSearchModel): TPromise { + if (preferencesRenderer && searchCriteria) { const prefSearchP = searchModel.filterPreferences(preferencesRenderer.preferencesModel); return prefSearchP.then(filterResult => { @@ -643,7 +654,7 @@ class SideBySidePreferencesWidget extends Widget { return TPromise.join([this.updateInput(this.defaultPreferencesEditor, defaultPreferencesEditorInput, DefaultSettingsEditorContribution.ID, editablePreferencesEditorInput.getResource(), options), this.updateInput(this.editablePreferencesEditor, editablePreferencesEditorInput, SettingsEditorContribution.ID, defaultPreferencesEditorInput.getResource(), options)]) .then(([defaultPreferencesRenderer, editablePreferencesRenderer]) => { - this.defaultPreferencesHeader.textContent = (defaultPreferencesRenderer.preferencesModel).configurationScope === ConfigurationScope.RESOURCE ? nls.localize('defaultFolderSettings', "Default Folder Settings") : nls.localize('defaultSettings', "Default Settings"); + this.defaultPreferencesHeader.textContent = defaultPreferencesRenderer && (defaultPreferencesRenderer.preferencesModel).configurationScope === ConfigurationScope.RESOURCE ? nls.localize('defaultFolderSettings', "Default Folder Settings") : nls.localize('defaultSettings', "Default Settings"); return { defaultPreferencesRenderer, editablePreferencesRenderer }; }); } diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index 7db9cd818f87..60ea35dc725f 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -363,10 +363,6 @@ export class DefaultSettingsRenderer extends Disposable implements IPreferencesR this.settingHighlighter.clear(true); } - public collapseAll() { - this.settingsGroupTitleRenderer.collapseAll(); - } - public updatePreference(key: string, value: any, source: ISetting): void { } } @@ -501,15 +497,6 @@ export class SettingsGroupTitleRenderer extends Disposable implements HiddenArea } } - public collapseAll() { - this.editor.setPosition({ lineNumber: 1, column: 1 }); - this.hiddenGroups = this.settingsGroups.slice(); - for (const groupTitleWidget of this.settingsGroupTitleWidgets) { - groupTitleWidget.toggleCollapse(true); - } - this._onHiddenAreasChanged.fire(); - } - private onToggled(collapsed: boolean, group: ISettingsGroup) { const index = this.hiddenGroups.indexOf(group); if (collapsed) { @@ -619,7 +606,7 @@ export class FeedbackWidgetRenderer extends Disposable { JSON.stringify(feedbackQuery, undefined, ' ') + '\n\n' + actualResultNames.map(name => `// ${name}: ${result.metadata.scoredResults[name]}`).join('\n'); - this.editorService.openEditor({ contents, language: 'json' }, /*sideBySide=*/true).then(feedbackEditor => { + this.editorService.openEditor({ contents, language: 'jsonc' }, /*sideBySide=*/true).then(feedbackEditor => { const sendFeedbackWidget = this._register(this.instantiationService.createInstance(FloatingClickWidget, feedbackEditor.getControl(), 'Send feedback', null)); sendFeedbackWidget.render(); diff --git a/src/vs/workbench/parts/preferences/browser/preferencesService.ts b/src/vs/workbench/parts/preferences/browser/preferencesService.ts index c1f56fe9e76e..3c3892467af9 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesService.ts @@ -111,7 +111,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic if (this.isDefaultSettingsResource(uri) || this.isDefaultResourceSettingsResource(uri)) { const scope = this.isDefaultSettingsResource(uri) ? ConfigurationScope.WINDOW : ConfigurationScope.RESOURCE; - const mode = this.modeService.getOrCreateMode('json'); + const mode = this.modeService.getOrCreateMode('jsonc'); const model = this._register(this.modelService.createModel('', mode, uri)); let defaultSettings: DefaultSettings; @@ -139,14 +139,14 @@ export class PreferencesService extends Disposable implements IPreferencesServic if (this.defaultSettingsRawResource.toString() === uri.toString()) { let defaultSettings: DefaultSettings = this.getDefaultSettings(ConfigurationScope.WINDOW); - const mode = this.modeService.getOrCreateMode('json'); + const mode = this.modeService.getOrCreateMode('jsonc'); const model = this._register(this.modelService.createModel(defaultSettings.raw, mode, uri)); return TPromise.as(model); } if (this.defaultKeybindingsResource.toString() === uri.toString()) { const defaultKeybindingsEditorModel = this.instantiationService.createInstance(DefaultKeybindingsEditorModel, uri); - const mode = this.modeService.getOrCreateMode('json'); + const mode = this.modeService.getOrCreateMode('jsonc'); const model = this._register(this.modelService.createModel(defaultKeybindingsEditorModel.content, mode, uri)); return TPromise.as(model); } diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index fb47a588bb17..347e93311035 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -12,7 +12,7 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Widget } from 'vs/base/browser/ui/widget'; import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; import Event, { Emitter } from 'vs/base/common/event'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IKeyboardEvent, StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, OverlayWidgetPositionPreference, IViewZone, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -24,16 +24,17 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IAction, Action } from 'vs/base/common/actions'; import { attachInputBoxStyler, attachStylerCallback, attachCheckboxStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder, errorForeground } from 'vs/platform/theme/common/colorRegistry'; +import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder, errorForeground, focusBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Separator, ActionBar, ActionsOrientation, BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IMarginData } from 'vs/editor/browser/controller/mouseTarget'; import { render as renderOcticons } from 'vs/base/browser/ui/octiconLabel/octiconLabel'; +import { PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER, PANEL_INACTIVE_TITLE_FOREGROUND } from 'vs/workbench/common/theme'; export class SettingsHeaderWidget extends Widget implements IViewZone { @@ -333,15 +334,26 @@ export class FolderSettingsActionItem extends BaseActionItem { this.anchorElement = DOM.$('a.action-label', { role: 'button', 'aria-haspopup': 'true', - // 'tabindex': '0' + 'tabindex': '0' }, this.labelElement, this.detailsElement, this.dropDownElement); this.disposables.push(DOM.addDisposableListener(this.anchorElement, DOM.EventType.CLICK, e => this.onClick(e))); + this.disposables.push(DOM.addDisposableListener(this.anchorElement, DOM.EventType.KEY_UP, e => this.onKeyUp(e))); DOM.append(this.container, this.anchorElement); this.update(); } + private onKeyUp(event: any): void { + const keyboardEvent = new StandardKeyboardEvent(event); + switch (keyboardEvent.keyCode) { + case KeyCode.Enter: + case KeyCode.Space: + this.onClick(event); + return; + } + } + public onClick(event: DOM.EventLike): void { DOM.EventHelper.stop(event, true); if (!this.folder || this._action.checked) { @@ -399,7 +411,10 @@ export class FolderSettingsActionItem extends BaseActionItem { this.contextMenuService.showContextMenu({ getAnchor: () => this.container, getActions: () => TPromise.as(this.getDropdownMenuActions()), - getActionItem: (action) => null + getActionItem: (action) => null, + onHide: () => { + this.anchorElement.blur(); + } }); } @@ -455,7 +470,7 @@ export class SettingsTargetsWidget extends Widget { private create(parent: HTMLElement): void { const settingsTabsWidget = DOM.append(parent, DOM.$('.settings-tabs-widget')); this.settingsSwitcherBar = this._register(new ActionBar(settingsTabsWidget, { - orientation: ActionsOrientation.HORIZONTAL_REVERSE, + orientation: ActionsOrientation.HORIZONTAL, ariaLabel: localize('settingsSwitcherBarAriaLabel', "Settings Switcher"), animated: false, actionItemProvider: (action: Action) => action.id === 'folderSettings' ? this.folderSettings : null @@ -472,7 +487,7 @@ export class SettingsTargetsWidget extends Widget { this.update(); - this.settingsSwitcherBar.push([folderSettingsAction, this.workspaceSettings, this.userSettings]); + this.settingsSwitcherBar.push([this.userSettings, this.workspaceSettings, folderSettingsAction]); } public get settingsTarget(): SettingsTarget { @@ -815,3 +830,72 @@ export class EditPreferenceWidget extends Disposable { super.dispose(); } } + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + + collector.addRule(` + .settings-tabs-widget > .monaco-action-bar .action-item .action-label:focus, + .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked { + border-bottom: 1px solid; + } + `); + // Title Active + const titleActive = theme.getColor(PANEL_ACTIVE_TITLE_FOREGROUND); + const titleActiveBorder = theme.getColor(PANEL_ACTIVE_TITLE_BORDER); + if (titleActive || titleActiveBorder) { + collector.addRule(` + .settings-tabs-widget > .monaco-action-bar .action-item .action-label:hover, + .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked { + color: ${titleActive}; + border-bottom-color: ${titleActiveBorder}; + } + `); + } + + // Title Inactive + const titleInactive = theme.getColor(PANEL_INACTIVE_TITLE_FOREGROUND); + if (titleInactive) { + collector.addRule(` + .settings-tabs-widget > .monaco-action-bar .action-item .action-label { + color: ${titleInactive}; + } + `); + } + + // Title focus + const focusBorderColor = theme.getColor(focusBorder); + if (focusBorderColor) { + collector.addRule(` + .settings-tabs-widget > .monaco-action-bar .action-item .action-label:focus { + border-bottom-color: ${focusBorderColor} !important; + } + `); + collector.addRule(` + .settings-tabs-widget > .monaco-action-bar .action-item .action-label:focus { + outline: none; + } + `); + } + + // Styling with Outline color (e.g. high contrast theme) + const outline = theme.getColor(activeContrastBorder); + if (outline) { + const outline = theme.getColor(activeContrastBorder); + + collector.addRule(` + .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked, + .settings-tabs-widget > .monaco-action-bar .action-item .action-label:hover { + outline-color: ${outline}; + outline-width: 1px; + outline-style: solid; + border-bottom: none; + padding-bottom: 0; + outline-offset: 3px; + } + + .settings-tabs-widget > .monaco-action-bar .action-item .action-label:not(.checked):hover { + outline-style: dashed; + } + `); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/common/preferences.ts b/src/vs/workbench/parts/preferences/common/preferences.ts index f46423135ee4..6407647bd2ce 100644 --- a/src/vs/workbench/parts/preferences/common/preferences.ts +++ b/src/vs/workbench/parts/preferences/common/preferences.ts @@ -86,13 +86,13 @@ export interface IPreferencesEditorModel { } export type IGroupFilter = (group: ISettingsGroup) => boolean; -export type ISettingFilter = (setting: ISetting) => IRange[]; +export type ISettingMatcher = (setting: ISetting) => IRange[]; export interface ISettingsEditorModel extends IPreferencesEditorModel { readonly onDidChangeGroups: Event; settingsGroups: ISettingsGroup[]; groupsTerms: string[]; - filterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter, mostRelevantSettings?: string[]): IFilterResult; + filterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher, mostRelevantSettings?: string[]): IFilterResult; findValueMatches(filter: string, setting: ISetting): IRange[]; } diff --git a/src/vs/workbench/parts/preferences/common/preferencesContribution.ts b/src/vs/workbench/parts/preferences/common/preferencesContribution.ts index c4caf066e466..9023b7663759 100644 --- a/src/vs/workbench/parts/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/parts/preferences/common/preferencesContribution.ts @@ -125,7 +125,7 @@ export class PreferencesContribution implements IWorkbenchContribution { let schema = schemaRegistry.getSchemaContributions().schemas[uri.toString()]; if (schema) { const modelContent = JSON.stringify(schema); - const mode = this.modeService.getOrCreateMode('json'); + const mode = this.modeService.getOrCreateMode('jsonc'); const model = this.modelService.createModel(modelContent, mode, uri); let disposables = []; diff --git a/src/vs/workbench/parts/preferences/common/preferencesModels.ts b/src/vs/workbench/parts/preferences/common/preferencesModels.ts index 5f372335aea4..d4ec0090dce6 100644 --- a/src/vs/workbench/parts/preferences/common/preferencesModels.ts +++ b/src/vs/workbench/parts/preferences/common/preferencesModels.ts @@ -14,14 +14,10 @@ import { visit, JSONVisitor } from 'vs/base/common/json'; import { IModel } from 'vs/editor/common/editorCommon'; import { EditorModel } from 'vs/workbench/common/editor'; import { IConfigurationNode, IConfigurationRegistry, Extensions, OVERRIDE_PROPERTY_PATTERN, IConfigurationPropertySchema, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { ISettingsEditorModel, IKeybindingsEditorModel, ISettingsGroup, ISetting, IFilterResult, ISettingsSection, IGroupFilter, ISettingFilter } from 'vs/workbench/parts/preferences/common/preferences'; +import { ISettingsEditorModel, IKeybindingsEditorModel, ISettingsGroup, ISetting, IFilterResult, ISettingsSection, IGroupFilter, ISettingMatcher } from 'vs/workbench/parts/preferences/common/preferences'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { ITextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; +import { ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { ITextFileService, StateChange } from 'vs/workbench/services/textfile/common/textfiles'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { Queue } from 'vs/base/common/async'; -import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; export abstract class AbstractSettingsModel extends EditorModel { @@ -30,7 +26,7 @@ export abstract class AbstractSettingsModel extends EditorModel { return this.settingsGroups.map(group => '@' + group.id); } - protected doFilterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter): IFilterResult { + protected doFilterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher): IFilterResult { const allGroups = this.settingsGroups; if (!filter) { @@ -60,7 +56,7 @@ export abstract class AbstractSettingsModel extends EditorModel { for (const section of group.sections) { const settings: ISetting[] = []; for (const setting of section.settings) { - const settingMatches = settingFilter(setting); + const settingMatches = settingMatcher(setting); if (groupMatched || settingMatches && settingMatches.length) { settings.push(setting); } @@ -120,12 +116,11 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti private _settingsGroups: ISettingsGroup[]; protected settingsModel: IModel; - private queue: Queue; private _onDidChangeGroups: Emitter = this._register(new Emitter()); readonly onDidChangeGroups: Event = this._onDidChangeGroups.event; - constructor(reference: IReference, private _configurationTarget: ConfigurationTarget, @ITextFileService protected textFileService: ITextFileService) { + constructor(reference: IReference, private _configurationTarget: ConfigurationTarget) { super(); this.settingsModel = reference.object.textEditorModel; this._register(this.onDispose(() => reference.dispose())); @@ -133,7 +128,6 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti this._settingsGroups = null; this._onDidChangeGroups.fire(); })); - this.queue = new Queue(); } public get uri(): URI { @@ -155,26 +149,18 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti return this.settingsModel.getValue(); } - public filterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter): IFilterResult { - return this.doFilterSettings(filter, groupFilter, settingFilter); + public filterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher): IFilterResult { + return this.doFilterSettings(filter, groupFilter, settingMatcher); } public findValueMatches(filter: string, setting: ISetting): IRange[] { return this.settingsModel.findMatches(filter, setting.valueRange, false, false, null, false).map(match => match.range); } - public save(): TPromise { - return this.queue.queue(() => this.doSave()); - } - protected isSettingsProperty(property: string, previousParents: string[]): boolean { return previousParents.length === 0; // Settings is root } - protected doSave(): TPromise { - return this.textFileService.save(this.uri); - } - protected parse(): void { this._settingsGroups = parse(this.settingsModel, (property: string, previousParents: string[]): boolean => this.isSettingsProperty(property, previousParents)); } @@ -367,144 +353,6 @@ export class WorkspaceConfigurationEditorModel extends SettingsEditorModel { } -export class WorkspaceConfigModel extends SettingsEditorModel implements ISettingsEditorModel { - - private workspaceConfigModel: IModel; - private workspaceConfigEtag: string; - - constructor( - reference: IReference, - workspaceConfigModelReference: IReference, - _configurationTarget: ConfigurationTarget, - onDispose: Event, - @IFileService private fileService: IFileService, - @ITextModelService textModelResolverService: ITextModelService, - @ITextFileService textFileService: ITextFileService - ) { - super(reference, _configurationTarget, textFileService); - - this._register(workspaceConfigModelReference); - this.workspaceConfigModel = workspaceConfigModelReference.object.textEditorModel; - - // Only listen to state changes. Content changes without saving are not synced. - this._register(this.textFileService.models.get(this.workspaceConfigModel.uri).onDidStateChange(statChange => this._onWorkspaceConfigFileStateChanged(statChange))); - this.onDispose(() => super.dispose()); - } - - protected doSave(): TPromise { - if (this.textFileService.isDirty(this.workspaceConfigModel.uri)) { - // Throw an error? - return TPromise.as(null); - } - - const content = this.createWorkspaceConfigContentFromSettingsModel(); - if (content !== this.workspaceConfigModel.getValue()) { - return this.fileService.updateContent(this.workspaceConfigModel.uri, content) - .then(stat => this.workspaceConfigEtag = stat.etag); - } - - return TPromise.as(null); - } - - private createWorkspaceConfigContentFromSettingsModel(): string { - const workspaceConfigContent = this.workspaceConfigModel.getValue(); - const { settingsPropertyEndsAt, nodeAfterSettingStartsAt } = WorkspaceConfigModel.parseWorkspaceConfigContent(workspaceConfigContent); - const workspaceConfigEndsAt = workspaceConfigContent.lastIndexOf('}'); - - // Settings property exist in Workspace Configuration and has Ending Brace - if (settingsPropertyEndsAt !== -1 && workspaceConfigEndsAt > settingsPropertyEndsAt) { - - // Place settings at the end - let from = workspaceConfigContent.indexOf(':', settingsPropertyEndsAt) + 1; - let to = workspaceConfigEndsAt; - let settingsContent = this.settingsModel.getValue(); - - // There is a node after settings property - // Place settings before that node - if (nodeAfterSettingStartsAt !== -1) { - settingsContent += ','; - to = nodeAfterSettingStartsAt; - } - - return workspaceConfigContent.substring(0, from) + settingsContent + workspaceConfigContent.substring(to); - } - - // Settings property does not exist. Place it at the end - return workspaceConfigContent.substring(0, workspaceConfigEndsAt) + `,\n"settings": ${this.settingsModel.getValue()}\n` + workspaceConfigContent.substring(workspaceConfigEndsAt); - } - - private _onWorkspaceConfigFileStateChanged(stateChange: StateChange): void { - let hasToUpdate = false; - switch (stateChange) { - case StateChange.SAVED: - hasToUpdate = this.workspaceConfigEtag !== this.textFileService.models.get(this.workspaceConfigModel.uri).getETag(); - break; - } - if (hasToUpdate) { - this.onWorkspaceConfigFileContentChanged(); - } - } - - private onWorkspaceConfigFileContentChanged(): void { - this.workspaceConfigEtag = this.textFileService.models.get(this.workspaceConfigModel.uri).getETag(); - const settingsValue = WorkspaceConfigModel.getSettingsContentFromConfigContent(this.workspaceConfigModel.getValue()); - if (settingsValue) { - this.settingsModel.setValue(settingsValue); - } - } - - dispose() { - // Not disposable by default - } - - static getSettingsContentFromConfigContent(workspaceConfigContent: string): string { - const { settingsPropertyEndsAt, nodeAfterSettingStartsAt } = WorkspaceConfigModel.parseWorkspaceConfigContent(workspaceConfigContent); - - const workspaceConfigEndsAt = workspaceConfigContent.lastIndexOf('}'); - - if (settingsPropertyEndsAt !== -1) { - const from = workspaceConfigContent.indexOf(':', settingsPropertyEndsAt) + 1; - const to = nodeAfterSettingStartsAt !== -1 ? nodeAfterSettingStartsAt : workspaceConfigEndsAt; - return workspaceConfigContent.substring(from, to); - } - - return null; - } - - static parseWorkspaceConfigContent(content: string): { settingsPropertyEndsAt: number, nodeAfterSettingStartsAt: number } { - - let settingsPropertyEndsAt = -1; - let nodeAfterSettingStartsAt = -1; - - let rootProperties: string[] = []; - let ancestors: string[] = []; - let currentProperty = ''; - - visit(content, { - onObjectProperty: (name: string, offset: number, length: number) => { - currentProperty = name; - if (ancestors.length === 1) { - rootProperties.push(name); - if (rootProperties[rootProperties.length - 1] === 'settings') { - settingsPropertyEndsAt = offset + length; - } - if (rootProperties[rootProperties.length - 2] === 'settings') { - nodeAfterSettingStartsAt = offset; - } - } - }, - onObjectBegin: (offset: number, length: number) => { - ancestors.push(currentProperty); - }, - onObjectEnd: (offset: number, length: number) => { - ancestors.pop(); - } - }, { allowTrailingComma: true }); - - return { settingsPropertyEndsAt, nodeAfterSettingStartsAt }; - } -} - export class DefaultSettings extends Disposable { private static _RAW: string; @@ -542,24 +390,13 @@ export class DefaultSettings extends Disposable { this.initAllSettingsMap(settingsGroups); const mostCommonlyUsed = this.getMostCommonlyUsedSettings(settingsGroups); this._allSettingsGroups = [mostCommonlyUsed, ...settingsGroups]; - - const builder = new SettingsContentBuilder(); - builder.pushLine('['); - builder.pushGroups([mostCommonlyUsed]); - builder.pushLine(','); - builder.pushGroups(settingsGroups); - builder.pushLine(']'); - this._content = builder.getContent(); - + this._content = this.toContent(true, [mostCommonlyUsed], settingsGroups); return this._content; } get raw(): string { if (!DefaultSettings._RAW) { - const settingsGroups = this.getRegisteredGroups(); - const builder = new SettingsContentBuilder(); - builder.pushGroups(settingsGroups); - DefaultSettings._RAW = builder.getContent(); + DefaultSettings._RAW = this.toContent(false, this.getRegisteredGroups()); } return DefaultSettings._RAW; } @@ -697,6 +534,24 @@ export class DefaultSettings extends Disposable { return c1.order - c2.order; } + private toContent(asArray: boolean, ...settingsGroups: ISettingsGroup[][]): string { + const builder = new SettingsContentBuilder(); + if (asArray) { + builder.pushLine('['); + } + settingsGroups.forEach((settingsGroup, i) => { + builder.pushGroups(settingsGroup); + + if (i !== settingsGroups.length - 1) { + builder.pushLine(','); + } + }); + if (asArray) { + builder.pushLine(']'); + } + return builder.getContent(); + } + } export class DefaultSettingsEditorModel extends AbstractSettingsModel implements ISettingsEditorModel { @@ -730,20 +585,25 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements return this.defaultSettings.settingsGroups; } - public filterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter, mostRelevantSettings?: string[]): IFilterResult { + public filterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher, mostRelevantSettings?: string[]): IFilterResult { if (mostRelevantSettings) { const mostRelevantGroup = this.renderMostRelevantSettings(mostRelevantSettings); + // calculate match ranges + const matches = mostRelevantGroup.sections[0].settings.reduce((prev, s) => { + return prev.concat(settingMatcher(s)); + }, []); + return { allGroups: [...this.settingsGroups, mostRelevantGroup], filteredGroups: mostRelevantGroup.sections[0].settings.length ? [mostRelevantGroup] : [], - matches: [], + matches, query: filter }; } else { // Do local search and add empty 'most relevant' group const mostRelevantGroup = this.renderMostRelevantSettings([]); - const result = this.doFilterSettings(filter, groupFilter, settingFilter); + const result = this.doFilterSettings(filter, groupFilter, settingMatcher); result.allGroups = [...result.allGroups, mostRelevantGroup]; return result; } diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts index 37a3f7e5e1c7..149102c0a878 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts @@ -6,8 +6,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as errors from 'vs/base/common/errors'; import Event, { Emitter } from 'vs/base/common/event'; -import { ISettingsEditorModel, IFilterResult, ISetting, ISettingsGroup, IWorkbenchSettingsConfiguration, IFilterMetadata, IPreferencesSearchService } from 'vs/workbench/parts/preferences/common/preferences'; -import { IRange, Range } from 'vs/editor/common/core/range'; +import { ISettingsEditorModel, IFilterResult, ISetting, ISettingsGroup, IWorkbenchSettingsConfiguration, IFilterMetadata, IPreferencesSearchService, IPreferencesSearchModel } from 'vs/workbench/parts/preferences/common/preferences'; +import { IRange } from 'vs/editor/common/core/range'; import { distinct } from 'vs/base/common/arrays'; import * as strings from 'vs/base/common/strings'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; @@ -74,7 +74,7 @@ export class PreferencesSearchService extends Disposable implements IPreferences } } -export class PreferencesSearchModel { +export class PreferencesSearchModel implements IPreferencesSearchModel { private _localProvider: LocalSearchProvider; private _remoteProvider: RemoteSearchProvider; @@ -128,11 +128,11 @@ class LocalSearchProvider { return regex.test(group.title); }; - const settingFilter = (setting: ISetting) => { - return new SettingMatches(this._filter, setting, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches; + const settingMatcher = (setting: ISetting) => { + return new SettingMatches(this._filter, setting, true, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches; }; - return TPromise.wrap(preferencesModel.filterSettings(this._filter, groupFilter, settingFilter)); + return TPromise.wrap(preferencesModel.filterSettings(this._filter, groupFilter, settingMatcher)); } } @@ -150,19 +150,6 @@ class RemoteSearchProvider { filterPreferences(preferencesModel: ISettingsEditorModel): TPromise { return this._remoteSearchP.then(remoteResult => { - const settingFilter = (setting: ISetting) => { - if (!!remoteResult.scoredResults[setting.key]) { - const settingMatches = new SettingMatches(this._filter, setting, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches; - if (settingMatches.length) { - return settingMatches; - } else { - return [new Range(setting.keyRange.startLineNumber, setting.keyRange.startColumn, setting.keyRange.endLineNumber, setting.keyRange.startColumn)]; - } - } else { - return null; - } - }; - if (remoteResult) { let sortedNames = Object.keys(remoteResult.scoredResults).sort((a, b) => remoteResult.scoredResults[b] - remoteResult.scoredResults[a]); if (sortedNames.length) { @@ -170,7 +157,8 @@ class RemoteSearchProvider { sortedNames = sortedNames.filter(name => remoteResult.scoredResults[name] >= highScore / 2); } - const result = preferencesModel.filterSettings(this._filter, group => null, settingFilter, sortedNames); + const settingMatcher = this.getRemoteSettingMatcher(sortedNames, preferencesModel); + const result = preferencesModel.filterSettings(this._filter, group => null, settingMatcher, sortedNames); result.metadata = remoteResult; return result; } else { @@ -189,7 +177,7 @@ class RemoteSearchProvider { 'Content-Type': 'application/json; charset=utf-8', 'api-key': endpoint.key }, - timeout: 4000 + timeout: 5000 }) .then(context => { if (context.res.statusCode >= 300) { @@ -226,6 +214,22 @@ class RemoteSearchProvider { return TPromise.as(p as any); } + + private getRemoteSettingMatcher(names: string[], preferencesModel: ISettingsEditorModel): any { + const resultSet = new Set(); + names.forEach(name => resultSet.add(name)); + + return (setting: ISetting) => { + if (resultSet.has(setting.key)) { + const settingMatches = new SettingMatches(this._filter, setting, false, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches; + if (settingMatches.length) { + return settingMatches; + } + } + + return []; + }; + } } const API_VERSION = 'api-version=2016-09-01-Preview'; @@ -243,11 +247,11 @@ function prepareUrl(query: string, endpoint: IEndpointDetails, buildNumber: numb query = escapeSpecialChars(query); const boost = 10; const userQuery = `(${query})^${boost}`; - const encodedQuery = encodeURIComponent(userQuery + ' || ' + query); // Appending Fuzzy after each word. query = query.replace(/\ +/g, '~ ') + '~'; + const encodedQuery = encodeURIComponent(userQuery + ' || ' + query); let url = `${endpoint.urlBase}?`; if (endpoint.key) { url += `search=${encodedQuery}`; @@ -275,7 +279,7 @@ class SettingMatches { public readonly matches: IRange[]; - constructor(searchString: string, setting: ISetting, private valuesMatcher: (filter: string, setting: ISetting) => IRange[]) { + constructor(searchString: string, setting: ISetting, private requireFullQueryMatch: boolean, private valuesMatcher: (filter: string, setting: ISetting) => IRange[]) { this.matches = distinct(this._findMatchesInSetting(searchString, setting), (match) => `${match.startLineNumber}_${match.startColumn}_${match.endLineNumber}_${match.endColumn}_`); } @@ -283,7 +287,7 @@ class SettingMatches { const result = this._doFindMatchesInSetting(searchString, setting); if (setting.overrides && setting.overrides.length) { for (const subSetting of setting.overrides) { - const subSettingMatches = new SettingMatches(searchString, subSetting, this.valuesMatcher); + const subSettingMatches = new SettingMatches(searchString, subSetting, this.requireFullQueryMatch, this.valuesMatcher); let words = searchString.split(' '); const descriptionRanges: IRange[] = this.getRangesForWords(words, this.descriptionMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]); const keyRanges: IRange[] = this.getRangesForWords(words, this.keyMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]); @@ -353,7 +357,7 @@ class SettingMatches { const ranges = from.get(word); if (ranges) { result.push(...ranges); - } else if (others.every(o => !o.has(word))) { + } else if (this.requireFullQueryMatch && others.every(o => !o.has(word))) { return []; } } diff --git a/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts b/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts index 297669a92db5..1187e04bc01b 100644 --- a/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts @@ -10,7 +10,6 @@ import types = require('vs/base/common/types'); import errors = require('vs/base/common/errors'); import { IEntryRunContext, Mode, IAutoFocus } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import { KeyMod } from 'vs/base/common/keyCodes'; import { QuickOpenHandler, EditorQuickOpenEntry, QuickOpenAction } from 'vs/workbench/browser/quickopen'; import { IEditor, IModelDecorationsChangeAccessor, OverviewRulerLane, IModelDeltaDecoration, IEditorViewState, ITextModel, IDiffEditorModel, ScrollType } from 'vs/editor/common/editorCommon'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -131,9 +130,10 @@ class GotoLineEntry extends EditorQuickOpenEntry { return this.editorService.getActiveEditorInput(); } - public getOptions(): ITextEditorOptions { + public getOptions(pinned?: boolean): ITextEditorOptions { return { - selection: this.toSelection() + selection: this.toSelection(), + pinned }; } @@ -145,9 +145,9 @@ class GotoLineEntry extends EditorQuickOpenEntry { } // Check for sideBySide use - const sideBySide = context.keymods.indexOf(KeyMod.CtrlCmd) >= 0; + const sideBySide = context.keymods.ctrlCmd; if (sideBySide) { - this.editorService.openEditor(this.getInput(), this.getOptions(), true).done(null, errors.onUnexpectedError); + this.editorService.openEditor(this.getInput(), this.getOptions(context.keymods.alt), true).done(null, errors.onUnexpectedError); } // Apply selection and focus diff --git a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts b/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts index d451792268d0..e83194a9110e 100644 --- a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts @@ -15,7 +15,6 @@ import { IEntryRunContext, Mode, IAutoFocus } from 'vs/base/parts/quickopen/comm import { QuickOpenModel, IHighlight } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenHandler, EditorQuickOpenEntryGroup, QuickOpenAction } from 'vs/workbench/browser/quickopen'; import filters = require('vs/base/common/filters'); -import { KeyMod } from 'vs/base/common/keyCodes'; import { IEditor, IModelDecorationsChangeAccessor, OverviewRulerLane, IModelDeltaDecoration, IModel, ITokenizedModel, IDiffEditorModel, IEditorViewState, ScrollType } from 'vs/editor/common/editorCommon'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; @@ -294,9 +293,10 @@ class SymbolEntry extends EditorQuickOpenEntryGroup { return this.editorService.getActiveEditorInput(); } - public getOptions(): ITextEditorOptions { + public getOptions(pinned?: boolean): ITextEditorOptions { return { - selection: this.toSelection() + selection: this.toSelection(), + pinned }; } @@ -311,9 +311,9 @@ class SymbolEntry extends EditorQuickOpenEntryGroup { private runOpen(context: IEntryRunContext): boolean { // Check for sideBySide use - const sideBySide = context.keymods.indexOf(KeyMod.CtrlCmd) >= 0; + const sideBySide = context.keymods.ctrlCmd; if (sideBySide) { - this.editorService.openEditor(this.getInput(), this.getOptions(), true).done(null, errors.onUnexpectedError); + this.editorService.openEditor(this.getInput(), this.getOptions(context.keymods.alt), true).done(null, errors.onUnexpectedError); } // Apply selection and focus diff --git a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts index 7d9233b0532f..0c923fea0fb4 100644 --- a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts +++ b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts @@ -138,7 +138,7 @@ export class SettingsChangeRelauncher implements IWorkbenchContribution { private doConfirm(message: string, detail: string, primaryButton: string, confirmed: () => void): void { this.windowService.isFocused().then(focused => { if (focused) { - const confirm = this.messageService.confirmSync({ + const confirm = this.messageService.confirm({ type: 'info', message, detail, diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index 102032dc0fe1..154be590d963 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -19,6 +19,7 @@ import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import URI from 'vs/base/common/uri'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; @@ -197,7 +198,7 @@ class DirtyDiffWidget extends PeekViewWidget { @IMessageService private messageService: IMessageService, @IContextKeyService contextKeyService: IContextKeyService ) { - super(editor, { isResizeable: true, frameWidth: 1 }); + super(editor, { isResizeable: true, frameWidth: 1, keepEditorSelection: true }); themeService.onThemeChange(this._applyTheme, this, this._disposables); this._applyTheme(themeService.getTheme()); @@ -243,7 +244,7 @@ class DirtyDiffWidget extends PeekViewWidget { const changeType = getChangeType(change); const changeTypeColor = getChangeTypeColor(this.themeService.getTheme(), changeType); - this.style({ frameColor: changeTypeColor }); + this.style({ frameColor: changeTypeColor, arrowColor: changeTypeColor }); this._actionbarWidget.context = [this.model.modified.uri, this.model.changes, index]; this.show(position, height); @@ -999,23 +1000,59 @@ class DirtyDiffItem { export class DirtyDiffWorkbenchController implements ext.IWorkbenchContribution, IModelRegistry { + private enabled = false; private models: IModel[] = []; private items: { [modelId: string]: DirtyDiffItem; } = Object.create(null); + private transientDisposables: IDisposable[] = []; private disposables: IDisposable[] = []; constructor( @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IEditorGroupService editorGroupService: IEditorGroupService, - @IInstantiationService private instantiationService: IInstantiationService + @IEditorGroupService private editorGroupService: IEditorGroupService, + @IInstantiationService private instantiationService: IInstantiationService, + @IConfigurationService private configurationService: IConfigurationService ) { - this.disposables.push(editorGroupService.onEditorsChanged(() => this.onEditorsChanged())); + const onDidChangeEnablement = filterEvent(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.enableDiffDecorations')); + onDidChangeEnablement(this.onDidChangeEnablement, this, this.disposables); + this.onDidChangeEnablement(); } - private onEditorsChanged(): void { - // HACK: This is the best current way of figuring out whether to draw these decorations - // or not. Needs context from the editor, to know whether it is a diff editor, in place editor - // etc. + private onDidChangeEnablement(): void { + const enabled = this.configurationService.getValue('scm.enableDiffDecorations'); + if (enabled) { + this.enable(); + } else { + this.disable(); + } + } + + private enable(): void { + if (this.enabled) { + return; + } + + this.transientDisposables.push(this.editorGroupService.onEditorsChanged(() => this.onEditorsChanged())); + this.onEditorsChanged(); + this.enabled = true; + } + + private disable(): void { + if (!this.enabled) { + return; + } + + this.transientDisposables = dispose(this.transientDisposables); + this.models.forEach(m => this.items[m.id].dispose()); + this.models = []; + this.items = Object.create(null); + this.enabled = false; + } + + // HACK: This is the best current way of figuring out whether to draw these decorations + // or not. Needs context from the editor, to know whether it is a diff editor, in place editor + // etc. + private onEditorsChanged(): void { const models = this.editorService.getVisibleEditors() // map to the editor controls @@ -1067,11 +1104,8 @@ export class DirtyDiffWorkbenchController implements ext.IWorkbenchContribution, } dispose(): void { + this.disable(); this.disposables = dispose(this.disposables); - this.models.forEach(m => this.items[m.id].dispose()); - - this.models = null; - this.items = null; } } diff --git a/src/vs/workbench/parts/scm/electron-browser/media/scmViewlet.css b/src/vs/workbench/parts/scm/electron-browser/media/scmViewlet.css index ff68aea9db11..fa1b724f9fc9 100644 --- a/src/vs/workbench/parts/scm/electron-browser/media/scmViewlet.css +++ b/src/vs/workbench/parts/scm/electron-browser/media/scmViewlet.css @@ -33,8 +33,13 @@ flex-wrap: wrap; } -.scm-viewlet .monaco-list-row > .scm-provider > input { - flex-shrink: 0; +.scm-viewlet .monaco-list-row > .scm-provider > .monaco-action-bar { + flex: 1; +} + +.scm-viewlet .monaco-list-row > .scm-provider > .monaco-action-bar .action-item { + overflow: hidden; + text-overflow: ellipsis; } .scm-viewlet .scm-provider > .count { @@ -150,7 +155,3 @@ .scm-viewlet .scm-editor.scroll > .monaco-inputbox > .wrapper > textarea.input { overflow-y: scroll; } - -.scm-viewlet .spacer { - flex: 1; -} diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index 2dc55faba6de..fcbe4f68f73f 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -19,6 +19,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { StatusUpdater, StatusBarController } from './scmActivity'; import { SCMViewlet } from 'vs/workbench/parts/scm/electron-browser/scmViewlet'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; class OpenSCMViewletAction extends ToggleViewletAction { @@ -61,3 +62,16 @@ Registry.as(WorkbenchActionExtensions.WorkbenchActions 'View: Show SCM', localize('view', "View") ); + +Registry.as(ConfigurationExtensions.Configuration).registerConfiguration({ + id: 'scm', + order: 5, + type: 'object', + properties: { + 'scm.enableDiffDecorations': { + 'type': 'boolean', + 'default': true, + 'description': localize('enableDiffDecorations', "Enables or disables diff decorations in the editor.") + }, + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 835eb0269ff6..4530cff6727f 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -31,7 +31,6 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IMessageService } from 'vs/platform/message/common/message'; -import { IListService } from 'vs/platform/list/browser/listService'; import { MenuItemAction, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IAction, Action, IActionItem, ActionRunner } from 'vs/base/common/actions'; import { MenuItemActionItem, fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; @@ -39,7 +38,7 @@ import { SCMMenus } from './scmMenus'; import { ActionBar, IActionItemProvider, Separator, ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; import { isSCMResource } from './scmUtil'; -import { attachListStyler, attachBadgeStyler, attachInputBoxStyler } from 'vs/platform/theme/common/styler'; +import { attachBadgeStyler, attachInputBoxStyler } from 'vs/platform/theme/common/styler'; import Severity from 'vs/base/common/severity'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -56,6 +55,7 @@ import * as platform from 'vs/base/common/platform'; import { format } from 'vs/base/common/strings'; import { ISpliceable, ISequence, ISplice } from 'vs/base/common/sequence'; import { firstIndex } from 'vs/base/common/arrays'; +import { WorkbenchList, IListService } from 'vs/platform/list/browser/listService'; // TODO@Joao // Need to subclass MenuItemActionItem in order to respect @@ -82,6 +82,10 @@ export interface IViewModel { readonly repositories: ISCMRepository[]; readonly selectedRepositories: ISCMRepository[]; readonly onDidSplice: Event>; + + isVisible(): boolean; + readonly onDidChangeVisibility: Event; + hide(repository: ISCMRepository): void; } @@ -149,9 +153,6 @@ class ProviderRenderer implements IRenderer new StatusBarActionItem(a as StatusBarAction) }); @@ -212,7 +213,9 @@ class ProviderRenderer implements IRenderer; + private visibilityDisposables: IDisposable[] = []; + private previousSelection: ISCMRepository[] | undefined = undefined; private _onSelectionChange = new Emitter(); readonly onSelectionChange: Event = this._onSelectionChange.event; @@ -224,6 +227,7 @@ class MainPanel extends ViewletPanel { @IInstantiationService private instantiationService: IInstantiationService, @IThemeService private themeService: IThemeService, @IContextKeyService private contextKeyService: IContextKeyService, + @IListService private listService: IListService, @IMenuService private menuService: IMenuService ) { super(localize('scm providers', "Source Control Providers"), {}, keybindingService, contextMenuService); @@ -251,6 +255,32 @@ class MainPanel extends ViewletPanel { return this.list.getSelectedElements(); } + protected renderBody(container: HTMLElement): void { + const delegate = new ProvidersListDelegate(); + const renderer = this.instantiationService.createInstance(ProviderRenderer); + + this.list = new WorkbenchList(container, delegate, [renderer], { + identityProvider: repository => repository.provider.id + }, this.contextKeyService, this.listService, this.themeService); + + this.disposables.push(this.list); + this.list.onSelectionChange(this.onListSelectionChange, this, this.disposables); + this.list.onContextMenu(this.onListContextMenu, this, this.disposables); + + this.viewModel.onDidChangeVisibility(this.onDidChangeVisibility, this, this.disposables); + this.onDidChangeVisibility(this.viewModel.isVisible()); + } + + private onDidChangeVisibility(visible: boolean): void { + if (visible) { + this.viewModel.onDidSplice(({ index, deleteCount, elements }) => this.splice(index, deleteCount, elements), null, this.visibilityDisposables); + this.splice(0, 0, this.viewModel.repositories); + } else { + this.visibilityDisposables = dispose(this.visibilityDisposables); + this.splice(0, this.list.length); + } + } + private splice(index: number, deleteCount: number, repositories: ISCMRepository[] = []): void { const wasEmpty = this.list.length === 0; @@ -259,27 +289,10 @@ class MainPanel extends ViewletPanel { // Automatically select the first one if (wasEmpty && this.list.length > 0) { - this.list.setSelection([0]); + this.restoreSelection(); } } - protected renderBody(container: HTMLElement): void { - const delegate = new ProvidersListDelegate(); - const renderer = this.instantiationService.createInstance(ProviderRenderer); - - this.list = new List(container, delegate, [renderer], { - identityProvider: repository => repository.provider.id - }); - - this.disposables.push(this.list); - this.disposables.push(attachListStyler(this.list, this.themeService)); - this.list.onSelectionChange(this.onListSelectionChange, this, this.disposables); - this.list.onContextMenu(this.onListContextMenu, this, this.disposables); - - this.viewModel.onDidSplice(({ index, deleteCount, elements }) => this.splice(index, deleteCount, elements), null, this.disposables); - this.splice(0, 0, this.viewModel.repositories); - } - protected layoutBody(size: number): void { this.list.layout(size); } @@ -328,12 +341,32 @@ class MainPanel extends ViewletPanel { private onListSelectionChange(e: IListEvent): void { // select one repository if the selected one is gone if (e.elements.length === 0 && this.list.length > 0) { - this.list.setSelection([0]); + this.restoreSelection(); return; } + if (e.elements.length > 0) { + this.previousSelection = e.elements; + } + this._onSelectionChange.fire(e.elements); } + + private restoreSelection(): void { + let selection: number[]; + + if (this.previousSelection) { + selection = this.previousSelection + .map(r => this.viewModel.repositories.indexOf(r)) + .filter(i => i > -1); + } + + if (!selection || selection.length === 0) { + selection = [0]; + } + + this.list.setSelection(selection); + } } interface ResourceGroupTemplate { @@ -634,6 +667,7 @@ class ResourceGroupSplicer { } dispose(): void { + this.onDidSpliceGroups({ start: 0, deleteCount: this.items.length, toInsert: [] }); this.disposables = dispose(this.disposables); } } @@ -646,6 +680,7 @@ export class RepositoryPanel extends ViewletPanel { private listContainer: HTMLElement; private list: List; private menus: SCMMenus; + private visibilityDisposables: IDisposable[] = []; constructor( readonly repository: ISCMRepository, @@ -659,6 +694,7 @@ export class RepositoryPanel extends ViewletPanel { @IMessageService protected messageService: IMessageService, @IWorkbenchEditorService protected editorService: IWorkbenchEditorService, @IEditorGroupService protected editorGroupService: IEditorGroupService, + @IContextKeyService protected contextKeyService: IContextKeyService, @IInstantiationService protected instantiationService: IInstantiationService ) { super(repository.provider.label, {}, keybindingService, contextMenuService); @@ -753,13 +789,10 @@ export class RepositoryPanel extends ViewletPanel { this.instantiationService.createInstance(ResourceRenderer, this.menus, actionItemProvider, () => this.getSelectedResources()), ]; - this.list = new List(this.listContainer, delegate, renderers, { + this.list = new WorkbenchList(this.listContainer, delegate, renderers, { identityProvider: scmResourceIdentityProvider, keyboardSupport: false - }); - - this.disposables.push(attachListStyler(this.list, this.themeService)); - this.disposables.push(this.listService.register(this.list)); + }, this.contextKeyService, this.listService, this.themeService); chain(this.list.onOpen) .map(e => e.elements[0]) @@ -774,8 +807,17 @@ export class RepositoryPanel extends ViewletPanel { this.list.onContextMenu(this.onListContextMenu, this, this.disposables); this.disposables.push(this.list); - const listSplicer = new ResourceGroupSplicer(this.repository.provider.groups, this.list); - this.disposables.push(listSplicer); + this.viewModel.onDidChangeVisibility(this.onDidChangeVisibility, this, this.disposables); + this.onDidChangeVisibility(this.viewModel.isVisible()); + } + + private onDidChangeVisibility(visible: boolean): void { + if (visible) { + const listSplicer = new ResourceGroupSplicer(this.repository.provider.groups, this.list); + this.visibilityDisposables.push(listSplicer); + } else { + this.visibilityDisposables = dispose(this.visibilityDisposables); + } } layoutBody(height: number = this.cachedHeight): void { @@ -783,7 +825,6 @@ export class RepositoryPanel extends ViewletPanel { return; } - this.list.layout(height); this.cachedHeight = height; this.inputBox.layout(); @@ -882,7 +923,7 @@ export class RepositoryPanel extends ViewletPanel { } dispose(): void { - this.disposables = dispose(this.disposables); + this.visibilityDisposables = dispose(this.visibilityDisposables); super.dispose(); } } @@ -915,6 +956,9 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { private _onDidSplice = new Emitter>(); readonly onDidSplice: Event> = this._onDidSplice.event; + private _onDidChangeVisibility = new Emitter(); + readonly onDidChangeVisibility: Event = this._onDidChangeVisibility.event; + private _height: number | undefined = undefined; get height(): number | undefined { return this._height; } @@ -929,7 +973,6 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { @IContextKeyService contextKeyService: IContextKeyService, @IKeybindingService protected keybindingService: IKeybindingService, @IMessageService protected messageService: IMessageService, - @IListService protected listService: IListService, @IContextMenuService contextMenuService: IContextMenuService, @IThemeService protected themeService: IThemeService, @ICommandService protected commandService: ICommandService, @@ -1014,6 +1057,12 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { } } + setVisible(visible: boolean): TPromise { + const result = super.setVisible(visible); + this._onDidChangeVisibility.fire(visible); + return result; + } + getOptimalWidth(): number { return 400; } diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts index c7ac091d433f..7827ddfed6ac 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts @@ -6,7 +6,6 @@ 'use strict'; import * as arrays from 'vs/base/common/arrays'; -import * as objects from 'vs/base/common/objects'; import { TPromise } from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import { ThrottledDelayer } from 'vs/base/common/async'; @@ -18,8 +17,6 @@ import { FileEntry, OpenFileHandler, FileQuickOpenModel } from 'vs/workbench/par import * as openSymbolHandler from 'vs/workbench/parts/search/browser/openSymbolHandler'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ISearchStats, ICachedSearchStats, IUncachedSearchStats } from 'vs/platform/search/common/search'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkbenchSearchConfiguration } from 'vs/workbench/parts/search/common/search'; import { IRange } from 'vs/editor/common/core/range'; @@ -27,88 +24,11 @@ import { compareItemsByScore, scoreItem, ScorerCache, prepareQuery } from 'vs/ba export import OpenSymbolHandler = openSymbolHandler.OpenSymbolHandler; // OpenSymbolHandler is used from an extension and must be in the main bundle file so it can load -const objects_assign: (destination: T, source: U) => T & U = objects.assign; - interface ISearchWithRange { search: string; range: IRange; } -/* __GDPR__FRAGMENT__ - "ITimerEventData" : { - "searchLength" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "unsortedResultDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "sortedResultDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "resultCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "symbols.fromCache": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.fromCache": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.unsortedResultDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.sortedResultDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.resultCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.traversal": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.errors": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.fileWalkStartDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.fileWalkResultDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.directoriesWalked": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.filesWalked": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.cmdForkStartTime": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.cmdForkResultTime": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.cmdResultCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.cacheLookupStartDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.cacheFilterStartDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.cacheLookupResultDuration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "files.cacheEntryCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "${wildcard}": [ - { - "${prefix}": "files.joined", - "${classification}": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } - } - ] - } -*/ -interface ITimerEventData { - searchLength: number; - unsortedResultDuration: number; - sortedResultDuration: number; - resultCount: number; - symbols: { - fromCache: boolean; - }; - files: { - fromCache: boolean; - unsortedResultDuration: number; - sortedResultDuration: number; - resultCount: number; - } & ({ - traversal: string; - errors: string[]; - fileWalkStartDuration: number; - fileWalkResultDuration: number; - directoriesWalked: number; - filesWalked: number; - cmdForkStartTime?: number; - cmdForkResultTime?: number; - cmdResultCount?: number; - } | { - cacheLookupStartDuration: number; - cacheFilterStartDuration: number; - cacheLookupResultDuration: number; - cacheEntryCount: number; - joined?: any; - }); -} - -interface ITelemetryData { - searchLength: number; - unsortedResultTime: number; - sortedResultTime: number; - resultCount: number; - symbols: { - fromCache: boolean; - }; - files: ISearchStats; -} - export class OpenAnythingHandler extends QuickOpenHandler { public static readonly ID = 'workbench.picker.anything'; @@ -131,8 +51,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { constructor( @IMessageService private messageService: IMessageService, @IInstantiationService instantiationService: IInstantiationService, - @IConfigurationService private configurationService: IConfigurationService, - @ITelemetryService private telemetryService: ITelemetryService + @IConfigurationService private configurationService: IConfigurationService ) { super(); @@ -168,8 +87,6 @@ export class OpenAnythingHandler extends QuickOpenHandler { } public getResults(searchValue: string): TPromise { - const startTime = Date.now(); - this.cancelPendingSearch(); this.isClosed = false; // Treat this call as the handler being in use @@ -212,10 +129,8 @@ export class OpenAnythingHandler extends QuickOpenHandler { const mergedResults = [].concat(...results.map(r => r.entries)); // Sort - const unsortedResultTime = Date.now(); const compare = (elementA: QuickOpenEntry, elementB: QuickOpenEntry) => compareItemsByScore(elementA, elementB, query, true, QuickOpenItemAccessor, this.scorerCache); const viewResults = arrays.top(mergedResults, compare, OpenAnythingHandler.MAX_DISPLAYED_RESULTS); - const sortedResultTime = Date.now(); // Apply range and highlights to file entries viewResults.forEach(entry => { @@ -227,28 +142,6 @@ export class OpenAnythingHandler extends QuickOpenHandler { } }); - const duration = new Date().getTime() - startTime; - filePromise.then(fileModel => { - const data = this.createTimerEventData(startTime, { - searchLength: query.value.length, - unsortedResultTime, - sortedResultTime, - resultCount: mergedResults.length, - symbols: { fromCache: false }, - files: fileModel.stats, - }); - - /* __GDPR__ - "openAnything" : { - "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "${include}": [ - "${ITimerEventData}" - ] - } - */ - this.telemetryService.publicLog('openAnything', objects.assign(data, { duration })); - }); - return TPromise.as(new QuickOpenModel(viewResults)); }, (error: Error[]) => { this.pendingSearch = null; @@ -366,43 +259,4 @@ export class OpenAnythingHandler extends QuickOpenHandler { this.pendingSearch = null; } } - - private createTimerEventData(startTime: number, telemetry: ITelemetryData): ITimerEventData { - return { - searchLength: telemetry.searchLength, - unsortedResultDuration: telemetry.unsortedResultTime - startTime, - sortedResultDuration: telemetry.sortedResultTime - startTime, - resultCount: telemetry.resultCount, - symbols: telemetry.symbols, - files: telemetry.files && this.createFileEventData(startTime, telemetry.files) - }; - } - - private createFileEventData(startTime: number, stats: ISearchStats) { - const cached = stats as ICachedSearchStats; - const uncached = stats as IUncachedSearchStats; - - return objects_assign({ - fromCache: stats.fromCache, - unsortedResultDuration: stats.unsortedResultTime && stats.unsortedResultTime - startTime, - sortedResultDuration: stats.sortedResultTime && stats.sortedResultTime - startTime, - resultCount: stats.resultCount - }, stats.fromCache ? { - cacheLookupStartDuration: cached.cacheLookupStartTime - startTime, - cacheFilterStartDuration: cached.cacheFilterStartTime - startTime, - cacheLookupResultDuration: cached.cacheLookupResultTime - startTime, - cacheEntryCount: cached.cacheEntryCount, - joined: cached.joined && this.createFileEventData(startTime, cached.joined) - } : { - traversal: uncached.traversal, - errors: uncached.errors, - fileWalkStartDuration: uncached.fileWalkStartTime - startTime, - fileWalkResultDuration: uncached.fileWalkResultTime - startTime, - directoriesWalked: uncached.directoriesWalked, - filesWalked: uncached.filesWalked, - cmdForkStartDuration: uncached.cmdForkStartTime && uncached.cmdForkStartTime - startTime, - cmdForkResultDuration: uncached.cmdForkResultTime && uncached.cmdForkResultTime - startTime, - cmdResultCount: uncached.cmdResultCount - }); - } } \ No newline at end of file diff --git a/src/vs/workbench/parts/search/browser/openFileHandler.ts b/src/vs/workbench/parts/search/browser/openFileHandler.ts index 4e2a30421995..04e8cad51505 100644 --- a/src/vs/workbench/parts/search/browser/openFileHandler.ts +++ b/src/vs/workbench/parts/search/browser/openFileHandler.ts @@ -88,8 +88,8 @@ export class FileEntry extends EditorQuickOpenEntry { this.range = range; } - public isFile(): boolean { - return true; // TODO@Ben debt with editor history merging + public mergeWithEditorHistory(): boolean { + return true; } public getInput(): IResourceInput | EditorInput { @@ -142,6 +142,9 @@ export class OpenFileHandler extends QuickOpenHandler { return TPromise.as(new FileQuickOpenModel([])); } + // Untildify file pattern + searchValue = labels.untildify(searchValue, this.environmentService.userHome); + // Do find results return this.doFindResults(searchValue, this.cacheState.cacheKey, maxSortedResults); } diff --git a/src/vs/workbench/parts/search/browser/patternInputWidget.ts b/src/vs/workbench/parts/search/browser/patternInputWidget.ts index 82d85f89eeaa..56d9ee9c02cc 100644 --- a/src/vs/workbench/parts/search/browser/patternInputWidget.ts +++ b/src/vs/workbench/parts/search/browser/patternInputWidget.ts @@ -15,7 +15,6 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import CommonEvent, { Emitter } from 'vs/base/common/event'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachInputBoxStyler, attachCheckboxStyler } from 'vs/platform/theme/common/styler'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { HistoryNavigator } from 'vs/base/common/history'; export interface IOptions { @@ -199,7 +198,7 @@ export class PatternInputWidget extends Widget { export class ExcludePatternInputWidget extends PatternInputWidget { - constructor(parent: HTMLElement, contextViewProvider: IContextViewProvider, themeService: IThemeService, private telemetryService: ITelemetryService, options: IOptions = Object.create(null)) { + constructor(parent: HTMLElement, contextViewProvider: IContextViewProvider, themeService: IThemeService, options: IOptions = Object.create(null)) { super(parent, contextViewProvider, themeService, options); } @@ -228,10 +227,6 @@ export class ExcludePatternInputWidget extends PatternInputWidget { title: nls.localize('useExcludesAndIgnoreFilesDescription', "Use Exclude Settings and Ignore Files"), isChecked: true, onChange: (viaKeyboard) => { - /* __GDPR__ - "search.useExcludesAndIgnoreFiles.toggled" : {} - */ - this.telemetryService.publicLog('search.useExcludesAndIgnoreFiles.toggled'); this.onOptionChange(null); if (!viaKeyboard) { this.inputBox.focus(); diff --git a/src/vs/workbench/parts/search/browser/replaceService.ts b/src/vs/workbench/parts/search/browser/replaceService.ts index 11e4e80bf534..b44ce12bb713 100644 --- a/src/vs/workbench/parts/search/browser/replaceService.ts +++ b/src/vs/workbench/parts/search/browser/replaceService.ts @@ -18,7 +18,6 @@ import { Match, FileMatch, FileMatchOrMatch, ISearchWorkbenchService } from 'vs/ import { BulkEdit, IResourceEdit, createBulkEdit } from 'vs/editor/browser/services/bulkEdit'; import { IProgressRunner } from 'vs/platform/progress/common/progress'; import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IModel, ScrollType } from 'vs/editor/common/editorCommon'; @@ -92,10 +91,9 @@ export class ReplaceService implements IReplaceService { public _serviceBrand: any; constructor( - @ITelemetryService private telemetryService: ITelemetryService, @IFileService private fileService: IFileService, @IEditorService private editorService: IWorkbenchEditorService, - @ITextModelService private textModelResolverService: ITextModelService, + @ITextModelService private textModelResolverService: ITextModelService ) { } @@ -131,10 +129,6 @@ export class ReplaceService implements IReplaceService { } public openReplacePreview(element: FileMatchOrMatch, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): TPromise { - /* __GDPR__ - "replace.open.previewEditor" : {} - */ - this.telemetryService.publicLog('replace.open.previewEditor'); const fileMatch = element instanceof Match ? element.parent() : element; return this.editorService.openEditor({ diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index 08e2c9201576..4145a5cc8b29 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -15,7 +15,6 @@ import { Match, FileMatch, FileMatchOrMatch, FolderMatch, RenderableMatch } from import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import * as Constants from 'vs/workbench/parts/search/common/constants'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ResolvedKeybinding, createKeybinding } from 'vs/base/common/keyCodes'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; @@ -188,7 +187,6 @@ export class ShowPreviousSearchTermAction extends Action { export class FocusNextInputAction extends Action { public static readonly ID = 'search.focus.nextInputBox'; - public static readonly LABEL = nls.localize('focusNextInputBox', "Focus Next Input Box"); constructor(id: string, label: string, @IViewletService private viewletService: IViewletService) { super(id, label); @@ -203,7 +201,6 @@ export class FocusNextInputAction extends Action { export class FocusPreviousInputAction extends Action { public static readonly ID = 'search.focus.previousInputBox'; - public static readonly LABEL = nls.localize('focusPreviousInputBox', "Focus Previous Input Box"); constructor(id: string, label: string, @IViewletService private viewletService: IViewletService) { super(id, label); @@ -224,17 +221,10 @@ export const FocusActiveEditorCommand = (accessor: ServicesAccessor) => { return TPromise.as(true); }; -export interface IFindOrReplaceActionOpts { - selectWidgetText: boolean; - focusReplace: boolean; - expandSearchReplaceWidget: boolean; - takeEditorText?: boolean; -} - export abstract class FindOrReplaceInFilesAction extends Action { constructor(id: string, label: string, private viewletService: IViewletService, - private options: IFindOrReplaceActionOpts) { + private expandSearchReplaceWidget: boolean, private selectWidgetText: boolean, private focusReplace: boolean) { super(id, label); } @@ -242,20 +232,13 @@ export abstract class FindOrReplaceInFilesAction extends Action { const viewlet = this.viewletService.getActiveViewlet(); const searchViewletWasOpen = viewlet && viewlet.getId() === Constants.VIEWLET_ID; return this.viewletService.openViewlet(Constants.VIEWLET_ID, true).then((viewlet) => { - if (this.options.takeEditorText) { - (viewlet).takeEditorText(); - } - - if (!searchViewletWasOpen || this.options.expandSearchReplaceWidget) { + if (!searchViewletWasOpen || this.expandSearchReplaceWidget) { const searchAndReplaceWidget = (viewlet).searchAndReplaceWidget; - searchAndReplaceWidget.toggleReplace(this.options.expandSearchReplaceWidget); - + searchAndReplaceWidget.toggleReplace(this.expandSearchReplaceWidget); // Focus replace only when there is text in the searchInput box - const focusReplace = this.options.focusReplace && searchAndReplaceWidget.searchInput.getValue(); - searchAndReplaceWidget.focus(this.options.selectWidgetText, !!focusReplace); + const focusReplace = this.focusReplace && searchAndReplaceWidget.searchInput.getValue(); + searchAndReplaceWidget.focus(this.selectWidgetText, !!focusReplace); } - - return viewlet; }); } } @@ -267,26 +250,7 @@ export class FindInFilesAction extends FindOrReplaceInFilesAction { public static readonly LABEL = nls.localize('findInFiles', "Find in Files"); constructor(id: string, label: string, @IViewletService viewletService: IViewletService) { - super(id, label, viewletService, { - expandSearchReplaceWidget: false, - selectWidgetText: true, - focusReplace: false - }); - } -} - -export class FindInFilesWithSelectedTextAction extends FindOrReplaceInFilesAction { - - public static readonly ID = 'workbench.action.findInFilesWithSelectedText'; - public static readonly LABEL = nls.localize('findInFilesWithSelectedText', "Find in Files With Selected Text"); - - constructor(id: string, label: string, @IViewletService viewletService: IViewletService) { - super(id, label, viewletService, { - expandSearchReplaceWidget: false, - selectWidgetText: true, - focusReplace: false, - takeEditorText: true - }); + super(id, label, viewletService, /*expandSearchReplaceWidget=*/false, /*selectWidgetText=*/true, /*focusReplace=*/false); } } @@ -296,26 +260,7 @@ export class ReplaceInFilesAction extends FindOrReplaceInFilesAction { public static readonly LABEL = nls.localize('replaceInFiles', "Replace in Files"); constructor(id: string, label: string, @IViewletService viewletService: IViewletService) { - super(id, label, viewletService, { - expandSearchReplaceWidget: true, - selectWidgetText: false, - focusReplace: true - }); - } -} - -export class ReplaceInFilesWithSelectedTextAction extends FindOrReplaceInFilesAction { - - public static readonly ID = 'workbench.action.replaceInFilesWithSelectedText'; - public static readonly LABEL = nls.localize('replaceInFilesWithSelectedText', "Replace in Files With Selected Text"); - - constructor(id: string, label: string, @IViewletService viewletService: IViewletService) { - super(id, label, viewletService, { - expandSearchReplaceWidget: true, - selectWidgetText: false, - focusReplace: true, - takeEditorText: true - }); + super(id, label, viewletService, /*expandSearchReplaceWidget=*/true, /*selectWidgetText=*/false, /*focusReplace=*/true); } } @@ -333,60 +278,103 @@ export class CloseReplaceAction extends Action { } } -export class RefreshAction extends Action { +export abstract class SearchAction extends Action { - constructor(private viewlet: SearchViewlet) { - super('refresh'); - - this.label = nls.localize('RefreshAction.label', "Refresh"); - this.enabled = false; - this.class = 'search-action refresh'; + constructor(id: string, label: string, @IViewletService protected viewletService: IViewletService) { + super(id, label); } - public run(): TPromise { - this.viewlet.onQueryChanged(true); + abstract update(): void; - return TPromise.as(null); - } -} - -export class CollapseDeepestExpandedLevelAction extends Action { - private viewer: ITree; - - constructor(viewlet: SearchViewlet, enabled: boolean = false) { - super('vs.tree.collapse', nls.localize('collapse', "Collapse"), 'monaco-tree-action collapse-all', enabled); - this.viewer = viewlet.getControl(); - this.class = 'search-action collapse'; - } - - public run(context?: any): TPromise { - if (this.viewer.getHighlight()) { - return TPromise.as(null); // Global action disabled if user is in edit mode from another action + protected getSearchViewlet(): SearchViewlet { + const activeViewlet = this.viewletService.getActiveViewlet(); + if (activeViewlet && activeViewlet.getId() === Constants.VIEWLET_ID) { + return activeViewlet as SearchViewlet; } + return null; + } +} - this.viewer.collapseDeepestExpandedLevel(); - this.viewer.clearSelection(); - this.viewer.clearFocus(); - this.viewer.DOMFocus(); - this.viewer.focusFirst(); +export class RefreshAction extends SearchAction { + static ID: string = 'search.action.refreshSearchResults'; + static LABEL: string = nls.localize('RefreshAction.label', "Refresh"); + + constructor(id: string, label: string, @IViewletService viewletService: IViewletService) { + super(id, label, viewletService); + this.class = 'search-action refresh'; + this.update(); + } + + update(): void { + const searchViewlet = this.getSearchViewlet(); + this.enabled = searchViewlet && searchViewlet.isSearchSubmitted(); + } + + public run(): TPromise { + const searchViewlet = this.getSearchViewlet(); + if (searchViewlet) { + searchViewlet.onQueryChanged(true); + } return TPromise.as(null); } } -export class ClearSearchResultsAction extends Action { +export class CollapseDeepestExpandedLevelAction extends SearchAction { - constructor(private viewlet: SearchViewlet) { - super('clearSearchResults'); + static ID: string = 'search.action.collapseSearchResults'; + static LABEL: string = nls.localize('CollapseDeepestExpandedLevelAction.label', "Collapse All"); - this.label = nls.localize('ClearSearchResultsAction.label', "Clear Search Results"); - this.enabled = false; - this.class = 'search-action clear-search-results'; + constructor(id: string, label: string, @IViewletService viewletService: IViewletService) { + super(id, label, viewletService); + this.class = 'search-action collapse'; + this.update(); + } + + update(): void { + const searchViewlet = this.getSearchViewlet(); + this.enabled = searchViewlet && searchViewlet.hasSearchResults(); } public run(): TPromise { - this.viewlet.clearSearchResults(); + const searchViewlet = this.getSearchViewlet(); + if (searchViewlet) { + const viewer = searchViewlet.getControl(); + if (viewer.getHighlight()) { + return TPromise.as(null); // Global action disabled if user is in edit mode from another action + } + viewer.collapseDeepestExpandedLevel(); + viewer.clearSelection(); + viewer.clearFocus(); + viewer.DOMFocus(); + viewer.focusFirst(); + } + return TPromise.as(null); + } +} + +export class ClearSearchResultsAction extends SearchAction { + + static ID: string = 'search.action.clearSearchResults'; + static LABEL: string = nls.localize('ClearSearchResultsAction.label', "Clear"); + + constructor(id: string, label: string, @IViewletService viewletService: IViewletService) { + super(id, label, viewletService); + this.class = 'search-action clear-search-results'; + this.update(); + } + + update(): void { + const searchViewlet = this.getSearchViewlet(); + this.enabled = searchViewlet && searchViewlet.hasSearchResults(); + } + + public run(): TPromise { + const searchViewlet = this.getSearchViewlet(); + if (searchViewlet) { + searchViewlet.clearSearchResults(); + } return TPromise.as(null); } } @@ -503,16 +491,11 @@ export class RemoveAction extends AbstractSearchAndReplaceAction { export class ReplaceAllAction extends AbstractSearchAndReplaceAction { constructor(private viewer: ITree, private fileMatch: FileMatch, private viewlet: SearchViewlet, - @IKeybindingService keyBindingService: IKeybindingService, - @ITelemetryService private telemetryService: ITelemetryService) { + @IKeybindingService keyBindingService: IKeybindingService) { super(Constants.ReplaceAllInFileActionId, appendKeyBindingLabel(nls.localize('file.replaceAll.label', "Replace All"), keyBindingService.lookupKeybinding(Constants.ReplaceAllInFileActionId), keyBindingService), 'action-replace-all'); } public run(): TPromise { - /* __GDPR__ - "replaceAll.action.selected" : {} - */ - this.telemetryService.publicLog('replaceAll.action.selected'); let nextFocusElement = this.getElementToFocusAfterRemoved(this.viewer, this.fileMatch); return this.fileMatch.parent().replace(this.fileMatch).then(() => { if (nextFocusElement) { @@ -527,17 +510,12 @@ export class ReplaceAllAction extends AbstractSearchAndReplaceAction { export class ReplaceAllInFolderAction extends AbstractSearchAndReplaceAction { constructor(private viewer: ITree, private folderMatch: FolderMatch, - @IKeybindingService keyBindingService: IKeybindingService, - @ITelemetryService private telemetryService: ITelemetryService + @IKeybindingService keyBindingService: IKeybindingService ) { super(Constants.ReplaceAllInFolderActionId, nls.localize('file.replaceAll.label', "Replace All"), 'action-replace-all'); } public async run(): TPromise { - /* __GDPR__ - "replaceAllInFolder.action.selected" : {} - */ - this.telemetryService.publicLog('replaceAllInFolder.action.selected'); let nextFocusElement = this.getElementToFocusAfterRemoved(this.viewer, this.folderMatch); await this.folderMatch.replaceAll(); @@ -553,17 +531,12 @@ export class ReplaceAction extends AbstractSearchAndReplaceAction { constructor(private viewer: ITree, private element: Match, private viewlet: SearchViewlet, @IReplaceService private replaceService: IReplaceService, @IKeybindingService keyBindingService: IKeybindingService, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @ITelemetryService private telemetryService: ITelemetryService) { + @IWorkbenchEditorService private editorService: IWorkbenchEditorService) { super(Constants.ReplaceActionId, appendKeyBindingLabel(nls.localize('match.replace.label', "Replace"), keyBindingService.lookupKeybinding(Constants.ReplaceActionId), keyBindingService), 'action-replace'); } public run(): TPromise { this.enabled = false; - /* __GDPR__ - "replace.action.selected" : {} - */ - this.telemetryService.publicLog('replace.action.selected'); return this.element.parent().replace(this.element).then(() => { let elementToFocus = this.getElementToFocusAfterReplace(); diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 43c2dae7fbde..329d78f48fbe 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -17,12 +17,11 @@ import URI from 'vs/base/common/uri'; import strings = require('vs/base/common/strings'); import * as paths from 'vs/base/common/paths'; import dom = require('vs/base/browser/dom'); -import { IAction, Action } from 'vs/base/common/actions'; +import { IAction } from 'vs/base/common/actions'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Dimension, Builder, $ } from 'vs/base/browser/builder'; import { FindInput } from 'vs/base/browser/ui/findinput/findInput'; import { ITree, IFocusEvent } from 'vs/base/parts/tree/browser/tree'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { Scope } from 'vs/workbench/common/memento'; import { IPreferencesService } from 'vs/workbench/parts/preferences/common/preferences'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; @@ -46,22 +45,22 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { PatternInputWidget, ExcludePatternInputWidget } from 'vs/workbench/parts/search/browser/patternInputWidget'; import { SearchRenderer, SearchDataSource, SearchSorter, SearchAccessibilityProvider, SearchFilter } from 'vs/workbench/parts/search/browser/searchResultsView'; import { SearchWidget, ISearchWidgetOptions } from 'vs/workbench/parts/search/browser/searchWidget'; -import { RefreshAction, CollapseDeepestExpandedLevelAction, ClearSearchResultsAction } from 'vs/workbench/parts/search/browser/searchActions'; +import { RefreshAction, CollapseDeepestExpandedLevelAction, ClearSearchResultsAction, SearchAction } from 'vs/workbench/parts/search/browser/searchActions'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import Severity from 'vs/base/common/severity'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { OpenFolderAction, OpenFileFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; import * as Constants from 'vs/workbench/parts/search/common/constants'; -import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService, ITheme, ICssStyleCollector, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorFindMatchHighlight, diffInserted, diffRemoved, diffInsertedOutline, diffRemovedOutline, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import FileResultsNavigation from 'vs/workbench/parts/files/browser/fileResultsNavigation'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; import { getOutOfWorkspaceEditorResources } from 'vs/workbench/parts/search/common/search'; import { PreferencesEditor } from 'vs/workbench/parts/preferences/browser/preferencesEditor'; import { SimpleFileResourceDragAndDrop } from 'vs/base/parts/tree/browser/treeDnd'; import { isDiffEditor, isCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; +import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; export class SearchViewlet extends Viewlet { @@ -82,8 +81,9 @@ export class SearchViewlet extends Viewlet { private fileMatchFocused: IContextKey; private folderMatchFocused: IContextKey; private matchFocused: IContextKey; + private searchSubmitted: boolean; - private actionRegistry: { [key: string]: Action; }; + private actions: SearchAction[] = []; private tree: ITree; private viewletSettings: any; private messages: Builder; @@ -222,7 +222,7 @@ export class SearchViewlet extends Viewlet { let title = nls.localize('searchScope.excludes', "files to exclude"); builder.element('h4', { text: title }); - this.inputPatternExcludes = new ExcludePatternInputWidget(builder.getContainer(), this.contextViewService, this.themeService, this.telemetryService, { + this.inputPatternExcludes = new ExcludePatternInputWidget(builder.getContainer(), this.contextViewService, this.themeService, { ariaLabel: nls.localize('label.excludes', 'Search Exclude Patterns') }); @@ -249,11 +249,11 @@ export class SearchViewlet extends Viewlet { this.createSearchResultsView(builder); - this.actionRegistry = {}; - let actions: Action[] = [new CollapseDeepestExpandedLevelAction(this), new RefreshAction(this), new ClearSearchResultsAction(this)]; - actions.forEach((action) => { - this.actionRegistry[action.id] = action; - }); + this.actions = [ + this.instantiationService.createInstance(RefreshAction, RefreshAction.ID, RefreshAction.LABEL), + this.instantiationService.createInstance(CollapseDeepestExpandedLevelAction, CollapseDeepestExpandedLevelAction.ID, CollapseDeepestExpandedLevelAction.LABEL), + this.instantiationService.createInstance(ClearSearchResultsAction, ClearSearchResultsAction.ID, ClearSearchResultsAction.LABEL) + ]; if (filePatterns !== '' || patternExclusions !== '' || patternIncludes !== '' || queryDetailsExpanded !== '' || !useExcludesAndIgnoreFiles) { this.toggleQueryDetails(true, true, true); @@ -276,6 +276,12 @@ export class SearchViewlet extends Viewlet { return this.inputPatternExcludes; } + private updateActions(): void { + for (const action of this.actions) { + action.update(); + } + } + private createSearchWidget(builder: Builder): void { let contentPattern = this.viewletSettings['query.contentPattern'] || ''; let isRegex = this.viewletSettings['query.regex'] === true; @@ -392,7 +398,7 @@ export class SearchViewlet extends Viewlet { type: 'question' }; - if (this.messageService.confirmSync(confirmation)) { + if (this.messageService.confirm(confirmation)) { this.searchWidget.setReplaceAllActionState(false); this.viewModel.searchResult.replaceAll(progressRunner).then(() => { progressRunner.done(); @@ -491,7 +497,7 @@ export class SearchViewlet extends Viewlet { let dnd = new SimpleFileResourceDragAndDrop(obj => obj instanceof FileMatch ? obj.resource() : void 0); - this.tree = new Tree(div.getHTMLElement(), { + this.tree = new WorkbenchTree(div.getHTMLElement(), { dataSource: dataSource, renderer: renderer, sorter: new SearchSorter(), @@ -501,14 +507,11 @@ export class SearchViewlet extends Viewlet { }, { ariaLabel: nls.localize('treeAriaLabel', "Search Results"), keyboardSupport: false - }); - - this.toUnbind.push(attachListStyler(this.tree, this.themeService)); + }, this.contextKeyService, this.listService, this.themeService); this.tree.setInput(this.viewModel.searchResult); this.toUnbind.push(renderer); - this.toUnbind.push(this.listService.register(this.tree)); const fileResultsNavigation = this._register(new FileResultsNavigation(this.tree)); this._register(debounceEvent(fileResultsNavigation.openFile, (last, event) => event, 75, true)(options => { if (options.element instanceof Match) { @@ -667,15 +670,15 @@ export class SearchViewlet extends Viewlet { public focus(): void { super.focus(); - this.searchWidget.focus(); - } - - public takeEditorText(): void { - const selectedText = this.getSearchTextFromEditor(); - if (selectedText) { - this.searchWidget.searchInput.setValue(selectedText); - this.searchWidget.focus(); + const seedSearchStringFromSelection = this.configurationService.getValue('editor').find.seedSearchStringFromSelection; + if (seedSearchStringFromSelection) { + const selectedText = this.getSearchTextFromEditor(); + if (selectedText) { + this.searchWidget.searchInput.setValue(selectedText); + } } + + this.searchWidget.focus(); } public focusNextInputBox(): void { @@ -777,6 +780,14 @@ export class SearchViewlet extends Viewlet { return this.tree; } + public isSearchSubmitted(): boolean { + return this.searchSubmitted; + } + + public hasSearchResults(): boolean { + return !this.viewModel.searchResult.isEmpty(); + } + public clearSearchResults(): void { this.viewModel.searchResult.clear(); this.showEmptyStage(); @@ -865,11 +876,6 @@ export class SearchViewlet extends Viewlet { } public toggleQueryDetails(moveFocus?: boolean, show?: boolean, skipLayout?: boolean, reverse?: boolean): void { - /* __GDPR__ - "search.toggleQueryDetails" : {} - */ - this.telemetryService.publicLog('search.toggleQueryDetails'); - let cls = 'more'; show = typeof show === 'undefined' ? !dom.hasClass(this.queryDetails, cls) : Boolean(show); this.viewletSettings['query.queryDetailsExpanded'] = show; @@ -1085,9 +1091,8 @@ export class SearchViewlet extends Viewlet { let hasResults = !this.viewModel.searchResult.isEmpty(); - this.actionRegistry['refresh'].enabled = true; - this.actionRegistry['vs.tree.collapse'].enabled = hasResults; - this.actionRegistry['clearSearchResults'].enabled = hasResults; + this.searchSubmitted = true; + this.updateActions(); if (completed && completed.limitHit) { this.searchWidget.searchInput.showMessage({ @@ -1259,10 +1264,7 @@ export class SearchViewlet extends Viewlet { this.updateSearchResultCount(); } if (fileCount > 0) { - // since we have results now, enable some actions - if (!this.actionRegistry['vs.tree.collapse'].enabled) { - this.actionRegistry['vs.tree.collapse'].enabled = true; - } + this.updateActions(); } }, 100); @@ -1322,9 +1324,8 @@ export class SearchViewlet extends Viewlet { private showEmptyStage(): void { // disable 'result'-actions - this.actionRegistry['refresh'].enabled = false; - this.actionRegistry['vs.tree.collapse'].enabled = false; - this.actionRegistry['clearSearchResults'].enabled = false; + this.searchSubmitted = false; + this.updateActions(); // clean up ui // this.replaceService.disposeAllReplacePreviews(); @@ -1340,11 +1341,6 @@ export class SearchViewlet extends Viewlet { return TPromise.as(true); } - /* __GDPR__ - "searchResultChosen" : {} - */ - this.telemetryService.publicLog('searchResultChosen'); - return (this.viewModel.isReplaceActive() && !!this.viewModel.replaceString) ? this.replaceService.openReplacePreview(lineMatch, preserveFocus, sideBySide, pinned) : this.open(lineMatch, preserveFocus, sideBySide, pinned); @@ -1428,11 +1424,7 @@ export class SearchViewlet extends Viewlet { } public getActions(): IAction[] { - return [ - this.actionRegistry['refresh'], - this.actionRegistry['vs.tree.collapse'], - this.actionRegistry['clearSearchResults'] - ]; + return this.actions; } public shutdown(): void { diff --git a/src/vs/workbench/parts/search/common/queryBuilder.ts b/src/vs/workbench/parts/search/common/queryBuilder.ts index 5a31a2de6514..9fb9b9251838 100644 --- a/src/vs/workbench/parts/search/common/queryBuilder.ts +++ b/src/vs/workbench/parts/search/common/queryBuilder.ts @@ -10,7 +10,6 @@ import * as objects from 'vs/base/common/objects'; import * as collections from 'vs/base/common/collections'; import * as glob from 'vs/base/common/glob'; import * as paths from 'vs/base/common/paths'; -import * as strings from 'vs/base/common/strings'; import uri from 'vs/base/common/uri'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IPatternInfo, IQueryOptions, IFolderQuery, ISearchQuery, QueryType, ISearchConfiguration, getExcludes, pathIncludedInQuery } from 'vs/platform/search/common/search'; @@ -101,8 +100,8 @@ export class QueryBuilder { */ public parseSearchPaths(pattern: string): ISearchPathsResult { const isSearchPath = (segment: string) => { - // A segment is a search path if it is an absolute path or starts with ./ - return paths.isAbsolute(segment) || strings.startsWith(segment, './') || strings.startsWith(segment, '.\\'); + // A segment is a search path if it is an absolute path or starts with ./, ../, .\, or ..\ + return paths.isAbsolute(segment) || /^\.\.?[\/\\]/.test(segment); }; const segments = splitGlobPattern(pattern); @@ -176,7 +175,7 @@ export class QueryBuilder { .reduce((absExpr: glob.IExpression, key: string) => { if (expr[key] && !paths.isAbsolute(key)) { const absPattern = paths.join(root, key); - absExpr[absPattern] = true; + absExpr[absPattern] = expr[key]; } return absExpr; diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/parts/search/common/searchModel.ts index 508d6cac22a4..75071492b86c 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/parts/search/common/searchModel.ts @@ -539,14 +539,18 @@ export class SearchResult extends Disposable { this._folderMatches.forEach((folderMatch) => rawPerFolder.set(folderMatch.resource(), [])); allRaw.forEach(rawFileMatch => { let folderMatch = this.getFolderMatch(rawFileMatch.resource); - rawPerFolder.get(folderMatch.resource()).push(rawFileMatch); + if (folderMatch) { + rawPerFolder.get(folderMatch.resource()).push(rawFileMatch); + } }); rawPerFolder.forEach((raw) => { if (!raw.length) { return; } let folderMatch = this.getFolderMatch(raw[0].resource); - folderMatch.add(raw, silent); + if (folderMatch) { + folderMatch.add(raw, silent); + } }); } @@ -607,10 +611,6 @@ export class SearchResult extends Disposable { return this.folderMatches().reduce((prev, match) => prev + match.fileCount(), 0); } - public folderCount(): number { - return this.folderMatches().reduce((prev, match) => prev + (match.fileCount() > 0 ? 1 : 0), 0); - } - public count(): number { return this.matches().reduce((prev, match) => prev + match.count(), 0); } diff --git a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts index 8ab71e6de88b..7ec9eebcb5e9 100644 --- a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts @@ -14,7 +14,6 @@ import nls = require('vs/nls'); import { TPromise } from 'vs/base/common/winjs.base'; import { IAction, Action } from 'vs/base/common/actions'; import * as objects from 'vs/base/common/objects'; -import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { explorerItemToFileResource } from 'vs/workbench/parts/files/common/files'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -40,7 +39,6 @@ import { ToggleCaseSensitiveKeybinding, ToggleRegexKeybinding, ToggleWholeWordKe import { ISearchWorkbenchService, SearchWorkbenchService } from 'vs/workbench/parts/search/common/searchModel'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { SearchViewlet } from 'vs/workbench/parts/search/browser/searchViewlet'; -import { ListFocusContext } from 'vs/platform/list/browser/listService'; import { IOutputChannelRegistry, Extensions as OutputExt } from 'vs/workbench/parts/output/common/output'; import { defaultQuickOpenContextKey } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { OpenSymbolHandler } from 'vs/workbench/parts/search/browser/openSymbolHandler'; @@ -49,6 +47,7 @@ import { registerLanguageCommand } from 'vs/editor/browser/editorExtensions'; import { getWorkspaceSymbols } from 'vs/workbench/parts/search/common/search'; import { illegalArgument } from 'vs/base/common/errors'; import { FindInFolderAction, findInFolderCommand, FindInWorkspaceAction } from 'vs/workbench/parts/search/electron-browser/searchActions'; +import { WorkbenchListFocusContextKey } from 'vs/platform/list/browser/listService'; registerSingleton(ISearchWorkbenchService, SearchWorkbenchService); replaceContributions(); @@ -95,7 +94,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: Constants.CancelActionId, weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ContextKeyExpr.and(Constants.SearchViewletVisibleKey, ListFocusContext), + when: ContextKeyExpr.and(Constants.SearchViewletVisibleKey, WorkbenchListFocusContextKey), primary: KeyCode.Escape, handler: (accessor, args: any) => { const searchViewlet: SearchViewlet = accessor.get(IViewletService).getActiveViewlet(); @@ -277,18 +276,10 @@ Registry.as(ViewletExtensions.Viewlets).registerViewlet(new Vie const registry = Registry.as(ActionExtensions.WorkbenchActions); const category = nls.localize('search', "Search"); -// "Show Search" and "Find in Files" are redundant, but we will inevitably break keybindings if we remove one -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FindInFilesAction, Constants.VIEWLET_ID, searchActions.SHOW_SEARCH_LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, - ContextKeyExpr.and(Constants.SearchViewletVisibleKey.toNegated(), EditorContextKeys.focus.toNegated())), 'View: Show Search', nls.localize('view', "View")); -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FindInFilesAction, Constants.FindInFilesActionId, searchActions.FindInFilesAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, - ContextKeyExpr.and(Constants.SearchInputBoxFocusedKey.toNegated(), EditorContextKeys.focus.toNegated())), 'Find in Files', category); -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ReplaceInFilesAction, searchActions.ReplaceInFilesAction.ID, searchActions.ReplaceInFilesAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_H }, - EditorContextKeys.focus.toNegated()), 'Replace in Files', category); - -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FindInFilesWithSelectedTextAction, searchActions.FindInFilesWithSelectedTextAction.ID, searchActions.FindInFilesWithSelectedTextAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, - EditorContextKeys.focus), 'Find in Files With Selected Text', category); -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ReplaceInFilesWithSelectedTextAction, searchActions.ReplaceInFilesWithSelectedTextAction.ID, searchActions.ReplaceInFilesWithSelectedTextAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_H }, - EditorContextKeys.focus), 'Replace in Files With Selected Text', category); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FindInFilesAction, Constants.VIEWLET_ID, nls.localize('showSearchViewlet', "Show Search"), { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, + Constants.SearchViewletVisibleKey.toNegated()), 'View: Show Search', nls.localize('view', "View")); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FindInFilesAction, Constants.FindInFilesActionId, nls.localize('findInFiles', "Find in Files"), { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, + Constants.SearchInputBoxFocusedKey.toNegated()), 'Find in Files', category); KeybindingsRegistry.registerCommandAndKeybindingRule({ id: Constants.FocusActiveEditorCommandId, @@ -301,6 +292,8 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusNextSearchResultAction, searchActions.FocusNextSearchResultAction.ID, searchActions.FocusNextSearchResultAction.LABEL, { primary: KeyCode.F4 }), 'Focus Next Search Result', category); registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusPreviousSearchResultAction, searchActions.FocusPreviousSearchResultAction.ID, searchActions.FocusPreviousSearchResultAction.LABEL, { primary: KeyMod.Shift | KeyCode.F4 }), 'Focus Previous Search Result', category); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ReplaceInFilesAction, searchActions.ReplaceInFilesAction.ID, searchActions.ReplaceInFilesAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_H }), 'Replace in Files', category); + KeybindingsRegistry.registerCommandAndKeybindingRule(objects.assign({ id: Constants.ToggleCaseSensitiveCommandId, weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), diff --git a/src/vs/workbench/parts/search/electron-browser/searchActions.ts b/src/vs/workbench/parts/search/electron-browser/searchActions.ts index 68f6e35f5e98..ad6bc5404c42 100644 --- a/src/vs/workbench/parts/search/electron-browser/searchActions.ts +++ b/src/vs/workbench/parts/search/electron-browser/searchActions.ts @@ -39,9 +39,10 @@ export const findInFolderCommand = (accessor: ServicesAccessor, resource?: URI) const viewletService = accessor.get(IViewletService); if (!URI.isUri(resource)) { - const focused = listService.getFocused() ? listService.getFocused().getFocus() : void 0; - if (focused) { - const file = explorerItemToFileResource(focused); + const lastFocusedList = listService.lastFocusedList; + const focus = lastFocusedList ? lastFocusedList.getFocus() : void 0; + if (focus) { + const file = explorerItemToFileResource(focus); if (file) { resource = file.isDirectory ? file.resource : resources.dirname(file.resource); } diff --git a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts index 959618c2176e..6b39f0db4ae4 100644 --- a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts +++ b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts @@ -73,7 +73,10 @@ suite('QueryBuilder', () => { mockConfigService.setUserConfiguration('search', { ...DEFAULT_USER_CONFIG, exclude: { - 'bar/**': true + 'bar/**': true, + 'foo/**': { + 'when': '$(basename).ts' + } } }); @@ -86,7 +89,12 @@ suite('QueryBuilder', () => { contentPattern: PATTERN_INFO, folderQueries: [{ folder: ROOT_1_URI, - excludePattern: { 'bar/**': true } + excludePattern: { + 'bar/**': true, + 'foo/**': { + 'when': '$(basename).ts' + } + } }], type: QueryType.Text }); @@ -126,7 +134,10 @@ suite('QueryBuilder', () => { mockConfigService.setUserConfiguration('search', { ...DEFAULT_USER_CONFIG, exclude: { - 'foo/**/*.js': true + 'foo/**/*.js': true, + 'bar/**': { + 'when': '$(basename).ts' + } } }); @@ -141,7 +152,12 @@ suite('QueryBuilder', () => { folderQueries: [{ folder: getUri(paths.join(ROOT_1, 'foo')) }], - excludePattern: { [paths.join(ROOT_1, 'foo/**/*.js')]: true }, + excludePattern: { + [paths.join(ROOT_1, 'foo/**/*.js')]: true, + [paths.join(ROOT_1, 'bar/**')]: { + 'when': '$(basename).ts' + } + }, type: QueryType.Text }); }); @@ -457,6 +473,14 @@ suite('QueryBuilder', () => { }] } ], + [ + '../', + { + searchPaths: [{ + searchPath: getUri('foo/') + }] + } + ] ]; cases.forEach(testIncludesDataItem); }); @@ -674,7 +698,7 @@ function normalizeExpression(expression: IExpression): IExpression { const normalized = Object.create(null); Object.keys(expression).forEach(key => { - normalized[key.replace(/\\/g, '/')] = true; + normalized[key.replace(/\\/g, '/')] = expression[key]; }); return normalized; diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts b/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts index d9341f13c3e1..fa0e7cd8a3ae 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts @@ -210,6 +210,7 @@ export class Snippet { const schemaId = 'vscode://schemas/snippets'; const schema: IJSONSchema = { 'id': schemaId, + 'allowComments': true, 'defaultSnippets': [{ 'label': nls.localize('snippetSchema.json.default', "Empty snippet"), 'body': { '${1:snippetName}': { 'prefix': '${2:prefix}', 'body': '${3:snippet}', 'description': '${4:description}' } } diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts index f164e3b2c5aa..004b30292b83 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts @@ -226,6 +226,7 @@ class SnippetsService implements ISnippetsService { // not yet loaded return SnippetFile.fromFile(this._getUserSnippetFilepath(languageId), localize('source.snippet', "User Snippet")).then(file => { this._userSnippets.set(languageId, file.data); + bucket.push(...file.data); }, err => { this._userSnippets.set(languageId, null); }); diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index a937112e7ad9..6ea817f0a701 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -210,34 +210,35 @@ export class WorkspaceStats implements IWorkbenchContribution { if (folders && folders.length && this.fileService) { return this.fileService.resolveFiles(folders.map(resource => ({ resource }))).then(results => { const names = ([]).concat(...results.map(result => result.success ? (result.stat.children || []) : [])).map(c => c.name); + const nameSet = names.reduce((s, n) => s.add(n.toLowerCase()), new Set()); - tags['workspace.grunt'] = this.searchArray(names, /^gruntfile\.js$/i); - tags['workspace.gulp'] = this.searchArray(names, /^gulpfile\.js$/i); - tags['workspace.jake'] = this.searchArray(names, /^jakefile\.js$/i); + tags['workspace.grunt'] = nameSet.has('gruntfile.js'); + tags['workspace.gulp'] = nameSet.has('gulpfile.js'); + tags['workspace.jake'] = nameSet.has('jakefile.js'); - tags['workspace.tsconfig'] = this.searchArray(names, /^tsconfig\.json$/i); - tags['workspace.jsconfig'] = this.searchArray(names, /^jsconfig\.json$/i); - tags['workspace.config.xml'] = this.searchArray(names, /^config\.xml/i); - tags['workspace.vsc.extension'] = this.searchArray(names, /^vsc-extension-quickstart\.md/i); + tags['workspace.tsconfig'] = nameSet.has('tsconfig.json'); + tags['workspace.jsconfig'] = nameSet.has('jsconfig.json'); + tags['workspace.config.xml'] = nameSet.has('config.xml'); + tags['workspace.vsc.extension'] = nameSet.has('vsc-extension-quickstart.md'); - tags['workspace.ASP5'] = this.searchArray(names, /^project\.json$/i) && this.searchArray(names, /^.+\.cs$/i); + tags['workspace.ASP5'] = nameSet.has('project.json') && this.searchArray(names, /^.+\.cs$/i); tags['workspace.sln'] = this.searchArray(names, /^.+\.sln$|^.+\.csproj$/i); - tags['workspace.unity'] = this.searchArray(names, /^Assets$/i) && this.searchArray(names, /^Library$/i) && this.searchArray(names, /^ProjectSettings/i); - tags['workspace.npm'] = this.searchArray(names, /^package\.json$|^node_modules$/i); - tags['workspace.bower'] = this.searchArray(names, /^bower\.json$|^bower_components$/i); + tags['workspace.unity'] = nameSet.has('assets') && nameSet.has('library') && nameSet.has('projectsettings'); + tags['workspace.npm'] = nameSet.has('package.json') || nameSet.has('node_modules'); + tags['workspace.bower'] = nameSet.has('bower.json') || nameSet.has('bower_components'); - tags['workspace.yeoman.code.ext'] = this.searchArray(names, /^vsc-extension-quickstart\.md$/i); + tags['workspace.yeoman.code.ext'] = nameSet.has('vsc-extension-quickstart.md'); - let mainActivity = this.searchArray(names, /^MainActivity\.cs$/i) || this.searchArray(names, /^MainActivity\.fs$/i); - let appDelegate = this.searchArray(names, /^AppDelegate\.cs$/i) || this.searchArray(names, /^AppDelegate\.fs$/i); - let androidManifest = this.searchArray(names, /^AndroidManifest\.xml$/i); + let mainActivity = nameSet.has('mainactivity.cs') || nameSet.has('mainactivity.fs'); + let appDelegate = nameSet.has('appdelegate.cs') || nameSet.has('appdelegate.fs'); + let androidManifest = nameSet.has('androidmanifest.xml'); - let platforms = this.searchArray(names, /^platforms$/i); - let plugins = this.searchArray(names, /^plugins$/i); - let www = this.searchArray(names, /^www$/i); - let properties = this.searchArray(names, /^Properties/i); - let resources = this.searchArray(names, /^Resources/i); - let jni = this.searchArray(names, /^JNI/i); + let platforms = nameSet.has('platforms'); + let plugins = nameSet.has('plugins'); + let www = nameSet.has('www'); + let properties = nameSet.has('properties'); + let resources = nameSet.has('resources'); + let jni = nameSet.has('jni'); if (tags['workspace.config.xml'] && !tags['workspace.language.cs'] && !tags['workspace.language.vb'] && !tags['workspace.language.aspx']) { @@ -260,8 +261,8 @@ export class WorkspaceStats implements IWorkbenchContribution { tags['workspace.android.cpp'] = true; } - tags['workspace.reactNative'] = this.searchArray(names, /^android$/i) && this.searchArray(names, /^ios$/i) && - this.searchArray(names, /^index\.android\.js$/i) && this.searchArray(names, /^index\.ios\.js$/i); + tags['workspace.reactNative'] = nameSet.has('android') && nameSet.has('ios') && + nameSet.has('index.android.js') && nameSet.has('index.ios.js'); return tags; }, error => { onUnexpectedError(error); return null; }); diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 55564f54c46f..d3bf4705c506 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -1666,7 +1666,7 @@ class TaskService implements ITaskService { if (this._taskSystem instanceof TerminalTaskSystem) { return false; } - if (this._taskSystem.canAutoTerminate() || this.messageService.confirmSync({ + if (this._taskSystem.canAutoTerminate() || this.messageService.confirm({ message: nls.localize('TaskSystem.runningTask', 'There is a task running. Do you want to terminate it?'), primaryButton: nls.localize({ key: 'TaskSystem.terminateTask', comment: ['&& denotes a mnemonic'] }, "&&Terminate Task"), type: 'question' @@ -1687,7 +1687,7 @@ class TaskService implements ITaskService { this.disposeTaskSystemListeners(); return false; // no veto } else if (code && code === TerminateResponseCode.ProcessNotFound) { - return !this.messageService.confirmSync({ + return !this.messageService.confirm({ message: nls.localize('TaskSystem.noProcess', 'The launched task doesn\'t exist anymore. If the task spawned background processes exiting VS Code might result in orphaned processes. To avoid this start the last background process with a wait flag.'), primaryButton: nls.localize({ key: 'TaskSystem.exitAnyways', comment: ['&& denotes a mnemonic'] }, "&&Exit Anyways"), type: 'info' diff --git a/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts b/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts index 5ae1d3e6fb0d..14553747832f 100644 --- a/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts +++ b/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts @@ -88,7 +88,7 @@ export class TerminalPickerHandler extends QuickOpenHandler { const normalizedSearchValueLowercase = stripWildcards(searchValue).toLowerCase(); const terminalEntries: QuickOpenEntry[] = this.getTerminals(); - terminalEntries.push(new CreateTerminal(nls.localize("'workbench.action.terminal.newplus", "$(plus) Create New Integrated Terminal"), this.commandService)); + terminalEntries.push(new CreateTerminal(nls.localize("workbench.action.terminal.newplus", "$(plus) Create New Integrated Terminal"), this.commandService)); const entries = terminalEntries.filter(e => { if (!searchValue) { diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 68add6effcc4..850f7921cd8e 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -349,16 +349,6 @@ export interface ITerminalInstance { */ setVisible(visible: boolean): void; - /** - * Attach a listener to the data stream from the terminal's pty process. - * - * @param listener The listener function which takes the processes' data stream (including - * ANSI escape sequences). - * - * @deprecated onLineData will replace this. - */ - onData(listener: (data: string) => void): IDisposable; - /** * Attach a listener to listen for new lines added to this terminal instance. * diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/scrollbar.css b/src/vs/workbench/parts/terminal/electron-browser/media/scrollbar.css index 0bff305aae40..70af76ab868a 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/scrollbar.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/scrollbar.css @@ -26,6 +26,7 @@ .monaco-workbench .panel.integrated-terminal .xterm:focus .xterm-viewport, .monaco-workbench .panel.integrated-terminal .xterm:hover .xterm-viewport { transition: opacity 100ms linear; + cursor: default; } .monaco-workbench .panel.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 46cc64e1c2fa..f5886a2d038e 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -823,22 +823,6 @@ export class TerminalInstance implements ITerminalInstance { return env; } - public onData(listener: (data: string) => void): lifecycle.IDisposable { - let callback = (message) => { - if (message.type === 'data') { - listener(message.content); - } - }; - this._process.on('message', callback); - return { - dispose: () => { - if (this._process) { - this._process.removeListener('message', callback); - } - } - }; - } - public onLineData(listener: (lineData: string) => void): lifecycle.IDisposable { this._onLineDataListeners.push(listener); return { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 2dd16ba5775d..626397cd57bd 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -26,6 +26,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import URI from 'vs/base/common/uri'; import { PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { TERMINAL_BACKGROUND_COLOR } from 'vs/workbench/parts/terminal/electron-browser/terminalColorRegistry'; +import { DataTransfers } from 'vs/base/browser/dnd'; export class TerminalPanel extends Panel { @@ -256,7 +257,7 @@ export class TerminalPanel extends Panel { } // Check if the file was dragged from the tree explorer - let uri = e.dataTransfer.getData('URL'); + let uri = e.dataTransfer.getData(DataTransfers.URL); if (uri) { uri = URI.parse(uri).path; } else if (e.dataTransfer.files.length > 0) { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index d498d16a71f7..871138e90c6b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -180,6 +180,7 @@ export class TerminalService extends AbstractTerminalService implements ITermina `${process.env['ProgramW6432']}\\Git\\usr\\bin\\bash.exe`, `${process.env['ProgramFiles']}\\Git\\bin\\bash.exe`, `${process.env['ProgramFiles']}\\Git\\usr\\bin\\bash.exe`, + `${process.env['LocalAppData']}\\Programs\\Git\\bin\\bash.exe`, ] }; const promises: TPromise<[string, string]>[] = []; @@ -220,7 +221,7 @@ export class TerminalService extends AbstractTerminalService implements ITermina message = nls.localize('terminalService.terminalCloseConfirmationPlural', "There are {0} active terminal sessions, do you want to kill them?", this.terminalInstances.length); } - return !this._messageService.confirmSync({ + return !this._messageService.confirm({ message, type: 'warning', }); diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.ts b/src/vs/workbench/parts/terminal/node/terminalProcess.ts index 1f06c0d80e84..c3ad10ecc9e6 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcess.ts @@ -113,7 +113,8 @@ function cleanEnv() { 'PTYSHELL', 'PTYCOLS', 'PTYROWS', - 'PTYSHELLCMDLINE' + 'PTYSHELLCMDLINE', + 'VSCODE_LOGS' ]; keys.forEach(function (key) { if (process.env[key]) { diff --git a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts index ef5d0a5455fd..bcc8babb0081 100644 --- a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts +++ b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts @@ -50,7 +50,7 @@ export class SelectColorThemeAction extends Action { const picks: IPickOpenEntry[] = [].concat( toEntries(themes.filter(t => t.type === LIGHT), localize('themes.category.light', "light themes")), toEntries(themes.filter(t => t.type === DARK), localize('themes.category.dark', "dark themes"), true), - toEntries(themes.filter(t => t.type === HIGH_CONTRAST), localize('themes.category.hc', "high constrast themes"), true), + toEntries(themes.filter(t => t.type === HIGH_CONTRAST), localize('themes.category.hc', "high contrast themes"), true), configurationEntries(this.extensionGalleryService, this.viewletService, 'category:themes', localize('installColorThemes', "Install Additional Color Themes...")) ); @@ -198,7 +198,7 @@ class GenerateColorThemeAction extends Action { colors: resultingColors, tokenColors: theme.tokenColors }, null, '\t'); - return this.editorService.openEditor({ contents, language: 'json' }); + return this.editorService.openEditor({ contents, language: 'jsonc' }); } } diff --git a/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.ts b/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.ts index 08d6000f9b33..f338e06acd71 100644 --- a/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.ts +++ b/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.ts @@ -15,7 +15,6 @@ import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/ import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IPreferencesService } from 'vs/workbench/parts/preferences/common/preferences'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -33,7 +32,6 @@ class UnsupportedWorkspaceSettingsContribution implements IWorkbenchContribution @IWorkspaceConfigurationService private workspaceConfigurationService: IWorkspaceConfigurationService, @IPreferencesService private preferencesService: IPreferencesService, @IMessageService private messageService: IMessageService, - @ITelemetryService private telemetryService: ITelemetryService, @IStorageService private storageService: IStorageService ) { lifecycleService.onShutdown(this.dispose, this); @@ -69,39 +67,23 @@ class UnsupportedWorkspaceSettingsContribution implements IWorkbenchContribution const message = nls.localize('unsupportedWorkspaceSettings', 'This Workspace contains settings that can only be set in User Settings. ({0})', unsupportedKeys.join(', ')); const openWorkspaceSettings = new Action('unsupportedWorkspaceSettings.openWorkspaceSettings', nls.localize('openWorkspaceSettings', 'Open Workspace Settings'), '', true, () => { - /* __GDPR__ - "workspace.settings.unsupported.review" : {} - */ - this.telemetryService.publicLog('workspace.settings.unsupported.review'); this.rememberWarningWasShown(); return this.preferencesService.openWorkspaceSettings(); }); const openDocumentation = new Action('unsupportedWorkspaceSettings.openDocumentation', nls.localize('openDocumentation', 'Learn More'), '', true, () => { - /* __GDPR__ - "workspace.settings.unsupported.documentation" : {} - */ - this.telemetryService.publicLog('workspace.settings.unsupported.documentation'); this.rememberWarningWasShown(); window.open('https://go.microsoft.com/fwlink/?linkid=839878'); // Don't change link. return TPromise.as(true); }); const close = new Action('unsupportedWorkspaceSettings.Ignore', nls.localize('ignore', 'Ignore'), '', true, () => { - /* __GDPR__ - "workspace.settings.unsupported.ignore" : {} - */ - this.telemetryService.publicLog('workspace.settings.unsupported.ignore'); this.rememberWarningWasShown(); return TPromise.as(true); }); const actions = [openWorkspaceSettings, openDocumentation, close]; this.messageService.show(Severity.Warning, { message, actions }); - /* __GDPR__ - "workspace.settings.unsupported.warning" : {} - */ - this.telemetryService.publicLog('workspace.settings.unsupported.warning'); } } diff --git a/src/vs/workbench/parts/update/electron-browser/media/code-icon.svg b/src/vs/workbench/parts/update/electron-browser/media/code-icon.svg new file mode 100644 index 000000000000..cc61f81ea5a2 --- /dev/null +++ b/src/vs/workbench/parts/update/electron-browser/media/code-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/update/electron-browser/media/update.contribution.css b/src/vs/workbench/parts/update/electron-browser/media/update.contribution.css index a12923fce44b..4e602f932a2a 100644 --- a/src/vs/workbench/parts/update/electron-browser/media/update.contribution.css +++ b/src/vs/workbench/parts/update/electron-browser/media/update.contribution.css @@ -6,4 +6,10 @@ .update-activity { -webkit-mask: url('update.svg') no-repeat 50% 50%; -webkit-mask-size: 22px; +} + +/* TODO@Ben this is a hack to overwrite the icon for release notes eitor */ +.file-icons-enabled .show-file-icons .release-notes-ext-file-icon.file-icon::before { + content: ' '; + background-image: url('code-icon.svg'); } \ No newline at end of file diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 7138a6e6e924..27632cdde542 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -23,12 +23,13 @@ import { WebviewEditor } from 'vs/workbench/parts/html/browser/webviewEditor'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IMode } from 'vs/editor/common/modes'; +import { IMode, TokenizationRegistry } from 'vs/editor/common/modes'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { onUnexpectedError } from 'vs/base/common/errors'; import { addGAParameters } from 'vs/platform/telemetry/node/telemetryNodeUtils'; +import { generateTokensCSSForColorMap } from 'vs/editor/common/modes/supports/tokenization'; -function renderBody(body: string): string { +function renderBody(body: string, css: string): string { return ` @@ -36,6 +37,7 @@ function renderBody(body: string): string { + ${body} `; @@ -95,7 +97,9 @@ export class ReleaseNotesEditor extends WebviewEditor { return `${tokenizeToString(code, modeId)}`; }; - const body = renderBody(marked(text, { renderer })); + const colorMap = TokenizationRegistry.getColorMap(); + const css = generateTokensCSSForColorMap(colorMap); + const body = renderBody(marked(text, { renderer }), css); this._webview = new WebView(this.content, this.partService.getContainer(Parts.EDITOR_PART), this._contextViewService, this.contextKey, this.findInputFocusContextKey); if (this.input && this.input instanceof ReleaseNotesInput) { const state = this.loadViewState(this.input.version); diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts index 83f6636b8773..65be6da23982 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts @@ -8,6 +8,7 @@ import { localize } from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { EditorInput } from 'vs/workbench/common/editor'; +import URI from 'vs/base/common/uri'; export class ReleaseNotesInput extends EditorInput { @@ -20,6 +21,10 @@ export class ReleaseNotesInput extends EditorInput { super(); } + getResource(): URI { + return URI.from({ scheme: 'release-notes', path: `${this._version}.release-notes` }); + } + getTypeId(): string { return ReleaseNotesInput.ID; } diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/parts/update/electron-browser/update.ts index 887119d62838..82166e122cdb 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.ts @@ -202,12 +202,13 @@ export class ProductContribution implements IWorkbenchContribution { @IStorageService storageService: IStorageService, @IInstantiationService instantiationService: IInstantiationService, @IMessageService messageService: IMessageService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService + @IWorkbenchEditorService editorService: IWorkbenchEditorService, + @IEnvironmentService environmentService: IEnvironmentService ) { const lastVersion = storageService.get(ProductContribution.KEY, StorageScope.GLOBAL, ''); // was there an update? if so, open release notes - if (product.releaseNotesUrl && lastVersion && pkg.version !== lastVersion) { + if (!environmentService.skipReleaseNotes && product.releaseNotesUrl && lastVersion && pkg.version !== lastVersion) { instantiationService.invokeFunction(loadReleaseNotes, pkg.version).then( text => editorService.openEditor(instantiationService.createInstance(ReleaseNotesInput, pkg.version, text), { pinned: true }), () => { diff --git a/src/vs/workbench/parts/watermark/electron-browser/watermark.ts b/src/vs/workbench/parts/watermark/electron-browser/watermark.ts index 59786dcadda5..e750345e23c1 100644 --- a/src/vs/workbench/parts/watermark/electron-browser/watermark.ts +++ b/src/vs/workbench/parts/watermark/electron-browser/watermark.ts @@ -21,7 +21,7 @@ import { OpenRecentAction } from 'vs/workbench/electron-browser/actions'; import { GlobalNewUntitledFileAction } from 'vs/workbench/parts/files/electron-browser/fileActions'; import { OpenFolderAction, OpenFileFolderAction, OpenFileAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; -import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; +import { Parts, IPartService, Dimension } from 'vs/workbench/services/part/common/partService'; import { StartAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { FindInFilesActionId } from 'vs/workbench/parts/search/common/constants'; import { ToggleTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; @@ -176,15 +176,12 @@ export class WatermarkContribution implements IWorkbenchContribution { }); }); }; - const layout = () => { - const { height } = container.getBoundingClientRect(); - container.classList[height <= 478 ? 'add' : 'remove']('max-height-478px'); - }; update(); this.watermark.build(container.firstElementChild as HTMLElement, 0); - layout(); this.toDispose.push(this.keybindingService.onDidUpdateKeybindings(update)); - this.toDispose.push(this.partService.onEditorLayout(layout)); + this.toDispose.push(this.partService.onEditorLayout(({ height }: Dimension) => { + container.classList[height <= 478 ? 'add' : 'remove']('max-height-478px'); + })); } private destroy(): void { diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index 7e00386d74b9..5be0939632bb 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -38,6 +38,7 @@ import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/commo import { IStorageService } from 'vs/platform/storage/common/storage'; import { IWorkspaceIdentifier, getWorkspaceLabel, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IEditorInputFactory, EditorInput } from 'vs/workbench/common/editor'; +import { getIdAndVersionFromLocalExtensionId } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; used(); @@ -341,7 +342,7 @@ class WelcomePage { this.updateInstalledExtensions(container, installedExtensions); this.disposables.push(this.instantiationService.invokeFunction(onExtensionChanged)(ids => { for (const id of ids) { - if (container.querySelector(`.installExtension[data-extension="${id}"], .enabledExtension[data-extension="${id}"]`)) { + if (container.querySelector(`.installExtension[data-extension="${stripVersion(id.id)}"], .enabledExtension[data-extension="${stripVersion(id.id)}"]`)) { const installedExtensions = this.instantiationService.invokeFunction(getInstalledExtensions); this.updateInstalledExtensions(container, installedExtensions); break; @@ -398,7 +399,7 @@ class WelcomePage { extensionId: extensionSuggestion.id, }); this.instantiationService.invokeFunction(getInstalledExtensions).then(extensions => { - const installedExtension = arrays.first(extensions, extension => extension.identifier.id === extensionSuggestion.id); + const installedExtension = arrays.first(extensions, extension => stripVersion(extension.identifier.id) === extensionSuggestion.id); if (installedExtension && installedExtension.globallyEnabled) { /* __GDPR__FRAGMENT__ "WelcomePageInstalled-1" : { @@ -415,18 +416,18 @@ class WelcomePage { this.messageService.show(Severity.Info, strings.alreadyInstalled.replace('{0}', extensionSuggestion.name)); return; } - const foundAndInstalled = installedExtension ? TPromise.as(true) : this.extensionGalleryService.query({ names: [extensionSuggestion.id], source: telemetryFrom }) + const foundAndInstalled = installedExtension ? TPromise.as(installedExtension.identifier) : this.extensionGalleryService.query({ names: [extensionSuggestion.id], source: telemetryFrom }) .then(result => { const [extension] = result.firstPage; if (!extension) { - return false; + return null; } return this.extensionManagementService.installFromGallery(extension) .then(() => { // TODO: Do this as part of the install to avoid multiple events. - return this.extensionEnablementService.setEnablement({ id: extensionSuggestion.id }, EnablementState.Disabled); + return this.extensionEnablementService.setEnablement(extension.identifier, EnablementState.Disabled); }).then(() => { - return true; + return extension.identifier; }); }); this.messageService.show(Severity.Info, { @@ -444,10 +445,10 @@ class WelcomePage { .map(extension => { return this.extensionEnablementService.setEnablement(extension.identifier, EnablementState.Disabled); }) : []).then(() => { - return foundAndInstalled.then(found => { + return foundAndInstalled.then(foundExtension => { messageDelay.cancel(); - if (found) { - return this.extensionEnablementService.setEnablement({ id: extensionSuggestion.id }, EnablementState.Enabled) + if (foundExtension) { + return this.extensionEnablementService.setEnablement(foundExtension, EnablementState.Enabled) .then(() => { /* __GDPR__FRAGMENT__ "WelcomePageInstalled-2" : { @@ -558,7 +559,7 @@ class WelcomePage { elements[i].classList.remove('installed'); } extensions.filter(ext => ext.globallyEnabled) - .map(ext => ext.identifier) + .map(ext => stripVersion(ext.identifier.id)) .forEach(id => { const install = container.querySelectorAll(`.installExtension[data-extension="${id}"]`); for (let i = 0; i < install.length; i++) { @@ -577,6 +578,10 @@ class WelcomePage { } } +function stripVersion(id: string): string { + return getIdAndVersionFromLocalExtensionId(id).id; +} + export class WelcomeInputFactory implements IEditorInputFactory { diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 1e35f3566490..422b30d7333f 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -172,19 +172,7 @@ export class WalkThroughPart extends BaseEditor { if (node instanceof HTMLAnchorElement && node.href) { let baseElement = window.document.getElementsByTagName('base')[0] || window.location; if (baseElement && node.href.indexOf(baseElement.href) >= 0 && node.hash) { - let scrollTarget = this.content.querySelector(node.hash); - /* __GDPR__ - "revealInDocument" : { - "hash" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "broken": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('revealInDocument', { - hash: node.hash, - broken: !scrollTarget, - from: this.input instanceof WalkThroughInput ? this.input.getTelemetryFrom() : undefined - }); + const scrollTarget = this.content.querySelector(node.hash); const innerContent = this.content.firstElementChild; if (scrollTarget && innerContent) { const targetTop = scrollTarget.getBoundingClientRect().top - 20; @@ -210,18 +198,6 @@ export class WalkThroughPart extends BaseEditor { } private open(uri: URI) { - if (uri.scheme === 'http' || uri.scheme === 'https') { - /* __GDPR__ - "openExternal" : { - "uri" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('openExternal', { - uri: uri.toString(true), - from: this.input instanceof WalkThroughInput ? this.input.getTelemetryFrom() : undefined - }); - } if (uri.scheme === 'command' && uri.path === 'git.clone' && !CommandsRegistry.getCommand('git.clone')) { this.messageService.show(Severity.Info, localize('walkThrough.gitNotFound', "It looks like Git is not installed on your system.")); return; diff --git a/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts b/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts index a534a77b13bf..81b269fa5e65 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts @@ -13,8 +13,6 @@ import { telemetryURIDescriptor } from 'vs/platform/telemetry/common/telemetryUt import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { marked } from 'vs/base/common/marked/marked'; import { Schemas } from 'vs/base/common/network'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ILifecycleService, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; export class WalkThroughModel extends EditorModel { @@ -56,19 +54,15 @@ export class WalkThroughInput extends EditorInput { private promise: TPromise; - private resolveTime: number; private maxTopScroll = 0; private maxBottomScroll = 0; constructor( private options: WalkThroughInputOptions, - @ITelemetryService private telemetryService: ITelemetryService, - @ILifecycleService lifecycleService: ILifecycleService, @ITextModelService private textModelResolverService: ITextModelService, @IHashService private hashService: IHashService ) { super(); - this.disposables.push(lifecycleService.onShutdown(e => this.disposeTelemetry(e))); } getResource(): URI { @@ -110,7 +104,6 @@ export class WalkThroughInput extends EditorInput { resolve(refresh?: boolean): TPromise { if (!this.promise) { - this.resolveTelemetry(); this.promise = this.textModelResolverService.createModelReference(this.options.resource) .then(ref => { if (strings.endsWith(this.getResource().path, '.html')) { @@ -160,8 +153,6 @@ export class WalkThroughInput extends EditorInput { this.promise = null; } - this.disposeTelemetry(); - super.dispose(); } @@ -169,40 +160,4 @@ export class WalkThroughInput extends EditorInput { this.maxTopScroll = Math.max(this.maxTopScroll, topScroll); this.maxBottomScroll = Math.max(this.maxBottomScroll, bottomScroll); } - - private resolveTelemetry() { - if (!this.resolveTime) { - this.resolveTime = Date.now(); - /* __GDPR__ - "resolvingInput" : { - "target" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('resolvingInput', { - target: this.getTelemetryFrom(), - }); - } - } - - private disposeTelemetry(reason?: ShutdownReason) { - if (this.resolveTime) { - /* __GDPR__ - "disposingInput" : { - "target" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "timeSpent": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "reason": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "maxTopScroll": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "maxBottomScroll": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('disposingInput', { - target: this.getTelemetryFrom(), - timeSpent: (Date.now() - this.resolveTime) / 60, - reason: reason ? ShutdownReason[reason] : 'DISPOSE', - maxTopScroll: this.maxTopScroll, - maxBottomScroll: this.maxBottomScroll, - }); - this.resolveTime = null; - } - } } diff --git a/src/vs/workbench/services/backup/common/backup.ts b/src/vs/workbench/services/backup/common/backup.ts index c43688b8b486..25c3948dced9 100644 --- a/src/vs/workbench/services/backup/common/backup.ts +++ b/src/vs/workbench/services/backup/common/backup.ts @@ -40,6 +40,14 @@ export interface IBackupFileService { */ loadBackupResource(resource: Uri): TPromise; + /** + * Given a resource, returns the associated backup resource. + * + * @param resource The resource to get the backup resource for. + * @return The backup resource. + */ + toBackupResource(resource: Uri): Uri; + /** * Backs up a resource. * diff --git a/src/vs/workbench/services/backup/node/backupFileService.ts b/src/vs/workbench/services/backup/node/backupFileService.ts index af5ca6bda2b5..1a00d797b91f 100644 --- a/src/vs/workbench/services/backup/node/backupFileService.ts +++ b/src/vs/workbench/services/backup/node/backupFileService.ts @@ -135,7 +135,7 @@ export class BackupFileService implements IBackupFileService { public loadBackupResource(resource: Uri): TPromise { return this.ready.then(model => { - const backupResource = this.getBackupResource(resource); + const backupResource = this.toBackupResource(resource); if (!backupResource) { return void 0; } @@ -155,7 +155,7 @@ export class BackupFileService implements IBackupFileService { } return this.ready.then(model => { - const backupResource = this.getBackupResource(resource); + const backupResource = this.toBackupResource(resource); if (!backupResource) { return void 0; } @@ -175,7 +175,7 @@ export class BackupFileService implements IBackupFileService { public discardResourceBackup(resource: Uri): TPromise { return this.ready.then(model => { - const backupResource = this.getBackupResource(resource); + const backupResource = this.toBackupResource(resource); if (!backupResource) { return void 0; } @@ -218,7 +218,7 @@ export class BackupFileService implements IBackupFileService { return textSource.lines.slice(1).join(textSource.EOL); // The first line of a backup text file is the file name } - protected getBackupResource(resource: Uri): Uri { + public toBackupResource(resource: Uri): Uri { if (!this.backupEnabled) { return null; } diff --git a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts index 5309017f4ea6..66be679cdde5 100644 --- a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts @@ -41,8 +41,8 @@ class TestBackupFileService extends BackupFileService { super(workspaceBackupPath, fileService); } - public getBackupResource(resource: Uri): Uri { - return super.getBackupResource(resource); + public toBackupResource(resource: Uri): Uri { + return super.toBackupResource(resource); } } @@ -73,7 +73,7 @@ suite('BackupFileService', () => { const workspaceHash = crypto.createHash('md5').update(workspaceResource.fsPath).digest('hex'); const filePathHash = crypto.createHash('md5').update(backupResource.fsPath).digest('hex'); const expectedPath = Uri.file(path.join(backupHome, workspaceHash, 'file', filePathHash)).fsPath; - assert.equal(service.getBackupResource(backupResource).fsPath, expectedPath); + assert.equal(service.toBackupResource(backupResource).fsPath, expectedPath); }); test('should get the correct backup path for untitled files', () => { @@ -82,7 +82,7 @@ suite('BackupFileService', () => { const workspaceHash = crypto.createHash('md5').update(workspaceResource.fsPath).digest('hex'); const filePathHash = crypto.createHash('md5').update(backupResource.fsPath).digest('hex'); const expectedPath = Uri.file(path.join(backupHome, workspaceHash, 'untitled', filePathHash)).fsPath; - assert.equal(service.getBackupResource(backupResource).fsPath, expectedPath); + assert.equal(service.toBackupResource(backupResource).fsPath, expectedPath); }); }); diff --git a/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts b/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts index bc35c4cffb15..bdd9c346c22c 100644 --- a/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts @@ -149,6 +149,7 @@ function validateProperties(configuration: IConfigurationNode, extension: IExten const jsonRegistry = Registry.as(JSONExtensions.JSONContribution); jsonRegistry.registerSchema('vscode://schemas/workspaceConfig', { + allowComments: true, default: { folders: [ { diff --git a/src/vs/workbench/services/configuration/node/configuration.ts b/src/vs/workbench/services/configuration/node/configuration.ts index 79e24da0d55a..983bf2b902f1 100644 --- a/src/vs/workbench/services/configuration/node/configuration.ts +++ b/src/vs/workbench/services/configuration/node/configuration.ts @@ -24,6 +24,7 @@ import { JSONEditingService } from 'vs/workbench/services/configuration/node/jso import { WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { relative } from 'path'; +import { equals } from 'vs/base/common/objects'; // node.hs helper functions @@ -189,10 +190,9 @@ export class FolderConfiguration extends Disposable { } reprocess(): ConfigurationModel { - const oldKeys = this.getUnsupportedKeys(); + const oldContents = this._folderSettingsModelParser.folderSettingsModel.contents; this._folderSettingsModelParser.reprocess(); - const newKeys = this.getUnsupportedKeys(); - if (this.hasKeysChanged(oldKeys, newKeys)) { + if (!equals(oldContents, this._folderSettingsModelParser.folderSettingsModel.contents)) { this.consolidate(); } return this._cache; @@ -202,18 +202,6 @@ export class FolderConfiguration extends Disposable { return this._folderSettingsModelParser.folderSettingsModel.unsupportedKeys; } - private hasKeysChanged(oldKeys: string[], newKeys: string[]): boolean { - if (oldKeys.length !== newKeys.length) { - return true; - } - for (const key of oldKeys) { - if (newKeys.indexOf(key) === -1) { - return true; - } - } - return false; - } - private consolidate(): void { this._cache = this._folderSettingsModelParser.folderSettingsModel.merge(...this._standAloneConfigurations); } diff --git a/src/vs/workbench/services/configuration/node/configurationEditingService.ts b/src/vs/workbench/services/configuration/node/configurationEditingService.ts index 3c634052370e..7d04f269ea96 100644 --- a/src/vs/workbench/services/configuration/node/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/node/configurationEditingService.ts @@ -156,7 +156,7 @@ export class ConfigurationEditingService { private writeToBuffer(model: editorCommon.IModel, operation: IConfigurationEditOperation, save: boolean): TPromise { const edit = this.getEdits(model, operation)[0]; - if (this.applyEditsToBuffer(edit, model) && save) { + if (edit && this.applyEditsToBuffer(edit, model) && save) { return this.textFileService.save(operation.resource, { skipSaveParticipants: true /* programmatic change */ }); } return TPromise.as(null); diff --git a/src/vs/workbench/services/configuration/node/configurationService.ts b/src/vs/workbench/services/configuration/node/configurationService.ts index dc36a6be7225..d5c3af13b8b2 100644 --- a/src/vs/workbench/services/configuration/node/configurationService.ts +++ b/src/vs/workbench/services/configuration/node/configurationService.ts @@ -25,7 +25,7 @@ import { IConfigurationChangeEvent, ConfigurationTarget, IConfigurationOverrides import { Configuration, WorkspaceConfigurationChangeEvent, AllKeysConfigurationChangeEvent } from 'vs/workbench/services/configuration/common/configurationModels'; import { IWorkspaceConfigurationService, FOLDER_CONFIG_FOLDER_NAME, defaultSettingsSchemaId, userSettingsSchemaId, workspaceSettingsSchemaId, folderSettingsSchemaId } from 'vs/workbench/services/configuration/common/configuration'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IConfigurationNode, IConfigurationRegistry, Extensions, settingsSchema, resourceSettingsSchema } from 'vs/platform/configuration/common/configurationRegistry'; +import { IConfigurationNode, IConfigurationRegistry, Extensions, settingsSchema, resourceSettingsSchema, IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; import { createHash } from 'crypto'; import { getWorkspaceLabel, IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IStoredWorkspaceFolder, isStoredWorkspaceFolder, IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; @@ -717,28 +717,33 @@ export class DefaultConfigurationExportHelper { } private getConfigModel(): IConfigurationExport { - const configurations = Registry.as(Extensions.Configuration).getConfigurations().slice(); + const configRegistry = Registry.as(Extensions.Configuration); + const configurations = configRegistry.getConfigurations().slice(); const settings: IExportedConfigurationNode[] = []; + + const processProperty = (name: string, prop: IConfigurationPropertySchema) => { + const propDetails: IExportedConfigurationNode = { + name, + description: prop.description, + default: prop.default, + type: prop.type + }; + + if (prop.enum) { + propDetails.enum = prop.enum; + } + + if (prop.enumDescriptions) { + propDetails.enumDescriptions = prop.enumDescriptions; + } + + settings.push(propDetails); + }; + const processConfig = (config: IConfigurationNode) => { if (config.properties) { for (let name in config.properties) { - const prop = config.properties[name]; - const propDetails: IExportedConfigurationNode = { - name, - description: prop.description, - default: prop.default, - type: prop.type - }; - - if (prop.enum) { - propDetails.enum = prop.enum; - } - - if (prop.enumDescriptions) { - propDetails.enumDescriptions = prop.enumDescriptions; - } - - settings.push(propDetails); + processProperty(name, config.properties[name]); } } @@ -749,6 +754,11 @@ export class DefaultConfigurationExportHelper { configurations.forEach(processConfig); + const excludedProps = configRegistry.getExcludedConfigurationProperties(); + for (let name in excludedProps) { + processProperty(name, excludedProps[name]); + } + const result: IConfigurationExport = { settings: settings.sort((a, b) => a.name.localeCompare(b.name)), buildTime: Date.now(), diff --git a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts index f18818ca54c1..f0d58534de49 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts @@ -205,6 +205,28 @@ suite('ConfigurationEditingService', () => { }); }); + test('remove an existing setting - existing file', () => { + fs.writeFileSync(globalSettingsFile, '{ "my.super.setting": "my.super.value", "configurationEditing.service.testSetting": "value" }'); + return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: undefined }) + .then(() => { + const contents = fs.readFileSync(globalSettingsFile).toString('utf8'); + const parsed = json.parse(contents); + assert.deepEqual(Object.keys(parsed), ['my.super.setting']); + assert.equal(parsed['my.super.setting'], 'my.super.value'); + }); + }); + + test('remove non existing setting - existing file', () => { + fs.writeFileSync(globalSettingsFile, '{ "my.super.setting": "my.super.value" }'); + return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: undefined }) + .then(() => { + const contents = fs.readFileSync(globalSettingsFile).toString('utf8'); + const parsed = json.parse(contents); + assert.deepEqual(Object.keys(parsed), ['my.super.setting']); + assert.equal(parsed['my.super.setting'], 'my.super.value'); + }); + }); + test('write workspace standalone setting - empty file', () => { return testObject.writeConfiguration(ConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }) .then(() => { diff --git a/src/vs/workbench/services/configuration/test/node/configurationService.test.ts b/src/vs/workbench/services/configuration/test/node/configurationService.test.ts index eaa5fa0c3371..d41ac767a690 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/node/configurationService.test.ts @@ -968,6 +968,26 @@ suite('WorkspaceConfigurationService - Multiroot', () => { }); }); + test('resource setting in folder is read after it is registered later', () => { + fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewResourceSetting2": "workspaceFolderValue" }'); + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration, { key: 'settings', value: { 'configurationService.workspace.testNewResourceSetting2': 'workspaceValue' } }, true) + .then(() => testObject.reloadConfiguration()) + .then(() => { + configurationRegistry.registerConfiguration({ + 'id': '_test', + 'type': 'object', + 'properties': { + 'configurationService.workspace.testNewResourceSetting2': { + 'type': 'string', + 'default': 'isSet', + scope: ConfigurationScope.RESOURCE + } + } + }); + assert.equal(testObject.getValue('configurationService.workspace.testNewResourceSetting2', { resource: workspaceContextService.getWorkspace().folders[0].uri }), 'workspaceFolderValue'); + }); + }); + test('inspect', () => { let actual = testObject.inspect('something.missing'); assert.equal(actual.default, void 0); diff --git a/src/vs/workbench/services/editor/common/editorService.ts b/src/vs/workbench/services/editor/common/editorService.ts index d779f2ff94b4..1debca50ef74 100644 --- a/src/vs/workbench/services/editor/common/editorService.ts +++ b/src/vs/workbench/services/editor/common/editorService.ts @@ -280,7 +280,7 @@ export class WorkbenchEditorService implements IWorkbenchEditorService { if (resourceDiffInput.leftResource && resourceDiffInput.rightResource) { const leftInput = this.createInput({ resource: resourceDiffInput.leftResource }); const rightInput = this.createInput({ resource: resourceDiffInput.rightResource }); - const label = resourceDiffInput.label || this.toDiffLabel(resourceDiffInput.leftResource, resourceDiffInput.rightResource, this.workspaceContextService, this.environmentService); + const label = resourceDiffInput.label || nls.localize('compareLabels', "{0} ↔ {1}", this.toDiffLabel(leftInput, this.workspaceContextService, this.environmentService), this.toDiffLabel(rightInput, this.workspaceContextService, this.environmentService)); return new DiffEditorInput(label, resourceDiffInput.description, leftInput, rightInput); } @@ -352,11 +352,16 @@ export class WorkbenchEditorService implements IWorkbenchEditorService { return input; } - private toDiffLabel(res1: URI, res2: URI, context: IWorkspaceContextService, environment: IEnvironmentService): string { - const leftName = getPathLabel(res1.fsPath, context, environment); - const rightName = getPathLabel(res2.fsPath, context, environment); + private toDiffLabel(input: EditorInput, context: IWorkspaceContextService, environment: IEnvironmentService): string { + const res = input.getResource(); - return nls.localize('compareLabels', "{0} ↔ {1}", leftName, rightName); + // Do not try to extract any paths from simple untitled editors + if (res.scheme === 'untitled' && !this.untitledEditorService.hasAssociatedFilePath(res)) { + return input.getName(); + } + + // Otherwise: for diff labels prefer to see the path as part of the label + return getPathLabel(res.fsPath, context, environment); } } diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index df0c9c7e0e56..4e881ab0b2ff 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -55,6 +55,7 @@ export class ExtensionHostProcessWorker { // Resources, in order they get acquired/created when .start() is called: private _namedPipeServer: Server; + private _inspectPort: number; private _extensionHostProcess: ChildProcess; private _extensionHostConnection: Socket; private _messageProtocol: TPromise; @@ -130,10 +131,9 @@ export class ExtensionHostProcessWorker { } if (!this._messageProtocol) { - this._messageProtocol = TPromise.join([this._tryListenOnPipe(), this._tryFindDebugPort()]).then((data: [string, number]) => { + this._messageProtocol = TPromise.join([this._tryListenOnPipe(), this._tryFindDebugPort()]).then(data => { const pipeName = data[0]; - // The port will be 0 if there's no need to debug or if a free port was not found - const port = data[1]; + const portData = data[1]; const opts = { env: objects.mixin(objects.deepClone(process.env), { @@ -151,12 +151,22 @@ export class ExtensionHostProcessWorker { // We detach because we have noticed that when the renderer exits, its child processes // (i.e. extension host) are taken down in a brutal fashion by the OS detached: !!isWindows, - execArgv: port - ? ['--nolazy', (this._isExtensionDevDebugBrk ? '--inspect-brk=' : '--inspect=') + port] - : undefined, + execArgv: undefined, silent: true }; + if (portData.actual) { + opts.execArgv = [ + '--nolazy', + (this._isExtensionDevDebugBrk ? '--inspect-brk=' : '--inspect=') + portData.actual + ]; + if (!portData.expected) { + // No one asked for 'inspect' or 'inspect-brk', only us. We add another + // option such that the extension host can manipulate the execArgv array + opts.env.VSCODE_PREVENT_FOREIGN_INSPECT = true; + } + } + const crashReporterOptions = this._crashReporterService.getChildProcessStartOptions('extensionHost'); if (crashReporterOptions) { opts.env.CRASH_REPORTER_START_OPTIONS = JSON.stringify(crashReporterOptions); @@ -207,15 +217,16 @@ export class ExtensionHostProcessWorker { this._extensionHostProcess.on('exit', (code: number, signal: string) => this._onExtHostProcessExit(code, signal)); // Notify debugger that we are ready to attach to the process if we run a development extension - if (this._isExtensionDevHost && port) { + if (this._isExtensionDevHost && portData.actual) { this._broadcastService.broadcast({ channel: EXTENSION_ATTACH_BROADCAST_CHANNEL, payload: { debugId: this._environmentService.debugExtensionHost.debugId, - port + port: portData.actual } }); } + this._inspectPort = portData.actual; // Help in case we fail to start it let startupTimeoutHandle: number; @@ -259,26 +270,27 @@ export class ExtensionHostProcessWorker { /** * Find a free port if extension host debugging is enabled. */ - private _tryFindDebugPort(): TPromise { - const extensionHostPort = this._environmentService.debugExtensionHost.port; - if (typeof extensionHostPort !== 'number') { - return TPromise.wrap(0); + private _tryFindDebugPort(): TPromise<{ expected: number; actual: number }> { + let expected: number; + let startPort = 9333; + if (typeof this._environmentService.debugExtensionHost.port === 'number') { + startPort = expected = this._environmentService.debugExtensionHost.port; } - return new TPromise((c, e) => { - findFreePort(extensionHostPort, 10 /* try 10 ports */, 5000 /* try up to 5 seconds */, (port) => { + return new TPromise((c, e) => { + return findFreePort(startPort, 10 /* try 10 ports */, 5000 /* try up to 5 seconds */).then(port => { if (!port) { console.warn('%c[Extension Host] %cCould not find a free port for debugging', 'color: blue', 'color: black'); - return c(void 0); - } - if (port !== extensionHostPort) { - console.warn(`%c[Extension Host] %cProvided debugging port ${extensionHostPort} is not free, using ${port} instead.`, 'color: blue', 'color: black'); - } - if (this._isExtensionDevDebugBrk) { - console.warn(`%c[Extension Host] %cSTOPPED on first line for debugging on port ${port}`, 'color: blue', 'color: black'); } else { - console.info(`%c[Extension Host] %cdebugger listening on port ${port}`, 'color: blue', 'color: black'); + if (expected && port !== expected) { + console.warn(`%c[Extension Host] %cProvided debugging port ${expected} is not free, using ${port} instead.`, 'color: blue', 'color: black'); + } + if (this._isExtensionDevDebugBrk) { + console.warn(`%c[Extension Host] %cSTOPPED on first line for debugging on port ${port}`, 'color: blue', 'color: black'); + } else { + console.info(`%c[Extension Host] %cdebugger listening on port ${port}`, 'color: blue', 'color: black'); + } } - return c(port); + return c({ expected, actual: port }); }); }); } @@ -363,7 +375,10 @@ export class ExtensionHostProcessWorker { extensions: extensionDescriptions, // Send configurations scopes only in development mode. configuration: !this._environmentService.isBuilt || this._environmentService.isExtensionDevelopment ? { ...configurationData, configurationScopes: getScopes(this._configurationService.keys().default) } : configurationData, - telemetryInfo + telemetryInfo, + args: this._environmentService.args, + execPath: this._environmentService.execPath, + windowId: this._windowService.getCurrentWindowId() }; return r; }); @@ -426,6 +441,10 @@ export class ExtensionHostProcessWorker { } } + public getInspectPort(): number { + return this._inspectPort; + } + public terminate(): void { if (this._terminating) { return; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.ts new file mode 100644 index 000000000000..2b77e490063a --- /dev/null +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.ts @@ -0,0 +1,154 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { IExtensionService, IExtensionDescription, ProfileSession, IExtensionHostProfile, ProfileSegmentId } from 'vs/platform/extensions/common/extensions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { localize } from 'vs/nls'; +import { TernarySearchTree } from 'vs/base/common/map'; +import { realpathSync } from 'vs/base/node/extfs'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { IStatusbarService, StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; +import { writeFile } from 'vs/base/node/pfs'; +import * as path from 'path'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { setTimeout } from 'timers'; +import { Profile, ProfileNode } from 'v8-inspect-profiler'; + +export class ExtensionHostProfiler { + + constructor(private readonly _port: number, @IExtensionService private readonly _extensionService: IExtensionService) { + } + + public start(): TPromise { + return TPromise.wrap(import('v8-inspect-profiler')).then(profiler => { + return profiler.startProfiling({ port: this._port }).then(session => { + return { + stop: () => { + return TPromise.wrap(session.stop()).then(profile => { + return this._extensionService.getExtensions().then(extensions => { + return this.distill(profile.profile, extensions); + }); + }); + } + }; + }); + }); + } + + private distill(profile: Profile, extensions: IExtensionDescription[]): IExtensionHostProfile { + let searchTree = TernarySearchTree.forPaths(); + for (let extension of extensions) { + searchTree.set(realpathSync(extension.extensionFolderPath), extension); + } + + let nodes = profile.nodes; + let idsToNodes = new Map(); + let idsToSegmentId = new Map(); + for (let node of nodes) { + idsToNodes.set(node.id, node); + } + + function visit(node: ProfileNode, segmentId: ProfileSegmentId) { + if (!segmentId) { + switch (node.callFrame.functionName) { + case '(root)': + break; + case '(program)': + segmentId = 'program'; + break; + case '(garbage collector)': + segmentId = 'gc'; + break; + default: + segmentId = 'self'; + break; + } + } else if (segmentId === 'self' && node.callFrame.url) { + let extension = searchTree.findSubstr(node.callFrame.url); + if (extension) { + segmentId = extension.id; + } + } + idsToSegmentId.set(node.id, segmentId); + + if (node.children) { + for (let child of node.children) { + visit(idsToNodes.get(child), segmentId); + } + } + } + visit(nodes[0], null); + + let samples = profile.samples; + let timeDeltas = profile.timeDeltas; + let distilledDeltas: number[] = []; + let distilledIds: ProfileSegmentId[] = []; + + let currSegmentTime = 0; + let currSegmentId = void 0; + for (let i = 0; i < samples.length; i++) { + let id = samples[i]; + let segmentId = idsToSegmentId.get(id); + if (segmentId !== currSegmentId) { + if (currSegmentId) { + distilledIds.push(currSegmentId); + distilledDeltas.push(currSegmentTime); + } + currSegmentId = segmentId; + currSegmentTime = 0; + } + currSegmentTime += timeDeltas[i]; + } + if (currSegmentId) { + distilledIds.push(currSegmentId); + distilledDeltas.push(currSegmentTime); + } + idsToNodes = null; + idsToSegmentId = null; + searchTree = null; + + return { + startTime: profile.startTime, + endTime: profile.endTime, + deltas: distilledDeltas, + ids: distilledIds, + data: profile, + getAggregatedTimes: () => { + let segmentsToTime = new Map(); + for (let i = 0; i < distilledIds.length; i++) { + let id = distilledIds[i]; + segmentsToTime.set(id, (segmentsToTime.get(id) || 0) + distilledDeltas[i]); + } + return segmentsToTime; + } + }; + } +} + + +CommandsRegistry.registerCommand('exthost.profile.start', async accessor => { + const statusbarService = accessor.get(IStatusbarService); + const extensionService = accessor.get(IExtensionService); + const environmentService = accessor.get(IEnvironmentService); + + const handle = statusbarService.addEntry({ text: localize('message', "$(zap) Profiling Extension Host...") }, StatusbarAlignment.LEFT); + + extensionService.startExtensionHostProfile().then(session => { + setTimeout(() => { + session.stop().then(result => { + result.getAggregatedTimes().forEach((val, index) => { + console.log(`${index} : ${Math.round(val / 1000)} ms`); + }); + let profilePath = path.join(environmentService.userHome, 'extHostProfile.cpuprofile'); + console.log(`Saving profile at ${profilePath}`); + return writeFile(profilePath, JSON.stringify(result.data)); + }).then(() => { + handle.dispose(); + }); + }, 5000); + }); +}); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts b/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts index 4204b5715a12..b0b0f3001770 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts @@ -6,30 +6,25 @@ 'use strict'; import * as nls from 'vs/nls'; -import * as Platform from 'vs/base/common/platform'; -import pfs = require('vs/base/node/pfs'); +import * as pfs from 'vs/base/node/pfs'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { TPromise } from 'vs/base/common/winjs.base'; -import { groupBy, values } from 'vs/base/common/collections'; import { join, normalize, extname } from 'path'; -import json = require('vs/base/common/json'); -import Types = require('vs/base/common/types'); +import * as json from 'vs/base/common/json'; +import * as types from 'vs/base/common/types'; import { isValidExtensionDescription } from 'vs/platform/extensions/node/extensionValidator'; import * as semver from 'semver'; -import { getIdAndVersionFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { getIdAndVersionFromLocalExtensionId } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; +import { groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; const MANIFEST_FILE = 'package.json'; -const devMode = !!process.env['VSCODE_DEV']; -interface NlsConfiguration { - locale: string; - pseudo: boolean; +export interface NlsConfiguration { + readonly devMode: boolean; + readonly locale: string; + readonly pseudo: boolean; } -const nlsConfig: NlsConfiguration = { - locale: Platform.locale, - pseudo: Platform.locale === 'pseudo' -}; export interface ILog { error(source: string, message: string): void; @@ -39,11 +34,11 @@ export interface ILog { abstract class ExtensionManifestHandler { - protected _ourVersion: string; - protected _log: ILog; - protected _absoluteFolderPath: string; - protected _isBuiltin: boolean; - protected _absoluteManifestPath: string; + protected readonly _ourVersion: string; + protected readonly _log: ILog; + protected readonly _absoluteFolderPath: string; + protected readonly _isBuiltin: boolean; + protected readonly _absoluteManifestPath: string; constructor(ourVersion: string, log: ILog, absoluteFolderPath: string, isBuiltin: boolean) { this._ourVersion = ourVersion; @@ -82,6 +77,13 @@ class ExtensionManifestParser extends ExtensionManifestHandler { class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { + private readonly _nlsConfig: NlsConfiguration; + + constructor(ourVersion: string, log: ILog, absoluteFolderPath: string, isBuiltin: boolean, nlsConfig: NlsConfiguration) { + super(ourVersion, log, absoluteFolderPath, isBuiltin); + this._nlsConfig = nlsConfig; + } + public replaceNLS(extensionDescription: IExtensionDescription): TPromise { let extension = extname(this._absoluteManifestPath); let basename = this._absoluteManifestPath.substr(0, this._absoluteManifestPath.length - extension.length); @@ -90,7 +92,7 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { if (!exists) { return extensionDescription; } - return ExtensionManifestNLSReplacer.findMessageBundles(basename).then((messageBundle) => { + return ExtensionManifestNLSReplacer.findMessageBundles(this._nlsConfig, basename).then((messageBundle) => { if (!messageBundle.localized) { return extensionDescription; } @@ -106,7 +108,7 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { return extensionDescription; } - ExtensionManifestNLSReplacer._replaceNLStrings(extensionDescription, messages, originalMessages, this._log, this._absoluteFolderPath); + ExtensionManifestNLSReplacer._replaceNLStrings(this._nlsConfig, extensionDescription, messages, originalMessages, this._log, this._absoluteFolderPath); return extensionDescription; }); }, (err) => { @@ -136,7 +138,7 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { * Finds localized message bundle and the original (unlocalized) one. * If the localized file is not present, returns null for the original and marks original as localized. */ - private static findMessageBundles(basename: string): TPromise<{ localized: string, original: string }> { + private static findMessageBundles(nlsConfig: NlsConfiguration, basename: string): TPromise<{ localized: string, original: string }> { return new TPromise<{ localized: string, original: string }>((c, e, p) => { function loop(basename: string, locale: string): void { let toCheck = `${basename}.nls.${locale}.json`; @@ -154,7 +156,7 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { }); } - if (devMode || nlsConfig.pseudo || !nlsConfig.locale) { + if (nlsConfig.devMode || nlsConfig.pseudo || !nlsConfig.locale) { return c({ localized: basename + '.nls.json', original: null }); } loop(basename, nlsConfig.locale); @@ -165,10 +167,10 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { * This routine makes the following assumptions: * The root element is an object literal */ - private static _replaceNLStrings(literal: T, messages: { [key: string]: string; }, originalMessages: { [key: string]: string }, log: ILog, messageScope: string): void { + private static _replaceNLStrings(nlsConfig: NlsConfiguration, literal: T, messages: { [key: string]: string; }, originalMessages: { [key: string]: string }, log: ILog, messageScope: string): void { function processEntry(obj: any, key: string | number, command?: boolean) { let value = obj[key]; - if (Types.isString(value)) { + if (types.isString(value)) { let str = value; let length = str.length; if (length > 1 && str[0] === '%' && str[length - 1] === '%') { @@ -184,13 +186,13 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { log.warn(messageScope, nls.localize('missingNLSKey', "Couldn't find message for key {0}.", messageKey)); } } - } else if (Types.isObject(value)) { + } else if (types.isObject(value)) { for (let k in value) { if (value.hasOwnProperty(k)) { k === 'commands' ? processEntry(value, k, true) : processEntry(value, k, command); } } - } else if (Types.isArray(value)) { + } else if (types.isArray(value)) { for (let i = 0; i < value.length; i++) { processEntry(value, i, command); } @@ -251,17 +253,48 @@ class ExtensionManifestValidator extends ExtensionManifestHandler { } } +export class ExtensionScannerInput { + + public mtime: number; + + constructor( + public readonly ourVersion: string, + public readonly commit: string, + public readonly locale: string, + public readonly devMode: boolean, + public readonly absoluteFolderPath: string, + public readonly isBuiltin: boolean + ) { + // Keep empty!! (JSON.parse) + } + + public static createNLSConfig(input: ExtensionScannerInput): NlsConfiguration { + return { + devMode: input.devMode, + locale: input.locale, + pseudo: input.locale === 'pseudo' + }; + } + + public static equals(a: ExtensionScannerInput, b: ExtensionScannerInput): boolean { + return ( + a.ourVersion === b.ourVersion + && a.commit === b.commit + && a.locale === b.locale + && a.devMode === b.devMode + && a.absoluteFolderPath === b.absoluteFolderPath + && a.isBuiltin === b.isBuiltin + && a.mtime === b.mtime + ); + } +} + export class ExtensionScanner { /** * Read the extension defined in `absoluteFolderPath` */ - public static scanExtension( - version: string, - log: ILog, - absoluteFolderPath: string, - isBuiltin: boolean - ): TPromise { + private static scanExtension(version: string, log: ILog, absoluteFolderPath: string, isBuiltin: boolean, nlsConfig: NlsConfiguration): TPromise { absoluteFolderPath = normalize(absoluteFolderPath); let parser = new ExtensionManifestParser(version, log, absoluteFolderPath, isBuiltin); @@ -270,7 +303,7 @@ export class ExtensionScanner { return null; } - let nlsReplacer = new ExtensionManifestNLSReplacer(version, log, absoluteFolderPath, isBuiltin); + let nlsReplacer = new ExtensionManifestNLSReplacer(version, log, absoluteFolderPath, isBuiltin, nlsConfig); return nlsReplacer.replaceNLS(extensionDescription); }).then((extensionDescription) => { if (extensionDescription === null) { @@ -285,81 +318,89 @@ export class ExtensionScanner { /** * Scan a list of extensions defined in `absoluteFolderPath` */ - public static scanExtensions( - version: string, - log: ILog, - absoluteFolderPath: string, - isBuiltin: boolean - ): TPromise { - let obsolete = TPromise.as({}); + public static async scanExtensions(input: ExtensionScannerInput, log: ILog): TPromise { + const absoluteFolderPath = input.absoluteFolderPath; + const isBuiltin = input.isBuiltin; - if (!isBuiltin) { - obsolete = pfs.readFile(join(absoluteFolderPath, '.obsolete'), 'utf8') - .then(raw => JSON.parse(raw)) - .then(null, err => ({})); - } + try { + let obsolete: { [folderName: string]: boolean; } = {}; + if (!isBuiltin) { + try { + const obsoleteFileContents = await pfs.readFile(join(absoluteFolderPath, '.obsolete'), 'utf8'); + obsolete = JSON.parse(obsoleteFileContents); + } catch (err) { + // Don't care + } + } - return obsolete.then(obsolete => { - return pfs.readDirsInDir(absoluteFolderPath) - .then(folders => { - if (isBuiltin) { - return folders; + const rawFolders = await pfs.readDirsInDir(absoluteFolderPath); + let folders: string[] = null; + if (isBuiltin) { + folders = rawFolders; + } else { + // TODO: align with extensionsService + const nonGallery: string[] = []; + const gallery: string[] = []; + + rawFolders.forEach(folder => { + if (obsolete[folder]) { + return; } - // TODO: align with extensionsService - const nonGallery: string[] = []; - const gallery: { folder: string; id: string; version: string; }[] = []; + const { id, version } = getIdAndVersionFromLocalExtensionId(folder); - folders.forEach(folder => { - if (obsolete[folder]) { - return; - } - - const { id, version } = getIdAndVersionFromLocalExtensionId(folder); - - if (!id || !version) { - nonGallery.push(folder); - return; - } - - gallery.push({ folder, id, version }); - }); - - const byId = values(groupBy(gallery, p => p.id)); - const latest = byId.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version))[0]) - .map(a => a.folder); - - return [...nonGallery, ...latest]; - }) - .then(folders => TPromise.join(folders.map(f => this.scanExtension(version, log, join(absoluteFolderPath, f), isBuiltin)))) - .then(extensionDescriptions => extensionDescriptions.filter(item => item !== null)) - .then(null, err => { - log.error(absoluteFolderPath, err); - return []; + if (!id || !version) { + nonGallery.push(folder); + } else { + gallery.push(folder); + } }); - }); + + folders = [...nonGallery, ...gallery]; + } + + const nlsConfig = ExtensionScannerInput.createNLSConfig(input); + let extensionDescriptions = await TPromise.join(folders.map(f => this.scanExtension(input.ourVersion, log, join(absoluteFolderPath, f), isBuiltin, nlsConfig))); + extensionDescriptions = extensionDescriptions.filter(item => item !== null); + + if (!isBuiltin) { + // Filter out outdated extensions + const byExtension: IExtensionDescription[][] = groupByExtension(extensionDescriptions, e => ({ id: e.id, uuid: e.uuid })); + extensionDescriptions = byExtension.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version))[0]); + } + + extensionDescriptions.sort((a, b) => { + if (a.extensionFolderPath < b.extensionFolderPath) { + return -1; + } + return 1; + }); + return extensionDescriptions; + } catch (err) { + log.error(absoluteFolderPath, err); + return []; + } } /** * Combination of scanExtension and scanExtensions: If an extension manifest is found at root, we load just this extension, * otherwise we assume the folder contains multiple extensions. */ - public static scanOneOrMultipleExtensions( - version: string, - log: ILog, - absoluteFolderPath: string, - isBuiltin: boolean - ): TPromise { + public static scanOneOrMultipleExtensions(input: ExtensionScannerInput, log: ILog): TPromise { + const absoluteFolderPath = input.absoluteFolderPath; + const isBuiltin = input.isBuiltin; + return pfs.fileExists(join(absoluteFolderPath, MANIFEST_FILE)).then((exists) => { if (exists) { - return this.scanExtension(version, log, absoluteFolderPath, isBuiltin).then((extensionDescription) => { + const nlsConfig = ExtensionScannerInput.createNLSConfig(input); + return this.scanExtension(input.ourVersion, log, absoluteFolderPath, isBuiltin, nlsConfig).then((extensionDescription) => { if (extensionDescription === null) { return []; } return [extensionDescription]; }); } - return this.scanExtensions(version, log, absoluteFolderPath, isBuiltin); + return this.scanExtensions(input, log); }, (err) => { log.error(absoluteFolderPath, err); return []; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 0ec9fc30dfd3..01f086dea8d4 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -6,18 +6,21 @@ import * as nls from 'vs/nls'; import * as errors from 'vs/base/common/errors'; +import * as objects from 'vs/base/common/objects'; import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; import pkg from 'vs/platform/node/package'; import * as path from 'path'; +import * as pfs from 'vs/base/node/pfs'; import URI from 'vs/base/common/uri'; +import * as platform from 'vs/base/common/platform'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/node/extensionDescriptionRegistry'; -import { IMessage, IExtensionDescription, IExtensionsStatus, IExtensionService, ExtensionPointContribution, ActivationTimes } from 'vs/platform/extensions/common/extensions'; +import { IMessage, IExtensionDescription, IExtensionsStatus, IExtensionService, ExtensionPointContribution, ActivationTimes, IExtensionHostInformation, ProfileSession, USER_MANIFEST_CACHE_FILE, BUILTIN_MANIFEST_CACHE_FILE, MANIFEST_CACHE_FOLDER } from 'vs/platform/extensions/common/extensions'; import { IExtensionEnablementService, IExtensionIdentifier, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions, BetterMergeId, BetterMergeDisabledNowKey } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionsRegistry, ExtensionPoint, IExtensionPointUser, ExtensionMessageCollector, IExtensionPoint } from 'vs/platform/extensions/common/extensionsRegistry'; -import { ExtensionScanner, ILog } from 'vs/workbench/services/extensions/electron-browser/extensionPoints'; -import { IMessageService } from 'vs/platform/message/common/message'; +import { ExtensionScanner, ILog, ExtensionScannerInput } from 'vs/workbench/services/extensions/electron-browser/extensionPoints'; +import { IMessageService, CloseAction } from 'vs/platform/message/common/message'; import { ProxyIdentifier } from 'vs/workbench/services/thread/common/threadService'; import { ExtHostContext, ExtHostExtensionServiceShape, IExtHostContext, MainContext } from 'vs/workbench/api/node/extHost.protocol'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -30,11 +33,14 @@ import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { ExtHostCustomersRegistry } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { Action } from 'vs/base/common/actions'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { mark, time } from 'vs/base/common/performance'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Barrier } from 'vs/base/common/async'; import Event, { Emitter } from 'vs/base/common/event'; +import { ExtensionHostProfiler } from 'vs/workbench/services/extensions/electron-browser/extensionHostProfiler'; +import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; +import product from 'vs/platform/node/product'; const SystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', 'extensions')); @@ -52,7 +58,7 @@ function messageWithSource2(source: string, message: string): string { const hasOwnProperty = Object.hasOwnProperty; const NO_OP_VOID_PROMISE = TPromise.wrap(void 0); -export class ExtensionService implements IExtensionService { +export class ExtensionService extends Disposable implements IExtensionService { public _serviceBrand: any; private _onDidRegisterExtensions: Emitter; @@ -60,9 +66,11 @@ export class ExtensionService implements IExtensionService { private _registry: ExtensionDescriptionRegistry; private readonly _installedExtensionsReady: Barrier; private readonly _isDev: boolean; - private readonly _extensionsStatus: { [id: string]: IExtensionsStatus }; + private readonly _extensionsMessages: { [id: string]: IMessage[] }; private _allRequestedActivateEvents: { [activationEvent: string]: boolean; }; + private readonly _onDidChangeExtensionsStatus: Emitter = this._register(new Emitter()); + public readonly onDidChangeExtensionsStatus: Event = this._onDidChangeExtensionsStatus.event; // --- Members used per extension host process @@ -71,6 +79,7 @@ export class ExtensionService implements IExtensionService { */ private _extensionHostProcessFinishedActivateEvents: { [activationEvent: string]: boolean; }; private _extensionHostProcessActivationTimes: { [id: string]: ActivationTimes; }; + private _extensionHostExtensionRuntimeErrors: { [id: string]: Error[]; }; private _extensionHostProcessWorker: ExtensionHostProcessWorker; private _extensionHostProcessThreadService: MainThreadService; private _extensionHostProcessCustomers: IDisposable[]; @@ -89,16 +98,18 @@ export class ExtensionService implements IExtensionService { @IWindowService private readonly _windowService: IWindowService, @ILifecycleService lifecycleService: ILifecycleService ) { + super(); this._registry = null; this._installedExtensionsReady = new Barrier(); this._isDev = !this._environmentService.isBuilt || this._environmentService.isExtensionDevelopment; - this._extensionsStatus = {}; + this._extensionsMessages = {}; this._allRequestedActivateEvents = Object.create(null); this._onDidRegisterExtensions = new Emitter(); this._extensionHostProcessFinishedActivateEvents = Object.create(null); this._extensionHostProcessActivationTimes = Object.create(null); + this._extensionHostExtensionRuntimeErrors = Object.create(null); this._extensionHostProcessWorker = null; this._extensionHostProcessThreadService = null; this._extensionHostProcessCustomers = []; @@ -112,10 +123,23 @@ export class ExtensionService implements IExtensionService { }); } + public dispose(): void { + super.dispose(); + } + public get onDidRegisterExtensions(): Event { return this._onDidRegisterExtensions.event; } + public getExtensionHostInformation(): IExtensionHostInformation { + if (!this._extensionHostProcessWorker) { + throw errors.illegalState(); + } + return { + inspectPort: this._extensionHostProcessWorker.getInspectPort() + }; + } + public restartExtensionHost(): void { this._stopExtensionHostProcess(); this._startExtensionHostProcess(Object.keys(this._allRequestedActivateEvents)); @@ -130,8 +154,11 @@ export class ExtensionService implements IExtensionService { } private _stopExtensionHostProcess(): void { + const previouslyActivatedExtensionIds = Object.keys(this._extensionHostProcessActivationTimes); + this._extensionHostProcessFinishedActivateEvents = Object.create(null); this._extensionHostProcessActivationTimes = Object.create(null); + this._extensionHostExtensionRuntimeErrors = Object.create(null); if (this._extensionHostProcessWorker) { this._extensionHostProcessWorker.dispose(); this._extensionHostProcessWorker = null; @@ -150,6 +177,8 @@ export class ExtensionService implements IExtensionService { } this._extensionHostProcessCustomers = []; this._extensionHostProcessProxy = null; + + this._onDidChangeExtensionsStatus.fire(previouslyActivatedExtensionIds); } private _startExtensionHostProcess(initialActivationEvents: string[]): void { @@ -292,11 +321,30 @@ export class ExtensionService implements IExtensionService { } public getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { - return this._extensionsStatus; + let result: { [id: string]: IExtensionsStatus; } = Object.create(null); + if (this._registry) { + const extensions = this._registry.getAllExtensionDescriptions(); + for (let i = 0, len = extensions.length; i < len; i++) { + const extension = extensions[i]; + const id = extension.id; + result[id] = { + messages: this._extensionsMessages[id], + activationTimes: this._extensionHostProcessActivationTimes[id], + runtimeErrors: this._extensionHostExtensionRuntimeErrors[id], + }; + } + } + return result; } - public getExtensionsActivationTimes(): { [id: string]: ActivationTimes; } { - return this._extensionHostProcessActivationTimes; + public startExtensionHostProfile(): TPromise { + if (this._extensionHostProcessWorker) { + let port = this._extensionHostProcessWorker.getInspectPort(); + if (port) { + return this._instantiationService.createInstance(ExtensionHostProfiler, port).start(); + } + } + throw new Error('Extension host not running or no inspect port available'); } // ---- end IExtensionService @@ -305,37 +353,9 @@ export class ExtensionService implements IExtensionService { private _scanAndHandleExtensions(): void { - const log = new Logger((severity, source, message) => { - this._logOrShowMessage(severity, this._isDev ? messageWithSource2(source, message) : message); - }); - - ExtensionService._scanInstalledExtensions(this._environmentService, log) - .then((installedExtensions) => { - - // Migrate enablement service to use identifiers - this._extensionEnablementService.migrateToIdentifiers(installedExtensions); - - return this._getDisabledExtensions() - .then(disabledExtensions => { - /* __GDPR__ - "extensionsScanned" : { - "totalCount" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "disabledCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } - } - */ - this._telemetryService.publicLog('extensionsScanned', { - totalCount: installedExtensions.length, - disabledCount: disabledExtensions.length - }); - - if (disabledExtensions.length === 0) { - return installedExtensions; - } - return installedExtensions.filter(e => disabledExtensions.every(disabled => !areSameExtensions(disabled, e))); - }); - - }).then((extensionDescriptions) => { - this._registry = new ExtensionDescriptionRegistry(extensionDescriptions); + this._getRuntimeExtension() + .then(runtimeExtensons => { + this._registry = new ExtensionDescriptionRegistry(runtimeExtensons); let availableExtensions = this._registry.getAllExtensionDescriptions(); let extensionPoints = ExtensionsRegistry.getExtensionPoints(); @@ -354,30 +374,79 @@ export class ExtensionService implements IExtensionService { mark('extensionHostReady'); this._installedExtensionsReady.open(); this._onDidRegisterExtensions.fire(availableExtensions); + this._onDidChangeExtensionsStatus.fire(availableExtensions.map(e => e.id)); }); } - private _getDisabledExtensions(): TPromise { - return this._extensionEnablementService.getDisabledExtensions() - .then(disabledExtensions => { - const betterMergeExtensionIdentifier: IExtensionIdentifier = { id: BetterMergeId }; - if (disabledExtensions.some(d => d.id === betterMergeExtensionIdentifier.id)) { - return disabledExtensions; - } - return this._extensionEnablementService.setEnablement(betterMergeExtensionIdentifier, EnablementState.Disabled) - .then(() => { - this._storageService.store(BetterMergeDisabledNowKey, true); - return [...disabledExtensions, betterMergeExtensionIdentifier]; + private _getRuntimeExtension(): TPromise { + const log = new Logger((severity, source, message) => { + this._logOrShowMessage(severity, this._isDev ? messageWithSource2(source, message) : message); + }); + + return ExtensionService._scanInstalledExtensions(this._instantiationService, this._messageService, this._environmentService, log) + .then(({ system, user, development }) => { + this._extensionEnablementService.migrateToIdentifiers(user); // TODO: @sandy Remove it after couple of milestones + return this._extensionEnablementService.getDisabledExtensions() + .then(disabledExtensions => { + let result: { [extensionId: string]: IExtensionDescription; } = {}; + let extensionsToDisable: IExtensionIdentifier[] = []; + let userMigratedSystemExtensions: IExtensionIdentifier[] = [{ id: BetterMergeId }]; + + system.forEach((systemExtension) => { + // Disabling system extensions is not supported + result[systemExtension.id] = systemExtension; + }); + + user.forEach((userExtension) => { + if (result.hasOwnProperty(userExtension.id)) { + log.warn(userExtension.extensionFolderPath, nls.localize('overwritingExtension', "Overwriting extension {0} with {1}.", result[userExtension.id].extensionFolderPath, userExtension.extensionFolderPath)); + } + if (disabledExtensions.every(disabled => !areSameExtensions(disabled, userExtension))) { + // Check if the extension is changed to system extension + let userMigratedSystemExtension = userMigratedSystemExtensions.filter(userMigratedSystemExtension => areSameExtensions(userMigratedSystemExtension, { id: userExtension.id }))[0]; + if (userMigratedSystemExtension) { + extensionsToDisable.push(userMigratedSystemExtension); + } else { + result[userExtension.id] = userExtension; + } + } + }); + + development.forEach(developedExtension => { + log.info('', nls.localize('extensionUnderDevelopment', "Loading development extension at {0}", developedExtension.extensionFolderPath)); + if (result.hasOwnProperty(developedExtension.id)) { + log.warn(developedExtension.extensionFolderPath, nls.localize('overwritingExtension', "Overwriting extension {0} with {1}.", result[developedExtension.id].extensionFolderPath, developedExtension.extensionFolderPath)); + } + // Do not disable extensions under development + result[developedExtension.id] = developedExtension; + }); + + const runtimeExtensions = Object.keys(result).map(name => result[name]); + + this._telemetryService.publicLog('extensionsScanned', { + totalCount: runtimeExtensions.length, + disabledCount: disabledExtensions.length + }); + + if (extensionsToDisable.length) { + return TPromise.join(extensionsToDisable.map(e => this._extensionEnablementService.setEnablement(e, EnablementState.Disabled))) + .then(() => { + this._storageService.store(BetterMergeDisabledNowKey, true); + return runtimeExtensions; + }); + } else { + return runtimeExtensions; + } }); }); } private _handleExtensionPointMessage(msg: IMessage) { - if (!this._extensionsStatus[msg.source]) { - this._extensionsStatus[msg.source] = { messages: [] }; + if (!this._extensionsMessages[msg.source]) { + this._extensionsMessages[msg.source] = []; } - this._extensionsStatus[msg.source].messages.push(msg); + this._extensionsMessages[msg.source].push(msg); if (msg.source === this._environmentService.extensionDevelopmentPath) { // This message is about the extension currently being developed @@ -402,42 +471,157 @@ export class ExtensionService implements IExtensionService { } } - private static _scanInstalledExtensions(environmentService: IEnvironmentService, log: ILog): TPromise { - const version = pkg.version; - const builtinExtensions = ExtensionScanner.scanExtensions(version, log, SystemExtensionsRoot, true); - const userExtensions = environmentService.disableExtensions || !environmentService.extensionsPath ? TPromise.as([]) : ExtensionScanner.scanExtensions(version, log, environmentService.extensionsPath, false); - const developedExtensions = environmentService.disableExtensions || !environmentService.isExtensionDevelopment ? TPromise.as([]) : ExtensionScanner.scanOneOrMultipleExtensions(version, log, environmentService.extensionDevelopmentPath, false); + private static async _validateExtensionsCache(instantiationService: IInstantiationService, messageService: IMessageService, environmentService: IEnvironmentService, cacheKey: string, input: ExtensionScannerInput): TPromise { + const cacheFolder = path.join(environmentService.userDataPath, MANIFEST_CACHE_FOLDER); + const cacheFile = path.join(cacheFolder, cacheKey); - return TPromise.join([builtinExtensions, userExtensions, developedExtensions]).then((extensionDescriptions: IExtensionDescription[][]) => { - const builtinExtensions = extensionDescriptions[0]; - const userExtensions = extensionDescriptions[1]; - const developedExtensions = extensionDescriptions[2]; + const expected = await ExtensionScanner.scanExtensions(input, new NullLogger()); - let result: { [extensionId: string]: IExtensionDescription; } = {}; - builtinExtensions.forEach((builtinExtension) => { - result[builtinExtension.id] = builtinExtension; - }); - userExtensions.forEach((userExtension) => { - if (result.hasOwnProperty(userExtension.id)) { - log.warn(userExtension.extensionFolderPath, nls.localize('overwritingExtension', "Overwriting extension {0} with {1}.", result[userExtension.id].extensionFolderPath, userExtension.extensionFolderPath)); - } - result[userExtension.id] = userExtension; - }); - developedExtensions.forEach(developedExtension => { - log.info('', nls.localize('extensionUnderDevelopment', "Loading development extension at {0}", developedExtension.extensionFolderPath)); - if (result.hasOwnProperty(developedExtension.id)) { - log.warn(developedExtension.extensionFolderPath, nls.localize('overwritingExtension', "Overwriting extension {0} with {1}.", result[developedExtension.id].extensionFolderPath, developedExtension.extensionFolderPath)); - } - result[developedExtension.id] = developedExtension; - }); + const cacheContents = await this._readExtensionCache(environmentService, cacheKey); + const actual = cacheContents.result; - return Object.keys(result).map(name => result[name]); - }).then(null, err => { - log.error('', err); - return []; + if (objects.equals(expected, actual)) { + // Cache is valid and running with it is perfectly fine... + return; + } + + try { + await pfs.del(cacheFile); + } catch (err) { + errors.onUnexpectedError(err); + console.error(err); + } + + let message = nls.localize('extensionCache.invalid', "Extensions have been modified on disk. Please reload the window."); + messageService.show(Severity.Info, { + message: message, + actions: [ + instantiationService.createInstance(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL), + CloseAction + ] }); } + private static async _readExtensionCache(environmentService: IEnvironmentService, cacheKey: string): TPromise { + const cacheFolder = path.join(environmentService.userDataPath, MANIFEST_CACHE_FOLDER); + const cacheFile = path.join(cacheFolder, cacheKey); + + try { + const cacheRawContents = await pfs.readFile(cacheFile, 'utf8'); + return JSON.parse(cacheRawContents); + } catch (err) { + // That's ok... + } + + return null; + } + + private static async _writeExtensionCache(environmentService: IEnvironmentService, cacheKey: string, cacheContents: IExtensionCacheData): TPromise { + const cacheFolder = path.join(environmentService.userDataPath, MANIFEST_CACHE_FOLDER); + const cacheFile = path.join(cacheFolder, cacheKey); + + try { + await pfs.mkdirp(cacheFolder); + } catch (err) { + // That's ok... + } + + try { + await pfs.writeFile(cacheFile, JSON.stringify(cacheContents)); + } catch (err) { + // That's ok... + } + } + + private static async _scanExtensionsWithCache(instantiationService: IInstantiationService, messageService: IMessageService, environmentService: IEnvironmentService, cacheKey: string, input: ExtensionScannerInput, log: ILog): TPromise { + if (input.devMode) { + // Do not cache when running out of sources... + return ExtensionScanner.scanExtensions(input, log); + } + + try { + const folderStat = await pfs.stat(input.absoluteFolderPath); + input.mtime = folderStat.mtime.getTime(); + } catch (err) { + // That's ok... + } + + const cacheContents = await this._readExtensionCache(environmentService, cacheKey); + if (cacheContents && cacheContents.input && ExtensionScannerInput.equals(cacheContents.input, input)) { + // Validate the cache asynchronously after 5s + setTimeout(async () => { + try { + await this._validateExtensionsCache(instantiationService, messageService, environmentService, cacheKey, input); + } catch (err) { + errors.onUnexpectedError(err); + } + }, 5000); + return cacheContents.result; + } + + const counterLogger = new CounterLogger(log); + const result = await ExtensionScanner.scanExtensions(input, counterLogger); + if (counterLogger.errorCnt === 0) { + // Nothing bad happened => cache the result + const cacheContents: IExtensionCacheData = { + input: input, + result: result + }; + await this._writeExtensionCache(environmentService, cacheKey, cacheContents); + } + + return result; + } + + private static _scanInstalledExtensions(instantiationService: IInstantiationService, messageService: IMessageService, environmentService: IEnvironmentService, log: ILog): TPromise<{ system: IExtensionDescription[], user: IExtensionDescription[], development: IExtensionDescription[] }> { + const version = pkg.version; + const commit = product.commit; + const devMode = !!process.env['VSCODE_DEV']; + const locale = platform.locale; + + const builtinExtensions = this._scanExtensionsWithCache( + instantiationService, + messageService, + environmentService, + BUILTIN_MANIFEST_CACHE_FILE, + new ExtensionScannerInput(version, commit, locale, devMode, SystemExtensionsRoot, true), + log + ); + + const userExtensions = ( + environmentService.disableExtensions || !environmentService.extensionsPath + ? TPromise.as([]) + : this._scanExtensionsWithCache( + instantiationService, + messageService, + environmentService, + USER_MANIFEST_CACHE_FILE, + new ExtensionScannerInput(version, commit, locale, devMode, environmentService.extensionsPath, false), + log + ) + ); + + // Always load developed extensions while extensions development + const developedExtensions = ( + environmentService.isExtensionDevelopment + ? ExtensionScanner.scanOneOrMultipleExtensions( + new ExtensionScannerInput(version, commit, locale, devMode, environmentService.extensionDevelopmentPath, false), log + ) + : TPromise.as([]) + ); + + return TPromise.join([builtinExtensions, userExtensions, developedExtensions]) + .then((extensionDescriptions: IExtensionDescription[][]) => { + const system = extensionDescriptions[0]; + const user = extensionDescriptions[1]; + const development = extensionDescriptions[2]; + return { system, user, development }; + }).then(null, err => { + log.error('', err); + return { system: [], user: [], development: [] }; + }); + } + private static _handleExtensionPoint(extensionPoint: ExtensionPoint, availableExtensions: IExtensionDescription[], messageHandler: (msg: IMessage) => void): void { let users: IExtensionPointUser[] = [], usersLen = 0; for (let i = 0, len = availableExtensions.length; i < len; i++) { @@ -483,9 +667,37 @@ export class ExtensionService implements IExtensionService { } } - public _onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number): void { - this._extensionHostProcessActivationTimes[extensionId] = new ActivationTimes(startup, codeLoadingTime, activateCallTime, activateResolvedTime); + public _onExtensionActivated(extensionId: string, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationEvent: string): void { + this._extensionHostProcessActivationTimes[extensionId] = new ActivationTimes(startup, codeLoadingTime, activateCallTime, activateResolvedTime, activationEvent); + this._onDidChangeExtensionsStatus.fire([extensionId]); } + + public _onExtensionRuntimeError(extensionId: string, err: Error): void { + if (!this._extensionHostExtensionRuntimeErrors[extensionId]) { + this._extensionHostExtensionRuntimeErrors[extensionId] = []; + } + this._extensionHostExtensionRuntimeErrors[extensionId].push(err); + this._onDidChangeExtensionsStatus.fire([extensionId]); + } + + public _addMessage(extensionId: string, severity: Severity, message: string): void { + if (!this._extensionsMessages[extensionId]) { + this._extensionsMessages[extensionId] = []; + } + this._extensionsMessages[extensionId].push({ + type: severity, + message: message, + source: null, + extensionId: null, + extensionPointId: null + }); + this._onDidChangeExtensionsStatus.fire([extensionId]); + } +} + +interface IExtensionCacheData { + input: ExtensionScannerInput; + result: IExtensionDescription[]; } export class Logger implements ILog { @@ -510,3 +722,34 @@ export class Logger implements ILog { this._messageHandler(Severity.Info, source, message); } } + +class CounterLogger implements ILog { + + public errorCnt = 0; + public warnCnt = 0; + public infoCnt = 0; + + constructor(private readonly _actual: ILog) { + } + + public error(source: string, message: string): void { + this._actual.error(source, message); + } + + public warn(source: string, message: string): void { + this._actual.warn(source, message); + } + + public info(source: string, message: string): void { + this._actual.info(source, message); + } +} + +class NullLogger implements ILog { + public error(source: string, message: string): void { + } + public warn(source: string, message: string): void { + } + public info(source: string, message: string): void { + } +} diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index e6896e48d5af..18987ccf7e09 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -89,6 +89,8 @@ export class FileService implements IFileService { } private onFileServiceError(msg: string): void { + + // Forward to unexpected error handler errors.onUnexpectedError(msg); // Detect if we run < .NET Framework 4.5 diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index e2fb38062b7b..c1c668826b1e 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -768,7 +768,7 @@ export class FileService implements IFileService { const absolutePath = this.toAbsolutePath(resource); return pfs.stat(absolutePath).then(stat => { - return new StatResolver(resource, stat.isDirectory(), stat.mtime.getTime(), stat.size, this.options.verboseLogging); + return new StatResolver(resource, stat.isDirectory(), stat.mtime.getTime(), stat.size, this.options.verboseLogging ? this.options.errorLogger : void 0); }); } @@ -1000,9 +1000,9 @@ export class StatResolver { private name: string; private etag: string; private size: number; - private verboseLogging: boolean; + private errorLogger: (msg) => void; - constructor(resource: uri, isDirectory: boolean, mtime: number, size: number, verboseLogging: boolean) { + constructor(resource: uri, isDirectory: boolean, mtime: number, size: number, errorLogger?: (msg) => void) { assert.ok(resource && resource.scheme === 'file', 'Invalid resource: ' + resource); this.resource = resource; @@ -1012,7 +1012,7 @@ export class StatResolver { this.etag = etag(size, mtime); this.size = size; - this.verboseLogging = verboseLogging; + this.errorLogger = errorLogger; } public resolve(options: IResolveFileOptions): TPromise { @@ -1062,8 +1062,8 @@ export class StatResolver { private resolveChildren(absolutePath: string, absoluteTargetPaths: string[], resolveSingleChildDescendants: boolean, callback: (children: IFileStat[]) => void): void { extfs.readdir(absolutePath, (error: Error, files: string[]) => { if (error) { - if (this.verboseLogging) { - console.error(error); + if (this.errorLogger) { + this.errorLogger(error); } return callback(null); // return - we might not have permissions to read the folder @@ -1077,8 +1077,8 @@ export class StatResolver { flow.sequence( function onError(error: Error): void { - if ($this.verboseLogging) { - console.error(error); + if ($this.errorLogger) { + $this.errorLogger(error); } clb(null, null); // return - we might not have permissions to read the folder or stat the file diff --git a/src/vs/workbench/services/files/test/node/resolver.test.ts b/src/vs/workbench/services/files/test/node/resolver.test.ts index 7bbc269b7140..cc314d67d75f 100644 --- a/src/vs/workbench/services/files/test/node/resolver.test.ts +++ b/src/vs/workbench/services/files/test/node/resolver.test.ts @@ -19,7 +19,7 @@ function create(relativePath: string): StatResolver { let absolutePath = relativePath ? path.join(basePath, relativePath) : basePath; let fsStat = fs.statSync(absolutePath); - return new StatResolver(uri.file(absolutePath), fsStat.isDirectory(), fsStat.mtime.getTime(), fsStat.size, false); + return new StatResolver(uri.file(absolutePath), fsStat.isDirectory(), fsStat.mtime.getTime(), fsStat.size, void 0); } function toResource(relativePath: string): uri { diff --git a/src/vs/workbench/services/group/common/groupService.ts b/src/vs/workbench/services/group/common/groupService.ts index 5a614d5c9a43..94476c83187c 100644 --- a/src/vs/workbench/services/group/common/groupService.ts +++ b/src/vs/workbench/services/group/common/groupService.ts @@ -22,9 +22,11 @@ export const IEditorGroupService = createDecorator('editorG export interface IEditorTabOptions { showTabs?: boolean; tabCloseButton?: 'left' | 'right' | 'off'; + tabSizing?: 'fit' | 'shrink'; showIcons?: boolean; previewEditors?: boolean; labelFormat?: 'default' | 'short' | 'medium' | 'long'; + iconTheme?: string; } export interface IMoveOptions { diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index d3e29c3b221d..acb735b407f6 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -569,25 +569,22 @@ let schema: IJSONSchema = { let schemaRegistry = Registry.as(Extensions.JSONContribution); schemaRegistry.registerSchema(schemaId, schema); -if (OS === OperatingSystem.Macintosh || OS === OperatingSystem.Linux) { - - const configurationRegistry = Registry.as(ConfigExtensions.Configuration); - const keyboardConfiguration: IConfigurationNode = { - 'id': 'keyboard', - 'order': 15, - 'type': 'object', - 'title': nls.localize('keyboardConfigurationTitle', "Keyboard"), - 'overridable': true, - 'properties': { - 'keyboard.dispatch': { - 'type': 'string', - 'enum': ['code', 'keyCode'], - 'default': 'code', - 'description': nls.localize('dispatch', "Controls the dispatching logic for key presses to use either `code` (recommended) or `keyCode`.") - } +const configurationRegistry = Registry.as(ConfigExtensions.Configuration); +const keyboardConfiguration: IConfigurationNode = { + 'id': 'keyboard', + 'order': 15, + 'type': 'object', + 'title': nls.localize('keyboardConfigurationTitle', "Keyboard"), + 'overridable': true, + 'properties': { + 'keyboard.dispatch': { + 'type': 'string', + 'enum': ['code', 'keyCode'], + 'default': 'code', + 'description': nls.localize('dispatch', "Controls the dispatching logic for key presses to use either `code` (recommended) or `keyCode`."), + 'included': OS === OperatingSystem.Macintosh || OS === OperatingSystem.Linux } - }; + } +}; - configurationRegistry.registerConfiguration(keyboardConfiguration); - -} +configurationRegistry.registerConfiguration(keyboardConfiguration); diff --git a/src/vs/workbench/services/message/browser/messageService.ts b/src/vs/workbench/services/message/browser/messageService.ts index 9fe4dd366456..77a2a3ceb869 100644 --- a/src/vs/workbench/services/message/browser/messageService.ts +++ b/src/vs/workbench/services/message/browser/messageService.ts @@ -136,7 +136,7 @@ export class WorkbenchMessageService implements IMessageService { } } - public confirmSync(confirmation: IConfirmation): boolean { + public confirm(confirmation: IConfirmation): boolean { let messageText = confirmation.message; if (confirmation.detail) { messageText = messageText + '\n\n' + confirmation.detail; @@ -145,8 +145,8 @@ export class WorkbenchMessageService implements IMessageService { return window.confirm(messageText); } - public confirm(confirmation: IConfirmation): TPromise { - return TPromise.as({ confirmed: this.confirmSync(confirmation) } as IConfirmationResult); + public confirmWithCheckbox(confirmation: IConfirmation): TPromise { + return TPromise.as({ confirmed: this.confirm(confirmation) } as IConfirmationResult); } public dispose(): void { diff --git a/src/vs/workbench/services/message/electron-browser/messageService.ts b/src/vs/workbench/services/message/electron-browser/messageService.ts index f676f67dc54b..079ccb80caca 100644 --- a/src/vs/workbench/services/message/electron-browser/messageService.ts +++ b/src/vs/workbench/services/message/electron-browser/messageService.ts @@ -26,10 +26,10 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe super(container, telemetryService); } - public confirm(confirmation: IConfirmation): TPromise { + public confirmWithCheckbox(confirmation: IConfirmation): TPromise { const opts = this.getConfirmOptions(confirmation); - return this.showMessageBox(opts).then(result => { + return this.showMessageBoxWithCheckbox(opts).then(result => { return { confirmed: result.button === 0 ? true : false, checkboxChecked: result.checkboxChecked @@ -37,10 +37,21 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe }); } - public confirmSync(confirmation: IConfirmation): boolean { + private showMessageBoxWithCheckbox(opts: Electron.MessageBoxOptions): TPromise { + opts = this.massageMessageBoxOptions(opts); + + return this.windowService.showMessageBoxWithCheckbox(opts).then(result => { + return { + button: isLinux ? opts.buttons.length - result.button - 1 : result.button, + checkboxChecked: result.checkboxChecked + } as IMessageBoxResult; + }); + } + + public confirm(confirmation: IConfirmation): boolean { const opts = this.getConfirmOptions(confirmation); - const result = this.showMessageBoxSync(opts); + const result = this.showMessageBox(opts); return result === 0 ? true : false; } @@ -86,7 +97,7 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe public choose(severity: Severity, message: string, options: string[], cancelId: number, modal: boolean = false): TPromise { if (modal) { const type: 'none' | 'info' | 'error' | 'question' | 'warning' = severity === Severity.Info ? 'question' : severity === Severity.Error ? 'error' : severity === Severity.Warning ? 'warning' : 'none'; - return TPromise.wrap(this.showMessageBoxSync({ message, buttons: options, type, cancelId })); + return TPromise.wrap(this.showMessageBox({ message, buttons: options, type, cancelId })); } let onCancel: () => void = null; @@ -105,21 +116,10 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe return promise; } - private showMessageBox(opts: Electron.MessageBoxOptions): TPromise { + private showMessageBox(opts: Electron.MessageBoxOptions): number { opts = this.massageMessageBoxOptions(opts); - return this.windowService.showMessageBox(opts).then(result => { - return { - button: isLinux ? opts.buttons.length - result.button - 1 : result.button, - checkboxChecked: result.checkboxChecked - } as IMessageBoxResult; - }); - } - - private showMessageBoxSync(opts: Electron.MessageBoxOptions): number { - opts = this.massageMessageBoxOptions(opts); - - const result = this.windowService.showMessageBoxSync(opts); + const result = this.windowService.showMessageBox(opts); return isLinux ? opts.buttons.length - result - 1 : result; } @@ -129,6 +129,8 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe if (opts.defaultId !== void 0) { opts.defaultId = isLinux ? opts.buttons.length - opts.defaultId - 1 : opts.defaultId; + } else if (isLinux) { + opts.defaultId = opts.buttons.length - 1; // since we reversed the buttons } if (opts.cancelId !== void 0) { diff --git a/src/vs/workbench/services/part/common/partService.ts b/src/vs/workbench/services/part/common/partService.ts index efe91aa8b69b..0199e49527fc 100644 --- a/src/vs/workbench/services/part/common/partService.ts +++ b/src/vs/workbench/services/part/common/partService.ts @@ -28,6 +28,11 @@ export interface ILayoutOptions { source?: Parts; } +export interface Dimension { + readonly width: number; + readonly height: number; +} + export const IPartService = createDecorator('partService'); export interface IPartService { @@ -41,7 +46,7 @@ export interface IPartService { /** * Emits when the editor part's layout changes. */ - onEditorLayout: Event; + onEditorLayout: Event; /** * Asks the part service to layout all parts. diff --git a/src/vs/workbench/services/progress/browser/progressService2.ts b/src/vs/workbench/services/progress/browser/progressService2.ts index b6de990d858b..2e1c2e4153ca 100644 --- a/src/vs/workbench/services/progress/browser/progressService2.ts +++ b/src/vs/workbench/services/progress/browser/progressService2.ts @@ -65,7 +65,7 @@ export class ProgressService2 implements IProgressService2 { // } - withProgress(options: IProgressOptions, task: (progress: IProgress<{ message?: string, percentage?: number }>) => TPromise): void { + withProgress(options: IProgressOptions, task: (progress: IProgress<{ message?: string, percentage?: number }>) => Thenable): void { const { location } = options; switch (location) { case ProgressLocation.Window: @@ -80,7 +80,7 @@ export class ProgressService2 implements IProgressService2 { } - private _withWindowProgress(options: IProgressOptions, callback: (progress: IProgress<{ message?: string, percentage?: number }>) => TPromise): void { + private _withWindowProgress(options: IProgressOptions, callback: (progress: IProgress<{ message?: string, percentage?: number }>) => Thenable): void { const task: [IProgressOptions, Progress] = [options, new Progress(() => this._updateWindowProgress())]; @@ -104,7 +104,7 @@ export class ProgressService2 implements IProgressService2 { }, 150); // cancel delay if promise finishes below 150ms - always(promise, () => clearTimeout(delayHandle)); + always(TPromise.wrap(promise), () => clearTimeout(delayHandle)); } private _updateWindowProgress(idx: number = 0) { @@ -138,14 +138,14 @@ export class ProgressService2 implements IProgressService2 { } } - private _withViewletProgress(viewletId: string, task: (progress: IProgress<{ message?: string, percentage?: number }>) => TPromise): void { + private _withViewletProgress(viewletId: string, task: (progress: IProgress<{ message?: string, percentage?: number }>) => Thenable): void { const promise = task(emptyProgress); // show in viewlet const viewletProgress = this._viewletService.getProgressIndicator(viewletId); if (viewletProgress) { - viewletProgress.showWhile(promise); + viewletProgress.showWhile(TPromise.wrap(promise)); } // show activity bar diff --git a/src/vs/workbench/services/scm/common/scmService.ts b/src/vs/workbench/services/scm/common/scmService.ts index dadee567ffa8..db569fc7c577 100644 --- a/src/vs/workbench/services/scm/common/scmService.ts +++ b/src/vs/workbench/services/scm/common/scmService.ts @@ -8,6 +8,7 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import Event, { Emitter } from 'vs/base/common/event'; import { ISCMService, ISCMProvider, ISCMInput, ISCMRepository } from './scm'; +import { ILogService } from 'vs/platform/log/common/log'; class SCMInput implements ISCMInput { @@ -76,9 +77,11 @@ export class SCMService implements ISCMService { private _onDidRemoveProvider = new Emitter(); get onDidRemoveRepository(): Event { return this._onDidRemoveProvider.event; } - constructor() { } + constructor( @ILogService private logService: ILogService) { } registerSCMProvider(provider: ISCMProvider): ISCMRepository { + this.logService.trace('SCMService#registerSCMProvider'); + if (this._providerIds.has(provider.id)) { throw new Error(`SCM Provider ${provider.id} already exists.`); } diff --git a/src/vs/workbench/services/search/node/fileSearch.ts b/src/vs/workbench/services/search/node/fileSearch.ts index 372fab93bdf3..2e6d6ed3caae 100644 --- a/src/vs/workbench/services/search/node/fileSearch.ts +++ b/src/vs/workbench/services/search/node/fileSearch.ts @@ -26,6 +26,7 @@ import extfs = require('vs/base/node/extfs'); import flow = require('vs/base/node/flow'); import { IRawFileMatch, ISerializedSearchComplete, IRawSearch, ISearchEngine, IFolderSearch } from './search'; import { spawnRipgrepCmd } from './ripgrepFileSearch'; +import { rgErrorMsgForDisplay } from './ripgrepTextSearch'; enum Traversal { Node = 1, @@ -189,8 +190,9 @@ export class FileWalker { rootFolderDone(undefined, undefined); } }); - }, (err, result) => { - done(err ? err[0] : null, this.isLimitHit); + }, (errors, result) => { + const err = errors ? errors.filter(e => !!e)[0] : null; + done(err, this.isLimitHit); }); }); } @@ -389,13 +391,17 @@ export class FileWalker { this.forwardData(cmd.stdout, encoding, done); const stderr = this.collectData(cmd.stderr); + let gotData = false; + cmd.stdout.once('data', () => gotData = true); + cmd.on('error', (err: Error) => { done(err); }); cmd.on('close', (code: number) => { // ripgrep returns code=1 when no results are found - if (code !== 0 && (!isRipgrep || code !== 1)) { + let stderrText, displayMsg: string; + if (isRipgrep ? (!gotData && (stderrText = this.decodeData(stderr, encoding)) && (displayMsg = rgErrorMsgForDisplay(stderrText))) : code !== 0) { done(new Error(`command failed with error code ${code}: ${this.decodeData(stderr, encoding)}`)); } else { if (isRipgrep && this.exists && code === 0) { diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 51e417436a94..ac82683de63f 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -121,7 +121,7 @@ export class RipgrepEngine { this.isDone = true; let displayMsg: string; process.removeListener('exit', this.killRgProcFn); - if (stderr && !gotData && (displayMsg = this.rgErrorMsgForDisplay(stderr))) { + if (stderr && !gotData && (displayMsg = rgErrorMsgForDisplay(stderr))) { done(new Error(displayMsg), { limitHit: false, stats: null @@ -136,27 +136,27 @@ export class RipgrepEngine { }); }); } +} - /** - * Read the first line of stderr and return an error for display or undefined, based on a whitelist. - * Ripgrep produces stderr output which is not from a fatal error, and we only want the search to be - * "failed" when a fatal error was produced. - */ - private rgErrorMsgForDisplay(msg: string): string | undefined { - const firstLine = msg.split('\n')[0]; +/** + * Read the first line of stderr and return an error for display or undefined, based on a whitelist. + * Ripgrep produces stderr output which is not from a fatal error, and we only want the search to be + * "failed" when a fatal error was produced. + */ +export function rgErrorMsgForDisplay(msg: string): string | undefined { + const firstLine = msg.split('\n')[0]; - if (strings.startsWith(firstLine, 'Error parsing regex')) { - return firstLine; - } - - if (strings.startsWith(firstLine, 'error parsing glob') || - strings.startsWith(firstLine, 'unsupported encoding')) { - // Uppercase first letter - return firstLine.charAt(0).toUpperCase() + firstLine.substr(1); - } - - return undefined; + if (strings.startsWith(firstLine, 'Error parsing regex')) { + return firstLine; } + + if (strings.startsWith(firstLine, 'error parsing glob') || + strings.startsWith(firstLine, 'unsupported encoding')) { + // Uppercase first letter + return firstLine.charAt(0).toUpperCase() + firstLine.substr(1); + } + + return undefined; } export class RipgrepParser extends EventEmitter { diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts index 04c75203a10c..b6307b38dd40 100644 --- a/src/vs/workbench/services/search/node/searchService.ts +++ b/src/vs/workbench/services/search/node/searchService.ts @@ -28,6 +28,7 @@ export class SearchService implements ISearchService { private diskSearch: DiskSearch; private readonly searchProvider: ISearchResultProvider[] = []; + private forwardingTelemetry: PPromise; constructor( @IModelService private modelService: IModelService, @@ -38,7 +39,6 @@ export class SearchService implements ISearchService { ) { this.diskSearch = new DiskSearch(!environmentService.isBuilt || environmentService.verbose, /*timeout=*/undefined, environmentService.debugSearch); this.registerSearchResultProvider(this.diskSearch); - this.forwardTelemetry(); } public registerSearchResultProvider(provider: ISearchResultProvider): IDisposable { @@ -76,6 +76,7 @@ export class SearchService implements ISearchService { } public search(query: ISearchQuery): PPromise { + this.forwardTelemetry(); let combinedPromise: TPromise; @@ -210,10 +211,12 @@ export class SearchService implements ISearchService { } private forwardTelemetry() { - this.diskSearch.fetchTelemetry() - .then(null, onUnexpectedError, event => { - this.telemetryService.publicLog(event.eventName, event.data); - }); + if (!this.forwardingTelemetry) { + this.forwardingTelemetry = this.diskSearch.fetchTelemetry() + .then(null, onUnexpectedError, event => { + this.telemetryService.publicLog(event.eventName, event.data); + }); + } } } diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index ee7360e86b3a..4905dff62b3a 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -145,8 +145,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil // We have received reports of users seeing delete events even though the file still // exists (network shares issue: https://github.com/Microsoft/vscode/issues/13665). // Since we do not want to mark the model as orphaned, we have to check if the - // file is really gone and not just a faulty file event (TODO@Ben revisit when we - // have a more stable file watcher in place for this scenario). + // file is really gone and not just a faulty file event. checkOrphanedPromise = TPromise.timeout(100).then(() => { if (this.disposed) { return true; diff --git a/src/vs/workbench/services/textfile/common/textFileService.ts b/src/vs/workbench/services/textfile/common/textFileService.ts index b37395797339..da197f082349 100644 --- a/src/vs/workbench/services/textfile/common/textFileService.ts +++ b/src/vs/workbench/services/textfile/common/textFileService.ts @@ -14,13 +14,12 @@ import Event, { Emitter } from 'vs/base/common/event'; import platform = require('vs/base/common/platform'); import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; -import { IRevertOptions, IResult, ITextFileOperationResult, ITextFileService, IRawTextContent, IAutoSaveConfiguration, AutoSaveMode, SaveReason, ITextFileEditorModelManager, ITextFileEditorModel, ModelState, ISaveOptions } from 'vs/workbench/services/textfile/common/textfiles'; +import { IResult, ITextFileOperationResult, ITextFileService, IRawTextContent, IAutoSaveConfiguration, AutoSaveMode, SaveReason, ITextFileEditorModelManager, ITextFileEditorModel, ModelState, ISaveOptions } from 'vs/workbench/services/textfile/common/textfiles'; import { ConfirmResult } from 'vs/workbench/common/editor'; import { ILifecycleService, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IFileService, IResolveContentOptions, IFilesConfiguration, FileOperationError, FileOperationResult, AutoSaveConfiguration, HotExitConfiguration } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IUntitledEditorService, UNTITLED_SCHEMA } from 'vs/workbench/services/untitled/common/untitledEditorService'; @@ -31,6 +30,7 @@ import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { ResourceMap } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { IRevertOptions } from 'vs/platform/editor/common/editor'; export interface IBackupResult { didBackup: boolean; @@ -62,7 +62,6 @@ export abstract class TextFileService implements ITextFileService { private lifecycleService: ILifecycleService, private contextService: IWorkspaceContextService, private configurationService: IConfigurationService, - private telemetryService: ITelemetryService, protected fileService: IFileService, private untitledEditorService: IUntitledEditorService, private instantiationService: IInstantiationService, @@ -87,15 +86,6 @@ export abstract class TextFileService implements ITextFileService { this.onFilesConfigurationChange(configuration); - /* __GDPR__ - "autoSave" : { - "${include}": [ - "${IAutoSaveConfiguration}" - ] - } - */ - this.telemetryService.publicLog('autoSave', this.getAutoSaveConfiguration()); - this.registerListeners(); } @@ -105,7 +95,7 @@ export abstract class TextFileService implements ITextFileService { abstract resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise; - abstract promptForPath(defaultPath?: string): string; + abstract promptForPath(defaultPath: string): string; abstract confirmSave(resources?: URI[]): ConfirmResult; @@ -222,16 +212,6 @@ export abstract class TextFileService implements ITextFileService { return TPromise.as({ didBackup: false }); } - // Telemetry - /* __GDPR__ - "hotExit:triggered" : { - "reason" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "windowCount": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "fileCount": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('hotExit:triggered', { reason, windowCount, fileCount: dirtyToBackup.length }); - // Backup return this.backupAll(dirtyToBackup, textFileEditorModelManager).then(() => { return { didBackup: true }; }); }); @@ -647,6 +627,11 @@ export abstract class TextFileService implements ITextFileService { return URI.file(paths.join(paths.dirname(lastActiveFile.fsPath), untitledFileName)).fsPath; } + const lastActiveFolder = this.historyService.getLastActiveWorkspaceRoot('file'); + if (lastActiveFolder) { + return URI.file(paths.join(lastActiveFolder.fsPath, untitledFileName)).fsPath; + } + return untitledFileName; } diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index 3a649cade6e7..81c64fdf3451 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -13,6 +13,7 @@ import { IBaseStat, IResolveContentOptions } from 'vs/platform/files/common/file import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { IRawTextSource } from 'vs/editor/common/model/textSource'; +import { IRevertOptions } from 'vs/platform/editor/common/editor'; /** * The save error handler can be installed on the text text file editor model to install code that executes when save errors occur. @@ -100,13 +101,6 @@ export interface IResult { success?: boolean; } -/* __GDPR__FRAGMENT__ - "IAutoSaveConfiguration" : { - "autoSaveDelay" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "autoSaveFocusChange": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "autoSaveApplicationChange": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ export interface IAutoSaveConfiguration { autoSaveDelay: number; autoSaveFocusChange: boolean; @@ -217,19 +211,6 @@ export interface ITextFileEditorModel extends ITextEditorModel, IEncodingSupport isDisposed(): boolean; } -export interface IRevertOptions { - - /** - * Forces to load the contents from disk again even if the file is not dirty. - */ - force?: boolean; - - /** - * A soft revert will clear dirty state of a file but not attempt to load the contents from disk. - */ - soft?: boolean; -} - export interface ITextFileService extends IDisposable { _serviceBrand: any; onAutoSaveConfigurationChange: Event; diff --git a/src/vs/workbench/services/textfile/electron-browser/textFileService.ts b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts index 00fe49fd9472..580495395388 100644 --- a/src/vs/workbench/services/textfile/electron-browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts @@ -18,7 +18,6 @@ import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/un import { IFileService, IResolveContentOptions } from 'vs/platform/files/common/files'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ModelBuilder } from 'vs/workbench/services/textfile/electron-browser/modelBuilder'; @@ -41,7 +40,6 @@ export class TextFileService extends AbstractTextFileService { @IUntitledEditorService untitledEditorService: IUntitledEditorService, @ILifecycleService lifecycleService: ILifecycleService, @IInstantiationService instantiationService: IInstantiationService, - @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @IModeService private modeService: IModeService, @IWindowService private windowService: IWindowService, @@ -51,7 +49,7 @@ export class TextFileService extends AbstractTextFileService { @IWindowsService windowsService: IWindowsService, @IHistoryService historyService: IHistoryService ) { - super(lifecycleService, contextService, configurationService, telemetryService, fileService, untitledEditorService, instantiationService, messageService, environmentService, backupFileService, windowsService, historyService); + super(lifecycleService, contextService, configurationService, fileService, untitledEditorService, instantiationService, messageService, environmentService, backupFileService, windowsService, historyService); } public resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise { @@ -132,16 +130,16 @@ export class TextFileService extends AbstractTextFileService { opts.defaultId = 2; } - const choice = this.windowService.showMessageBoxSync(opts); + const choice = this.windowService.showMessageBox(opts); return buttons[choice].result; } - public promptForPath(defaultPath?: string): string { + public promptForPath(defaultPath: string): string { return this.windowService.showSaveDialog(this.getSaveDialogOptions(defaultPath)); } - private getSaveDialogOptions(defaultPath?: string): Electron.SaveDialogOptions { + private getSaveDialogOptions(defaultPath: string): Electron.SaveDialogOptions { const options: Electron.SaveDialogOptions = { defaultPath }; // Filters are only enabled on Windows where they work properly diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index e81451b195a2..b7ee1e4675d8 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -49,6 +49,8 @@ class ResourceModelCollection extends ReferenceCollection { + // ignore }); } diff --git a/src/vs/workbench/services/themes/common/colorThemeSchema.ts b/src/vs/workbench/services/themes/common/colorThemeSchema.ts index 4e7c779283c9..bfaae07ad34c 100644 --- a/src/vs/workbench/services/themes/common/colorThemeSchema.ts +++ b/src/vs/workbench/services/themes/common/colorThemeSchema.ts @@ -184,6 +184,7 @@ export function tokenColorsSchema(description: string): IJSONSchema { const schemaId = 'vscode://schemas/color-theme'; const schema: IJSONSchema = { type: 'object', + allowComments: true, properties: { colors: colorsSchema, tokenColors: { diff --git a/src/vs/workbench/services/themes/common/fileIconThemeSchema.ts b/src/vs/workbench/services/themes/common/fileIconThemeSchema.ts index b26a44c5ab79..e9133b81d4a2 100644 --- a/src/vs/workbench/services/themes/common/fileIconThemeSchema.ts +++ b/src/vs/workbench/services/themes/common/fileIconThemeSchema.ts @@ -11,6 +11,7 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; const schemaId = 'vscode://schemas/icon-theme'; const schema: IJSONSchema = { type: 'object', + allowComments: true, definitions: { folderExpanded: { type: 'string', diff --git a/src/vs/workbench/services/timer/node/timerService.ts b/src/vs/workbench/services/timer/node/timerService.ts index e140cd95814e..2aafef257293 100644 --- a/src/vs/workbench/services/timer/node/timerService.ts +++ b/src/vs/workbench/services/timer/node/timerService.ts @@ -88,7 +88,7 @@ export class TimerService implements ITimerService { cpus = { count: rawCpus.length, speed: rawCpus[0].speed, model: rawCpus[0].model }; } } catch (error) { - console.error(error); // be on the safe side with these hardware method calls + // ignore, be on the safe side with these hardware method calls } this._startupMetrics = { diff --git a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts index 5803459ade3f..7bb21530f427 100644 --- a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts @@ -16,7 +16,7 @@ import { IWorkspaceIdentifier, IWorkspaceFolderCreationData } from 'vs/platform/ import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { WorkspaceService } from 'vs/workbench/services/configuration/node/configurationService'; import { migrateStorageToMultiRootWorkspace } from 'vs/platform/storage/common/migration'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { IStorageService } from 'vs/platform/storage/common/storage'; import { StorageService } from 'vs/platform/storage/common/storageService'; import { ConfigurationScope, IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -28,15 +28,11 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { distinct } from 'vs/base/common/arrays'; import { isLinux } from 'vs/base/common/platform'; import { isEqual } from 'vs/base/common/resources'; -import { Action } from 'vs/base/common/actions'; -import product from 'vs/platform/node/product'; export class WorkspaceEditingService implements IWorkspaceEditingService { public _serviceBrand: any; - private static readonly INFO_MESSAGE_KEY = 'enterWorkspace.message'; - constructor( @IJSONEditingService private jsonEditingService: IJSONEditingService, @IWorkspaceContextService private contextService: WorkspaceService, @@ -145,17 +141,14 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { if (result) { return this.migrate(result.workspace).then(() => { - // Show message to user (once) if entering workspace state - if (this.contextService.getWorkbenchState() !== WorkbenchState.WORKSPACE) { - this.informUserOnce(); // TODO@Ben remove me after a couple of releases - } + // TODO@Ben TODO@Sandeep the following requires ugly casts and should probably have a service interface // Reinitialize backup service - const backupFileService = this.backupFileService as BackupFileService; // TODO@Ben ugly cast + const backupFileService = this.backupFileService as BackupFileService; backupFileService.initialize(result.backupPath); // Reinitialize configuration service - const workspaceImpl = this.contextService as WorkspaceService; // TODO@Ben TODO@Sandeep ugly cast + const workspaceImpl = this.contextService as WorkspaceService; return workspaceImpl.initialize(result.workspace); }); } @@ -168,53 +161,6 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { }); } - private informUserOnce(): void { - if (product.quality !== 'stable') { - return; // only for stable - } - - if (this.storageService.getBoolean(WorkspaceEditingService.INFO_MESSAGE_KEY)) { - return; // user does not want to see it again - } - - const closeAction = new Action( - 'enterWorkspace.close', - nls.localize('enterWorkspace.close', "Close"), - null, - true, - () => TPromise.as(true) - ); - - const dontShowAgainAction = new Action( - 'enterWorkspace.dontShowAgain', - nls.localize('enterWorkspace.dontShowAgain', "Don't Show Again"), - null, - true, - () => { - this.storageService.store(WorkspaceEditingService.INFO_MESSAGE_KEY, true, StorageScope.GLOBAL); - - return TPromise.as(true); - } - ); - const moreInfoAction = new Action( - 'enterWorkspace.moreInfo', - nls.localize('enterWorkspace.moreInfo', "More Information"), - null, - true, - () => { - const uri = URI.parse('https://go.microsoft.com/fwlink/?linkid=861970'); - window.open(uri.toString(true)); - - return TPromise.as(true); - } - ); - - this.messageService.show(Severity.Info, { - message: nls.localize('enterWorkspace.prompt', "Learn more about working with multiple folders in VS Code."), - actions: [moreInfoAction, dontShowAgainAction, closeAction] - }); - } - private migrate(toWorkspace: IWorkspaceIdentifier): TPromise { // Storage (UI State) migration diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index e8c7a63c6fb4..b9fcbd97a82c 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -32,6 +32,7 @@ import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; import * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import 'vs/workbench/parts/search/electron-browser/search.contribution'; +import { NoopLogService } from 'vs/platform/log/common/log'; const defaultSelector = { scheme: 'far' }; const model: EditorCommon.IModel = EditorModel.createFromString( @@ -113,7 +114,7 @@ suite('ExtHostLanguageFeatureCommands', function () { const heapService = new ExtHostHeapService(); - commands = new ExtHostCommands(threadService, heapService); + commands = new ExtHostCommands(threadService, heapService, new NoopLogService()); threadService.set(ExtHostContext.ExtHostCommands, commands); threadService.setTestInstance(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, threadService)); ExtHostApiCommands.register(commands); @@ -195,6 +196,22 @@ suite('ExtHostLanguageFeatureCommands', function () { }, done); }); + test('executeWorkspaceSymbolProvider should accept empty string, #39522', async function () { + + disposables.push(extHost.registerWorkspaceSymbolProvider({ + provideWorkspaceSymbols(query) { + return [new types.SymbolInformation('hello', types.SymbolKind.Array, new types.Range(0, 0, 0, 0), URI.parse('foo:bar'))]; + } + })); + + await threadService.sync(); + let symbols = await commands.executeCommand('vscode.executeWorkspaceSymbolProvider', ''); + assert.equal(symbols.length, 1); + + await threadService.sync(); + symbols = await commands.executeCommand('vscode.executeWorkspaceSymbolProvider', '*'); + assert.equal(symbols.length, 1); + }); // --- definition diff --git a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts index 69759480fc2c..9ea21cf75fa8 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts @@ -12,6 +12,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { OneGetThreadService } from './testThreadService'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; +import { NoopLogService } from 'vs/platform/log/common/log'; suite('ExtHostCommands', function () { @@ -29,7 +30,7 @@ suite('ExtHostCommands', function () { } }; - const commands = new ExtHostCommands(OneGetThreadService(shape), undefined); + const commands = new ExtHostCommands(OneGetThreadService(shape), undefined, new NoopLogService()); commands.registerCommand('foo', (): any => { }).dispose(); assert.equal(lastUnregister, 'foo'); assert.equal(CommandsRegistry.getCommand('foo'), undefined); @@ -50,7 +51,7 @@ suite('ExtHostCommands', function () { } }; - const commands = new ExtHostCommands(OneGetThreadService(shape), undefined); + const commands = new ExtHostCommands(OneGetThreadService(shape), undefined, new NoopLogService()); const reg = commands.registerCommand('foo', (): any => { }); reg.dispose(); reg.dispose(); diff --git a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts index 061673497261..6e802feca8b3 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts @@ -16,12 +16,23 @@ import { OneGetThreadService } from './testThreadService'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import * as vscode from 'vscode'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; suite('ExtHostDocumentSaveParticipant', () => { let resource = URI.parse('foo:bar'); let mainThreadEditors = new class extends mock() { }; let documents: ExtHostDocuments; + let nullExtensionDescription: IExtensionDescription = { + id: 'nullExtensionDescription', + name: 'Null Extension Description', + publisher: 'vscode', + enableProposedApi: false, + engines: undefined, + extensionFolderPath: undefined, + isBuiltin: false, + version: undefined + }; setup(() => { const documentsAndEditors = new ExtHostDocumentsAndEditors(OneGetThreadService(null)); @@ -47,7 +58,7 @@ suite('ExtHostDocumentSaveParticipant', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); let event: vscode.TextDocumentWillSaveEvent; - let sub = participant.onWillSaveTextDocumentEvent(function (e) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { event = e; }); @@ -64,7 +75,7 @@ suite('ExtHostDocumentSaveParticipant', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); let event: vscode.TextDocumentWillSaveEvent; - let sub = participant.onWillSaveTextDocumentEvent(function (e) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { event = e; }); @@ -79,7 +90,7 @@ suite('ExtHostDocumentSaveParticipant', () => { test('event delivery, bad listener', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); - let sub = participant.onWillSaveTextDocumentEvent(function (e) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { throw new Error('💀'); }); @@ -94,11 +105,11 @@ suite('ExtHostDocumentSaveParticipant', () => { test('event delivery, bad listener doesn\'t prevent more events', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); - let sub1 = participant.onWillSaveTextDocumentEvent(function (e) { + let sub1 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { throw new Error('💀'); }); let event: vscode.TextDocumentWillSaveEvent; - let sub2 = participant.onWillSaveTextDocumentEvent(function (e) { + let sub2 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { event = e; }); @@ -114,11 +125,11 @@ suite('ExtHostDocumentSaveParticipant', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); let counter = 0; - let sub1 = participant.onWillSaveTextDocumentEvent(function (event) { + let sub1 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { assert.equal(counter++, 0); }); - let sub2 = participant.onWillSaveTextDocumentEvent(function (event) { + let sub2 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { assert.equal(counter++, 1); }); @@ -128,42 +139,39 @@ suite('ExtHostDocumentSaveParticipant', () => { }); }); - test('event delivery, ignore bad listeners', () => { + test('event delivery, ignore bad listeners', async () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors, { timeout: 5, errors: 1 }); let callCount = 0; - let sub = participant.onWillSaveTextDocumentEvent(function (event) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { callCount += 1; throw new Error('boom'); }); - return TPromise.join([ - participant.$participateInSave(resource, SaveReason.EXPLICIT), - participant.$participateInSave(resource, SaveReason.EXPLICIT), - participant.$participateInSave(resource, SaveReason.EXPLICIT), - participant.$participateInSave(resource, SaveReason.EXPLICIT) + await participant.$participateInSave(resource, SaveReason.EXPLICIT); + await participant.$participateInSave(resource, SaveReason.EXPLICIT); + await participant.$participateInSave(resource, SaveReason.EXPLICIT); + await participant.$participateInSave(resource, SaveReason.EXPLICIT); - ]).then(values => { - sub.dispose(); - assert.equal(callCount, 2); - }); + sub.dispose(); + assert.equal(callCount, 2); }); test('event delivery, overall timeout', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors, { timeout: 20, errors: 5 }); let callCount = 0; - let sub1 = participant.onWillSaveTextDocumentEvent(function (event) { + let sub1 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { callCount += 1; event.waitUntil(TPromise.timeout(17)); }); - let sub2 = participant.onWillSaveTextDocumentEvent(function (event) { + let sub2 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { callCount += 1; event.waitUntil(TPromise.timeout(17)); }); - let sub3 = participant.onWillSaveTextDocumentEvent(function (event) { + let sub3 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { callCount += 1; }); @@ -180,7 +188,7 @@ suite('ExtHostDocumentSaveParticipant', () => { test('event delivery, waitUntil', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); - let sub = participant.onWillSaveTextDocumentEvent(function (event) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { event.waitUntil(TPromise.timeout(10)); event.waitUntil(TPromise.timeout(10)); @@ -196,7 +204,7 @@ suite('ExtHostDocumentSaveParticipant', () => { test('event delivery, waitUntil must be called sync', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); - let sub = participant.onWillSaveTextDocumentEvent(function (event) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { event.waitUntil(new TPromise((resolve, reject) => { setTimeout(() => { @@ -219,7 +227,7 @@ suite('ExtHostDocumentSaveParticipant', () => { test('event delivery, waitUntil will timeout', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors, { timeout: 5, errors: 3 }); - let sub = participant.onWillSaveTextDocumentEvent(function (event) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (event) { event.waitUntil(TPromise.timeout(15)); }); @@ -234,12 +242,12 @@ suite('ExtHostDocumentSaveParticipant', () => { test('event delivery, waitUntil failure handling', () => { const participant = new ExtHostDocumentSaveParticipant(documents, mainThreadEditors); - let sub1 = participant.onWillSaveTextDocumentEvent(function (e) { + let sub1 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { e.waitUntil(TPromise.wrapError(new Error('dddd'))); }); let event: vscode.TextDocumentWillSaveEvent; - let sub2 = participant.onWillSaveTextDocumentEvent(function (e) { + let sub2 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { event = e; }); @@ -260,7 +268,7 @@ suite('ExtHostDocumentSaveParticipant', () => { } }); - let sub = participant.onWillSaveTextDocumentEvent(function (e) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { e.waitUntil(TPromise.as([TextEdit.insert(new Position(0, 0), 'bar')])); e.waitUntil(TPromise.as([TextEdit.setEndOfLine(EndOfLine.CRLF)])); }); @@ -283,7 +291,7 @@ suite('ExtHostDocumentSaveParticipant', () => { } }); - let sub = participant.onWillSaveTextDocumentEvent(function (e) { + let sub = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { // concurrent change from somewhere documents.$acceptModelChanged(resource.toString(), { @@ -333,7 +341,7 @@ suite('ExtHostDocumentSaveParticipant', () => { const document = documents.getDocumentData(resource).document; - let sub1 = participant.onWillSaveTextDocumentEvent(function (e) { + let sub1 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { // the document state we started with assert.equal(document.version, 1); assert.equal(document.getText(), 'foo'); @@ -341,7 +349,7 @@ suite('ExtHostDocumentSaveParticipant', () => { e.waitUntil(TPromise.as([TextEdit.insert(new Position(0, 0), 'bar')])); }); - let sub2 = participant.onWillSaveTextDocumentEvent(function (e) { + let sub2 = participant.getOnWillSaveTextDocumentEvent(nullExtensionDescription)(function (e) { // the document state AFTER the first listener kicked in assert.equal(document.version, 2); assert.equal(document.getText(), 'barfoo'); diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index 25248c8ed971..e1fb7ffbb5d9 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -25,7 +25,7 @@ import { IHeapService } from 'vs/workbench/api/electron-browser/mainThreadHeapSe import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import { getDocumentSymbols } from 'vs/editor/contrib/quickOpen/quickOpen'; -import { DocumentSymbolProviderRegistry, DocumentHighlightKind, Hover, Command } from 'vs/editor/common/modes'; +import { DocumentSymbolProviderRegistry, DocumentHighlightKind, Hover } from 'vs/editor/common/modes'; import { getCodeLensData } from 'vs/editor/contrib/codelens/codelens'; import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition } from 'vs/editor/contrib/goToDeclaration/goToDeclaration'; import { getHover } from 'vs/editor/contrib/hover/getHover'; @@ -44,6 +44,7 @@ import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; import * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { NoopLogService } from 'vs/platform/log/common/log'; const defaultSelector = { scheme: 'far' }; const model: EditorCommon.IModel = EditorModel.createFromString( @@ -102,7 +103,7 @@ suite('ExtHostLanguageFeatures', function () { const heapService = new ExtHostHeapService(); - const commands = new ExtHostCommands(threadService, heapService); + const commands = new ExtHostCommands(threadService, heapService, new NoopLogService()); threadService.set(ExtHostContext.ExtHostCommands, commands); threadService.setTestInstance(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, threadService)); @@ -655,11 +656,11 @@ suite('ExtHostLanguageFeatures', function () { return getCodeActions(model, model.getFullModelRange()).then(value => { assert.equal(value.length, 2); - const [first, second]: Command[] = value as any; + const [first, second] = value; assert.equal(first.title, 'Testing1'); - assert.equal(first.id, 'test1'); + assert.equal(first.command.id, 'test1'); assert.equal(second.title, 'Testing2'); - assert.equal(second.id, 'test2'); + assert.equal(second.command.id, 'test2'); }); }); }); diff --git a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts index 1eaf46831e46..26c9913d5b64 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts @@ -17,27 +17,45 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { TreeItemCollapsibleState, ITreeItem } from 'vs/workbench/common/views'; +import { NoopLogService } from 'vs/platform/log/common/log'; -suite('ExtHostConfiguration', function () { - +suite('ExtHostTreeView', function () { class RecordingShape extends mock() { - onRefresh = new Emitter(); + onRefresh = new Emitter<{ [treeItemHandle: string]: ITreeItem }>(); $registerView(treeViewId: string): void { } - $refresh(viewId: string, itemHandles: number[]): void { - this.onRefresh.fire(itemHandles); + $refresh(viewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem }): void { + this.onRefresh.fire(itemsToRefresh); } } let testObject: ExtHostTreeViews; let target: RecordingShape; - let onDidChangeTreeData: Emitter; + let onDidChangeTreeNode: Emitter<{ key: string }>; + let onDidChangeTreeKey: Emitter; + let tree, labels, nodes; setup(() => { + tree = { + 'a': { + 'aa': {}, + 'ab': {} + }, + 'b': { + 'ba': {}, + 'bb': {} + } + }; + + labels = {}; + nodes = {}; + let threadService = new TestThreadService(); // Use IInstantiationService to get typechecking when instantiating let inst: IInstantiationService; @@ -48,97 +66,307 @@ suite('ExtHostConfiguration', function () { threadService.setTestInstance(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, threadService)); target = new RecordingShape(); - testObject = new ExtHostTreeViews(target, new ExtHostCommands(threadService, new ExtHostHeapService())); - onDidChangeTreeData = new Emitter(); - testObject.registerTreeDataProvider('testDataProvider', aTreeDataProvider()); + testObject = new ExtHostTreeViews(target, new ExtHostCommands(threadService, new ExtHostHeapService(), new NoopLogService())); + onDidChangeTreeNode = new Emitter<{ key: string }>(); + onDidChangeTreeKey = new Emitter(); + testObject.registerTreeDataProvider('testNodeTreeProvider', aNodeTreeDataProvider()); + testObject.registerTreeDataProvider('testStringTreeProvider', aStringTreeDataProvider()); - testObject.$getElements('testDataProvider').then(elements => { + testObject.$getElements('testNodeTreeProvider').then(elements => { for (const element of elements) { - testObject.$getChildren('testDataProvider', element.handle); + testObject.$getChildren('testNodeTreeProvider', element.handle); } }); }); - test('refresh calls are throttled on roots', function (done) { + test('construct node tree', () => { + return testObject.$getElements('testNodeTreeProvider') + .then(elements => { + const actuals = elements.map(e => e.handle); + assert.deepEqual(actuals, ['0/0:a', '0/1:b']); + return TPromise.join([ + testObject.$getChildren('testNodeTreeProvider', '0/0:a') + .then(children => { + const actuals = children.map(e => e.handle); + assert.deepEqual(actuals, ['0/0:a/0:aa', '0/0:a/1:ab']); + return TPromise.join([ + testObject.$getChildren('testNodeTreeProvider', '0/0:a/0:aa').then(children => assert.equal(children.length, 0)), + testObject.$getChildren('testNodeTreeProvider', '0/0:a/1:ab').then(children => assert.equal(children.length, 0)) + ]); + }), + testObject.$getChildren('testNodeTreeProvider', '0/1:b') + .then(children => { + const actuals = children.map(e => e.handle); + assert.deepEqual(actuals, ['0/1:b/0:ba', '0/1:b/1:bb']); + return TPromise.join([ + testObject.$getChildren('testNodeTreeProvider', '0/1:b/0:ba').then(children => assert.equal(children.length, 0)), + testObject.$getChildren('testNodeTreeProvider', '0/1:b/1:bb').then(children => assert.equal(children.length, 0)) + ]); + }) + ]); + }); + }); + + test('construct string tree', () => { + return testObject.$getElements('testStringTreeProvider') + .then(elements => { + const actuals = elements.map(e => e.handle); + assert.deepEqual(actuals, ['a', 'b']); + return TPromise.join([ + testObject.$getChildren('testStringTreeProvider', 'a') + .then(children => { + const actuals = children.map(e => e.handle); + assert.deepEqual(actuals, ['aa', 'ab']); + return TPromise.join([ + testObject.$getChildren('testStringTreeProvider', 'aa').then(children => assert.equal(children.length, 0)), + testObject.$getChildren('testStringTreeProvider', 'ab').then(children => assert.equal(children.length, 0)) + ]); + }), + testObject.$getChildren('testStringTreeProvider', 'b') + .then(children => { + const actuals = children.map(e => e.handle); + assert.deepEqual(actuals, ['ba', 'bb']); + return TPromise.join([ + testObject.$getChildren('testStringTreeProvider', 'ba').then(children => assert.equal(children.length, 0)), + testObject.$getChildren('testStringTreeProvider', 'bb').then(children => assert.equal(children.length, 0)) + ]); + }) + ]); + }); + }); + + test('refresh root', function (done) { target.onRefresh.event(actuals => { - assert.equal(0, actuals.length); + assert.equal(undefined, actuals); done(); }); - onDidChangeTreeData.fire(); - onDidChangeTreeData.fire(); - onDidChangeTreeData.fire(); - onDidChangeTreeData.fire(); + onDidChangeTreeNode.fire(); + }); + + test('refresh a parent node', () => { + return new TPromise((c, e) => { + target.onRefresh.event(actuals => { + assert.deepEqual(['0/1:b'], Object.keys(actuals)); + assert.deepEqual(removeUnsetKeys(actuals['0/1:b']), { + handle: '0/1:b', + label: 'b', + }); + c(null); + }); + onDidChangeTreeNode.fire(getNode('b')); + }); + }); + + test('refresh a leaf node', function (done) { + target.onRefresh.event(actuals => { + assert.deepEqual(['0/1:b/1:bb'], Object.keys(actuals)); + assert.deepEqual(removeUnsetKeys(actuals['0/1:b/1:bb']), { + handle: '0/1:b/1:bb', + parentHandle: '0/1:b', + label: 'bb' + }); + done(); + }); + onDidChangeTreeNode.fire(getNode('bb')); + }); + + test('refresh parent and child node trigger refresh only on parent - scenario 1', function (done) { + target.onRefresh.event(actuals => { + assert.deepEqual(['0/1:b', '0/0:a/0:aa'], Object.keys(actuals)); + assert.deepEqual(removeUnsetKeys(actuals['0/1:b']), { + handle: '0/1:b', + label: 'b', + }); + assert.deepEqual(removeUnsetKeys(actuals['0/0:a/0:aa']), { + handle: '0/0:a/0:aa', + parentHandle: '0/0:a', + label: 'aa', + }); + done(); + }); + onDidChangeTreeNode.fire(getNode('b')); + onDidChangeTreeNode.fire(getNode('aa')); + onDidChangeTreeNode.fire(getNode('bb')); + }); + + test('refresh parent and child node trigger refresh only on parent - scenario 2', function (done) { + target.onRefresh.event(actuals => { + assert.deepEqual(['0/0:a/0:aa', '0/1:b'], Object.keys(actuals)); + assert.deepEqual(removeUnsetKeys(actuals['0/1:b']), { + handle: '0/1:b', + label: 'b', + }); + assert.deepEqual(removeUnsetKeys(actuals['0/0:a/0:aa']), { + handle: '0/0:a/0:aa', + parentHandle: '0/0:a', + label: 'aa', + }); + done(); + }); + onDidChangeTreeNode.fire(getNode('bb')); + onDidChangeTreeNode.fire(getNode('aa')); + onDidChangeTreeNode.fire(getNode('b')); + }); + + test('refresh an element for label change', function (done) { + labels['a'] = 'aa'; + target.onRefresh.event(actuals => { + assert.deepEqual(['0/0:a'], Object.keys(actuals)); + assert.deepEqual(removeUnsetKeys(actuals['0/0:a']), { + handle: '0/0:aa', + label: 'aa', + }); + done(); + }); + onDidChangeTreeNode.fire(getNode('a')); + }); + + test('refresh calls are throttled on roots', function (done) { + target.onRefresh.event(actuals => { + assert.equal(undefined, actuals); + done(); + }); + onDidChangeTreeNode.fire(); + onDidChangeTreeNode.fire(); + onDidChangeTreeNode.fire(); + onDidChangeTreeNode.fire(); }); test('refresh calls are throttled on elements', function (done) { target.onRefresh.event(actuals => { - assert.deepEqual([1, 2], actuals); + assert.deepEqual(['0/0:a', '0/1:b'], Object.keys(actuals)); done(); }); - onDidChangeTreeData.fire('a'); - onDidChangeTreeData.fire('b'); - onDidChangeTreeData.fire('b'); - onDidChangeTreeData.fire('a'); + onDidChangeTreeNode.fire(getNode('a')); + onDidChangeTreeNode.fire(getNode('b')); + onDidChangeTreeNode.fire(getNode('b')); + onDidChangeTreeNode.fire(getNode('a')); }); test('refresh calls are throttled on unknown elements', function (done) { target.onRefresh.event(actuals => { - assert.deepEqual([1, 2], actuals); + assert.deepEqual(['0/0:a', '0/1:b'], Object.keys(actuals)); done(); }); - onDidChangeTreeData.fire('a'); - onDidChangeTreeData.fire('b'); - onDidChangeTreeData.fire('g'); - onDidChangeTreeData.fire('a'); + onDidChangeTreeNode.fire(getNode('a')); + onDidChangeTreeNode.fire(getNode('b')); + onDidChangeTreeNode.fire(getNode('g')); + onDidChangeTreeNode.fire(getNode('a')); }); test('refresh calls are throttled on unknown elements and root', function (done) { target.onRefresh.event(actuals => { - assert.equal(0, actuals.length); + assert.equal(undefined, actuals); done(); }); - onDidChangeTreeData.fire('a'); - onDidChangeTreeData.fire('b'); - onDidChangeTreeData.fire('g'); - onDidChangeTreeData.fire(''); + onDidChangeTreeNode.fire(getNode('a')); + onDidChangeTreeNode.fire(getNode('b')); + onDidChangeTreeNode.fire(getNode('g')); + onDidChangeTreeNode.fire(); }); test('refresh calls are throttled on elements and root', function (done) { target.onRefresh.event(actuals => { - assert.equal(0, actuals.length); + assert.equal(undefined, actuals); done(); }); - onDidChangeTreeData.fire('a'); - onDidChangeTreeData.fire('b'); - onDidChangeTreeData.fire(); - onDidChangeTreeData.fire('a'); + onDidChangeTreeNode.fire(getNode('a')); + onDidChangeTreeNode.fire(getNode('b')); + onDidChangeTreeNode.fire(); + onDidChangeTreeNode.fire(getNode('a')); }); - function aTreeDataProvider(): TreeDataProvider { + test('generate unique handles from labels by escaping them', () => { + tree = { + 'a/0:b': {} + }; + + onDidChangeTreeNode.fire(); + + return testObject.$getElements('testNodeTreeProvider') + .then(elements => { + assert.deepEqual(elements.map(e => e.handle), ['0/0:a//0:b']); + }); + }); + + function removeUnsetKeys(obj: any): any { + const result = {}; + for (const key of Object.keys(obj)) { + if (obj[key] !== void 0) { + result[key] = obj[key]; + } + } + return result; + } + + function aNodeTreeDataProvider(): TreeDataProvider<{ key: string }> { return { - getChildren: (element: string): string[] => { - if (!element) { - return ['a', 'b']; - } - if (element === 'a') { - return ['aa', 'ab']; - } - if (element === 'b') { - return ['ba', 'bb']; - } - return []; + getChildren: (element: { key: string }): { key: string }[] => { + return getChildren(element ? element.key : undefined).map(key => getNode(key)); }, - getTreeItem: (element: string): TreeItem => { - return { - label: element - }; + getTreeItem: (element: { key: string }): TreeItem => { + return getTreeItem(element.key); }, - onDidChangeTreeData: onDidChangeTreeData.event + onDidChangeTreeData: onDidChangeTreeNode.event }; } + function aStringTreeDataProvider(): TreeDataProvider { + return { + getChildren: (element: string): string[] => { + return getChildren(element); + }, + getTreeItem: (element: string): TreeItem => { + return getTreeItem(element); + }, + onDidChangeTreeData: onDidChangeTreeKey.event + }; + } + + function getTreeElement(element): any { + let parent = tree; + for (let i = 0; i < element.length; i++) { + parent = parent[element.substring(0, i + 1)]; + if (!parent) { + return null; + } + } + return parent; + } + + function getChildren(key: string): string[] { + if (!key) { + return Object.keys(tree); + } + let treeElement = getTreeElement(key); + if (treeElement) { + const children = Object.keys(treeElement); + const collapsibleStateIndex = children.indexOf('collapsibleState'); + if (collapsibleStateIndex !== -1) { + children.splice(collapsibleStateIndex, 1); + } + return children; + } + return []; + } + + function getTreeItem(key: string): TreeItem { + const treeElement = getTreeElement(key); + return { + label: labels[key] || key, + collapsibleState: treeElement ? treeElement['collapsibleState'] : TreeItemCollapsibleState.Collapsed + }; + } + + function getNode(key: string): { key: string } { + if (!nodes[key]) { + nodes[key] = { key }; + } + return nodes[key]; + } + }); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index 8ad6d64fbd05..d8fe85cff6b3 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -65,7 +65,6 @@ suite('MainThreadDocumentsAndEditors', () => { null, null, editorGroupService, - null ); /* tslint:enable */ }); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts index a9e24acbef35..a0b70a56dc79 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts @@ -73,7 +73,6 @@ suite('MainThreadEditors', () => { null, null, editorGroupService, - null ); editors = new MainThreadEditors( @@ -84,7 +83,6 @@ suite('MainThreadEditors', () => { editorGroupService, null, null, - null, modelService ); }); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts index e3e90a945e4b..d6f3681d3319 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts @@ -12,6 +12,8 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; import { IModelService } from 'vs/editor/common/services/modelService'; +import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { ITextFileService, SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; @@ -112,4 +114,33 @@ suite('MainThreadSaveParticipant', function () { done(); }); }); + + test('trim final new lines bug#39750', function (done) { + const model: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/trim_final_new_line.txt'), 'utf8'); + + model.load().then(() => { + const configService = new TestConfigurationService(); + configService.setUserConfiguration('files', { 'trimFinalNewlines': true }); + + const participant = new TrimFinalNewLinesParticipant(configService, undefined); + + const textContent = 'Trim New Line'; + + // single line + let lineContent = `${textContent}`; + model.textEditorModel.setValue(lineContent); + // apply edits and push to undo stack. + let textEdits = [{ identifier: null, range: new Range(1, 14, 1, 14), text: '.', forceMoveMarkers: false }]; + model.textEditorModel.pushEditOperations([new Selection(1, 14, 1, 14)], textEdits, () => { return [new Selection(1, 15, 1, 15)]; }); + // undo + model.textEditorModel.undo(); + assert.equal(model.getValue(), `${textContent}`); + // trim final new lines should not mess the undo stack + participant.participate(model, { reason: SaveReason.EXPLICIT }); + model.textEditorModel.redo(); + assert.equal(model.getValue(), `${textContent}.`); + done(); + }); + }); + }); diff --git a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts index 7deb879a39c9..23f83bea217f 100644 --- a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts @@ -54,7 +54,7 @@ declare var __dirname: string; // git clone --separate-git-dir=testGit --no-checkout --single-branch https://chromium.googlesource.com/chromium/src testWorkspace // cd testWorkspace; git checkout 39a7f93d67f7 // Run from repository root folder with (test.bat on Windows): ./scripts/test.sh --grep QuickOpen.performance --timeout 180000 --testWorkspace -suite('QuickOpen performance (integration)', () => { +suite.skip('QuickOpen performance (integration)', () => { test('Measure', () => { if (process.env['VSCODE_PID']) { diff --git a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts index e4a382f3a789..abad8d1ee492 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts @@ -41,7 +41,7 @@ declare var __dirname: string; // git clone --separate-git-dir=testGit --no-checkout --single-branch https://chromium.googlesource.com/chromium/src testWorkspace // cd testWorkspace; git checkout 39a7f93d67f7 // Run from repository root folder with (test.bat on Windows): ./scripts/test-int-mocha.sh --grep TextSearch.performance --timeout 500000 --testWorkspace -suite('TextSearch performance (integration)', () => { +suite.skip('TextSearch performance (integration)', () => { test('Measure', () => { if (process.env['VSCODE_PID']) { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index e0dccc45d3a5..2d36b27c3b04 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -20,7 +20,7 @@ import Severity from 'vs/base/common/severity'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { IPartService, Parts, Position as PartPosition } from 'vs/workbench/services/part/common/partService'; +import { IPartService, Parts, Position as PartPosition, Dimension } from 'vs/workbench/services/part/common/partService'; import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput } from 'vs/platform/editor/common/editor'; @@ -168,7 +168,6 @@ export class TestTextFileService extends TextFileService { @ILifecycleService lifecycleService: ILifecycleService, @IWorkspaceContextService contextService: IWorkspaceContextService, @IConfigurationService configurationService: IConfigurationService, - @ITelemetryService telemetryService: ITelemetryService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IFileService fileService: IFileService, @IUntitledEditorService untitledEditorService: IUntitledEditorService, @@ -178,7 +177,7 @@ export class TestTextFileService extends TextFileService { @IWindowsService windowsService: IWindowsService, @IHistoryService historyService: IHistoryService ) { - super(lifecycleService, contextService, configurationService, telemetryService, fileService, untitledEditorService, instantiationService, messageService, TestEnvironmentService, backupFileService, windowsService, historyService); + super(lifecycleService, contextService, configurationService, fileService, untitledEditorService, instantiationService, messageService, TestEnvironmentService, backupFileService, windowsService, historyService); } public setPromptPath(path: string): void { @@ -215,7 +214,7 @@ export class TestTextFileService extends TextFileService { }); } - public promptForPath(defaultPath?: string): string { + public promptForPath(defaultPath: string): string { return this.promptPath; } @@ -329,11 +328,11 @@ export class TestMessageService implements IMessageService { // No-op } - public confirmSync(confirmation: IConfirmation): boolean { + public confirm(confirmation: IConfirmation): boolean { return false; } - public confirm(confirmation: IConfirmation): Promise { + public confirmWithCheckbox(confirmation: IConfirmation): Promise { return TPromise.as({ confirmed: false }); } } @@ -343,13 +342,13 @@ export class TestPartService implements IPartService { public _serviceBrand: any; private _onTitleBarVisibilityChange = new Emitter(); - private _onEditorLayout = new Emitter(); + private _onEditorLayout = new Emitter(); public get onTitleBarVisibilityChange(): Event { return this._onTitleBarVisibilityChange.event; } - public get onEditorLayout(): Event { + public get onEditorLayout(): Event { return this._onEditorLayout.event; } @@ -832,7 +831,7 @@ export class TestBackupFileService implements IBackupFileService { public loadBackupResource(resource: URI): TPromise { return this.hasBackup(resource).then(hasBackup => { if (hasBackup) { - return this.getBackupResource(resource); + return this.toBackupResource(resource); } return void 0; @@ -847,7 +846,7 @@ export class TestBackupFileService implements IBackupFileService { return TPromise.as(void 0); } - public getBackupResource(resource: URI): URI { + public toBackupResource(resource: URI): URI { return null; } @@ -962,19 +961,19 @@ export class TestWindowService implements IWindowService { return TPromise.as(void 0); } - showMessageBoxSync(options: Electron.MessageBoxOptions): number { + showMessageBox(options: Electron.MessageBoxOptions): number { return 0; } - showMessageBox(options: Electron.MessageBoxOptions): Promise { + showMessageBoxWithCheckbox(options: Electron.MessageBoxOptions): Promise { return TPromise.as(void 0); } - showSaveDialog(options: Electron.SaveDialogOptions, callback?: (fileName: string) => void): string { + showSaveDialog(options: Electron.SaveDialogOptions): string { return void 0; } - showOpenDialog(options: Electron.OpenDialogOptions, callback?: (fileNames: string[]) => void): string[] { + showOpenDialog(options: Electron.OpenDialogOptions): string[] { return void 0; } diff --git a/test/electron/renderer.js b/test/electron/renderer.js index 93fb1472aa9b..8afc71c35bfc 100644 --- a/test/electron/renderer.js +++ b/test/electron/renderer.js @@ -12,6 +12,12 @@ const glob = require('glob'); const minimatch = require('minimatch'); const istanbul = require('istanbul'); const i_remap = require('remap-istanbul/lib/remap'); +const util = require('util'); + +// Disabled custom inspect. See #38847 +if (util.inspect && util.inspect['defaultOptions']) { + util.inspect['defaultOptions'].customInspect = false; +} let _tests_glob = '**/test/**/*.test.js'; let loader; diff --git a/test/smoke/README.md b/test/smoke/README.md index 48e4cd60acd8..8856e454400c 100644 --- a/test/smoke/README.md +++ b/test/smoke/README.md @@ -10,7 +10,7 @@ npm run smoketest npm run smoketest -- --build "path/to/code" # Data Migration tests -npm run smoketest -- --build "path/to/code-insiders" --stable "path/to/code" +npm run smoketest -- --build "path/to/code-insiders" --stable-build "path/to/code" ``` The script calls mocha, so all mocha arguments should work fine. For example, use `-f Git` to only run the `Git` tests. diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index 4a92af159e19..b7ee545445a4 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -7,50 +7,52 @@ import * as assert from 'assert'; import { SpectronApplication } from '../../spectron/application'; import { ProblemSeverity, Problems } from '../problems/problems'; -describe('CSS', () => { - before(function () { - this.app.suiteName = 'CSS'; +export function setup() { + describe('CSS', () => { + before(function () { + this.app.suiteName = 'CSS'; + }); + + it('verifies quick outline', async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openFile('style.css'); + + await app.workbench.editor.openOutline(); + await app.workbench.quickopen.waitForQuickOpenElements(names => names.length === 2); + }); + + it('verifies warnings for the empty rule', async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openFile('style.css'); + await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); + + let warning = await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); + await app.screenCapturer.capture('CSS Warning in editor'); + assert.ok(warning, `Warning squiggle is not shown in 'style.css'.`); + + await app.workbench.problems.showProblemsView(); + warning = await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); + await app.screenCapturer.capture('CSS Warning in problems view'); + assert.ok(warning, 'Warning does not appear in Problems view.'); + await app.workbench.problems.hideProblemsView(); + }); + + it('verifies that warning becomes an error once setting changed', async function () { + const app = this.app as SpectronApplication; + await app.workbench.settingsEditor.addUserSetting('css.lint.emptyRules', '"error"'); + await app.workbench.quickopen.openFile('style.css'); + await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); + + let error = await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); + await app.screenCapturer.capture('CSS Error in editor'); + assert.ok(error, `Warning squiggle is not shown in 'style.css'.`); + + const problems = new Problems(app); + await problems.showProblemsView(); + error = await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); + await app.screenCapturer.capture('CSS Error in probles view'); + assert.ok(error, 'Warning does not appear in Problems view.'); + await problems.hideProblemsView(); + }); }); - - it('verifies quick outline', async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openFile('style.css'); - - await app.workbench.editor.openOutline(); - await app.workbench.quickopen.waitForQuickOpenElements(names => names.length === 2); - }); - - it('verifies warnings for the empty rule', async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openFile('style.css'); - await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - - let warning = await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); - await app.screenCapturer.capture('CSS Warning in editor'); - assert.ok(warning, `Warning squiggle is not shown in 'style.css'.`); - - await app.workbench.problems.showProblemsView(); - warning = await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); - await app.screenCapturer.capture('CSS Warning in problems view'); - assert.ok(warning, 'Warning does not appear in Problems view.'); - await app.workbench.problems.hideProblemsView(); - }); - - it('verifies that warning becomes an error once setting changed', async function () { - const app = this.app as SpectronApplication; - await app.workbench.settingsEditor.addUserSetting('css.lint.emptyRules', '"error"'); - await app.workbench.quickopen.openFile('style.css'); - await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - - let error = await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); - await app.screenCapturer.capture('CSS Error in editor'); - assert.ok(error, `Warning squiggle is not shown in 'style.css'.`); - - const problems = new Problems(app); - await problems.showProblemsView(); - error = await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); - await app.screenCapturer.capture('CSS Error in probles view'); - assert.ok(error, 'Warning does not appear in Problems view.'); - await problems.hideProblemsView(); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index 7ccef1195313..3218911858dc 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -11,144 +11,189 @@ import * as fs from 'fs'; import * as stripJsonComments from 'strip-json-comments'; import { SpectronApplication, Quality } from '../../spectron/application'; -describe('Debug', () => { +export function setup() { + describe('Debug', () => { + let skip = false; - before(async function () { - const app = this.app as SpectronApplication; + before(async function () { + const app = this.app as SpectronApplication; - if (app.quality === Quality.Dev) { - const extensionsPath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions'); + if (app.quality === Quality.Dev) { + const extensionsPath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions'); - const debugPath = path.join(extensionsPath, 'vscode-node-debug'); - const debugExists = fs.existsSync(debugPath); + const debugPath = path.join(extensionsPath, 'vscode-node-debug'); + const debugExists = fs.existsSync(debugPath); - const debug2Path = path.join(extensionsPath, 'vscode-node-debug2'); - const debug2Exists = fs.existsSync(debug2Path); + const debug2Path = path.join(extensionsPath, 'vscode-node-debug2'); + const debug2Exists = fs.existsSync(debug2Path); - if (!debugExists) { - console.warn(`Skipping debug tests because vscode-node-debug extension was not found in ${extensionsPath}`); + if (!debugExists) { + console.warn(`Skipping debug tests because vscode-node-debug extension was not found in ${extensionsPath}`); + skip = true; + return; + } + + if (!debug2Exists) { + console.warn(`Skipping debug tests because vscode-node-debug2 extension was not found in ${extensionsPath}`); + skip = true; + return; + } + + await new Promise((c, e) => fs.symlink(debugPath, path.join(app.extensionsPath, 'vscode-node-debug'), err => err ? e(err) : c())); + await new Promise((c, e) => fs.symlink(debug2Path, path.join(app.extensionsPath, 'vscode-node-debug2'), err => err ? e(err) : c())); + await app.reload(); + } + + this.app.suiteName = 'Debug'; + }); + + it('configure launch json', async function () { + if (skip) { + this.skip(); return; } - if (!debug2Exists) { - console.warn(`Skipping debug tests because vscode-node-debug2 extension was not found in ${extensionsPath}`); + const app = this.app as SpectronApplication; + + await app.workbench.debug.openDebugViewlet(); + await app.workbench.quickopen.openFile('app.js'); + await app.workbench.debug.configure(); + + const launchJsonPath = path.join(app.workspacePath, '.vscode', 'launch.json'); + const content = fs.readFileSync(launchJsonPath, 'utf8'); + const config = JSON.parse(stripJsonComments(content)); + config.configurations[0].protocol = 'inspector'; + fs.writeFileSync(launchJsonPath, JSON.stringify(config, undefined, 4), 'utf8'); + + await app.workbench.editor.waitForEditorContents('launch.json', contents => /"protocol": "inspector"/.test(contents)); + await app.screenCapturer.capture('launch.json file'); + + assert.equal(config.configurations[0].request, 'launch'); + assert.equal(config.configurations[0].type, 'node'); + if (process.platform === 'win32') { + assert.equal(config.configurations[0].program, '${workspaceFolder}\\bin\\www'); + } else { + assert.equal(config.configurations[0].program, '${workspaceFolder}/bin/www'); + } + }); + + it('breakpoints', async function () { + if (skip) { + this.skip(); return; } - await new Promise((c, e) => fs.symlink(debugPath, path.join(app.extensionsPath, 'vscode-node-debug'), err => err ? e(err) : c())); - await new Promise((c, e) => fs.symlink(debug2Path, path.join(app.extensionsPath, 'vscode-node-debug2'), err => err ? e(err) : c())); - await app.reload(); - } + const app = this.app as SpectronApplication; - this.app.suiteName = 'Debug'; - }); - - it('configure launch json', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.debug.openDebugViewlet(); - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.debug.configure(); - - const launchJsonPath = path.join(app.workspacePath, '.vscode', 'launch.json'); - const content = fs.readFileSync(launchJsonPath, 'utf8'); - const config = JSON.parse(stripJsonComments(content)); - config.configurations[0].protocol = 'inspector'; - fs.writeFileSync(launchJsonPath, JSON.stringify(config, undefined, 4), 'utf8'); - - await app.workbench.editor.waitForEditorContents('launch.json', contents => /"protocol": "inspector"/.test(contents)); - await app.screenCapturer.capture('launch.json file'); - - assert.equal(config.configurations[0].request, 'launch'); - assert.equal(config.configurations[0].type, 'node'); - if (process.platform === 'win32') { - assert.equal(config.configurations[0].program, '${workspaceFolder}\\bin\\www'); - } else { - assert.equal(config.configurations[0].program, '${workspaceFolder}/bin/www'); - } - }); - - it('breakpoints', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.quickopen.openFile('index.js'); - await app.workbench.debug.setBreakpointOnLine(6); - await app.screenCapturer.capture('breakpoints are set'); - }); - - let port: number; - it('start debugging', async function () { - const app = this.app as SpectronApplication; - - port = await app.workbench.debug.startDebugging(); - await app.screenCapturer.capture('debugging has started'); - - await new Promise((c, e) => { - const request = http.get(`http://localhost:${port}`); - request.on('error', e); - app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 6, 'looking for index.js and line 6').then(c, e); + await app.workbench.quickopen.openFile('index.js'); + await app.workbench.debug.setBreakpointOnLine(6); + await app.screenCapturer.capture('breakpoints are set'); }); - await app.screenCapturer.capture('debugging is paused'); - }); + let port: number; + it('start debugging', async function () { + if (skip) { + this.skip(); + return; + } - it('focus stack frames and variables', async function () { - const app = this.app as SpectronApplication; + const app = this.app as SpectronApplication; - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); + port = await app.workbench.debug.startDebugging(); + await app.screenCapturer.capture('debugging has started'); - await app.workbench.debug.focusStackFrame('layer.js', 'looking for layer.js'); - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 5, 'there should be 5 local variables'); + await new Promise((c, e) => { + const request = http.get(`http://localhost:${port}`); + request.on('error', e); + app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 6, 'looking for index.js and line 6').then(c, e); + }); - await app.workbench.debug.focusStackFrame('route.js', 'looking for route.js'); - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 3, 'there should be 3 local variables'); - - await app.workbench.debug.focusStackFrame('index.js', 'looking for index.js'); - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); - }); - - it('stepOver, stepIn, stepOut', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.debug.stepIn(); - await app.screenCapturer.capture('debugging has stepped in'); - - const first = await app.workbench.debug.waitForStackFrame(sf => sf.name === 'response.js', 'looking for response.js'); - await app.workbench.debug.stepOver(); - await app.screenCapturer.capture('debugging has stepped over'); - - await app.workbench.debug.waitForStackFrame(sf => sf.name === 'response.js' && sf.lineNumber === first.lineNumber + 1, `looking for response.js and line ${first.lineNumber + 1}`); - await app.workbench.debug.stepOut(); - await app.screenCapturer.capture('debugging has stepped out'); - - await app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 7, `looking for index.js and line 7`); - }); - - it('continue', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.debug.continue(); - await app.screenCapturer.capture('debugging has continued'); - - await new Promise((c, e) => { - const request = http.get(`http://localhost:${port}`); - request.on('error', e); - app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 6, `looking for index.js and line 6`).then(c, e); + await app.screenCapturer.capture('debugging is paused'); }); - await app.screenCapturer.capture('debugging is paused'); + it('focus stack frames and variables', async function () { + if (skip) { + this.skip(); + return; + } + + const app = this.app as SpectronApplication; + + await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); + + await app.workbench.debug.focusStackFrame('layer.js', 'looking for layer.js'); + await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 5, 'there should be 5 local variables'); + + await app.workbench.debug.focusStackFrame('route.js', 'looking for route.js'); + await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 3, 'there should be 3 local variables'); + + await app.workbench.debug.focusStackFrame('index.js', 'looking for index.js'); + await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); + }); + + it('stepOver, stepIn, stepOut', async function () { + if (skip) { + this.skip(); + return; + } + + const app = this.app as SpectronApplication; + + await app.workbench.debug.stepIn(); + await app.screenCapturer.capture('debugging has stepped in'); + + const first = await app.workbench.debug.waitForStackFrame(sf => sf.name === 'response.js', 'looking for response.js'); + await app.workbench.debug.stepOver(); + await app.screenCapturer.capture('debugging has stepped over'); + + await app.workbench.debug.waitForStackFrame(sf => sf.name === 'response.js' && sf.lineNumber === first.lineNumber + 1, `looking for response.js and line ${first.lineNumber + 1}`); + await app.workbench.debug.stepOut(); + await app.screenCapturer.capture('debugging has stepped out'); + + await app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 7, `looking for index.js and line 7`); + }); + + it('continue', async function () { + if (skip) { + this.skip(); + return; + } + + const app = this.app as SpectronApplication; + + await app.workbench.debug.continue(); + await app.screenCapturer.capture('debugging has continued'); + + await new Promise((c, e) => { + const request = http.get(`http://localhost:${port}`); + request.on('error', e); + app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 6, `looking for index.js and line 6`).then(c, e); + }); + + await app.screenCapturer.capture('debugging is paused'); + }); + + it('debug console', async function () { + if (skip) { + this.skip(); + return; + } + + const app = this.app as SpectronApplication; + + await app.workbench.debug.waitForReplCommand('2 + 2', r => r === '4'); + }); + + it('stop debugging', async function () { + if (skip) { + this.skip(); + return; + } + + const app = this.app as SpectronApplication; + + await app.workbench.debug.stopDebugging(); + await app.screenCapturer.capture('debugging has stopped'); + }); }); - - it('debug console', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.debug.waitForReplCommand('2 + 2', r => r === '4'); - }); - - it('stop debugging', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.debug.stopDebugging(); - await app.screenCapturer.capture('debugging has stopped'); - }); -}); +} \ No newline at end of file diff --git a/test/smoke/src/areas/editor/editor.test.ts b/test/smoke/src/areas/editor/editor.test.ts index c6d588076ed0..0911d1001004 100644 --- a/test/smoke/src/areas/editor/editor.test.ts +++ b/test/smoke/src/areas/editor/editor.test.ts @@ -5,69 +5,71 @@ import { SpectronApplication } from '../../spectron/application'; -describe('Editor', () => { - before(function () { - this.app.suiteName = 'Editor'; +export function setup() { + describe('Editor', () => { + before(function () { + this.app.suiteName = 'Editor'; + }); + + it('shows correct quick outline', async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openFile('www'); + + await app.workbench.editor.openOutline(); + await app.workbench.quickopen.waitForQuickOpenElements(names => names.length >= 6); + }); + + it(`finds 'All References' to 'app'`, async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openFile('www'); + + const references = await app.workbench.editor.findReferences('app', 7); + + await references.waitForReferencesCountInTitle(3); + await references.waitForReferencesCount(3); + await references.close(); + }); + + it(`renames local 'app' variable`, async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openFile('www'); + await app.workbench.editor.rename('www', 7, 'app', 'newApp'); + await app.workbench.editor.waitForEditorContents('www', contents => contents.indexOf('newApp') > -1); + await app.screenCapturer.capture('Rename result'); + }); + + // it('folds/unfolds the code correctly', async function () { + // await app.workbench.quickopen.openFile('www'); + + // // Fold + // await app.workbench.editor.foldAtLine(3); + // await app.workbench.editor.waitUntilShown(3); + // await app.workbench.editor.waitUntilHidden(4); + // await app.workbench.editor.waitUntilHidden(5); + + // // Unfold + // await app.workbench.editor.unfoldAtLine(3); + // await app.workbench.editor.waitUntilShown(3); + // await app.workbench.editor.waitUntilShown(4); + // await app.workbench.editor.waitUntilShown(5); + // }); + + it(`verifies that 'Go To Definition' works`, async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openFile('app.js'); + + await app.workbench.editor.gotoDefinition('express', 11); + + await app.workbench.waitForActiveTab('index.d.ts'); + }); + + it(`verifies that 'Peek Definition' works`, async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openFile('app.js'); + + const peek = await app.workbench.editor.peekDefinition('express', 11); + + await peek.waitForFile('index.d.ts'); + }); }); - - it('shows correct quick outline', async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openFile('www'); - - await app.workbench.editor.openOutline(); - await app.workbench.quickopen.waitForQuickOpenElements(names => names.length >= 6); - }); - - it(`finds 'All References' to 'app'`, async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openFile('www'); - - const references = await app.workbench.editor.findReferences('app', 7); - - await references.waitForReferencesCountInTitle(3); - await references.waitForReferencesCount(3); - await references.close(); - }); - - it(`renames local 'app' variable`, async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openFile('www'); - await app.workbench.editor.rename('www', 7, 'app', 'newApp'); - await app.workbench.editor.waitForEditorContents('www', contents => contents.indexOf('newApp') > -1); - await app.screenCapturer.capture('Rename result'); - }); - - // it('folds/unfolds the code correctly', async function () { - // await app.workbench.quickopen.openFile('www'); - - // // Fold - // await app.workbench.editor.foldAtLine(3); - // await app.workbench.editor.waitUntilShown(3); - // await app.workbench.editor.waitUntilHidden(4); - // await app.workbench.editor.waitUntilHidden(5); - - // // Unfold - // await app.workbench.editor.unfoldAtLine(3); - // await app.workbench.editor.waitUntilShown(3); - // await app.workbench.editor.waitUntilShown(4); - // await app.workbench.editor.waitUntilShown(5); - // }); - - it(`verifies that 'Go To Definition' works`, async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openFile('app.js'); - - await app.workbench.editor.gotoDefinition('express', 11); - - await app.workbench.waitForActiveTab('index.d.ts'); - }); - - it(`verifies that 'Peek Definition' works`, async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openFile('app.js'); - - const peek = await app.workbench.editor.peekDefinition('express', 11); - - await peek.waitForFile('index.d.ts'); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/explorer/explorer.test.ts b/test/smoke/src/areas/explorer/explorer.test.ts index edf0088cf200..ab77642f6ddb 100644 --- a/test/smoke/src/areas/explorer/explorer.test.ts +++ b/test/smoke/src/areas/explorer/explorer.test.ts @@ -5,38 +5,40 @@ import { SpectronApplication } from '../../spectron/application'; -describe('Explorer', () => { - before(function () { - this.app.suiteName = 'Explorer'; +export function setup() { + describe('Explorer', () => { + before(function () { + this.app.suiteName = 'Explorer'; + }); + + it('quick open search produces correct result', async function () { + const app = this.app as SpectronApplication; + const expectedNames = [ + '.eslintrc.json', + 'tasks.json', + 'app.js', + 'index.js', + 'users.js', + 'package.json', + 'jsconfig.json' + ]; + + await app.workbench.quickopen.openQuickOpen('.js'); + await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); + await app.client.keys(['Escape', 'NULL']); + }); + + it('quick open respects fuzzy matching', async function () { + const app = this.app as SpectronApplication; + const expectedNames = [ + 'tasks.json', + 'app.js', + 'package.json' + ]; + + await app.workbench.quickopen.openQuickOpen('a.s'); + await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); + await app.client.keys(['Escape', 'NULL']); + }); }); - - it('quick open search produces correct result', async function () { - const app = this.app as SpectronApplication; - const expectedNames = [ - '.eslintrc.json', - 'tasks.json', - 'app.js', - 'index.js', - 'users.js', - 'package.json', - 'jsconfig.json' - ]; - - await app.workbench.quickopen.openQuickOpen('.js'); - await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.client.keys(['Escape', 'NULL']); - }); - - it('quick open respects fuzzy matching', async function () { - const app = this.app as SpectronApplication; - const expectedNames = [ - 'tasks.json', - 'app.js', - 'package.json' - ]; - - await app.workbench.quickopen.openQuickOpen('a.s'); - await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.client.keys(['Escape', 'NULL']); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index 135b87403c38..33776a254050 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -6,31 +6,33 @@ import * as assert from 'assert'; import { SpectronApplication, Quality } from '../../spectron/application'; -describe('Extensions', () => { - before(function () { - this.app.suiteName = 'Extensions'; +export function setup() { + describe('Extensions', () => { + before(function () { + this.app.suiteName = 'Extensions'; + }); + + it(`install and activate vscode-smoketest-check extension`, async function () { + const app = this.app as SpectronApplication; + + if (app.quality === Quality.Dev) { + this.skip(); + return; + } + + const extensionName = 'vscode-smoketest-check'; + await app.workbench.extensions.openExtensionsViewlet(); + + const installed = await app.workbench.extensions.installExtension(extensionName); + assert.ok(installed); + + await app.reload(); + await app.workbench.extensions.waitForExtensionsViewlet(); + await app.workbench.quickopen.runCommand('Smoke Test Check'); + + const statusbarText = await app.workbench.statusbar.getStatusbarTextByTitle('smoke test'); + await app.screenCapturer.capture('Statusbar'); + assert.equal(statusbarText, 'VS Code Smoke Test Check'); + }); }); - - it(`install and activate vscode-smoketest-check extension`, async function () { - const app = this.app as SpectronApplication; - - if (app.quality === Quality.Dev) { - this.skip(); - return; - } - - const extensionName = 'vscode-smoketest-check'; - await app.workbench.extensions.openExtensionsViewlet(); - - const installed = await app.workbench.extensions.installExtension(extensionName); - assert.ok(installed); - - await app.reload(); - await app.workbench.extensions.waitForExtensionsViewlet(); - await app.workbench.quickopen.runCommand('Smoke Test Check'); - - const statusbarText = await app.workbench.statusbar.getStatusbarTextByTitle('smoke test'); - await app.screenCapturer.capture('Statusbar'); - assert.equal(statusbarText, 'VS Code Smoke Test Check'); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index d64a72f7d43c..19f1c3e51d27 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -10,90 +10,79 @@ import { SpectronApplication } from '../../spectron/application'; const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; -describe('Git', () => { - before(function () { - this.app.suiteName = 'Git'; - }); +export function setup() { + describe('Git', () => { + before(function () { + this.app.suiteName = 'Git'; + }); - it('reflects working tree changes', async function () { - const app = this.app as SpectronApplication; + it('reflects working tree changes', async function () { + const app = this.app as SpectronApplication; - await app.workbench.scm.openSCMViewlet(); + await app.workbench.scm.openSCMViewlet(); - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.editor.waitForTypeInEditor('app.js', '.foo{}'); - await app.workbench.saveOpenedFile(); + await app.workbench.quickopen.openFile('app.js'); + await app.workbench.editor.waitForTypeInEditor('app.js', '.foo{}'); + await app.workbench.saveOpenedFile(); - await app.workbench.quickopen.openFile('index.jade'); - await app.workbench.editor.waitForTypeInEditor('index.jade', 'hello world'); - await app.workbench.saveOpenedFile(); + await app.workbench.quickopen.openFile('index.jade'); + await app.workbench.editor.waitForTypeInEditor('index.jade', 'hello world'); + await app.workbench.saveOpenedFile(); - await app.workbench.scm.refreshSCMViewlet(); - const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js'); - const indexJade = await app.workbench.scm.waitForChange(c => c.name === 'index.jade'); - await app.screenCapturer.capture('changes'); + await app.workbench.scm.refreshSCMViewlet(); + const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js'); + const indexJade = await app.workbench.scm.waitForChange(c => c.name === 'index.jade'); + await app.screenCapturer.capture('changes'); - assert.equal(appJs.name, 'app.js'); - assert.equal(appJs.type, 'Modified'); + assert.equal(appJs.name, 'app.js'); + assert.equal(appJs.type, 'Modified'); - assert.equal(indexJade.name, 'index.jade'); - assert.equal(indexJade.type, 'Modified'); - }); + assert.equal(indexJade.name, 'index.jade'); + assert.equal(indexJade.type, 'Modified'); + }); - it('opens diff editor', async function () { - const app = this.app as SpectronApplication; + it('opens diff editor', async function () { + const app = this.app as SpectronApplication; - await app.workbench.scm.openSCMViewlet(); - const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js'); - await app.workbench.scm.openChange(appJs); - await app.client.waitForElement(DIFF_EDITOR_LINE_INSERT); - }); + await app.workbench.scm.openSCMViewlet(); + const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js'); + await app.workbench.scm.openChange(appJs); + await app.client.waitForElement(DIFF_EDITOR_LINE_INSERT); + }); - it('stages correctly', async function () { - const app = this.app as SpectronApplication; + it('stages correctly', async function () { + const app = this.app as SpectronApplication; - // TODO@joao get these working once joh fixes scm viewlet - if (!false) { - this.skip(); - return; - } + await app.workbench.scm.openSCMViewlet(); - await app.workbench.scm.openSCMViewlet(); + const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Modified'); + await app.workbench.scm.stage(appJs); - const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Modified'); - await app.workbench.scm.stage(appJs); + const indexAppJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Index Modified'); + await app.workbench.scm.unstage(indexAppJs); - const indexAppJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Index Modified'); - await app.workbench.scm.unstage(indexAppJs); + await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Modified'); + }); - await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Modified'); - }); + it(`stages, commits changes and verifies outgoing change`, async function () { + const app = this.app as SpectronApplication; - it(`stages, commits changes and verifies outgoing change`, async function () { - const app = this.app as SpectronApplication; + await app.workbench.scm.openSCMViewlet(); + + const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Modified'); + await app.workbench.scm.stage(appJs); + await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Index Modified'); + + await app.workbench.scm.commit('first commit'); + await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 1↑'); + + await app.workbench.quickopen.runCommand('Git: Stage All Changes'); + await app.workbench.scm.waitForChange(c => c.name === 'index.jade' && c.type === 'Index Modified'); + + await app.workbench.scm.commit('second commit'); + await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 2↑'); - // TODO@joao get these working once joh fixes scm viewlet - if (!false) { cp.execSync('git reset --hard origin/master', { cwd: app.workspacePath }); - this.skip(); - return; - } - - await app.workbench.scm.openSCMViewlet(); - - const appJs = await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Modified'); - await app.workbench.scm.stage(appJs); - await app.workbench.scm.waitForChange(c => c.name === 'app.js' && c.type === 'Index Modified'); - - await app.workbench.scm.commit('first commit'); - await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 1↑'); - - await app.workbench.quickopen.runCommand('Git: Stage All Changes'); - await app.workbench.scm.waitForChange(c => c.name === 'index.jade' && c.type === 'Index Modified'); - - await app.workbench.scm.commit('second commit'); - await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 2↑'); - - cp.execSync('git reset --hard origin/master', { cwd: app.workspacePath }); + }); }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index bc99619478ad..ed33e320710d 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -13,7 +13,7 @@ const SCM_RESOURCE = `${VIEWLET} .monaco-list-row > .resource`; const SCM_RESOURCE_GROUP = `${VIEWLET} .monaco-list-row > .resource-group`; const REFRESH_COMMAND = `div[id="workbench.parts.sidebar"] .actions-container a.action-label[title="Refresh"]`; const COMMIT_COMMAND = `div[id="workbench.parts.sidebar"] .actions-container a.action-label[title="Commit"]`; -const SCM_RESOURCE_CLICK = name => `${SCM_RESOURCE} .monaco-icon-label[title$="${name}"]`; +const SCM_RESOURCE_CLICK = name => `${SCM_RESOURCE} .monaco-icon-label[title*="${name}"]`; const SCM_RESOURCE_GROUP_COMMAND_CLICK = name => `${SCM_RESOURCE_GROUP} .actions .action-label[title="${name}"]`; export interface Change { @@ -49,7 +49,7 @@ export class SCM extends Viewlet { const result = await this.spectron.webclient.selectorExecute(SCM_RESOURCE, div => (Array.isArray(div) ? div : [div]).map(element => { const name = element.querySelector('.label-name') as HTMLElement; - const icon = element.querySelector('.monaco-icon-label') as HTMLElement; + const icon = element.querySelector('.decoration-icon') as HTMLElement; const actionElementList = element.querySelectorAll('.actions .action-label'); const actionElements: any[] = []; @@ -60,7 +60,7 @@ export class SCM extends Viewlet { return { name: name.textContent, - type: (icon.title || '').replace(/^([^,]+),.*$/, '$1'), + type: (icon.title || ''), element, actionElements }; diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index 9529fe3c3240..3575dfedd707 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -6,32 +6,34 @@ import * as assert from 'assert'; import { SpectronApplication } from '../../spectron/application'; -describe('Multiroot', () => { +export function setup() { + describe('Multiroot', () => { - before(async function () { - this.app.suiteName = 'Multiroot'; + before(async function () { + this.app.suiteName = 'Multiroot'; - const app = this.app as SpectronApplication; + const app = this.app as SpectronApplication; - await app.restart([app.workspaceFilePath]); + await app.restart([app.workspaceFilePath]); - // for some reason Code opens 2 windows at this point - // so let's select the last one - await app.client.windowByIndex(2); + // for some reason Code opens 2 windows at this point + // so let's select the last one + await app.webclient.windowByIndex(1); + }); + + it('shows results from all folders', async function () { + const app = this.app as SpectronApplication; + await app.workbench.quickopen.openQuickOpen('*.*'); + + await app.workbench.quickopen.waitForQuickOpenElements(names => names.length >= 6); + await app.workbench.quickopen.closeQuickOpen(); + }); + + it('shows workspace name in title', async function () { + const app = this.app as SpectronApplication; + const title = await app.client.getTitle(); + await app.screenCapturer.capture('window title'); + assert.ok(title.indexOf('smoketest (Workspace)') >= 0); + }); }); - - it('shows results from all folders', async function () { - const app = this.app as SpectronApplication; - await app.workbench.quickopen.openQuickOpen('*.*'); - - await app.workbench.quickopen.waitForQuickOpenElements(names => names.length >= 6); - await app.workbench.quickopen.closeQuickOpen(); - }); - - it('shows workspace name in title', async function () { - const app = this.app as SpectronApplication; - const title = await app.client.getTitle(); - await app.screenCapturer.capture('window title'); - assert.ok(title.indexOf('smoketest (Workspace)') >= 0); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index 139997dfa828..f273d6a9c12f 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -8,39 +8,41 @@ import * as assert from 'assert'; import { SpectronApplication } from '../../spectron/application'; import { ActivityBarPosition } from '../activitybar/activityBar'; -describe('Preferences', () => { - before(function () { - this.app.suiteName = 'Preferences'; +export function setup() { + describe('Preferences', () => { + before(function () { + this.app.suiteName = 'Preferences'; + }); + + it('turns off editor line numbers and verifies the live change', async function () { + const app = this.app as SpectronApplication; + + await app.workbench.explorer.openFile('app.js'); + let lineNumbers = await app.client.waitForElements('.line-numbers'); + await app.screenCapturer.capture('app.js has line numbers'); + assert.ok(!!lineNumbers.length, 'Line numbers are not present in the editor before disabling them.'); + + await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); + await app.workbench.selectTab('app.js'); + lineNumbers = await app.client.waitForElements('.line-numbers', result => !result || result.length === 0); + + await app.screenCapturer.capture('line numbers hidden'); + assert.ok(!lineNumbers.length, 'Line numbers are still present in the editor after disabling them.'); + }); + + it(`changes 'workbench.action.toggleSidebarPosition' command key binding and verifies it`, async function () { + const app = this.app as SpectronApplication; + assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.LEFT), 'Activity bar should be positioned on the left.'); + + await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', ['Control', 'u'], 'Control+U'); + + await app.client.keys(['Control', 'u', 'NULL']); + assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.RIGHT), 'Activity bar was not moved to right after toggling its position.'); + }); + + after(async function () { + const app = this.app as SpectronApplication; + await app.workbench.settingsEditor.clearUserSettings(); + }); }); - - it('turns off editor line numbers and verifies the live change', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.explorer.openFile('app.js'); - let lineNumbers = await app.client.waitForElements('.line-numbers'); - await app.screenCapturer.capture('app.js has line numbers'); - assert.ok(!!lineNumbers.length, 'Line numbers are not present in the editor before disabling them.'); - - await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); - await app.workbench.selectTab('app.js'); - lineNumbers = await app.client.waitForElements('.line-numbers', result => !result || result.length === 0); - - await app.screenCapturer.capture('line numbers hidden'); - assert.ok(!lineNumbers.length, 'Line numbers are still present in the editor after disabling them.'); - }); - - it(`changes 'workbench.action.toggleSidebarPosition' command key binding and verifies it`, async function () { - const app = this.app as SpectronApplication; - assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.LEFT), 'Activity bar should be positioned on the left.'); - - await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', ['Control', 'u'], 'Control+U'); - - await app.client.keys(['Control', 'u', 'NULL']); - assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.RIGHT), 'Activity bar was not moved to right after toggling its position.'); - }); - - after(async function () { - const app = this.app as SpectronApplication; - await app.workbench.settingsEditor.clearUserSettings(); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/search/search.test.ts b/test/smoke/src/areas/search/search.test.ts index 6f43bbab3413..a0e932298b67 100644 --- a/test/smoke/src/areas/search/search.test.ts +++ b/test/smoke/src/areas/search/search.test.ts @@ -5,52 +5,54 @@ import { SpectronApplication } from '../../spectron/application'; -describe('Search', () => { - before(function () { - this.app.suiteName = 'Search'; +export function setup() { + describe('Search', () => { + before(function () { + this.app.suiteName = 'Search'; + }); + + it('searches for body & checks for correct result number', async function () { + const app = this.app as SpectronApplication; + await app.workbench.search.openSearchViewlet(); + await app.workbench.search.searchFor('body'); + + await app.workbench.search.waitForResultText('14 results in 5 files'); + }); + + it('searches only for *.js files & checks for correct result number', async function () { + const app = this.app as SpectronApplication; + await app.workbench.search.searchFor('body'); + await app.workbench.search.showQueryDetails(); + await app.workbench.search.setFilesToIncludeText('*.js'); + await app.workbench.search.submitSearch(); + + await app.workbench.search.waitForResultText('4 results in 1 file'); + await app.workbench.search.setFilesToIncludeText(''); + await app.workbench.search.hideQueryDetails(); + }); + + it('dismisses result & checks for correct result number', async function () { + const app = this.app as SpectronApplication; + await app.workbench.search.searchFor('body'); + await app.workbench.search.removeFileMatch(1); + await app.workbench.search.waitForResultText('10 results in 4 files'); + }); + + it('replaces first search result with a replace term', async function () { + const app = this.app as SpectronApplication; + + await app.workbench.search.searchFor('body'); + await app.workbench.search.expandReplace(); + await app.workbench.search.setReplaceText('ydob'); + await app.workbench.search.replaceFileMatch(1); + await app.workbench.saveOpenedFile(); + + await app.workbench.search.waitForResultText('10 results in 4 files'); + + await app.workbench.search.searchFor('ydob'); + await app.workbench.search.setReplaceText('body'); + await app.workbench.search.replaceFileMatch(1); + await app.workbench.saveOpenedFile(); + }); }); - - it('searches for body & checks for correct result number', async function () { - const app = this.app as SpectronApplication; - await app.workbench.search.openSearchViewlet(); - await app.workbench.search.searchFor('body'); - - await app.workbench.search.waitForResultText('7 results in 4 files'); - }); - - it('searches only for *.js files & checks for correct result number', async function () { - const app = this.app as SpectronApplication; - await app.workbench.search.searchFor('body'); - await app.workbench.search.showQueryDetails(); - await app.workbench.search.setFilesToIncludeText('*.js'); - await app.workbench.search.submitSearch(); - - await app.workbench.search.waitForResultText('4 results in 1 file'); - await app.workbench.search.setFilesToIncludeText(''); - await app.workbench.search.hideQueryDetails(); - }); - - it('dismisses result & checks for correct result number', async function () { - const app = this.app as SpectronApplication; - await app.workbench.search.searchFor('body'); - await app.workbench.search.removeFileMatch(1); - await app.workbench.search.waitForResultText('3 results in 3 files'); - }); - - it('replaces first search result with a replace term', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.search.searchFor('body'); - await app.workbench.search.expandReplace(); - await app.workbench.search.setReplaceText('ydob'); - await app.workbench.search.replaceFileMatch(1); - await app.workbench.saveOpenedFile(); - - await app.workbench.search.waitForResultText('3 results in 3 files'); - - await app.workbench.search.searchFor('ydob'); - await app.workbench.search.setReplaceText('body'); - await app.workbench.search.replaceFileMatch(1); - await app.workbench.saveOpenedFile(); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index d4bff75312a7..044af05c8d9f 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -8,90 +8,92 @@ import * as assert from 'assert'; import { SpectronApplication, Quality } from '../../spectron/application'; import { StatusBarElement } from './statusbar'; -describe('Statusbar', () => { - before(function () { - this.app.suiteName = 'Statusbar'; +export function setup() { + describe('Statusbar', () => { + before(function () { + this.app.suiteName = 'Statusbar'; + }); + + it('verifies presence of all default status bar elements', async function () { + const app = this.app as SpectronApplication; + + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); + if (app.quality !== Quality.Dev) { + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.FEEDBACK_ICON); + } + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.SYNC_STATUS); + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.PROBLEMS_STATUS); + + await app.workbench.quickopen.openFile('app.js'); + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.ENCODING_STATUS); + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.EOL_STATUS); + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.INDENTATION_STATUS); + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.LANGUAGE_STATUS); + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.SELECTION_STATUS); + }); + + it(`verifies that 'quick open' opens when clicking on status bar elements`, async function () { + const app = this.app as SpectronApplication; + + await app.workbench.statusbar.clickOn(StatusBarElement.BRANCH_STATUS); + await app.workbench.quickopen.waitForQuickOpenOpened(); + await app.workbench.quickopen.closeQuickOpen(); + + await app.workbench.quickopen.openFile('app.js'); + await app.workbench.statusbar.clickOn(StatusBarElement.INDENTATION_STATUS); + await app.workbench.quickopen.waitForQuickOpenOpened(); + await app.workbench.quickopen.closeQuickOpen(); + await app.workbench.statusbar.clickOn(StatusBarElement.ENCODING_STATUS); + await app.workbench.quickopen.waitForQuickOpenOpened(); + await app.workbench.quickopen.closeQuickOpen(); + await app.workbench.statusbar.clickOn(StatusBarElement.EOL_STATUS); + await app.workbench.quickopen.waitForQuickOpenOpened(); + await app.workbench.quickopen.closeQuickOpen(); + await app.workbench.statusbar.clickOn(StatusBarElement.LANGUAGE_STATUS); + await app.workbench.quickopen.waitForQuickOpenOpened(); + await app.workbench.quickopen.closeQuickOpen(); + }); + + it(`verifies that 'Problems View' appears when clicking on 'Problems' status element`, async function () { + const app = this.app as SpectronApplication; + + await app.workbench.statusbar.clickOn(StatusBarElement.PROBLEMS_STATUS); + await app.workbench.problems.waitForProblemsView(); + }); + + it(`verifies that 'Tweet us feedback' pop-up appears when clicking on 'Feedback' icon`, async function () { + const app = this.app as SpectronApplication; + + if (app.quality === Quality.Dev) { + return this.skip(); + } + + await app.workbench.statusbar.clickOn(StatusBarElement.FEEDBACK_ICON); + assert.ok(!!await app.client.waitForElement('.feedback-form')); + }); + + it(`checks if 'Go to Line' works if called from the status bar`, async function () { + const app = this.app as SpectronApplication; + + await app.workbench.quickopen.openFile('app.js'); + await app.workbench.statusbar.clickOn(StatusBarElement.SELECTION_STATUS); + + await app.workbench.quickopen.waitForQuickOpenOpened(); + + await app.workbench.quickopen.submit(':15'); + await app.workbench.editor.waitForHighlightingLine(15); + }); + + it(`verifies if changing EOL is reflected in the status bar`, async function () { + const app = this.app as SpectronApplication; + + await app.workbench.quickopen.openFile('app.js'); + await app.workbench.statusbar.clickOn(StatusBarElement.EOL_STATUS); + + await app.workbench.quickopen.waitForQuickOpenOpened(); + await app.workbench.quickopen.selectQuickOpenElement(1); + + await app.workbench.statusbar.waitForEOL('CRLF'); + }); }); - - it('verifies presence of all default status bar elements', async function () { - const app = this.app as SpectronApplication; - - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); - if (app.quality !== Quality.Dev) { - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.FEEDBACK_ICON); - } - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.SYNC_STATUS); - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.PROBLEMS_STATUS); - - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.ENCODING_STATUS); - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.EOL_STATUS); - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.INDENTATION_STATUS); - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.LANGUAGE_STATUS); - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.SELECTION_STATUS); - }); - - it(`verifies that 'quick open' opens when clicking on status bar elements`, async function () { - const app = this.app as SpectronApplication; - - await app.workbench.statusbar.clickOn(StatusBarElement.BRANCH_STATUS); - await app.workbench.quickopen.waitForQuickOpenOpened(); - await app.workbench.quickopen.closeQuickOpen(); - - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.statusbar.clickOn(StatusBarElement.INDENTATION_STATUS); - await app.workbench.quickopen.waitForQuickOpenOpened(); - await app.workbench.quickopen.closeQuickOpen(); - await app.workbench.statusbar.clickOn(StatusBarElement.ENCODING_STATUS); - await app.workbench.quickopen.waitForQuickOpenOpened(); - await app.workbench.quickopen.closeQuickOpen(); - await app.workbench.statusbar.clickOn(StatusBarElement.EOL_STATUS); - await app.workbench.quickopen.waitForQuickOpenOpened(); - await app.workbench.quickopen.closeQuickOpen(); - await app.workbench.statusbar.clickOn(StatusBarElement.LANGUAGE_STATUS); - await app.workbench.quickopen.waitForQuickOpenOpened(); - await app.workbench.quickopen.closeQuickOpen(); - }); - - it(`verifies that 'Problems View' appears when clicking on 'Problems' status element`, async function () { - const app = this.app as SpectronApplication; - - await app.workbench.statusbar.clickOn(StatusBarElement.PROBLEMS_STATUS); - await app.workbench.problems.waitForProblemsView(); - }); - - it(`verifies that 'Tweet us feedback' pop-up appears when clicking on 'Feedback' icon`, async function () { - const app = this.app as SpectronApplication; - - if (app.quality === Quality.Dev) { - return this.skip(); - } - - await app.workbench.statusbar.clickOn(StatusBarElement.FEEDBACK_ICON); - assert.ok(!!await app.client.waitForElement('.feedback-form')); - }); - - it(`checks if 'Go to Line' works if called from the status bar`, async function () { - const app = this.app as SpectronApplication; - - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.statusbar.clickOn(StatusBarElement.SELECTION_STATUS); - - await app.workbench.quickopen.waitForQuickOpenOpened(); - - await app.workbench.quickopen.submit(':15'); - await app.workbench.editor.waitForHighlightingLine(15); - }); - - it(`verifies if changing EOL is reflected in the status bar`, async function () { - const app = this.app as SpectronApplication; - - await app.workbench.quickopen.openFile('app.js'); - await app.workbench.statusbar.clickOn(StatusBarElement.EOL_STATUS); - - await app.workbench.quickopen.waitForQuickOpenOpened(); - await app.workbench.quickopen.selectQuickOpenElement(1); - - await app.workbench.statusbar.waitForEOL('CRLF'); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index 6f5131c49c80..8e6cb42d4ab4 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -5,36 +5,38 @@ import { SpectronApplication } from '../../spectron/application'; -describe('Dataloss', () => { - before(function () { - this.app.suiteName = 'Dataloss'; +export function setup() { + describe('Dataloss', () => { + before(function () { + this.app.suiteName = 'Dataloss'; + }); + + it(`verifies that 'hot exit' works for dirty files`, async function () { + const app = this.app as SpectronApplication; + await app.workbench.newUntitledFile(); + + const untitled = 'Untitled-1'; + const textToTypeInUntitled = 'Hello, Unitled Code'; + await app.workbench.editor.waitForTypeInEditor(untitled, textToTypeInUntitled); + await app.screenCapturer.capture('Untitled file before reload'); + + const readmeMd = 'readme.md'; + const textToType = 'Hello, Code'; + await app.workbench.explorer.openFile(readmeMd); + await app.workbench.editor.waitForTypeInEditor(readmeMd, textToType); + await app.screenCapturer.capture(`${readmeMd} before reload`); + + await app.reload(); + await app.screenCapturer.capture('After reload'); + + await app.workbench.waitForActiveTab(readmeMd, true); + await app.screenCapturer.capture(`${readmeMd} after reload`); + await app.workbench.editor.waitForEditorContents(readmeMd, c => c.indexOf(textToType) > -1); + + await app.workbench.waitForTab(untitled, true); + await app.workbench.selectTab(untitled, true); + await app.screenCapturer.capture('Untitled file after reload'); + await app.workbench.editor.waitForEditorContents(untitled, c => c.indexOf(textToTypeInUntitled) > -1); + }); }); - - it(`verifies that 'hot exit' works for dirty files`, async function () { - const app = this.app as SpectronApplication; - await app.workbench.newUntitledFile(); - - const untitled = 'Untitled-1'; - const textToTypeInUntitled = 'Hello, Unitled Code'; - await app.workbench.editor.waitForTypeInEditor(untitled, textToTypeInUntitled); - await app.screenCapturer.capture('Untitled file before reload'); - - const readmeMd = 'readme.md'; - const textToType = 'Hello, Code'; - await app.workbench.explorer.openFile(readmeMd); - await app.workbench.editor.waitForTypeInEditor(readmeMd, textToType); - await app.screenCapturer.capture(`${readmeMd} before reload`); - - await app.reload(); - await app.screenCapturer.capture('After reload'); - - await app.workbench.waitForActiveTab(readmeMd, true); - await app.screenCapturer.capture(`${readmeMd} after reload`); - await app.workbench.editor.waitForEditorContents(readmeMd, c => c.indexOf(textToType) > -1); - - await app.workbench.waitForTab(untitled, true); - await app.workbench.selectTab(untitled, true); - await app.screenCapturer.capture('Untitled file after reload'); - await app.workbench.editor.waitForEditorContents(untitled, c => c.indexOf(textToTypeInUntitled) > -1); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 98213b85803f..7a2877ab4adf 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -3,85 +3,130 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// import * as assert from 'assert'; +import * as assert from 'assert'; -// import { SpectronApplication, STABLE_PATH, LATEST_PATH } from '../../spectron/application'; -// import { Util } from '../../helpers/utilities'; +import { SpectronApplication, Quality } from '../../spectron/application'; +import * as rimraf from 'rimraf'; -// describe('Data Migration', () => { +export interface ICreateAppFn { + (quality: Quality): SpectronApplication | null; +} -// if (!STABLE_PATH) { -// return; -// } +export function setup(userDataDir: string, createApp: ICreateAppFn) { -// let app: SpectronApplication; -// afterEach(() => app.stop()); + describe('Data Migration', () => { + afterEach(async function () { + await new Promise((c, e) => rimraf(userDataDir, { maxBusyTries: 10 }, err => err ? e(err) : c())); + }); -// it('checks if the Untitled file is restored migrating from stable to latest', async function () { -// const textToType = 'Very dirty file'; + it('checks if the Untitled file is restored migrating from stable to latest', async function () { + const stableApp = createApp(Quality.Stable); -// // Setting up stable version -// let app = new SpectronApplication(STABLE_PATH); -// await app.start('Data Migration'); + if (!stableApp) { + this.skip(); + return; + } -// await app.workbench.newUntitledFile(); -// await app.workbench.editor.waitForTypeInEditor('Untitled-1', textToType); + await stableApp.start(); + stableApp.suiteName = 'Data Migration'; -// await app.stop(); -// await new Promise(c => setTimeout(c, 500)); // wait until all resources are released (e.g. locked local storage) -// // Checking latest version for the restored state + const textToType = 'Very dirty file'; -// app = new SpectronApplication(LATEST_PATH); -// await app.start('Data Migration'); + await stableApp.workbench.newUntitledFile(); + await stableApp.workbench.editor.waitForTypeInEditor('Untitled-1', textToType); -// assert.ok(await app.workbench.waitForActiveTab('Untitled-1', true), `Untitled-1 tab is not present after migration.`); + await stableApp.stop(); + await new Promise(c => setTimeout(c, 500)); // wait until all resources are released (e.g. locked local storage) -// await app.workbench.editor.waitForEditorContents('Untitled-1', c => c.indexOf(textToType) > -1); -// await app.screenCapturer.capture('Untitled file text'); -// }); + // Checking latest version for the restored state + const app = createApp(Quality.Insiders); -// it('checks if the newly created dirty file is restored migrating from stable to latest', async function () { -// const fileName = 'test_data/plainFile', -// firstTextPart = 'This is going to be an unsaved file', secondTextPart = '_that is dirty.'; + if (!app) { + return assert(false); + } -// // Setting up stable version -// let app = new SpectronApplication(STABLE_PATH, fileName); -// await Util.removeFile(`${fileName}`); -// await app.start('Data Migration'); + await app.start(false); + app.suiteName = 'Data Migration'; -// await app.workbench.editor.waitForTypeInEditor('plainFile', firstTextPart); -// await app.workbench.saveOpenedFile(); -// await app.workbench.editor.waitForTypeInEditor('plainFile', secondTextPart); + assert.ok(await app.workbench.waitForActiveTab('Untitled-1', true), `Untitled-1 tab is not present after migration.`); -// await app.stop(); -// await new Promise(c => setTimeout(c, 1000)); // wait until all resources are released (e.g. locked local storage) + await app.workbench.editor.waitForEditorContents('Untitled-1', c => c.indexOf(textToType) > -1); + await app.screenCapturer.capture('Untitled file text'); -// // Checking latest version for the restored state -// app = new SpectronApplication(LATEST_PATH); -// await app.start('Data Migration'); + await app.stop(); + }); -// const filename = fileName.split('/')[1]; -// assert.ok(await app.workbench.waitForActiveTab(filename), `Untitled-1 tab is not present after migration.`); -// await app.workbench.editor.waitForEditorContents(filename, c => c.indexOf(firstTextPart + secondTextPart) > -1); + it('checks if the newly created dirty file is restored migrating from stable to latest', async function () { + const stableApp = createApp(Quality.Stable); -// await Util.removeFile(`${fileName}`); -// }); + if (!stableApp) { + this.skip(); + return; + } -// it('cheks if opened tabs are restored migrating from stable to latest', async function () { -// const fileName1 = 'app.js', fileName2 = 'jsconfig.json', fileName3 = 'readme.md'; -// let app = new SpectronApplication(STABLE_PATH); -// await app.start('Data Migration'); + await stableApp.start(); + stableApp.suiteName = 'Data Migration'; -// await app.workbench.quickopen.openFile(fileName1); -// await app.workbench.quickopen.openFile(fileName2); -// await app.workbench.quickopen.openFile(fileName3); -// await app.stop(); + const fileName = 'app.js'; + const textPart = 'This is going to be an unsaved file'; -// app = new SpectronApplication(LATEST_PATH); -// await app.start('Data Migration'); + await stableApp.workbench.quickopen.openFile(fileName); -// assert.ok(await app.workbench.waitForTab(fileName1), `${fileName1} tab was not restored after migration.`); -// assert.ok(await app.workbench.waitForTab(fileName2), `${fileName2} tab was not restored after migration.`); -// assert.ok(await app.workbench.waitForTab(fileName3), `${fileName3} tab was not restored after migration.`); -// }); -// }); \ No newline at end of file + await stableApp.workbench.editor.waitForTypeInEditor(fileName, textPart); + + await stableApp.stop(); + await new Promise(c => setTimeout(c, 500)); // wait until all resources are released (e.g. locked local storage) + + // Checking latest version for the restored state + const app = createApp(Quality.Insiders); + + if (!app) { + return assert(false); + } + + await app.start(false); + app.suiteName = 'Data Migration'; + + assert.ok(await app.workbench.waitForActiveTab(fileName), `dirty file tab is not present after migration.`); + await app.workbench.editor.waitForEditorContents(fileName, c => c.indexOf(textPart) > -1); + + await app.stop(); + }); + + it('checks if opened tabs are restored migrating from stable to latest', async function () { + const stableApp = createApp(Quality.Stable); + + if (!stableApp) { + this.skip(); + return; + } + + await stableApp.start(); + stableApp.suiteName = 'Data Migration'; + + const fileName1 = 'app.js', fileName2 = 'jsconfig.json', fileName3 = 'readme.md'; + + await stableApp.workbench.quickopen.openFile(fileName1); + await stableApp.workbench.quickopen.runCommand('View: Keep Editor'); + await stableApp.workbench.quickopen.openFile(fileName2); + await stableApp.workbench.quickopen.runCommand('View: Keep Editor'); + await stableApp.workbench.quickopen.openFile(fileName3); + await stableApp.stop(); + + const app = createApp(Quality.Insiders); + + if (!app) { + return assert(false); + } + + await app.start(false); + app.suiteName = 'Data Migration'; + + assert.ok(await app.workbench.waitForTab(fileName1), `${fileName1} tab was not restored after migration.`); + assert.ok(await app.workbench.waitForTab(fileName2), `${fileName2} tab was not restored after migration.`); + assert.ok(await app.workbench.waitForTab(fileName3), `${fileName3} tab was not restored after migration.`); + + await app.stop(); + }); + }); +} \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index a259e8d52d36..14185a138033 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -7,48 +7,50 @@ import * as assert from 'assert'; import { SpectronApplication, Quality } from '../../spectron/application'; -describe('Localization', () => { - before(async function () { - const app = this.app as SpectronApplication; - this.app.suiteName = 'Localization'; +export function setup() { + describe('Localization', () => { + before(async function () { + const app = this.app as SpectronApplication; + this.app.suiteName = 'Localization'; - if (app.quality === Quality.Dev) { - return; - } + if (app.quality === Quality.Dev) { + return; + } - await app.restart(['--locale=DE']); + await app.restart(['--locale=DE']); + }); + + it(`starts with 'DE' locale and verifies title and viewlets text is in German`, async function () { + const app = this.app as SpectronApplication; + + if (app.quality === Quality.Dev) { + this.skip(); + return; + } + + let text = await app.workbench.explorer.getOpenEditorsViewTitle(); + await app.screenCapturer.capture('Open editors title'); + assert(/geöffnete editoren/i.test(text)); + + await app.workbench.search.openSearchViewlet(); + text = await app.workbench.search.getTitle(); + await app.screenCapturer.capture('Search title'); + assert(/suchen/i.test(text)); + + await app.workbench.scm.openSCMViewlet(); + text = await app.workbench.scm.getTitle(); + await app.screenCapturer.capture('Scm title'); + assert(/quellcodeverwaltung/i.test(text)); + + await app.workbench.debug.openDebugViewlet(); + text = await app.workbench.debug.getTitle(); + await app.screenCapturer.capture('Debug title'); + assert(/debuggen/i.test(text)); + + await app.workbench.extensions.openExtensionsViewlet(); + text = await app.workbench.extensions.getTitle(); + await app.screenCapturer.capture('Extensions title'); + assert(/erweiterungen/i.test(text)); + }); }); - - it(`starts with 'DE' locale and verifies title and viewlets text is in German`, async function () { - const app = this.app as SpectronApplication; - - if (app.quality === Quality.Dev) { - this.skip(); - return; - } - - let text = await app.workbench.explorer.getOpenEditorsViewTitle(); - await app.screenCapturer.capture('Open editors title'); - assert(/geöffnete editoren/i.test(text)); - - await app.workbench.search.openSearchViewlet(); - text = await app.workbench.search.getTitle(); - await app.screenCapturer.capture('Search title'); - assert(/suchen/i.test(text)); - - await app.workbench.scm.openSCMViewlet(); - text = await app.workbench.scm.getTitle(); - await app.screenCapturer.capture('Scm title'); - assert(/quellcodeverwaltung/i.test(text)); - - await app.workbench.debug.openDebugViewlet(); - text = await app.workbench.debug.getTitle(); - await app.screenCapturer.capture('Debug title'); - assert(/debuggen/i.test(text)); - - await app.workbench.extensions.openExtensionsViewlet(); - text = await app.workbench.extensions.getTitle(); - await app.screenCapturer.capture('Extensions title'); - assert(/erweiterungen/i.test(text)); - }); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/test/smoke/src/helpers/utilities.ts b/test/smoke/src/helpers/utilities.ts index bde4dde38b7d..8b86d31c9576 100644 --- a/test/smoke/src/helpers/utilities.ts +++ b/test/smoke/src/helpers/utilities.ts @@ -6,35 +6,6 @@ import * as fs from 'fs'; import { dirname } from 'path'; -/** - * Contains methods that are commonly used across test areas. - */ -export class Util { - constructor() { - // noop - } - - public removeFile(filePath: string): void { - try { - fs.unlinkSync(`${filePath}`); - } catch (e) { - if (e.code !== 'ENOENT') { - throw e; - } - } - } - - public static removeFile(filePath: string): void { - try { - fs.unlinkSync(`${filePath}`); - } catch (e) { - if (e.code !== 'ENOENT') { - throw e; - } - } - } -} - export function nfcall(fn: Function, ...args): Promise { return new Promise((c, e) => fn(...args, (err, r) => err ? e(err) : c(r))); } diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 8c71329b9072..41133e687b67 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -12,6 +12,21 @@ import * as tmp from 'tmp'; import * as rimraf from 'rimraf'; import * as mkdirp from 'mkdirp'; import { SpectronApplication, Quality } from './spectron/application'; +import { setup as setupDataMigrationTests } from './areas/workbench/data-migration.test'; + +import { setup as setupDataLossTests } from './areas/workbench/data-loss.test'; +import { setup as setupDataExplorerTests } from './areas/explorer/explorer.test'; +import { setup as setupDataPreferencesTests } from './areas/preferences/preferences.test'; +import { setup as setupDataSearchTests } from './areas/search/search.test'; +import { setup as setupDataCSSTests } from './areas/css/css.test'; +import { setup as setupDataEditorTests } from './areas/editor/editor.test'; +import { setup as setupDataDebugTests } from './areas/debug/debug.test'; +import { setup as setupDataGitTests } from './areas/git/git.test'; +import { setup as setupDataStatusbarTests } from './areas/statusbar/statusbar.test'; +import { setup as setupDataExtensionTests } from './areas/extensions/extensions.test'; +import { setup as setupDataMultirootTests } from './areas/multiroot/multiroot.test'; +import { setup as setupDataLocalizationTests } from './areas/workbench/localization.test'; +// import './areas/terminal/terminal.test'; const tmpDir = tmp.dirSync({ prefix: 't' }) as { name: string; removeCallback: Function; }; const testDataPath = tmpDir.name; @@ -83,12 +98,13 @@ function getBuildElectronPath(root: string): string { let testCodePath = opts.build; let stableCodePath = opts['stable-build']; let electronPath: string; +let stablePath: string; if (testCodePath) { electronPath = getBuildElectronPath(testCodePath); if (stableCodePath) { - process.env.VSCODE_STABLE_PATH = getBuildElectronPath(stableCodePath); + stablePath = getBuildElectronPath(stableCodePath); } } else { testCodePath = getDevElectronPath(); @@ -195,7 +211,7 @@ async function setup(): Promise { * @see https://github.com/webdriverio/webdriverio/issues/2076 */ // Filter out the following messages: -const wdioDeprecationWarning = /^WARNING: the "\w+" command will be depcrecated soon./; // [sic] +const wdioDeprecationWarning = /^WARNING: the "\w+" command will be deprecated soon../; // [sic] // Monkey patch: const warn = console.warn; console.warn = function suppressWebdriverWarnings(message) { @@ -203,14 +219,16 @@ console.warn = function suppressWebdriverWarnings(message) { warn.apply(console, arguments); }; -before(async function () { - // allow two minutes for setup - this.timeout(2 * 60 * 1000); - await setup(); +function createApp(quality: Quality): SpectronApplication | null { + const path = quality === Quality.Insiders ? electronPath : stablePath; - const app = new SpectronApplication({ + if (!path) { + return null; + } + + return new SpectronApplication({ quality, - electronPath, + electronPath: path, workspacePath, userDataDir, extensionsPath, @@ -218,27 +236,42 @@ before(async function () { workspaceFilePath, waitTime: parseInt(opts['wait-time'] || '0') || 20 }); - - await app.start(); - this.app = app; +} +before(async function () { + // allow two minutes for setup + this.timeout(2 * 60 * 1000); + await setup(); }); after(async function () { - await this.app.stop(); await new Promise((c, e) => rimraf(testDataPath, { maxBusyTries: 10 }, err => err ? e(err) : c())); }); -// import './areas/workbench/data-migration.test'; -import './areas/workbench/data-loss.test'; -import './areas/explorer/explorer.test'; -import './areas/preferences/preferences.test'; -import './areas/search/search.test'; -import './areas/css/css.test'; -import './areas/editor/editor.test'; -import './areas/debug/debug.test'; -import './areas/git/git.test'; -// import './areas/terminal/terminal.test'; -import './areas/statusbar/statusbar.test'; -import './areas/extensions/extensions.test'; -import './areas/multiroot/multiroot.test'; -import './areas/workbench/localization.test'; \ No newline at end of file +describe('Data Migration', () => { + setupDataMigrationTests(userDataDir, createApp); +}); + +describe('Everything Else', () => { + before(async function () { + const app = createApp(quality); + await app!.start(); + this.app = app; + }); + + after(async function () { + await this.app.stop(); + }); + + setupDataLossTests(); + setupDataExplorerTests(); + setupDataPreferencesTests(); + setupDataSearchTests(); + setupDataCSSTests(); + setupDataEditorTests(); + setupDataDebugTests(); + setupDataGitTests(); + setupDataStatusbarTests(); + setupDataExtensionTests(); + setupDataMultirootTests(); + setupDataLocalizationTests(); +}); diff --git a/test/smoke/src/spectron/application.ts b/test/smoke/src/spectron/application.ts index 22c1c23010dd..7d8cdadbb9ac 100644 --- a/test/smoke/src/spectron/application.ts +++ b/test/smoke/src/spectron/application.ts @@ -108,9 +108,12 @@ export class SpectronApplication { this._screenCapturer.suiteName = suiteName; } - async start(): Promise { + async start(waitForWelcome: boolean = true): Promise { await this._start(); - await this.waitForWelcome(); + + if (waitForWelcome) { + await this.waitForWelcome(); + } } async restart(codeArgs: string[] = []): Promise { @@ -159,6 +162,9 @@ export class SpectronApplication { // Prevent 'Getting Started' web page from opening on clean user-data-dir args.push('--skip-getting-started'); + // Prevent 'Getting Started' web page from opening on clean user-data-dir + args.push('--skip-release-notes'); + // Prevent Quick Open from closing when focus is stolen, this allows concurrent smoketest suite running args.push('--sticky-quickopen'); @@ -269,11 +275,19 @@ export class SpectronApplication { private async checkWindowReady(): Promise { await this.webclient.waitUntilWindowLoaded(); - // Spectron opens multiple terminals in Windows platform - // Workaround to focus the right window - https://github.com/electron/spectron/issues/60 - await this.client.windowByIndex(1); - // await this.app.browserWindow.focus(); - await this.client.waitForHTML('[id="workbench.main.container"]'); + + // Pick the first workbench window here + const count = await this.webclient.getWindowCount(); + + for (let i = 0; i < count; i++) { + await this.webclient.windowByIndex(i); + + if (/bootstrap\/index\.html/.test(await this.webclient.getUrl())) { + break; + } + } + + await this.client.waitForElement('.monaco-workbench'); } private async waitForWelcome(): Promise { diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 9ec19afd2f5d..428d6a183103 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -25,10 +25,6 @@ export class SpectronClient { this.retryCount = (waitTime * 1000) / this.retryDuration; } - windowByIndex(index: number): Promise { - return this.spectron.client.windowByIndex(index); - } - keys(keys: string[]): Promise { this.spectron.client.keys(keys); return Promise.resolve(); @@ -54,10 +50,6 @@ export class SpectronClient { return this.waitFor(() => this.spectron.client.getValue(selector), accept, `getValue with selector ${selector}`); } - async waitForHTML(selector: string, accept: (result: string) => boolean = (result: string) => !!result): Promise { - return this.waitFor(() => this.spectron.client.getHTML(selector), accept, `getHTML with selector ${selector}`); - } - async waitAndClick(selector: string): Promise { return this.waitFor(() => this.spectron.client.click(selector), void 0, `click with selector ${selector}`); } diff --git a/yarn.lock b/yarn.lock index d86b8a9d90ae..f95110eef088 100644 --- a/yarn.lock +++ b/yarn.lock @@ -252,6 +252,10 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async@1.x, async@^1.4.0, async@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -383,7 +387,7 @@ binaryextensions@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" -bindings@^1.2.1: +bindings@^1.2.1, bindings@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" @@ -580,6 +584,13 @@ cheerio@^1.0.0-rc.1: lodash "^4.15.0" parse5 "^3.0.1" +chrome-remote-interface@^0.25.3: + version "0.25.3" + resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.25.3.tgz#b692ae538cd5af3a6dd285636bfab3d29a7006c1" + dependencies: + commander "2.11.x" + ws "3.3.x" + ci-info@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" @@ -741,6 +752,10 @@ commander@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" +commander@2.11.x, commander@^2.8.1, commander@^2.9.0, commander@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + commander@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" @@ -751,10 +766,6 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.8.1, commander@^2.9.0, commander@~2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - commandpost@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/commandpost/-/commandpost-1.2.1.tgz#2e9c4c7508b9dc704afefaa91cab92ee6054cc68" @@ -2139,9 +2150,9 @@ grunt@0.4: underscore.string "~2.2.1" which "~1.0.5" -gulp-atom-electron@^1.11.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/gulp-atom-electron/-/gulp-atom-electron-1.14.1.tgz#1d19dbe179cb97c781abc7103fa775c161cc4e61" +gulp-atom-electron@1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/gulp-atom-electron/-/gulp-atom-electron-1.15.1.tgz#ae13a4107a52e249d3335f584794981f5dcbf9be" dependencies: event-stream "^3.1.7" github-releases "^0.2.0" @@ -3719,7 +3730,7 @@ nan@^2.0.0, nan@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" -nan@^2.0.9, nan@^2.3.0, nan@^2.3.2: +nan@^2.0.9, nan@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" @@ -3727,6 +3738,10 @@ nan@^2.1.0: version "2.7.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" +nan@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + native-keymap@1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/native-keymap/-/native-keymap-1.2.5.tgz#1035a9417b9a9340cf8097763a43c76d588165a5" @@ -3747,9 +3762,9 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -node-pty@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.7.3.tgz#4bb36a24a62ee9f3332e2e2310d6642d9daed1f7" +node-pty@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.7.4.tgz#07146b2b40b76e432e57ce6750bda40f0da5c99f" dependencies: nan "^2.6.2" @@ -5023,6 +5038,14 @@ sparkles@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" +spdlog@0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/spdlog/-/spdlog-0.3.7.tgz#5f068efab0b7c85efa1aaed6eacd3da1d978fe24" + dependencies: + bindings "^1.3.0" + mkdirp "^0.5.1" + nan "^2.8.0" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -5466,6 +5489,10 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +ultron@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864" + unc-path-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -5559,11 +5586,11 @@ uuid@^3.0.0, uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" -v8-profiler@jrieken/v8-profiler#vscode: - version "5.6.5" - resolved "https://codeload.github.com/jrieken/v8-profiler/tar.gz/5e4a336693e1d5b079c7aecd286a1abcfbc10421" +v8-inspect-profiler@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/v8-inspect-profiler/-/v8-inspect-profiler-0.0.7.tgz#f3b3438680f71961b9647514fe7b9f8748abc462" dependencies: - nan "^2.3.2" + chrome-remote-interface "^0.25.3" v8flags@^2.0.2: version "2.1.1" @@ -5736,9 +5763,9 @@ vscode-chokidar@1.6.2: optionalDependencies: vscode-fsevents "0.3.8" -vscode-debugprotocol@1.25.0-pre.0: - version "1.25.0-pre.0" - resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.25.0-pre.0.tgz#ad83e7bd95b19ac795df50fa0e2fe903462a72b6" +vscode-debugprotocol@1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.25.0.tgz#7a7e38df4cad8839e37ebcd06ed903902d97a7e3" vscode-fsevents@0.3.8: version "0.3.8" @@ -5850,6 +5877,14 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" +ws@3.3.x: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.2.tgz#96c1d08b3fefda1d5c1e33700d3bfaa9be2d5608" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + xml-name-validator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-1.0.0.tgz#dcf82ee092322951ef8cc1ba596c9cbfd14a83f1"