Eine Sache, die ich oft tue (aber auf die Befehlszeile angewiesen bin), ist das Suchen / Greifen in mehreren Dateien.
Gibt es eine Möglichkeit, Suchergebnisse für alle offenen Puffer anzuzeigen?
Idealerweise hätte ich gerne einen neuen geteilten Puffer, der die Position des Ergebnisses und das Snippet enthält, ähnlich wie dies der grep
Fall ist. Zum Beispiel ( /statistics
):
models/statistics.php: /*! \file statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();
Als Bonus möchte ich in der Lage sein, nach dem Begriff unter dem Cursor zu suchen, ähnlich wie dies der gd
Fall ist.
search
multiple-files
Roflo
quelle
quelle
Antworten:
Mit können Sie
:vimgrep /pattern/ {files}
die Quickfix-Liste mit übereinstimmenden Mustern füllen. Das Problem ist, dass die:vimgrep
Option files Puffer nicht direkt zulässt. Sie können verwenden:Eine andere Möglichkeit besteht darin, ein Skript zu schreiben, aus dem eine Dateiliste generiert wird
:buffers
. Für diesen SO-Beitrag mit einer kurzen Woche erhalten wir:Sie können jetzt
:GrepBufs <expression>
die Standardausgabe aufrufen und abrufen ,:vimgrep
aber stattdessen die Puffer verwenden.Aktualisieren Wenn Sie
GrepBuffers
mit dem Wert unter dem Cursor aufrufen möchten, fügen Sie dieses neue Mapping hinzu.Wenn Sie sich im normalen Modus befinden, geben
<leader>z
Sie:vimgrep
das Cursorwort über den geöffneten Puffern ein.quelle
command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')
. Verwendung::Bufgrep/foo/
Das Suchen in nur geöffneten Puffern ist nett, aber es kann vorkommen, dass Sie über ein gesamtes Projekt hinweg suchen möchten. Es kann schneller und einfacher sein als Sie denken!
Projektübergreifende Suche
grep
ist das Unix-Standardsuchwerkzeug. Erwähnenswert wegen seiner Allgegenwart. Bereits per:grep
Befehl in Vim integriert . zb:grep -r 'foo'
. Sehen:h :grep
.--perl
. Informationen zur Vim-Integration finden Sie unter Ack.vimgit grep
durchsucht ein Repository sehr schnell. Fugitive.vim bietet:Ggrep
.git grep
. Kann auch mit verwendet werden:grep
.Ich empfehle sowohl Ripgrep, Ag, und
git grep
wie sie alle super schnell sind. Ich habe über 4700+ in weniger als einer Sekunde gesucht. Es ist ziemlich schwer, Ripgrep zu schlagen.Um eine dieser Alternativen ohne Plugin zu testen oder Sie möchten einfach kein Plugin, können Sie Ihre
'grepprg'
Option entsprechend einstellen . zBset grepprg=ag\ --vimgrep
oderset grepprg=rg\ --vimgrep
. Siehe:h 'grepprg'
und:h 'grepformat'
für weitere Informationen. Jetzt können Sie über suchen:grep
. zb:grep 'foo'
.Als letztes Fallback können Sie verwenden,
:vimgrep
wie es auf allen Systemen verfügbar ist, auf denen Vim verfügbar ist. Sehen Sie:h :vimg
für weitere Hilfe.QuickFix-Liste
Da die meisten dieser Optionen die Quickfix-Liste verwenden, sollten Sie einige benutzerfreundlichere Zuordnungen verwenden, um die Quickfix-Liste zu durchlaufen. Ich benutze Tim Popes unbeeinträchtigt Plugin , das verwendet
]q
und[q
für:cnext
und:cprev
jeweils. Einige Leute mögen die quickfix zu öffnen , nachdem eine Suche durchgeführt wird , dann kann das folgende in hinzufügen~/.vimrc
Datei:autocmd QuickFixCmdPost *grep* cwindow
. Sie können die QuickFix-Liste auch manuell über öffnen:copen
.Willst du noch schneller "suchen"?
Sie müssen ein Tool verwenden, das vorgefertigte Indizes wie ctags , cscope oder GNU global verwendet .
:tag
,<c-]>
und viele andere Befehle und Optionen. Sehen:h tags
. Vielleicht möchten Sie auch Effortless Ctags mit Git lesen oder sich das Gutentags- Plugin ansehen:cscope
Befehl verwendet werden . Sehen:h cscope
Mehr Hilfe
Ich würde mit dieser netten Vimcast- Episode beginnen: Durchsuche mehrere Dateien mit
:vimgrep
.Weitere Hilfe zu Vim finden Sie in der Dokumentation:
quelle
Das GrepCommands-Plugin definiert Varianten des eingebauten
:vimgrep
Befehls, die auf alle Argumente, aufgelisteten Puffer, Fenster auf der aktuellen Registerkarte oder auf allen Registerkarten für die Suche abzielen. Grundsätzlich eine robuste Plugin-Implementierung von @ jecxjos Antwort.quelle
Befehle
:bufdo
und:vimgrepadd
Diese Antwort basiert auf /programming//a/11976158/1057593 .
Ich wollte jedoch ein paar Bits hinzufügen. Wieder ist der grundlegende Befehl
Wenn Ihre Quickfix-Liste nicht leer ist, möchten Sie sie wahrscheinlich zuerst löschen (siehe /programming//q/27385970/1057593 ). Dies kann mit erfolgen
vim-unimpaired stellt die Mappings zur Verfügung
]q
und[q
fährt durch die Matches.cmdline-history
Es ist ein guter Workflow, das Suchmuster separat mit einzugeben
/pattern
. Auf diese Weise können Sie einen allgemeinen Befehl aus Ihrem Befehlszeilenverlauf unter Verwendung des aktuellen Suchmusters verwenden. Das würde so aussehenEine typische neue pufferweite Suche wäre
Ich habe meinem vimrc die folgenden Zuordnungen hinzugefügt, um
<C-N>
und<C-P>
anstelle der Pfeiltasten zu verwendenUm die Befehlshistorie Verwendung zu suchen
q:
, dann/bufdo<CR>
und rufen Sie einen Befehl mit<CR>
. Weitere Informationen finden Sie unter https://vim.fandom.com/wiki/Using_command-line_history sowie auf den Hilfeseiten:h history
und:h cmdline-window
.Sie können den wiederverwendbaren Befehl
:copen
folgendermaßen hinzufügen, um die Quickfix-Liste sofort anzuzeigen:Der Vorschlag von stackoverflow hat
:bufdo vimgrepadd // % | copen
in meinem Fall mehrere unbeabsichtigte Fenster geöffnet.quelle