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

W11発生時のファイル再読み込みでモードラインが無視される #291

Closed
k-takata opened this issue Jan 8, 2013 · 7 comments

Comments

@k-takata
Copy link
Member

k-takata commented Jan 8, 2013

7.3.762 で以下の手順で確認しました。(os_win32.c は Vim のソース内のファイル)

$ vim -u NONE -N
:autocmd BufRead *.c setlocal ts=4
:e os_win32.c

この時点では、:autocmd よりも os_win32.c のモードラインが優先されて ts=8 となっています。
別のソフトで os_win32.c を編集してから :checktime を実行すると以下のように表示されるので、

W11: 警告: ファイル "os_win32.c" は編集開始後に変更されました
詳細は ":help W11" を参照してください
[O]K, ファイル読込((L)):

L を選択すると、モードラインではなく :autocmd の方が有効になり ts=4 になってしまいます。
これは仕様でしょうか。

@koron
Copy link
Member

koron commented Jan 8, 2013

たぶん未定義動作と推測。Vimはこういうの多いですからね。

マニュアルに「どっちが優先される」と書いてあった場合は、それを盾に修正する。
書いてない場合は問題提起して、マニュアルの追記と合わせてパッチを叩きつけるのが良さげ。

@k-takata
Copy link
Member Author

k-takata commented Jan 9, 2013

直すとしたら、fileio.c 内で buf_reload() を呼んだ後に do_modelines() を呼ぶか、buf_reload() の末尾で do_modelines() を呼ぶのが良いのでしょうか。まだよく分かっていません。

@koron
Copy link
Member

koron commented Jan 9, 2013

buf_reload() の末尾で do_modelines() を呼ぶ

ならば buf_reload() を読んでる箇所を、一応全部チェックしておいたほうが良いですね。
(あるかはわかりませんが)

あとは :checktime の時に do_modelines() が呼ばれるケースと
形を揃えるようにできればというところでしょうか。

@k-takata
Copy link
Member Author

spell.c のspell_add_word()の中からbuf_reload()を呼んでいますが、モードラインの処理が必要かどうかがまだ分かりません。

@k-takata
Copy link
Member Author

spell.c の方がさっぱり分からないので、とりあえず、こんなパッチを投げて様子を見ようかと考えています。

--- a/src/fileio.c
+++ b/src/fileio.c
@@ -7073,6 +7073,7 @@
     {
    /* Reload the buffer. */
    buf_reload(buf, orig_mode);
+   do_modelines(0);
 #ifdef FEAT_PERSISTENT_UNDO
    if (buf->b_p_udf && buf->b_ffname != NULL)
    {

@k-takata
Copy link
Member Author

@k-takata
Copy link
Member Author

修正されて 7.3.790 として取り込まれました。
https://groups.google.com/d/topic/vim_dev/YEgBd0eF_So/discussion

結局 buf_reload() の中に do_modelines() が追加されました。

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

No branches or pull requests

2 participants