sublime text 默认不支持一键复制当前行,必须先按ctrl+l选中再按ctrl+c;因其copy命令仅响应选区,无法绕过此逻辑,自定义命令需用select_line→copy顺序实现。

Sublime Text 默认没有“一键复制当前行”的快捷键,Ctrl+C 单独按无效;必须先 Ctrl+L 选中再 Ctrl+C 才能进系统剪贴板——想改出真正“按一下就复制整行”的键,得靠自定义命令+快捷键绑定。
为什么不能直接改 Ctrl+C 的行为?
Sublime 的 copy 命令只响应已有选区,这是底层逻辑,无法通过改快捷键绕过。强行把 Ctrl+C 绑定到选中+复制组合,会导致:在已有文本选区时误触发整行复制、破坏正常复制体验、与插件(如 Emmet)冲突。官方不建议覆盖核心命令。
-
Ctrl+L是唯一稳定选中当前行的原生命令,行为可预测,不依赖光标位置或语言模式 - 想“一键复制”,只能新建一个自定义命令,内部顺序执行
select_line→copy - Windows/Linux 用户注意:
Ctrl+C被系统级占用,Sublime 中即使重绑也常被拦截;推荐用Ctrl+Alt+C或Ctrl+Shift+C这类低冲突组合
怎么写一个真正“复制当前行”的自定义命令?
需要两步:先写 Python 命令类,再绑定快捷键。Sublime 支持在 Packages/User/ 下放 .py 文件,自动加载。
在 Packages/User/copy_current_line.py 中写:
import sublime
import sublime_plugin
<p>class CopyCurrentLineCommand(sublime_plugin.TextCommand):
def run(self, edit):</p><h1>清空现有选区,确保只操作当前行</h1><pre class="brush:php;toolbar:false;"> self.view.sel().clear()
# 获取当前光标行 region
cursor = self.view.sel()[0].begin()
line_region = self.view.line(cursor)
# 选中该行(不含换行符)
self.view.sel().add(line_region)
# 执行 copy 命令(此时有选区,copy 才生效)
self.view.run_command("copy")
保存后,重启 Sublime 或按 Ctrl+Shift+P 输入 Package Control: Satisfy Dependencies 触发重载。
- 这个命令严格等价于手动按
Ctrl+L→Ctrl+C,但只触发一次 - 它不包含换行符;如需含换行符(粘贴到终端时自动换行),把
line_region换成self.view.full_line(cursor) - 如果当前光标在空行,会复制空行;在折叠区域里,仍能准确定位物理行
怎么绑定快捷键让 Ctrl+Alt+C 生效?
打开 Preferences → Key Bindings,在右侧用户文件中添加:
[
{
"keys": ["ctrl+alt+c"],
"command": "copy_current_line"
}
]
- 务必确认左侧是默认键绑定(不要删掉它),右侧只加你自己的条目
- macOS 用户把
ctrl换成super,即"keys": ["super+alt+c"] - 如果按键无反应,按
Ctrl+Shift+P输入View Package Files,检查User/目录下是否有同名 .py 文件残留(比如copy_current_line.pyc),删掉再试 - 避免和输入法快捷键冲突:例如中文输入法常占
Ctrl+Shift,可改用Ctrl+Alt+C或Alt+Shift+C
复制多行或带缩进对齐的场景怎么处理?
自定义命令默认只处理光标所在行。如果想支持多行,需扩展逻辑——但更实际的做法是:保留原生 Ctrl+L 链式操作,配合 Ctrl+Shift+↓ 扩展选区,再统一触发你的 copy_current_line 命令(它会批量处理所有选区)。
- 已选中多行时,
copy_current_line会为每行分别执行选中+复制,最终剪贴板内容就是多行原文 - 缩进不会被修改,原样保留空格或 Tab;但不会自动对齐——对齐是粘贴时的事,不是复制阶段的责任
- 真正容易被忽略的是换行符控制:是否含换行符,决定了粘贴到终端时会不会连成一行;这个开关不在快捷键里,而在命令实现中,必须显式选择
line()还是full_line()











