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
  • 對於 vscodium-electronAUR, 編輯 /usr/lib/vscodium/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