终端 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 上无法工作。例如,较旧版本的 fish 不支持
$XDG_DATA_DIRS环境变量,而该变量正是注入机制的工作原理。你仍可尝试通过手动安装来启用它。
手动安装
要手动安装 Shell 集成,需要在 Shell 初始化过程中运行 VS Code 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)"
可移植性与性能
如果 code 在 $PATH 中,上述 Shell 集成安装方式是跨平台的,且兼容任何安装类型。但是,这种推荐方法会启动 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 集成脚本的行为决定。
- 无 (None):未启用 Shell 集成。
- 丰富 (Rich):Shell 集成已激活,命令检测以理想方式工作。
- 基本 (Basic):Shell 集成已激活,但命令检测可能不支持所有功能。例如,可以检测到命令运行位置,但无法检测其退出状态。
要查看 Shell 集成质量,请将鼠标悬停在终端选项卡上。你可以选择悬停提示中的显示详情以查看更详细的信息。
IntelliSense
终端中的 IntelliSense 使你能够获得文件、文件夹、命令、命令参数和选项的建议。此功能可以通过 terminal.integrated.suggest.enabled 设置进行启用或禁用。

当你输入时,会出现建议列表。要手动触发建议,请使用键盘快捷键 ⌃Space(Windows、Linux 为 Ctrl+Space)。
Ctrl+Space 可能是操作系统层面的输入法编辑器 (IME) 触发快捷键。如果是这样,你可以重新绑定 workbench.action.terminal.triggerSuggest 命令,使用自定义键绑定,或者更改系统级的快捷键。
默认情况下,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: Clear Suggest Cached Globals 命令 (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 反馈提供程序触发时,建议显示每个建议。
快速修复功能还支持辅助功能信号,以便在有快速修复可用时提供额外的反馈。
运行最近的命令
Terminal: Run Recent Command 命令会在快速选择框中呈现来自各种来源的历史记录,提供类似于 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"
}
跳转至最近的目录
与运行最近命令功能类似,Terminal: Go to Recent Directory 命令会跟踪访问过的目录,并允许快速过滤和导航(cd)到它们。可以按住 Alt 键将路径写入终端而不运行它。
此命令的默认快捷键是 ⌘G(Windows、Linux 为 Ctrl+G),因为它类似于编辑器中的 Go to Line/Column 命令。Ctrl+G 可以通过 Ctrl+Alt+G 发送到 Shell。
当前工作目录检测
Shell 集成告诉 VS Code 当前 Shell 的工作目录是什么。在 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 编码(如 Ctrl+Space),某些 PowerShell 键盘快捷键无法通过标准方式实现。Shell 集成允许 VS Code 附加自定义键盘快捷键,以向 PowerShell 发送特殊序列,该序列随后在 Shell 集成脚本中处理并转发给适当的键处理程序。
当启用 Shell 集成时,以下键盘快捷键应可在 PowerShell 中工作:
- Ctrl+Space:默认为
MenuComplete(仅限 Windows) - 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 所期望的那样理想时(即序列应按预期位置以A, B, E, C, D的顺序出现),此属性设置为True。
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> ST:设置终端的当前工作目录,类似于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/启动脚本中删除 Shell 集成脚本,但你将失去对命令感知功能(如 命令导航)的访问权限。
为什么命令装饰在 Windows 上会跳动?
Windows 使用一种称为 ConPTY 的模拟伪终端 (pty) 后端。它的工作方式与常规 pty 略有不同,因为它需要保持与 Windows 控制台 API 的兼容性。产生的影响之一是 pty 处理渲染的方式比较特殊,可能导致在终端缓冲区中识别命令的 Shell 集成序列位置偏移。当命令跳动时,通常发生在命令运行之后,VS Code 的启发式算法开始介入以优化命令装饰的位置。