sublime text中多个lsp服务器共存的前提是各client的selector互不重叠且enabled为true;若.py和.ts文件仅启动一个服务器,是因为selector冲突或scope未正确匹配,需用ctrl+alt+shift+p确认真实语法作用域并分别配置精确selector。

Sublime Text 跨语言开发时,LSP 不会自动识别“项目属于哪种语言”,它只认当前文件的 source.python、source.ts 这类语法 scope;多个语言共存的前提是每个 server 的 selector(或 scopes)互不重叠,且 command 可执行、syntaxes 匹配真实语法包路径。
为什么打开 .py 和 .ts 文件,只有一个语言服务器启动?
因为 LSP 按文件 scope 匹配 client,不是按项目目录。如果两个 client 都写了 "selector": "source.python",后加载的那个会覆盖前一个;更隐蔽的是:某些插件(如 LSP-pyright)默认启用 source.python,而你手动加的 typescript-language-server 若也误配成 source.python,TS 服务根本不会被触发。
- 用
Ctrl+Alt+Shift+P(Windows/Linux)或Cmd+Alt+Shift+P(macOS)查看当前文件真实 scope,比如 TSX 文件可能是source.tsx,不是source.ts -
selector和scopes是等效字段,但新版 Sublime-LSP 推荐统一用selector - 不要复用同一份配置改来改去——为每种语言新建独立 client 块,命名清晰(如
"pyright"、"tsserver"),避免键名冲突
如何让 Python + TypeScript + C++ 在同一项目里各自走各自的 LSP?
关键不是“项目级开关”,而是确保每个 client 的 selector 精确对应其目标文件类型,并排除干扰项。例如:
- Python:
"selector": "source.python - source.python.django - source.python.flask"(减号排除常见变体,防误匹配) - TypeScript:
"selector": "source.ts, source.tsx, source.js - source.js.jsx"(JSX 单独交给 LSP-ESLint 或禁用) - C++:
"selector": "source.c++, source.cpp, source.objc++",同时确认右下角显示 C++ 语法,否则source.c++根本不触发 - 所有 client 必须设
"enabled": true,且"command"指向可执行二进制(绝对路径更稳,尤其 Windows 下单反斜杠会解析失败)
LSP 日志里反复报 “connection closed” 或 “ENOENT”,但命令行能跑通?
常见于环境变量隔离:Sublime 启动时继承的是桌面会话的 PATH,不是你终端里的 PATH;尤其 macOS 上通过 LaunchServices 启动的 Sublime,可能压根没读 ~/.zshrc。
- 终端中运行
which pyright或which clangd,复制完整路径填进command数组,如["/Users/you/.local/bin/pyright", "--stdio"] - Windows 用户注意:路径中用正斜杠
/或双反斜杠\,单反斜杠会被 JSON 解析器吃掉 - 如果用了 Node.js 工具链(如 tsserver),在
command中显式指定 node 路径:["/usr/local/bin/node", "/path/to/typescript-language-server", "--stdio"] - 别依赖
shell: true—— LSP 不支持 shell 解释,所有命令必须是原生数组格式
跨语言跳转(比如 JS 调 Python 函数)为什么始终失败?
LSP 本身不支持跨语言符号解析,每个 server 只管自己 scope 内的 AST 和符号表。所谓“跳转到 Python”,本质是 JS server 发现 import 路径后,把字符串传给 Python server 去查——但两个 server 之间没有协议约定,也不会共享 workspace root。
- 这不是配置问题,是协议限制:LSP v3.17 仍未定义跨语言引用发现机制
- 可行的折中方案:在 Python 项目根放
pyproject.toml,JS 项目根放jsconfig.json,确保各自 server 能独立构建完整上下文 - 如果真需要跨语言导航,得靠外部工具(如
ripgrep全局搜索函数名),或换用支持多 server 联动的编辑器(VS Code 的 multi-root workspace + 插件桥接)
最易被忽略的一点:Sublime 的语法识别优先级高于 LSP 配置。哪怕 selector 写对了,如果右下角显示的是 Plain Text 或 HTML,LSP 根本不会尝试启动任何 server——先按 Ctrl+Shift+P → Set Syntax: Python 手动指定,再看 scope 是否变成 source.python,这一步卡住,后面全白搭。











