基础编辑已经顺手,但还在逐字删除、重复复制粘贴,或者改一批文件时反复执行同一条命令。这一页把操作符、文本对象、寄存器和宏组合起来,让编辑动作可以复述和批处理。前提是熟悉普通模式、插入模式和 :wq;还不熟先看 vim-basics。
:%s/old/new/g 全文替换(% 全文,g 每行全部)
:%s/old/new/gc 全文替换并确认(c 逐个确认)
:10,20s/old/new/g 指定行范围
Vim 默认使用 magic 正则:分组要写 \(...\),用 \v 可少转义,例如 :%s/\v(\w+)=(\w+)/\1: \2/g;替换串里的 & 代表整个匹配。:g/pattern/d 删除匹配行,:v/pattern/d 删除不匹配行;:g 是全局命令,和替换标志 g 不是一回事。
操作符(d、c、y、>)后可接动作或文本对象;i 表示不含边界,a 表示含边界,光标不必精确选中整个范围。
| 对象 | 范围 | 示例 |
|---|---|---|
| iw / aw | 词(不含/含周围空白) | ciw、daw |
| i( / a( | 圆括号内/含括号 | di(、ya( |
| i{ / a{ | 花括号内/含括号 | ya{ |
| i" / a" | 双引号内/含引号 | ci" |
3dd、d2w 按计数执行;f,/t, 做行内跳转,;/, 重复或反向重复,例如 dt, 删除到下一个逗号前。
| 寄存器 | 写法 | 用途 |
|---|---|---|
无名 " |
" |
最近一次删除/复制,默认目标 |
0 / 1–9 |
"0p / "1p |
最近一次复制 / 删除历史 |
a–z |
"ayy、"ap |
命名寄存器;大写 "Ayy 追加 |
_ |
"_dd |
黑洞,丢弃内容且不覆盖其他寄存器 |
+ / * |
"+yy、"+p |
系统剪贴板 / 选择区 |
插入模式按 Ctrl+r 再按寄存器名可插入内容;:reg a + 查看寄存器。+ 需要 Vim 的 +clipboard 或 Neovim provider,先用 :echo has('clipboard') 确认。
qa A;<Esc>j q 录制:行尾加分号并下移
10@a 对后续 10 行重放
qa 开始录制、q 结束;@a 执行、@@ 重复、5@a 执行 5 次、qA 追加,. 重复上次修改。宏存放在寄存器里,往同名寄存器复制内容会覆盖宏;某一步失败时后续按键可能中止,先在少量行上验证。:g/pattern/normal @a 可对匹配行执行宏。
ma / 'a / `a 设置标记 / 跳到标记行 / 精确位置
'' 回到上次跳转位置
Ctrl+o / Ctrl+i 跳转列表后退 / 前进
gd / gD 跳到局部 / 全局定义
:vimgrep /TODO/g **/*.md 填充 quickfix;:copen 打开,:cnext/:cprev 跳转,:cdo s/foo/bar/g 对条目批量替换,:lopen 打开 location list。
buffer 是打开文件的内容,window 是 buffer 的视图,tab page 是窗口布局的集合;把 tab 当“文件标签”用会绕远路。
| 概念 | 常用命令 |
|---|---|
| buffer | :ls、:b 3、:bn、:bp、:bd |
| window | :sp、:vsp、Ctrl+w h/j/k/l、Ctrl+w q |
| tab page | :tabnew、gt、gT、:tabclose |
:e file 在当前窗口打开文件,Ctrl+w = 等宽等高,:qa 退出全部。:cdo 只作用于 quickfix 条目,列表为空会报错。
zf / zF 创建折叠(motion / 行数)
zo / zc 打开 / 关闭折叠
za 切换折叠
zR / zM 全部展开 / 全部折叠
:set foldmethod=indent " 也可 manual/syntax/expr
折叠默认是窗口的视图状态,不写回文件;:mkview 可保存视图。foldmethod=syntax 在复杂文件上可能拖慢编辑。
:%s/old/new/ 只替换每行第一个匹配,要替换全部得加 g;确认逐个替换用 gc。(foo|bar) 不会按分组工作;用 \(...\) 或 \v。dd 会覆盖无名寄存器,p 前发现内容不对就 u 撤销,再用 "0p 或命名寄存器粘贴。q 结束;在插入模式按 q 只是输入字母,宏会一直录下去。:%s/foo/bar/ 为什么只替换每行第一个?怎样替换全部并逐个确认?ciw、di(、ya{ 分别改动或复制什么范围?dd 覆盖后,怎样找回并粘贴?g 时每行只替换第一个匹配;用 :%s/foo/bar/g 替换全部,再加 c 变成 :%s/foo/bar/gc 逐个确认。ciw 修改光标所在单词,di( 删除圆括号内不含括号的内容,ya{ 复制花括号内包含括号的内容。0,用 "0p 粘贴;也可用命名寄存器 "ayy 保存,之后用 "ap 取回。
小程序版
微信扫码,随时查命令