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

时间:2018-03-05 13:11:07

标签: 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秒。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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