所以,这是我在尝试编写插件时遇到的奇怪情况。对我来说,这看起来像是 Vim 中的一个错误,但我可能遗漏了一些东西,所以我转向了 StackOverflow 的智慧。
使用这个函数:
fun! Test()
normal! q ; Stop recording a macro.
let @r='kkkkkkkkkkkkk'
normal! @r
normal! qm
endf
基本上,我停止录制宏,尝试运行寄存器的内容,然后开始重新录制宏。
我通过点击qm
来调用这个函数,执行一些命令,然后调用该函数。
我的期望
我希望执行“kkkkkk”,然后重新开始录制。
发生了什么
“kkkk”已运行,但录制未再次开始。
我不明白为什么!
解决方法
以下函数可以实现我想要的功能,但它是一个 hack。我试图了解问题的根本原因:
有趣!测试() 普通的! q 让@r='kkkkkkkkkkkkk' 执行“正常!”。 @r 普通的!质量 结束我刚刚用直接执行寄存器内容的执行调用替换了寄存器的运行。基本上,我欺骗了 vim,让它不认为它正在运行寄存器。
注意:为什么我想要这个
这是一个插件。这个函数只是我能做的最小的函数,但存在问题。不值得讨论为什么我想要这个 - 我需要的基本功能是从函数内运行寄存器,然后再次开始记录它。在实际用例中,我运行和记录的寄存器是相同的,但它似乎并没有影响这个问题。
那么,有什么想法吗?
最佳答案
为什么不能将函数调用嵌入到映射中:
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!
、缓冲区编辑、切换和移动光标)。
关于plugins - Vimscript - 运行正常! qm运行后正常! @米,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777937/