Sublime Text原生构建系统不支持$selected_text变量,因其设计面向文件执行而非代码片段;SublimeREPL可发送选区但限制多;Terminus插件是唯一支持真·局部运行的方案;粘贴到终端仍是多数情况下的最优解。

原生 Build System 根本不支持 $selected_text
Sublime Text 的默认构建系统(包括所有内置和手动编写的 .sublime-build)**无法访问当前选中文本**。它只识别 $file、$file_path、$file_name 等文件级变量,$selected_text 是非法变量——你写进去也不会报错,但会被静默忽略,实际执行的是空命令(如 python -c ""),直接失败。
这不是配置疏漏,而是 Sublime 的设计边界:构建系统面向“文件执行”,不是“代码片段执行”。试图在 "cmd" 里硬塞 "python", "-c", "$selected_text",结果必然是 SyntaxError: unexpected EOF while parsing 或无输出。
SublimeREPL:最轻量的“发送选区”方案
它不修改构建系统,而是在编辑器内启动一个真实的 Python 解释器进程,再把选中内容发过去执行。适合验证表达式、小段逻辑,但有硬限制:
- 必须先按
Ctrl+Shift+P→ 输入SublimeREPL: Python启动 REPL,否则快捷键无效 - 默认发送快捷键是
Ctrl+Shift+H(可在Preferences → Package Settings → SublimeREPL → Key Bindings查看) - 多行代码必须语法完整:不能只选
if x:而不选后续缩进块,否则触发IndentationError -
input()类交互操作会卡死——REPL 不提供 stdin 输入框,只执行、不等待 - 导入自定义模块(如
import mylib)大概率失败,因为 REPL 的sys.path不包含当前文件所在目录
Terminus + 自定义 Build System:唯一能真·局部运行的路径
Terminus 插件扩展了构建系统的变量能力,提供了 $selected_text,并支持在终端面板中执行命令。这是目前唯一能绕过“必须保存文件”且支持简单交互(如 print + input)的组合:
安装 Terminus 后,新建 Build System,内容如下:
{
"target": "terminus_exec",
"cancel": "terminus_cancel_build",
"cmd": ["python", "-c", "$selected_text"],
"selector": "source.python",
"windows": {
"cmd": ["python", "-c", "$selected_text"]
}
}
保存为 PythonSelected.sublime-build,然后:
- 选中代码 → 按
Ctrl+Shift+B→ 选择该构建系统 - 注意:
-c要求代码是合法单行;多行需用分号连接,例如print("a"); x=1; print(x) - 若含换行或三引号字符串,得改用
python -i -c "exec('''...''')",但极易因引号嵌套或缩进出错 - Windows 下若路径含空格或编码异常,可能抛
UnicodeDecodeError,此时应改用python -u -c并确保系统 locale 匹配
为什么粘贴到终端仍是多数情况下的最优解
当你发现 SublimeREPL 报 ModuleNotFoundError、Terminus 因缩进崩溃、或者只是想测一句 requests.get(...) 是否超时,复制粘贴到系统终端(Ctrl+` 呼出 Sublime 内置终端,或外部 Terminal)反而最稳:
- 无需插件兼容性焦虑(尤其 Sublime Text 4 下很多旧插件已失效)
- 环境完全一致:PATH、PYTHONPATH、venv 激活状态全部继承
- 支持完整交互:
input()、sys.stdin.read()、Ctrl+C 中断都正常 - 调试耗时操作(如网络请求、文件读写)时,终端输出更实时,不会被 Sublime 构建面板缓冲截断
所谓“一键运行选中代码”,在 Sublime 里本质是个伪需求——它的定位是编辑器,不是 REPL 或 IDE。接受这个事实,该切终端时就切,比花两小时调 $selected_text 变量更省时间。

















