WinEnter,BufEnter,BufRead,语法,FileType事件的顺序是什么?


16

我已经通过了autocmd.txt帮助,但是关于此的信息是分散的,并不总是存在(例如,带有BufRead)。

懂得这一点的人能否列出这些事件的顺序-也许用括号标出条件,例如

WinEnter   
BufEnter (if this window is for a different buffer than the current)

等等,以便于参考?

注意(摘自下面我的评论):我不是在谈论对它们的个别解释,这没关系,而是在讨论它们如何相互影响以及发生的顺序。例如,WinEnter说“ Vim在WinEnter自动命令之后执行BufEnter自动命令”,TabEnter说“在触发WinEnter之后并且在触发BufEnter事件之前”,它们像这样分散在许多地方。有时BufRead根本没有提及它(例如,没有提及它是在BufEnter之后还是之前运行-也许专家可以从那里的其他信息中推断出它,但是我不能。
所以,我的意图是为这些事件的顺序创建一个简单的参考,非专家可以快速查找这些事件的顺序,autocmd 事件规范。


我认为大多数解释都可以,您可以列举一些您无法理解的解释吗?
nobe4

@ Nobe4我不是在谈论对它们的个别解释,这确实可以,但它们是如何相互影响以及发生的顺序。例如,WinEnter说“ Vim在WinEnter自动命令之后执行BufEnter自动命令”,TabEnter说“在触发WinEnter之后并且在触发BufEnter事件之前”,它们像这样分散在许多地方。有时BufRead根本没有提及它(例如,没有提及它是在BufEnter之后还是之前运行-也许专家可以从那里的其他信息中推断出它,但是我不能。)
sundar-恢复莫妮卡

因此,我的目的是为这些事件的顺序创建一个简单的参考,非专家可以快速查找这些事件的顺序,以便更精确地定义我们的autocmd事件。
sundar-恢复莫妮卡2015年

好吧,我不明白这个问题。您可以尝试记录每个事件,并查看出现的顺序(如果您愿意,我可以回答)
nobe4 2015年

您的意图实际上是在询问有人提供这样一种简单的参考,而不是自己创建一个;)
VanLaser

Answers:


11

要完成@sundar答案:

您可以使用记录功能来记录事件的顺序:

augroup EventLoggin
  autocmd!
  autocmd BufNewFile * call s:Log('BufNewFile')
  autocmd BufReadPre * call s:Log('BufReadPre')
  ...
  autocmd User * call s:Log('User')
augroup END

function! s:Log(eventName) abort
  silent execute '!echo '.a:eventName.' >> log'
endfunction

在此处查看完整文件:https : //gist.github.com/nobe4/aa8313fe98ca8821afad

然后tail -f log,您将获得实时自动命令事件活动。


3
我为此做了一个简单的插件,请参见此处
Karl YngveLervåg2015年

6
请注意,@KarlYngveLervåg已将其插件移动到另一个路径。谢谢卡尔!
卢克·赫米特

感谢您的关注和评论,Luc!(请注意:我无法更新我的评论来修复无效链接,对不起!)
Karl YngveLervåg16年

10

我尝试使用不同的关键字集进行谷歌搜索,并通过一次这样的尝试获得了金牌:http : //www.ibm.com/developerworks/library/l-vim-script-5/

具体来说,这部分与当前问题有关:

例如,如果启动Vim,编辑一个名为demo.txt的文件,切换为Insert模式,键入一些文本,保存文件,然后退出,则Vim会话将收到一系列事件,如清单1所示。

清单1.一个简单的Vim编辑会话中的事件序列

> vim

  1. BufWinEnter(创建默认窗口)
  2. BufEnter(创建默认缓冲区)
  3. VimEnter(启动Vim会话):edit demo.txt
  4. BufNew(创建一个包含demo.txt的新缓冲区)
  5. BufAdd(将新缓冲区添加到会话的缓冲区列表中)
  6. BufLeave(退出默认缓冲区)
  7. BufWinLeave(退出默认窗口)
  8. BufUnload(从缓冲区列表中删除默认缓冲区)
  9. BufDelete(取消分配默认缓冲区)
  10. BufReadCmd(将demo.txt的上下文读取到新缓冲区中)
  11. BufEnter(激活新缓冲区)
  12. BufWinEnter(激活新缓冲区的窗口)i
  13. InsertEnter(切换到插入模式)

它仍然不是很全面(例如,没有提及BufReadaka BufReadPost,但是我认为它会在之后出现BufReadCmd),但这是一个很好的开始。

但是,一条至关重要的信息丢失信息是FileTypeand和Syntaxautocmd事件如何与之交互(假设filetype并且syntax已经存在,并且打开了一个新文件,其文件类型和语法对于Vim而言是已知的)。


7
仅在编辑单个文件时才如此。与普遍的看法相反,autocmd在多个文件中应用的顺序明确。即使是单个文件,Vim版本的命令也改变了几次。在vim_dev上已经讨论了可能(并确实)导致插件出现的问题,并且在可预测的将来整体设计不会改变。为了获得全面的了解,apply_autocmdsVim 7.4.827的源中有139次出现。祝你好运。
佐藤桂2015年

@SatoKatsura这是我一直在寻找的专家意见,谢谢!您是否可以参考一些参考资料以了解更多信息(除了深入研究Vim的资源)?另外,这可能完全不在您的兴趣范围之内,但是您是否知道在“ Neovim”地区是否有更好的定义?
sundar-恢复莫妮卡2015年

恐怕我不知道任何明确的参考。 autocmdVim中的s是一团糟,除了一些简单的情况外,我认为实际上不可能写出明确的参考。我想每个人都满足于“通常有效”,而对不适用的人则耸了耸肩。至于neovim,我个人对此项目有不同的感觉。我最近没有看过代码。我想您可以在他们的问题跟踪器上找到答案。
佐藤桂2015年

同样,“事件”一词本身也应该颠覆过于固定顺序的思想。
VanLaser
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.