终端高级
Visual Studio Code 的集成终端具有许多高级功能和设置,例如支持 Unicode 和表情符号、自定义键盘快捷键和自动回复。本主题详细解释了这些高级功能。如果您是 VS Code 或集成终端的新手,您可能需要先查看 终端基础知识 主题。
持久会话
终端支持两种不同类型的持久会话:
- 进程重新连接:当重新加载一个Windows(例如,安装扩展后),重新连接到之前的进程并恢复其内容。
- 进程重启:当重新启动 VS Code 时,终端的内容会恢复,并且进程会重新启动,使用其原始环境。
这两个持久会话可以通过设置禁用
假,并且恢复的滚动量由控制在Windows之间移动终端
终端标签可以在 VS Code Windows之间拖动和放下。这也可以通过命令面板和命令 终端:分离会话 和 终端:附加到会话 来手动完成。
配置终端可见性
打开Windows时,如果终端视图可见,它将使用持久会话重新连接到终端,或者创建一个新的 shell。此行为可以通过以下方式进行微调
从不(默认):启动时从不隐藏终端视图。当为空时仅在没有恢复的持久会话时隐藏终端。总是: 始终隐藏终端,即使在恢复持久会话时也是如此。
该
键盘快捷键和外壳
作为一个嵌入式应用程序,集成终端应该拦截一些,但不是全部,在 VS Code 内部分发的键盘快捷键。
可配置的
{
"terminal.integrated.commandsToSkipShell": [
// 确保切换侧边栏可见性的键盘快捷键跳过 shell
"workbench.action.toggleSidebarVisibility",
// 将快速打开的键盘快捷键发送到 shell
"-workbench.action.quickOpen",
]
}
看这个
提示:
终端.集成.将按键绑定发送到 shell可以配置以覆盖终端.集成.跳过外壳的命令并将大多数键盘快捷键发送到外壳。请注意,这将禁用诸如Ctrl+F 之类的键盘快捷键以打开查找
和弦
Chord 键盘快捷键由两个键盘快捷键组成,例如 Ctrl+K 跟随 Ctrl+C 以将行更改为注释。Chords 默认情况下总是跳过 shell,但可以通过
macOS 清屏
在 macOS 上,Cmd+K 是终端中清除屏幕的常见键盘快捷键,因此 VS Code 也遵守这一点,这意味着Cmd+K 按键组合将无法使用。Cmd+K 按键组合可以通过移除清除键盘快捷键 来启用:
{
"键": "cmd+k",
"命令": "-workbench.action.terminal.clear"
}
此外,如果任何扩展提供Cmd+K键盘快捷键,这个键盘快捷键将被自动覆盖,因为键盘快捷键的优先级工作方式所致。在这种情况下,要重新启用Cmd+K清除键盘快捷键,您可以在用户键盘快捷键中重新定义它,其优先级高于扩展键盘快捷键:
{
"键": "cmd+k",
"命令": "workbench.action.terminal.clear",
"条件": "终端聚焦 && 终端已创建 || 终端聚焦 && 支持终端进程"
}
助记法
使用助记符来访问 VS Code 的菜单(例如,Alt+F 用于文件菜单)在终端中默认是禁用的,因为这些按键事件在 shell 中通常是非常重要的热键。设置
自定义序列键盘快捷键
该工作台.操作.终端.发送序列 命令可以将特定的文本序列发送到终端,包括由 shell 特别解释的转义序列。该命令使您能够发送箭头键、回车、光标移动等。通过命令面板运行此命令,允许手动输入,但最常用的是当您分配带有参数的自定义键盘快捷键时。
例如,下面的序列跳过光标左侧的单词(Ctrl+左),然后按退格键:
{
"键": "ctrl+u",
"命令": "workbench.action.terminal.sendSequence",
"参数": {
"文本": "\u001b[1;5D\u007f"
}
}
此功能支持变量替换。
该发送序列命令仅适用于输入:使用字符的字符代码格式(不是输入:\x00). 在以下资源中了解更多关于这些十六进制代码和终端序列的信息:
发送自定义信号
该工作台.操作.终端发送信号命令可以向活动终端的前台进程发送任意信号。
例如,下面的键绑定将发送信号终止, 使其优雅地终止。
{
"键": "ctrl+shift+/",
"命令": "workbench.action.terminal.sendSignal",
"参数": {
"信号": "SIGTERM"
}
}
确认对话框
为了避免不必要的输出和用户提示,终端在进程退出时不会显示警告对话框。如果需要显示警告,可以使用以下设置进行配置:
- 终端.集成.退出时确认- 控制是否在Windows关闭时确认如果有活动的调试会话。
- 终端.集成.确认终止- 控制是否在终端有子进程时确认杀死终端。
- 终端.集成.显示退出警报- 控制是否在退出代码非零时显示警报“终端进程以退出代码终止”。
自动回复
如果接收到确切的输出序列,终端可以自动对 shell 提供可配置的输入响应。最常见的用例是在批处理脚本中按 时自动回复提示,询问用户是否终止批处理作业。要自动忽略此消息,请添加此设置:Ctrl+C
{
"terminal.integrated.autoReplies": {
"终止批处理作业 (Y/N)": "Y\r"
}
}
请注意输入: 这里使用的字符表示 回车,类似于 自定义序列键盘快捷键,此功能支持向外壳发送逃逸序列。
默认情况下没有配置自动回复,因为提供 shell 输入应是用户的明确操作或配置。
更改制表位宽度
该
输入:通常情况下不需要这样做,因为程序通常会移动光标而不是使用Tab字符,但在某些情况下可能会有用。
支持Unicode和表情符号
终端既支持Unicode也支持表情符号。当在终端中使用这些字符时,对此支持有一些限制:
- 一些 Unicode 符号的宽度存在歧义,可能会在不同版本的 Unicode 中发生变化。目前我们支持 Unicode 版本 6 和 11 的宽度,这可以通过配置终端.集成.unicode版本设置。指定的版本应与 shell/操作系统使用的 Unicode 版本匹配,否则可能会出现渲染问题。请注意,shell/OS 的 Unicode 版本可能与字体的实际宽度不匹配。
- 一些由多个字符组成的表情符号可能无法正确显示,例如,肤色调节符号。
- Windows 对表情符号的支持有限。
图像支持
终端工作中的图像,只要使用Sixel或iTerm内联图像协议即可。此功能默认禁用,可以通过设置启用。
当前限制:
- 序列化不起作用,因此重新加载终端将不会保留任何图像 (jerch/xterm-addon-image#47).
- 将选择的内容复制为HTML不包括所选的图像(jerch/xterm-addon-image#50)。
- 动画GIF不工作 (jerch/xterm-addon-image#51).
- 图像如果比一个单元格短,则无法正常工作,这是序列设计的缺陷,并且在XTerm中也会发生。
工艺环境
终端内运行的应用程序的环境受到各种设置和扩展的影响,可能导致 VS Code 终端中的输出与其他终端不同。
环境继承
当 VS Code 打开时,它会启动一个登录 shell 环境,以 sourcing 一个 shell 环境。这是因为在开发过程中,常常需要添加开发工具。$PATH在一个 shell 启动脚本中,像~/.bash_profile默认情况下,终端继承此环境,取决于你的配置文件 shell 参数,这意味着多个配置文件脚本可能会运行,这可能会导致意外行为。
在 macOS 和 Linux 上,可以通过以下方式禁用环境继承
VS Code 实例之间的环境变量
在启动多个 VS Code 实例时,环境变量在它们之间共享:
- 第一个 VS Code 实例从父进程(例如启动 VS Code 的 shell 或应用程序)继承环境变量。
- 后续的 VS Code 实例继承第一个运行的 VS Code 实例的环境变量,而不是从父进程继承。
为了在 VS Code 实例之间隔离环境变量,请使用--用户数据目录 命令行选项 以每个实例使用单独的用户数据目录。这确保了每个实例维护其自己的环境、设置和扩展。
与互动$语言
有一些特殊的互动与$语言环境变量,它决定了终端中字符的呈现方式。此功能通过以下方式配置
| 价值 | 行为 |
|---|---|
上 |
始终设置$语言到最常需求的值。所选的值基于操作系统区域设置(若区域设置无效则回退到英语-美国) 使用 UTF-8 编码。 |
自动(默认) |
设置$语言类似于上行为如果$语言未正确配置(未设置为UTF或EUC编码)。 |
关 |
不要修改$语言输入:. |
扩展环境贡献
扩展可以贡献到终端环境,使它们能够与终端进行一些集成。例如,内置的Git扩展注入了GIT_ASKPASS环境变量以允许 VS Code 处理对 Git 远程的认证。
如果一个扩展更改了终端环境,那么在安全的情况下,任何现有的终端将会被重新启动,否则终端状态会显示警告。更多信息可以在悬停中查看,其中包括一个重新启动按钮。

Windows 和 ConPTY
VS Code 的终端是基于 xterm.js 项目实现的,它将所有数据序列化为一个字符串,并通过一个“伪终端”管道传递。历史上,Windows 上的终端并不是这样工作的,它使用 Console API 来实现其名为“conhost”的控制台。
一个开源项目叫做winpty,旨在通过在Unix风格终端和Windows控制台之间提供模拟/翻译层来尝试解决这个问题。VS Code的终端最初是使用仅winpty实现的。这在当时很棒,但在2018年,Windows 10推出了ConPTY API,它采用了winpty开创的想法,并将其内置到Windows中,提供了一个更可靠和受支持的系统,以利用Windows上的Unix风格终端和应用程序。
VS Code在 Windows 10 及以上版本默认使用 ConPTY(从版本号 18309 开始),对于较早版本的 Windows 作为兼容选项回退到 winpty。ConPTY 可以通过以下方式明确禁用
由于ConPTY是一个模拟层,因此确实存在一些怪癖。最常见的是,ConPTY认为自己是视口的所有者,因此有时会重印屏幕。这种重印可能会导致意外行为,例如在运行Terminal: Clear命令后旧内容显示。
远程开发
本节概述了在使用VS Code远程开发扩展连接到远程机器时的特定主题。
远程Windows中的本地终端
默认本地终端配置文件可以通过命令面板中的终端:创建新的集成终端(本地)命令在远程Windows中启动。目前,非默认配置文件无法从远程Windows启动。
降低远程输入延迟(预览)
本地回显是一个帮助减轻远程Windows输入延迟的功能。在远程结果被确认之前,它以暗淡的颜色在终端中写入按键。默认情况下,当检测到延迟超过30毫秒时,该功能开始运行,并且可以配置时间。
本地回波根据终端中的活动程序动态禁用自身。这是由控制的
['vim', 'vi', 'nano', 'tmux']建议您禁用任何高度动态的或在输入时大量重印屏幕的应用程序或外壳的此功能。
要完全禁用此功能,请使用:
{
"terminal.integrated.localEchoEnabled": 假
}