系统学习 学习路径总入口:先选领域,再建立模型,最后用故障演练验证

Vim 进阶:替换、文本对象、寄存器、宏、quickfix 与分屏

适用场景

基础编辑已经顺手,但还在逐字删除、重复复制粘贴,或者改一批文件时反复执行同一条命令。这一页把操作符、文本对象、寄存器和宏组合起来,让编辑动作可以复述和批处理。前提是熟悉普通模式、插入模式和 :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 可对匹配行执行宏。

标记、跳转与 quickfix

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 在复杂文件上可能拖慢编辑。

易错点

相关条目

参考链接

读完自测

  1. :%s/foo/bar/ 为什么只替换每行第一个?怎样替换全部并逐个确认?
  2. ciw、di(、ya{ 分别改动或复制什么范围?
  3. 刚复制的内容被 dd 覆盖后,怎样找回并粘贴?
答案
  1. 替换命令不带 g 时每行只替换第一个匹配;用 :%s/foo/bar/g 替换全部,再加 c 变成 :%s/foo/bar/gc 逐个确认。
  2. ciw 修改光标所在单词,di( 删除圆括号内不含括号的内容,ya{ 复制花括号内包含括号的内容。
  3. 最近一次复制保存在寄存器 0,用 "0p 粘贴;也可用命名寄存器 "ayy 保存,之后用 "ap 取回。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令