🚀 在 VS Code 中

終端機進階

Visual Studio Code 的整合式終端機具有許多進階功能和設定,例如 Unicode 和表情符號支援、自訂鍵盤快速鍵和自動回覆。本主題詳細說明這些進階功能。如果您是 VS Code 或整合式終端機的新手,您可能需要先檢閱終端機基本概念主題。

持續性工作階段

終端機支援兩種不同類型的持續性工作階段

  • 處理序重新連線:重新載入視窗時 (例如,在安裝擴充功能之後),重新連線至先前的處理序並還原其內容。
  • 處理序恢復:重新啟動 VS Code 時,終端機的內容會還原,且處理序會使用其原始環境重新啟動

這兩種持續性工作階段都可以透過將 terminal.integrated.enablePersistentSessions 設定為 false 來停用,而還原的回溯捲動量則由 terminal.integrated.persistentSessionScrollback 設定控制。處理序恢復可以透過 terminal.integrated.persistentSessionReviveProcess 獨立設定。

在視窗之間移動終端機

終端機索引標籤可以在 VS Code 視窗之間拖放。這也可以透過命令面板和 終端機:分離工作階段 終端機:附加至工作階段 命令手動完成。

設定終端機在啟動時的行為方式

開啟視窗時,如果終端機檢視畫面可見,則會使用持續性工作階段重新連線至終端機,或建立新的 Shell。此行為可以使用 terminal.integrated.hideOnStartup 設定進行微調。

  • never (預設值):啟動時永遠不要隱藏終端機檢視畫面。
  • whenEmpty:只有在沒有還原持續性工作階段時才隱藏終端機。
  • always:永遠隱藏終端機,即使還原了持續性工作階段也一樣。

鍵盤快速鍵和 Shell

作為內嵌應用程式,整合式終端機應攔截部分 (但非全部) 在 VS Code 內分派的鍵盤快速鍵。

可設定的 terminal.integrated.commandsToSkipShell 設定決定哪些命令的鍵盤快速鍵應永遠「略過 Shell」,而是由 VS Code 的鍵盤快速鍵系統處理。根據預設,它包含 VS Code 體驗不可或缺的硬式編碼命令清單,但您可以新增或移除特定命令

{
  "terminal.integrated.commandsToSkipShell": [
    // Ensure the toggle sidebar visibility keyboard shortcut skips the shell
    "workbench.action.toggleSidebarVisibility",
    // Send quick open's keyboard shortcut to the shell
    "-workbench.action.quickOpen",
  ]
}

查看 terminal.integrated.commandsToSkipShell 設定詳細資料,以查看預設命令的完整清單。

提示: 可以設定 terminal.integrated.sendKeybindingsToShell 以覆寫 terminal.integrated.commandsToSkipShell,並將大多數鍵盤快速鍵分派至 Shell。請注意,這會停用鍵盤快速鍵,例如 Ctrl+F 以開啟 尋找

複合鍵

複合鍵鍵盤快速鍵由兩個鍵盤快速鍵組成,例如 Ctrl+K 後接 Ctrl+C 以將行變更為註解。複合鍵預設永遠會略過 Shell,但可以使用 terminal.integrated.allowChords 停用。

macOS 清除畫面

在 macOS 上,Cmd+K 是終端機中清除畫面的常用鍵盤快速鍵,因此 VS Code 也會遵循此慣例,這表示 Cmd+K 複合鍵將無法運作。可以透過移除清除鍵盤快速鍵來啟用 Cmd+K 複合鍵

{
  "key": "cmd+k",
  "command": "-workbench.action.terminal.clear"
}

此外,如果任何擴充功能貢獻 Cmd+K 鍵盤快速鍵,則由於鍵盤快速鍵優先順序的運作方式,此鍵盤快速鍵將會自動覆寫。若要在這種情況下重新啟用 Cmd+K 清除鍵盤快速鍵,您可以在使用者鍵盤快速鍵中重新定義它,這會比擴充功能鍵盤快速鍵具有更高的優先順序

{
  "key": "cmd+k",
  "command": "workbench.action.terminal.clear",
  "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
}

