終端高階
Visual Studio Code 的整合終端具有許多高階功能和設定,例如 Unicode 和 emoji 支援、自定義鍵盤快捷鍵和自動回覆。本主題將詳細介紹這些高階功能。如果您是 VS Code 或整合終端的新手,建議先閱讀 終端基礎知識主題。
持久化會話
終端支援兩種不同型別的持久化會話
- 程序重新連線:當視窗重新載入時(例如,安裝擴充套件後),**重新連線**到之前的程序並恢復其內容。
- 程序恢復:當重啟 VS Code 時,終端的內容將被恢復,並且程序將使用其原始環境 **重新啟動**。
這兩種持久化會話都可以透過將 terminal.integrated.enablePersistentSessions 設定為 false 來停用,恢復的滾動回溯量由 terminal.integrated.persistentSessionScrollback 設定控制。程序恢復可以透過 terminal.integrated.persistentSessionReviveProcess 單獨配置。
在視窗之間移動終端
終端標籤頁可以在 VS Code 視窗之間拖放。也可以透過命令面板和 **Terminal: Detach Session**(終端:分離會話)以及 **Terminal: Attach to Session**(終端:附加到會話)命令手動完成。
配置終端可見性
開啟視窗時,如果終端檢視可見,它將使用持久化會話重新連線到終端,或者建立一個新的 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 設定為 true 以啟用助記符,但請注意,這將不允許任何 Alt 鍵事件傳送到 shell。此設定在 macOS 上無效。
自定義序列鍵盤快捷鍵
workbench.action.terminal.sendSequence 命令可用於將特定文字序列傳送到終端,包括被 shell 特別解釋的轉義序列。該命令使您能夠傳送箭頭鍵、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 - 控制當退出程式碼非零時是否顯示“The terminal process terminated with exit code”(終端程序以退出程式碼終止)的警告。
自動回覆
當接收到精確的輸出序列時,終端可以自動提供可配置的輸入響應給 shell。最常見的用例是在批處理指令碼中自動回覆提示,這些指令碼會詢問使用者是否要終止批處理作業。要自動忽略此訊息,請新增此設定:
{
"terminal.integrated.autoReplies": {
"Terminate batch job (Y/N)": "Y\r"
}
}
請注意,此處使用的 \r 字元表示 Enter,並且與 自定義序列鍵盤快捷鍵 類似,此功能支援向 shell 傳送轉義序列。
預設情況下未配置自動回覆,因為向 shell 輸入內容應由使用者顯式執行或配置。
更改 Tab 停止寬度
terminal.integrated.tabStopWidth 設定允許在終端中執行的程式輸出 \t 時配置製表符停止寬度。通常不需要這樣做,因為程式通常會移動游標而不是使用 Tab 字元,但在某些情況下可能很有用。
Unicode 和 Emoji 支援
終端同時支援 Unicode 和 emoji。當在終端中使用這些字元時,其支援存在一些注意事項:
- 某些 Unicode 符號具有寬度歧義,可能在不同的 Unicode 版本之間發生變化。目前我們支援 Unicode 版本 6 和 11 的寬度,這可以透過 terminal.integrated.unicodeVersion 設定進行配置。指定的版本應與 shell/作業系統使用的 Unicode 版本匹配,否則可能出現渲染問題。請注意,shell/作業系統的 Unicode 版本可能與字型實際寬度不匹配。
- 某些由多個字元組成的 emoji 可能無法正確渲染,例如膚色修飾符。
- 在 Windows 上,Emoji 支援有限。
圖片支援
終端中的圖片可以正常顯示,前提是它們使用了 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 開啟時,它會啟動一個登入 shell 環境以載入 shell 環境。這樣做是因為開發工具通常會新增到 shell 啟動指令碼(如 ~/.bash_profile)的 $PATH 中。預設情況下,終端會繼承此環境,具體取決於您的 配置檔案 shell 引數,這意味著多個配置檔案指令碼可能已經執行,這可能會導致意外行為。
在 macOS 和 Linux 上,可以透過 terminal.integrated.inheritEnv 設定停用此環境繼承。
VS Code 例項之間的環境變數
當啟動多個 VS Code 例項時,環境變數會在它們之間共享。
- 第一個 VS Code 例項從父程序(例如,啟動 VS Code 的 shell 或應用程式)繼承環境變數。
- 後續的 VS Code 例項從第一個執行的 VS Code 例項繼承環境變數,而不是從父程序繼承。
要隔離 VS Code 例項之間的環境變數,請使用 --user-data-dir 命令列選項,使每個例項都使用獨立的使用者資料目錄執行。這將確保每個例項維護其自己的環境、設定和擴充套件。
與 $LANG 的互動
與 $LANG 環境變數有一些特殊的互動,它決定了字元如何在終端中顯示。此功能透過 terminal.integrated.detectLocale 設定進行配置。
| 值 | 行為 |
|---|---|
on |
始終將 $LANG 設定為最常期望的值。選擇的值基於作業系統區域設定(回退到 en-US)並使用 UTF-8 編碼。 |
auto(預設) |
如果 $LANG 未正確配置(未設定為 UTF 或 EUC 編碼),則類似 on 的行為設定 $LANG。 |
off |
不修改 $LANG。 |
擴充套件環境貢獻
擴充套件能夠 貢獻到終端環境,允許它們與終端進行一些整合。例如,內建的 Git 擴充套件會注入 GIT_ASKPASS 環境變數,以便 VS Code 處理到 Git 遠端的身份驗證。
如果擴充套件更改了終端環境,任何現有終端將在安全的情況下被重新啟動,否則會在終端狀態列中顯示警告。可以在懸停提示中檢視有關更改的更多資訊,其中還包括一個重新啟動按鈕。

Windows 和 ConPTY
VS Code 的終端構建於 xterm.js 專案之上,實現了類 Unix 終端,它將所有資料序列化為字串並透過“偽終端”進行管道傳輸。歷史上,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 作為舊版選項。可以透過 terminal.integrated.windowsEnableConpty 設定明確停用 ConPTY,但這通常應該避免。
由於 ConPTY 是一個模擬層,它確實存在一些怪癖。最常見的是 ConPTY 認為自己是視口的所有者,因此有時會重新列印螢幕。這種重印可能會導致意外行為,例如在執行 **Terminal: Clear**(終端:清除)命令後顯示舊內容。
遠端開發
本節概述了當 VS Code 使用 VS Code 遠端開發擴充套件連線到遠端機器時特有的主題。
遠端視窗中的本地終端
可以透過命令面板使用 **Terminal: Create New Integrated Terminal (Local)**(終端:建立新的本地整合終端)命令在遠端視窗中啟動預設的 *本地* 終端配置檔案。目前,不能從遠端視窗啟動非預設配置檔案。
減少遠端輸入延遲(預覽)
本地回顯是一個有助於減輕遠端視窗輸入延遲的功能。它會在結果由遠端端確認之前,以變暗的顏色在終端中顯示按鍵。預設情況下,當檢測到延遲超過 30 毫秒時,該功能開始執行,並且可以透過 terminal.integrated.localEchoLatencyThreshold 配置計時。未確認字元的顏色由 terminal.integrated.localEchoStyle 定義。
本地回顯會根據終端中的活動程式動態停用自身。這由 terminal.integrated.localEchoExcludePrograms 控制,其預設值為 ['vim', 'vi', 'nano', 'tmux']。建議您為任何高度動態的或/和在鍵入時大量重繪螢幕的應用程式或 shell 停用此功能。
要完全停用該功能,請使用:
{
"terminal.integrated.localEchoEnabled": false
}