Plugins Vimscript-正常运行!qm运行正常后@M

Plugins Vimscript-正常运行!qm运行正常后@M,plugins,editor,vim,Plugins,Editor,Vim,所以,这是我在尝试编写插件时遇到的一个奇怪的情况。对我来说,它看起来像Vim中的一个bug,但我可能遗漏了一些东西,所以我转向了StackOverflow的智慧 采取以下措施: fun! Test() normal! q ; Stop recording a macro. let @r='kkkkkkkkkkkkk' normal! @r normal! qm endf 基本上,我停止录制宏,尝试运行寄存器的内容,然后开始重新录制宏 我通过点击qm,执行一些命令

所以,这是我在尝试编写插件时遇到的一个奇怪的情况。对我来说,它看起来像Vim中的一个bug,但我可能遗漏了一些东西,所以我转向了StackOverflow的智慧

采取以下措施:

fun! Test()
    normal! q ; Stop recording a macro.
    let @r='kkkkkkkkkkkkk'
    normal! @r
    normal! qm
endf
基本上,我停止录制宏,尝试运行寄存器的内容,然后开始重新录制宏

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

我的期望

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

发生了什么

“kkk”已运行,但不会再次开始录制

我不明白为什么

解决方法

下面的函数实现了我想要的功能,但它是一个hack。我正在努力了解问题的根本原因:

有趣!测试() 正常!Q 让@r='kkkkkk' 执行“正常!”@R 正常!质量管理 endf

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

注意:我为什么要这个

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


有什么想法吗?

为什么不能将函数调用嵌入到映射中:

function Test()
    let @r='kkkkkkkkkkkk'
    normal! @r
endfunction
nnoremap Q q:call Test()<CR>qm
功能测试()
让@r='kkkkk'
正常@R
端功能
nnoremap Q:调用测试()qm
??如果“m”实际上是一个非常量值,则必须使用

nnoremap Q“Q:call Test()\nq”.g:plugin\u寄存器

。当然,您可以在
映射中使用函数调用(从而将
normal!@r
移动到函数的输出:
返回'@r'
,因为表达式不允许执行
normal!
、缓冲区编辑、切换和移动光标)。

首先,我不认识“q:call”语法,那有什么用?第二,现在函数做了很多其他的事情,从逻辑上说,“qm”是函数的一部分。第三,函数实际上是通过“au CursorMoved:call MyFunction()”调用的,即每次光标移动时都会调用该函数。但在内部,它有一个检查,以查看插件是否已实际启用,“qm”只应在插件已启用的情况下执行。所以我不确定这是不是该走的路…@edanmar1。正是
正常!q
应该这样做。2.如果是CursorMoved事件,您不太可能产生
中禁止的那种副作用(至少如果您遵循帮助中的建议),尽管完成录制宏实际上是那种副作用。您应该能够将其转换为支持映射rhs的函数。使用映射(可能是
映射)并从事件中使用
feedkeys()
调用它的关键点是解决您指出的问题。3.在这种情况下,只需返回一个空字符串。对不起,我仍然有点不清楚到底是什么问题。我也不知道feedkeys,但从文档中我不明白它与“normal@r”有什么不同,在“normal@r”中,寄存器“r”保存我想要执行的键。顺便说一句,我正在尝试为vim构建一个“多光标”模式,在这里我在缓冲区中标记不同的位置,然后可以在它们上自动执行我执行的每个命令(包括向左、向右移动光标等)。这就是整个映射的内容。到目前为止,我已经用我的方法“变通”实现了核心功能,我现在主要是想了解我遗漏了什么-我了解我的解决方案和你的解决方案,但我不明白为什么函数最初的编写方式不起作用。@Edanmar事实上,它起作用了。我会使用
getchar()
(特别是在我已经有了使用
getchar()的代码之后)
捕获用户的输入,以假装用户可以在完成其他一些非常耗时的处理的同时执行某些操作),但我倾向于选择不使用
普通!
和朋友的解决方案。
getchar()
这里有一个主要缺点,即不显示光标位置,这会分散注意力(在我的例子中,当处理完成时,尽管这并不重要:无论如何都不会显示光标),对于您想要实现的目标,我没有其他好的解决方案。
nnoremap <expr> Q "q:call Test()\nq".g:plugin_register