Notepad++宏无法真正实现“每行删前N字符”,因其仅重放操作序列而非逻辑判断;可靠方案是Python脚本配合editor.forEachLine,支持Unicode、自动处理短行且不受BOM/隐藏字符干扰。

Notepad++ 不能用宏“直接”删每行前 N 个字符
宏录制的是「操作序列」,不是逻辑判断。你手动按一次 Alt+鼠标拖选+Delete,宏只能重放这一组动作——它不会自动识别“每行第 1–5 列”,更不会逐行跳转、选中、删除。试图录一个“删第一行前 5 字符 → 下移一行 → 再删前 5 字符”的宏,结果只会卡死在第二行,因为宏不理解“下移一行”该按 ↓ 还是 Enter,也不处理行尾不足 5 字的边界情况。
常见错误现象:
- 宏运行后只删了第一行,光标停在第二行开头,后续无响应
- 文件有 1000 行,宏重复 1000 次,但每次都在同一行反复删,越删越乱
- 用了
Shift+↓录制选行,结果因自动换行开启,实际选中了视觉上的“多行”,物理上却是单行内容
真正能批量删行首字符的宏,本质是“列编辑自动化”
如果你坚持用宏,唯一可行路径是把「列编辑」动作封装进去——但这要求你提前知道总行数,且所有行都足够长(至少 N 字符)。操作逻辑是:跳到首行指定列 → Alt+Shift+↓ 向下拉满 → Delete。
实操建议:
- 先关闭「自动换行」(
View → Word wrap不勾选),否则Alt+Shift+↓会错位 - 用
Ctrl+G跳到第 1 行,再按Home确保光标在行首 - 录制时:按住
Alt+Shift,再按↓键 N 次(比如删前 5 字,就按 5 次),松手后立刻按Delete - 停止录制后,运行宏时必须保证当前文件行数 ≥ N,否则最后一部分会删到空行或错位
这个方法本质是“固定高度纵向选区”,不是“每行删前 N 字符”。它快,但脆弱——行数变化、缩进不齐、含 BOM 或零宽字符都会导致偏移。
比宏更稳的替代方案:Python 脚本 + editor.forEachLine
Notepad++ 自带 PythonScript 插件(需手动安装),用 editor.forEachLine 可精确控制每行切片,完全避开 GUI 渲染和键盘模拟的不确定性。
示例(删每行前 23 个字符):
editor.forEachLine(lambda line, i: editor.replaceWholeLine(i, editor.getLine(i)[23:]))
关键点:
-
editor.getLine(i)返回原始字符串,Unicode 安全,中文/emoji 不会被截断字节 -
[23:]是 Python 切片,自动处理行长短于 23 的情况(返回空串) - 不依赖光标位置、不触发渲染、不卡顿,10 万行也能秒级完成
- 要保留前缀后第一个空格对齐?改
[23:].lstrip()或[23:].replace(" ", " ")
最容易被忽略的细节:BOM 和隐藏字符让所有方案失效
UTF-8 文件带 BOM(\uFEFF)时,第一行实际起始位置不是第 0 字符;粘贴文本带零宽空格(\u200B)或软连字符(\u00AD)时,^.{N} 和列编辑都会少算一列——你看着删了 5 个位置,其实第 1 个是隐形的。
验证方法:
- 打开
视图 → 显示符号 → 显示所有字符,确认行首有没有灰色小方块或虚线 - 用正则
^.{0,10}全部查找,看高亮是否严格覆盖你认为的“前 N 字符” - 删完后用
Ctrl+A → Ctrl+C复制到新标签页,用十六进制查看器(如 HxD)检查首字节是否异常
没有这一步,无论用宏、正则还是脚本,都可能批量制造乱码或错位。


















