1. 简介

Vim中有两个比较基础的概念:操作符(operator)和动作(motion)。

操作符是用于对文本进行删除或修改操作的命令。例如,d~gU> 等都是 Vim 操作符。Vim支持的所有操作符含义如下:

命令     含义
c        修改
d        删除
y        复制到寄存器
g~       反转大小写
gu       转换为小写
gU       转换为大写
>        增加缩进
<        减小缩进
=        自动缩进
!        使用外部程序过滤{motion}所跨越的行
gq       文本排版
g?       ROT13 编码
zf       定义折叠
g@       调用 'operatorfunc' 选项定义的函数

动作 (用{motion}表示) 是指移动光标的命令或动作。如经常使用的 hjkl/? 也是动作命令,如 2?the 可以将光标移动到倒数第二个 “the” 出现的位置;此外,w 表示移动至下一个单词的首部,b 表示移动至当前单词的首部,4j 表示下移四行,这些都是 Vim 动作命令。

2. 操作符与动作命令语法

vim操作符与动作命令的结合形成了一种语法。

这种语法的第一条规则很简单:一个操作由一个操作符,后面跟一个动作命令组成。

动作命令出现在操作符之后,从而使得操作符作用于被该动作 所标识的文本 (在该动作之前和之后的光标位置之间的文本)之上。

:一个动作可通过动作前和动作后的两个位置标识出一个文本区域,而标识出来的文本区域会用于执行操作符命令。

例如,由操作符和动作命令组成的 d{motion} 命令可以完成对一个字符 ( dl ) 或 一个完整单词 ( dw ) 的删除操作,删除操作作用的范围由具体的动作命令 motion 决定。同理,y2j 会复制光标当前所在位置下两行 (2j) 的内容到 Vim 无名寄存器中。

操作符和动作命令都可以搭配数字使用,用于完成多次相同的操作。如果动作命令包括一个次数而操作符之前也有一个的话,则两者相乘。例如,2d3w 命令会删除6个单词,等价于 6dw 命令 或 d6w 命令。

学习新的动作命令及操作符,就像是在学习 Vim 的词汇一样。如果掌握了这一简单的语法规则,在词汇量增长时,就能表达更多的想法。

  1. 假如我们已经知道如何用 daw 删除一个单词,然后又学到 gU 命令也是个操作符 (转成大写形式),所以我们可以用 gUaw 把当前单词转换成大写形式。

  2. 如果我们的词汇进一步扩充,学会了作用于段落的 ap 动作命令,就会发现我们可以进行两个新的操作:用 dap 删除整个段落,或者用 gUap 把整段文字转换为大写。

Vim的语法有一条额外规则:当一个操作符命令被连续调用两次时,它会作用于当前行

所以 dd 删除当前行,而 >> 缩进当前行。

gU 命令是一种特殊情况,我们既可以用 gUgU ,也可以用简化版的 gUU 来使转换大写操作完整作用于当前行。

3. vim操作符待决模式

基于上述语法,引出了一种新的vim模式:操作符待决模式 (operator pending mode),如果键入了操作符命令但还没有键入动作命令,则Vim正处于操作符待决模式下。

例如,在执行命令 dw 时就会激活该模式。这一模式只在按 dw 键之间的短暂时间间隔内存在。

如果把 Vim 想象成有限状态机,那么操作符待决模式就是一个只接受动作命令的状态。这个状态在调用操作符时被激活,然后什么也不做,直到输入一个动作命令,完成整个操作。

当操作符待决模式被激活时,我们可以像平常一样按 中止该操作,返回到普通模式。

命令 :omap 可以在待决模式时对字符进行映射,允许我们创建自定义的操作符及动作命令,从而扩充 Vim 的”词汇”。

只有Vim操作符才会激活操作符待决模式。

:很多vim命令都通过两个或更多的按键来调用 (例如:zFg&['CTRL-W b),但在多数情况下,第一个按键只是第二个按键的前缀。这些命令不会激活操作符待决模式,相反,可以把它们当成命名空间,用来扩充可用命令的数目。

4. 动作命令的作用范围

  • 大多数情况下,光标在应用操作符后停在被操作的文本的 起始处。所以,yfe 不移动光标,而 yFe向左移动光标到标识的文本的起始的那个 e 上。

  • 操作符会影响开始和结束位置之间的整行或者字符区间。一般说来,在行间移动的动作影响整行 (或者说面向行的),而在行内移动的动作影响字符区间 或者说面向字符的)。

  • 面向字符的动作可以是闭区间的,也可以是开区间的。闭区间动作的开始和结束位置包含在操作范围里,开区间动作中,靠近缓冲区尾端的最后一个字符不被包含在内。例如,Vim字符查找与光标快速移动提到的命令 t

  • 面向行的动作总包含开始和结尾的位置,即整行。

5. 操作符与可视化模式

除了先给出操作符再给出动作的方式以外,还可以用Vim可视模式:先用 “v” 标记文本的开始处,移动光标到文本的末尾,然后再输入操作符。

不同之处在于:Vim 普通模式下是先按操作符再按动作指令,而可视模式中,选中区域后直接按操作符就可以执行命令

开始和当前光标位置之间的文本以高亮显示,从而你可以直观地看到要操作的文本。

https://github.com/wsdjeg/vim-galore-zh_cn/blob/master/README.md#%E5%8A%A8%E4%BD%9C%E6%93%8D%E4%BD%9C%E7%AC%A6%E6%96%87%E6%9C%AC%E5%AF%B9%E8%B1%A1

嗯,扫一扫就可以找到小女子我啦~