duplicate-line-or-selection 插件非atom原生功能,它将复制行与复制选区合并为ctrl+shift+d,但会与原生editor:duplicate-lines冲突,导致空行错位、多光标失效、换行符丢失等问题;推荐禁用该插件,改用keymap.cson自定义绑定确保行为稳定。

duplicate-line-or-selection 插件不是 Atom 原生功能,它只是把「复制行」和「复制选区」两个行为合并成一个快捷键——但这个合并反而容易引发混淆,尤其在你已经习惯原生 Ctrl+Shift+D 的时候。
为什么装了 duplicate-line-or-selection 反而更难复制整行
该插件默认绑定到 Ctrl+Shift+D,和 Atom 原生的 editor:duplicate-lines 冲突。一旦启用,它会优先响应:如果当前没选中内容,就复制整行;如果已选中,就只复制选区。表面看更智能,实则破坏一致性:
- 光标落在空行末尾或行首左侧时,原生命令会失效(这是设计使然),但该插件可能强行触发,结果复制出错位的空行或截断内容
- 多光标模式下,原生
Ctrl+Shift+D会对每个光标所在行分别复制;而此插件在多光标 + 无选中状态下行为未明确定义,实测常只复制第一个光标所在行 - 它不保证复制含换行符——手动复制选区时若漏掉行尾
\n,粘贴后会和下一行连在一起,这是 Atom 用户最常踩的坑之一
如何判断你正在用的是原生复制还是插件复制
打开快捷键解析器:Ctrl+.(Windows/Linux)或 Cmd+.(macOS),然后按 Ctrl+Shift+D,观察右侧显示:
- 显示
editor:duplicate-lines→ 原生行为,安全可用 - 显示
duplicate-line-or-selection:duplicate或类似路径 → 插件接管,建议禁用 - 显示
Unbound→ 快捷键丢失,检查是否被vim-mode-plus、atom-ide-ui等插件屏蔽
想保留“复制行 or 复制选区”逻辑?别靠插件,改 keymap.cson
真正可控的方式是自定义命令绑定,而不是依赖插件的黑盒逻辑。在 ~/.atom/keymap.cson 中添加:
'atom-text-editor:not([mini])': 'ctrl-shift-d': 'editor:duplicate-lines' 'ctrl-shift-x': 'core:copy'
这样:
-
Ctrl+Shift+D永远复制整行(含换行符,不依赖选中状态) -
Ctrl+Shift+X显式复制当前选区(适合复制片段、不带换行) - 两者职责分明,不会因光标位置或插件加载顺序翻车
复制多行时的边界情况必须注意
原生 editor:duplicate-lines 对多行操作有明确语义:
- 光标在单行任意位置(未选中)→ 复制该行,新行插入其下方
- 选中 N 行 → 复制这 N 行,整体插入到选区下方,保持相对顺序
- 多光标分布在不同行 → 每个光标所在行各自复制一份,插入各自下方
- 但如果你在选中多行后又开了多光标,行为不可预测——此时应先
Esc清除选区和多光标,再逐行操作
最易忽略的一点:复制空行时,Atom 严格复制「该行的全部空白字符 + 换行符」,缩进和空格一个不少。别指望它自动 trim,也别误以为“看起来没内容=没复制成功”。











