cmd+shift+p、cmd+shift+l等shift组合键失效主因是macos系统或搜狗/百度输入法劫持,sublime根本未收到按键;应先用sublime.log_input(true)验证,再于系统设置→键盘→快捷键→输入源中禁用“选择上一个输入法”。

Shift 组合键(如 Cmd+Shift+P、Cmd+Shift+L)在 Sublime 中失效,90% 不是插件或配置问题,而是被 macOS 系统或中文输入法直接拦截——Sublime 根本收不到按键事件。
Cmd+Shift+P 命令面板打不开?先确认它进没进 Sublime
按 Ctrl+` 打开控制台,输入 sublime.log_input(True) 回车,再按 Cmd+Shift+P。如果控制台完全没输出,说明按键被系统或输入法劫持了。
- macOS 系统设置 → 键盘 → 快捷键 → 「Spotlight」里默认占用了
Cmd+Space,但部分版本会连带影响Cmd+Shift+P;更常见的是「输入源」中启用了Cmd+Shift+P作为「选择上一个输入法」 - 搜狗、百度输入法默认用
Cmd+Shift+P切换中英文,且不透传给应用 - 临时切到系统自带「简体中文-拼音」输入法测试:若此时
Cmd+Shift+P恢复,就坐实是第三方输入法问题 - 禁用路径:系统设置 → 键盘 → 快捷键 → 输入源 → 取消勾选「选择上一个输入法」或将其改为
Ctrl+Space
Cmd+Shift+L 多行光标不生效?别急着改 keymap
这个组合默认触发 split_selection_into_lines,但它在 macOS 下极易被输入法劫持(尤其是搜狗/百度默认绑定 Cmd+Shift+L 为中英文切换),根本不会抵达 Sublime。
- 验证方式同上:
sublime.log_input(True)+ 按键,无输出 = 被截断 - 不要在
Key Bindings – User里强行加{"keys": ["cmd+shift+l"], "command": "split_selection_into_lines"}——如果按键压根没进来,这条绑定毫无意义 - 若确认按键已进入 Sublime(控制台有输出),再查加载顺序:左侧
Default中搜"cmd+shift+l",右侧User和所有插件的Default.sublime-keymap(如Packages/Vintage/)中全局搜索,看谁最后覆盖了它 - Vintage 插件常静默接管
Cmd+Shift+L,关掉它或改用安全模式subl --safe-mode验证
User.sublime-keymap 写错 JSON 就等于没写
哪怕只是多了一个逗号、用了中文引号、或在数组末尾加了注释,整个 User.sublime-keymap 文件都会被 Sublime 静默忽略——右下角可能只闪一下红字提示,稍不留神就错过。
- 必须是纯 JSON 数组格式:
[{"keys": ["ctrl+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"}}] - 所有字符串(包括
keys、command、args的值)必须用英文双引号包裹,"keys"不是keys - 数组结尾不能有多余逗号:
["ctrl+shift+p"],是错的,["ctrl+shift+p"]才对 - JSON 不支持
//注释,想临时禁用某条绑定,直接删整行,或改成无效命令:"command": "not_a_real_command"
Esc、Cmd+B 这类键根本不在 Key Bindings 管辖范围内
它们是 Sublime 内核硬编码行为,不走任何 .sublime-keymap 流程。你在 User 里加 {"keys": ["escape"], "command": "hide_panel"} 不仅无效,还可能破坏原生逻辑(比如按 Esc 后命令面板卡住不关闭)。
-
Cmd+B在 macOS 上常被 Finder 或 Dock 的「显示/隐藏边栏」功能占用,这不是 Sublime 配置问题,而是系统级「应用无关快捷键」 - 排查路径:系统设置 → 键盘 → 快捷键 → 应用快捷键 → 搜索
Cmd+B,删掉 Finder 或 Dock 的对应条目 - 这类键无法通过修改
User.sublime-keymap修复,只能从系统层或插件配置(如 Vintage 设置"exit_insert_mode_on_escape": false)入手
真正卡住人的地方,往往不是“怎么加新快捷键”,而是没意识到 Shift 组合键在 macOS 下特别容易被输入法和系统服务提前吞掉——先用 sublime.log_input(True) 看一眼控制台有没有输出,比翻十遍 keymap 文件都管用。











