Sublime Text 插件无原生项目级隔离机制,启用后全局生效;项目切换时配置变化实为项目级 settings 覆盖用户级设置,仅响应 view.settings() 或支持项目上下文的插件(如 LSP、Terminus、SublimeLinter)才受其影响,多数插件(如 Package Control、Git)不读项目设置;真隔离需为每个项目使用独立窗口。

Sublime Text 切换项目时,插件配置不会自动切换
Sublime Text 的插件本身没有“按项目生效”的原生机制。所有插件一旦启用,就对整个编辑器实例全局生效;ignored_packages、settings 或快捷键绑定等配置,都只分“用户级”和“项目级”,不区分插件是否“属于某个项目”。所谓“切换项目后插件配置变了”,其实是项目级设置覆盖了用户级设置,而插件自身行为只是响应了这些设置变化。
项目级 settings 能影响哪些插件行为
只有明确读取 view.settings() 或 sublime.load_settings() 并支持项目上下文的插件,才会响应 .sublime-project 里的配置。常见可被项目级控制的插件行为包括:
-
Terminus:通过"terminal": { "working_dir": "$project_path" }指定终端起始路径 -
LSP(Language Server Protocol):用"settings": { "lsp_language_id": "python" }或"clients"字段为不同项目指定语言服务器路径和参数 -
SublimeLinter:靠"linters": { "pylint": { "executable": "./venv/bin/pylint" } }绑定项目本地环境 -
SideBarEnhancements:不响应项目设置,但右键菜单行为受当前 view 所在文件夹影响(即你点的是哪个项目的文件)
注意:Package Control、Git、BracketHighlighter 等多数插件**不读项目 settings**,它们的行为由用户级配置或自动探测决定,切换项目后不会变。
为什么改了 .sublime-project 里的 "tab_size" 却没生效
常见错误是把设置写在了错的位置。项目配置中只有顶层 "settings" 块才被 Sublime 主体识别,插件自己的配置必须显式嵌套在其命名空间下。例如:
{
"folders": [
{ "path": "." }
],
"settings": {
"tab_size": 2,
"translate_tabs_to_spaces": true
},
"LSP": {
"clients": {
"rust-analyzer": {
"enabled": true,
"settings": {
"rust-analyzer.cargo.loadOutDirsFromCheck": true
}
}
}
}
}
上面的 "tab_size" 会生效,但 "LSP" 块不会——因为 Sublime 不认识这个 key。正确写法是把 LSP 配置放进 "settings" 下的 "lsp_settings"(取决于插件文档),或者更稳妥地:直接在 Packages/User/LSP.sublime-settings 中用条件逻辑,或为每个项目单独建 Packages/User/LSP.<project_name>.sublime-settings</project_name> 并配合插件的 project-aware 加载机制(如 LSP 支持 project_settings 字段)。
想让插件真正在项目间“隔离”,只能开多个窗口
这是最常被忽略的硬限制:Sublime Text 的插件状态(比如 LSP 的会话、Terminus 的活跃终端、Git 插件缓存的 repo 状态)都在单个进程内共享。即使你用 Project → Open Project 切换,旧项目的插件上下文并未销毁。实际效果是:
- Git 状态栏可能还显示上一个项目的分支名
- Terminus 新开的终端仍继承旧工作目录(除非你手动设
working_dir) - LSP 可能持续监听旧项目路径,导致跳转错乱
唯一可靠方案是:每个项目用独立窗口打开(Ctrl+Alt+P → 选项目 → 自动新窗口),并确保 .sublime-project 文件里已正确声明 "folders" 和关键插件所需的 "settings"。窗口一关,对应的所有插件状态就清空了——这才是真正的“配置切换”。


















