Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 在a<;之后恢复寄存器;C-r>;函数调用_Vim_Restore_Vim Registers - Fatal编程技术网

Vim 在a<;之后恢复寄存器;C-r>;函数调用

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

我目前正在为Vim编写一个插件,我希望它在执行后恢复默认寄存器。但是,所讨论的函数是通过
=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