checktime ハック
vim はバッファを切り替えたときなどのタイミングで、ファイルが外部で変更されていないかを判定している。
mtime を見るのだと予想していたが、わざわざパーミッションも比較しているようだ。
--- ../src.orig/fileio.c Mon May 1 00:28:57 2006 +++ fileio.c Sun Dec 24 01:00:29 2006 @@ -6225,7 +6225,7 @@ && ((stat_res = mch_stat((char *)buf->b_ffname, &st)) < 0 || time_differs((long)st.st_mtime, buf->b_mtime) #ifdef HAVE_ST_MODE - || (int)st.st_mode != buf->b_orig_mode + //|| (int)st.st_mode != buf->b_orig_mode #else || mch_getperm(buf->b_ffname) != buf->b_orig_mode #endif
私はこんな感じ
au BufWritePost * if getline(1) =~ "^#!" | exe "silent !chmod +x % 2>/dev/null" | if &ft == "" | filetype detect | endif | endif
でスクリプトを保存したとき自動的に chmod +x していて、いちいち
W16: Warning: Mode of file "out" has changed since editing started
ときかれるのがうざかったので st_mode の比較をやめた。
この部分は :ta ex_checktime から追っていたらすぐ見つかった。