终端 Shell 集成
Visual Studio Code 能够与常用 Shell 集成,使终端能够更深入地了解 Shell 内部的实际情况。这些额外的信息支持一些有用的功能,例如 工作目录检测和命令检测、装饰和导航。
支持的 Shell
- Linux/macOS: bash, fish, pwsh, zsh
- Windows: Git Bash, pwsh
安装
自动脚本注入
默认情况下,Shell 集成脚本应在从 VS Code 启动的受支持 Shell 上自动激活。这是通过在 Shell 会话启动时注入参数和/或环境变量来实现的。可以通过将 terminal.integrated.shellIntegration.enabled 设置为 false 来禁用此自动注入。
这种标准的、易于使用的方法不适用于某些高级用例,例如在子 Shell 中、通过常规 ssh 会话(当未使用 Remote - SSH 扩展时)或某些复杂的 Shell 设置。对于这些情况,建议的手动安装启用 Shell 集成的方法是手动安装。
注意:自动注入可能无法在旧版本的 Shell 上运行,例如,旧版本的 fish 不支持
$XDG_DATA_DIRS环境变量,这是注入的工作方式。您仍然可以通过手动安装来使其正常工作。
手动安装
要手动安装 Shell 集成,VS Code Shell 集成脚本需要在您的 Shell 初始化期间运行。具体位置和方法取决于您使用的 Shell 和操作系统。使用手动安装时,建议将 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)"
可移植性与性能
上述 Shell 集成安装是跨平台的,并且与任何安装类型兼容,只要 code 在 $PATH 中。但是,这种推荐的方法会启动 Node.js 来获取脚本路径,这会导致 Shell 启动略有延迟。为了缓解此延迟,可以通过提前解析路径并将其直接添加到初始化脚本中来内联上述脚本。
# 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"
Shell 集成质量
使用 Shell 集成时,它会关联一个 "质量",该质量声明了它的功能。这些质量取决于 Shell 集成脚本的行为方式。
- 无:未激活 Shell 集成。
- 丰富:Shell 集成已激活,命令检测以理想方式工作。
- 基本:Shell 集成已激活,但命令检测可能不支持所有功能。例如,检测到命令的运行位置,但未检测到其退出状态。
要查看 Shell 集成质量,请将鼠标悬停在终端选项卡上。或者,在悬停时选择显示详细信息以查看更详细的信息。
IntelliSense
终端中的 IntelliSense 使您能够获得文件、文件夹、命令、命令参数和选项的建议。此功能可以通过 terminal.integrated.suggest.enabled 设置启用或禁用。

当您输入时,将出现建议列表。要手动触发建议,请使用 键盘快捷方式。
默认情况下,Tab 键会插入建议。在导航列表后,Enter 键会插入建议。您可以使用 terminal.integrated.suggest.selectionMode 设置配置此行为。
有各种设置可以配置终端 IntelliSense 的行为方式。
- terminal.integrated.suggest.quickSuggestions:根据命令行内容自动显示,而不是通过 Ctrl+Space 手动触发。
- terminal.integrated.suggest.suggestOnTriggerCharacters:“触发字符”(如
-或/)后自动显示。 - terminal.integrated.suggest.runOnEnter:当使用 Enter(而不是 Tab)时,可选地运行命令。
- terminal.integrated.suggest.windowsExecutableExtensions:被视为 Windows 上可执行文件的扩展名列表。
- terminal.integrated.suggest.providers:提供禁用特定提供程序的能力,例如扩展可能会贡献您不想要的补全。
- terminal.integrated.suggest.showStatusBar:在 IntelliSense 弹出窗口底部显示状态栏。
- terminal.integrated.suggest.cdPath:启用
$CDPATH集成。 - terminal.integrated.suggest.inlineSuggestion:与 Shell 的“幽灵文本”集成以及如何显示它。
- terminal.integrated.suggest.upArrowNavigatesHistory:将向上箭头发送到 Shell 而不是浏览补全,这在 zsh 中特别有用,您可以在其中过滤然后按向上箭头来使用该前缀进行历史搜索。
- terminal.integrated.suggest.selectionMode:Intellisense 弹出窗口的焦点如何确定 Enter 和 Tab 的作用。
- terminal.integrated.suggest.insertTrailingSpace:接受后插入尾随空格并重新触发补全。
全局补全缓存
为了提高性能,VS Code 会为特定 Shell 积极缓存全局内容。当您更改 Shell 启动逻辑并添加命令时,如果它们没有自动拾取,请使用终端:清除建议缓存的全局项命令(terminal.integrated.suggest.clearCachedGlobals)手动刷新缓存。
命令装饰和概览标尺
Shell 集成实现的功能之一是能够获取终端中运行的命令的退出代码。利用此信息,会在行左侧添加装饰,以指示命令是成功还是失败。这些装饰也会显示在滚动条中相对较新的概览标尺上,就像在编辑器中一样。

装饰可以进行交互,提供一些上下文操作,例如重新运行命令。

命令和概览标尺装饰可以通过 terminal.integrated.shellIntegration.decorationsEnabled 设置进行配置。
命令导航
Shell 集成检测到的命令会馈送到命令导航功能(Ctrl/Cmd+Up,Ctrl/Cmd+Down),使其具有更可靠的命令位置。此功能允许在命令之间进行快速导航并选择它们的输出。要从当前位置选择到命令,您还可以按住 Shift 键,然后按 Shift+Ctrl/Cmd+Up 和 Shift+Ctrl/Cmd+Down。
命令指南
命令指南是悬停在命令及其输出旁边显示的条形。这有助于更快地识别命令,也是验证 Shell 集成是否正常工作的一种方式。

您可以使用颜色主题自定义命令指南的颜色。要切换命令指南,请配置 terminal.integrated.shellIntegration.showCommandGuide 设置。
粘性滚动
粘性滚动功能会将部分显示的命令“粘住”在终端顶部,从而更容易看到输出属于哪个命令。单击粘性滚动组件将滚动到终端缓冲区中命令的位置。

可以通过 terminal.integrated.stickyScroll.enabled 设置启用此功能。
快速修复
VS Code 会扫描命令的输出,并显示一个快速修复,其中包含用户接下来最有可能想执行的操作。

以下是一些内置的快速修复:
- 当检测到端口已被占用时,建议终止进程并重新运行上一个命令。
- 当
git push因未设置上游而失败时,建议设置上游进行推送。 - 当
git子命令因相似命令错误而失败时,建议使用相似的命令。 - 当
git push导致建议创建 GitHub PR 时,建议打开链接。 - 当触发
General或cmd-not-foundPowerShell 反馈提供程序时,建议每个建议。
快速修复功能还支持 辅助功能信号,以便在快速修复可用时提供额外的反馈。
运行最近执行的命令
终端:运行最近执行的命令命令会在快速选取器中显示来自各种来源的历史记录,提供与 Shell 的反向搜索(Ctrl+R)类似的功能。来源包括当前会话的历史记录、此 Shell 类型的先前会话历史记录以及通用的 Shell 历史文件。

