vimからコマンドを実行する_その2

Problem,Solution

Netrwを利用して、x:execしようにも動かないので、色々試すと更にはまったので、DOSプロンプトで挙動を確認する。

  • 一般的に良くある、空白を含むフォルダ名を渡す
C:\>start C:\Documents and Settings\
ファイル C:\Documents が見つかりません。
  • ダブルクォートで囲む
C:\>start "C:\Documents and Settings\"

C:\>
(もう一個、DOSプロンプトが起動する)
  • ウィンドウタイトルを指定する
C:\>start "" "C:\Documents and Settings\"
rem シングルクォート ' で囲むとエラーなので注意

無事、エクスプローラを起動させる事に成功。

Netrwの動作

g:netrw_browsex_viewer = '' の時

" vim72-kaoriya-w32j/runtime/autoload/netrw.vimの以下の判定に入る
" :省略
  elseif has("win32") || has("win64")
   if executable("start") " 偽 うちのPCだけ?
"    call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
    exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
   elseif executable("rundll32") " 真
"    call Decho('exe silent !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
    exe 'silent !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
   else
    call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
   endif
   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
   let ret= v:shell_error
" :省略
問題点
if executable("start") " 偽、うちの環境だけ?
elseif executable("rundll32") " 真
 exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1) " ←問題はココ
サンプル
C:\>start rundll32 url.dll,"C:\Documents and Settings\"
" 実行結果:何も起きない、詳細は不明
C:\>rundll32 url.dll,"C:\Documents and Settings\"
" 実行結果:何も起きない、詳細は不明
DOS上で動いたようにコマンドを書き換える
 exe 'silent ! start "" "'.fname.'"'
" shellescapeの二番目の引数がヘルプを見ても、よく分からないが'(シングルクォート)で囲まれるため実行出来ない

WindowsでもNetrw上でxコマンドが使えるようになる!

補足説明

g:netrw_browsex_viewer = 'オプション'
  1. "kfmclient exec"
  2. gnome-open"
  3. "-"
    • netrw_filehandlerに基づいて、アプリを起動
      Linux用の設定が書かれています。
  4. ""(何も入れない)
    • Windowsであれば、これで問題無いかなと。