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'

我刚开始研究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'
        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