Visual Studio Code 键盘快捷键
Visual Studio Code 允许您直接通过键盘执行大多数任务。本文介绍了如何修改 VS Code 自带的默认键盘快捷键。
如果您在 Mac 上访问此页面,将会看到 Mac 的键盘快捷键。如果您使用 Windows 或 Linux 访问,将会看到相应平台的按键。如果需要其他平台的快捷键,请将鼠标悬停在您感兴趣的按键上。
键盘快捷方式编辑器
VS Code 提供了功能丰富的“键盘快捷键”编辑器,以优化快捷键编辑体验。该编辑器列出了所有带有或不带有快捷键的可用命令,并允许您使用提供的操作来更改、移除或重置它们的快捷键。要查找命令或快捷键,请使用搜索框并输入命令或快捷键来过滤列表。
要打开“键盘快捷键”编辑器,请选择 文件 (File) > 首选项 (Preferences) > 键盘快捷键 (Keyboard Shortcuts) 菜单,或者在命令面板中使用 首选项: 打开键盘快捷键 (Preferences: Open Keyboard Shortcuts) 命令(⌘K ⌘S (Windows, Linux Ctrl+K Ctrl+S))。默认情况下,“键盘快捷键”编辑器会在编辑器区域上方的模态弹窗中打开。

键盘快捷键与您当前的键盘布局相匹配。例如,US 键盘布局中的快捷键 Cmd+\ 在切换为德语布局后将显示为 Ctrl+Shift+Alt+Cmd+7。用于更改键盘快捷键的对话框会根据您的键盘布局分配正确且所需的快捷键。
自定义 UI 操作快捷键
要自定义 UI 操作的快捷键,请右键点击工作台中的任何操作项,然后选择 配置键位绑定 (Configure Keybinding)。这将打开“键盘快捷键”编辑器,并过滤到对应的命令。如果该操作具有 when 子句,它会被自动包含在内,从而更容易按需设置快捷键。
键位映射扩展
键位映射扩展可以修改 VS Code 的快捷键以匹配其他编辑器,这样您就不需要学习新的键盘快捷键了。
选择 文件 (File) > 首选项 (Preferences) > 从...迁移键盘快捷键 (Migrate Keyboard Shortcuts from...) 菜单,以获取流行的键位映射扩展列表。Marketplace 中还有一个专门的 键位映射 (Keymaps) 分类。
键盘快捷键参考
我们提供了默认键盘快捷键的可打印版本。选择 帮助 (Help) > 键盘快捷键参考 (Keyboard Shortcut Reference),可以显示一个压缩的 PDF 版本,适合打印并作为便捷参考。
以下链接提供了三个平台特定版本的访问入口(美式英语键盘)
检测键盘快捷键冲突
如果您安装了许多扩展或修改了键盘快捷键,可能会出现键盘快捷键冲突,即同一个快捷键映射到了多个命令。这可能会导致令人困惑的行为,尤其是当您在编辑器中移动时,不同的快捷键进出作用域时。
右键点击键盘快捷键列表中的某个条目,然后选择 显示相同键位绑定 (Show Same Keybindings),即可查看所有具有相同快捷键的条目。

键盘快捷键故障排查
要排查键盘快捷键问题,您可以执行 开发者: 切换键盘快捷键故障排查 (Developer: Toggle Keyboard Shortcuts Troubleshooting) 命令。这会激活键盘快捷键的分发日志记录,并打开带有相应日志文件的“输出”面板。
然后,您可以按下您想要的键盘快捷键,检查 VS Code 检测到了什么快捷键以及调用了什么命令。
例如,在 macOS 的代码编辑器中按下 cmd+/ 时,日志输出如下:
[KeybindingService]: / Received keydown event - modifiers: [meta], code: MetaLeft, keyCode: 91, key: Meta
[KeybindingService]: | Converted keydown event - modifiers: [meta], code: MetaLeft, keyCode: 57 ('Meta')
[KeybindingService]: \ Keyboard event cannot be dispatched.
[KeybindingService]: / Received keydown event - modifiers: [meta], code: Slash, keyCode: 191, key: /
[KeybindingService]: | Converted keydown event - modifiers: [meta], code: Slash, keyCode: 85 ('/')
[KeybindingService]: | Resolving meta+[Slash]
[KeybindingService]: \ From 2 keybinding entries, matched editor.action.commentLine, when: editorTextFocus && !editorReadonly, source: built-in.
在示例日志中,第一个 keydown 事件是 MetaLeft 键 (cmd),无法被分发。第二个 keydown 事件是 Slash 键 (/),作为 meta+[Slash] 被分发。有两个从 meta+[Slash] 映射的键盘快捷键条目,匹配的是命令 editor.action.commentLine,它具有 when 条件 editorTextFocus && !editorReadonly,并且是一个内置的键盘快捷键条目。
查看修改后的键盘快捷键
要过滤列表以仅显示您修改过的快捷键,请在 更多操作 (More Actions) (...) 菜单中选择 显示用户键位绑定 (Show User Keybindings) 命令。这将对“键盘快捷键”编辑器应用 @source:user 过滤器(即“来源”为“用户”)。

