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 から追っていたらすぐ見つかった。