终端基础知识
Visual Studio Code 包含一个功能齐全的集成终端,它在您的工作区根目录启动。它提供与编辑器的集成,以支持链接和错误检测等功能。集成终端可以像独立的终端一样运行命令,例如 mkdir
和 git
。
您可以按如下方式打开终端
- 从菜单中,使用**终端** > **新建终端**或**视图** > **终端**菜单命令。
- 从**命令面板** (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 中,使用 **视图: 切换终端** 命令。
- 在资源管理器中,您可以使用“在集成终端中打开”上下文菜单命令从文件夹打开新终端。
- 要切换终端面板,请使用 ⌃` (Windows、Linux Ctrl+`) 键盘快捷键。
- 要创建新终端,请使用 ⌃⇧` (Windows、Linux Ctrl+Shift+`) 键盘快捷键。
VS Code 的终端具有称为 shell 集成的附加功能,该功能可跟踪命令的运行位置,并在命令左侧和滚动条中带有装饰。
**注意:** 如果您喜欢在 VS Code 外部工作,请使用 ⇧⌘C (Windows、Linux Ctrl+Shift+C) 键盘快捷键打开外部终端。
终端 shell
集成终端可以使用您机器上安装的各种 shell,默认 shell 从您的系统默认设置中拉取。Shell 会被检测到并在终端配置文件下拉列表中显示。
您可以在终端配置文件文章中了解有关配置终端 shell 的更多信息。
管理终端
终端选项卡 UI 位于终端视图的右侧。每个终端都有一个条目,其中包含其名称、图标、颜色和组装饰(如果有)。
通过选择 **TERMINAL** 面板右上角的 **+** 图标、从终端下拉列表中选择配置文件或触发 ⌃⇧` (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) 在组中的终端之间导航。
在列表中拖放选项卡可以重新排列它们。将选项卡拖到主终端区域允许将终端从一个组移动到另一个组。
使用**终端: 取消拆分终端**命令,通过命令面板或在右键单击上下文菜单中,可以将终端移动到其自己的组中。
编辑器区域中的终端
您可以使用**终端: 在编辑器区域中创建新终端**命令、**终端: 在编辑器区域侧边创建新终端**命令,或通过将终端从终端视图拖到编辑器区域中,在编辑器区域(终端编辑器)中打开终端。终端编辑器像常规编辑器选项卡一样呈现
您可以在任一侧或使用编辑器组布局系统以多个维度排列终端编辑器,例如,PowerShell 和 WSL 终端堆叠在文件编辑器的右侧
terminal.integrated.defaultLocation 设置可以更改默认的 view
或 editor
区域终端位置。
导航缓冲区
终端中的内容称为缓冲区,底部视口正上方的部分称为“回滚”。保留的回滚量由 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.cn
、vscode://path/to/file
或file://path/to/file
将使用协议的标准处理程序打开。例如,https
链接将打开浏览器。 -
文件链接:指向已验证存在于系统上的文件的链接。这些链接将在新的编辑器选项卡中打开文件,并支持许多常见的行/列格式,例如
file:1:2
、file:line 1, column 2
。 -
文件夹链接:指向文件夹的链接类似于文件链接,但会在该文件夹中打开一个新的 VS Code 窗口。
-
单词链接:回退链接类型,使用 terminal.integrated.wordSeparators 设置。该设置定义了单词边界,并将几乎所有文本都变成单词。激活单词链接会在工作区中搜索该单词。如果只有一个结果,则会打开,否则会显示搜索结果。单词链接被认为是“低置信度”的,除非您按住 Ctrl/Cmd 键,否则不会显示下划线或工具提示。它们对行和列后缀的支持也有限。
**打开检测到的链接**命令 (⇧⌘G (Windows、Linux Ctrl+Shift+G)) 可用于通过键盘访问链接
**提示:** 如果链接验证导致性能问题(例如在高延迟远程环境中),请通过 terminal.integrated.enableFileLinks 设置禁用它。
扩展处理链接
扩展可以贡献**链接提供程序**,这允许扩展定义单击时发生的情况。这方面的一个示例是 GitLens 扩展检测 Git 分支链接。
键盘辅助功能
链接可通过多个命令进行键盘访问,这些命令根据链接的类型打开链接。
- **终端: 打开最后一个本地文件链接** - 打开最近的本地文件链接。没有默认键盘快捷键。
- **终端: 打开最后一个 URL 链接** - 打开最近的 URI/URL 链接。没有默认键盘快捷键。
- **终端: 打开检测到的链接...** - 打开一个可搜索的快速选择,其中包含所有检测到的链接,包括单词链接。默认键盘快捷键是 Ctrl/Cmd+Shift+O,这与**转到编辑器中的符号**键盘快捷键相同。
复制 & 粘贴
复制和粘贴的键盘快捷键遵循平台标准
- Linux:Ctrl+Shift+C 和 Ctrl+Shift+V;选择粘贴可通过 Shift+Insert 使用
- macOS:Cmd+C 和 Cmd+V
- Windows:Ctrl+C 和 Ctrl+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) 触发该功能。
**提示:** 可以通过从要跳过 shell 的命令中删除
workbench.action.terminal.focusFind
命令,将 Ctrl+F 发送到 shell。
运行选定的文本
要使用 runSelectedText
命令,请在编辑器中选择文本,然后通过**命令面板** (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 运行 **终端: 在活动终端中运行选定的文本** 命令,终端将尝试运行选定的文本。如果在活动编辑器中未选择任何文本,则光标所在的整行将在终端中运行。
**提示:** 也可以使用命令
workbench.action.terminal.runActiveFile
运行活动文件。
最大化终端
可以通过单击带有向上 Chevron 图标的最大化面板大小按钮来最大化终端视图。这将暂时隐藏编辑器并最大化面板。这对于临时专注于大量输出非常有用。一些开发人员通过打开一个新窗口、最大化面板并隐藏侧边栏,将 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。
固定尺寸终端
**终端: 设置固定尺寸**命令允许更改终端及其后备伪终端使用的列数和行数。这将在必要时添加滚动条,这可能会导致令人不愉快的 UX,并且通常不建议这样做,但特别是在 Windows 上读取日志或在分页工具不可用时读取长行是很常见的请求。
您还可以右键单击终端选项卡,然后选择**将大小切换为内容宽度** (⌥Z (Windows、Linux Alt+Z)) 以将终端列数调整为终端中最长换行行的宽度。
后续步骤
本文档已涵盖终端的基础知识。请继续阅读以了解更多关于
- 终端内联聊天 - 终端中由 AI 驱动的建议。
- 任务 - 任务允许您与外部工具集成并大量利用终端。
- 掌握 VS Code 的终端 - 一个外部博客,其中包含大量终端高级用户技巧。
- 通过浏览 VS Code 中的键盘快捷方式(**首选项: 打开键盘快捷方式**,然后搜索“终端”)来探索终端命令。
常见问题
我启动终端时遇到问题
有一个专门的故障排除指南,用于解决此类问题。
如何创建管理员终端?
集成终端 shell 正在以 VS Code 的权限运行。如果您需要以提升的(管理员)权限或不同的权限运行 shell 命令,请使用平台实用程序,例如终端中的 runas.exe
。
您可以在配置配置文件中了解有关通过终端配置文件自定义终端的更多信息。
我可以为资源管理器的“在集成终端中打开”命令添加键盘快捷键吗?
您可以通过**在集成终端中打开**上下文菜单命令,为资源管理器中特定文件夹打开新终端。
默认情况下,**在集成终端中打开**没有关联的键盘快捷键,但您可以通过键盘快捷键编辑器 (⌘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 Version Manager) 用户通常在 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
{
"^@\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+. 配置为像 macOS 内置终端一样映射到 Ctrl+C?
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
有关更多信息,请参阅最小对比度部分。