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

时间:2016-08-10 19:51:55

标签: vim

我正在尝试实施ChangePaste运算符。它应该用寄存器中的文本替换文本。

它可以正常运行,因此我可以使用cp<motion>,文本将从默认寄存器中替换。

现在我希望能够将它与不同的寄存器一起使用。我正在寻找如何将所选寄存器传递给操作员功能的信息。因此,如果一个类型"acpiw我希望脚本用注册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

编辑:

使用v:register和buffer variable的解决方案:

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

1 个答案:

答案 0 :(得分:0)

正如@romainl在评论中提到的那样,您可以访问函数中的v:register变量。

甚至无需将其另存为缓冲区变量。