2011-01-04 13 views
10

私はvimには新しく、vimスクリプトでいくつかの微妙なことを理解するのは難しいです。具体的には、引用符で囲まれていない文字列が必要なコマンドを扱うのに問題があります(これには名前がありますか?)。例Vim:変数に格納されたパスへの `cd '

cd some/unquoted/string/path 

についての問題は、私は、変数を渡したいが、代わりに「いくつかの/パス」の「パス名」にカレントディレクトリを変更しようとします

let pathname = 'some/path' 
cd pathname 

を呼び出したいということです。この問題を回避する方法の1つは、使用することです。

let cmd = 'cd ' . pathname 
execute cmd 

これはちょっと丸見えです。 This StackOverflow questionは実際にはcdを変数に使用しますが、私のシステムでは機能しません( "a:path"は上記のようにパスとして扱われます)。

具体的な例としてcdを使用していますが、この動作はcdでは一意ではありません。たとえば、editコマンドもこのように動作します。 (このタイプのコマンドの名前はありますか?)

答えて

19

TL; DRexecute 'cd' fnameescape(pathname)

説明を使用しますので、

command `shell command` 

または

command `=vim_expression` 

:引数のサポートバッククォート構文としてファイル名を取る基本的なコマンドの多くをあなたの例は

01と書くことができます
cd `=pathname` 

これは制御された環境で実行している場合です。 set wildignore=*|cd =pathnamecdにかかわらずpathnameに格納されているものの失敗になりますし、パス名は、改行が含まれている場合b)のそれはに分割されます。)あなたの方法のステップがあり&wildignore設定があるので、あなたは、プラグインでこのバリアントを使用してはいけません2つ以上のディレクトリ。したがって、あなたはあなたが共有する予定のコードのどの部分に使用することは、それがパス名(例えば、スペース)内の特殊文字を気にしないので、あなたがexecute "cd" pathnameを使用してはいけません

execute 'cd' fnameescape(pathname) 

注意です。

+0

優秀!これはまさに私が探していたものです。説明してくれてありがとう。 –

3

Vimの基本コマンドは決して変数の処理を行いません(some/pathの代わりにpathnameディレクトリに変更するつもりはない1?)。あなたは、かなりあなたが示唆したようにラウンドアバウトようにする必要はありません、あなたが行うだけのことができます:

exe 'cd' pathname 

exeことを連結の引数をスペースで自動的に、あなたがそうする必要はありませ

exe 'cd ' . pathname 
+0

ありがとうございます!それは確かにきれいです。これらの「基本コマンド」のリストはありますか? –

+0

':help expression-commands'を見てください – DrAl

0

このような問題を解決するために多くの時間前に私はこれを書いたplugin (function FixPathName()です。 vimには、外部コマンドでパスを使用する必要がある場合、shellescape()のようないくつかの新機能が追加されました。