根本原因是language server未真正启动或客户端未正确绑定文件类型;需检查lsp面板输出、server安装与配置、插件冲突、多语言文件作用域及诊断性能设置。

为什么 LSP 在 Sublime Text 里不报错却没诊断提示?
根本原因通常是服务端(Language Server)没真正启动,或客户端(Sublime LSP 插件)没正确绑定到文件类型。常见现象包括:保存后无波浪线、hover 不显示类型、go to definition 失效——但控制台也无明显报错。
实操建议:
- 打开 Sublime 控制台(
Ctrl+`),输入view.window().run_command("lsp_show_panel")查看 LSP 面板输出;若为空或只显示starting...卡住,说明 server 启动失败 - 确认已安装对应语言的 server,比如 Python 要装
pylsp(不是pyls,后者已归档停更),执行pip install python-lsp-server - 检查
LSP.sublime-settings中是否漏写了"enabled": true或"settings"块位置错误(必须在 language-specific 配置内)
LSP.sublime-settings 中如何为 Python 正确配置 pylsp?
配置错位是高频问题:server 可执行路径、初始化选项、file watcher 规则都得对齐 pylsp 的实际行为。例如 pylsp 默认不启用 flake8,不显式开启就看不到 PEP8 提示。
实操建议:
- 确保
"command"指向真实可执行文件,如["python", "-m", "pylsp"];避免写成["pylsp"](系统 PATH 可能不可靠) - 在
"initializationOptions"下添加"plugins.flake8.enabled": true才能触发语法风格诊断 - 若项目用
venv,需在"settings"中设"pylsp.plugins.jedi.environment": "/path/to/venv",否则 import 提示会缺失 - 禁用冲突插件:
SublimeCodeIntel和Anaconda必须卸载,它们会劫持on_hover事件导致 LSP hover 失效
如何让 LSP 识别 .vue 或 .astro 这类多语言文件的 script 区块?
LSP 默认只按文件后缀绑定 server,.vue 会被当作文本处理,script 里的 TypeScript 完全不进 typescript-language-server 流程。
实操建议:
- 在
LSP.sublime-settings的"clients"下为typescript-language-server添加"selector": "source.ts, source.js, embedded.source.ts, embedded.source.js" - 配合
Vue Syntax Highlight插件,并确认其语法定义中<script></script>块 scope 是embedded.source.ts(可通过Ctrl+Shift+P → Show Scope Name验证) - 对
.astro,需额外在astro-language-server配置中启用"astro.enableTsPlugin": true,否则 TS 类型诊断不会进入 script 标签
诊断延迟高、CPU 占满,是不是 LSP 配置太激进了?
是。默认开启全部插件(如 mypy、black 格式化、eslint 全量扫描)会导致单次保存触发多重同步分析,尤其在 node_modules 或 __pycache__ 目录未排除时。
实操建议:
- 在 server 的
"settings"中关闭非必要插件,例如pylsp下设"plugins.mypy.enabled": false(除非真需要 mypy 类型检查) - 用
"file_watcher_exclude_patterns"排除大目录:"**/node_modules/**", "**/__pycache__/**", "**/.git/**" - 限制诊断触发时机:将
"diagnostics_delay_ms"从默认0改为300,避免 keystroke 实时抖动触发 - 禁用自动格式化(
"format_on_save"设为false),改用手动Ctrl+Shift+P → LSP: Format Document,更可控
最易被忽略的是 file watcher 排除规则——它不写在 LSP 配置顶层,而必须嵌套在每个 language client 的 "settings" 里,漏掉就等于没关。











