Vim-将寄存器传递给操作员功能

Vim-将寄存器传递给操作员功能,vim,Vim,我正在尝试实现ChangePaste操作符。它应该用寄存器中的文本替换文本 它可以很好地处理运动,因此我可以使用cp,文本将从默认寄存器中替换 现在我想能够使用不同的寄存器。我正在寻找如何将所选寄存器传递给操作员函数的信息。因此,如果有一种类型的acpiw,我希望脚本用registera内容替换一个内部字。这可能吗 迄今为止的代码: nmap <silent> cp :set opfunc=ChangePaste<CR>g@ function! ChangePaste(

我正在尝试实现ChangePaste操作符。它应该用寄存器中的文本替换文本

它可以很好地处理运动,因此我可以使用
cp
,文本将从默认寄存器中替换

现在我想能够使用不同的寄存器。我正在寻找如何将所选寄存器传递给操作员函数的信息。因此,如果有一种类型的acpiw
,我希望脚本用register
a
内容替换一个内部字。这可能吗

迄今为止的代码:

nmap <silent> cp :set opfunc=ChangePaste<CR>g@ 
function! ChangePaste(type, ...)
    if a:0  " Invoked from Visual mode, use '< and '> marks.
        silent exe "normal! `<" . a:type . "`>\"_c" . @"
    elseif a:type == 'line'
        silent exe "normal! '[V']\"_c" . @"
    elseif a:type == 'block'
        silent exe "normal! `[\<C-V>`]\"_c" . @"
    else
        silent exe "normal! `[v`]\"_c" . @"
    endif
endfunction
nmap cp:set opfunc=ChangePasteg@
函数!更改粘贴(类型,…)
如果从可视模式调用:0”,请使用“<和”>标记。
静默exe“正常”`“c”@
elseif a:type=='line'
静默exe“正常!”[V']\“\U c”。@”
elseif a:type=='block'
静默exe“正常”`[\`]\“\u c.@”
其他的
静默exe“正常”`[v`]\“\U c”。@
恩迪夫
端功能
编辑:

使用v:寄存器和缓冲区变量的解决方案:

nmap <silent> cp :let b:changepaste_buffer = v:register<cr>:set opfunc=ChangePaste<CR>g@ 
function! ChangePaste(type, ...)
    if a:0  " Invoked from Visual mode, use '< and '> marks.
        silent exe "normal! `<" . a:type . "`>\"_c" . getreg(b:changepaste_register)
    elseif a:type == 'line'
        silent exe "normal! '[V']\"_c" . getreg(b:changepaste_register)
    elseif a:type == 'block'
        silent exe "normal! `[\<C-V>`]\"_c" . getreg(b:changepaste_register)
    else
        silent exe "normal! `[v`]\"_c" . getreg(b:changepaste_register)
    endif
endfunction
nmap cp:let b:changepaste_buffer=v:register:set opfunc=ChangePasteg@
功能!更改粘贴(类型,…)
如果从可视模式调用:0”,请使用“<和”>标记。
无声exe“正常`\“_c”。getreg(b:changeplaste\u寄存器)
elseif a:type=='line'
静默exe“normal!”[V']\“\u c”.getreg(b:changeplaste\u寄存器)
elseif a:type=='block'
无声exe“正常`[\`]\“\u c”。getreg(b:changeplaste\u寄存器)
其他的
静默exe“正常”`[v`]\“\u c”.getreg(b:changepaste\u寄存器)
恩迪夫
端功能
如注释中所述,您可以访问函数中的
v:register
变量


甚至不需要将其保存为缓冲区变量。

:帮助v:在ChangePaste函数中注册它总是设置为
。作为一种解决方法,我使用缓冲区变量存储最后一个寄存器,然后从该变量获取值。请参见编辑@你能不能把它作为一个答案加上,这样我就可以接受了?