在vim中编辑时,太多的inotify事件

时间:2012-04-24 15:13:53

标签: vim inotify

我正在尝试使用inotifywait来监视特定文件夹并在需要时重新编译。问题是我正在大量使用vim,当我在vim中编辑时,任何被修改的文件实际上都会触发一些“冗余”事件,例如:

:w
sass/somefolder/ CREATE 4913
sass/somefolder/ CREATE some
sass/somefolder/ MODIFY some

花了一些时间才意识到inotifywait实际上一切正常 - 我尝试使用nano,一切都按预期工作,只触发“修改”,只有一次

我尝试编辑(仅用于测试目的,不要用力评判我)Emacs以及Emacs也有问题 - 每次我按Ctrl-X + Ctrl + S MODIFY触发3次。

问题是如何解决vim中多余事件的问题?

顺便说一下,我directory中的backupdir.vimrc不在受监控的文件夹中。

UPD:This link explains为什么事情会发生,但我仍然不知道如何解决这个问题。好吧,当然我可以忽略4913包含字符串,但即使对于试图使用inotify来编译SASS的人来说,这也太过愚蠢)))

UPD:VIM版本为7.3.429

3 个答案:

答案 0 :(得分:8)

如果您想在编辑文件后触发操作(例如重新编译代码),通常需要查看IN_CLOSE_WRITE事件并忽略其他所有操作。

您绝对想要监控IN_MODIFY事件,因为正如您所发现的那样,在编辑文件时可能会多次触发它们。

所以:

inotifywait -e close_write ...

答案 1 :(得分:2)

更好的编辑以这种方式来强制执行原子性。换句话说,如果电源在错误的时刻死亡,你将不会得到一个半写的文件。

可能有用的一个选项就是使用autocmd BufWritePost进行重新编译。

但是,如果您在vim之外进行其他更改,您可能希望等待多个通知并在一段时间内没有发生任何事件后进行编译,比如半秒。例如,这将涵盖其他突发事件,例如进行源控制拉动。

答案 2 :(得分:1)

在提交和保存之前,大多数编辑器将使用临时文件来编写撤消信息或文件编辑。此外,大多数编辑器需要写入临时文件以与子shell和脚本进行通信。我怀疑4913文件可能是你的vim设置的一个因素,或者是你的数字用户id的一个功能,来统一文件。

您可以通过vim来查看文件何时更新以及任何一方发生的情况,例如:触及fork + exec或其他文件,这可能暗示哪个宏或工具导致了这个问题。

相关问题