You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:45:01