助憶鍵

在終端機中,預設會停用使用助憶鍵存取 VS Code 的功能表 (例如,Alt+F 代表 [檔案] 功能表),因為這些按鍵事件通常是 Shell 中的重要熱鍵。將 terminal.integrated.allowMnemonics 設定為啟用助憶鍵,但請注意,這會禁止任何 Alt 按鍵事件傳送至 Shell。此設定在 macOS 上無作用。

自訂序列鍵盤快速鍵

workbench.action.terminal.sendSequence 命令可用於將特定文字序列傳送至終端機,包括 Shell 會特別解譯的逸出序列。此命令可讓您傳送方向鍵、Enter、游標移動等。

例如,以下序列會跳過游標左側的字詞 (Ctrl+向左鍵),然後按下 退格鍵

{
  "key": "ctrl+u",
  "command": "workbench.action.terminal.sendSequence",
  "args": {
    "text": "\u001b[1;5D\u007f"
  }
}

此功能支援變數取代

sendSequence 命令僅適用於 \u0000 格式,透過字元代碼使用字元 (而非 \x00)。如需這些十六進位代碼和終端機序列的詳細資訊,請參閱下列資源

確認對話方塊

為了避免不必要的輸出和使用者提示,當處理序結束時,終端機不會顯示警告對話方塊。如果需要警告,可以使用下列設定進行設定

  • terminal.integrated.confirmOnExit - 控制在有作用中的偵錯工作階段時,是否在視窗關閉時顯示確認。
  • terminal.integrated.confirmOnKill - 控制在終端機有子處理序時,是否顯示確認終止終端機。
  • terminal.integrated.showExitAlert - 控制在結束代碼為非零時,是否顯示「終端機處理序已終止,結束代碼為」警示。

自動回覆

如果收到確切的輸出序列,終端機能夠自動提供可設定的輸入回應給 Shell。最常見的使用案例是在批次指令碼中按下 Ctrl+C 時,自動回覆提示,詢問使用者是否要終止批次作業。若要自動關閉此訊息,請新增此設定

{
  "terminal.integrated.autoReplies": {
    "Terminate batch job (Y/N)": "Y\r"
  }
}

請注意,此處使用的 \r 字元表示 Enter,而且與自訂序列鍵盤快速鍵非常類似,此功能支援將逸出序列傳送至 Shell。

預設不會設定自動回覆,因為提供 Shell 輸入應為使用者的明確動作或設定。

變更 Tab 字元寬度

terminal.integrated.tabStopWidth 設定允許設定當終端機中執行的程式輸出 \t 時的 Tab 字元寬度。這通常不需要,因為程式通常會移動游標,而不是使用 Tab 字元,但在某些情況下可能很有用。

Unicode 和表情符號支援

終端機同時支援 Unicode 和表情符號。當在終端機中使用這些字元時,對該支援有一些注意事項

  • 某些 Unicode 符號具有不明確的寬度,可能會在 Unicode 版本之間變更。目前我們支援 Unicode 版本 6 和 11 的寬度,可以使用 terminal.integrated.unicodeVersion 設定進行設定。指定的版本應符合 Shell/作業系統使用的 Unicode 版本,否則可能會發生轉譯問題。請注意,Shell/OS 的 Unicode 版本可能與字型的實際寬度不符。
  • 某些由多個字元組成的表情符號可能無法正確轉譯,例如,膚色修飾符。
  • Windows 上的表情符號支援有限。

影像支援

終端機中的影像可運作,前提是它們使用 Sixel 或 iTerm 行內影像通訊協定。此功能預設為停用,可以使用 terminal.integrated.enableImages 設定啟用。

目前的限制

處理序環境

在終端機內執行的應用程式處理序環境會受到各種設定和擴充功能的影響,並可能導致 VS Code 終端機中的輸出看起來與其他終端機不同。

環境繼承

當 VS Code 開啟時,它會啟動登入 Shell 環境,以便取得 Shell 環境的來源。這樣做的原因是開發人員工具通常會新增至 Shell 啟動指令碼 (例如 ~/.bash_profile) 中的 $PATH。根據預設,終端機會繼承此環境,視您的設定檔 Shell 引數而定,這表示可能已執行多個設定檔指令碼,這可能會導致非預期的行為。

