关于 Neovim/Vim 中 Operator(操作符)的详细指南,包含常用操作符、文本编辑和高级操作技巧。

Neovim 中,“operator” 是一种对文本进行操作的命令,比如复制、删除、修改等。Operator 通常与 motion(动作,如移动光标到某个位置)配合使用,用来指定操作的范围。例如:

d$  # "d"  operator删除),"$"  motion移动到行尾

注:operator 不一定是单个键(如dy),也可以是多个键触发(如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 中,由大写字母来触发的操作也有很多:
  1. I - 在行首进入插入模式。
  2. A - 在行尾进入插入模式。
  3. O - 在当前行上方插入新行并进入插入模式。
  4. X - 删除光标前的字符。
  5. D - 删除从光标位置到行尾的内容。
  6. C - 删除从光标位置到行尾的内容,并进入插入模式。
  7. S - 删除当前行并进入插入模式。
  8. J - 将当前行与下一行合并。
  9. R - 进入替换模式。
  10. P - 在光标前粘贴剪切板内容。
  11. B - 移动光标到当前单词的开头(忽略标点符号)。
  12. W - 移动光标到下一个单词的开头(忽略标点符号)。
  13. E - 移动光标到当前单词的结尾(忽略标点符号)。
  14. G - 移动光标到文件的末尾。
  15. H - 移动光标到屏幕的顶部。
  16. M - 移动光标到屏幕的中间。
  17. L - 移动光标到屏幕的底部。
  18. F - 向左查找字符,并移动光标到该字符位置。
  19. T - 向左查找字符,并移动光标到该字符的前一个位置。
  20. K - 查找光标下单词的帮助文档。
  21. N - 进行上一次搜索的反向搜索。
  22. Q - 进入 Ex 模式。
  23. U - 撤销当前行的所有更改。
  24. V - 进入可视行模式。
  25. Y - 复制当前行。
  26. Z - 保存并退出(ZZ)。

Operator 的使用模式

  1. 单独使用
    • 直接指定一个 motion 来操作:
d$  # 删除到行尾
yG  # 复制到文档末尾
  1. 配合 text-object 使用
    • Text-object 是一组描述范围的对象(如单词、句子、段落等),常用如下:
diw  # 删除当前单词
ci"  # 删除当前引号内的内容并进入插入模式
yip  # 复制当前段落
  1. 配合行范围使用
    • 操作整个行或多行:
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

如何使用操作符

  1. 选择文本对象: 使用 wbe 等字符来选择单词、括号等文本对象。
  2. 指定操作符: 在文本对象前面加上操作符,例如 dwcc
  3. 执行命令: 按下回车键执行命令。

与窗口操作相关的操作符

  • z:
    • z-: 将当前行移到窗口顶部。
    • z.: 将当前行移到窗口底部。
    • zt: 将当前行移到窗口中间。
    • zz: 将当前行移到窗口的中间,同时调整窗口大小,使当前行位于窗口的中间。

与折叠相关的操作符

  • zf: 将当前行折叠成一个折叠。
  • zo: 打开一个折叠。
  • zc: 关闭一个折叠。
  • za: 交替打开或关闭一个折叠。

其它常用操作符

  • =: 自动缩进当前行或选中的文本。
  • >: 向右缩进。
  • <: 向左缩进。
  • ~: 将当前字符的大小写转换。
  • gu: 将选中的文本转换为小写。
  • gU: 将选中的文本转换为大写。
  • J: 合并当前行和下一行。
  • P: 在当前行上方粘贴。
  • p: 在当前行下方粘贴。
  • r: 替换当前字符。
  • s: 删除当前字符并进入插入模式。
  • S: 删除整行并进入插入模式。

结合文本对象使用

这些操作符可以与各种文本对象结合使用,例如:

  • daw:删除一个单词(包括空格)
  • dib:删除一个括号内的内容
  • yip:复制一个段落
  • zfap:折叠整个段落

小技巧

  • 数字重复: 在操作符前面加上数字可以重复执行操作,例如 2dd 删除两行。
  • . 命令重复: 点号(.)可以重复上一次的普通模式命令。

扩展/自定义 Operator

  1. 插件支持
    • 一些插件提供额外的 operators,例如:
      • vim-commentary:增加注释操作,如 gcc
      • vim-surround:提供更灵活的 ys 等操作。
  2. 自定义操作
    • 使用 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 不够用,你可以通过插件或自定义脚本扩展功能。