尝试以扩展 VS Code 中的代理模式!

Visual Studio Code 的键盘快捷键

Visual Studio Code 允许你直接通过键盘执行大部分任务。本文介绍了如何修改 VS Code 自带的默认键盘快捷键。

注意

如果你在 Mac 上访问此页面,你将看到 Mac 的键盘快捷键。如果你使用 Windows 或 Linux 访问,你将看到该平台的按键。如果你需要其他平台的键盘快捷键,请将鼠标悬停在你感兴趣的按键上。

键盘快捷方式编辑器

VS Code 提供了丰富的键盘快捷键编辑体验,即键盘快捷键编辑器。该编辑器列出了所有可用的命令,无论它们是否绑定了快捷键,并允许你使用可用的操作来更改、删除或重置它们的键盘快捷键。要查找命令或键盘快捷键,请使用搜索框并输入命令或快捷键来筛选列表。

要打开键盘快捷键编辑器,请选择 文件 > 首选项 > 键盘快捷方式 菜单,或在命令面板中使用 首选项:打开键盘快捷方式 命令 (⌘K ⌘S (Windows、Linux 为 Ctrl+K Ctrl+S))。

Keyboard Shortcuts

注意

键盘快捷键与你当前的键盘布局相匹配。例如,在美国键盘布局中的键盘快捷键 Cmd+\,在布局更改为德语后将显示为 Ctrl+Shift+Alt+Cmd+7。用于更改键盘快捷键的对话框会根据你的键盘布局分配正确且所需的键盘快捷键。

自定义 UI 操作的快捷键

要为 UI 操作自定义键盘快捷键,请右键单击工作台中的任何操作项,然后选择配置键绑定。这会打开键盘快捷键编辑器,并筛选到相应的命令。如果该操作有 when 子句,它会自动包含进来,使你更容易按照自己的需要设置键盘快捷键。

键盘映射扩展

键盘映射扩展会修改 VS Code 的快捷键,使其与其他编辑器的快捷键相匹配,这样你就不需要学习新的键盘快捷键了。

选择 文件 > 首选项 > 从...迁移键盘快捷方式 菜单,以获取常用键盘映射扩展的列表。在 Marketplace 中还有一个 键盘映射类别 的扩展。

键盘快捷键参考

我们有一个可打印版本的默认键盘快捷键。选择帮助 > 键盘快捷方式参考,以显示一个简化的 PDF 版本,适合打印作为便捷参考。

以下链接提供了三个特定平台版本(美式英语键盘)的访问权限

检测键盘快捷键冲突

如果你安装了许多扩展或修改了键盘快捷键,可能会出现键盘快捷键冲突,即同一个键盘快捷键被映射到多个命令。这可能会导致令人困惑的行为,特别是当你在编辑器中移动时,不同的键盘快捷键会进出作用域。

在键盘快捷键列表中的某个项目上右键单击,然后选择显示相同的键绑定,以查看所有具有相同键盘快捷键的条目。

show keyboard shortcut conflicts menu

排查键盘快捷键问题

要排查键盘快捷键问题,你可以执行命令开发人员:切换键盘快捷方式故障排除。这将激活对已调度键盘快捷键的日志记录,并打开带有相应日志文件的输出面板。

然后你可以按下你想要的键盘快捷键,并检查 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,并且是一个内置的键盘快捷键条目。

查看已修改的键盘快捷键

要筛选列表以仅显示你已修改的快捷键,请在更多操作 (...) 菜单中选择显示用户键绑定命令。这会将 @source:user 筛选器应用到键盘快捷方式编辑器(来源为“用户”)。

Default Keyboard Shortcuts

高级自定义

VS Code 在 keybindings.json 文件中跟踪你已自定义的键盘快捷键。对于高级自定义,你也可以直接修改 keybindings.json 文件。

要打开 keybindings.json 文件

  • 打开键盘快捷方式编辑器,然后选择编辑器标题栏右侧的打开键盘快捷方式 (JSON) 按钮。

    Open Keyboard Shortcuts JSON button

  • 或者,在命令面板 (⇧⌘P (Windows、Linux 为 Ctrl+Shift+P)) 中使用打开默认键盘快捷方式 (JSON) 命令。