可以在 macOS 和 Linux 上透過 terminal.integrated.inheritEnv 設定停用此環境繼承。

$LANG 互動

$LANG 環境變數有一些特殊的互動,這會決定字元在終端機中的呈現方式。此功能是使用 terminal.integrated.detectLocale 設定進行設定

行為
on 永遠將 $LANG 設定為最常需要的值。選擇的值是以作業系統地區設定為基礎 (回復為 en-US),並使用 UTF-8 編碼。
auto (預設值) 如果 $LANG 未正確設定 (未設定為 UTF 或 EUC 編碼),則將 $LANG 設定為類似於 on 行為。
off 不修改 $LANG

擴充功能環境貢獻

擴充功能能夠貢獻於終端機環境,讓它們能夠提供與終端機的某些整合。例如,內建 Git 擴充功能會插入 GIT_ASKPASS 環境變數,以允許 VS Code 處理 Git 遠端的驗證。

如果擴充功能變更終端機環境,則任何現有的終端機都會重新啟動 (如果可以安全地執行此動作),否則終端機狀態中會顯示警告。如需變更的詳細資訊,可以在 hover 中檢視,其中也包含重新啟動按鈕。

A warning icon appears next to the terminal tab when a relaunch is required, information on the changes can be viewed by hovering it

Windows 和 ConPTY

VS Code 的終端機是以 xterm.js 專案為基礎建置,以實作 Unix 樣式的終端機,該終端機會將所有資料序列化為字串,並透過「虛擬終端機」傳輸。從歷史上看,這並非 Windows 上終端機的運作方式,Windows 使用 Console API 來實作其主控台,稱為 'conhost'。

建立了一個名為 winpty 的開放原始碼專案,嘗試透過在 Unix 樣式的終端機和 Windows 主控台之間提供模擬/轉譯層來修正此問題。VS Code 的終端機最初僅使用 winpty 實作。這在當時很棒,但在 2018 年,Windows 10 收到 ConPTY API,它採用 winpty 首創的概念並將其內建至 Windows 中,提供更可靠且受支援的系統,以利用 Windows 上的 Unix 樣式終端機和應用程式。

VS Code 預設為 Windows 10+ (組建編號 18309 起) 上的 ConPTY,並回復為 winpty 作為舊版 Windows 的舊版選項。ConPTY 可以透過 terminal.integrated.windowsEnableConpty 設定明確停用,但通常應避免這樣做。

由於 ConPTY 是模擬層,因此確實有一些怪癖。最常見的是 ConPTY 認為自己是檢視區的擁有者,因此有時會重新列印畫面。這種重新列印可能會導致非預期的行為,例如在執行 終端機:清除 命令後顯示舊內容。

遠端開發

本節概述當 VS Code 使用 VS Code 遠端開發擴充功能連線至遠端電腦時的特定主題。

減少遠端輸入延遲

本機回音是一項功能,有助於減輕輸入延遲對遠端視窗的影響。它會在終端機中以暗淡的色彩寫入按鍵,然後再由遠端確認結果。根據預設,當偵測到延遲超過 30 毫秒時,此功能會開始執行,且計時可以使用 terminal.integrated.localEchoLatencyThreshold 進行設定。未確認字元的色彩是由 terminal.integrated.localEchoStyle 定義。

本機回音會根據終端機中的作用中程式動態停用自身。這是由 terminal.integrated.localEchoExcludePrograms 控制,預設值為 ['vim', 'vi', 'nano', 'tmux']。建議您針對任何高度動態和/或在輸入時大量重新列印畫面的應用程式或 Shell 停用此功能。

若要完全停用此功能,請使用

{
  "terminal.integrated.localEchoEnabled": false
}

遠端視窗中的本機終端機

預設的 本機 終端機設定檔可以使用命令面板透過 終端機:建立新的整合式終端機 (本機) 命令在遠端視窗中啟動。目前無法從遠端視窗啟動非預設設定檔。