咨询:支持多选且保留选区的编辑器选区前后加行命令或插件
满足需求的编辑器命令/插件 & 实现思路
嘿,这个需求真的戳中了很多编辑器用户的痛点——处理多选区时,就怕插个新行光标乱跑、选区还丢了,太影响效率了!下面给你梳理一下现有解决方案,以及自己实现的思路:
一、现成的编辑器工具推荐
VS Code
VS Code默认的Ctrl+Enter/Ctrl+Shift+Enter确实会跳光标,但有个第三方插件完美适配你的需求:Multi Line Actions。
- 它自带的
Add Line Before Selection和Add Line After Selection命令:- 完全支持多选区,每个选中块的前后都会插入新行
- 插入后选区会自动跟着内容偏移(比如原来选第3行,插完前新行后,选区会留在第4行的原内容上),光标也不会跑到新行里,完全符合你的要求
- 你可以自己给这两个命令绑定快捷键,比如设成
Alt+Enter(前插)和Alt+Shift+Enter(后插),用起来比默认命令顺手多了。
Sublime Text
Sublime本身没有现成命令,但可以通过自定义快捷键实现,不用装插件:
- 打开
Preferences > Key Bindings - User,粘贴这段配置:
这段配置会在有选区时,分别在选区前后插入新行,而且选区会稳稳留在原内容上,光标也不会乱跑。{ "keys": ["alt+enter"], "command": "insert", "args": {"characters": "\n"}, "context": [{"key": "has_selection", "operator": "equal", "operand": true}] }, { "keys": ["alt+shift+enter"], "command": "insert", "args": {"characters": "\n", "insert_at": "end"}, "context": [{"key": "has_selection", "operator": "equal", "operand": true}] }
Atom编辑器
你提到了Atom的操作示例,其实Atom可以用自定义脚本直接实现更精准的功能:
- 比如用
script插件,写一段简单的CoffeeScript:
运行这段脚本后,绑定个快捷键,就能在多选区前插新行且保留选区了,同理也能改成后插的版本。atom.commands.add 'atom-text-editor', 'custom:add-line-before-selection', -> editor = atom.workspace.getActiveTextEditor() return unless editor?.hasSelection() editor.transact -> editor.getSelections().forEach (selection) -> range = selection.getBufferRange() editor.insertNewlineBefore(range.start) # 调整选区到原内容位置 selection.setBufferRange([ [range.start.row + 1, range.start.column], [range.end.row + 1, range.end.column] ])
二、如果没有现成工具,自己实现难吗?
完全不难!几乎所有主流编辑器都开放了扩展API,核心逻辑就两步:
- 先把当前所有选区的位置记下来
- 在每个选区的前后插新行,然后把选区的行号+1(因为插了一行),这样选区就会自动跟着原内容走,不会丢
举个VS Code的简化示例代码,几行就搞定:
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { let addLineBefore = vscode.commands.registerCommand('extension.addLineBefore', () => { const editor = vscode.window.activeTextEditor; if (!editor) return; editor.edit(editBuilder => { // 倒着遍历选区,避免插新行影响后面的选区位置 for (let i = editor.selections.length - 1; i >= 0; i--) { const sel = editor.selections[i]; // 在选区行首插新行 editBuilder.insert(new vscode.Position(sel.start.line, 0), '\n'); // 把选区往下挪一行,保持选中原内容 editor.selections[i] = new vscode.Selection( sel.start.translate(1, 0), sel.end.translate(1, 0) ); } }); }); context.subscriptions.push(addLineBefore); }
哪怕你没写过编辑器扩展,照着官方文档的例子改一改,半小时就能弄出能用的版本,甚至可以用编辑器的“快速运行脚本”功能临时用,不用打包成正式插件。
内容的提问来源于stack exchange,提问作者Dorian Marchal
相关产品推荐
相关产品推荐

