sublime-lsp 默认只启动一个lsp服务器,因其clients按文件类型selector匹配而非项目路径;多个服务器共存需selector不重叠或通过enabled动态控制。

为什么 sublime-lsp 默认只启动一个 LSP 服务器?
因为 sublime-lsp 的 clients 配置是按文件类型(selector)匹配的,不是按项目或文件路径。如果你没显式区分不同语言或不同项目的配置,它会用第一个匹配到的服务器处理所有符合该 selector 的文件——比如 source.python 同时匹配了你本地的 pylsp 和远程的 rust-analyzer(显然不会),但更常见的是:两个 Python 服务器都声明了 "selector": "source.python",结果只有后加载的那个生效。
关键点在于:selector 决定“谁有资格响应”,而 enabled + settings + initializationOptions 才决定“具体怎么响应”。多个服务器共存的前提是它们的 selector 不重叠,或通过 enabled 动态控制。
如何让 Python 和 TypeScript 各自使用独立的 LSP 服务器?
这是最典型的多语言场景。你需要为每种语言单独定义一个 client 块,且确保 selector 精确对应 Sublime 的语法作用域。打开 Preferences → Package Settings → LSP → Settings,在 "clients" 对象里添加:
{
"pylsp": {
"command": ["pylsp"],
"selector": "source.python",
"enabled": true
},
"typescript-language-server": {
"command": ["typescript-language-server", "--stdio"],
"selector": "source.ts, source.tsx",
"enabled": true,
"settings": {
"typescript.preferences.includePackageJsonAutoImports": "auto"
}
}
}
注意几点:
-
selector必须和当前文件的语法 scope 一致,可用Ctrl+Shift+P→Developer: Show Scope Name实时查看 - 不要给两个 client 设置相同的
selector,否则后者覆盖前者 -
command路径支持绝对路径(如"/opt/node_modules/.bin/typescript-language-server"),避免环境变量问题 - 如果某个服务器启动失败,
LSP: Toggle Log Panel里会显示stderr输出,常见错误如"command not found"或"connection closed"
同一个语言(比如 Python)能否同时启用 pylsp 和 ruff-lsp?
可以,但必须错开 selector 或用条件启用。ruff-lsp 默认也用 source.python,直接并列会导致冲突。推荐做法是:让 ruff-lsp 只负责格式化/诊断,pylsp 负责补全/跳转——通过 "enabled" + "settings" 控制能力边界:
"ruff-lsp": {
"command": ["ruff-lsp"],
"selector": "source.python",
"enabled": true,
"settings": {
"rustAnalyzer.checkOnSave.enable": false,
"ruff.lint.enable": true,
"ruff.format.enable": true
}
},
"pylsp": {
"command": ["pylsp"],
"selector": "source.python",
"enabled": true,
"settings": {
"pylsp.plugins.pycodestyle.enabled": false,
"pylsp.plugins.pyflakes.enabled": false
}
}
这样两者都会启动,但功能不重叠。不过要注意:
- Sublime Text 不保证多个同 selector 服务器的执行顺序,诊断消息可能混杂
- ruff-lsp 的
format和 pylsp 的autopep8插件若同时开启,保存时可能相互覆盖 - 内存占用会上升,尤其打开大项目时;可考虑用
"enabled": false+LSP: Enable Language Server按需开启
项目级配置:如何让某个文件夹只用特定 LSP 服务器?
靠全局 Settings 不够灵活,得用项目设置。在项目根目录建 .sublime-project,写入:
{
"folders": [
{
"path": "."
}
],
"settings": {
"lsp_clients": {
"my-custom-tsserver": {
"command": ["npx", "typescript-language-server", "--stdio"],
"selector": "source.ts, source.tsx",
"enabled": true,
"settings": {
"typescript.preferences.importModuleSpecifier": "relative"
}
}
}
}
}
这个 "lsp_clients" 是项目级覆盖项,优先级高于用户级 Settings。但它只对当前项目生效,且要求 Sublime 已通过 Project → Add Folder to Project 加载该目录。容易忽略的点:
- 项目设置里的 client key(如
my-custom-tsserver)不能和全局 settings 里重复,否则行为未定义 - 路径中含空格或中文时,
command里的npx可能找不到模块,建议改用绝对路径调用tsserver - 修改项目配置后需重启 Sublime 或执行
LSP: Restart Servers,否则新配置不加载
多个 LSP 服务器不是越多越好,关键是每个 server 承担明确、不重叠的职责。真正难的不是配置,而是判断哪些能力该交给哪个 server——比如把类型检查交给 tsserver,而把 import 排序交给 eslint 的 source.fixAll 命令,这需要你清楚每个 server 的 capabilities 边界。











