終端高階功能
Visual Studio Code 的整合終端有許多高階功能和設定,例如 Unicode 和表情符號支援、自定義鍵盤快捷鍵和自動回覆。本主題詳細介紹這些高階功能。如果您是 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 以啟用助記符,但請注意,這將禁止任何 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 - 控制當退出程式碼非零時是否顯示“終端程序以退出程式碼...終止”的警報。
自動回覆
如果接收到精確的輸出序列,終端可以自動向 shell 提供可配置的輸入響應。最常見的用例是在批處理指令碼中按下 Ctrl+C 時,自動回覆詢問使用者是否要終止批處理作業的提示。要自動忽略此訊息,請新增此設定:
{
"terminal.integrated.autoReplies": {
"Terminate batch job (Y/N)": "Y\r"
}
}
請注意,此處使用的 \r
字元表示 Enter,並且很像自定義序列鍵盤快捷鍵,此功能支援向 shell 傳送轉義序列。
預設情況下沒有配置自動回覆,因為提供 shell 輸入應該是使用者的顯式操作或配置。
更改制表符寬度
terminal.integrated.tabStopWidth 設定允許配置在終端中執行的程式輸出 \t
時的製表符寬度。通常不需要這樣做,因為程式通常會移動游標而不是使用 Tab 字元,但在某些情況下可能有用。
Unicode 和表情符號支援
終端支援 Unicode 和表情符號。在終端中使用這些字元時,支援方面有一些注意事項:
- 一些 Unicode 符號的寬度不明確,可能會在不同 Unicode 版本之間發生變化。目前我們支援 Unicode 版本 6 和 11 的寬度,可以透過 terminal.integrated.unicodeVersion 設定進行配置。指定的版本應與 shell/作業系統使用的 Unicode 版本相匹配,否則可能會出現渲染問題。請注意,shell/作業系統的 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 開啟時,它會啟動一個登入 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 遠端倉庫的身份驗證。
如果擴充套件更改了終端環境,任何現有的終端將在安全的情況下被重新啟動,否則將在終端狀態列中顯示警告。有關更改的更多資訊可以在懸停提示中檢視,其中還包括一個重新啟動按鈕。
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 作為舊版選項。可以透過 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
}