该命令的其他一些功能:
- 默认搜索模式为“连续搜索”,意味着搜索词必须完全匹配。搜索输入框右侧的按钮允许切换到模糊搜索。
- 在当前会话部分,快速选取器右侧有一个剪贴板图标,单击该图标将在编辑器中打开命令输出。
- 快速选取器右侧的固定操作可以将命令固定到列表顶部。
- Alt 键可以用于将文本写入终端而不执行它。
- 在先前会话部分存储的历史记录量由 terminal.integrated.shellIntegration.history 设置决定。
此命令的默认键盘快捷键是 Ctrl+Alt+R。但是,当辅助功能模式开启时,这些键会反转;Ctrl+R 运行最近执行的命令,而 Ctrl+Alt+R 将 Ctrl+R 发送到 Shell。
在辅助功能模式关闭时,可以使用以下键盘快捷方式来切换键盘快捷方式。
{
"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+Alt+G 将 Ctrl+G 发送到 Shell。
当前工作目录检测
Shell 集成会将当前 Shell 的工作目录告知 VS Code。在 Windows 上,如果不尝试通过正则表达式检测提示符,则无法获取此信息,并且在 macOS 和 Linux 上需要轮询,这不利于性能。
这带来的最大功能之一是增强终端链接的解析能力。以链接 package.json 为例,当 Shell 集成禁用时激活该链接,它将打开一个搜索快速选取器,并以 package.json 作为筛选条件(如果工作区中有多个 package.json 文件)。然而,当启用 Shell 集成时,由于已知当前位置,它将直接打开当前文件夹中的 package.json 文件。这使得 ls 的输出等能够可靠地打开正确的文件。
当前工作目录也用于在终端选项卡、运行最近执行的命令快速选取器中显示目录,以及用于 "terminal.integrated.splitCwd": "inherited" 功能。
增强的 PowerShell 键盘快捷方式
Windows 的控制台 API 允许比 Linux/macOS 终端更多的键盘快捷方式。由于 VS Code 的终端在 Windows 上也会模拟后者,因此由于缺乏 VT 编码,某些 PowerShell 键盘快捷方式(例如 Ctrl+Space)无法通过标准方式实现。Shell 集成允许 VS Code 附加自定义键盘快捷方式,以发送特殊的序列到 PowerShell,然后由 Shell 集成脚本处理并转发到正确的键处理程序。
启用 Shell 集成后,在 PowerShell 中应能使用以下键盘快捷方式:
- Ctrl+Space:在 Windows 上默认为
MenuComplete。 - Alt+Space:在所有平台上默认为
SetMark。 - Shift+Enter:在所有平台上默认为
AddLine。 - Shift+End:在所有平台上默认为
SelectLine。 - Shift+Home:在所有平台上默认为
SelectBackwardsLine。
增强的辅助功能
Shell 集成提供给 VS Code 的信息用于改进终端中的辅助功能。一些增强功能的示例包括:
- 通过可访问缓冲区中的检测到的命令进行导航(⌥F2 (Windows Alt+F2, Linux Shift+Alt+F2))。
- 当命令失败时,会播放音频提示。
- 底层文本框同步,使得使用箭头键和退格键的行为更加正确。
支持的转义序列
VS Code 支持几种自定义转义序列。
VS Code 自定义序列 'OSC 633 ; ... ST'
VS Code 包含一组自定义转义序列,用于在 VS Code 的终端中启用 Shell 集成功能。这些序列由内置脚本使用,但也可以由任何能够向终端发送序列的应用程序使用,例如 Julia 扩展使用它们来支持 Julia REPL 中的 Shell 集成。
这些序列应被其他终端忽略,但除非其他终端最终更广泛地采用这些序列,否则建议在编写它们之前检查 $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 序列允许终端可靠地获取 Shell 解释的准确命令行。当未指定此序列时,终端可能会回退到使用 A、B 和 C 序列来获取命令,或者如果不可靠则完全禁用检测。
可选的随机数可用于验证序列是否来自 Shell 集成脚本,以防止命令欺骗。当随机数成功验证后,在某些命令使用之前会移除一些保护措施,以改善用户体验。
命令行可以使用
\xAB格式来转义 ASCII 字符,其中 AB 是字符代码的十六进制表示(不区分大小写),并使用\\转义\字符。必须转义分号(0x3b)以及字符 0x20 及以下字符,这对于换行符和分号尤其重要。一些示例
"\" -> "\\" "\n" -> "\x0a" ";" -> "\x3b" -
OSC 633 ; P ; <Property>=<Value> ST:设置终端的属性,只有已知的属性会被处理。已知属性
Cwd:向终端报告当前工作目录。IsWindows:指示终端是否使用 Windows 后端,如 winpty 或 conpty。这可能用于启用额外的启发式方法,因为 Shell 集成序列的位置不保证正确。有效值为True和False。HasRichCommandDetection:指示终端是否具有丰富的命令检测功能。当 Shell 集成脚本按 VS Code 期望的方式理想地运行时,此属性设置为True,特别是序列应以A, B, E, C, D的顺序出现在预期位置。
Final Term Shell 集成
VS Code 支持 Final Term 的 Shell 集成序列,这些序列允许非 VS Code 的 Shell 集成脚本在 VS Code 中工作。这会导致体验有所降级,因为它不像 OSC 633 那样支持许多功能。以下是支持的特定序列:
OSC 133 ; A ST:标记提示符开始。OSC 133 ; B ST:标记提示符结束。OSC 133 ; C ST:标记执行前。OSC 133 ; D [; <exitcode>] ST:标记执行完成,带有可选的退出代码。
iTerm2 Shell 集成
支持 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 -
某些 Shell 插件可能会通过在初始化时取消设置
$VSCODE_SHELL_INTEGRATION来显式禁用 VS Code 的 Shell 集成。
为什么在功能禁用时仍显示命令装饰?
这可能的原因是您的系统为另一个终端安装了 Shell 集成,而 VS Code 可以理解。如果您不希望有任何装饰,可以使用以下设置隐藏它们:
"terminal.integrated.shellIntegration.decorationsEnabled": never
或者,您可以从 Shell rc/startup 脚本中删除 Shell 集成脚本,但您将失去对诸如 命令导航之类的命令感知功能的使用。
为什么命令装饰在 Windows 上会跳动?
Windows 使用一个名为 ConPTY 的模拟伪终端 (pty) 后端。它的工作方式与常规 pty 略有不同,因为它需要与 Windows Console API 保持兼容性。其中一个影响是 pty 专门处理渲染,因此用于在终端缓冲区中识别命令的 Shell 集成序列可能会错位。当命令跳动时,通常是在命令运行后,VS Code 的启发式算法会启动以改进命令装饰的位置。