终端高级版

Visual Studio Code 集成的终端具备许多高级功能和设置,如 Unicode 和表情符号支持、自定义键盘快捷键以及自动回复。本主题将详细解释这些高级功能。如果你是VS Code或集成终端的新手,建议先复习终端基础知识。

持久会话

该终端支持两种不同类型的持久会话:

  • 进程重新连接:在重新加载窗口(例如安装扩展后)时,重新连接上一个进程并恢复其内容。
  • 进程复活:重启 VS Code 时,终端内容会被恢复,进程会在原始环境中重新启动

这两个持久会话都可以通过设置来禁用

terminal.integrated.enablePersistentSessions
  • 在VS代码中打开
  • 在VS Code Insiders中开放
错误,恢复的卷回量由
terminal.integrated.persistentSessionScrollback(终端.integrated.persistentSessionScrollback)
  • 在VS代码中打开
  • 在VS Code Insiders中开放
环境。进程复苏可以独立配置为
terminal.integrated.persistentSessionReviveProcess
  • 在VS代码中打开
  • 在VS Code Insiders中开放
.

窗口间移动终端

终端标签页可以在VS Code窗口之间拖拽。这也可以通过命令面板以及终端:分离会话终端:附加到会话的命令手动完成。

配置终端可视化

打开窗口时,如果终端视图可见,它要么通过持久会话重新连接终端,要么创建新的 shell。这种行为可以通过以下条件进行微调

terminal.integrated.hideOnStartup
  • 在VS代码中打开
  • 在VS Code Insiders中开放
环境。

  • 绝不(默认):启动时切勿隐藏终端视图。
  • whenEmpty:只有在没有持久会话恢复时才隐藏终端。
  • 永远:即使有持久会话恢复,也要始终隐藏终端。

terminal.integrated.hideOnLastClosed
  • 在VS代码中打开
  • 在VS Code Insiders中开放
还可以设置在最后一个终端关闭时覆盖关闭终端视图的默认行为。

键盘快捷键与外壳

作为嵌入式应用,集成终端应拦截部分但非全部 VS Code 中调度的键盘快捷键。

可配置的

terminal.integrated.commandsToSkipShell
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置决定了哪个命令的快捷键应始终“跳过 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
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置细节以查看完整的默认命令列表。

提示:

terminal.integrated.sendKeybindingsToShell
  • 在VS代码中打开
  • 在VS Code Insiders中开放
可以配置为覆盖
terminal.integrated.commandsToSkipShell
  • 在VS代码中打开
  • 在VS Code Insiders中开放
并将大多数键盘快捷键发送到壳体。不过这会禁用像Ctrl+F这样的快捷键来打开查找

和弦

和弦键盘快捷键由两个快捷键组成,例如Ctrl+K后再按Ctrl+C,将行改为注释。和弦默认总是跳过 shell,但可以用以下方式禁用

terminal.integrated.allowChords
  • 在VS代码中打开
  • 在VS Code Insiders中开放
.

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
  • 在VS代码中打开
  • 在VS Code Insiders中开放
以启用助记法,但请注意,这会阻止任何Alt键事件进入shell。这个设置在macOS上没有任何作用。

自定义序列键盘快捷键

workbench.action.terminal.sendSequence命令可用于向终端发送特定文本序列,包括由壳层特别解释的转义序列。该命令允许你发送方向键、回车键、光标移动等。通过命令面板执行这个命令,它允许手动输入,但当你为自定义键盘快捷方式分配参数时,它最有用。

例如,下面的序列跳过光标左侧的单词(Ctrl+Left),然后按下退格键

{
  "key": "ctrl+u",
  "command": "workbench.action.terminal.sendSequence",
  "args": {
    "text": "\u001b[1;5D\u007f"
  }
}

该功能支持变量替换

发送序列命令仅适用于\u0000通过字符代码使用字符的格式(非\x00).在以下资源中了解更多关于这些十六进制码和终端序列的信息:

发送自定义信号

workbench.action.terminal.sendSignal(工作台)作。终端。发送信号命令可用于向活动终端的前景进程发送任意信号。

例如,下面的按键绑定将发送SIGTERM,使其优雅地终止。

{
  "key": "ctrl+shift+/",
  "command": "workbench.action.terminal.sendSignal",
  "args": {
    "signal": "SIGTERM"
  }
}

确认对话

为了避免不必要的输出和用户提示,终端在进程退出时不会显示警告对话框。如果需要警告,可以用以下设置配置:

  • terminal.integrated.confirmOnExit
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    - 控制是否确认窗口关闭时是否存在活跃调试会话。
  • terminal.integrated.confirmOnKill
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    - 控制在终端存在子进程时是否确认杀伤。
  • terminal.integrated.showExitAlert
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    - 控制当出口代码非零时,是否显示“终端进程已终止并终止于退出代码”的警报。

自动回复

如果接收到精确的输出序列,终端可以自动向壳体提供可配置的输入响应。最常见的用例是在批量脚本中按Ctrl+C时自动回复提示,询问用户是否要终止批处理作业。要自动关闭此提示,请添加以下设置:

{
  "terminal.integrated.autoReplies": {
    "Terminate batch job (Y/N)": "Y\r"
  }
}

