2011-07-23 12 views
6

Szukam przykładu użycia funkcji findfile w skrypcie vim do wyszukiwania w górę rekursywnie dla pliku, w szczególności przy użyciu symbolu wieloznacznego.Wykorzystanie funkcji findfile Vima?

Ilekroć dołączam znak wieloznaczny jako część pierwszego parametru funkcji, wydaje się, że to nie działa.

Na przykład, o następującej strukturze katalogów:

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

Jeśli uruchomić następującą funkcję, podczas edycji Test.cs plików z pwd zestaw do ~/myproject/src

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

findfile wydaje się niczego nie zwracać. Jeśli jednak zmodyfikuję tę funkcję, aby usunąć widcard w następujący sposób:

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

Robi to, czego bym się spodziewał.

Testowałem to zarówno na ubuntu, jak i na oknach i widzę to samo zachowanie w obu. Czy robię coś złego tutaj, czy plik findfile nie obsługuje znaków wieloznacznych? Brak wsparcia dla znaku wieloznacznego wydaje się dość dziwnym pominięciem. Wygląda na to, że muszę zrobić coś złego tutaj.

+0

: pomoc w przeszukiwaniu plików pozwala mi sądzić, że stara się wspierać globbing, ale w praktyce wydaje się to błędne. Czy to błąd w vim? –

+0

Z 'vim' [documentation] (http://vimdoc.sourceforge.net/htmldoc/editing.html#file-searching): * Użycie '\ *' jest całkiem proste: ** Dopasowuje 0 lub więcej znaków **. W wyszukiwaniu będzie to ". \ *". Zwróć uwagę, że "." nie jest używany do wyszukiwania plików * –

Odpowiedz

5

Jeśli używasz symboli wieloznacznych myślę funkcje glob() i/lub globpath() są tym, co szukasz. Zobacz :h glob() i :h globpath().

+0

Myślę, że masz rację, wygląda na to, że findfile nie obsługuje znaków wieloznacznych, a glob jest tym, czego szukam. Podjąłem to podejście i napisałem pętlę, aby przejrzeć katalogi nadrzędne, dopóki nie znajdę tego, czego szukam. To robi to, czego potrzebuję, dzięki! – actf

+2

@actf czy chciałbyś zamieścić swoje ostateczne rozwiązanie? dzięki! – Thomas

0

Jednym ze sposobów, aby to zrobić z zewnętrzny (szybki) find

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

Doceniam odpowiedź, ale myślę, że działa to tylko w przypadku, gdy plik * .sln znajduje się w katalogu nadrzędnym. Szukałem rozwiązania, które będzie rekurencyjne do struktury katalogów, dopóki nie znajdzie pasującego pliku (w ten sposób myślałem, że plik będzie zachowywał się). Na przykład, gdy edytowałem plik w katalogu ~/MyProject/src/innersrc, nie sądzę, aby to rozwiązanie działało. – actf

+0

@actf Rozumiem, co myślisz o zapętleniu, które się znajduje, '..' następnie' ../ .. 'dopóki go nie otrzymasz ?. Lub np. eksperymentuj z 'expand ('%: p: h')', które może dostarczyć ci pełnej ścieżki do bieżącego pliku. –

+0

Tak, myślę, że to najlepsze podejście. Wygląda na to, że otrzymałem katalog roboczy, a następnie przepuszczanie przez katalogi nadrzędne i wyszukiwanie za pomocą symbolu wieloznacznego za pośrednictwem glob() robi to, czego potrzebuję. – actf