2

所以,这是我在尝试编写插件时遇到的一个奇怪的情况。对我来说,这看起来像是 Vim 中的一个错误,但我可能会遗漏一些东西,所以我求助于 StackOverflow 的智慧。

采取这个功能:

fun! Test()
    normal! q ; Stop recording a macro.
    let @r='kkkkkkkkkkkkk'
    normal! @r
    normal! qm
endf

基本上,我停止录制宏,尝试运行寄存器的内容,然后开始重新录制宏。

我通过点击qm,执行一些命令,然后调用该函数来调用此函数。

我的期望

我希望执行“kkkkkk”,然后重新开始录制。

怎么了

运行“kkkk”,但没有再次开始录制。

我不明白为什么!

解决方法

以下功能可以满足我的要求,但它是一个 hack。我试图了解我的问题的根本原因:

乐趣!测试()正常!q 让@r='kkkkkkkkkkkkkk' 执行“正常!”。@r 正常!qm endf

我只是用直接执行寄存器内容的执行调用替换了寄存器的运行。基本上,我欺骗 vim 使其不认为它正在运行一个寄存器。

注意:为什么我想要这个

这是一个插件。这个函数只是我能做的最小的一个问题。不值得讨论为什么我想要这个——我需要的基本功能是从一个函数中运行一个寄存器,然后再次开始记录它。在实际用例中,我运行和记录到的寄存器是一样的,但似乎并没有影响这个问题。

那么,有什么想法吗?

4

1 回答 1

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

于 2012-05-28T04:32:58.030 回答