sublime text 无原生行尾自动加分号功能,需区分批量补全、单行追加、保存格式化三类场景;正确做法是ctrl+l选行→ctrl+shift+l多光标→end/ctrl+e移至行尾→按;,或用正则(?

Sublime Text 没有原生“行尾自动加分号”的快捷键,也不存在一键触发且语义安全的自动补全机制;所有所谓“自动”方案,本质都是手动触发+预设行为,必须明确区分“批量补全”“单行追加”和“保存时格式化”三类场景。
为什么 Ctrl+Shift+L 后按 ; 总是插错位置
因为 Ctrl+Shift+L 只是把当前选区按换行符拆成多光标,光标落点 = 选区末尾位置,不等于行尾。常见错误现象包括:
- 某行末尾有空格或 Tab,光标停在空白上,
;就插在空格前而非文本后 - 只选中了部分字符(比如中间一段),拆出的光标就落在行中任意位置
- macOS 上
Cmd+→被系统快捷键拦截,光标根本移不到行尾
正确做法是:先用 Ctrl+L 选中目标行 → 再按 Ctrl+Shift+L → 接着统一按 End(Windows/Linux)或 Ctrl+E(macOS,需启用 "command_mode": true)→ 最后按 ;。若某行结尾有空白,End 会停在空白处,此时连按两次 End 或改用 Ctrl+→ + → 微调。
正则替换 $ → ; 是最稳的批量方式
适用于 JS/TS/Java 等强制分号语言的大段代码补全,尤其当混有空行、注释、已有分号时。打开 Ctrl+H,勾选右下角 .*,填入:
- 查找:
(?(负向先行断言避开已有分号,<code>\s*吞掉末尾空格/Tab) - 替换:
;
注意:$ 默认不匹配文件末尾无换行符的情况,若最后一行没换行,可先手动加一个再操作。别用 \s 做删除正则——它会误吞换行符;删分号请用 ;[ \t\u00A0]*$(显式列出空格、Tab、不间断空格)。
宏绑定 alt+; 能省按键但不智能
录一个三步宏(move_to 到行尾 → insert ; → insert \n)并绑定 alt+; 是可行的,但有硬伤:
- 宏不识别上下文:
foo();会被改成foo();; - 不处理缩进或注释:对
// log这种行也会傻乎乎加; - 若宏里用了
move_to {"to": "eol"},它只跳到当前行末(含空白),不是“最后一个非空白字符后”
真正想“写完就自动有分号”,得靠保存时格式化:装 Prettier 插件,配 "semi": true 和 "format_on_save": true,这样 console.log(1) 保存瞬间就变 console.log(1);——它不靠光标位置,而是解析语法树,这才是唯一接近“自动”的路径。
最易被忽略的一点:无论用哪种方式,都要先确认当前文件语法是否允许分号。JSON、YAML、Python 文件里硬加 ; 不仅无意义,还会导致解析失败。别让快捷键掩盖语言规则本身。











