终端高级
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+左箭头),然后按下退格键:
{
"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
字符表示回车,与自定义序列键绑定类似,此功能支持向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设置启用。
当前限制:
- 序列化不起作用,因此重新加载终端将不会保留任何图像 (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参数,这意味着多个配置文件脚本可能已经运行,这可能会导致意外的行为。
在macOS和Linux上,可以通过terminal.integrated.inheritEnv设置来禁用此环境继承。
与 $LANG
的交互
与$LANG
环境变量有一些特殊的交互,它决定了字符在终端中的显示方式。此功能通过terminal.integrated.detectLocale设置进行配置:
Value | Behavior |
---|---|
on |
Always set $LANG to the most commonly desired value. The chosen value is based on the operating system locale (falling back to en-US ) with UTF-8 encoding. |
auto (default) |
Set $LANG similar to the on behavior if $LANG is not properly configured (is not set to a UTF or EUC encoding). |
off |
Do not modify $LANG . |
扩展环境贡献
扩展能够贡献给终端环境,使它们能够提供与终端的某些集成。例如,内置的Git扩展注入了GIT_ASKPASS
环境变量,以允许VS Code处理Git远程的身份验证。
如果扩展更改了终端环境,任何现有的终端将在安全的情况下重新启动,否则终端状态中将显示警告。有关更改的更多信息可以在悬停中查看,其中还包括一个重新启动按钮。
Windows 和 ConPTY
VS Code 的终端是基于 xterm.js 项目构建的,用于实现一个 Unix 风格的终端,该终端将所有数据序列化为字符串并通过“伪终端”进行传输。历史上,这并不是 Windows 上终端的工作方式,Windows 使用 Console 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认为自己是视口的所有者,因此有时会重新打印屏幕。这种重新打印可能会导致意外行为,例如在运行Terminal: Clear命令后显示旧内容。
远程开发
本节概述了当 VS Code 使用 Remote Development 扩展连接到远程机器时的特定主题。
减少远程输入延迟
本地回显是一项功能,有助于减轻输入延迟对远程窗口的影响。它会在远程确认结果之前,以暗淡的颜色在终端中写入按键。默认情况下,当检测到延迟超过30毫秒时,该功能开始运行,并且可以通过terminal.integrated.localEchoLatencyThreshold配置时间。未确认字符的颜色由terminal.integrated.localEchoStyle定义。
本地回显功能会根据终端中活动的程序动态禁用自身。这是由terminal.integrated.localEchoExcludePrograms控制的,默认值为['vim', 'vi', 'nano', 'tmux']
。建议您为任何高度动态和/或在键入时进行大量屏幕重绘的应用程序或shell禁用此功能。
要完全禁用该功能,请使用:
{
"terminal.integrated.localEchoEnabled": false
}
远程窗口中的本地终端
默认的本地终端配置文件可以通过命令面板中的终端:创建新的集成终端(本地)命令在远程窗口中启动。目前,非默认配置文件无法从远程窗口启动。