Ctrl+Shift+L 是将选中多行文本按换行符拆分为独立光标的起点,使每行末尾生成一个光标以支持批量编辑;必须先选中目标行,空行会被跳过,列选择或正则 Find All 后也需此操作才能生效。

Ctrl+Shift+L 拆行是生成列表项的起点
多光标生成列表项,核心不是“加光标”,而是“把已有结构转成可批量编辑的光标阵列”。最常用、最稳的入口就是 Ctrl+Shift+L(macOS 是 Cmd+Shift+L):它把当前选中的多行文本,按换行符切分成独立光标,每个光标落在对应行的末尾(或选区起始位置,取决于 Sublime 版本)。这一步做完,你才真正拥有了“每行一个输入点”的能力。
常见错误现象:选中 5 行文字后按 Ctrl+Shift+L,只在第一行生效。这不是快捷键失效,而是你没确认光标是否真的分布在所有行——检查主题设置里是否关闭了 caret_style 可视化,或临时切换到默认主题验证。
- 必须先选中目标行(可用鼠标拖选、
Ctrl+L逐行选、或正则Find All后再选) - 如果选中的是带缩进的代码块,
Ctrl+Shift+L后光标会落在缩进后的位置,注意对齐 - 空行会被跳过——Sublime 不会在空行生成光标,删掉空行再操作更可靠
用 ${TM_SELECTED_TEXT} 在 snippet 中插入每行原始内容
想把每行已有的文本(比如 home、user、admin)作为变量名插入到模板中,不能用 $1——它只会同步填充同一个值。必须依赖 ${TM_SELECTED_TEXT},它读取的是每个光标所在位置的**当前选中文本**,多光标下互不干扰。
典型使用场景:你有一列路由名,想快速生成 Vue Router 的 routes 数组项。先选中全部名字,按 Ctrl+Shift+L,再触发 snippet:
<route path="/${TM_SELECTED_TEXT}" component={${TM_SELECTED_TEXT}Page} />结果就是三行各自独立的内容,不是三行重复的 home。
- 必须先选中文本再触发 snippet,否则
${TM_SELECTED_TEXT}为空字符串 - 如果原始文本含空格或斜杠(如
user/list),建议在 snippet 中写成path="/${TM_SELECTED_TEXT}"而非path=${TM_SELECTED_TEXT},避免语法错误 -
${TM_SELECTED_TEXT}不参与 Tab 跳转序列,无法用Tab切换到它后面的位置
列选择 + Ctrl+Shift+L 组合处理对齐列表项
当你要给一列已存在的数据统一加前缀(如 - )、补后缀(如 ;)或包裹符号(如 `),列选择比逐行选更精准。按住 Alt(Windows/Linux)或 Option(macOS)垂直拖拽,划出矩形区域,松手即完成列选。
但注意:列选本身只是“选中一块矩形文本”,不是多光标。想让它真正生效,必须立刻接 Ctrl+Shift+L 把这块区域拆成每行一个光标,之后输入才会同步作用于所有行。
- 列选时横向偏移稍大,Sublime 就判定为普通框选——务必垂直拖动,别斜着来
- 某行比列选范围短?该行不会被修改,Sublime 不自动补空格
- 粘贴多行内容会导致错位,只粘单行内容(如
-)最安全 - 混用 Tab 和空格会导致列边界静默偏移,编辑前先执行
Ctrl+Shift+P → Convert Indentation to Spaces
正则 Find All 后直接生成光标阵列
当你需要从杂乱文本中提取特定模式(如所有 class="xxx" 中的 xxx),正则 + Find All 是最灵活的方式。打开查找面板(Ctrl+H),输入正则(如 class="([^"]*)"),勾选 .*(正则模式)和 Aa(大小写敏感按需),点 Find All。
这时所有匹配项都会被选中,且每个匹配开头自动放置一个光标——无需手动添加,也无需先选中任何东西。
- 如果
Find All后没看到光标,检查是否误点了Replace或Replace All - 匹配不到?可能是换行符不统一(
\r\nvs\n),先执行Ctrl+Shift+P → Set Line Endings → Unix - 想替换成不同内容?得靠
$1、$2捕获组;纯多光标打字只能输出完全一样的文本 - 替换后光标消失?在用户设置中加
"swap_selection_on_replace": false
复杂点在于:列选择和正则生成的光标,行为逻辑不同,但最终都得靠 Ctrl+Shift+L 统一转化;而 ${TM_SELECTED_TEXT} 的可靠性,完全取决于你触发 snippet 前有没有真正选中每行的原始文本。

















