Vim 在a<;之后恢复寄存器;C-r>;函数调用
我目前正在为Vim编写一个插件,我希望它在执行后恢复默认寄存器。但是,所讨论的函数是通过Vim 在a<;之后恢复寄存器;C-r>;函数调用,vim,restore,vim-registers,Vim,Restore,Vim Registers,我目前正在为Vim编写一个插件,我希望它在执行后恢复默认寄存器。但是,所讨论的函数是通过=Myfunction()构造调用的,这意味着我需要在函数返回后恢复它。我试着这样做: inoremap <silent> <Space> <C-r>=Myfunction()<CR> function! Myfunction() let oldreg = getreg('"') let oldregtype = getregtype
=Myfunction()
构造调用的,这意味着我需要在函数返回后恢复它。我试着这样做:
inoremap <silent> <Space> <C-r>=Myfunction()<CR>
function! Myfunction()
let oldreg = getreg('"')
let oldregtype = getregtype('"')
let restore = "\<ESC>:call setreg('\"','".oldreg."','".oldregtype."')\<CR>a"
let @" = "whatever"
return "\<ESC>yya ".restore
endfunction
我认为,在你返回函数后,你不会进入正常模式 你应该进去。这样,您就可以正常调用
setreg()
在里面。例如:
function! Myfunction()
let oldreg = getreg('"')
let oldregtype = getregtype('"')
let @" = "whatever"
normal! yya
setreg('"', oldreg, oldregtype)
endfunction
下面是一个方法: 从那时起,我们就拥有了
setreg()
,我还开发了一个更通用的解决方案,简化了最有用的东西的恢复()
在所有情况下,解决方案都是返回@=FunctionToExecute()
,并在该函数中进行恢复
但正如其他人所说,您可能需要更明确地了解您的需求,因为可能存在更具体的解决方案来解决这些需求。例如,您不必使用
yy
或:yank
,只需使用getline()
函数即可使所有寄存器不被修改。对于更改行,有setline()
,但这会中断重做和其他操作。检查。目前,您的示例对我来说没有多大意义,因为我不明白是什么阻碍了您在函数末尾直接调用setreg
。是什么阻碍了这一点?为什么在调用函数后需要将其重置回来?如果函数只返回一个字符串?您需要使用“@
其他地方?只有当您需要在调用中的MyFunction
结束和
之间使用它时,这才有意义,而这无论如何都不会发生。很抱歉,我的评论没有回答这个问题,我只是想了解你的目标,因为似乎还有其他方法可以做到这一点。:)@sidyll在vim中没有名为@
的寄存器。因此最好将问题[搁置]到进一步澄清。@sidyll@
寄存器是未命名寄存器的别名。我忘了“
通常是寄存器的更常规符号。我对函数进行了编辑,以显示在返回字符串中正在使用寄存器,因此,不幸的是,我无法正常调用setreg。您的建议有效,因此我将此标记为正确。然而,我发现了一个稍微不同的解决方案,它更适合我的程序结构。
function! Myfunction()
let oldreg = getreg('"')
let oldregtype = getregtype('"')
let @" = "whatever"
normal! yya
setreg('"', oldreg, oldregtype)
endfunction