在 VS Code 中尝试

终端基础

Visual Studio Code 包含一个功能齐全的集成终端,它在工作区的根目录启动。它与编辑器集成,支持链接错误检测等功能。集成终端可以像独立的终端一样运行 mkdir 和 git 等命令。

您可以通过以下方式打开终端

  • 从菜单中,使用终端 > 新建终端视图 > 终端菜单命令。
  • 命令面板⇧⌘P(Windows、Linux Ctrl+Shift+P),使用视图: 切换终端命令。
  • 在资源管理器中,您可以使用在集成终端中打开上下文菜单命令从文件夹打开新终端。
  • 要切换终端面板,请使用键盘快捷方式⌃`(Windows、Linux Ctrl+`
  • 要创建新终端,请使用键盘快捷方式⌃⇧`(Windows、Linux Ctrl+Shift+`

VS Code 的终端具有一项名为 Shell 集成的附加功能,它通过命令左侧和滚动条中的装饰来跟踪命令的运行位置

The integrated terminal can run commands such as mkdir and git just like a standalone terminal. VS Code's terminal has additional functionality called shell integration that tracks where commands are run with decorations on the left of a command and in the scrollbar.

注意:如果您更喜欢在 VS Code 之外工作,可以使用键盘快捷方式⇧⌘C(Windows、Linux Ctrl+Shift+C打开外部终端

终端 Shell

集成终端可以使用您机器上安装的各种 Shell,默认 Shell 将从您的系统默认设置中提取。Shell 会被检测并显示在终端配置文件下拉菜单中。

A detected profile can be chosen in the dropdown next to the new terminal button. Some examples on Windows include PowerShell, Command Prompt, Git Bash and WSL

您可以在终端配置文件文章中了解有关配置终端 Shell 的更多信息。

管理终端

终端选项卡 UI 位于终端视图的右侧。每个终端都有一个条目,其中包含其名称、图标、颜色和组装饰(如果有)。

Activating the Launch Profile button will show all detected and manually configured profiles

通过选择终端面板右上角的+图标、从终端下拉菜单中选择配置文件或触发⌃⇧`(Windows、Linux Ctrl+Shift+`命令来添加终端实例。此操作将在与该终端关联的选项卡列表中创建另一个条目。

通过将鼠标悬停在选项卡上并选择垃圾桶按钮、选择选项卡项并按Delete、使用终端: 终止活动终端实例命令或通过右键上下文菜单来删除终端实例。

使用焦点下一个⇧⌘](Windows、Linux Ctrl+PageDown和焦点上一个⇧⌘[(Windows、Linux Ctrl+PageUp在终端组之间导航。

当终端状态改变时,选项卡标签上终端标题的右侧可能会出现图标。例如,铃铛(macOS)图标和任务图标,当没有错误时显示一个勾号,否则显示一个 X。将鼠标悬停在图标上以读取状态信息,其中可能包含操作。

组(拆分窗格)

将多个终端并排放置,通过拆分终端来创建组

  • 将鼠标悬停在右侧终端列表中的一个条目上,然后选择行内拆分按钮。
  • 右键单击上下文菜单并选择拆分菜单选项。
  • 按住Alt键并单击选项卡、+按钮或终端面板上的单个选项卡。
  • 触发⌘\(Windows、Linux Ctrl+Shift+5命令。

提示:新终端的工作目录取决于terminal.integrated.splitCwd设置

通过将焦点移到上一个窗格⌥⌘←(Windows、Linux Alt+Left或下一个窗格⌥⌘→(Windows、Linux Alt+Right,在组中的终端之间导航。

在列表中拖放选项卡可以重新排列它们。将选项卡拖到主终端区域可以将终端从一个组移动到另一个组。

通过命令面板或右键上下文菜单中的终端: 取消拆分终端命令,可以将终端移动到自己的组中。

编辑器区域中的终端

您可以使用终端: 在编辑器区域中创建新终端命令、终端: 在编辑器区域侧面创建新终端命令,或通过将终端从终端视图拖动到编辑器区域来在编辑器区域中打开终端(终端编辑器)。终端编辑器显示为常规编辑器选项卡

Terminal editors are presented like regular text file tabs

您可以在两侧放置终端编辑器,或使用编辑器组布局系统以多个维度排列它们,例如 PowerShell 和 WSL 终端堆叠在文件编辑器右侧

Terminal editors are can be laid out using the editor group layout system, for example 2 terminals could sit to the right of a text editor

通过terminal.integrated.defaultLocation设置可以更改默认的vieweditor区域终端位置。

导航缓冲区

终端中的内容称为缓冲区,底部视口正上方部分称为“回滚”。保留的回滚量由terminal.integrated.scrollback设置决定,默认为1000行。

有多种命令可用于在终端缓冲区中导航

  • 向上滚动一行 - ⌥⌘PageUp(Windows Ctrl+Alt+PageUp,Linux Ctrl+Shift+Up
  • 向下滚动一行 - ⌥⌘PageDown(Windows Ctrl+Alt+PageDown,Linux Ctrl+Shift+Down
  • 向上滚动一页 - PageUp(Windows、Linux Shift+PageUp
  • 向下滚动一页 - PageDown(Windows、Linux Shift+PageDown
  • 滚动到顶部 - ⌘Home(Windows Ctrl+Home,Linux Shift+Home
  • 滚动到底部 - ⌘End(Windows Ctrl+End,Linux Shift+End

命令导航也可用(请参阅Shell 集成

  • 滚动到上一个命令 - ⌘↑(Windows、Linux Ctrl+Up
  • 滚动到下一个命令 - ⌘↓(Windows、Linux Ctrl+Down

滚动将瞬时发生,但可以通过terminal.integrated.smoothScrolling设置配置为在短时间内进行动画滚动。

终端具有复杂的链接检测功能,可与编辑器集成,甚至支持扩展贡献的链接处理程序。将鼠标悬停在链接上会显示下划线,然后按住Ctrl/Cmd键并单击。

这些内置链接处理程序按以下优先级顺序使用

  • URI/URL:看起来像 URI 的链接,例如 https://vscode.js.cnvscode://path/to/filefile://path/to/file,将使用协议的标准处理程序打开。例如,https 链接将打开浏览器。

    Opening a URI link will open it in the system browser

  • 文件链接:已验证存在于系统上的文件链接。这些链接将在新编辑器选项卡中打开文件,并支持许多常见的行/列格式,例如 file:1:2file:line 1, column 2

    Activating a file link will open it in an editor

  • 文件夹链接:指向文件夹的链接类似于文件链接,但会在该文件夹处打开一个新的 VS Code 窗口。

    Activating a folder link will open it in a new window

  • 单词链接:回退链接类型,使用terminal.integrated.wordSeparators设置。该设置定义单词边界,并将几乎所有文本转换为单词。激活单词链接会在工作区中搜索该单词。如果只有一个结果,它将打开;否则,它将显示搜索结果。单词链接被认为是“低置信度”链接,除非您按住Ctrl/Cmd键,否则不会显示下划线或工具提示。它们对行和列后缀的支持也有限。

    Activating a word link 'terminal:15' will open a Quick Pick searching the workspace for all files containing 'terminal', choosing an option will open the file at line 15

打开检测到的链接命令(⇧⌘G(Windows、Linux Ctrl+Shift+G)可用于通过键盘访问链接

Open Detected Link opens a quick pick with all links in the viewport, split into categories

提示:如果链接验证导致性能问题(例如在高延迟远程环境中),可以通过terminal.integrated.enableFileLinks设置禁用它。

扩展可以贡献链接提供程序,允许扩展定义单击时发生的操作。一个例子是GitLens扩展检测 Git 分支链接。

When GitLens is installed, hovering a branch name will provide custom behavior to open the branch in the UI

键盘辅助功能

链接可通过几个根据链接类型打开链接的命令进行键盘访问。

  • 终端: 打开上次本地文件链接 - 打开最近的本地文件链接。没有默认键盘快捷方式。
  • 终端: 打开上次 URL 链接 - 打开最近的 URI/URL 链接。没有默认键盘快捷方式。
  • 终端: 打开检测到的链接... - 打开一个可搜索的快速选择器,其中包含所有检测到的链接,包括单词链接。默认键盘快捷方式是Ctrl/Cmd+Shift+O,这与转到编辑器中的符号键盘快捷方式相同。

复制与粘贴

复制和粘贴的键盘快捷方式遵循平台标准

  • Linux: Ctrl+Shift+CCtrl+Shift+V;可通过 Shift+Insert 进行选择性粘贴
  • macOS: Cmd+CCmd+V
  • Windows: Ctrl+CCtrl+V

当启用terminal.integrated.copyOnSelection时,选择时会自动进行复制。

默认情况下,粘贴多行时会显示警告,可以通过terminal.integrated.enableMultiLinePasteWarning设置禁用此警告。只有当 shell 不支持“带括号粘贴模式”时才会出现此警告。当该模式启用时,shell 表示它可以处理多行粘贴。

使用鼠标

右键单击行为

右键单击行为因平台而异

  • Linux: 显示上下文菜单。
  • macOS: 选择光标下的单词并显示上下文菜单。
  • Windows: 如果有选中内容,则复制并拖放选中内容,否则粘贴。

这可以通过terminal.integrated.rightClickBehavior设置进行配置。选项包括

  • default - 显示上下文菜单。
  • copyPaste - 有选择时复制,否则粘贴。
  • paste - 右键粘贴。
  • selectWord - 选择光标下的单词并显示上下文菜单。
  • nothing - 不执行任何操作并将事件传递给终端。

使用 Alt 重新定位光标

按住Alt键并左键单击会将光标重新定位到鼠标下方。这是通过模拟箭头按键实现的,可能对某些 Shell 或程序不可靠。此功能可以通过terminal.integrated.altClickMovesCursor设置禁用。

鼠标事件模式

当终端中运行的应用程序启用鼠标事件模式时(例如 Vim 鼠标模式),鼠标交互会发送给应用程序而不是终端。这意味着单击和拖动将不再创建选择。可以通过在 Windows 和 Linux 上按住Alt键来强制进行终端选择,这也可以通过在 macOS 上按住Option键来完成,但首先需要启用terminal.integrated.macOptionClickForcesSelection设置。

查找

集成终端具有查找功能,可以使用⌘F(Windows、Linux Ctrl+F触发。

Find in the terminal will highlight all text matching the query

提示:可以通过从跳过 Shell 的命令中删除workbench.action.terminal.focusFind命令,将Ctrl+F发送到 Shell。

运行选定文本

要使用runSelectedText命令,请在编辑器中选择文本,并通过命令面板⇧⌘P(Windows、Linux Ctrl+Shift+P)运行终端: 在活动终端中运行选定文本命令,终端将尝试运行选定文本。如果在活动编辑器中没有选择文本,则光标所在行的整行将在终端中运行。

提示:也可以使用命令workbench.action.terminal.runActiveFile运行活动文件。

最大化终端

可以通过单击带有向上箭头图标的最大化面板大小按钮来最大化终端视图。这将暂时隐藏编辑器并最大化面板。这对于暂时专注于大量输出很有用。有些开发人员通过打开新窗口、最大化面板和隐藏侧边栏来将 VS Code 用作独立的终端。

请注意,只有当面板的对齐选项设置为居中时,才能将其最大化。

全选

有一个终端: 全选命令,在 macOS 上绑定到Cmd+A,但在 Windows 和 Linux 上没有默认键盘快捷方式,因为它可能与 Shell 热键冲突。要使用Ctrl+A全选,请添加此自定义键盘快捷方式

{
  "key": "ctrl+a",
  "command": "workbench.action.terminal.selectAll",
  "when": "terminalFocus && !isMac"
},

拖放文件路径

将文件拖到终端中会将路径输入到终端中,并进行转义以匹配活动 Shell。

使用任务自动化终端

任务功能可用于自动化终端的启动,例如,以下.vscode/tasks.json文件将在窗口启动时在一个终端组中启动命令提示符和 PowerShell 终端

{
  "version": "2.0.0",
  "presentation": {
    "echo": false,
    "reveal": "always",
    "focus": false,
    "panel": "dedicated",
    "showReuseMessage": true
  },
  "tasks": [
    {
      "label": "Create terminals",
      "dependsOn": [
        "First",
        "Second"
      ],
      // Mark as the default build task so cmd/ctrl+shift+b will create them
      "group": {
        "kind": "build",
        "isDefault": true
      },
      // Try start the task on folder open
      "runOptions": {
        "runOn": "folderOpen"
      }
    },
    {
      // The name that shows up in terminal tab
      "label": "First",
      // The task will launch a shell
      "type": "shell",
      "command": "",
      // Set the shell type
      "options": {
        "shell": {
          "executable": "cmd.exe",
          "args": []
        }
      },
      // Mark as a background task to avoid the spinner animation on the terminal tab
      "isBackground": true,
      "problemMatcher": [],
      // Create the tasks in a terminal group
      "presentation": {
        "group": "my-group"
      }
    },
    {
      "label": "Second",
      "type": "shell",
      "command": "",
      "options": {
        "shell": {
          "executable": "pwsh.exe",
          "args": []
        }
      },
      "isBackground": true,
      "problemMatcher": [],
      "presentation": {
        "group": "my-group"
      }
    }
  ]
}

此文件可以提交到仓库与其它开发人员共享,或者通过workbench.action.tasks.openUserTasks命令创建为用户任务。

工作目录

默认情况下,终端将在资源管理器中打开的文件夹处打开。通过terminal.integrated.cwd设置可以指定要打开的自定义路径

{
  "terminal.integrated.cwd": "/home/user"
}

Windows 上的拆分终端将在父终端启动的目录中启动。在 macOS 和 Linux 上,拆分终端将继承父终端的当前工作目录。此行为可以使用terminal.integrated.splitCwd设置更改

{
  "terminal.integrated.splitCwd": "workspaceRoot"
}

还有一些可用的扩展提供了更多选项,例如Terminal Here

固定尺寸终端

终端: 设置固定尺寸命令允许更改终端及其后端伪终端使用的列数和行数。这会在必要时添加滚动条,这可能会导致不愉快的用户体验,通常不推荐,但在 Windows 上尤其常见,用于在没有分页工具时读取日志或长行。

您还可以右键单击终端选项卡并选择切换大小以适应内容宽度⌥Z(Windows、Linux Alt+Z),以将终端列数调整为终端中最长的换行行。

终端中的 GitHub Copilot

如果您有权访问GitHub Copilot,可以使用它来获得 AI 驱动的终端命令和 Shell 脚本帮助。以下是使用 Copilot 的几种方式

终端行内聊天

直接在终端中启动行内聊天以获取 Shell 命令帮助

  1. 打开终端(⌃`(Windows、Linux Ctrl+`
  2. 按下⌘I(Windows、Linux Ctrl+I或从命令面板运行终端行内聊天命令
  3. 以自然语言输入您的问题或请求,例如
    • “如何查找此目录中最大的文件?”
    • “告诉我如何撤销上次 git 提交”
    • “创建一个 Bash 脚本来分析日志文件”

Terminal inline chat helps you quickly get and run shell commands

当 Copilot 提供响应时,您可以选择运行以直接执行命令,或选择插入以将其添加到终端进行进一步编辑。

有关在终端中使用 GitHub Copilot 的更多信息,请参阅使用终端行内聊天

终端聊天参与者

在聊天视图的提问模式下使用专用的@terminal聊天参与者

  1. 打开聊天视图(⌃⌘I(Windows、Linux Ctrl+Alt+I
  2. @terminal开头提问,将其定向给终端参与者
  3. 询问终端命令、Shell 脚本或解释终端输出

示例

  • @terminal 列出此工作区中最大的 5 个文件
  • @terminal /explain top shell 命令
  • @terminal 如何递归地 grep 模式

在聊天中引用终端上下文

您可以在聊天提示中包含终端信息作为上下文

  • 使用#terminalSelection将终端中的选定文本添加到您的聊天提示中
  • 使用#terminalLastCommand包含您在终端中运行的最后一个命令

后续步骤

本文已涵盖终端的基础知识。请继续阅读以了解更多信息

  • 终端行内聊天 - 在您的终端中提供 AI 驱动的建议。
  • 任务 - 任务允许您与外部工具集成并大量利用终端。
  • 精通 VS Code 终端 - 一个包含大量终端高级用户技巧的外部博客。
  • 通过浏览 VS Code 中的键盘快捷方式(首选项: 打开键盘快捷方式,然后搜索“终端”)来探索终端命令。

常见问题

我无法启动终端

针对此类问题有一个专门的故障排除指南

如何创建管理员终端?

集成终端 Shell 以 VS Code 的权限运行。如果您需要以提升的(管理员)或不同权限运行 Shell 命令,请在终端中使用平台实用程序,例如runas.exe

您可以在配置配置文件中了解有关通过终端配置文件自定义终端的更多信息。

我可以为资源管理器的“在集成终端中打开”命令添加键盘快捷方式吗?

您可以通过资源管理器中的在集成终端中打开上下文菜单命令,为特定文件夹打开新终端。

A folder selected in the Explorer displaying the context menu with the Open in Integrated Terminal command

默认情况下,在集成终端中打开没有关联的键盘快捷方式,但您可以通过键盘快捷方式编辑器(⌘K ⌘S(Windows、Linux Ctrl+K Ctrl+S)添加自己的快捷方式到您的keybindings.json

下面的keybindings.json示例为openInTerminal添加了键盘快捷方式Ctrl+T

{
  "key": "ctrl+t",
  "command": "openInTerminal",
  "when": "filesExplorerFocus"
}

为什么集成终端启动时 nvm 会抱怨前缀选项?

nvm(Node 版本管理器)用户经常在 VS Code 的集成终端中首次看到此错误

nvm is not compatible with the npm config "prefix" option: currently set to "/usr/local"
Run `npm config delete prefix` or `nvm use --delete-prefix v8.9.1 --silent` to unset it

这主要是一个 macOS 问题,不会发生在外部终端中。典型原因如下

  • npm 是使用路径中某处的另一个node实例(例如/usr/local/bin/npm)全局安装的。
  • 为了使开发工具位于$PATH上,VS Code 将在启动时启动一个 Bash 登录 Shell。这意味着您的~/.bash_profile已经运行,当集成终端启动时,它将运行另一个登录 Shell,这可能会以意想不到的方式重新排列$PATH

要解决此问题,您需要找到旧的npm安装位置并将其及其过时的 node_modules 一并删除。找到nvm初始化脚本并在其运行之前运行which npm,这应该在您启动新终端时打印出路径。

获得 npm 路径后,通过运行类似以下命令来解析符号链接,从而找到旧的 node_modules

ls -la /usr/local/bin | grep "np[mx]"

这最终会给出解析后的路径

... npm -> ../lib/node_modules/npm/bin/npm-cli.js
... npx -> ../lib/node_modules/npm/bin/npx-cli.js

之后,删除文件并重新启动 VS Code 应该可以解决问题

rm /usr/local/bin/npm /usr/local/lib/node_modules/npm/bin/npm-cli.js
rm /usr/local/bin/npx /usr/local/lib/node_modules/npm/bin/npx-cli.js

为什么当我在 macOS 上调整终端拆分窗格大小时会发出提示音?

键盘快捷方式 ⌃⌘← 和 ⌃⌘→ 是终端中调整单个拆分窗格大小的默认设置。虽然它们有效,但由于 Chromium 中的问题,它们还会导致系统播放“无效按键”声音。建议的解决方法是在终端中运行此命令,以告诉 macOS 对这些键盘快捷方式不执行任何操作

mkdir -p ~/Library/KeyBindings
cat > ~/Library/KeyBindings/DefaultKeyBinding.dict <<EOF
{
  "@^\UF700" = "noop:";
  "@^\UF701" = "noop:";
  "@^\UF702" = "noop:";
  "@^\UF703" = "noop:";
  "@~^\UF700" = "noop:";
  "@~^\UF701" = "noop:";
  "@~^\UF702" = "noop:";
  "@~^\UF703" = "noop:";
}
EOF

我的终端渲染有问题。我该怎么办?

默认情况下,集成终端在大多数机器上会使用 GPU 加速渲染。通常,当出现渲染问题时,是由于您的硬件/操作系统/驱动程序与 GPU 渲染器不兼容导致的。首先尝试的是禁用 GPU 加速,以渲染速度换取基于 DOM 的渲染,这种方式更可靠

{
  "terminal.integrated.gpuAcceleration": "off"
}

有关更多信息,请参阅GPU 加速部分。

当我粘贴内容时,我看到1~[201~

这通常意味着终端内运行的程序/Shell 请求开启“带括号粘贴模式”,但有些东西不支持它。要解决此问题,您可以运行printf "\e[?2004l"以禁用该会话的该模式,或将以下内容添加到您的~/.inputrc文件中

set enable-bracketed-paste off

另外,可以通过此设置将其关闭,强制“带括号粘贴模式”忽略 Shell 的请求

{
  "terminal.integrated.ignoreBracketedPasteMode": true
}

Ctrl+A, Ctrl+R 在 zsh 中输出 ^A, ^R

如果 zsh 处于 Vim 模式而不是 Emacs 模式,这可能会发生,这是由于在您的初始化脚本中将$EDITOR$VISUAL设置为vi/vim

要解决此问题,您有两种选择

  • 确保您不要将$EDITOR设置为vi(m)。但是,如果您希望 Git 编辑器正常工作,这并非一个选项。
  • bindkey -e添加到您的初始化脚本中,以显式设置 Emacs。

如何配置 Cmd+. 映射到 Ctrl+C,就像 macOS 的内置终端那样?

macOS 默认终端使用Cmd+.执行与Ctrl+C相同的操作。要在 VS Code 中获得此行为,请添加此自定义键盘快捷方式

{
  "key": "cmd+.",
  "command": "workbench.action.terminal.sendSequence",
  "when": "terminalFocus",
  "args": { "text": "\u0003" }
}

为什么终端中的颜色不正确?

我们默认启用的一项辅助功能是确保前景文本的最小对比度至少达到 4.5。此功能确保无论使用何种 Shell 和主题,文本都是可读的,否则这是不可能的。要禁用此功能,您可以设置

"terminal.integrated.minimumContrastRatio": 1

有关更多信息,请参阅最小对比度部分。