尝试以扩展 VS Code 中的代理模式!

终端高级

Visual Studio Code 的集成终端有许多高级功能和设置,例如 Unicode 和表情符号支持、自定义键盘快捷方式和自动回复。本主题详细解释了这些高级功能。如果您是 VS Code 或集成终端的新用户,您可能需要先阅读终端基础主题。

持久会话

终端支持两种不同类型的持久会话

  • 进程重新连接:当重新加载窗口(例如,安装扩展后)时,重新连接到之前的进程并恢复其内容。
  • 进程恢复:当重新启动 VS Code 时,终端的内容会恢复,并且进程会使用其原始环境重新启动

这两种持久会话都可以通过将 terminal.integrated.enablePersistentSessions 设置为 false 来禁用,并且恢复的回滚量由 terminal.integrated.persistentSessionScrollback 设置控制。进程恢复可以通过 terminal.integrated.persistentSessionReviveProcess 独立配置。

在窗口之间移动终端

终端标签页可以在 VS Code 窗口之间拖放。这也可以通过命令面板以及终端:分离会话终端:附加到会话命令手动完成。

配置终端可见性

打开窗口时,如果终端视图可见,它将使用持久会话重新连接到终端,或者创建一个新的 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"
  }
}

确认对话框

为了避免不必要的输出和用户提示,当进程退出时,终端不会显示警告对话框。如果需要警告,可以通过以下设置进行配置:

自动回复

如果收到精确的输出序列,终端可以自动向 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 设置启用。

当前限制

进程环境

终端中运行的应用程序的进程环境受到各种设置和扩展的影响,可能导致 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 远程的身份验证。

如果扩展更改了终端环境,则任何现有终端如果安全,将重新启动,否则终端状态中会显示警告。有关更改的更多信息可以在悬停提示中查看,其中还包括一个重新启动按钮。

A warning icon appears next to the terminal tab when a relaunch is required, information on the changes can be viewed by hovering it

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,并回退到 winpty 作为旧版 Windows 的传统选项。ConPTY 可以通过 terminal.integrated.windowsEnableConpty 设置显式禁用,但通常应避免这样做。

由于 ConPTY 是一个仿真层,它确实有一些怪癖。最常见的是 ConPTY 认为自己是视口的所有者,因此有时会重新打印屏幕。这种重新打印可能导致意外行为,例如在运行终端:清除命令后显示旧内容。

远程开发

本节概述了当 VS Code 使用 VS Code 远程开发扩展连接到远程机器时特有的主题。

远程窗口中的本地终端

默认的本地终端配置文件可以通过命令面板中的终端:创建新的集成终端(本地)命令在远程窗口中启动。目前,非默认配置文件无法从远程窗口启动。

减少远程输入延迟(预览)

本地回显是一种有助于减轻远程窗口输入延迟的功能。它在终端中以暗淡的颜色写入击键,然后结果由远程确认。默认情况下,当检测到延迟超过 30 毫秒时,此功能开始运行,其计时可通过 terminal.integrated.localEchoLatencyThreshold 进行配置。未确认字符的颜色由 terminal.integrated.localEchoStyle 定义。

本地回显会根据终端中活动的程序动态禁用自身。这由 terminal.integrated.localEchoExcludePrograms 控制,默认值为 ['vim', 'vi', 'nano', 'tmux']。建议您对任何高度动态和/或在输入时大量重绘屏幕的应用程序或 Shell 禁用此功能。

要完全禁用此功能,请使用

{
  "terminal.integrated.localEchoEnabled": false
}