最稳实操路径是Ctrl+Shift+L分拆行后统一按End跳转行尾再输入;正则替换用^(.*1])$→\1;更安全;列选择和代码片段均不适用于行尾批量添加。[:space: ↩

Ctrl+Shift+L 分拆行后统一跳转行尾再输入
这是最稳、最不容易出错的实操路径,尤其适合目标行数中等(几行到几十行)、结构不完全规则的场景。Sublime 不会自动把光标“精准停在每行末尾”,必须手动触发定位。
操作要点:
- 先用鼠标或 Shift+↑/↓ 选中目标多行(哪怕只是粗略框住)
- 按下
Ctrl+Shift+L(Windows/Linux)或Cmd+Shift+L(macOS),此时每行开头出现光标 - 立刻按一次
End(Windows/Linux)或Cmd+→(macOS)——这步不能省,否则光标停在行首 - 直接输入内容,比如
; // TODO或;,所有行尾同步添加
注意:→ 键在有末尾空格时可能只移到空白处,End 才真正落到换行符前。空行也会被正确处理。
正则替换用 $ 追加但要避开空行陷阱
当处理上百行、且需要严格统一格式时,正则替换效率更高,但 $ 的行为和直觉有偏差:它匹配行尾位置,但不包含换行符本身;对空行,默认不触发替换(除非显式匹配)。
安全写法:
- 打开替换面板:
Ctrl+H→ 勾选.*(启用正则) - 查找框填:
^(.*[^[:space:]])$(匹配非空、末尾非空白的行) - 替换框填:
\1; // auto(\1保留原内容,再追加) - 若必须包含空行,改用:
^.*$→$0; // auto,但需确认文件末尾是否有换行符,否则最后一行可能漏掉换行结构
关键点:$0 是整行内容(不含换行符),所以 $0; 不会吞掉换行;但若文件最后一行没换行符,$ 仍会匹配它,结果是分号插在文件真正末尾,而非“行尾”。
列选择(Alt+拖拽)不适用于行尾追加
很多人误以为 Alt+鼠标拖拽能“框住所有行尾”,其实不能。列选择是固定列坐标插入,比如你从第 50 列拖到第 50 列,那所有行都在第 50 列插入字符——但每行长度不同,有的行根本不到 50 列,有的远超,结果就是字符插在中间或空白处,看似错位。
它只适合明确对齐需求,例如:
- 在多行变量声明右侧统一加注释,且所有变量名已右对齐到第 25 列
- 批量修改 CSV 中某一列的值
想靠它做“行尾添加”,本质是用错工具。别试。
代码片段(.sublime-snippet)不适合动态多行插入
代码片段是静态触发机制:<tabtrigger>log</tabtrigger> → 按 Tab 插入预设内容。它无法感知“当前是否处于多行编辑状态”,也不会自动在每行末尾展开。即使你定义了 <content></content>,也只会在光标当前位置插入一次。
如果你真想用片段辅助多行操作,唯一可行方式是:先用 Ctrl+Shift+L + End 把光标全部拉到行尾,再手动触发片段(比如输 sem + Tab),但这和直接打 ; 几乎没差别,还多一步配置。
片段的价值在于高频、固定结构的代码块复用,不是行尾批量注入。别为了省一个分号去折腾 XML 文件。

















