Gibt es eine Möglichkeit, ein Verzeichnis in Vim rekursiv nach einer Datei zu durchsuchen (bei Bedarf mit Platzhaltern)? Wenn nicht nativ, gibt es ein Plugin, das damit umgehen kann?
Gibt es eine Möglichkeit, ein Verzeichnis in Vim rekursiv nach einer Datei zu durchsuchen (bei Bedarf mit Platzhaltern)? Wenn nicht nativ, gibt es ein Plugin, das damit umgehen kann?
Antworten:
Mit dem :editBefehl können Sie Platzhalter verwenden . So,
:e **/test/Suite.java
öffnet test / Suite.java unabhängig davon, wo es sich in der aktuellen Verzeichnishierarchie befindet. Dies funktioniert mit Tab-Vervollständigung, sodass Sie mit [Tab] die Platzhalter erweitern können, bevor Sie die Datei öffnen. Siehe auch die Wildmode- Option, um stattdessen alle möglichen Erweiterungen zu durchsuchen.
Ein weiterer Trick ist zu verwenden
:r! find . -type f
um eine Liste aller Dateien im aktuellen Verzeichnis in einen Puffer zu laden. Anschließend können Sie mit allen üblichen Vim-Textbearbeitungswerkzeugen in der Liste navigieren / sortieren / zuschneiden und CTRL+W gfdie Datei unter dem Cursor in einem neuen Bereich öffnen.
Es gibt einen Suchbefehl. Wenn Sie **Ihrem Pfad hinzufügen , können Sie rekursiv suchen.
:set path
zeigt Ihnen Ihren aktuellen Pfad, fügen Sie ** hinzu, indem Sie so etwas tun
:set path=.,/usr/include,,**
das bit vor dem habe **ich von der initial kopiert:set path
dann können Sie einfach tippen
:find myfile.txt
und es öffnet sich magisch!
Wenn Sie den Befehl set zu Ihrer .vimrc hinzufügen, wird sichergestellt, dass Sie in Zukunft eine rekursive Suche durchführen können. Es scheint keine Punktverzeichnisse zu durchsuchen (z. B. .ssh)
my*.txtauch?
:h find.
:set path+=**
Ich würde ctrlp.vim empfehlen . Es ist ein sehr gutes Plugin, ideal für große Projekte. Es verfügt über eine Suche nach Dateinamen oder vollständigem Pfad, eine Regexp-Suche, eine automatische Erkennung des Projektstamms (der mit dem Ordner .git | hg | svn | bzr | _darcs), Ausschlüsse für personalisierte Dateinamen und vieles mehr.
Drücken <c-p>Sie einfach und es öffnet sich ein sehr intuitiver Bereich, in dem Sie suchen können, was Sie wollen:
Es ist möglich, mehrere Dateien gleichzeitig auszuwählen und zu öffnen. Es werden auch zusätzliche beliebige Befehle akzeptiert, z. B. das Springen zu einer bestimmten Zeile, das Auftreten von Zeichenfolgen oder ein anderer Vim-Befehl.
vim als eingebauter Suchbefehl (: help find), aber nur die zuerst gefundene Datei öffnen. Sie können jedoch dieses erstaunliche Plugin verwenden: FuzzyFinder, das alles tut, was Sie wollen und noch mehr
Mit Command-T können Sie eine Datei sehr schnell finden, indem Sie einige Buchstaben eingeben. Sie können die Datei auch in einem neuen Tab öffnen, es muss jedoch vim mit Ruby-Unterstützung kompiliert werden.
Sie können verwenden! So führen Sie Shell-Befehle aus:
:! find . -name *.xml
Sie können das Dateisystem mit durchsuchen :ex . , aber ich weiß nicht, wie ich rekursiv suchen soll (ich bin ein Vim-Neuling - ich benutze es erst seit zehn Jahren).
Es gibt einige beliebte Plug-Ins für Dateibrowser:
Siehe auch diesen Thread zu SuperUser .
Command-t in einem meiner Lieblings-Vim-Plugins, es ist ein Ruby-basiertes Plugin über der Integration mit FZF.
Mit Comamnd-T und FZF können Sie die Suche mit einem extrem schnellen "Fuzzy" -Mechanismus durchführen für:
Wie du siehst
Ich suche immer im Befehlsverlauf, indem ich ein neues Terminal öffne und drücke:
CTRL+R
Zusätzlich zur rekursiven Suche in allen Ordnern durch Schreiben in eine beliebige Terminalregisterkarte:
fzf
Sie können auch hinein schreiben vim
:CommandT
Wirklich kraftvoll und schnell.
vim hat bild in Befehlen mit den Namen grep, lgrep, vimgrep oder lvimgrep, die dies können
Hier ist ein Tutorial zu deren Verwendung http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search
Sie können auch einen externen Befehl wie find oder grep von vim verwenden, indem Sie ihn wie folgt ausführen
:!find ...
:grep test */.javawird testin allen .javaDateien nach dem Wort suchen . :!findverwendet den findShell-Befehl, um nach Dateien zu suchen. Der findShell-Befehl ist ziemlich mächtig, wenn Sie ihn mit pcre oder erweitertem
Ich bin überrascht, dass niemand Unite.vim erwähnt hat .
Das Finden von Dateien (unscharf oder auf andere Weise) ist nur die Spitze des Eisbergs dessen, was es für einen Entwickler tun kann. Es hat eingebaute Unterstützung für ag, gitund eine Vielzahl von anderen Programmen / Dienstprogramme / vim Plugins. Die Lernkurve kann etwas steil sein, aber ich kann mir mein Leben ohne sie nicht vorstellen. Die Benutzerbasis ist groß und Fehler werden sofort behoben.
Quickfix-ähnliches Ergebnis-Browsing
Verwendung:
Find my.regex
Ergebnis:
grep -E regulären Ausdruck entspricht<enter>oder <C-w>gfum die Datei in der aktuellen Zeile in einer neuen Registerkarte zu öffnengf um die Datei auf der aktuellen Registerkarte zu öffnen und die Dateiliste zu verlierenFinden Sie stattdessen alle Dateien:
Find
Alternative Methoden:
Gfind my.regex: Suche nur nach Git-Tracking-Dateien ( git ls-files). Flüchtige Anfrage: https://github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743Gtfind my.regex: wie Gfind, aber Suche von der Git-obersten Ebene anstelle des aktuellen VerzeichnissesLocate somefile: locateVersionCode:
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>'))
Verwenden Sie abhängig von Ihrer Situation (dh wenn der folgende Befehl nur eine einzige Datei findet) möglicherweise einen Befehl wie:
:e `locate SomeUniqueFileName.java`
Dies führt dazu, dass Vim auf der aktuellen Registerkarte (dem Befehl e) eine Datei öffnet, die das Ergebnis der Ausführung ist (in diesem Beispiel).
locate SomeUniqueFileName.java
Beachten Sie, dass die Magie hier die Backticks um den Befehl sind, die die Ausgabe des Shell-Befehls in Text konvertieren, der im Vim-Befehl verwendet werden kann.
Sie benötigen nicht nur für diese Funktion ein Plugin, das folgende Code-Snippet reicht aus.
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>
Lauf:
:args `find . -name '*xml'`
Vim führt den Shell-Befehl in Backticks aus, legt die Liste der Dateien in der Arglist ab und öffnet die erste Datei. Dann können Sie mit :argsder arglist anzuzeigen (dh Liste der Dateien gefunden) und :nund nach :Nvorne und bacwards durch die Dateien in arglist navigieren. Siehe https://vimhelp.org/editing.txt.html#%7Barglist%7D und https://vimhelp.org/editing.txt.html#backtick-expansion
Mit diesem Plugin können Sie Dateien rekursiv in Ihrem "Pfad" finden . Es unterstützt auch die Tab-Vervollständigung für den Dateinamen.
Das ag-Tool und das entsprechende Ag vim-Plugin lösen dieses Problem perfekt:
Um eine Datei mit einem Muster zu finden, verwenden Sie:
AgFile! pattern
Es öffnet sich ein Quickfix-Fenster mit Ergebnissen, in denen Sie auswählen können.
Sie können vim keybinding hinzufügen, um diesen Befehl mit dem ausgewählten Wort als Muster aufzurufen.
nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>