在 vim 中编辑时出现过多的 inotify 事件

Posted

技术标签:

【中文标题】在 vim 中编辑时出现过多的 inotify 事件【英文标题】:Too many inotify events while editing in vim 【发布时间】:2012-04-24 15:13:52 【问题描述】:

我正在尝试使用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 中多余事件的问题?

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

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

UPD:VIM 版本是 7.3.429

【问题讨论】:

【参考方案1】:

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

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

所以:

inotifywait -e close_write ...

【讨论】:

感谢您的回答。 -e close_write 选项肯定更好,但只能解决多次修改的问题,而不是神秘的 sass/somefolder/ CLOSE_WRITE,CLOSE 4913 事件 您可以忽略目录上的事件...如果您有 inotifywait 等待输出路径,您可以让您的脚本检查它是否是一个目录 ([ -d ... ]),并且仅在以下情况下触发您的操作文件被修改。 默认情况下,vim 保存文件时会创建一个新文件并写入其中,当它确定写入成功时,它会删除旧文件并重命名新文件。这可能是一些虚假事件的原因。您可以使用set nowritebackup 将其关闭。见:help backup-table 和朋友。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于在 vim 中编辑时出现过多的 inotify 事件的主要内容,如果未能解决你的问题,请参考以下文章

git pull时出现vim窗口的解决办法

推送到 bitbucket 时出现错误“inotify_add_watch”

yum安装vim时出现以下错误提示 求解决方法 通过yum install vim* 进行vim的安装

使用 JDBC 获取与 MySQL 的连接时出现“连接过多”

.htaccess - 尝试强制 https 时出现“重定向过多”

尝试计算 numpy 数组列中的唯一项时出现“IndexError:数组索引过多”