繁体   English   中英

如何在 Vim 中获取当前命令寄存器值/名称?

[英]How to get current command register value/name in Vim?

目前我有这个映射:

  nmap <silent> x :set opfunc=SpecialChange<CR>g@
  function! SpecialChange(type)
    silent exec 'normal! `[v`]"_dP'
  endfunction

它可以帮助我用默认寄存器值替换一些值。

但是,我希望能够用某个特定的寄存器替换该值,为此我需要知道当前命令寄存器的值或名称(或两者都更好)。 例如,当我按下"axiw"时,我想a寄存器替换这个词,但我需要了解按下a寄存器而不是bc或其他东西。 有没有办法做到这一点?

:help :map-operator下提供的示例中获取灵感,您的函数应该是这样的:

nnoremap <expr> <key> SpecialChange()
function! SpecialChange(type = '')
    if a:type == ''
        set opfunc=SpecialChange
        return 'g@'
    endif
    execute 'normal! `[v`]"_d"' .. v:register .. 'P'
endfunction

解释:

  • 由于这句话,我们使用<expr>映射:

    <expr>映射用于获取任何前缀计数和寄存器。

  • SpecialChange()采用单个type参数,默认值为空字符串。

  • 当不带参数调用时,该函数将opfunc设置为自身并最终返回g@ 这是另一种做法:

     :set opfunc=SpecialChange<CR>g@
  • 当作为operatorfunc调用时, SpecialChange()获取值为linecharblocktype参数,因此我们跳过条件并直接进入函数的核心,我们可以在其中使用v:register因为我们在<expr>映射:

     execute 'normal! `[v`]"_d"' .. v:register .. 'P'

这一切都是人为的,但这就是我们必须解决的问题。

我想我丢失了当前的寄存器名称。 这是对我有用的解决方案:

nmap x :call SetActiveRegister()<CR>:set opfunc=SpecialChange<CR>g@

let g:activeRegisterName = ''

function! SpecialChange(type)
  silent exec 'normal! `[v`]"_di' .. getreg(g:activeRegisterName)
endfunction

function! SetActiveRegister()
  let g:activeRegisterName = v:register
endfunction

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM