[英]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
寄存器而不是b
或c
或其他东西。 有没有办法做到这一点?
从: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()
获取值为line
、 char
或block
的type
参数,因此我们跳过条件并直接进入函数的核心,我们可以在其中使用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.