Ctrl+Shift+L后需立刻按←键将光标移至行首再输入修饰符;Python装饰器应加在def行上方,Java/JS修饰符须紧贴函数关键字前;正则替换须限定函数定义行并处理缩进、换行符及空行。

Ctrl+Shift+L 之后必须立刻按 ← 或 Home 才能加在函数名前
Sublime 的 Ctrl+Shift+L 默认把光标放在每行末尾(换行符前),不是行首。想给函数加修饰符(如 @staticmethod、public、async),必须让光标落到函数定义行的真正开头——而不是缩进起点或注释位置。
常见错误是:选中多行 → 按 Ctrl+Shift+L → 直接输入 @,结果所有修饰符都插在行尾,变成 def foo(): @staticmethod。
- 稳妥做法:按
Ctrl+Shift+L后,**立刻按 ←(左方向键)一次** —— 所有光标会同步跳到各自行首(含空格/Tab);再按一次 ←,跳过缩进,落在函数关键字(如def、function、public)前 - 若某行是
async function foo(),第一次 ← 停在第 4 列(缩进结束),第二次 ← 才到a前 - Windows 用户可用
Ctrl+Home一步跳到逻辑行首;macOS 用Cmd+←;远程桌面或某些键盘布局下End/Home失效,优先用方向键 - 如果文件混用 Tab 和空格,
Home行为不可靠,建议先执行Ctrl+Shift+P→Indentation: Convert to Spaces
正则替换加修饰符要匹配函数定义行,不能只靠 ^
用 ^ 直接替换会污染所有行(包括空行、注释、类声明),必须限定为“函数定义行”。不同语言模式下正则需调整,但核心是捕获函数起始关键词。
例如 Python 中给所有 def 行加 @log_calls:
Find What: ^( *)(def\s+\w+\s*\(.*?\)\s*:) Replace With: $1@log_calls\n$1$2
说明:$1 保留原缩进,$2 是原 def ...: 行,\n 确保修饰符独占一行;.*? 是非贪婪匹配,避免跨行。
- JavaScript:
^( *)(async\s+)?function\s+\w+\s*\(|^( *)const\s+\w+\s*=\s*function,注意括号转义 - TypeScript:
^( *)public\s+\w+\s*\(|^( *)private\s+\w+\s*\(,匹配方法而非普通函数 - 别漏掉多行函数签名:若函数头跨行(如参数分行写),单靠
^def会失败,此时必须改用多光标 + 手动定位 - 启用正则前务必点
.*按钮;若状态栏显示“替换 0 处”,检查是否误勾了“在所选内容中”且未选文本
修饰符加在函数名前还是 def 前?取决于语言规范
Python 要求装饰器(decorator)写在 def 上方,而 Java/C# 的注解(annotation)或修饰符(modifier)必须紧贴函数签名前。Sublime 不懂语法,全靠你控制光标落点。
- Python:
@staticmethod必须加在def行上方,即光标要停在def行的上一行行首;操作路径:先Ctrl+Shift+L→ 按↑上移光标 → 再输入@ - Java:
public static void foo(),修饰符应插在public前,即光标落在p前;若已有public,就别加重复的public,得先搜^( *)public跳过 - JS/TS:
async是函数修饰符,应加在function前,不是加在foo前;错加成function async foo()会语法报错 - 如果函数已带部分修饰符(如
static def foo()),正则需写成^( *)(static\s+)?def\s+并用$1@log_calls\n$1$2def避免重复
批量加修饰符后最容易被忽略的缩进和换行问题
多光标编辑看似快,但 Sublime 对空行、混合换行符(\r\n vs \n)、软换行(soft wrap)极其敏感——这些不会报错,但会导致修饰符错位或漏加。
- 空行也会获得光标,输入后变成单独一行
@log_calls,必须操作前删空行,或用正则^(?=\S)过滤非空行 - Windows 文件若含
\r\n,$在正则中可能只匹配到\r前,导致修饰符插在回车前;统一换行符:执行Ctrl+Shift+P→Set Line Endings: Unix - 开启 soft wrap 时,
End键跳不到物理行尾,→键比End更可靠 - Vintage(Vim)模式下
Ctrl+Shift+L被重载为「选中到行尾」,必须关闭 Vintage 或改用正则路径

















