Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Doesn't detect file modification with vim on OSX 10.7 #56

Closed
datakurre opened this issue Aug 13, 2011 · 7 comments
Closed

Doesn't detect file modification with vim on OSX 10.7 #56

datakurre opened this issue Aug 13, 2011 · 7 comments

Comments

@datakurre
Copy link

At first, FSEvents-support works beautifully on OSX now. Thank you!

Unfortunately, watchdot cannot detect vim saving modifications to an existing file on a mac.

I traced it here:
https://github.com/gorakhargosh/watchdog/blob/master/src/watchdog/utils/dirsnapshot.py#L95

I have no idea why, but it seems that when vim saves a file, it gets a new inode number and watchdog cannot categorize the event and ignores it.

An example stat info from ref_dirsnap:

posix.stat_result(st_mode=33188, st_ino=51180728, st_dev=234881027L, st_nlink=1, st_uid=501, st_gid=20, st_size=2756, st_atime=1313212427, st_mtime=1313212426, st_ctime=1313212426)

The same stat info from dirsnap:

posix.stat_result(st_mode=33188, st_ino=51180736, st_dev=234881027L, st_nlink=1, st_uid=501, st_gid=20, st_size=2756, st_atime=1313212514, st_mtime=1313212514, st_ctime=1313212514)

Some other editors, e.g. TextMate work correctly (st_ino doesn't change and modification is detected correctly).

@datakurre
Copy link
Author

For those, who cannot wait for fix (to either vim or watchog; I don't know, which one is correct), you can make watchdog a little dummier in detecting modifications:

diff --git a/src/watchdog/utils/dirsnapshot.py b/src/watchdog/utils/dirsnapshot.py
index dbd121b..0d91fcc 100644
--- a/src/watchdog/utils/dirsnapshot.py
+++ b/src/watchdog/utils/dirsnapshot.py
@@ -92,7 +92,7 @@ class DirectorySnapshotDiff(object):
         for path, stat_info in dirsnap.stat_snapshot.items():
             if path in ref_dirsnap.stat_snapshot:
                 ref_stat_info = ref_dirsnap.stat_info(path)
-                if stat_info.st_ino == ref_stat_info.st_ino and stat_info.st_mtime != ref_stat_info.
+                if stat_info.st_mtime != ref_stat_info.st_mtime:
                     if stat.S_ISDIR(stat_info.st_mode):
                         self._dirs_modified.append(path)
                     else:

@gorakhargosh
Copy link
Owner

When you save a file called foobar.txt using Vim, it essentially creates
a foobar.txt.swp file in the same directory as the file, deletes the old
one, and renames the .swp file to the original filename. So, it would be
wiser to use a pattern with a command instead like so :

$ watchmedo log --pattern="*.swp;*.py;*.~;*.rb" --recursive .

@gorakhargosh
Copy link
Owner

Update:

Here's a better way. You can disable swap file creation in Vim.

:set noswapfile

in your ~/.vimrc and you don't need to edit either watchdog or
write a pattern. This will keep monitoring working as you expect it to.

@datakurre
Copy link
Author

I also found out that there's on option for that in vim.

:set nowritebackup

Now there's a plenty of options to make either vim or watchdog behave :)

I thank you very much and consider this closed.

@datakurre
Copy link
Author

One final comment. Actually, I had to disable backups completely by

:set nobackup
:set nowritebackup

(or set those in ~/.vimrc) to prevent vim for creating a new file on save and watchdog detect it.

I also wonder, why :set nowswapfile had no effect for me. Anyway, I'm quite happy now.

@jholster
Copy link

I'm facing the same issue with Espresso editor (on OS X) which unfortunately has no configuration option for that. According to ls -i, Espresso creates new file on every save. Any changes that this could be resolved on watchdog level?

@modocache
Copy link

Thanks for watchdog, and for this issue! This ended up working for me as well:

:set nobackup
:set nowritebackup

+1 to reopen. Users who don't happen upon the workaround here will assume watchdog is broken--I did. Meanwhile, similar tools like watchr "just work", without changing any Vim settings. watchdog is awesome, but I wish I didn't have to change my vimrc in order to use it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants