Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim功能执行命令延迟至结束_Vim - Fatal编程技术网

Vim功能执行命令延迟至结束

Vim功能执行命令延迟至结束,vim,Vim,我尝试在我的.vimrc中编写一个简单的函数,可以通过映射访问。 此函数应使用插件。因此,它首先打开一个带有YankRing缓冲区的窗口,如果还没有打开的话。我可以确认该函数中每个部分的功能,但只要我在窗口打开后定义了任何命令,它就会首先执行,而且就在窗口打开之后。事实上,似乎发生了一些事情,因为命令行中出现了缓冲区状态(名称、行、列等),但带有缓冲区的窗口本身没有打开 下面是一个最小的示例,使用sleep作为以下命令,导致窗口打开延迟: function! s:foo() execut

我尝试在我的
.vimrc
中编写一个简单的函数,可以通过映射访问。
此函数应使用插件。因此,它首先打开一个带有YankRing缓冲区的窗口,如果还没有打开的话。我可以确认该函数中每个部分的功能,但只要我在窗口打开后定义了任何命令,它就会首先执行,而且就在窗口打开之后。事实上,似乎发生了一些事情,因为命令行中出现了缓冲区状态(名称、行、列等),但带有缓冲区的窗口本身没有打开

下面是一个最小的示例,使用
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
消息。然后在3s延迟后,窗口打开

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


有人知道这里发生了什么吗?对于我的功能,用户需要先观看窗口内容,然后才能进行交互


谢谢

一些插件映射和命令是异步的。Vim有一个事件系统;cp.
:帮助自动命令
。在这种情况下,您必须连接到相应的事件(
:help autocmd events
)。对于插件,它们通常是
BufNew
FileType

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


我看了一下扬克林密码。
:YRShow
功能似乎是简单的同步代码。您正在体验的效果可能是,在执行函数时,内容尚未绘制。在执行
:sleep
命令之前,您可以通过
:redraw
执行屏幕更新。

这里有些人比我更了解这种方式,但就我而言,vim缓冲系统是事件驱动的。所以“window”open命令是排队的,你需要看看
:h autocmds
@DoktorOSwaldo哪个auto命令你会在这里说“help”?根据你的使用情况,例如,
BufNew
bufwinter
。所以不是每个新缓冲区的创建都是异步处理的,但是重绘是正确的?@DoktorOSwaldo:Correct。您可以创建一个缓冲区并立即填充它,如下所示:
new | put=\“新建缓冲区\”
当然。。。幸运的是,我并不是每天都使用这样的东西(
:sp | e…
)那么将是一个愚蠢的问题……非常感谢。
重画
在这里很有帮助!