#python #macos #watchdog #fsevents #kqueue
#python #macos #сторожевой таймер #fsevents #kqueue
Вопрос:
Я использую watchdog для отслеживания событий изменения файлов .less в OS X. Если я изменю содержимое a .меньше файла с помощью TextMate или Sublime Text событие изменения фиксируется. Однако, если я редактирую содержимое с помощью vim, событие изменения файла не запускается (но события создания файлов для файлов, созданных с помощью vim, фиксируются). Я видел такое же поведение с FSEvents и kqueue (о которых я практически ничего не знаю).
Интересно, кто-нибудь может объяснить это поведение?
Комментарии:
1. Выполняет ли vim запись во временный файл, а затем переименовывает временный файл в имя файла, над которым вы работаете?
2. Это может быть как-то связано с этим. Единственный гаечный ключ в работе заключается в том, что когда я
mv
загружаю файл, он запускает событие перемещения / переименования. Интересно, почему сохранение vim этого не делает? При записи из vim события Nothing не запускаются. Я вижу, что файлы .swp создаются, когда я начинаю редактирование.
Ответ №1:
В readme Watchdog есть раздел, специально посвященный описанной вами проблеме: Об использовании watchdog с такими редакторами, как Vim. Рекомендуется использовать set noswapfile
в вашем ~/.vimrc
.
Ответ №2:
Vim обычно не создает временный файл, а затем переименовывает его. Это делается для того, чтобы аспекты файловой системы, такие как ссылки (как программные, так и жесткие), сохранялись при записи файлов. Это кратко обсуждается в разделе «Запись» документации Vim, с дополнительной информацией в 'backupcopy'
документации по вариантам.
Ваши события изменения файла могут быть ограничены изменением записей каталога.
Комментарии:
1. Спасибо за информацию, Грег. Однако, как я упоминал выше, я могу видеть события файлов при редактировании с помощью TextMate или Sublime Text.
2. Похоже, что эти редакторы записывают файлы не так, как это делает Vim (возможно, аналогично установке
backupcopy
параметраno
в Vim).3. Я установил следующее: set nobackup, set noswapfile, set nowritebackup; и были запущены измененные события.
4. К вашему сведению, это задокументировано в README на github, на который вы ссылались.
5. Я считаю, что ключевым моментом является обнаружение этого для потомков
set backupcopy=yes
: заставить Vim записывать в исходный файл, а не копировать его в качестве резервной копии и записывать в новый файл. Это позволяет вам сохранитьset backup
иset writebackup
, если вы предпочитаете.swapfile
здесь не имеет значения.