注意\r这里使用的字符指的是回车,类似于自定义序列键盘快捷键,该功能支持向壳体发送转义序列。

默认情况下不设置自动回复,因为提供shell输入应由用户明确作或配置。

更改制表符宽度

terminal.integrated.tabStopWidth
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置允许在终端运行程序输出时配置制表符宽度\t.通常不需要,因为程序通常会移动光标而不是使用Tab字符,但在某些情况下可能有用。

Unicode 和表情符号支持

该终端支持Unicode和表情符号。当这些字符在终端中使用时,有一些需要注意的前提:

  • 一些Unicode符号的宽度可能在不同版本之间有所变化。目前我们支持 Unicode 版本 6 和 11 宽度,这些宽度可以通过
    terminal.integrated.unicodeVersion
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    环境。指定的版本应与 shell/作系统使用的 Unicode 版本一致,否则可能会出现渲染问题。请注意,shell/作系统的Unicode版本可能与字体的实际宽度不匹配。
  • 一些由多个角色组成的表情符号可能无法正确渲染,例如肤色修改器。
  • Windows上的表情符号支持有限。

图像支持

终端中的图像只要使用Sixel或iTerm的内联图像协议即可正常工作。该功能默认被禁用,可以通过以下方式启用

terminal.integrated.enableImages
  • 在VS代码中打开
  • 在VS Code Insiders中开放
环境。

当前限制:

流程环境

在终端内运行的应用程序的进程环境会受到各种设置和扩展的影响,可能导致VS Code终端的输出与其他终端不同。

环境继承

当打开 VS Code 时,它会启动一个登录壳环境以获取一个 shell 环境。这是因为开发者工具通常会被添加到$PATH在像这样的shell启动脚本中~/.bash_profile.默认情况下,终端会继承这个环境,具体取决于你的配置文件壳参数,这意味着可能运行了多个配置文件脚本,这可能导致意外行为。

在macOS和Linux上,可以通过以下方式禁用该环境继承。

terminal.integrated.inheritEnv
  • 在VS代码中打开
  • 在VS Code Insiders中开放
环境。

VS Code 实例之间的环境变量

在启动多个 VS Code 实例时,环境变量会在它们之间共享:

  • 第一个 VS Code 实例继承父进程的环境变量(例如启动 VS Code 的 shell 或应用程序)。
  • 后续的 VS Code 实例继承了第一个运行的 VS Code 实例的环境变量,而非父进程。

要在 VS Code 实例之间隔离环境变量,可以使用--用户-数据-dir命令行选项用一个独立的用户数据目录运行每个实例。这确保每个实例都能维护自己的环境、设置和扩展。

$LANG

$LANG环境变量,决定字符在终端中的显示方式。该功能配置为

terminal.integrated.detectLocale
  • 在VS代码中打开
  • 在VS Code Insiders中开放
地点:

价值 行为
关于 永远设定$LANG到最常用的期望值。所选值基于作系统所在地(退回到美国)采用UTF-8编码。
自动(默认) 赛场$LANG类似于关于如果$LANG配置不正确(未设置为UTF或EUC编码)。
不对劲 不要修改$LANG.

扩展环境贡献

扩展能够为终端环境做出贡献,使其能够与终端进行一定的集成。例如,内置的Git扩展注入GIT_ASKPASSenvironment 变量允许 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 风格终端和应用。

在 Windows 10+(构建号 18309)上,VS Code 默认使用 ConPTY,而对于旧版本的 Windows 则退回到 winpty 作为遗留选项。ConPTY 可以通过

terminal.integrated.windowsEnableConpty
  • 在VS代码中打开
  • 在VS Code Insiders中开放
但通常应该避免这样做。

由于ConPTY是一个模拟层,它确实有一些小问题。最常见的是ConPTY自认为是视口的所有者,因此有时会重新打印屏幕。这种重印可能导致异常行为,比如运行Terminal: Clear命令后旧内容显示。

远程开发

本节概述了当VS Code通过VS Code远程开发扩展连接到远程机器时的具体主题。

远程窗口中的本地终端

默认的本地终端配置文件可以通过命令调色板在远程窗口中通过命令面板的终端:创建新集成终端(本地)命令启动。目前,非默认配置文件无法从远程窗口启动。

减少远程输入延迟(预览)

本地回声是帮助减轻远程窗口输入延迟的功能。它会在终端中以调暗颜色写入按键,然后再被遥控器确认。默认情况下,当检测到延迟超过30毫秒时,该功能开始运行,且可配置时序为

terminal.integrated.localEchoLatencyThreshold
  • 在VS代码中打开
  • 在VS Code Insiders中开放
.未确认字符的颜色定义为
terminal.integrated.localEchoStyle
  • 在VS代码中打开
  • 在VS Code Insiders中开放
.

本地回声会根据终端中的激活程序动态地自我禁用。该控制由

terminal.integrated.localEchoExcludePrograms
  • 在VS代码中打开
  • 在VS Code Insiders中开放
,默认为['vim', 'vi', 'nano', 'tmux'].建议你关闭任何高度动态且在输入时大量重印屏幕的应用或壳体。

要完全禁用该功能,请使用:

{
  "terminal.integrated.localEchoEnabled": false
}