Neovim Operator 操作指南
Post on February 15, 2025 · 3230 words · reading time 2 min
关于 Neovim/Vim 中 Operator(操作符)的详细指南,包含常用操作符、文本编辑和高级操作技巧。
在 Neovim 中,“operator” 是一种对文本进行操作的命令,比如复制、删除、修改等。Operator 通常与 motion(动作,如移动光标到某个位置)配合使用,用来指定操作的范围。例如:
d$ # "d" 是 operator(删除),"$" 是 motion(移动到行尾)
注:operator 不一定是单个键(如d
,y
),也可以是多个键触发(如g~
,gu
)
以下是 Neovim 支持的主要 operators:
常见的 Neovim Operator 列表
Operator | 描述 | 示例 | 含义 |
---|---|---|---|
d | 删除指定范围内的文本 | dw | 删除当前单词 |
y | 复制(yank)指定范围内的文本 | y$ | 复制从光标到行尾的内容 |
c | 删除指定范围内的文本并进入插入模式 | ciw | 删除当前单词并进入插入模式 |
> | 增加缩进 | >ap | 增加当前段落的缩进 |
< | 减少缩进 | <ip | 减少当前段落的缩进 |
= | 自动对齐 | =G | 对从光标到文档末尾的文本自动对齐 |
! | 使用外部命令处理文本 | !iw sort | 对当前单词用 sort 命令排序(会报错,适用更大范围如行) |
z | 折叠/展开相关的操作符 | zfa} | 折叠直到下一个 {} |
zf | 折叠(fold)指定范围的文本 | zf% | 折叠当前括号内的文本 |
~ | 切换大小写(单字符) | ~iw | 切换当前单词的大小写 |
g~ | 切换大小写(大小写互转) | g~w | 切换当前单词的大小写 |
gu | 将文本转为小写 | guG | 将光标到文档末尾的文本转为小写 |
gU | 将文本转为大写 | gUw | 将当前单词转为大写 |
gq | 格式化文本(使用 formatprg 或内置规则) | gqap | 格式化当前段落 |
g@ | 执行用户定义的操作(例如宏) | g@iw | 对当前单词应用上一次宏定义 |
g<C-a> | 递增操作 | g<C-a>w | 递增当前单词中的数字 |
g<C-x> | 递减操作 | g<C-x>w | 递减当前单词中的数字 |
在 Vim 中,由大写字母来触发的操作也有很多: |
- I - 在行首进入插入模式。
- A - 在行尾进入插入模式。
- O - 在当前行上方插入新行并进入插入模式。
- X - 删除光标前的字符。
- D - 删除从光标位置到行尾的内容。
- C - 删除从光标位置到行尾的内容,并进入插入模式。
- S - 删除当前行并进入插入模式。
- J - 将当前行与下一行合并。
- R - 进入替换模式。
- P - 在光标前粘贴剪切板内容。
- B - 移动光标到当前单词的开头(忽略标点符号)。
- W - 移动光标到下一个单词的开头(忽略标点符号)。
- E - 移动光标到当前单词的结尾(忽略标点符号)。
- G - 移动光标到文件的末尾。
- H - 移动光标到屏幕的顶部。
- M - 移动光标到屏幕的中间。
- L - 移动光标到屏幕的底部。
- F - 向左查找字符,并移动光标到该字符位置。
- T - 向左查找字符,并移动光标到该字符的前一个位置。
- K - 查找光标下单词的帮助文档。
- N - 进行上一次搜索的反向搜索。
- Q - 进入 Ex 模式。
- U - 撤销当前行的所有更改。
- V - 进入可视行模式。
- Y - 复制当前行。
- Z - 保存并退出(ZZ)。
Operator 的使用模式
- 单独使用:
- 直接指定一个 motion 来操作:
d$ # 删除到行尾
yG # 复制到文档末尾
- 配合 text-object 使用:
- Text-object 是一组描述范围的对象(如单词、句子、段落等),常用如下:
diw # 删除当前单词
ci" # 删除当前引号内的内容并进入插入模式
yip # 复制当前段落
- 配合行范围使用:
- 操作整个行或多行:
dd # 删除当前行
y2j # 复制当前行及接下来的两行
常用操作符
- d(delete): 删除文本。
dw
:删除一个单词db
:删除到前一个单词的开头diw
:删除内部的单词(不包括空格)daw
:删除一个单词(包括空格)dt)
:删除到下一个右括号
- y(yank): 复制文本到寄存器
yw
:复制一个单词yy
:复制一行
- c(change): 修改文本
cw
:修改一个单词cc
:修改整行
- >(shift right): 向右缩进
- <(shift left): 向左缩进
- ~(swap case): 大小写转换
- gu(lowercase): 转为小写
- gU(uppercase): 转为大写
操作符与文本对象的结合
操作符的真正威力在于与文本对象的结合。文本对象可以是单词、句子、段落等。例如:
daw
:删除一个单词(包括空格)dib
:删除一个括号内的内容yip
:复制一个段落
其他操作符
除了上述常用的操作符,Vim 还提供了许多其他操作符,用于执行更复杂的操作,例如:
- =(equal): 自动缩进
- !(filter): 通过外部命令过滤文本
- J(join): 合并行
更多示例
- 删除当前行到行尾:
D
- 修改当前行:
C
- 删除当前字符:
x
- 删除当前字符前的字符:
X
如何使用操作符
- 选择文本对象: 使用
w
、b
、e
等字符来选择单词、括号等文本对象。 - 指定操作符: 在文本对象前面加上操作符,例如
dw
、cc
。 - 执行命令: 按下回车键执行命令。
与窗口操作相关的操作符
- z:
- z-: 将当前行移到窗口顶部。
- z.: 将当前行移到窗口底部。
- zt: 将当前行移到窗口中间。
- zz: 将当前行移到窗口的中间,同时调整窗口大小,使当前行位于窗口的中间。
与折叠相关的操作符
- zf: 将当前行折叠成一个折叠。
- zo: 打开一个折叠。
- zc: 关闭一个折叠。
- za: 交替打开或关闭一个折叠。
其它常用操作符
- =: 自动缩进当前行或选中的文本。
- >: 向右缩进。
- <: 向左缩进。
- ~: 将当前字符的大小写转换。
- gu: 将选中的文本转换为小写。
- gU: 将选中的文本转换为大写。
- J: 合并当前行和下一行。
- P: 在当前行上方粘贴。
- p: 在当前行下方粘贴。
- r: 替换当前字符。
- s: 删除当前字符并进入插入模式。
- S: 删除整行并进入插入模式。
结合文本对象使用
这些操作符可以与各种文本对象结合使用,例如:
daw
:删除一个单词(包括空格)dib
:删除一个括号内的内容yip
:复制一个段落zfap
:折叠整个段落
小技巧
- 数字重复: 在操作符前面加上数字可以重复执行操作,例如
2dd
删除两行。 - . 命令重复: 点号(.)可以重复上一次的普通模式命令。
扩展/自定义 Operator
- 插件支持:
- 一些插件提供额外的 operators,例如:
- vim-commentary:增加注释操作,如
gcc
。 - vim-surround:提供更灵活的
ys
等操作。
- vim-commentary:增加注释操作,如
- 一些插件提供额外的 operators,例如:
- 自定义操作:
- 使用 Vim 脚本或 Lua,可以定义自己的 operator。例如:
" 定义一个删除并打印文本的 operator
nnoremap <leader>d :call DeleteAndPrint()<CR>
function! DeleteAndPrint()
execute "normal! \"_dd"
echo "Line deleted"
endfunction
- Neovim 提供了丰富的内置 operators,适用于各种文本操作场景。
- 通过结合 motions 和 text-objects,操作范围可以精确到字符、单词、句子、段落,甚至文件。
- 如果内置的 operators 不够用,你可以通过插件或自定义脚本扩展功能。
Post on February 15, 2025 · 384 words