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

问题描述 投票:1回答:1

我尝试在我的.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
1个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.