参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

终端高级功能

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 命令仅支持使用其字符代码(而不是 \x00)的 \u0000 格式。在以下资源中阅读有关这些十六进制代码和终端序列的更多信息:

发送自定义信号

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 环境。这样做是因为开发人员工具通常会添加到诸如 ~/.bash_profile 等 shell 启动脚本中的 $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 上的终端并非如此工作,它使用 控制台 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
}
© . This site is unofficial and not affiliated with Microsoft.