如何使用VS Code API为扩展注册Key Chord(按键序列)
VS Code 注册按键序列(Key Chord)实现方案
VS Code 原生支持两种常见的按键序列注册方式,分别对应你提到的完整固定序列和可扩展起始键两种场景:
1. 注册完整固定按键序列
如果你要注册的是类似ctrl+e a这种固定的两步按键组合,不需要动态扩展后续按键,直接在扩展的package.json中配置即可,无需额外编写逻辑:
{ "contributes": { "keybindings": [ { "command": "你的扩展ID.对应触发的命令ID", "key": "ctrl+e a", // 多步按键用空格分隔即可 "mac": "cmd+e a", // Mac平台适配可选 "when": "editorTextFocus" // 生效场景,按需配置 } ] } }
这种方式是VS Code原生支持的,所有按键匹配逻辑由编辑器内核处理,性能最优。
2. 注册可扩展的起始绑定键(类似原生ctrl+k效果)
如果你要实现按下起始键后进入等待输入状态、支持动态匹配任意后续按键的效果,需要通过VS Code API配合上下文变量模拟实现,步骤如下:
第一步:配置基础绑定
在package.json中声明起始键、后续按键的绑定和对应命令:
{ "contributes": { "commands": [ { "command": "你的扩展ID.startChordMode", "title": "启动自定义按键序列模式" }, { "command": "你的扩展ID.chordActionA", "title": "序列第一步后按a触发的命令" } ], "keybindings": [ // 起始键绑定,仅非序列模式下生效 { "command": "你的扩展ID.startChordMode", "key": "ctrl+e", "when": "!inCustomChordMode" }, // 后续按键绑定,仅序列模式下生效 { "command": "你的扩展ID.chordActionA", "key": "a", "when": "inCustomChordMode" } ] } }
第二步:编写序列模式逻辑
在扩展激活代码中实现序列模式的触发、超时退出、逻辑执行:
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { let tempCommandDisposables: vscode.Disposable[] = []; let chordTimeout: NodeJS.Timeout | null = null; // 清理序列模式的通用方法 const clearChordMode = async () => { if (chordTimeout) clearTimeout(chordTimeout); // 重置上下文标记 await vscode.commands.executeCommand('setContext', 'inCustomChordMode', false); // 销毁临时注册的命令 tempCommandDisposables.forEach(d => d.dispose()); tempCommandDisposables = []; }; // 注册起始键触发的命令 const startChordCmd = vscode.commands.registerCommand( '你的扩展ID.startChordMode', async () => { // 标记进入序列模式 await vscode.commands.executeCommand('setContext', 'inCustomChordMode', true); // 注册后续按键对应的执行逻辑 tempCommandDisposables.push( vscode.commands.registerCommand('你的扩展ID.chordActionA', () => { vscode.window.showInformationMessage('触发了 ctrl+e a 序列'); clearChordMode(); }) ); // 3秒无操作自动退出序列模式 chordTimeout = setTimeout(() => { clearChordMode(); }, 3000); } ); context.subscriptions.push(startChordCmd); }
注意:这种方式需要自行处理序列的退出逻辑,避免用户误进入序列模式后普通按键失效。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

