Visual Studio Code

来自 Arch Linux 中文维基

Code是由微软开发的跨平台文本编辑器,基于Electron框架构建,并且极具扩展性。可以在编辑器自带的应用商店,或者从 https://marketplace.visualstudio.com/VSCode 中安装扩展。“Visual Studio Code”是Code - OSS仓库的二进制分发版本,该仓库遵循MIT许可证,但包含了微软特定的定制,并在专有许可证下发布(有关混合授权的说明,请参阅此 GitHub评论)。另外还有一个由社区驱动、遵循MIT许可证的二进制发行版本名为VSCodium,默认情况下禁用了遥测功能。

安装[编辑 | 编辑源代码]

下列安装包提供 VSCode:

  • Code - OSS — Arch Linux 官方开源版本。配置有Open VSX
https://github.com/microsoft/vscode || code
  • Visual Studio Code — 微软官方版本,专有软件。
https://code.visualstudio.com/ || visual-studio-code-binAUR
  • VSCodium — 社区驱动的完全开源的 VSCode 版本,不带微软附属和遥测功能[1], 同时启用了Open VSX。
https://vscodium.com/ || vscodiumAUR

其他可用版本:

  • code-gitAUR(开发中的最新开源版本)
  • visual-studio-code-insiders-binAUR(微软官方版本,每日更新)
  • vscodium-binAUR(社区驱动的完全开源的 VSCode 版本,不带微软附属和遥测功能,二进制包)
  • vscodium-gitAUR (社区驱动的完全开源的 VSCode 版本,不带微软附属和遥测功能,最新的开发版)

这些不同的版本都是基于Code - OSS构建的, 但具有不同的许可证和默认配置。值得注意的是,只有专有版本被允许使用官方拓展市场并使用微软的专有扩展,例如OmniSharp C# Debugger。后者通过握手机制进行验证,并不能被绕过。有关开源和专有 "Visual Studio Code "构建之间差异的更多信息,请查阅Code - OSS GitHub wiki.

扩展支持[编辑 | 编辑源代码]

Code 的一个主要特点是其灵活的API和丰富的扩展生态(托管在Visual Studio Marketplace上)。但是,根据Code的扩展商场使用条款,拓展商场只能和微软官方版本配合使用。因此,code并没有内置一个预配置的拓展商场,虽然它提供了Open VSX registry,但这并不能提供同样广泛的扩展。

警告: 尽管微软并没有在这个问题中直接回答,但是可以合理推断非官方版本的 Code 很可能不被视为“适用的产品和服务”。换句话说,这是并不是被官方支持的,另请参阅FS#67780

已知的解决方法:

提示:当你尝试修改 product.json 文件时,设置一个重新加载IDE的快捷键会很方便

使用[编辑 | 编辑源代码]

对于以下版本,运行codecode --no-sandbox即可启动:

对于以下版本,运行code-git即可启动:

对于以下版本,运行codium即可启动:

如果你想打开多个实例,可以使用-n选项。

配置[编辑 | 编辑源代码]

注意:code-featuresAUR这样通过修改product.json来打补丁的软件包,可以覆盖变量 nameShortdataFolderName,这可能会使下文部分的描述不准确。
  • code 将配置文件保存在 ~/.config/Code - OSS/User/settings.json,拓展保存在~/.vscode-oss
  • visual-studio-code-binAUR 将配置文件保存在 ~/.config/Code/User/settings.json,拓展保存在~/.vscode
  • vscodiumAUR 及其衍生版本的配置文件保存在 ~/.config/VSCodium/User/settings.json,拓展保存在~/.vscode-oss

当从Code迁移到Codium时(反之亦然), 可以直接复制或移动配置文件,因为两者共享大部分代码库,设置是兼容的。

集成终端[编辑 | 编辑源代码]

