所以,这是我在尝试编写插件时遇到的一种奇怪的情况。它看起来像Vim中的一个bug,但我可能会遗漏一些东西,所以我转向了StackOverflow的智慧。
采取此功能:
fun! Test()
normal! q ; Stop recording a macro.
let @r='kkkkkkkkkkkkk'
normal! @r
normal! qm
endf
基本上,我停止录制宏,尝试运行寄存器的内容,然后开始重新录制宏。
我通过点击qm
,执行一些命令,然后调用函数来调用此函数。
我的期望
我希望执行“kkkkkk”,然后重新开始录制。
发生了什么
“kkkk”正在运行,但录制而不是再次启动。
我不明白为什么!
解决方法
以下功能可以满足我的需求,但这是一个黑客攻击。我试图了解问题的根本原因:
乐趣!测试() 正常! q 让@ r ='kkkkkkkkkkkkk' 执行“正常!”。 @r 正常! QM ENDF
我刚用一个直接执行寄存器内容的执行调用替换了寄存器的运行。我欺骗了vim,基本上不认为它正在运行寄存器。
注意:为什么我要这个
这是一个插件。这个函数是我能做的最小的函数。不值得进入我想要的原因 - 我需要的基本功能是从一个函数中运行一个寄存器,然后再开始记录它。在实际使用案例中,我运行和记录的寄存器是相同的,但它似乎没有影响这个问题。
那么,有什么想法吗?
答案 0 :(得分:3)
为什么不能在函数映射中嵌入函数调用:
function Test()
let @r='kkkkkkkkkkkk'
normal! @r
endfunction
nnoremap Q q:call Test()<CR>qm
?如果“m”实际上是非常数值,则必须使用<expr>
:
nnoremap <expr> Q "q:call Test()\nq".g:plugin_register
。当然,您可以在<expr>
映射中使用函数调用(从而将normal! @r
移动到函数的输出:return '@r'
,因为不允许表达式执行normal!
,缓冲编辑,切换和移动光标)。