sublime text的lsp快捷键必须配置在user.sublime-keymap中,使用插件注册的真实命令名(如lsp_goto_definition)并配合精确scope匹配的context规则,否则无效。

快捷键必须写在 User.sublime-keymap,不是 LSP 设置里
Sublime Text 的 LSP 功能(比如跳转定义、查看类型、触发补全)本身不自带快捷键;所有按键绑定都得走标准的 User.sublime-keymap 文件。你找不到「LSP → Key Bindings」菜单,也别去 LSP.sublime-settings 或 LanguageServers.sublime-settings 里写 "keys" 字段——那不会生效,Sublime 会直接忽略。
用 command 名匹配 LSP 插件提供的真实命令
LSP 插件注册的命令名不是凭空猜的,比如“跳转到定义”不是 "goto_definition",而是 "lsp_symbol_info"、"lsp_goto_definition" 这类固定命名。最稳的方式是:
- 按
Ctrl+Shift+P输入LSP: Goto Definition,看命令面板里显示的完整条目名(注意大小写和下划线) - 或打开控制台
Ctrl+`,输入sublime.log_commands(True),再手动点一次菜单里的对应功能,控制台会输出类似:command: lsp_goto_definition {"event": {"text_command": "lsp_goto_definition"}} - 确认该命令已安装:如果命令面板里搜不到,说明 LSP 插件没装好,或当前文件语法不匹配(比如 .py 文件没设成
source.python)
加 context 限定只在支持 LSP 的语法下生效
直接绑 ctrl+click 或 F12 全局生效很危险——你在 Markdown 或纯文本里按了也会报错或无响应。必须用 context 锁定作用范围:
- 先按
Ctrl+Alt+Shift+P(Win/Linux)或Cmd+Alt+Shift+P(macOS)查当前 scope,比如 Python 是source.python,TypeScript 是source.ts - 在
User.sublime-keymap里写规则时,context必须和 scope 完全一致,不能简写为python或漏掉source. - 多个语言要共用同一快捷键?不能合并写
"operand": "source.python | source.ts",得拆成两条独立规则,每条配一个selector - 示例(只在 Python 文件中用
alt+enter触发重命名):[{"keys": ["alt+enter"], "command": "lsp_rename", "context": [{"key": "selector", "operator": "equal", "operand": "source.python"}]}]
常见失效原因:command 写对了,但 context 没配准或 scope 查错了
很多人测试时发现快捷键点了没反应,翻来覆去改 command,其实问题常出在 context:
- 右下角显示的是
Python,但实际 scope 是source.python.django或source.python.embedded.html—— 这时"operand": "source.python"就不匹配,得写全 - 用了
"selection_empty"却忘了光标正选中一段文本,导致条件不满足 - 把
"key": "setting.is_widget"之类无关 context 粘贴进来,干扰判断 - JSON 格式错误(比如多逗号、中文引号),Sublime 不报错,但整条规则静默失效
scope 匹配是最容易被跳过的环节,但它恰恰是 LSP 快捷键能否活起来的开关。不查 scope 直接抄网上的 selector,大概率白忙一场。











