vim特殊标记行为?
我刚开始研究vim插件,并试图为自己编写一个。我想使用Vim的标记功能。我在一本书中发现以下内容:vim特殊标记行为?,vim,centos7,Vim,Centos7,我刚开始研究vim插件,并试图为自己编写一个。我想使用Vim的标记功能。我在一本书中发现以下内容: nnoremap <leader>g :set operatorfunc=GrepOperator<cr>g@ vnoremap <leader>g :<c-u>call GrepOperator(visualmode())<cr> function! GrepOperator(type) if a:type ==# 'char'
nnoremap <leader>g :set operatorfunc=GrepOperator<cr>g@
vnoremap <leader>g :<c-u>call GrepOperator(visualmode())<cr>
function! GrepOperator(type)
if a:type ==# 'char'
normal! `[v`]y
else
return
endif
echom shellescape(@@)
endfunction
当我在vim的正常模式下键入以下命令时:
normal! `[v`]y
使用一个文件,它根据我之前所做的操作(我更改了文本或拖动了多少行)来拖动行
但如果我调用与运动操作符绑定的上述函数相同的命令
该行为与它回显当前光标下的字符不同
我使用的动议是:vi(g
为什么这两种行为不符合vim帮助文档
谢谢。你说得对,Vim“重载”了'[
和']
更改标记,以表示运算符函数中移动的文本。这避免了引入另一个特殊标记。常规:help'[
在这里不适用
严格地说,运算符函数仅适用于普通模式{opfunc}{motion}
,但通常您也希望它们在可视模式下工作({visual}{opfunc}
)。您还定义了:nmap
和:vmap
type
函数参数是运算符函数如何区分这两种模式的。正如您使用的vi(g
,这是可视模式变量(gi(
)应该已经工作了)。不幸的是,您的实现忽略了这方面的代码;它只处理正常模式(目前为止,仅限于按字符移动)。在视觉模式下,type
参数包含一个v
/v
/
值;您也需要处理该值:
function! GrepOperator(type)
if a:type ==# 'char'
normal! `[v`]y
elseif a:type ==# 'v'
normal! `<v`>y
else
return
endif
echom shellescape(@@)
endfunction
函数!GrepOperator(类型)
如果a:type=#“char”
正常!`[v`]y
其他a:type=#“v”
正常
其他的
返回
恩迪夫
echom shellescape(@)
端功能
由于视觉选择是由
定义的,我试图将命令解释为:`[v`]y
转到光标或运动命令下单词的第一个字符。然后转到视觉模式。然后选择直到单词或运动命令值(字符)的最后一个字符。然后猛拉它。这是正确的解释,或者我没有得到正确的理解。是的,这捕获了默认寄存器中运算符函数上使用的运动所涵盖的文本。感谢澄清。啊,很高兴我能提供帮助!请单击概述的复选标记接受答案。这样,问题是标记为“已关闭”,则会增加您获得未来问题答案的机会,因为这表明您关心答案。
function! GrepOperator(type)
if a:type ==# 'char'
normal! `[v`]y
elseif a:type ==# 'v'
normal! `<v`>y
else
return
endif
echom shellescape(@@)
endfunction