終端機進階功能
Visual Studio Code 的整合式終端機有許多進階功能和設定,例如 Unicode 和表情符號支援、自訂鍵盤快速鍵以及自動回覆。本主題將詳細說明這些進階功能。如果您是 VS Code 或整合式終端機的新手,建議您先閱讀 終端機基本概念 主題。
持續性工作階段
終端機支援兩種不同類型的持續性工作階段
- 程序重新連線:當重新載入視窗時 (例如,安裝延伸模組後),重新連線到先前的程序並還原其內容。
- 程序還原:當重新啟動 VS Code 時,終端機的內容會被還原,且該程序會使用其原始環境重新啟動。
這兩種持續性工作階段都可以透過將 terminal.integrated.enablePersistentSessions 設定為 false 來停用,而還原的捲動量則由 terminal.integrated.persistentSessionScrollback 設定控制。程序還原可以透過 terminal.integrated.persistentSessionReviveProcess 單獨設定。
在視窗之間移動終端機
終端機分頁可以在 VS Code 視窗之間拖曳。也可以透過命令選擇區以及終端機:分離工作階段和終端機:附加至工作階段命令手動完成此操作。
設定終端機可見性
當開啟視窗時,如果終端機檢視可見,它會使用持續性工作階段重新連線到終端機,或者建立新的殼層。此行為可以透過 terminal.integrated.hideOnStartup 設定進行微調。
never(預設):啟動時絕不隱藏終端機檢視。whenEmpty:僅在沒有還原的持續性工作階段時隱藏終端機。always:即使有還原的持續性工作階段,也始終隱藏終端機。
還可以透過 terminal.integrated.hideOnLastClosed 設定來覆寫當最後一個終端機關閉時,關閉終端機檢視的預設行為。
鍵盤快速鍵與殼層
作為一個嵌入式應用程式,整合式終端機應該攔截 VS Code 內分派的一些鍵盤快速鍵,但不是全部。
可設定的 terminal.integrated.commandsToSkipShell 設定決定了哪些命令的鍵盤快速鍵應始終「跳過殼層」,改由 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 ,並將大多數鍵盤快速鍵分派給殼層。請注意,這將會停用例如 Ctrl+F 等鍵盤快速鍵來開啟 尋找 功能。
組合鍵
組合鍵盤快速鍵由兩個鍵盤快速鍵組成,例如 Ctrl+K 後接 Ctrl+C 以將行變更為註解。組合鍵預設會跳過殼層,但可以使用 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 開啟「檔案」功能表),因為這些按鍵事件在殼層中通常是很重要的快速鍵。將 terminal.integrated.allowMnemonics 設定為啟用助記鍵,但請注意,這將不允許任何 Alt 鍵事件傳遞給殼層。此設定在 macOS 上無效。
自訂序列鍵盤快速鍵
workbench.action.terminal.sendSequence 命令可用於向終端機傳送特定的文字序列,包括由殼層特別解釋的逸出序列。該命令可讓您傳送方向鍵、Enter、游標移動等。透過命令選擇區執行此命令,可手動輸入,但當您為其指派帶有引數的自訂鍵盤快速鍵時,它最有用。
例如,以下序列會跳過游標左側的單字 (Ctrl+Left),然後按下 Backspace
{
"key": "ctrl+u",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\u001b[1;5D\u007f"
}
}
此功能支援 變數替換。
sendSequence 命令僅適用於透過字元碼使用字元的 \u0000 格式 (而非 \x00)。請參閱以下資源以了解更多關於這些十六進位碼和終端機序列的資訊
傳送自訂訊號
workbench.action.terminal.sendSignal 命令可用於向作用中終端機中的前景程序傳送任意訊號。
例如,以下按鍵繫結將會傳送 SIGTERM,使其優雅地終止。
{
"key": "ctrl+shift+/",
"command": "workbench.action.terminal.sendSignal",
"args": {
"signal": "SIGTERM"
}
}
確認對話方塊
為避免不必要的輸出和使用者提示,終端機在程序結束時不顯示警告對話方塊。如果需要警告,可以使用以下設定進行配置
- terminal.integrated.confirmOnExit - 控制當視窗關閉時,若有作用中的偵錯工作階段是否要確認。
- terminal.integrated.confirmOnKill - 控制當終端機有子程序時,是否要確認終止終端機。
- terminal.integrated.showExitAlert - 控制當結束碼非零時,是否顯示「終端機程序以結束碼終止」的警示。
自動回覆
如果收到確切的輸出序列,終端機可以自動向殼層提供可設定的輸入回覆。最常見的用途是在批次指令碼中,當按下 Ctrl+C 並詢問使用者是否要終止批次工作時,自動回覆提示。若要自動關閉此訊息,請新增此設定
{
"terminal.integrated.autoReplies": {
"Terminate batch job (Y/N)": "Y\r"
}
}
請注意,此處使用的 \r 字元表示 Enter,而且就像自訂序列鍵盤快速鍵一樣,此功能支援向殼層傳送逸出序列。
預設沒有配置自動回覆,因為提供殼層輸入應該是使用者明確的動作或配置。
變更定位點寬度
terminal.integrated.tabStopWidth 設定允許配置當終端機中執行的程式輸出 \t 時的定位點寬度。通常不需要此功能,因為程式通常會移動游標而不是使用 Tab 字元,但在某些情況下可能會有用。
Unicode 與表情符號支援
終端機支援 Unicode 和表情符號。當這些字元在終端機中使用時,這種支援有一些注意事項
- 某些 Unicode 符號的寬度不明確,可能會在 Unicode 版本之間變化。目前我們支援 Unicode 版本 6 和 11 的寬度,可以使用 terminal.integrated.unicodeVersion 設定進行配置。指定的版本應與殼層/作業系統使用的 Unicode 版本相符,否則可能會出現渲染問題。請注意,殼層/作業系統的 Unicode 版本可能與字體的實際寬度不符。
- 由多個字元組成的某些表情符號可能無法正確渲染,例如膚色修飾符。
- Windows 上的表情符號支援有限。
影像支援
終端機中的影像支援,前提是它們使用 Sixel 或 iTerm 行內影像協定。此功能預設為停用,可透過 terminal.integrated.enableImages 設定啟用。
目前的限制
- 序列化無效,因此重新載入終端機將不會保留任何影像 (jerch/xterm-addon-image#47)。
- 將選取範圍複製為 HTML 不包含選定的影像 (jerch/xterm-addon-image#50)。
- 動畫 GIF 無法運作 (jerch/xterm-addon-image#51)。
- 短於一個儲存格的影像將無法正常運作,這是序列的設計缺陷,也發生在 XTerm 中。
程序環境
在終端機中執行的應用程式的程序環境受各種設定和延伸模組的影響,這可能導致 VS Code 終端機中的輸出看起來與其他終端機不同。
環境繼承
當 VS Code 開啟時,它會啟動一個登入殼層環境,以便來源殼層環境。這樣做是因為開發者工具通常會新增到殼層啟動指令碼 (例如 ~/.bash_profile) 中的 $PATH。預設情況下,終端機會繼承此環境,具體取決於您的設定檔殼層引數,這表示多個設定檔指令碼可能已執行,這可能會導致意外行為。
此環境繼承可以在 macOS 和 Linux 上透過 terminal.integrated.inheritEnv 設定停用。
VS Code 執行個體之間的環境變數
當啟動多個 VS Code 執行個體時,環境變數會在它們之間共用
- 第一個 VS Code 執行個體會繼承來自父程序 (例如,啟動 VS Code 的殼層或應用程式) 的環境變數。
- 後續的 VS Code 執行個體會繼承來自第一個執行中的 VS Code 執行個體的環境變數,而非來自父程序。
若要隔離 VS Code 執行個體之間的環境變數,請使用 --user-data-dir 命令列選項,讓每個執行個體都在單獨的使用者資料目錄中執行。這可確保每個執行個體都維護自己的環境、設定和延伸模組。
與 $LANG 的互動
與 $LANG 環境變數有一些特殊的互動,它決定了字元在終端機中如何呈現。此功能透過 terminal.integrated.detectLocale 設定進行配置
| 值 | 行為 |
|---|---|
開啟 |
始終將 $LANG 設定為最常用的值。所選值基於作業系統地區設定 (若無則回退到 en-US),並採用 UTF-8 編碼。 |
auto (預設) |
如果 $LANG 未正確配置 (未設定為 UTF 或 EUC 編碼),則將 $LANG 設定為類似 on 的行為。 |
關閉 |
不修改 $LANG。 |
延伸模組環境貢獻
延伸模組能夠貢獻終端機環境,使其能夠提供與終端機的一些整合。例如,內建的 Git 延伸模組會注入 GIT_ASKPASS 環境變數,以允許 VS Code 處理對 Git 遠端的驗證。
如果延伸模組變更終端機環境,任何現有的終端機將會在安全的情況下重新啟動,否則終端機狀態中會顯示警告。有關變更的更多資訊可以在懸停時查看,其中也包含一個重新啟動按鈕。

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,並針對舊版 Windows 回退到 winpty 作為傳統選項。ConPTY 可以透過 terminal.integrated.windowsEnableConpty 設定明確停用,但通常應避免這樣做。
由於 ConPTY 是一個模擬層,它確實帶有一些怪異之處。最常見的是 ConPTY 認為自己是視埠的擁有者,因此有時會重新繪製螢幕。這種重新繪製可能會導致意外行為,例如執行終端機:清除命令後顯示舊內容。
遠端開發
本節概述當 VS Code 使用 VS Code 遠端開發延伸模組連接到遠端機器時的特定主題。
遠端視窗中的本機終端機
預設的本機終端機設定檔可以透過命令選擇區中的終端機:建立新的整合式終端機 (本機) 命令在遠端視窗中啟動。目前,非預設設定檔無法從遠端視窗啟動。
減少遠端輸入延遲 (預覽)
本機回音是一種有助於緩解遠端視窗中輸入延遲的功能。它會在結果得到遠端確認之前,以暗淡的顏色將按鍵寫入終端機。預設情況下,當偵測到延遲超過 30 毫秒時,此功能會開始執行,並且其時機可以透過 terminal.integrated.localEchoLatencyThreshold 配置。未確認字元的顏色由 terminal.integrated.localEchoStyle 定義。
本機回音會根據終端機中的作用中程式動態停用。這由 terminal.integrated.localEchoExcludePrograms 控制,其預設值為 ['vim', 'vi', 'nano', 'tmux']。建議您對任何高度動態和/或在打字時大量重新繪製螢幕的應用程式或殼層停用此功能。
若要完全停用此功能,請使用
{
"terminal.integrated.localEchoEnabled": false
}