高级自定义
VS Code 会跟踪您在 keybindings.json 文件中自定义的键盘快捷键。对于高级自定义,您也可以直接修改 keybindings.json 文件。
要打开 keybindings.json 文件:
-
打开 键盘快捷键 编辑器,然后选择编辑器标题栏右侧的 打开键盘快捷键 (JSON) 按钮。

-
或者,在命令面板中使用 打开默认键盘快捷键 (JSON) 命令(⇧⌘P (Windows, Linux Ctrl+Shift+P))。
键盘规则
VS Code 中的键盘快捷键配置也称为键盘规则。每个规则由以下属性组成:
key:描述按下的键,例如 ⌘F (Windows, Linux Ctrl+F)。command:要执行的 VS Code 命令的标识符,例如workbench.view.explorer用于打开资源管理器视图。when:(可选)包含布尔表达式的子句,该表达式根据当前上下文进行评估。
和弦快捷键(两个独立的按键动作)通过用空格分隔两个按键来描述。例如,Ctrl+K Ctrl+C。
当按下按键时,应用以下评估规则:
- 规则从底部到顶部进行评估。
- 第一个同时匹配
key和when子句的规则会被采纳。 - 如果找到了规则,则不再处理其他规则。
- 如果找到了规则且设置了
command,则执行该command。
额外的 keybindings.json 规则会在运行时追加到默认规则的底部,从而允许它们覆盖默认规则。keybindings.json 文件由 VS Code 监控,因此在 VS Code 运行时编辑它会更新运行时的规则。
键盘快捷键的分发是通过分析 JSON 表达式的规则列表来完成的。以下是一些示例:
// Keyboard shortcuts that are active when the focus is in the editor
{ "key": "home", "command": "cursorHome", "when": "editorTextFocus" },
{ "key": "shift+home", "command": "cursorHomeSelect", "when": "editorTextFocus" },
// Keyboard shortcuts that are complementary
{ "key": "f5", "command": "workbench.action.debug.continue", "when": "inDebugMode" },
{ "key": "f5", "command": "workbench.action.debug.start", "when": "!inDebugMode" },
// Global keyboard shortcuts
{ "key": "ctrl+f", "command": "actions.find" },
{ "key": "alt+left", "command": "workbench.action.navigateBack" },
{ "key": "alt+right", "command": "workbench.action.navigateForward" },
// Global keyboard shortcuts using chords (two separate keypress actions)
{ "key": "ctrl+k enter", "command": "workbench.action.keepEditor" },
{ "key": "ctrl+k ctrl+w", "command": "workbench.action.closeAllEditors" },
支持的按键
key 由修饰键和按键本身组成。
支持以下修饰键:
| 平台 | 修饰键 |
|---|---|
| macOS | Ctrl+, Shift+, Alt+, Cmd+ |
| Windows | Ctrl+, Shift+, Alt+, Win+ |
| Linux | Ctrl+, Shift+, Alt+, Meta+ |
支持以下按键:
- f1-f19, a-z, 0-9
- `, -, =, [, ], \, ;, ', ,, ., /
- left, up, right, down, pageup, pagedown, end, home
- tab, enter, escape, space, backspace, delete
- pausebreak, capslock, insert
- numpad0-numpad9, numpad_multiply, numpad_add, numpad_separator
- numpad_subtract, numpad_decimal, numpad_divide
命令参数
您可以调用带有参数的命令。如果您经常对特定文件或文件夹执行相同的操作,这非常有用。您可以添加自定义键盘快捷键来精确执行您想要的操作。
以下是一个覆盖 Enter 键以打印某些文本的示例:
{
"key": "enter",
"command": "type",
"args": { "text": "Hello World" },
"when": "editorTextFocus"
}
type 命令将接收 {"text": "Hello World"} 作为其第一个参数,并将“Hello World”添加到文件中,而不是产生默认命令。
有关带参数命令的更多信息,请参阅内置命令。
运行多个命令
可以通过使用 runCommands 命令将键盘快捷键配置为按顺序运行多个命令。
-
运行多个不带参数的命令:
以下示例向下复制当前行,将当前行标记为注释,并将光标移动到复制的行。
{ "key": "ctrl+alt+c", "command": "runCommands", "args": { "commands": [ "editor.action.copyLinesDownAction", "cursorUp", "editor.action.addCommentLine", "cursorDown" ] } }, -
向命令传递参数:
此示例创建一个新的未命名 TypeScript 文件并插入一个自定义片段。
{ "key": "ctrl+n", "command": "runCommands", "args": { "commands": [ { "command": "workbench.action.files.newUntitledFile", "args": { "languageId": "typescript" } }, { "command": "editor.action.insertSnippet", "args": { "langId": "typescript", "snippet": "class ${1:ClassName} {\n\tconstructor() {\n\t\t$0\n\t}\n}" } } ] } },
请注意,由 runCommands 运行的命令会接收 "args" 的值作为第一个参数。在前面的示例中,workbench.action.files.newUntitledFile 接收 {"languageId": "typescript" } 作为其第一个且唯一的参数。
要传递多个参数,您需要将 "args" 设置为数组:
{
"key": "ctrl+shift+e",
"command": "runCommands",
"args": {
"commands": [
{
// command invoked with 2 arguments: vscode.executeCommand("myCommand", "arg1", "arg2")
"command": "myCommand",
"args": ["arg1", "arg2"]
}
]
}
}
要将数组作为第一个参数传递,请将该数组包装在另一个数组中:"args": [ [1, 2, 3] ]。
移除键盘快捷键
要移除键盘快捷键,请在“键盘快捷键”编辑器中右键点击该条目,然后选择 移除键位绑定 (Remove Keybinding)。
要通过 keybindings.json 文件移除键盘快捷键,请在 command 前面添加一个 -,该规则即成为移除规则。
这是一个示例:
// In Default Keyboard Shortcuts
...
{ "key": "tab", "command": "tab", "when": ... },
{ "key": "tab", "command": "jumpToNextSnippetPlaceholder", "when": ... },
{ "key": "tab", "command": "acceptSelectedSuggestion", "when": ... },
...
// To remove the second rule, for example, add in keybindings.json:
{ "key": "tab", "command": "-jumpToNextSnippetPlaceholder" }
要用空操作覆盖特定的键盘快捷键规则,您可以指定一个空命令:
// To override and disable any `tab` keyboard shortcut, for example, add in keybindings.json:
{ "key": "tab", "command": "" }
键盘布局
此部分仅涉及键盘快捷键,不涉及编辑器中的输入。
按键是虚拟键的字符串表示,并不一定与按下时产生的字符相关。更准确地说:
- 参考:虚拟键码 (Windows)
- tab 对应
VK_TAB(0x09) - ; 对应
VK_OEM_1(0xBA) - = 对应
VK_OEM_PLUS(0xBB) - , 对应
VK_OEM_COMMA(0xBC) - - 对应
VK_OEM_MINUS(0xBD) - . 对应
VK_OEM_PERIOD(0xBE) - / 对应
VK_OEM_2(0xBF) - ` 对应
VK_OEM_3(0xC0) - [ 对应
VK_OEM_4(0xDB) - \ 对应
VK_OEM_5(0xDC) - ] 对应
VK_OEM_6(0xDD) - ' 对应
VK_OEM_7(0xDE) - 等等。
不同的键盘布局通常会重新定位这些虚拟键或改变按下它们时产生的字符。当使用非标准 US 布局的键盘布局时,Visual Studio Code 会执行以下操作:
所有键盘快捷键都使用当前系统的键盘布局在 UI 中渲染。例如,使用法语(法国)键盘布局时,拆分编辑器 (Split Editor) 现在渲染为 Ctrl+*。

