9

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

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

我花了一些时间才意识到实际上一切都很好inotifywait- 我已经尝试使用nano并且一切都按预期工作,只有“修改”被触发,而且只有一次。

我尝试编辑(仅出于测试目的,不要对我做出严厉的评判)Emacs 并且 Emacs 也存在问题 - 每次我按 Ctrl-X + Ctrl+S 修改触发器 3 次。

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

顺便说一句,directorybackupdir不在.vimrc被监控的文件夹中。

UPD:这个链接解释了为什么事情实际上是这样发生的,但我仍然不知道如何解决这个问题。好吧,当然我可以忽略包含字符串的 4913,但是即使对于尝试使用 inotify 编译 SASS 的人来说,这也太笨拙了)))

UPD:VIM 版本是 7.3.429

4

3 回答 3

11

如果您希望在编辑文件后触发一个操作(例如重新编译代码),您通常希望查看该IN_CLOSE_WRITE事件并忽略其他所有内容。

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

所以:

inotifywait -e close_write ...
于 2012-04-24T15:17:08.540 回答
2

更好的编辑器这样做是为了强制执行原子性。换句话说,如果电源在错误的时刻停止,您将不会得到一个写一半的文件。

可能有帮助的一种选择是仅使用autocmd BufWritePost进行重新编译。

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

于 2012-04-24T16:28:32.467 回答
1

大多数编辑器会在您提交和保存之前使用临时文件来写入撤消信息或文件编辑。此外,大多数编辑器需要写入临时文件才能与子 shell 和脚本对话。我怀疑 4913 文件可能是您的 vim 设置的一个因素,或者您的数字用户 ID 的函数,以使文件唯一化。

您可以使用 strace vim 来查看文件何时更新以及任何一方发生了什么,例如 fork + exec,或者触摸了另一个文件,这可能暗示哪个宏或工具导致了这种情况。

于 2013-06-27T21:38:09.930 回答