终端高级
Visual Studio Code 的集成终端具有许多高级功能和设置,例如 Unicode 和表情符号支持、自定义键绑定和自动回复。本主题详细介绍了这些高级功能。如果您不熟悉 VS Code 或集成终端,您可能需要首先查看终端基础知识主题。
持续会话
终端支持两种不同类型的持久会话:
- 进程重新连接:重新加载窗口时(例如,安装扩展后),重新连接到先前的进程并恢复其内容。
- 进程恢复:重新启动 VS Code 时,终端的内容将恢复,进程将使用其原始环境重新启动。
terminal.integrated.enablePersistentSessions
这两个持久会话都可以通过设置为 来禁用false
,并且恢复的回滚量由该设置控制terminal.integrated.persistentSessionScrollback
。进程 revive 可以独立配置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 输入应该是用户的显式操作或配置。
更改制表位宽度
该terminal.integrated.tabStopWidth
设置允许在终端输出中运行的程序时配置制表位宽度\t
。通常不需要这样做,因为程序通常会移动光标而不是使用制表符,但在某些情况下可能很有用。
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 环境。这样做是因为开发人员工具通常添加到$PATH
shell 启动脚本中,例如~/.bash_profile
. 默认情况下,终端继承此环境,具体取决于您的配置文件 shell 参数,这意味着可能运行了多个配置文件脚本,这可能会导致意外行为。
可以通过设置在 macOS 和 Linux 上禁用此环境继承terminal.integrated.inheritEnv
。
互动$LANG
与环境变量有一些特殊的交互$LANG
,它决定了字符在终端中的呈现方式。此功能通过以下设置进行配置terminal.integrated.detectLocale
:
价值 | 行为 |
---|---|
on |
始终设置$LANG 为最常用的值。所选值基于采用 UTF-8 编码的操作系统区域设置(回退到en-US )。 |
auto (default) |
设置与未正确配置(未设置为 UTF 或 EUC 编码)时的行为$LANG 类似。on $LANG |
off |
不要修改$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,它采用了 winpty 开创的想法并将其融入到 Windows 中,提供了一个更可靠和受支持的系统,以在 Windows 上利用 Unix 风格的终端和应用程序。
VS Code 在 Windows 10+(从内部版本号 18309 开始)上默认使用 ConPTY,并回退到 winpty 作为旧版本 Windows 的旧选项。ConPTY 可以通过terminal.integrated.windowsEnableConpty
设置显式禁用,但这通常应该避免。
由于 ConPTY 是一个模拟层,因此它确实有一些怪癖。最常见的是 ConPTY 将自己视为视口的所有者,因此有时会重新打印屏幕。此重新打印可能会导致意外行为,例如运行“终端:清除”命令后显示旧内容。
远程开发
本节概述了使用 VS Code远程开发扩展将 VS Code 连接到远程计算机时特定的主题。
减少远程输入延迟
本地回显是一项有助于减轻输入延迟对远程窗口的影响的功能。在遥控器确认结果之前,它会以暗色将击键写入终端。默认情况下,当检测到延迟超过 30 ms 时,该功能开始运行,并且可以使用 来配置时间terminal.integrated.localEchoLatencyThreshold
。未确认字符的颜色由 定义terminal.integrated.localEchoStyle
。
本地回显会根据终端中的活动程序动态禁用自身。这是由 控制的terminal.integrated.localEchoExcludePrograms
,默认为['vim', 'vi', 'nano', 'tmux']
。建议您对任何高度动态和/或在键入时大量重新打印屏幕的应用程序或 shell 禁用该功能。
要完全禁用该功能,请使用:
{
"terminal.integrated.localEchoEnabled": false
}
远程窗口中的本地终端
可以使用“终端:通过命令面板创建新的集成终端(本地)”命令在远程窗口中启动默认的本地终端配置文件。当前无法从远程窗口启动非默认配置文件。