未验证 提交 6ca430e6 编写于 作者: B Benjamin Pasero 提交者: GitHub

Merge branch 'master' into ben/shared-process-message-port

......@@ -334,6 +334,21 @@ steps:
displayName: Publish
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH).zip
artifact: vscode-darwin-$(VSCODE_ARCH)
displayName: Publish archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-darwin.zip
artifact: vscode-server-darwin-$(VSCODE_ARCH)
displayName: Publish server archive
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-darwin-web.zip
artifact: vscode-server-darwin-$(VSCODE_ARCH)-web
displayName: Publish web server archive
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false'))
- script: |
AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
VSCODE_ARCH="$(VSCODE_ARCH)" \
......
......@@ -22,7 +22,7 @@ SERVER_BUILD_NAME="vscode-server-$PLATFORM_LINUX-web"
SERVER_TARBALL_FILENAME="vscode-server-$PLATFORM_LINUX-web.tar.gz"
SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
rm -rf $ROOT/vscode-server-*.tar.*
rm -rf $ROOT/vscode-server-*-web.tar.*
(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
node build/azure-pipelines/common/createAsset.js "server-$PLATFORM_LINUX-web" archive-unsigned "$SERVER_TARBALL_FILENAME" "$SERVER_TARBALL_PATH"
......@@ -123,6 +123,16 @@ steps:
displayName: Publish
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-linux-alpine.tar.gz
artifact: vscode-server-linux-alpine
displayName: Publish server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-linux-alpine-web.tar.gz
artifact: vscode-server-linux-alpine-web
displayName: Publish web server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
displayName: "Component Detection"
continueOnError: true
......@@ -254,6 +254,26 @@ steps:
displayName: Publish
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(DEB_PATH)
artifact: vscode-linux-deb-$(VSCODE_ARCH)
displayName: Publish deb package
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(RPM_PATH)
artifact: vscode-linux-rpm-$(VSCODE_ARCH)
displayName: Publish rpm package
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-linux-$(VSCODE_ARCH).tar.gz
artifact: vscode-server-linux-$(VSCODE_ARCH)
displayName: Publish server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-linux-$(VSCODE_ARCH)-web.tar.gz
artifact: vscode-server-linux-$(VSCODE_ARCH)-web
displayName: Publish web server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- task: PublishPipelineArtifact@0
displayName: "Publish Pipeline Artifact"
inputs:
......
......@@ -26,6 +26,17 @@ rm -rf $ROOT/vscode-server-*.tar.*
node build/azure-pipelines/common/createAsset.js "server-$PLATFORM_LINUX" archive-unsigned "$SERVER_TARBALL_FILENAME" "$SERVER_TARBALL_PATH"
# Publish Remote Extension Host (Web)
LEGACY_SERVER_BUILD_NAME="vscode-reh-web-$PLATFORM_LINUX"
SERVER_BUILD_NAME="vscode-server-$PLATFORM_LINUX-web"
SERVER_TARBALL_FILENAME="vscode-server-$PLATFORM_LINUX-web.tar.gz"
SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
rm -rf $ROOT/vscode-server-*-web.tar.*
(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
node build/azure-pipelines/common/createAsset.js "server-$PLATFORM_LINUX-web" archive-unsigned "$SERVER_TARBALL_FILENAME" "$SERVER_TARBALL_PATH"
# Publish DEB
case $VSCODE_ARCH in
x64) DEB_ARCH="amd64" ;;
......@@ -58,3 +69,7 @@ mkdir -p $REPO/.build/linux/snap-tarball
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-$VSCODE_ARCH.tar.gz"
rm -rf $SNAP_TARBALL_PATH
(cd .build/linux && tar -czf $SNAP_TARBALL_PATH snap)
# Export DEB_PATH, RPM_PATH
echo "##vso[task.setvariable variable=DEB_PATH]$DEB_PATH"
echo "##vso[task.setvariable variable=RPM_PATH]$RPM_PATH"
......@@ -54,3 +54,11 @@ steps:
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
node build/azure-pipelines/common/createAsset.js "linux-snap-$(VSCODE_ARCH)" package "$SNAP_FILENAME" "$SNAP_PATH"
# Export SNAP_PATH
echo "##vso[task.setvariable variable=SNAP_PATH]$SNAP_PATH"
- publish: $(SNAP_PATH)
artifact: vscode-linux-snap-$(VSCODE_ARCH)
displayName: Publish snap package
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
......@@ -123,3 +123,8 @@ steps:
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
./build/azure-pipelines/web/publish.sh
displayName: Publish
- publish: $(Agent.BuildDirectory)/vscode-web.tar.gz
artifact: vscode-web-standalone
displayName: Publish web archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
......@@ -296,28 +296,28 @@ steps:
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\archive\VSCode-win32-$(VSCODE_ARCH).zip
artifact: VSCode-win32-$(VSCODE_ARCH).zip
artifact: vscode-win32-$(VSCODE_ARCH)
displayName: Publish archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\system-setup\VSCodeSetup.exe
artifact: VSCodeSetup-$(VSCODE_ARCH).exe
artifact: vscode-win32-$(VSCODE_ARCH)-setup
displayName: Publish system setup
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\user-setup\VSCodeSetup.exe
artifact: VSCodeUserSetup-$(VSCODE_ARCH).exe
artifact: vscode-win32-$(VSCODE_ARCH)-user-setup
displayName: Publish user setup
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(System.DefaultWorkingDirectory)\.build\vscode-server-win32-$(VSCODE_ARCH).zip
artifact: vscode-server-win32-$(VSCODE_ARCH).zip
displayName: Publish server
artifact: vscode-server-win32-$(VSCODE_ARCH)
displayName: Publish server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
- publish: $(System.DefaultWorkingDirectory)\.build\vscode-server-win32-$(VSCODE_ARCH)-web.zip
artifact: vscode-server-win32-$(VSCODE_ARCH)-web.zip
displayName: Publish web server
artifact: vscode-server-win32-$(VSCODE_ARCH)-web
displayName: Publish web server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
......
{
"name": "code-oss-dev",
"version": "1.53.0",
"distro": "cb2b2df95eb87c873b72420d14a4c67ad0c860c5",
"distro": "85b8eb4a7b856b4bca8c5882d289776c13eab544",
"author": {
"name": "Microsoft Corporation"
},
......@@ -216,4 +216,4 @@
"windows-mutex": "0.3.0",
"windows-process-tree": "0.2.4"
}
}
}
\ No newline at end of file
......@@ -3,22 +3,26 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import { MainThreadTunnelServiceShape, IExtHostContext, MainContext, ExtHostContext, ExtHostTunnelServiceShape } from 'vs/workbench/api/common/extHost.protocol';
import { TunnelDto } from 'vs/workbench/api/common/extHostTunnelService';
import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers';
import { CandidatePort, IRemoteExplorerService, makeAddress } from 'vs/workbench/services/remote/common/remoteExplorerService';
import { ITunnelProvider, ITunnelService, TunnelCreationOptions, TunnelProviderFeatures, TunnelOptions } from 'vs/platform/remote/common/tunnel';
import { ITunnelProvider, ITunnelService, TunnelCreationOptions, TunnelProviderFeatures, TunnelOptions, RemoteTunnel, isPortPrivileged } from 'vs/platform/remote/common/tunnel';
import { Disposable } from 'vs/base/common/lifecycle';
import type { TunnelDescription } from 'vs/platform/remote/common/remoteAuthorityResolver';
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
@extHostNamedCustomer(MainContext.MainThreadTunnelService)
export class MainThreadTunnelService extends Disposable implements MainThreadTunnelServiceShape {
private readonly _proxy: ExtHostTunnelServiceShape;
private elevateionRetry: boolean = false;
constructor(
extHostContext: IExtHostContext,
@IRemoteExplorerService private readonly remoteExplorerService: IRemoteExplorerService,
@ITunnelService private readonly tunnelService: ITunnelService
@ITunnelService private readonly tunnelService: ITunnelService,
@INotificationService private readonly notificationService: INotificationService
) {
super();
this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTunnelService);
......@@ -35,13 +39,36 @@ export class MainThreadTunnelService extends Disposable implements MainThreadTun
}
async $openTunnel(tunnelOptions: TunnelOptions, source: string): Promise<TunnelDto | undefined> {
const tunnel = await this.remoteExplorerService.forward(tunnelOptions.remoteAddress, tunnelOptions.localAddressPort, tunnelOptions.label, source, true);
const tunnel = await this.remoteExplorerService.forward(tunnelOptions.remoteAddress, tunnelOptions.localAddressPort, tunnelOptions.label, source, false);
if (tunnel) {
if (!this.elevateionRetry
&& (tunnelOptions.localAddressPort !== undefined)
&& (tunnel.tunnelLocalPort !== undefined)
&& isPortPrivileged(tunnelOptions.localAddressPort)
&& (tunnel.tunnelLocalPort !== tunnelOptions.localAddressPort)
&& this.tunnelService.canElevate) {
this.elevationPrompt(tunnelOptions, tunnel, source);
}
return TunnelDto.fromServiceTunnel(tunnel);
}
return undefined;
}
private async elevationPrompt(tunnelOptions: TunnelOptions, tunnel: RemoteTunnel, source: string) {
return this.notificationService.prompt(Severity.Info,
nls.localize('remote.tunnel.openTunnel', "The extension {0} has forwarded port {1}. You'll need to run as superuser to use port {2} locally.", source, tunnelOptions.remoteAddress.port, tunnelOptions.localAddressPort),
[{
label: nls.localize('remote.tunnelsView.elevationButton', "Use Port {0} as Sudo...", tunnel.tunnelRemotePort),
run: async () => {
this.elevateionRetry = true;
await this.remoteExplorerService.close({ host: tunnel.tunnelRemoteHost, port: tunnel.tunnelRemotePort });
await this.remoteExplorerService.forward(tunnelOptions.remoteAddress, tunnelOptions.localAddressPort, tunnelOptions.label, source, true);
this.elevateionRetry = false;
}
}]);
}
async $closeTunnel(remote: { host: string, port: number }): Promise<void> {
return this.remoteExplorerService.close(remote);
}
......
......@@ -135,14 +135,8 @@ export class ActivitybarPart extends Part implements IActivityBarService {
super(Parts.ACTIVITYBAR_PART, { hasTitle: false }, themeService, storageService, layoutService);
for (const cachedViewContainer of this.cachedViewContainers) {
if (
environmentService.remoteAuthority || // In remote window, hide activity bar entries until registered.
this.shouldBeHidden(cachedViewContainer.id, cachedViewContainer)
) {
cachedViewContainer.visible = false;
}
cachedViewContainer.visible = !this.shouldBeHidden(cachedViewContainer.id, cachedViewContainer);
}
this.compositeBar = this.createCompositeBar();
this.onDidRegisterViewContainers(this.getViewContainers());
......@@ -791,8 +785,8 @@ export class ActivitybarPart extends Part implements IActivityBarService {
}
}
// Check Cache
if (!this.hasExtensionsRegistered) {
// Check cache only in desktop local window and if extensions are not yet registered
if (!this.environmentService.remoteAuthority && !this.hasExtensionsRegistered) {
cachedViewContainer = cachedViewContainer || this.cachedViewContainers.find(({ id }) => id === viewContainerId);
// Show builtin ViewContainer if not registered yet
......
......@@ -35,6 +35,7 @@ import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/m
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
import { localize } from 'vs/nls';
import { Codicon } from 'vs/base/common/codicons';
import { coalesce } from 'vs/base/common/arrays';
const $ = dom.$;
let forgetScopes = true;
......@@ -393,35 +394,37 @@ CommandsRegistry.registerCommand({
export const COPY_VALUE_ID = 'workbench.debug.viewlet.action.copyValue';
CommandsRegistry.registerCommand({
id: COPY_VALUE_ID,
handler: async (accessor: ServicesAccessor, element: Variable | Expression | unknown) => {
handler: async (accessor: ServicesAccessor, arg: Variable | Expression | unknown, ctx?: (Variable | Expression)[]) => {
const debugService = accessor.get(IDebugService);
const clipboardService = accessor.get(IClipboardService);
let elementContext = '';
if (element instanceof Variable || element instanceof Expression) {
let elements: (Variable | Expression)[];
if (arg instanceof Variable || arg instanceof Expression) {
elementContext = 'watch';
elements = ctx ? ctx : [];
} else {
element = variableInternalContext;
elementContext = 'variables';
elements = variableInternalContext ? [variableInternalContext] : [];
}
const stackFrame = debugService.getViewModel().focusedStackFrame;
const session = debugService.getViewModel().focusedSession;
if (!stackFrame || !session || !(element instanceof Variable || element instanceof Expression)) {
if (!stackFrame || !session || elements.length === 0) {
return;
}
const context = session.capabilities.supportsClipboardContext ? 'clipboard' : elementContext;
const toEvaluate = element instanceof Variable ? (element.evaluateName || element.value) : element.name;
const evalContext = session.capabilities.supportsClipboardContext ? 'clipboard' : elementContext;
const toEvaluate = elements.map(element => element instanceof Variable ? (element.evaluateName || element.value) : element.name);
try {
const evaluation = await session.evaluate(toEvaluate, stackFrame.frameId, context);
if (evaluation) {
clipboardService.writeText(evaluation.body.result);
const evaluations = await Promise.all(toEvaluate.map(expr => session.evaluate(expr, stackFrame.frameId, evalContext)));
const result = coalesce(evaluations).map(evaluation => evaluation.body.result);
if (result.length) {
clipboardService.writeText(result.join('\n'));
}
} catch (e) {
if (element instanceof Variable || element instanceof Expression) {
clipboardService.writeText(element.value);
}
const result = elements.map(element => element.value);
clipboardService.writeText(result.join('\n'));
}
}
});
......@@ -475,4 +478,3 @@ registerAction2(class extends ViewAction<VariablesView> {
view.collapseAll();
}
});
......@@ -194,14 +194,16 @@ export class WatchExpressionsView extends ViewPane {
private onContextMenu(e: ITreeContextMenuEvent<IExpression>): void {
const element = e.element;
const selection = this.tree.getSelection();
this.watchItemType.set(element instanceof Expression ? 'expression' : element instanceof Variable ? 'variable' : undefined);
const actions: IAction[] = [];
const actionsDisposable = createAndFillInContextMenuActions(this.menu, { arg: element, shouldForwardArgs: false }, actions);
const actionsDisposable = createAndFillInContextMenuActions(this.menu, { arg: element, shouldForwardArgs: true }, actions);
this.contextMenuService.showContextMenu({
getAnchor: () => e.anchor,
getActions: () => actions,
getActionsContext: () => element,
getActionsContext: () => element && selection.includes(element) ? selection : element ? [element] : [],
onHide: () => dispose(actionsDisposable)
});
}
......
......@@ -179,3 +179,7 @@
.extension-list-item > .details > .footer > .monaco-action-bar > .actions-container .extension-action.label {
max-width: 150px;
}
.extension-list-item .footer .monaco-action-bar .action-item.action-dropdown-item > .monaco-dropdown {
margin-right: 0px;
}
......@@ -60,10 +60,10 @@ export const content: GettingStartedContent = [
},
{
id: 'forwardPortsTask',
title: localize('gettingStarted.forwardPorts.title', "Forward Ports to the Web"),
description: localize('gettingStarted.forwardPorts.description', "Test and debug your application in your browser by forwarding TCP ports running within your codespace."),
title: localize('gettingStarted.forwardPorts.title', "Access your running application"),
description: localize('gettingStarted.forwardPorts.description', "Ports running within your codespace are automatically forwarded to the web, so you can open them in your browser."),
button: {
title: localize('gettingStarted.forwardPorts.button', "Open Ports"),
title: localize('gettingStarted.forwardPorts.button', "Show Ports panel"),
command: '~remote.forwardedPorts.focus'
},
doneOn: { commandExecuted: '~remote.forwardedPorts.focus' },
......@@ -71,10 +71,10 @@ export const content: GettingStartedContent = [
},
{
id: 'pullRequests',
title: localize('gettingStarted.pullRequests.title', "Pull Requests at Your Fingertips"),
description: localize('gettingStarted.pullRequests.description', "View Pull Requests. Check out branches. Add comments. Merge and delete branches from the Codespace."),
title: localize('gettingStarted.pullRequests.title', "Pull pequests at your fingertips"),
description: localize('gettingStarted.pullRequests.description', "Codespaces brings your GitHub workflow closer to your code, where you can view pull requests, add comments, merge branches, and more."),
button: {
title: localize('gettingStarted.pullRequests.button', "Open GitHub Pull Request"),
title: localize('gettingStarted.pullRequests.button', "Open GitHub view"),
command: 'workbench.view.extension.github-pull-requests'
},
doneOn: { commandExecuted: 'workbench.view.extension.github-pull-requests' },
......@@ -82,7 +82,7 @@ export const content: GettingStartedContent = [
},
{
id: 'remoteTerminal',
title: localize('gettingStarted.remoteTerminal.title', "Run Tasks in the Integrated Terminal"),
title: localize('gettingStarted.remoteTerminal.title', "Run tasks in the integrated terminal"),
description: localize('gettingStarted.remoteTerminal.description', "Access your full development environment in the cloud and perform quick command-line tasks."),
button: {
title: localize('gettingStarted.remoteTerminal.button', "Focus Terminal"),
......@@ -93,8 +93,8 @@ export const content: GettingStartedContent = [
},
{
id: 'openVSC',
title: localize('gettingStarted.openVSC.title', "Open in Visual Studio Code"),
description: localize('gettingStarted.openVSC.description', "You can develop in your codespace directly in VS Code Code by connecting the GitHub Codespaces extension with your account on GitHub."),
title: localize('gettingStarted.openVSC.title', "Develop remotely in VS Code"),
description: localize('gettingStarted.openVSC.description', "Access the power of your cloud development environment from your local VS Code. Set up your local VS Code by installing the GitHub Codespaces extension and connecting your GitHub account."),
button: {
title: localize('gettingStarted.openVSC.button', "Open in VS Code"),
command: 'github.codespaces.openInStable'
......@@ -110,23 +110,23 @@ export const content: GettingStartedContent = [
{
id: 'Setup',
title: localize('gettingStarted.setup.title', "Quick Setup"),
description: localize('gettingStarted.setup.description', "Extend and customize VS Code to fit your needs."),
description: localize('gettingStarted.setup.description', "Extend and customize VS Code to make it yours."),
icon: setupIcon,
content: {
type: 'items',
items: [
{
id: 'pickColorTheme',
title: localize('gettingStarted.pickColor.title', "Customize the Look With Themes"),
description: localize('gettingStarted.pickColor.description', "Adapt VS Code to your taste with themes, customizing interface and language syntax colors."),
button: { title: localize('gettingStarted.pickColor.button', "Browse Color Themes"), command: 'workbench.action.selectTheme' },
title: localize('gettingStarted.pickColor.title', "Customize the look with themes"),
description: localize('gettingStarted.pickColor.description', "Pick a theme to match your taste and mood. Browse even more from the vibrant themes community."),
button: { title: localize('gettingStarted.pickColor.button', "Pick your Theme"), command: 'workbench.action.selectTheme' },
doneOn: { eventFired: 'themeSelected' },
media: { type: 'image', altText: 'Color theme preview for dark and light theme.', path: 'colorTheme.jpg', }
},
{
id: 'findLanguageExtensions',
title: localize('gettingStarted.findLanguageExts.title', "Add More Language & Tools Support"),
description: localize('gettingStarted.findLanguageExts.description', "Install extensions with one click to support additional languages like Python, Java, Azure, Docker, and more."),
title: localize('gettingStarted.findLanguageExts.title', "Add more language & tools support"),
description: localize('gettingStarted.findLanguageExts.description', "VS Code supports almost every major programming language. While many are built-in, others can be installed as extensions with one click."),
button: {
title: localize('gettingStarted.findLanguageExts.button', "Browse Language Extensions"),
command: 'workbench.extensions.action.showLanguageExtensions',
......@@ -136,11 +136,11 @@ export const content: GettingStartedContent = [
},
{
id: 'settingsSync',
title: localize('gettingStarted.settingsSync.title', "Syncronize Settings"),
description: localize('gettingStarted.settingsSync.description', "Sign in to syncronize things like settings, extensions, and more, across your devices."),
title: localize('gettingStarted.settingsSync.title', "Sync your favorite setup"),
description: localize('gettingStarted.settingsSync.description', "Never lose the perfect VS Code setup! Settings Sync will back up and share settings, keybindings and installed extensions across several VS Code installations."),
when: 'syncStatus != uninitialized',
button: {
title: localize('gettingStarted.settingsSync.button', "Sign in to Sync"),
title: localize('gettingStarted.settingsSync.button', "Enable Settings Sync"),
command: 'workbench.userDataSync.actions.turnOn',
},
doneOn: { eventFired: 'sync-enabled' },
......@@ -148,7 +148,7 @@ export const content: GettingStartedContent = [
},
{
id: 'pickAFolderTask-Mac',
title: localize('gettingStarted.setup.OpenFolder.title', "Open Your Project"),
title: localize('gettingStarted.setup.OpenFolder.title', "Open your project"),
description: localize('gettingStarted.setup.OpenFolder.description', "Open a project folder to get started!"),
when: 'isMac',
button: {
......@@ -160,7 +160,7 @@ export const content: GettingStartedContent = [
},
{
id: 'pickAFolderTask-Other',
title: localize('gettingStarted.setup.OpenFolder.title', "Open Your Project"),
title: localize('gettingStarted.setup.OpenFolder.title', "Open your project"),
description: localize('gettingStarted.setup.OpenFolder.description', "Open a project folder to get started!"),
when: '!isMac',
button: {
......@@ -178,13 +178,13 @@ export const content: GettingStartedContent = [
id: 'Beginner',
title: localize('gettingStarted.beginner.title', "Learn the Fundamentals"),
icon: beginnerIcon,
description: localize('gettingStarted.beginner.description', "Get up and running with must-have shortcuts & features."),
description: localize('gettingStarted.beginner.description', "Save time with these must-have shortcuts & features."),
content: {
type: 'items',
items: [
{
id: 'commandPaletteTask',
title: localize('gettingStarted.commandPalette.title', "Find and Run Commands"),
title: localize('gettingStarted.commandPalette.title', "Find and run commands"),
description: localize('gettingStarted.commandPalette.description', "The easiest way to find everything VS Code can do. If you\'re ever looking for a feature or a shortcut, check here first!"),
button: {
title: localize('gettingStarted.commandPalette.button', "Open Command Palette"),
......@@ -195,10 +195,10 @@ export const content: GettingStartedContent = [
},
{
id: 'terminal',
title: localize('gettingStarted.terminal.title', "Run Command-Line Tasks"),
title: localize('gettingStarted.terminal.title', "Run tasks in the integrated terminal"),
description: localize('gettingStarted.terminal.description', "Quickly run shell commands and monitor build output, right next to your code."),
button: {
title: localize('gettingStarted.terminal.button', "Open Terminal"),
title: localize('gettingStarted.terminal.button', "Open the Terminal"),
command: 'workbench.action.terminal.toggleTerminal'
},
doneOn: { commandExecuted: 'workbench.action.terminal.toggleTerminal' },
......@@ -206,8 +206,8 @@ export const content: GettingStartedContent = [
},
{
id: 'extensions',
title: localize('gettingStarted.extensions.title', "Supercharge VS Code With Extensions"),
description: localize('gettingStarted.extensions.description', "Extensions let you add languages, debuggers, and new features to support your development workflow."),
title: localize('gettingStarted.extensions.title', "Limitless extensibility"),
description: localize('gettingStarted.extensions.description', "Extensions are VS Code's power ups. They range from handy productivity hacks, expanding out-of-the-box features, to adding completely new capabilities."),
button: {
title: localize('gettingStarted.extensions.button', "Browse Recommended Extensions"),
command: 'workbench.extensions.action.showRecommendedExtensions'
......@@ -217,8 +217,8 @@ export const content: GettingStartedContent = [
},
{
id: 'settings',
title: localize('gettingStarted.settings.title', "Everything is a Setting"),
description: localize('gettingStarted.settings.description', "Optimize every part of VS Code's look & feel to your liking. Enable Settings Sync to use your personal tweaks across machines."),
title: localize('gettingStarted.settings.title', "Everything is a setting"),
description: localize('gettingStarted.settings.description', "Optimize every part of VS Code's look & feel to your liking. Enable Settings Sync lets you share your personal tweaks across machines."),
button: {
title: localize('gettingStarted.settings.button', "Tweak Some Settings"),
command: 'workbench.action.openSettings'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册