Gibt es eine Möglichkeit, VIM so zu konfigurieren, dass interaktiv in jeder Datei nach einem gesamten Projekt gesucht wird?
Mit interaktiv meine ich die Aktualisierung jedes Tastenanschlags.
So etwas wie Emacs counsel-git-grep , siehe: Beispieldemo .
ctrl-p
Sie nach einem ähnlichen Plugin suchen. Beachten Sie, dass diesunite.vim
auch möglich sein sollte, aber ich würde es nicht empfehlen, da es meiner Meinung nach ein ziemlich schweres und fehlererzeugendes Plugin ist.ctrl-p
es eine Möglichkeit, den Dateiinhalt interaktiv zu durchsuchen? Ich habe es immer nur verwendet, um interaktiv nach Dateien basierend auf deren Namen zu suchen.Antworten:
Ich bin mir nicht sicher, ob Sie danach suchen, aber vielleicht könnten Sie es mit fzf und fzf.vim versuchen .
Wenn Sie vim-plug als Plugin-Manager verwenden, müssen Sie zur Installation nur die folgenden Zeilen hinzufügen
vimrc
:... irgendwo zwischen den Zeilen:
und:
Dann ausführen
:PlugInstall
.Unter den verschiedenen Befehlen und Zuordnungen, die von bereitgestellt werden
fzf.vim
(deren einziger Zweck anscheinend darin besteht, Zuordnungen und Befehle zu installieren, diefzf
eine Fuzzy-Suche in vordefinierten Quellen erfordern), befindet sich der Befehl:Ag
.Um es verwenden zu können, müssen Sie das Shell-Kommando ag installieren . Auf debian-basierten Distributionen kann dies mit dem folgenden Befehl erfolgen:
Das Projekt auf Github erklärt, wie es auf MacOS installiert wird:
:Ag
ist ein Wrapper um$ ag
und ermöglicht Ihnen die Fuzzy-Suche nach einem Muster in den Dateien des aktuellen Verzeichnisses (das bei der Eingabe angezeigt wird:pwd
). Die Übereinstimmungen werden nach jedem Tastendruck aktualisiert.Du kannst:
C-n
und blätternC-p
Tab
/ zum nächsten / vorherigenS-Tab
M-a
oder aus oder abM-d
Wenn Sie eine oder mehrere Übereinstimmungen auswählen und die Eingabetaste drücken, werden diese in der Quickfix-Liste aufgeführt. Von dort aus können Sie mit den Standard-Vim-Befehlen / -Zuordnungen wie
:cnext
und durch diese navigieren:cprevious
.Wenn Sie allen von installierten Befehlen ein Präfix hinzufügen möchten
fzf.vim
und vorhandene Befehle nicht überschreiben möchten , können Sie dies hinzufügen invimrc
:Ich benutze
Fzf
als Präfix, das ist , warum ich nicht geben ,:Ag
aber:FzfAg
.Wenn Sie es vorziehen,
git grep
statt zu verwendenag
, können Sie anscheinend Ihren eigenen benutzerdefinierten Wrapper:GGrep
wie folgt installieren :Es ist in erklärt
:h fzf-vim-customization
.Auch, wenn
fzf
eine Scheibe in tmux öffnet, und Sie würden es vorziehen , den ganzen Bildschirm nimmt stattdessen kannst du einen Knall auf alle Befehle anhängen (:Ag!
,:GGrep!
, ...).Wie Sie in Ihrem letzten Kommentar gesagt haben ,
fzf
ändert sich standardmäßig die Konfiguration Ihrer Shell. Wenn Sie zum Beispiel verwendenbash
, wird die folgende Zeile in Ihrer hinzugefügt~/.bashrc
:Dies gibt die Datei als Quelle aus
~/.fzf.bash
. Letzteres enthält Code:Dieser Code fügt einen Pfad zur Umgebungsvariable
$PATH
:/home/user/.fzf/bin
; Welches ist der Ordner mit demfzf
Programm.Es werden auch 2 andere Dateien bereitgestellt:
Die erste scheint Vervollständigungsfunktionen zu definieren, während die zweite Tastenkombinationen installiert.
Leider können die Tastenbelegungen die Standardfunktionen überschreiben
readline
.Zum Beispiel
fzf
bindet die Funktionfzf-file-widget
zuC-t
. Diese Taste wird normalerweise von readline verwendet, um dietranspose-chars
Funktion auszuführen .Wenn Sie dies nicht möchten, besteht eine mögliche Lösung darin, die Tastenkombinationen in Ihrem wiederherzustellen
~/.bashrc
, nachdem Siefzf
die Konfiguration vorgenommen haben. Wenn Sie beispielsweiseC-t
das alte Verhalten beibehalten möchten,fzf-file-widget
dh die 2 Zeichen um den Cursor herum transponieren und an eine andere Taste binden möchtenC-x C-t
, können Sie die folgenden Zeilen am Ende hinzufügen~/.bashrc
:Das Gleiche gilt für die
zsh
Shell, aber die Syntax zum Installieren einer Schlüsselbindung ist etwas anders:Wenn eine der von Ihnen verwendeten Shell-Schlüsselbindungen überschrieben wurde
fzf
, Sie diese wiederherstellen möchten, aber nicht wissen, wie die ausgeführte Funktion genau heißt, können Sie Folgendes versuchen.~/.bashrc
Kommentieren Sie zunächst in Ihrem vorübergehend die Zeile aus, aus der diefzf
Konfiguration stammt. Öffnen Sie dann ein Terminal erneut und sehen Sie sich die Ausgabe desbind -P
Befehls an, die Sie in einem Vim-Puffer lesen können:Ich bin nicht sicher, aber ich denke, es sollte die meisten oder alle
readline
Tastenzuordnungen anzeigen . Wenn Sie nach dem Namen der Readline-Funktion suchen, die an denC-t
Schlüssel gebunden ist, suchen Sie im Vim-Puffer\\C-t
. Und wenn Sie nach der einen suchen würden, die anM-c
(Meta / Alt-Taste) gebunden ist , würden Sie suchen\\ec
(\e
steht für die Escape-Taste undM-c
erzeugt anscheinend die gleichen Schlüsselcodes wieescape + c
).Sie können dasselbe tun,
zsh
indem Sie sich die Ausgabe desbindkey
Befehls ansehen. Diesmal^[
steht es jedoch für den Meta / Alt-Modifikator, während ein einzelnes Caret (^
) für den Steuerschlüssel steht.Derzeit habe ich 4 Tastenkombinationen gefunden, die Funktionen ausführen,
fzf
deren Name das Schlüsselwort enthält . Sie verwenden die TastenfolgenC-i
(wieTab
)C-r
,,C-t
undM-c
. Sie sind an folgende Funktionen gebunden:Auf meinem System haben diese Tasten ursprünglich
readline
(die Bibliothek, mitbash
der die Befehlszeile bearbeitet wurde) an folgende Funktionen gebunden:Und
zle
(der von verwendete Zeileneditorzsh
) hat sie gebunden an:quelle
ag
ein separates Plugin / Tool installiert werden?ag
auch notwendig war. Ich habe die Antwort aktualisiert.