2011-07-23 1 views
6

私は、vimスクリプトでfindfile関数を使用して、ファイルに対して上向きに、特にワイルドカードを使って上向きに検索する方法の例を探しています。Vim findfile関数の使用法は?

最初の関数パラメータの一部としてワイルドカード文字を含めると、これはうまくいかないようです。次のディレクトリ構造を持つ例えば

、:

~/MyProject/ 
    Test.sln 
    src/ 
     Test.cs 

〜/ MyProjectと/ srcに

function! Test() 
    let a = findfile("*.sln", ".;") 
    echo a 
endfunction 

にpwdのセットで、ファイルTest.csを編集しているとき、私は、次の関数を実行するとfindfileは何も返しません。ただし、ウィジェットを削除する関数を次のように変更すると、次のようになります。

function! Test() 
    let a = findfile("Test.sln", ".;") 
    echo a 
endfunction 

私はこれをubuntuとwindowsの両方でテストしました。両方で同じ動作が見られます。私はここで何か間違っているのでしょうか、またはfindfileはワイルドカード文字をサポートしていませんか?ワイルドカード文字のサポートの欠如は、かなり奇妙な省略のように思えます。私はここで間違ったことをしているに違いないようです。外部(高速)でそれを行うには

+0

:ヘルプファイル検索では、グロビングをサポートしようと考えてくれますが、これは実際には間違っているようです。これはvimのバグですか? –

+0

'vim' [documentation](http://vimdoc.sourceforge.net/htmldoc/editing.html#file-searching)から:* '\ *'の使い方はとても簡単です:** 0文字以上の文字にマッチします**。検索パターンでは、 "。\ *"となります。 "。" * –

答えて

5

ワイルドカードを使用している場合は、私が​​3210および/またはglobpath()機能は、あなたが探しているものだと思います。 :h glob()および:h globpath()を参照してください。

+0

あなたは正しいと思っています。findfileはワイルドカードをサポートしていないようですが、globは私が探しているものです。私はこのアプローチを取って、探しているものが見つかるまで、親ディレクトリを繰り返し処理するループを書いています。これは、私が必要なものを、ありがとう! – actf

+2

@actfあなたは最終的なソリューションを投稿したいですか?ありがとう! – Thomas

0

一つの方法find

function! Test() 
    let l:list=system("find .. -maxdepth 1 -name \*.sln") 
    echo l:list 
endfunction 
+0

私は答えを感謝しますが、これは* .slnファイルが親ディレクトリにある場合にのみ動作すると思います。私は具体的には、一致するファイルが見つかるまでディレクトリ構造を再現する解決策を探していました(これはfindfileがどのように動作するかと思います)。例えば、〜/ MyProject/src/innersrcというディレクトリのファイルを編集していた場合、私はこの解決策はうまくいかないと思います。 – actf

+0

@actf私は、あなたがそれを得るまで、 '..'、' ../ .. 'を見つけるループをどう思いますか?例えば、現在のファイルの完全なパスを得る 'expand( '%:p:h')'を試してみてください。 –

+0

これは最善のアプローチだと思います。作業ディレクトリを取得した後、親ディレクトリをループし、glob()を使ってワイルドカードで検索すると、必要なものが得られます。 – actf