Czy jest jakiś sposób na rekurencyjne przeszukiwanie katalogu w poszukiwaniu pliku (używając symboli wieloznacznych, gdy jest to potrzebne) w Vimie? Jeśli nie natywnie, czy istnieje wtyczka, która może to obsłużyć?
Czy jest jakiś sposób na rekurencyjne przeszukiwanie katalogu w poszukiwaniu pliku (używając symboli wieloznacznych, gdy jest to potrzebne) w Vimie? Jeśli nie natywnie, czy istnieje wtyczka, która może to obsłużyć?
Odpowiedzi:
W poleceniu można używać symboli wieloznacznych :edit
. Więc,
:e **/test/Suite.java
otworzy test / Suite.java bez względu na to, gdzie się on znajduje w bieżącej hierarchii katalogów. Działa to z uzupełnianiem tabulatorami, więc możesz użyć [tab], aby rozwinąć symbole wieloznaczne przed otwarciem pliku. Zobacz także opcję trybu dzikiego, aby dowiedzieć się, jak przeglądać wszystkie możliwe rozszerzenia.
Inną sztuczką jest użycie
:r! find . -type f
aby załadować listę wszystkich plików z bieżącego katalogu do bufora. Następnie możesz użyć wszystkich zwykłych narzędzi do manipulacji tekstem vim, aby nawigować / sortować / przycinać listę i CTRL+W gf
otwierać plik pod kursorem w nowym panelu.
Istnieje polecenie wyszukiwania. Jeśli dodasz **
(zobacz :help starstar
) do swojego 'path'
, możesz wyszukiwać rekurencyjnie:
:set path
pokaże ci twoją aktualną ścieżkę, dodaj **
robiąc coś takiego
:set path+=**
możesz po prostu wpisać
:find myfile.txt
i otwiera się magicznie!
Jeśli dodasz polecenie set do swojego .vimrc, upewni się, że możesz w przyszłości wyszukiwać rekursywnie. Wygląda na to, że nie przeszukuje katalogów z kropkami (na przykład .ssh)
my*.txt
?
:h find
.
:set path+=**
Polecam ctrlp.vim . To bardzo dobra wtyczka, idealna do pracy w dużych projektach. Ma wyszukiwanie według nazwy pliku lub pełnej ścieżki, wyszukiwanie wyrażeń regularnych, automatyczne wykrywanie katalogu głównego projektu (tego z folderem .git | hg | svn | bzr | _darcs), spersonalizowane wykluczenia nazw plików i wiele innych.
Po prostu naciśnij, <c-p>
a otworzy się bardzo intuicyjny panel, w którym możesz wyszukać to, co chcesz:
Możliwe jest jednoczesne wybranie i otwarcie kilku plików. Przyjmuje również dodatkowe dowolne polecenia, takie jak skok do określonej linii, wystąpienie łańcucha lub dowolne inne polecenie Vima.
Repozytorium: https://github.com/kien/ctrlp.vim
vim jako wbudowane polecenie znajdowania (: help find), ale otwiera tylko pierwszy znaleziony plik. Możesz jednak użyć tej niesamowitej wtyczki: FuzzyFinder, która robi wszystko, co chcesz, a nawet więcej
Możesz przeglądać system plików :ex .
, ale nie wiem, jak wyszukiwać rekursywnie (jestem nowicjuszem w Vimie - używam go dopiero od dziesięciu lat).
Istnieje kilka popularnych wtyczek do przeglądarek plików:
Zobacz także ten wątek na SuperUser .
Możesz użyć ! aby uruchomić polecenia powłoki:
:! find . -name *.xml
vim ma bild w poleceniach o nazwach grep, lgrep, vimgrep lub lvimgrep, które mogą to zrobić
tutaj jest poradnik, jak z nich korzystać http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search
możesz także użyć zewnętrznego polecenia, takiego jak find lub grep z vima, wykonując je w ten sposób
:!find ...
:grep test */.java
, wyszuka słowo test
we wszystkich .java
plikach. :!find
użyje find
polecenia powłoki, aby znaleźć pliki. Polecenie find
powłoki jest dość potężne, jeśli połączysz je z pcre lub rozszerzonym wyrażeniem regularnym
Dziwię się, że nikt jeszcze nie wspomniał o Unite.vim .
Znajdowanie plików (niejasno lub w inny sposób) to tylko wierzchołek góry lodowej tego, co może zrobić dla programisty. Posiada wbudowaną obsługę ag
, git
oraz mnóstwo innych programów / Narzędzia / vim wtyczek. Krzywa uczenia się może być nieco stroma, ale nie wyobrażam sobie życia bez niej. Baza użytkowników jest duża, a błędy są naprawiane natychmiast.
Przeglądanie wyników w stylu Quickfix
Stosowanie:
Find my.regex
Wynik:
grep -E
wyrażenia regularnego<enter>
lub <C-w>gf
otworzyć plik w bieżącym wierszu w nowej karciegf
aby otworzyć plik na bieżącej karcie i stracić listę plikówZamiast tego znajdź wszystkie pliki:
Find
Alternatywne metody:
Gfind my.regex
: wyszukuje tylko pliki śledzone przez Git ( git ls-files
). Zbieg prośba: https://github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743Gtfind my.regex
: tak jak Gfind
, ale szukaj z git najwyższego poziomu zamiast z bieżącego kataloguLocate somefile
: locate
wersjaKod:
function! Find(cmd)
let l:files = system(a:cmd)
if (l:files =~ '^\s*$')
echomsg 'No matching files.'
return
endif
tabedit
set filetype=filelist
set buftype=nofile
" TODO cannot open two such file lists with this. How to get a nice tab label then?
" http://superuser.com/questions/715928/vim-change-label-for-specific-tab
"file [filelist]
put =l:files
normal ggdd
nnoremap <buffer> <Enter> <C-W>gf
execute 'autocmd BufEnter <buffer> lcd ' . getcwd()
endfunction
command! -nargs=1 Find call Find("find . -iname '*'" . shellescape('<args>') . "'*'")
command! -nargs=1 Gfind call Find('git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Gtfind call Find('git rev-parse --show-toplevel && git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Locate call Find('locate ' . shellescape('<args>'))
W zależności od sytuacji (to znaczy zakładając, że poniższe polecenie znajdzie tylko jeden plik), być może użyj polecenia takiego jak:
:e `locate SomeUniqueFileName.java`
Spowoduje to, że Vim otworzy w bieżącej zakładce (polecenie e) plik będący wynikiem uruchomienia (w tym przykładzie),
locate SomeUniqueFileName.java
Zauważ, że magia tutaj polega na odwrotnych znakach wokół polecenia, które konwertują dane wyjściowe polecenia powłoki na tekst używany w poleceniu Vim.
Nie potrzebujesz wtyczki tylko do tej funkcji, wystarczy poniższy fragment kodu.
function! FindFiles()
call inputsave()
let l:dir = input("Find file in: ", expand("%:p:h"), "dir")
call inputrestore()
if l:dir != ""
call inputsave()
let l:file = input("File name: ")
call inputrestore()
let l:nf = 'find '.l:dir.' -type f -iname '.l:file.' -exec grep -nH -m 1 ".*" {} \;'
lexpr system(l:nf)
endif
endfunction
nnoremap <silent> <leader>fo :call FindFiles()<CR>
Biegać:
:args `find . -name '*xml'`
Vim uruchomi polecenie powłoki w odwrotnych znakach, umieści listę plików do arglist i otworzy pierwszy plik. Następnie możesz użyć, :args
aby wyświetlić arglistę (tj. Wyświetlić listę znalezionych plików) :n
oraz :N
aby nawigować do przodu i wstecz po plikach w arglist. Zobacz https://vimhelp.org/editing.txt.html#%7Barglist%7D i https://vimhelp.org/editing.txt.html#backtick-expansion
Możesz znaleźć pliki rekurencyjnie w swojej „ścieżce” za pomocą tej wtyczki . Obsługuje również uzupełnianie tabulatorami dla nazwy pliku.
Narzędzie ag i odpowiadająca mu wtyczka Ag vim doskonale rozwiązują ten problem:
Aby znaleźć plik za pomocą jakiegoś wzorca, użyj:
AgFile! pattern
Otworzy się okno quickfix z wynikami, które możesz wybrać.
Możesz dodać przypisanie klawiszy vim, aby wywołać to polecenie używając wybranego słowa jako wzorca.
nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>