2011-07-23 23 views
6

我正在尋找一個如何在vim腳本中使用findfile函數來遞歸搜索文件,特別是使用通配符的示例。Vim findfile函數的用法?

每當我包含通配符作爲第一個函數參數的一部分時,這似乎不起作用。

例如,下面的目錄結構:

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

如果我運行下面的功能,同時編輯同PWD集的文件test.cs中到〜/ MyProject的/ src目錄

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

findfile似乎不會返回任何內容。但是,如果我修改函數刪除widcard如下:

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

它做什麼,我所期望的。

我已經在ubuntu和windows上測試過了,我在兩者上看到了相同的行爲。我在這裏做錯了什麼,或者findfile不支持通配符?缺乏對通配符的支持似乎是一個相當奇怪的遺漏。看來我在這裏一定是做錯了事。

+0

:幫助文件搜索使我認爲它試圖支持globbing,但這在實踐中似乎是錯誤的。這是vim中的一個bug嗎? –

+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