【发布时间】:2017-07-26 21:09:57
【问题描述】:
我目前正在为 Vim 编写一个插件,我希望它在我执行后恢复默认寄存器。但是,有问题的函数是通过<C-r>=Myfunction()<CR> 构造调用的,这意味着我需要在函数返回后恢复它。我试过这样做:
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。显然这个函数并没有真正做任何事情,但我使用的实际函数很长。另外,如果该字符串有点难以阅读,我深表歉意,但我不确定是否有其他方法可以完成此操作。总而言之,当寄存器包含一个单词时,该函数似乎可以工作,但每当寄存器中有换行符时,该函数就会失败。 (关于 oldreg 参数的具体错误是 E115: Missing quote。)我试图通过首先对 oldreg 进行脱壳来解决这个问题;但是,这会导致错误E121: Undefined Variable,其中未定义的变量是我的寄存器中的值。对这里可能出了什么问题有任何想法吗?
编辑:我找到了解决方案。它很毛茸茸,但到目前为止效果很好。以下是如何将解决方案应用于我的示例代码,以防万一它对那里的任何人有所帮助。
inoremap <silent> <Space> <C-r>=Myfunction()<CR>
function! Myfunction()
let oldreg = substitute(escape(getreg('"'), '\\'), '\n', '\\n', 'g')
let oldregtype = getregtype('"')
let restore = "\<ESC>:call setreg('\"',\"".oldreg."\",'".oldregtype."')\<CR>a"
let @" = "whatever"
return "\<ESC>yya ".restore
endfunction
【问题讨论】:
-
目前,您的示例对我来说没有多大意义,因为我看不出是什么阻碍了您在函数末尾直接调用
setreg。是什么阻碍了这一点?为什么在调用函数后需要将其重置?如果函数只返回一个字符串?您需要在其他地方使用"@吗?仅当您需要在通话中的MyFunction结束和<CR>之间使用它时,这才有意义,无论如何都不会发生。抱歉,我的评论没有回答问题,我只是想了解您的目标,因为似乎还有其他方法可以做到这一点。 :) -
@sidyll vim 中没有名为
@的寄存器。 -
所以最好将问题 [on-hold] 待进一步澄清。
-
@sidyll
@寄存器是未命名寄存器的别名。我忘了"通常是寄存器的更传统的符号。我已经编辑了函数以显示在返回字符串中使用了寄存器,所以很遗憾,我不能简单地正常调用 setreg。
标签: vim restore vim-registers