Windows環境でvimfilerの内部関連付けを利用してファイルを開けない

[2011/5/16] 現在では以下の問題は修正されています。


4/24のYokohama.vimに参加して触発され、
最近vimfilerを使い始めた。


とりあえずWindowsで動作検証をしている時に、
どうにも思うように行かない箇所に遭遇。

vimfilerのdocに書いてあるように、
call vimfiler#set_execute_file('txt', 'notepad')と設定ファイルに記述し、
〜〜.txtファイルを選択してvimfiler_executeを実行。
そうすると、プロセスは確かに起動するのだが、ウインドウが表示されない。
その他のアプリでも試してみたが、GUIのウインドウが出ない。


で、何でかなーとソースを探ってみた。
どうも、Windowsでのvimfiler_executeによる実行は、vimproc#system_bgを通って、
最終的にはproc_w32.cに定義されている vp_pipe_openによりプロセスが実行されている。
その中に原因となっていた部分を発見した。
vp_pipe_openのコードの一部を抜粋。proc_w32.c 453行目〜463行目

    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = hInputRead;
    si.hStdOutput = hOutputWrite;
    si.hStdError = hErrorWrite;

    if (!CreateProcess(NULL, cmdline, NULL, NULL, TRUE,
                        CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
                        /*0, NULL, NULL, &si, &pi))*/
                        /*DETACHED_PROCESS, NULL, NULL, &si, &pi))*/
                        /*CREATE_NO_WINDOW, NULL, NULL, &si, &pi))*/
        return vp_stack_return_error(&_result, "CreateProcess() error: %s %s",
                lasterror());

このsi.wShowWindow = SW_HIDE;が原因。
これをSW_SHOWNORMALにして、コンパイルしなおすと、
ちゃんとnotepadのウインドウが表示された。


しかし、これ一方でその他のプラグインがバックグラウンドで何か読みこんだりするのに、
バリバリ使われており、ここをSW_SHOWNORMALに変更してしまうと、
その度にDOS窓が開くという悲しい状態になる。


ということで、今のvimfiler_executeの開き方だと、Windows環境ではGUIアプリは使えないっぽい。
docでnotepadが例として書かれているので、これは多分想定外の挙動では無いかと思う。
何でもかんでもDOS窓開こうとするWindowsが悪い気がするけど・・・。


まあ、rubyやらperlやらでスクリプト書いて、そこからsystem()呼んで起動すれば、
SW_HIDEのままでも開けるが、凄いめんどくさいw


主な利用目的は、Macで使ってみようと思ってたところだったので、
個人的にはそんなに困ることでは無いが、Windowsでvimfilerを使おうとして、
ハマっている人が居るかもしれないので、一応ここに書いてみた。
(Macでは問題無くウインドウを開いてくれます。)


Cは読めるけど書けないので、挙動を壊さない修正パッチも
一緒に書いてアップするとかは無理です。ごめんなさいw

[2011/5/16 追記]

作者のShougoさんが修正対応してくれました。
現在では上記の問題は解決されています。
どうもありがとうございました。


vimfilerとvimprocを最新版に。
vimprocのdll部分については、再コンパイルは不要のはず。