Vim功能执行命令延迟直到结束

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vim功能执行命令延迟直到结束相关的知识,希望对你有一定的参考价值。

我尝试在我的.vimrc中编写一个简单的函数,可以通过映射访问。 此函数应使用YankRing插件。因此,如果尚未打开,它首先打开一个带YankRing缓冲区的窗口。我可以确认该函数中每个部分的功能,但是一旦我在窗口打开后定义任何命令,它将首先执行,然后就会打开窗口。实际上似乎发生了某种情况,导致缓冲区状态(name,line,col,...)出现在命令行中,但是缓冲区本身的窗口没有打开。

这是一个最小的例子,使用sleep作为以下命令,导致窗口打开的延迟:

function! s:foo()
    execute('YRShow 0') " Opens the YankRing window, if not already open.
    echo 'bar' " Just to have some visual reference.
    sleep 3 " Show the delay of the window open and the echo message.
endfunction

观察到的行为: 首先,命令行获取此缓冲区状态信息内容。之后,立即显示echo消息。然后在3秒延迟后,窗口打开。

预期行为: 打开窗户。显示消息并等待3秒。


有谁了解这里发生了什么?对于我的功能,用户需要在他可以进行交互之前观看窗口内容。

谢谢!

答案

某些插件映射和命令是异步的。 Vim有一个活动系统; CP。 :help autocommand。在这种情况下,你必须挂钩相应的事件(:help autocmd-events)。对于插件,这些通常是BufNewFileType

使用映射,这些就像类型化命令一样,并插入到输入缓冲区中。要在任何其他挂起命令之后异步执行映射,可以使用feedkeys()函数。仅在必要时执行此操作,因为其使用会干扰宏录制和命令重复!

我简要介绍了YankRing代码。 :YRShow功能似乎是简单的同步代码。您遇到的效果可能是在执行函数时尚未绘制内容。您可以在:redraw命令之前通过:sleep进行屏幕更新。

以上是关于Vim功能执行命令延迟直到结束的主要内容,如果未能解决你的问题,请参考以下文章

在开始睡眠(或直到脚本结束)之后对象输出的奇怪延迟

重播 vim 宏直到缓冲区结束

Sublime text3最全快捷键清单

Vim格式化代码功能——gg=G

从零开始配置vim(27)——代码片段

Android:BottomNavigationView第一个片段开关超级延迟