终端高级
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 设置启用。
当前限制
- 序列化不起作用,因此重新加载终端将不会保留任何图像 (jerch/xterm-addon-image#47)。
- 将选择内容复制为 HTML 不包括所选图像 (jerch/xterm-addon-image#50)。
- 动画 gif 不起作用 (jerch/xterm-addon-image#51)。
- 短于一个单元格的图像将无法正常工作,这是一个 序列设计缺陷,也会在 XTerm 中发生。
进程环境
在终端中运行的应用程序的进程环境受各种设置和扩展的影响,这会导致 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 远程的验证。
如果扩展程序更改了终端环境,如果安全,任何现有的终端都将重新启动,否则终端状态将显示警告。 有关更改的更多信息可以在悬停中查看,其中还包括一个重新启动按钮。
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
}
远程窗口中的本地终端
默认的 **本地** 终端配置文件可以通过 **终端:创建新的集成终端(本地)** 命令(通过命令面板)在远程窗口中启动。 目前,非默认配置文件无法从远程窗口启动。