宏无法跨文件执行时应改用Shell脚本处理:宏仅负责选中文本并传入脚本,脚本通过stdin安全接收、清洗、分步解析Markdown表格(预处理转义、过滤分隔线、对齐边界、字段切分),再将结果复制到剪贴板由宏粘贴回编辑器。

宏回放无法跨文件执行时怎么补救
Sublime Text 的 macro 本质是记录按键序列,不带上下文判断能力。如果想让宏在多个文件中统一处理(比如批量转 Markdown 表格为 CSV),它会在第二个文件里继续执行上一个文件光标位置的按键——大概率失败。
真正可靠的方案是把转换逻辑从编辑器操作移到 Shell 脚本里,再用 Sublime 的 build_system 或外部命令触发。宏只负责选中目标文本、复制到剪贴板或临时文件,不参与解析。
- 用
Ctrl+Shift+P→Selection: Select All或Ctrl+A选中待处理段落,避免宏依赖固定行号 - 把选中文本写入临时文件:
cat > /tmp/sublime_input.txt(配合 Sublime 的shell_command插件或自定义 Build System) - 宏最后一步设为运行脚本:
sh /path/to/convert_csv.sh /tmp/sublime_input.txt
Shell 脚本如何安全接收 Sublime 传入的文本
Sublime 默认不支持直接向脚本传递选中文本作为参数(空格、换行、引号会破坏 shell 解析)。必须通过文件或 stdin 中转。
推荐用 stdin 方式,兼容性最好,且避免临时文件残留:
- Build System 配置中设
"cmd": ["sh", "/path/to/convert.sh"],不加参数 - 脚本开头用
input=$(cat)捕获标准输入 - 对 input 做基础清洗:
input=$(printf "%s" "$input" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//'),防首尾空行干扰 - 不要用
$1或${@}直接读参,Sublime 不保证参数转义正确
处理 Markdown 表格转 CSV 时的常见坑
看似简单,但 |---| 分隔行、空单元格、嵌套管道符(如 foo | bar)会让 awk 或 cut 直接崩掉。
别硬写正则一行流,用分步策略更稳:
- 先用
sed -n '/^|.*|$/p' file提取所有含管道符的行(过滤掉纯分隔线) - 用
sed 's/^[[:space:]]*|[[:space:]]*/|/; s/[[:space:]]*|[[:space:]]*$/|/'对齐边界,确保每行以|开头结尾 - 用
awk -F'[[:space:]]*[|][[:space:]]*' -v OFS=',' '{gsub(/^[|]|[|]$/, ""); print}'切字段并替换分隔符 - 遇到
|转义需提前预处理:sed 's/\|/\\|/g'(注意:实际脚本里要双写反斜杠)
如何让 Sublime 快速调起脚本并原地替换结果
默认 Build System 输出到面板,不能自动替换当前视图内容。得靠 subl 命令 + 插件协作,或退而求其次用剪贴板中转。
最轻量可行的做法:
- 脚本末尾加
printf "%s" "$output" | pbcopy(macOS)或xclip -in -selection clipboard(Linux) - Sublime 宏里紧接着加
Ctrl+V(Windows/Linux)或Cmd+V(macOS)粘贴 - 若需保留原格式缩进,脚本输出前用
printf "%*s" $(($(tput cols) - ${#line})) ""补空格不现实——改用 Python 脚本更可控,但 Shell 也能凑合 - 务必在宏里插入
Ctrl+Z(撤销)步骤,防止粘贴失败后污染原文
真正的难点不在语法,而在文本边界判定——比如表格前后是否有空行、是否混有代码块、是否含 HTML 注释。这些没法靠宏或简单脚本覆盖,得看具体场景加 guard 条件。


















