vscode原生不支持快捷键录制,ctrl+q等组合无效;可靠方案是用multi-command扩展,通过精准command id串联合法内置命令并绑定快捷键实现伪宏。

VSCode 原生不支持快捷键录制——你按 Ctrl+Q 或类似组合,不会弹出“开始录制”提示,这不是插件没装对,是底层压根没这个机制。所有能“录”的扩展,本质都是模拟或映射,可靠路径只有一条:用真实命令 ID 组合 + 可控执行环境。
multi-command 的 sequence 怎么写才不崩
它不是万能流水线,而是裸指令发射器:发完前一条,不管它是否成功,立刻发下一条。所以顺序、上下文、命令兼容性必须人工兜底。
- command ID 必须 100% 正确,大小写、点号、空格都不能错;在命令面板(Ctrl+Shift+P)搜到后右键「复制 ID」最保险,别靠记忆手敲
editor.action.formatDocument - 避免在 sequence 里塞需要交互的命令,比如
git.commit(弹输入框)、editor.action.insertSnippet(tab 跳转会丢焦点)、editor.action.clipboardCopyAction(剪贴板可能为空或被其他程序覆盖) - 光标类命令要慎用方向键(如
cursorLeft),在中文、emoji、全角字符行里容易偏移;优先用语义化命令,比如cursorHome+editor.action.insertLineAfter - sequence 中可混用
default:type,但注意:换行必须写成\n,不能用回车;中文需确保文件编码为 UTF-8,否则{"text": "console.log('测试');"}可能乱码
Macros 插件里怎么模拟“输入文字”操作
Macros(geddski 版)不提供录制按键流,但支持 default:type 命令注入文本——这是唯一安全的“打字”方式,比任何系统级宏工具都稳,因为它是编辑器 API 层直接插入,不受输入法、焦点切换影响。
- 写法固定:
{"command": "default:type", "args": {"text": "// TODO: "}},注意 key 是default:type,不是type或editor.action.type - 如果要插入带变量的内容(比如当前文件名),Macros 本身做不到;得换
vscode-macros这类脚本型扩展,用 JavaScript 读取vscode.window.activeTextEditor?.document.fileName - 多个
default:type连续写,不会有延迟或丢字;但若中间夹了异步命令(如格式化),建议加workbench.action.files.save同步触发,避免文本插入后被自动格式化抹掉缩进
为什么别用 AutoHotkey 录 VSCode 宏
它能录下 Ctrl+Shift+P → 输入 “format” → 回车,但 VSCode 在后台时、终端聚焦时、输入法处于中文状态时,这些按键根本不会进编辑器进程——AHK 发的是系统级扫描码,VSCode 收不到。
- 典型失效场景:你在写 Markdown,切到浏览器查文档,回来按宏快捷键 → AHK 把 Ctrl+Shift+P 发给了浏览器,而不是 VSCode
- 多光标编辑下,AHK 按一次方向键,可能只移动主光标,其余光标不动;而
cursorMove命令会同步作用于所有活动光标 - VSCode 的命令有上下文感知,比如
editor.action.commentLine在 JS 文件里加//,在 Python 里加#;AHK 只能硬编码,无法自适应
宏配置该放用户级还是项目级
放项目级(.vscode/settings.json)更合理,尤其当宏涉及团队协作流程,比如统一的日志模板插入、API 请求代码块生成。
- 项目级配置会被 Git 跟踪,新人 clone 后开箱即用;用户级配置(
$HOME/.vscode/settings.json)只在本地生效 - 注意
keybindings.json不支持项目级,必须放用户级;所以快捷键绑定仍是个人偏好,但宏定义本身可以共享 - 跨平台风险:Windows 用
ctrl+alt+f,macOS 可能得改成cmd+alt+f;项目级 settings.json 里只放 command 定义,keybinding 单独由各人配
真正难的不是写几行 JSON,而是判断哪一步该用命令、哪一步必须写脚本、哪一步干脆不该自动化——比如“选中一段正则替换”,用 editor.action.replaceAll 很快,但“根据函数名动态生成单元测试桩”,就得上 vscode-macros 读 AST 了。别把所有“重复操作”都塞进 macro 字段,先问一句:它是否真能脱离上下文稳定执行。











