会冲突,且极易发生——当 selector 重叠、command 不可执行或语法 scope 不匹配时,lsp 将静默失效或仅启用一个服务器;sublime 的 lsp 插件对同一 selector 只保留最后加载的定义,导致先配置的服务器(如 pylsp)被后加载的(如 ruff-lsp)完全覆盖,不报错却丢功能。

会冲突,而且非常容易——不是“可能”,而是只要 selector 重叠、command 不可执行、或语法 scope 不匹配,LSP 就会静默失效或只启用其中一个服务器。
为什么两个 LSP 客户端会互相覆盖
Sublime 的 LSP 插件对同一 selector 值只保留最后一个定义。比如你同时写了:
"pylsp": { "selector": "source.python", ... },
"ruff-lsp": { "selector": "source.python", ... }
后加载的 ruff-lsp 会完全取代 pylsp,前者连启动日志都不会出现。
- 冲突不报错,只丢功能:右下角状态栏永远只显示一个 LSP 名称(如
LSP: ruff-lsp),另一个彻底“隐身” - 即使都设了
"enabled": true,也无效;LSP 不支持 selector 多值“或”逻辑 - scope 是硬性匹配:文件当前 scope 必须精确等于
selector字符串,source.python.django≠source.python
多语言服务器共存的实操配置原则
核心是“隔离 scope + 显式路径 + 分工明确”:
- 用
selector错开:Python 项目里让pyright负责补全/跳转("selector": "source.python"),ruff-lsp只处理格式化/诊断("selector": "source.python - string - comment")——减小重叠面 - 绝对路径优先:
"command"别写["pyright"],改用["/Users/you/project/.venv/bin/pyright", "--stdio"],避免 PATH 混乱导致某一个 server 启动失败 - 禁用冗余 client:如果已用
pyright,就别再配python-lsp-server;两者能力高度重合,共存只会增加冷启动负担和内存占用 - TS/JS 单独走
typescript-language-server,不要混用tsserver或deno lsp——它们初始化协议不兼容,强行并列会导致连接反复断开
如何验证是否真正在跑多个 server
不能只看右下角状态栏,得查进程和日志:
- 打开
LSP: Toggle Log Panel,搜索spawned,确认每台 server 都有类似spawned pylsp with pid 12345的记录 - 在终端执行
ps aux | grep -E "(pyright|ruff-lsp|typescript-language-server)",看对应进程是否真实存在且未立即退出 - 切换不同文件类型(
.py/.ts/.tsx),观察右下角状态栏是否随之切换为对应 server 名称,而不是固定显示某一个 - 故意写个错误(如 Python 里调用不存在的函数),看诊断提示是否来自预期的 server:ruff 报
undefined-variable,pyright 报reportGeneralTypeIssues,二者提示风格和代码不同
最常被忽略的是 scope 和 syntax 的耦合关系——哪怕你配了十个 server,只要当前文件 scope 是 text.plain(比如没正确识别 .py 文件),所有 server 都不会触发。务必按 Ctrl+Alt+Shift+P 实时确认 scope,别凭文件后缀猜。











