Vim的operator model

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







你可能感兴趣的:(Vim的operator model)