键盘规则

VS Code 中的键盘快捷键配置也称为键盘规则。每个规则由以下属性组成

  • key:描述按下的键,例如 ⌘F (Windows、Linux 为 Ctrl+F)
  • command:要执行的 VS Code 命令的标识符,例如 workbench.view.explorer 用于打开资源管理器视图。
  • when:(可选)包含布尔表达式的子句,该表达式将根据当前上下文进行求值。

组合键(两次独立的按键操作)通过用空格分隔两次按键来描述。例如,Ctrl+K Ctrl+C

当按下某个键时,将应用以下求值规则

  • 规则从进行求值。
  • 第一个同时匹配 keywhen 子句的规则被接受。
  • 如果找到一个规则,则不再处理其他规则。
  • 如果找到一个规则并且它设置了 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] ]

删除键盘快捷键

要删除键盘快捷键,请在键盘快捷键编辑器中的条目上右键单击,然后选择删除键绑定

要使用 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)
  • VK_TAB (0x09) 对应 tab
  • 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) 对应 '
  • 等等。

不同的键盘布局通常会重新定位这些虚拟键或更改按下它们时产生的字符。当使用与标准美国键盘不同的键盘布局时,Visual Studio Code 会执行以下操作

所有键盘快捷键都使用当前系统的键盘布局在 UI 中呈现。例如,在使用法语(法国)键盘布局时,拆分编辑器现在呈现为 Ctrl+*

render keyboard shortcut

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

keybindings.json guidance

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

keyboard shortcut widget

注意

在 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 根据 VS Code UI 中可见和活动的元素设置各种上下文键和特定值。例如,内置的开始调试命令的键盘快捷键是 F5,它仅在有合适的调试器可用(上下文 debuggersAvailable 为 true)且编辑器不处于调试模式(上下文 inDebugMode 为 false)时才启用。

Start Debugging when clause in the Keyboard Shorts editor

您也可以直接在默认的 keybinding.json (首选项:打开默认键盘快捷方式 (JSON)) 文件中查看键盘快捷键的 when 子句。

{ "key": "f5",  "command": "workbench.action.debug.start",
                   "when": "debuggersAvailable && !inDebugMode" },

条件运算符

对于 when 子句的条件表达式,以下条件运算符对键盘快捷键很有用

运算符 符号 示例
相等 == "editorLangId == typescript"
不相等 != "resourceExtname != .js"
|| "isLinux||isWindows"
&& "textInputFocus && !editorReadonly"
匹配 =~ "resourceScheme =~ /^untitled$|^file$/"

您可以在 when 子句上下文参考中找到 when 子句条件运算符的完整列表。

可用上下文

您可以在 when 子句上下文参考中找到一些可用的 when 子句上下文。

那里的列表并不详尽,您可以通过在键盘快捷键编辑器(首选项:打开键盘快捷方式)中搜索和筛选,或查看默认的 keybindings.json 文件(首选项:打开默认键盘快捷方式 (JSON))来查找其他的 when 子句上下文。

重构的自定义键盘快捷键

editor.action.codeAction 命令允许您为特定的重构(代码操作)配置键盘快捷键。例如,下面的键盘快捷键触发了提取函数重构代码操作

{
  "key": "ctrl+shift+r ctrl+e",
  "command": "editor.action.codeAction",
  "args": {
    "kind": "refactor.extract.function"
  }
}

这在重构文章中有深入的介绍,在那里您可以了解到不同类型的代码操作以及在有多种可能重构时如何确定它们的优先级。

常见问题

我如何找出哪个命令绑定到了特定的键?

在键盘快捷键编辑器中,您可以按特定的按键组合进行筛选,以查看哪些命令绑定到了哪些键。在下面的截图中,您可以看到 Ctrl+Shift+P 绑定到显示所有命令以调出命令面板。

Keyboard shortcuts quick outline

如何为一个操作添加键盘快捷键,例如,为“删除行”添加 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。不幸的是,在这一点上,这是一个反复试验的过程。