2012-04-24 11 views
8

Estoy intentando usar inotifywait para supervisar carpetas específicas y recompilar si es necesario. El problema es que estoy usando vim en gran medida, y cuando estoy editando en vim cualquier archivo modificado en realidad desencadena algunos eventos redundantes '', algo así como:Demasiados eventos de inotify mientras se edita en vim

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

Me tomó un tiempo para darse cuenta de que en realidad todo lo está bien con inotifywait - Intenté usar nano y todo funcionó como se esperaba, solo se activó "MODIFICAR", y solo una vez.

He intentado editar (solo para fines de prueba, no me juzguen demasiado) Emacs y también hay problemas con Emacs: cada vez que presiono Ctrl-X + Ctrl + S activan MODIFY 3 veces .

La pregunta es ¿cómo puedo resolver problemas con eventos superfluos en vim? Por favor, directory y backupdir en mi .vimrc no están en la carpeta que se monitorea.

UPD: This link explains por qué suceden cosas en realidad, pero todavía no tengo ni idea de cómo solucionarlo. Bueno, por supuesto que puedo ignorar 4913 que contiene la secuencia, pero esto es demasiado kludgy incluso para alguien que intenta utilizar inotify para compilar SASS)))

UPD: Versión VIM es 7.3.429

Respuesta

7

Si eres buscando activar una acción (como recompilar el código) después de haber editado un archivo, generalmente desea ver el evento IN_CLOSE_WRITE e ignorar todo lo demás.

Usted absolutamente no desea desea controlar IN_MODIFY eventos porque, como ha descubierto, pueden activarse muchas veces al editar un archivo.

Así:

inotifywait -e close_write ... 
+0

gracias por esta respuesta. '-e close_write' es definitivamente mejor, pero solo resuelve el problema con múltiples modificaciones, pero no con el misterioso' sass/somefolder/CLOSE_WRITE, CLOSE 4913' event – shabunc

+0

Puedes ignorar eventos en directorios ...si tiene 'inotifywait', espere que salga la ruta, puede hacer que su script verifique si es un directorio (' [-d ...] ') y solo active sus acciones si los archivos son modificados. – larsks

+1

De forma predeterminada, cuando vim guarda un archivo, crea uno nuevo y lo escribe, y cuando está seguro de que se escribió correctamente, elimina el archivo anterior y cambia el nombre del nuevo. Esta podría ser la causa de algunos eventos espurios. Puedes desactivar esto con 'set nowritebackup'. Ver ': help backup-table' y amigos. –

2

Los mejores editores hacerlo de esa manera de hacer cumplir la atomicidad. En otras palabras, no terminará con un archivo medio escrito si el poder muere en el momento incorrecto.

Una opción que puede ayudar es simplemente usar autocmd BufWritePost para hacer su recompilación.

Sin embargo, si realiza otros cambios fuera de vim, es probable que desee esperar varias notificaciones y hacer la compilación después de que no haya ocurrido ninguna durante un período de tiempo, por ejemplo, medio segundo. Eso cubrirá otras contingencias como hacer un control de fuente, por ejemplo.

+0

+1 por sugerir un comportamiento inteligente del script –

1

La mayoría de los editores utilizarán un archivo temporal para escribir información de deshacer, o editar archivos, antes de confirmar y guardar. Además, la mayoría de los editores necesitan escribir en un archivo temporal para hablar con subconjuntos y scripts. Sospecho que el archivo 4913 podría ser un factor de tu configuración de vim, o una función de tu ID de usuario numérico, para uniquify los archivos.

Podrías echarle un vistazo para ver cuándo se actualizan los archivos y qué ocurre en cada lado, p. un fork + exec u otro archivo que se toque, lo que podría indicar qué macro o facilidad está causando esto.

Cuestiones relacionadas