点击查看 > 集成终端 或使用快捷键 Ctrl + ` 打开集成终端。 Bash作为默认终端不带任何附加选项的方式启动。 terminal.integrated.shell.linux 可以配置默认终端,terminal.integrated.shellArgs.linux 可以配置启动终端时的附加参数。

例子:

~/.config/Code/User/settings.json
"terminal.integrated.shell.linux": "/usr/bin/fish",
"terminal.integrated.shellArgs.linux": ["-l","-d 3"]

您可能会收到奇怪的提示,这是由于将集成终端参数设置成了外部终端。要解决此问题,请移除该句,或换用外部终端。

外部终端[编辑 | 编辑源代码]

如果你使用Terminator作为Arch的默认终端,而且在Visual Studio Code中遇到一个错误Unable to launch debugger worker process (vsdbg) through the terminal. spawn truecolor ENOENT,可以换另一个终端(比如,gnome-terminal)供Visual Studio Code使用。

"terminal.external.linuxExec": "Yours alternative terminal" 用于设置调试默认终端。

例子:

~/.config/Code/User/settings.json
"terminal.external.linuxExec": "gnome-terminal"

在Wayland下原生运行[编辑 | 编辑源代码]

Code使用了Electron,你可以参照Wayland#Electron设置来让其在Wayland下原生运行。请注意,某些版本的应用会使用自带的Electron(而不是系统的Electron),这种情况下应用将不会读取全局配置文件,你需要对环境变量进行修改(而不是全局配置文件)。

使用用户配置文件时,visual-studio-code-binAURcode都会读取~/.config/code-flags.conf处的配置文件。这仅针对这些包及其衍生版本,因为它们使用修改过的加载脚本来读取。

如果使用的是vscodium-binAUR, 其会加载~/.config/codium-flags.conf处的配置文件。注意从终端运行时,使用codium (而不是vscodium), 否则它将不会在Wayland下原生启动。

vscodiumAUR不会读取配置文件(因为它没有使用加载脚本)。其提供了一个桌面项文件 vscodium-wayland.desktop 以在Wayland下原生运行,在菜单中显示为"VSCodium - Wayland"。

原生文件对话框[编辑 | 编辑源代码]

如果你使用KDE/Plasma, 默认情况下VS Codium将会打开GTK文件对话框。请确保您已经安装了KDE桌面门户(xdg-desktop-portal-kde),并将环境变量设置为GTK_USE_PORTAL=1来解决这个问题。

故障排除[编辑 | 编辑源代码]

KDE/Plasma 全局菜单失效[编辑 | 编辑源代码]

Visual Studio Code使用DBus传递菜单,尝试安装 libdbusmenu-glib[2]

无法将内容移至回收站[编辑 | 编辑源代码]

默认状态下,Electron使用gio删除文件。如果检测到Plasma将会自动设置为使用kioclient5删除文件。不同的回收站实现可以通过设置ELECTRON_TRASH环境变量来使用。

例如,要使用trash-cli删除文件:

$ ELECTRON_TRASH=trash-cli code

这样一来,Electron就支持了kioclient5kioclienttrash-cligio(默认)和gvfs-trash(不推荐)。详情可在此查看documentation page

C#无法调试[编辑 | 编辑源代码]

您若想调试C#.NET(使用OmniSharp扩展),则需要通过AUR安装微软专版。原因是.NET Core调试器仅授权官方微软产品使用,参见这个github上的讨论

若使用开源软件包,调试器失效时不会有太多信息。调试台仅会提示初始信息:

You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.

要使用开源软件包进行调试,可以选择netcoredbgAUR。要在VS Code中运行,请在项目的.NET Core启动配置中添加这个配置:

./.vscode/launch.json
"configurations": [
    {
...
    "pipeTransport": {
        "pipeCwd": "${workspaceFolder}",
        "pipeProgram": "/usr/bin/bash",
        "pipeArgs": ["-c"],
        "debuggerPath": "/usr/bin/netcoredbg"
    }
...

无法使用OmniSharp server打开.csproj,Microsoft.Common.props位置无效[编辑 | 编辑源代码]

您必须从mono切换到合适SDK版本的props。

/opt/dotnet/sdk/{VERSION}/Sdks/Microsoft.NET.Sdk/Sdk/Sdk.props
$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props

把导入修改成类似这样:

/opt/dotnet/sdk/{VERSION}/Sdks/Microsoft.NET.Sdk/Sdk/Sdk.props
/opt/dotnet/sdk/{VERSION}/Current/Microsoft.Common.props

OmniSharp错误,MSBuild无法定位[编辑 | 编辑源代码]

OmniSharp中提到了Arch Linux用户应当安装mono-msbuild软件包。否则,您可能收到类似以下的错误:

OmniSharp Log
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
        Registered MSBuild instance: StandAlone 15.0 - "~/.vscode/extensions/ms-vscode.csharp-1.18.0/.omnisharp/1.32.11/omnisharp/msbuild/15.0/Bin"
            MSBuildExtensionsPath = /usr/lib/mono/xbuild
            BypassFrameworkInstallChecks = true
            CscToolPath = ~/.vscode/extensions/ms-vscode.csharp-1.18.0/.omnisharp/1.32.11/omnisharp/msbuild/15.0/Bin/Roslyn
            CscToolExe = csc.exe
            MSBuildToolsPath = ~/.vscode/extensions/ms-vscode.csharp-1.18.0/.omnisharp/1.32.11/omnisharp/msbuild/15.0/Bin
            TargetFrameworkRootPath = /usr/lib/mono/xbuild-frameworks
System.TypeLoadException: Could not load type of field 'OmniSharp.MSBuild.ProjectManager:_queue' (13) due to: Could not load file or assembly 'System.Threading.Tasks.Dataflow, Version=4.5.24.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
...

不过您依然有可能成功组建——则很可能取决于您是否也安装了mono

Omnisharp自带一个mono版本,因此如果它没有找到已安装的版本, 但是您想让omnisharp去寻找安装在计算机上的全局mono版本,您可以尝试在settings.json添加:

settings.json
"omnisharp.useGlobalMono:"always"

使用“Retry as Sudo”保存无效[编辑 | 编辑源代码]

这个特性在code软件包中无效,因为微软不支持Arch软件包的打包方式(原生的而非捆绑的Electron)。详情参见FS#61516upstream bug report

二进制发行版visual-studio-code-binAUR没有这个问题,该特性在此版本中有效。

键盘变体与键位映射不相符[编辑 | 编辑源代码]

根据GitHub上的wiki页面

Switching keyboard layouts under some Linux window managers does not result in a change in the low level X window APIs VS Code uses to read the current keyboard layout. This means that VS Code ends up sometimes reading one of the other configured keyboard layouts and not the current active one. PR welcome...

根据wiki页面,有两种解决方案:

  1. 确保setxkbmap -query返回的第一个键盘布局是你想在VS Code中使用的。
  2. 在设置中使用"keyboard.dispatch": "keyCode",并重启VS Code。这将彻底阻止VS Code确定您的键盘布局。

指令“...”未找到[编辑 | 编辑源代码]

在VS Coded官方编译版本中,product.json文件列出了所有能够使用某些特定API的扩展。然而,product.json在Code - OSS与VSCodium中是缺失的,尽管这似乎不是由于许可问题。这可能导致一些插件无法正常工作(例如Live Share)。但和强制打开官方拓展商场不同的是,这个解决方案得到了微软的认可[3]

您可以尝试通过安装一个pacman 钩子来解决,它将会在每次包更新时修补文件:

您也可以手动将相关条目添加到product.json文件中的extensionAllowedProposedApi部分:

  • 对于 code, 编辑 /usr/lib/code/product.json
  • 对于 vscodiumAUR, 编辑 /usr/share/vscodium/resources/app/product.json
  • 对于 vscodium-binAUR, 编辑 /opt/vscodium-bin/resources/app/product.json

一个使Live Share工作的手动配置示例是[4]:

product.json
...
  "extensionAllowedProposedApi": [
    "ms-vsliveshare.vsliveshare",
    "ms-vscode.node-debug",
    "ms-vscode.node-debug2"
  ]
...

再或者,您也可以考虑使用命令行标帜来启动,就如同GitHub拉取请求中所说的

VS Live Share缺失API[编辑 | 编辑源代码]

要么使用上述解决方案编辑product.json,要么使用如下命令打开VS Code:

$ code --enable-proposed-api ms-vsliveshare.vsliveshare

另请注意,为了使此扩展程序正常工作,您需要安装在这里列出的依赖项[5]

指令'remote-containers.openFolder'未找到[编辑 | 编辑源代码]

FS#63374所述,打开VS Code时启用remote-containers API:

$ code-oss --enable-proposed-api ms-vscode-remote.remote-containers

指令'GitHub Pull Requests: Configure Remotes...'导致错误(指令'pr.configureRemotes'未找到)[编辑 | 编辑源代码]

使用如下命令打开VS Code:

$ code --enable-proposed-api GitHub.vscode-pull-request-github

错误提示'Git: ssh_askpass: exec(/usr/lib/ssh/ssh-askpass): No such file or directory'[编辑 | 编辑源代码]

这个错误是由于SSH密匙加密且无法使用SSH agent造成的,参见这个问题报告。您可以尝试安装一个配置解释器(dialogue provider),例如SSH keys#x11-ssh-askpass或者其他的代替方案(例如,对于KDE用户您可以尝试使用ksshaskpass)。

对于ksshaskpass,为了让Code找到它,您需要将其链接到/usr/lib/ssh/ssh-askpass:

# ln /usr/bin/ksshaskpass /usr/lib/ssh/ssh-askpass

或者为您的shell设置以下环境变量,参见[6]:

GIT_ASKPASS=ksshaskpass
SSH_ASKPASS=ksshaskpass
SSH_ASKPASS_REQUIRE=prefer

为了禁用Code内置的git-askpass, 请在以下文件中添加:

~/.config/Code - OSS/User/settings.json
{
    "git.useIntegratedAskPass": false
}

终端中的截断字符[编辑 | 编辑源代码]

太宽的字符可能会被截断。例如Deno堆栈跟踪中使用的斜体粗体文本。

你可以将"terminal.integrated.rendererType"设置为"experimentalWebgl"来解决这个问题。

运行在Wayland下出现字体模糊[编辑 | 编辑源代码]

Code默认会在Xwayland下运行,如果你使用HiDPI屏幕,可能会有字体模糊的问题。你可以尝试让Electron强制在Wayland下运行—参见#在Wayland下原生运行

或者如你的Wayland环境提供了运行未缩放的Xwayland应用程序的选项,你可以绕过这个问题。你可以附带参数--force-device-scale-factor=来运行Code,手动指定其缩放比例。

例如,将缩放比例设置成2:

$ code --force-device-scale-factor=2

找不到接口“org.freedesktop.Secret.Collection”[编辑 | 编辑源代码]

参见Code官方文档settings-sync#_troubleshooting-keychain-issues

使用VSCodium时无法进行Github身份验证[编辑 | 编辑源代码]

参照这个Github评论,当要连接到Github时,将弹出的网址中的"vscodium"改为"vscode",随后将识别令牌(identification token)拷贝到VSCodium中。如果还是不成功,你可以尝试安装一个密钥环,例如gnome-keyring,或者你也可以参照Code官方文档这个Github链接来自己创建一个密钥环。

如果遇到登录账户后会自动退出的情况,你也可以尝试安装密匙环gnome-keyring来解决这个问题,如果你使用的是KDE,可能还需要安装qtkeychain-qt5[7]

找不到密钥环“An OS keyring couldn't be identified”[编辑 | 编辑源代码]

在一些桌面环境上(例如i3),Code可能会找不到密钥环。你需要手动指定Code使用的密匙环,例如gnome-keyring,在以下文件中添加:

~/.vscode-oss/argv.json
{
    ...
    "password-store": "gnome-libsecret",
}

这个文件地址仅适用于code包,如果你使用的是其他版本的Code,请相应调整argv.json的目录。例如,如果安装的是visual-studio-code-binAUR,其地址应调整为~/.vscode/argv.json