2012-04-24 11 views
8

Sto provando a utilizzare inotifywait per il monitoraggio di cartelle specifiche e la ricompilazione, se necessario. Il problema è che sto usando vim pesantemente, e quando sto modificando in vim qualsiasi file modificato in realtà fa scattare alcuni eventi 'ridondanti', qualcosa di simile:Troppi eventi inotify durante la modifica in vim

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

Mi c'è voluto del tempo per rendersi conto che in realtà tutto è OK con inotifywait - Ho provato a usare nano e tutto ha funzionato esattamente come previsto, solo "MODIFY" viene attivato, e solo una volta.

Ho provato a modificare (solo per scopi di test, non giudicarmi duro) Emacs e ci sono problemi anche con Emacs - ogni volta che preme Ctrl-X + Ctrl + S MODIFY si attiva 3 volte .

La domanda è: come posso risolvere i problemi con eventi superflui in vim?

A proposito, directory e backupdir nel mio .vimrc non sono nella cartella che viene monitorata.

UPD: This link explains perché effettivamente le cose accadono come accadono, ma non ho ancora idea di come risolvere questo problema. Beh, certo che posso ignorare 4913 contenente stringa, ma questo è troppo kludgy anche per chi cerca di usare inotify per compilare SASS)))

UPD: versione VIM è 7.3.429

risposta

7

Se sei cercando di attivare un'azione (come ricompilare il codice) dopo aver modificato un file, di solito si vuole guardare l'evento IN_CLOSE_WRITE e ignorare tutto il resto.

È assolutamente non si desidera monitorare gli eventi IN_MODIFY perché, come si è scoperto, possono essere attivati ​​più volte durante la modifica di un file.

Quindi:

inotifywait -e close_write ... 
+0

grazie per questa risposta. L'opzione '-e close_write' è decisamente migliore, ma risolve solo il problema con più modifiche, ma non con misterioso' sass/somefolder/CLOSE_WRITE, CLOSE 4913' evento – shabunc

+0

Si potrebbe semplicemente ignorare gli eventi nelle directory ...se hai 'inotifywait', attendi in output il percorso, puoi fare in modo che il tuo script controlli se è una directory (' [-d ...] ') e attiva le tue azioni solo se i file vengono modificati. – larsks

+1

Per impostazione predefinita, quando vim salva un file ne crea uno nuovo e lo scrive, e quando è sicuro che abbia scritto correttamente, cancella il vecchio file e rinomina quello nuovo. Questa potrebbe essere la causa di alcuni eventi spuri. Puoi disattivarlo con 'imposta nowritebackup'. Vedi ': help backup-table' e amici. –

2

La redazione meglio farlo in quel modo per far rispettare atomicità. In altre parole, non si finirà con un file semi-scritto se la potenza muore nel momento sbagliato.

Un'opzione che può essere d'aiuto è usare semplicemente autocmd BufWritePost per eseguire la ricompilazione.

Tuttavia, se si apportano altre modifiche al di fuori di Vim, è probabile che si desideri attendere più notifiche e eseguire la compilazione dopo che non si è verificato alcun errore per un periodo di tempo, ad esempio mezzo secondo. Per esempio, coprirà altre contingenze come fare un tiro del controllo del codice sorgente.

+0

+1 per suggerire un comportamento intelligente dello script –

1

La maggior parte degli editor utilizza un file temporaneo per scrivere le informazioni di annullamento o le modifiche del file prima di eseguire il commit e il salvataggio. Inoltre, la maggior parte degli editori deve scrivere su un file temporaneo per parlare con sotto-shell e script. Sospetto che il file 4913 possa essere un fattore del tuo setup di vim, o una funzione del tuo user-id numerico, per unificare i file.

Si potrebbe strimpellare vim per vedere quando i file vengono aggiornati e cosa succede da entrambi i lati, ad es. un fork + exec, o un altro file viene toccato che potrebbe suggerire quale macro o impianto sta causando questo.

Problemi correlati