🚀 在 VS Code 中

終端機進階

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

持續性工作階段

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

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

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

在視窗之間移動終端機

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

設定終端機可見性

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

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

當最後一個終端機關閉時,terminal.integrated.hideOnLastClosed 設定也可用於覆寫關閉終端機檢視畫面的預設行為。

鍵盤快速鍵與 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+向左鍵),然後按下 Backspace 鍵

{
  "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 與 Emoji 支援

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

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

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

由於 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
}