9

inotifywait特定のフォルダを監視し、必要に応じて再コンパイルするために使用しようとしています。問題は、vimを多用していることです。vimで編集しているときに、変更されたファイルは実際には次のような「冗長」イベントをトリガーします。

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

実際にすべてが問題ないことに気付くのに少し時間がかかりましinotifywaitた。使用しようとしましたがnano、すべてが期待どおりに機能し、「MODIFY」のみがトリガーされ、1回だけ実行されました。

私はEmacsを編集しようとしましたが(テストの目的で、私を厳しく判断しないでください)、Emacsにも問題があります-Ctrl-X + Ctrl +SMODIFYトリガーを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

優れた編集者は、アトミック性を強制するためにそのようにそれを行います。言い換えれば、電源が間違った瞬間に停止した場合でも、ファイルが半分書き込まれることはありません。

役立つ可能性のあるオプションの1つは、autocmdBufWritePostを使用して再コンパイルすることです。

ただし、vimの外部で他の変更を行う場合は、複数の通知を待ち、一定期間、たとえば0.5秒間何も起こらなかった後にコンパイルを実行することをお勧めします。これは、たとえば、ソース管理プルの実行などの他の不測の事態をカバーします。

于 2012-04-24T16:28:32.467 に答える
1

ほとんどの編集者は、コミットして保存する前に、一時ファイルを使用して取り消し情報やファイル編集を書き込みます。さらに、ほとんどの編集者は、サブシェルやスクリプトと通信するために一時ファイルに書き込む必要があります。4913ファイルは、ファイルを一意化するためのvimセットアップの要因、または数値のユーザーIDの関数である可能性があります。

vimをstraceして、ファイルがいつ更新され、どちらの側で何が起こっているかを確認できます。たとえば、fork + exec、または別のファイルがタッチされ、どのマクロまたは機能がこれを引き起こしているのかを示唆している可能性があります。

于 2013-06-27T21:38:09.930 に答える