现已发布!阅读 10 月份的新功能和修复。

终端高级

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:始终隐藏终端,即使恢复了持久会话也是如此。

键绑定和 Shell

作为嵌入式应用程序,集成终端应拦截某些(但并非全部)在 VS Code 中分发的键绑定。

可配置的 terminal.integrated.commandsToSkipShell 设置决定哪些命令的键绑定应始终“跳过 Shell”,而应由 VS Code 的键绑定系统处理。默认情况下,它包含一个硬编码的命令列表,这些命令对于 VS Code 体验至关重要,但您可以添加或删除特定命令。

{
  "terminal.integrated.commandsToSkipShell": [
    // Ensure the toggle sidebar visibility keybinding skips the shell
    "workbench.action.toggleSidebarVisibility",
    // Send quick open's keybinding 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)。在以下资源中阅读有关这些十六进制代码和终端序列的更多信息

确认对话框

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

  • 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 输入应该是用户的显式操作或配置。

更改制表符宽度

当在终端中运行的程序输出 \t 时,terminal.integrated.tabStopWidth 设置允许配置制表符宽度。 这通常不需要,因为程序通常会移动光标而不是使用 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 参数,这意味着可能已运行多个配置文件脚本,这可能会导致意外行为。

可以通过 terminal.integrated.inheritEnv 设置在 macOS 和 Linux 上禁用此环境继承。

$LANG 的交互

$LANG 环境变量之间存在一些特殊的交互作用,该变量决定了如何在终端中呈现字符。 此功能使用 terminal.integrated.detectLocale 设置进行配置

行为
开启 始终将 $LANG 设置为最常用的值。 选择的值基于操作系统的区域设置(回退到 en-US),并使用 UTF-8 编码。
auto(默认) 如果 $LANG 配置不正确(未设置为 UTF 或 EUC 编码),则将 $LANG 设置为类似于 on 行为的值。
关闭 不要修改 $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 上的工作方式,Windows 使用 控制台 API 来实现其名为“conhost”的控制台。

一个名为 winpty 的开源项目是为了解决这个问题而创建的,它在 Unix 风格的终端和 Windows 控制台之间提供了一个模拟/翻译层。 VS Code 的终端最初是使用 winpty 实现的。 这在当时很棒,但在 2018 年,Windows 10 收到了 ConPTY API,该 API 借鉴了 winpty 的理念,并将其整合到 Windows 中,提供了一个更可靠且受支持的系统,用于在 Windows 上利用 Unix 风格的终端和应用程序。

VS Code 在 Windows 10+(从内部版本号 18309 开始)默认使用 ConPTY,并在较旧版本的 Windows 上将 winpty 作为遗留选项。 可以通过 terminal.integrated.windowsEnableConpty 设置显式禁用 ConPTY,但这通常应避免。

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

远程开发

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

减少远程输入延迟

本地回显是一个功能,有助于减轻远程窗口上输入延迟的影响。 它以淡化颜色在终端中写入按键,直到远程确认结果。 默认情况下,当检测到延迟超过 30 毫秒时,该功能将开始运行,并且可以使用 terminal.integrated.localEchoLatencyThreshold 配置计时。 未确认字符的颜色由 terminal.integrated.localEchoStyle 定义。

本地回显会根据终端中的活动程序动态禁用自身。 这是由 terminal.integrated.localEchoExcludePrograms 控制的,它默认设置为 ['vim', 'vi', 'nano', 'tmux']。 建议您为任何高度动态的应用程序或 shell 禁用此功能,或者在键入时进行大量屏幕重新打印的应用程序或 shell 禁用此功能。

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

{
  "terminal.integrated.localEchoEnabled": false
}

远程窗口中的本地终端

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