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

マルチバイト文字があるパス上のドット付きディレクトリ内のファイルが読み込めない #1155

Closed
mattn opened this Issue Mar 7, 2018 · 3 comments

Comments

Projects
None yet
1 participant
@mattn
Member

mattn commented Mar 7, 2018

質問・報告の内容

C:\>mkdir あ\.git
C:\>echo test>あ\.git\config
C:\>cd あ
C:\あ>type con>vimrc
set wildignore+=.git/*
set encoding=utf-8
^Z
C:\あ>vim -u vimrc -N .git\config

これで test が表示されてほしいが新規ディレクトリ扱いになる。vimrc の設定は両方ある場合のみ発生する。発生する条件としては

  • 開くファイルパス上にマルチバイト文字があり
  • 開くファイルパスが wildignore にマッチしている
  • かつ下記の vimrc を使う
set wildignore+=.git/*
set encoding=utf-8

Vimのバージョン

8.0.1531

OSの種類/ディストリ/バージョン

Windows 7 64bit おそらく 10 も。

使用している or 関係していそうなプラグイン

なし

@mattn

This comment has been minimized.

Member

mattn commented Mar 8, 2018

set wildignore+=.git/*
set encoding=utf-8

./.git/config の様に相対パスで開かなかった場合はパスが一旦フルパスに変換される。よってパスには cp932 の文字が含まれる。次に encoding が変更された事で引数リストのエンコーディングが変換されるが、その後で alist_expand を使って引数リストの再展開(ワイルドカードがあった場合の為)が行われる。(ちなみにこれが必要なのはコマンドライン引数のワイルドカードを自プロセスが展開する Windows だけ)

本来、vim のコマンドラインから与えられた引数は、シェルがワイルドカードを展開し、wildignore の影響を受けない引数リストになっているはず。にもかかわらず alist_expand で再展開する際に wildignore の影響を受け引数リストから除外されてしまう、というバグ。なので

set encoding=utf-8
set wildignore+=.git/*

の様に順番を逆にすると set encoding=utf-8 を実行したタイミングではまだ wildignore が設定されていないので alist_expand が呼ばれても wildignore が干渉しない。よって正しく動く。

パッチとしては alist_expand で wildignore が干渉しない様に wildignore の値を退避しながら空にしてやる。既に元々 isf の退避もやってるので、結論から言うと alist_expand を呼び出す際の退避漏れという事になる。

diff --git a/src/os_win32.c b/src/os_win32.c
index 91f453f2e..0d133c324 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -7378,10 +7378,15 @@ fix_arg_enc(void)
 	/* Now expand wildcards in the arguments. */
 	/* Temporarily add '(' and ')' to 'isfname'.  These are valid
 	 * filename characters but are excluded from 'isfname' to make
-	 * "gf" work on a file name in parenthesis (e.g.: see vim.h). */
+	 * "gf" work on a file name in parenthesis (e.g.: see vim.h).
+	 * Also, unset wildignore to not to be influenced this option.
+	 * The arguments specified in command-line should be kept even if
+	 * encoding options was changed. */
 	do_cmdline_cmd((char_u *)":let SaVe_ISF = &isf|set isf+=(,)");
+	do_cmdline_cmd((char_u *)":let SaVe_WIG = &wig|set wig=");
 	alist_expand(fnum_list, used_alist_count);
 	do_cmdline_cmd((char_u *)":let &isf = SaVe_ISF|unlet SaVe_ISF");
+	do_cmdline_cmd((char_u *)":let &wig = SaVe_WIG|unlet SaVe_WIG");
     }
 
     /* If wildcard expansion failed, we are editing the first file of the
@mattn

This comment has been minimized.

Member

mattn commented Mar 8, 2018

@mattn

This comment has been minimized.

Member

mattn commented Mar 9, 2018

@mattn mattn closed this Mar 9, 2018

@mattn mattn added the xlose/fixed label Mar 9, 2018

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