终端基础
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 的信息。
管理终端
终端选项卡用户界面位于终端视图的右侧。每个终端都有一个条目,包含其名称、图标、颜色和分组装饰(如果有)。
通过选择终端面板右上角的 + 图标、从终端下拉列表中选择一个配置文件,或触发 ⌃⇧` (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
(编辑器)区域。
新窗口中的终端
有几种不同的方法可以在新窗口中打开终端:
- 使用 ⌃⇧⌥` (Windows, Linux Ctrl+Shift+Alt+`)
- 如果你有多个终端,右键单击终端选项卡;如果只打开了一个终端,则左键单击该选项卡。然后选择 将终端移动到新窗口。
- 选择在多个不同菜单中可用的 新建终端窗口 条目。
导航缓冲区
终端中的内容称为缓冲区,底部视口正上方的部分称为“回滚”。保留的回滚量由 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 键,否则不会显示下划线或工具提示。它们对行和列后缀的支持也有限。
打开检测到的链接命令 (⇧⌘O (Windows, Linux Ctrl+Shift+O)) 可用于通过键盘访问链接。
提示: 如果链接验证导致性能问题(例如在高延迟的远程环境中),请通过 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 重新定位光标
按住 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
命令运行活动文件。
最大化终端
可以通过点击带有向上 V 形图标的最大化面板尺寸按钮来最大化终端视图。这将暂时隐藏编辑器并最大化面板。这对于临时关注大量输出非常有用。一些开发者通过打开新窗口、最大化面板并隐藏侧边栏,将 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,你可以使用它来获得关于终端命令和 Shell 脚本的 AI 辅助。有几种使用 Copilot 的方式:
终端内联聊天
直接在终端中启动内联聊天,以获取有关 Shell 命令的帮助:
- 打开终端 (⌃` (Windows, Linux Ctrl+`))
- 按 ⌘I (Windows, Linux Ctrl+I) 或从命令面板运行 终端内联聊天 命令。
- 用自然语言输入你的问题或请求,例如:
- “如何找到这个目录中最大的文件?”
- “告诉我如何撤销上一次 git 提交”
- “创建一个 bash 脚本来分析日志文件”
当 Copilot 提供响应时,你可以选择 运行 直接执行命令,或选择 插入 将其添加到终端以进行进一步编辑。
有关在终端中使用 GitHub Copilot 的更多信息,请参阅使用终端内联聊天。
终端聊天参与者
在聊天视图的提问模式中使用专用的 @terminal
聊天参与者:
- 打开聊天视图 (⌃⌘I (Windows, Linux Ctrl+Alt+I))
- 以
@terminal
开始你的问题,将其定向到终端参与者。 - 询问有关终端命令、Shell 脚本或解释终端输出的问题。
示例
@terminal 列出此工作区中最大的 5 个文件
@terminal /explain top shell 命令
@terminal 如何递归地 grep 模式
在聊天中引用终端上下文
你可以在聊天提示中包含终端信息作为上下文:
- 使用
#terminalSelection
将终端中选定的文本添加到你的聊天提示中。 - 使用
#terminalLastCommand
包含你在终端中运行的最后一个命令。
后续步骤
本文档已涵盖了终端的基础知识。请继续阅读以了解更多信息:
- 终端内联聊天 - 直接在你的终端中获得 AI 驱动的建议。
- 任务 - 任务让你与外部工具集成并大量利用终端。
- 精通 VS Code 的终端 - 一个外部博客,提供了大量终端的高级用户技巧。
- 通过浏览 VS Code 中的键盘快捷键(首选项:打开键盘快捷键,然后搜索“terminal”)来探索终端命令。
常见问题
我无法启动终端
有一个专门的故障排除指南来解决这类问题。
如何创建一个管理员终端?
集成终端 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
{
"@^\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
}
在 zsh 上,Ctrl+A, Ctrl+R 输出 ^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
有关更多信息,请参阅最小对比度部分。