-
Notifications
You must be signed in to change notification settings - Fork 0
nvim learn 02 editing and text objects
ES edited this page Jul 16, 2026
·
1 revision
新手第二课:Vim 编辑的核心公式 — 动词 + 范围。掌握这个组合,效率起飞
[数字] + 动词 + 范围
例如:d2w(删 2 个词)、ci"(改引号内)、yap(复制段落含前后空行)
| 键 | 动词 | 作用 |
|---|---|---|
d |
delete | 删除 |
c |
change | 删除并进入插入模式 |
y |
yank | 复制 |
v |
visual | 选中(然后手动操作) |
> / <
|
indent | 增加 / 减少缩进 |
= |
format | 自动缩进 |
gu |
lowercase | 转小写;u 可联想小写 |
gU |
Uppercase | 转大写 |
g~ |
toggle case | 翻转大小写 |
gq |
format | 按 textwidth 重排文本;q 没有可靠缩写 |
动词重复自身 = 作用于整行:dd 删行、cc 改行、yy 复制行、>> 缩进行、guu 整行小写
Motion 即移动命令,动词 + motion = 从光标到目标的范围:
| 范围 | 英文助记 | 含义 | 示例 |
|---|---|---|---|
w |
word | 到下一个词首 |
dw 删到下一个词首 |
e |
end | 到当前词尾 |
de 删到词尾 |
b |
backward | 到上一个词首 |
db 删到上一个词首 |
$ |
行尾符号 | 到行尾 |
d$ 或 D 删到行尾 |
0 |
第 0 列 | 到行首 |
d0 删到行首 |
^ |
行首锚点 | 到行首非空 |
d^ 删到行首非空 |
gg |
go | 到文件头 |
dgg 删到文件头 |
G |
go | 到文件尾 |
dG 删到文件尾 |
f{char} |
find | 到本行的 char |
df) 删到右括号(含) |
t{char} |
till | 到 char 前一格 |
dt) 删到右括号前 |
/{pattern} |
search | 到搜索匹配处 |
d/foo 删到 foo 出现处 |
文本对象是结构化的范围,不依赖光标位置,而是基于文本结构。两种前缀:
-
i= inner(内部,不含分隔符) -
a= around(周围,含分隔符 / 前后空格)
| 对象 | 含义 | inner(内部) | around(整体) |
|---|---|---|---|
w |
word(单词) |
diw 删除词 |
daw 删除词及周围空格 |
W |
WORD |
diW 按空格分词删除 |
daW 删除 WORD 及周围空格 |
s |
sentence(句子) |
dis 删除句子内容 |
das 删除句子及前后空格 |
p |
paragraph(段落) |
dip 删除段落内容 |
dap 删除段落及前后空行 |
" |
双引号 |
di" 删除引号内内容 |
da" 连同双引号删除 |
' |
单引号 |
di' 删除引号内内容 |
da' 连同单引号删除 |
` |
反引号 |
di` 删除引号内内容 |
da` 连同反引号删除 |
( 或 b
|
小括号 |
di( / dib 删除括号内内容 |
da( / dab 连同括号删除 |
{ 或 B
|
大括号 |
di{ / diB 删除括号内内容 |
da{ / daB 连同括号删除 |
[ |
方括号 |
di[ 删除括号内内容 |
da[ 连同括号删除 |
< |
尖括号 |
di< 删除括号内内容 |
da< 连同括号删除 |
t |
tag(HTML/XML 标签) |
dit 删除标签内容 |
dat 连同标签删除 |
// 光标在 hello 的 e 上
const str = "hello world"
ci" // → const str = "|" 改引号内(光标留在引号间,插入模式)
da" // → const str = 删除含引号
// 光标在函数体内任意位置
function test(a, b) {
return a + b
}
di{ // 删除函数体,保留花括号
da{ // 删除整个 { ... }
ci( // 改参数列表(删除 a, b 并进入插入模式)
// HTML
<div>content</div>
dit // 删除 content,保留标签
dat // 删除整个 <div>content</div>| 命令 | 作用 |
|---|---|
:s/old/new/ |
替换当前行第一个匹配 |
:s/old/new/g |
替换当前行所有匹配 |
:%s/old/new/g |
替换全文所有匹配 |
:%s/old/new/gc |
替换全文,逐个确认(y = yes / n = no / a = all) |
:5,10s/old/new/g |
替换第 5~10 行 |
搜索替换中的特殊字符:
| 字符 | 含义 |
|---|---|
. |
任意字符 |
\d |
数字 |
\w |
字母/数字/下划线 |
\n |
换行(替换中用 \r) |
\( \)
|
捕获组 |
\1 |
引用第一个捕获组 |
\< \>
|
单词边界 |
| 操作 | 按键 | 说明 |
|---|---|---|
| 撤销 | u |
undo |
| 重做 | Ctrl-r |
redo |
| 重复上次修改 | . |
最强按键 — 见下方技巧 |
| 合并行 | J |
join:当前行与下一行合并(加空格) |
| 合并行(不加空格) | gJ |
同上但不加空格 |
| 翻转字符大小写 | ~ |
翻转光标下字符并右移 |
| 数字 +1 / -1 |
Ctrl-a / Ctrl-x
|
光标下或光标后的第一个数字 |
| 缩进 / 反缩进 |
>> / <<
|
当前行 |
. 重复上次"修改操作"(从进入 Insert 到退出算一次完整操作)。经典用法:
场景:把多处 foo 改成 bar
/foo 搜索 foo
cgn 选中下一个匹配并改为...输入 bar,按 Esc
. 重复(自动找下一个 foo 并改为 bar)
. 再来一次
n 跳过这个不改
. 改下一个
cgn= change + gn(gn 选中下一个搜索匹配),配合.实现逐个替换,比:%s更可控
基础编辑学完了,进入 Advanced Commands 学习高级命令和开发技巧