终端外壳集成
Visual Studio Code 能够与常用外壳集成,使终端能够更好地理解外壳中实际发生的情况。这些额外的信息启用了一些有用的功能,例如工作目录检测和命令检测、装饰以及导航。
支持的外壳
- Linux/macOS:bash、fish、pwsh、zsh
- Windows:Git Bash、pwsh
安装
自动脚本注入
默认情况下,外壳集成脚本应在从 VS Code 启动的受支持外壳上自动激活。这是通过在外壳会话启动时注入参数和/或环境变量来完成的。可以通过将 terminal.integrated.shellIntegration.enabled 设置为 false
来禁用此自动注入。
这种标准、简单的方法不适用于某些高级用例,例如子外壳中、通过常规 ssh
会话(未v使用远程 - SSH 扩展时)或某些复杂的外壳设置。对于这些情况,启用外壳集成的推荐方法是手动安装。
注意:自动注入可能不适用于旧版外壳,例如旧版 fish 不支持
$XDG_DATA_DIRS
环境变量,而这是注入的工作方式。您仍然可以尝试手动安装以使其工作。
手动安装
要手动安装外壳集成,VS Code 外壳集成脚本需要在外壳初始化期间运行。在哪里以及如何执行此操作取决于您使用的外壳和操作系统。手动安装时,建议将 terminal.integrated.shellIntegration.enabled 设置为 false
,但这并不是强制性的。
提示: 使用 Insiders 版本时,请将下面的
code
替换为code-insiders
。
bash
将以下内容添加到您的 ~/.bashrc
文件中。在 bash 中运行 code ~/.bashrc
以在 VS Code 中打开文件。
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"
fish
将以下内容添加到您的 config.fish
中。在 fish 中运行 code $__fish_config_dir/config.fish
以在 VS Code 中打开文件。
string match -q "$TERM_PROGRAM" "vscode"
and . (code --locate-shell-integration-path fish)
pwsh
将以下内容添加到您的PowerShell 配置文件中。在 pwsh 中运行 code $Profile
以在 VS Code 中打开文件。
if ($env:TERM_PROGRAM -eq "vscode") { . "$(code --locate-shell-integration-path pwsh)" }
zsh
将以下内容添加到您的 ~/.zshrc
文件中。在 zsh 中运行 code ~/.zshrc
以在 VS Code 中打开文件。
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"
Git Bash
将以下内容添加到您的 ~/.bashrc
文件中。在 Git Bash 中运行 code ~/.bashrc
以在 VS Code 中打开文件。
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"
可移植性与性能
如果 code
在 $PATH
中,上述外壳集成安装是跨平台的,并且与任何安装类型兼容。然而,这种推荐的方法会启动 Node.js 来获取脚本路径,导致外壳启动时略有延迟。为了减轻这种延迟,可以通过提前解析路径并将其直接添加到您的初始化脚本中来内联上述脚本。
# Output the executable's path first:
code --locate-shell-integration-path bash
# Add the result of the above to the source statement:
[[ "$TERM_PROGRAM" == "vscode" ]] && . "/path/to/shell/integration/script.sh"
外壳集成质量
使用外壳集成时,它有一个相关的“质量”来声明其功能。这些质量由外壳集成脚本的行为方式决定。
- 无:没有外壳集成处于活动状态。
- 丰富:外壳集成处于活动状态,命令检测以理想方式工作。
- 基本:外壳集成处于活动状态,但命令检测可能不支持所有功能。例如,可以检测到命令运行位置,但无法检测其退出状态。
要查看外壳集成质量,请将鼠标悬停在终端选项卡上。可以选择在悬停时选择显示详细信息以查看更详细的信息。
命令装饰和概览标尺
外壳集成的一个功能是能够获取在终端中运行的命令的退出代码。利用这些信息,在行的左侧添加装饰以指示命令是成功还是失败。这些装饰还会显示在滚动条中相对较新的概览标尺中,就像在编辑器中一样。
可以与装饰进行交互,以提供一些上下文操作,例如重新运行命令
命令和概览标尺装饰可以通过 terminal.integrated.shellIntegration.decorationsEnabled 设置进行配置。
命令导航
外壳集成检测到的命令会馈送到命令导航功能(Ctrl/Cmd+Up、Ctrl/Cmd+Down),使其具有更可靠的命令位置。此功能允许在命令之间快速导航并选择其输出。要从当前位置选择到命令,您还可以按住 Shift 键,然后按 Shift+Ctrl/Cmd+Up 和 Shift+Ctrl/Cmd+Down。
命令指南
命令指南是当鼠标悬停在命令及其输出旁边时显示的一条条。这有助于更快地识别命令,也是验证外壳集成是否正常工作的一种方式。
您可以使用颜色主题自定义命令指南的颜色。要切换命令指南,请配置 terminal.integrated.shellIntegration.showCommandGuide 设置。
粘性滚动
粘性滚动功能会将部分显示的命令“固定”在终端顶部,从而更容易查看该输出属于哪个命令。单击粘性滚动组件将滚动到终端缓冲区中命令的位置。
这可以通过 terminal.integrated.stickyScroll.enabled 设置启用。
快速修复
VS Code 扫描命令的输出,并提供一个快速修复,其中包含用户下一步很可能希望执行的操作。
以下是一些内置的快速修复
- 当检测到端口已被监听时,建议杀死进程并重新运行上一个命令。
- 当
git push
因未设置上游而失败时,建议使用已设置上游的方式进行推送。 - 当
git
子命令因类似命令错误而失败时,建议使用类似命令。 - 当
git push
导致建议创建 GitHub PR 时,建议打开链接。 - 当通用或
cmd-not-found
PowerShell 反馈提供程序触发时,建议每个建议。
快速修复功能还支持辅助功能信号,以便在有快速修复可用时提供额外反馈。
运行最近的命令
“终端:运行最近的命令”命令在快速选择中显示来自各种来源的历史记录,提供了类似于外壳反向搜索(Ctrl+R)的功能。来源包括当前会话的历史记录、此外壳类型的上一个会话历史记录以及通用外壳历史文件。
该命令的一些其他功能
- 默认情况下,搜索模式是“连续搜索”,这意味着搜索词必须完全匹配。搜索输入框右侧的按钮允许切换到模糊搜索。
- 在当前会话部分,快速选择右侧有一个剪贴板图标,它将在编辑器中打开命令输出。
- 快速选择右侧的“固定”操作可以将命令固定到列表顶部。
- Alt 可以被按住以将文本写入终端而不运行它。
- 上一个会话部分中存储的历史记录量由 terminal.integrated.shellIntegration.history 设置决定。
此命令的默认键盘快捷方式是 Ctrl+Alt+R。但是,当辅助功能模式开启时,这些会反转;Ctrl+R 运行最近的命令,Ctrl+Alt+R 将 Ctrl+R 发送到外壳。
当辅助功能模式关闭时,可以使用以下键盘快捷方式翻转键盘快捷方式
{
"key": "ctrl+r",
"command": "workbench.action.terminal.runRecentCommand",
"when": "terminalFocus"
},
{
"key": "ctrl+alt+r",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u0012"/*^R*/ },
"when": "terminalFocus"
}
转到最近的目录
类似于运行最近命令功能,“终端:转到最近的目录”命令会跟踪已访问的目录,并允许快速过滤和导航 (cd
) 到它们。Alt 可以被按住以将文本写入终端而不运行它。
此命令的默认键盘快捷方式是 ⌘G (Windows, Linux Ctrl+G),因为它与编辑器中的“转到行/列”命令行为类似。Ctrl+G 可以通过 Ctrl+Alt+G 发送到外壳。
当前工作目录检测
外壳集成会告诉 VS Code 外壳的当前工作目录是什么。在 Windows 上,如果不尝试通过正则表达式检测提示,则无法获取此信息,而在 macOS 和 Linux 上,则需要轮询,这不利于性能。
该功能最大的亮点之一是增强了终端中链接的解析。以 package.json
链接为例,当外壳集成禁用时激活该链接,如果工作区中有多个 package.json
文件,则会打开一个搜索快速选择,并将 package.json
作为过滤器。但是,当外壳集成启用时,它会直接打开当前文件夹中的 package.json
文件,因为已知当前位置。例如,这使得 ls
的输出能够可靠地打开正确的文件。
当前工作目录还用于在终端选项卡、运行最近命令快速选择以及 "terminal.integrated.splitCwd": "inherited"
功能中显示目录。
扩展的 PowerShell 键盘快捷方式
Windows 的控制台 API 允许比 Linux/macOS 终端更多的键盘快捷方式,因为 VS Code 的终端即使在 Windows 上也模拟后者,因此由于缺少 VT 编码(例如 Ctrl+Space),某些 PowerShell 键盘快捷方式无法通过标准方式实现。外壳集成允许 VS Code 附加自定义键盘快捷方式,以将特殊序列发送到 PowerShell,然后在外壳集成脚本中处理并转发到适当的按键处理程序。
当启用外壳集成时,以下键盘快捷方式应在 PowerShell 中工作
- Ctrl+Space:仅在 Windows 上默认为
MenuComplete
- Alt+Space:在所有平台上默认为
SetMark
- Shift+Enter:在所有平台上默认为
AddLine
- Shift+End:在所有平台上默认为
SelectLine
- Shift+Home:在所有平台上默认为
SelectBackwardsLine
增强的可访问性
外壳集成提供给 VS Code 的信息用于改善终端中的可访问性。一些增强功能的示例包括
- 在可访问缓冲区中导航已检测到的命令(⌥F2 (Windows Alt+F2, Linux Shift+Alt+F2))
- 命令失败时播放音频提示。
- 基础文本框同步,以便使用箭头和退格键的行为更正确。
IntelliSense(预览版)
终端中的 IntelliSense 使您能够接收文件、文件夹、命令、命令参数和选项的建议。此功能由外壳集成 terminal.integrated.shellIntegration.enable 提供支持,并且可以通过 terminal.integrated.suggest.enabled 启用。
VS Code 从 Fig 规范中获取命令,并根据 $PATH
验证每个外壳的内置函数(适用于 pwsh
、bash
、zsh
和 fish
),以确保它们存在。在 Windows 上,您可以使用 terminal.integrated.suggest.windowsExecutableExtensions 设置配置特定的可执行文件集。
键盘导航
默认情况下,Tab 键插入建议。一旦列表导航发生,Enter 键同样会插入建议。您可以使用 terminal.integrated.suggest.selectionMode 设置配置此行为。
要同时在接受时在终端中插入并运行完成,请配置 terminal.integrated.suggest.runOnEnter。
IntelliSense 可以通过 ⌃Space (Windows, Linux Ctrl+Space) 手动触发,或通过键入触发,这可以通过 terminal.integrated.suggest.quickSuggestions 禁用。当键入某些字符(例如 /
)时,IntelliSense 也可以触发,这可以通过 terminal.integrated.suggest.suggestOnTriggerCharacters
配置。
当外壳提供内联完成时,VS Code 会将其作为列表中的第一个完成项显示。您可以使用 terminal.integrated.suggest.inlineSuggestion 设置进一步配置此行为。
terminal.integrated.suggest.showStatusBar 设置控制列表底部是否显示状态栏。此状态栏提供“了解更多”(⇧⌘L (Windows, Linux Ctrl+Shift+L))、“插入”(Tab)和“配置”(⇧⌘, (Windows, Linux Ctrl+Shift+,))等操作。当您首次使用 IntelliSense 功能时,“了解更多”操作会突出显示,以便更容易发现。
建议控件可以显示有关建议的更多详细信息。您可以使用 ⌃Space (Windows, Linux Ctrl+Space) 切换这些详细信息的可见性。屏幕阅读器用户可以使用 ⌃⌥Space (Windows, Linux Ctrl+Alt+Space) 聚焦详细信息控件以听取其读出。
支持的转义序列
VS Code 支持多种自定义转义序列
VS Code 自定义序列“OSC 633 ; ... ST”
VS Code 有一套自定义转义序列,旨在在 VS Code 的终端中运行时启用外壳集成功能。这些序列由内置脚本使用,但也可以由任何能够向终端发送序列的应用程序使用,例如Julia 扩展使用它们来支持 Julia REPL 中的外壳集成。
其他终端应忽略这些序列,但除非其他终端更广泛地采用这些序列,否则建议在写入它们之前检查 $TERM_PROGRAM
是否为 vscode
。
-
OSC 633 ; A ST
:标记提示符开始。 -
OSC 633 ; B ST
:标记提示符结束。 -
OSC 633 ; C ST
:标记执行前。 -
OSC 633 ; D [; <exitcode>] ST
:标记执行完成,带有可选退出代码。 -
OSC 633 ; E ; <commandline> [; <nonce] ST
:明确设置命令行,带有可选的一次性值。E 序列允许终端可靠地获取外壳解释的确切命令行。如果未指定此序列,终端可能会退回到使用 A、B 和 C 序列来获取命令,或者如果不可靠则完全禁用检测。
可选的一次性值可用于验证序列是否来自外壳集成脚本,以防止命令欺骗。当一次性值成功验证后,使用命令前的一些保护措施将被移除,以改善用户体验。
命令行可以使用
\xAB
格式转义 ASCII 字符,其中 AB 是字符代码的十六进制表示(不区分大小写),并使用\\
转义\
字符。必须转义分号 (0x3b
) 和0x20
及以下的字符,这对于换行符和分号尤为重要。一些示例
"\" -> "\\" "\n" -> "\x0a" ";" -> "\x3b"
-
OSC 633 ; P ; <Property>=<Value> ST
:在终端上设置属性,只有已知属性将被处理。已知属性
Cwd
:向终端报告当前工作目录。IsWindows
:指示终端是否正在使用 winpty 或 conpty 等 Windows 后端。这可用于启用额外的启发式方法,因为外壳集成序列的位置不保证正确。有效值为True
和False
。HasRichCommandDetection
:指示终端是否具有丰富的命令检测功能。当外壳集成脚本理想地按照 VS Code 的预期工作时,此属性设置为True
,特别是序列应以A, B, E, C, D
的顺序出现在预期位置。
Final Term 外壳集成
VS Code 支持 Final Term 的外壳集成序列,这允许非 VS Code 外壳集成脚本在 VS Code 中工作。这会导致体验有所下降,因为它不支持像 OSC 633
那么多的功能。以下是支持的特定序列
OSC 133 ; A ST
:标记提示符开始。OSC 133 ; B ST
:标记提示符结束。OSC 133 ; C ST
:标记执行前。OSC 133 ; D [; <exitcode>] ST
:标记执行完成,带有可选退出代码。
iTerm2 外壳集成
iTerm2 首创的以下序列受到支持
-
OSC 1337 ; CurrentDir=<Cwd> S
:设置终端的当前工作目录,类似于OSC 633 ; P ; Cwd=<Cwd> ST
。 -
OSC 1337 ; SetMark ST
:在触发行的左侧添加标记,并在滚动条中添加注释这些标记与命令导航集成,使其可以通过 ⌘↑ (Windows, Linux Ctrl+Up) 和 ⌘↓ (Windows, Linux Ctrl+Down) 轻松导航。
常见问题
自动注入何时不起作用?
自动注入不起作用有几种情况,以下是一些常见情况
-
$PROMPT_COMMAND
处于不受支持的格式,将其更改为指向单个函数是解决此问题的简单方法。例如prompt() { printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}" } PROMPT_COMMAND=prompt
-
某些外壳插件在初始化时可能会通过取消设置
$VSCODE_SHELL_INTEGRATION
来明确禁用 VS Code 的外壳集成。
当功能禁用时,为什么命令装饰仍然显示?
可能的原因是您的系统安装了 VS Code 能够理解的另一个终端的外壳集成。如果您不想要任何装饰,可以使用以下设置将其隐藏
"terminal.integrated.shellIntegration.decorationsEnabled": never
或者,您可以从外壳 rc/启动脚本中删除外壳集成脚本,但您将失去对命令感知功能(如命令导航)的访问。
为什么命令装饰在 Windows 上会跳动?
Windows 使用一个名为 ConPTY 的模拟伪终端 (pty) 后端。它与常规 pty 的工作方式略有不同,因为它需要保持与 Windows 控制台 API 的兼容性。其中一个影响是 pty 以特殊方式处理渲染,导致识别终端缓冲区中命令的外壳集成序列可能错位。当命令跳动时,通常是在命令运行之后,并且 VS Code 的启发式算法已启动以改进命令装饰的位置。