Запись файла с помощью vim не запускает событие изменения файла в OS X

#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 здесь не имеет значения.