我已经看过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我不是在谈论对它们的个别解释,这确实可以,但它们是如何相互影响以及发生的顺序。例如,WinEnter表示“ Vim在WinEnter自动命令之后执行BufEnter自动命令”,TabEnter表示“触发WinEnter之后且触发BufEnter事件之前”,所有这些都散布在许多地方。有时甚至根本没有提及它(例如,BufRead没有提及它是在BufEnter之后还是之前运行-也许专家可以从那里的其他信息中推断出它,但是我不能。

因此,我的目的是为这些事件的顺序创建一个简单的参考,非专业人员可以快速查找这些事件的顺序,以便更准确地了解我们的autocmd事件规范。

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

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

#1 楼

要完成@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://github.com/lervag/ dotvim / blob / master / personal / plugin / log-autocmds.vim(注意:由于以前的要旨消失了,我已替换了Karl插件的URL --Luc)。
然后您可以tail -f log并得到一个实时自动命令事件活动。

评论


我为此做了一个简单的插件,请看这里。

– Karl YngveLervåg
15年8月25日在7:49

请注意,@KarlYngveLervåg已将其插件移至其他路径。谢谢卡尔!

–卢克·赫米特(Luc Hermitte)
16-10-27在15:57

感谢您的关注和评论,Luc! (注意:抱歉,我无法更新评论以修复无效链接!)

– Karl YngveLervåg
16-10-28在8:35

#2 楼

我尝试使用不同的关键字来进行谷歌搜索,并在一次这样的尝试中获得了金牌:http://www.ibm.com/developerworks/library/l-vim-script-5/
具体来说,这部分与当前问题有关:例如,如果您启动Vim,则编辑一个名为demo.txt的文件,切换为插入模式,键入一些文本,保存该文件,然后退出,您的Vim会话会收到一系列事件,如清单1所示。
清单1.在简单的Vim编辑会话中的事件序列
> vim

BufWinEnter(创建一个默认窗口)
BufEnter(创建一个默认缓冲区)
VimEnter(启动Vim会话):edit demo.txt

BufNew(创建一个包含demo.txt的新缓冲区)
BufAdd(将新缓冲区添加到会话的缓冲区列表中)
BufLeave(退出默认缓冲区)
BufWinLeave(退出默认窗口)
BufUnload(从默认缓冲区中删除默认缓冲区)缓冲区列表)
BufDelete(取消分配默认缓冲区)
BufReadCmd(将demo.txt的上下文读取到新缓冲区中)
BufEnter(激活新缓冲区)
BufWinEnter(激活新缓冲区的窗口)i
InsertEnter(切换为“插入”模式)


它仍然不是很全面(例如没有提及BufReadBufReadPost,但我假设它会在BufReadCmd之后出现。但这是一个很好的开始。和FileType已经打开,并且打开了一个新文件,该文件的文件类型和语法是Vim已知的。

评论


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

–佐藤桂
15年8月24日在10:18



@SatoKatsura这是我一直在寻找的专家意见,谢谢!您是否可以参考一些参考资料以了解更多信息(除了深入研究Vim的资源)?另外,这可能完全不在您感兴趣的领域内,但是您是否知道在“ Neovim”地区是否可以更好地定义事物?

–sundar-恢复莫妮卡
15年8月24日在10:28

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

–佐藤桂
2015年8月24日10:49



同样,“事件”一词本身也应该颠覆过于固定订单的思想。

– VanLaser
15年8月24日在13:09