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

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

mattn opened this issue Mar 7, 2018 · 3 comments


Copy link

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
C:\あ>vim -u vimrc -N .git\config

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

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




Windows 7 64bit おそらく 10 も。

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


Copy link
Member Author

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

Copy link
Member Author

mattn commented Mar 8, 2018


Copy link
Member Author

mattn commented Mar 9, 2018

patch 8.0.1591

@mattn mattn closed this as completed Mar 9, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
None yet

No branches or pull requests

1 participant