Vimscript - 运行正常! qm运行正常后! @m

时间:2012-05-27 23:16:23

标签: plugins editor vim

所以,这是我在尝试编写插件时遇到的一种奇怪的情况。它看起来像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,基本上不认为它正在运行寄存器。

注意:为什么我要这个

这是一个插件。这个函数是我能做的最小的函数。不值得进入我想要的原因 - 我需要的基本功能是从一个函数中运行一个寄存器,然后再开始记录它。在实际使用案例中,我运行和记录的寄存器是相同的,但它似乎没有影响这个问题。

那么,有什么想法吗?

1 个答案:

答案 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!,缓冲编辑,切换和移动光标)。