编辑 keybindings.json 时,VS Code 会高亮显示容易产生误导的键盘快捷键,即那些在文件中以标准 US 键盘布局下的字符表示,但在当前系统键盘布局下需要按下不同标签键的快捷键。例如,以下是在使用法语(法国)键盘布局时默认键盘快捷键规则的样子:

还有一个 UI 控件可以帮助在编辑 keybindings.json 时输入键盘快捷键规则。要启动 定义键位绑定 (Define Keybinding) 控件,请按 ⌘K ⌘K (Windows, Linux Ctrl+K Ctrl+K)。该控件会监听按键,并在文本框中渲染序列化的 JSON 表示形式,并在下方显示 VS Code 在您当前键盘布局下检测到的按键。一旦输入了想要的组合键,就可以按 Enter,系统会插入一个规则片段。

在 Linux 上,VS Code 会在启动时检测您当前的键盘布局并缓存此信息。我们建议您在更改键盘布局时重启 VS Code。
独立于键盘布局的绑定
通过使用扫描码,可以定义不随键盘布局改变而改变的键盘快捷键。例如:
{ "key": "cmd+[Slash]", "command": "editor.action.commentLine", "when": "editorTextFocus" }
支持的扫描码:
- [F1]-[F19], [KeyA]-[KeyZ], [Digit0]-[Digit9]
- [Backquote], [Minus], [Equal], [BracketLeft], [BracketRight], [Backslash], [Semicolon], [Quote], [Comma], [Period], [Slash]
- [ArrowLeft], [ArrowUp], [ArrowRight], [ArrowDown], [PageUp], [PageDown], [End], [Home]
- [Tab], [Enter], [Escape], [Space], [Backspace], [Delete]
- [Pause], [CapsLock], [Insert]
- [Numpad0]-[Numpad9], [NumpadMultiply], [NumpadAdd], [NumpadComma]
- [NumpadSubtract], [NumpadDecimal], [NumpadDivide]
when 条件上下文
VS Code 通过可选的 when 子句,让您可以精确控制键盘快捷键何时启用。如果您的键盘快捷键没有 when 子句,它将全局随时可用。when 子句会评估为 true 或 false,以决定是否启用键盘快捷键。
VS Code 根据 UI 中哪些元素可见且处于活动状态,设置各种上下文键和特定值。例如,内置的 开始调试 (Start Debugging) 命令具有键盘快捷键 F5,它仅在有合适的调试器可用(上下文 debuggersAvailable 为 true)且编辑器不在调试模式下(上下文 inDebugMode 为 false)时启用。

