1. 简介
Vim中有两个比较基础的概念:操作符(operator)和动作(motion)。
一般来说,操作符用于删除或修改文本,动作 (用{motion}表示) 是指移动光标的命令或动作。例如: w
表示移动至下一个单词的首部,b
表示移动至当前单词的首部,4j
表示下移四行。
动作命令出现在操作符之后,从而使得操作符作用于被该动作 所标识的文本 (在该动作之前和之后的光标位置之间的文本)之上。
例如,d{motion}
命令可以完成对一个字符 ( dl
)、一个完整单词 ( daw
) 或一整个段落 ( dap
) 的删除操作,它作用的范围由具体的动作命令 motion 决定。
vim支持的所有操作符含义如下:
命令 含义
c 修改
d 删除
y 复制到寄存器
g~ 反转大小写
gu 转换为小写
gU 转换为大写
> 增加缩进
< 减小缩进
= 自动缩进
! 使用外部程序过滤{motion}所跨越的行
gq 文本排版
g? ROT13 编码
zf 定义折叠
g@ 调用 'operatorfunc' 选项定义的函数
2. 操作符与动作命令语法
vim操作符与动作命令的结合形成了一种语法。
这种语法的第一条规则很简单:一个操作由一个操作符,后面跟一个动作命令组成。
如果动作命令包括一个次数而操作符之前也有一个的话,两者相乘。例如,2d3w
命令会删除6个单词。
学习新的动作命令及操作符,就像是在学习 Vim 的词汇一样。如果掌握了这一简单的语法规则,在词汇量增长时,就能表达更多的想法。
假如我们已经知道如何用
daw
删除一个单词,然后又学到gU
命令也是个操作符 (转成大写形式),所以我们可以用gUaw
把当前单词转换成大写形式。如果我们的词汇进一步扩充,学会了作用于段落的
ap
动作命令,就会发现我们可以进行两个新的操作:用dap
删除整个段落,或者用gUap
把整段文字转换为大写。
Vim的语法有一条额外规则:当一个操作符命令被连续调用两次时,它会作用于当前行。
所以 dd
删除当前行,而 >>
缩进当前行。
gU
命令是一种特殊情况,我们既可以用 gUgU
,也可以用简化版的 gUU
来使转换大写操作完整作用于当前行。
3. vim操作符待决模式
基于上述语法,引出了一种新的vim模式:操作符待决模式 (operator pending mode),如果键入了操作符命令但还没有键入动作命令,则Vim正处于操作符待决模式下。
例如,在执行命令 dw
时就会激活该模式。这一模式只在按 d
及 w
键之间的短暂时间间隔内存在。
如果把 Vim 想象成有限状态机,那么操作符待决模式就是一个只接受动作命令的状态。这个状态在调用操作符时被激活,然后什么也不做,直到输入一个动作命令,完成整个操作。
当操作符待决模式被激活时,我们可以像平常一样按
命令 :omap
可以在待决模式时对字符进行映射,允许我们创建自定义的操作符及动作命令,从而扩充 Vim 的”词汇”。
只有Vim操作符才会激活操作符待决模式。
注:很多vim命令都通过两个或更多的按键来调用 (例如:zF
、g&
、['
、CTRL-W b
),但在多数情况下,第一个按键只是第二个按键的前缀。这些命令不会激活操作符待决模式,相反,可以把它们当成命名空间,用来扩充可用命令的数目。
4. 动作命令的作用范围
大多数情况下,光标在应用操作符后停在被操作的文本的 起始处。所以,
yfe
不移动光标,而yFe
则向左移动光标到标识的文本的起始的那个 e 上。操作符会影响开始和结束位置之间的整行或者字符区间。一般说来,在行间移动的动作影响整行 (或者说面向行的),而在行内移动的动作影响字符区间 或者说面向字符的)。
面向字符的动作可以是闭区间的,也可以是开区间的。闭区间动作的开始和结束位置包含在操作范围里,开区间动作中,靠近缓冲区尾端的最后一个字符不被包含在内。例如,Vim字符查找与光标快速移动提到的命令
t
。面向行的动作总包含开始和结尾的位置,即整行。
5. 操作符与可视化模式
除了先给出操作符再给出动作的方式以外,还可以用可视模式: 先用 “v” 标记文本的开始处,移动光标到文本的末尾,然后再输入操作符。
开始和当前光标位置之间的文本以高亮显示,从而你可以直观地看到要操作的文本。

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