Operator + Motion = Action
Vim默认的Operation Model触发命令有:
Trigger Effect
c Change
d Delete
y Yank into register
g~ Swap case
gu Make lowercase
gU Make uppercase
> Shift Right
< Shift Left
= Autoindent
! Filter {motion} lines through an external program
这些触发命令后面接移动的词,如w(单词),p(段落),l(单词),[(花括号里面的词)表示将在这些返回内执行指定的操作(operator)
故,daw-----------------表示删除一个单词
dap -------------------表示删除一个段落
同样,这里的范围可以在Visual Model中指定。
另外,Operator Model 下,加入两个相同的操作符出现时,表示对当前行进行操作。比如yy-----------------表示复制当前行, dd-----------------------表示删除当前行
cc-------------------表示将当前行删除,并置于Insert Model下。 gUgU---------------表示将当前行变成大写(有个简写gUU,gugu同样适用)
当然,VIm也可以让我们自由扩展Operator的触发命令。
//--------------------如何定制自己的Operator 触发Map---------------------------------
定制自己的Operator命令,我们必须1. 首先设置operatorfunc选项 2. 然后调用g@ operator。一旦用户键入operation {motion} 指定的函数将会触发。
g@{motion} operatorfunc 选项指定的函数。以'[为开始位置,']为结束位置,用{motion}指定范围。
该函数需要一个String类型的参数:
“line” 此时{motion}表示 以行为单位操作。
“char" 此时{motion}表示以字符为单位
”block“ 此时{motion}表示visual模式选中的块。
vim自带的doc有下面这个样例:用户按<F4>可以计算出空格的数量
nmap <silent> <F4> :set opfunc=CountSpace<CR>g@ vmap <silent> <F4> :<C-U>Call CountSpace(Visualmode(),1)<CR> function! CountSpaces(type, ...) let sel_save = &selection let &selection = "inclusive" let reg_save = @@ if a:0 silent exe "normal! '<" . a:type . "'>y" elseif a:type == 'line' silent exe "normal! '[V']y" elseif a:type == 'block' silent exe "normal! '[\<C-V>']y" else silent exe "normal! '[v']y" endif
let &selection = sel_save
let @@ = reg_save endfunc