您也可以直接在默认的 keybindings.json(首选项: 打开默认键盘快捷键 (JSON))中查看键盘快捷键的 when 子句。
{ "key": "f5", "command": "workbench.action.debug.start",
"when": "debuggersAvailable && !inDebugMode" },
条件运算符
对于 when 子句的条件表达式,以下条件运算符对键盘快捷键非常有用:
| 运算符 | 符号 | 示例 |
|---|---|---|
| 相等 | == |
"editorLangId == typescript" |
| 不等 | != |
"resourceExtname != .js" |
| 或 (Or) | || |
"isLinux||isWindows" |
| 与 (And) | && |
"textInputFocus && !editorReadonly" |
| 匹配 (Matches) | =~ |
"resourceScheme =~ /^untitled$|^file$/" |
您可以在 when 子句上下文参考中找到 when 子句条件运算符的完整列表。
可用上下文
您可以在 when 子句上下文参考中找到一些可用的 when 子句上下文。
该列表并不详尽,您可以通过在“键盘快捷键”编辑器(首选项: 打开键盘快捷键)中搜索和过滤,或查看默认的 keybindings.json 文件(首选项: 打开默认键盘快捷键 (JSON))来找到其他 when 子句上下文。
重构自定义键盘快捷键
editor.action.codeAction 命令允许您为特定的重构 (代码操作) 配置键盘快捷键。例如,下面的快捷键触发 提取函数 (Extract function) 重构代码操作:
{
"key": "ctrl+shift+r ctrl+e",
"command": "editor.action.codeAction",
"args": {
"kind": "refactor.extract.function"
}
}
这一点在重构文章中有深入介绍,在那里您可以了解不同类型的代码操作以及如何在有多个重构可能时对它们进行优先级排序。
相关资源
常见问题
如何找出某个特定按键绑定到了什么命令?
在“键盘快捷键”编辑器中,您可以过滤特定的按键,查看哪些命令绑定到了哪些按键。在下方的截图中,您可以看到 Ctrl+Shift+P 绑定到了 显示所有命令 (Show All Commands) 以调出命令面板。

如何给操作添加键盘快捷键,例如给“删除行”添加 Ctrl+D
在 默认键盘快捷键 中找到触发该操作的规则,并在您的 keybindings.json 文件中编写它的修改版本。
// Original, in Default Keyboard Shortcuts
{ "key": "ctrl+shift+k", "command": "editor.action.deleteLines",
"when": "editorTextFocus" },
// Modified, in User/keybindings.json, Ctrl+D now will also trigger this action
{ "key": "ctrl+d", "command": "editor.action.deleteLines",
"when": "editorTextFocus" },
如何仅针对特定文件类型添加键盘快捷键?
在 when 子句中使用 editorLangId 上下文键。
{ "key": "shift+alt+a", "command": "editor.action.blockComment",
"when": "editorTextFocus && editorLangId == csharp" },
我已经在 keybindings.json 中修改了键盘快捷键,为什么它们不生效?
最常见的问题是文件中存在语法错误。否则,尝试移除 when 子句或选择不同的 key。遗憾的是,目前这主要是一个反复试验的过程。