直接改User.sublime-keymap即可实现Emacs键位映射,需用super代替ctrl以确保macOS/Windows/Linux三端统一生效,粘贴合法JSON数组格式规则后保存即生效,无需重启或插件。

直接改 User.sublime-keymap 就行,别装插件
Sublime Text 本身不内置 Emacs 键位,但完全支持手动映射——而且比装第三方插件更稳、更可控。所谓“一键导入”,本质就是往 User.sublime-keymap 里塞一组 JSON 规则,保存即生效,不用重启、不依赖插件加载顺序。
常见错误是试图找“Emacs 插件”或复制网上不带平台适配的配置,结果 ctrl+b 在 macOS 上根本不动(因为 macOS 把 ctrl 当 Control 键,不是 super)。真正能跨平台工作的写法必须用 super 表示 Command(macOS)/Ctrl(Windows/Linux)。
- 打开 Preferences → Key Bindings – User,确保右侧是可编辑的 JSON 数组
- 粘贴时确认整个内容是合法 JSON:外层是方括号
[...],每条规则是对象,"keys"和"command"都用双引号,末尾不能有逗号 - 别把 Emacs 的
ctrl+e直接写成["ctrl+e"],要写成["super+e"]才能在三端统一生效
必须替换的几个核心移动命令
Emacs 用户最依赖的是光标精确定位能力,move_to 和 move 这两个命令就能覆盖 ctrl+a/e/b/f/p/n 全套。注意参数差异:move_to 用于行首/行尾,move 用于字符/行级偏移。
以下是最小可用集合(已做平台适配):
[
{"keys": ["super+a"], "command": "move_to", "args": {"to": "bol", "extend": false}},
{"keys": ["super+e"], "command": "move_to", "args": {"to": "eol", "extend": false}},
{"keys": ["super+b"], "command": "move", "args": {"by": "characters", "forward": false}},
{"keys": ["super+f"], "command": "move", "args": {"by": "characters", "forward": true}},
{"keys": ["super+p"], "command": "move", "args": {"by": "lines", "forward": false}},
{"keys": ["super+n"], "command": "move", "args": {"by": "lines", "forward": true}}
]
⚠️ 容易踩的坑:
-
move_to的"to": "bol"是行首(begin of line),不是文件头;"eol"是行尾,不是文件尾 - 如果同时装了 Vintage(Vim 模式)插件,它默认会劫持
super+...组合——关掉它或优先禁用:Ctrl+Shift+P→Package Control: Disable Package→Vintage - macOS 用户若启用了系统级“将 Caps Lock 映射为 Ctrl”,会导致
super实际触发的是 Command 键,和预期一致;但若映射为 Control,则super+b会失效
为什么 escape 不能绑定、ctrl+space 常失灵
这两个键在 Sublime Text 里属于硬编码行为,不受 User.sublime-keymap 控制。escape 用来关闭面板、取消选择、退出多选等,内核强制接管;你加 {"keys": ["escape"], "command": "xxx"} 不仅无效,还可能让搜索框卡住不关闭。
ctrl+space 失灵更常见于输入法冲突:
- 搜狗、QQ 拼音等中文输入法默认拦截
ctrl+space切换中英文,Sublime 根本收不到按键事件 - macOS 系统设置 → 键盘 → 快捷键 → 输入源里,也可能启用了
cmd+space触发 Spotlight,间接影响 - 验证方法:切到英文输入法,再按
ctrl+space;或者用sublime.log_input(True)在控制台看是否输出日志
真要用自动补全,建议改用 super+space 或 alt+/(后者在多数插件里已预设为 auto_complete)。
Context 限制导致快捷键“有时有效、有时失效”
比如你绑了 super+k 执行 kill_line,但在命令面板(Command Palette)弹出时按它没反应——这不是配置错了,而是 Sublime 默认给很多命令加了 "context" 条件,只在特定界面状态生效。
查默认绑定位置:Preferences → Key Bindings – Default,搜索 kill_line,你会看到类似:
{"keys": ["ctrl+shift+k"], "command": "kill_line", "context":
[{"key": "setting.is_widget", "operator": "equal", "operand": false}]}
这意味着该命令只在非 widget 区域(即编辑区)生效。如果你也想让它全局可用,自定义时就不要加 context 字段;但如果想模仿原生行为,就得照抄上下文条件。
复杂点在于:同一组合键在不同 context 下可能绑定不同命令。比如 super+/ 在普通编辑区是注释,在查找面板里可能是切换正则模式——表面没冲突,实则是条件性覆盖。


















