Vim的operator model

Vim的operator model基于Operator + Motion模式执行Action,如c(改变)、d(删除)、y(复制)等,结合w、p、l等移动命令。在Visual Mode中可指定范围,连续操作符对当前行生效。可通过设置operatorfunc和g@自定义新Operator,例如使用<F4>计算空格数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值