Sublime Text 的 Build System 可通过配置 selection_only: true 实现选中文本替换,cmd 直接写命令(如 ["sort"]),自动传入 stdin;JSON 处理报错多因换行或空格,建议用 ["jq", "-c", "."] 而非管道;不支持多光标分别处理,需插件或自定义 Python 插件实现。

Sublime Text 本身不支持 Unix 风格的管道命令(比如 cat file.txt | sort | uniq),但可以通过「Build System」机制模拟等效行为——关键不是“怎么用管道”,而是“怎么让外部命令读 stdin、写 stdout,并把结果回填到当前视图」。
Build System 怎么配置才能接收选中文本并替换?
Sublime 的 build_systems 默认是运行命令后捕获 stdout 并替换整个文件,但多数过滤命令(如 sort、jq、sed)更适合处理选中区域。必须显式启用 selection_only,否则会误操作全文。
- 在
Tools → Build System → New Build System…中写入: - 设置
"selector": "text.plain"可限定适用范围(避免在 JSON 或 Python 文件里误触发) - 关键字段:
"selection_only": true—— 没这行,命令永远作用于整文件 -
"cmd"数组里不要写echo或cat做中转;Sublime 会自动把选中文本通过 stdin 传给第一个命令
{
"cmd": ["sort"],
"selector": "text.plain",
"selection_only": true,
"file_regex": ""
}
为什么 jq 或 python -m json.tool 处理 JSON 时总报错?
错误通常不是命令本身问题,而是 Sublime 传入的文本末尾带换行、或选区开头/结尾有不可见空格,导致 jq 解析失败。更隐蔽的是:Windows 下换行符 \r\n 会让部分工具拒绝解析。
- 加
"shell": true可启用 shell 环境(允许用|管道),但代价是丢失跨平台兼容性(macOS/Linux 用/bin/sh,Windows 用cmd.exe) - 稳妥做法:用单命令 + 参数处理,例如
["jq", "-c", "."],而不是["sh", "-c", "cat | jq -c ."] - 如果必须用管道,Windows 用户得改用
["powershell", "-Command", "Get-Clipboard | jq -c ."],但依赖剪贴板,不推荐
如何让命令支持多光标选区分别处理?
Sublime 的 Build System **原生不支持**对每个光标选区单独执行命令。所谓“多选过滤”其实是假象:它只对最后一个选区生效,其余被忽略。真要批量处理,得换路子。
- 安装插件
Text Pastry或MultiEditUtils,它们提供“对每个选区运行 Shell 命令”的能力 - 或者用 Python 构建脚本:
sublime_plugin.TextCommand自定义命令,在run()里遍历view.sel(),逐个调用subprocess.run() - 别试图在
cmd数组里用循环语法(如for /f)——Build System 不解析 shell 控制流
真正卡住人的地方,往往不是命令写不对,而是没意识到 Sublime 的 stdin 输入时机:它只在 build 触发瞬间传一次内容,之后命令进程就和编辑器断开。想交互式管道(比如边输边过滤),得另起终端窗口——Sublime 就不是干这个的。

















