Wie kann ich mit VIM interaktiv suchen / suchen?


12

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 .


Ich benutze es nicht persönlich, daher bin ich mir nicht 100% sicher, aber ich denke, dass ctrl-pSie nach einem ähnlichen Plugin suchen. Beachten Sie, dass dies unite.vimauch möglich sein sollte, aber ich würde es nicht empfehlen, da es meiner Meinung nach ein ziemlich schweres und fehlererzeugendes Plugin ist.
statox

Gibt ctrl-pes eine Möglichkeit, den Dateiinhalt interaktiv zu durchsuchen? Ich habe es immer nur verwendet, um interaktiv nach Dateien basierend auf deren Namen zu suchen.
ideasman42

Ich denke, es ist möglich, aber wie gesagt, ich benutze es nicht, also bin ich vielleicht falsch
statox

Antworten:


14

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:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

... irgendwo zwischen den Zeilen:

call plug#begin('~/.vim/plugged')

und:

call plug#end()

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, die fzfeine 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:

apt-get install silversearcher-ag

Das Projekt auf Github erklärt, wie es auf MacOS installiert wird:

brew install the_silver_searcher

:Agist ein Wrapper um $ agund 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:

  • vorwärts und rückwärts durch die Übereinstimmungen mit C-nund blätternC-p
  • wähle das aktuelle Spiel aus und gehe mit Tab/ zum nächsten / vorherigenS-Tab
  • Wählen Sie alle Übereinstimmungen mit M-aoder 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 :cnextund durch diese navigieren :cprevious.

Bildbeschreibung hier eingeben

Wenn Sie allen von installierten Befehlen ein Präfix hinzufügen möchten fzf.vimund vorhandene Befehle nicht überschreiben möchten , können Sie dies hinzufügen in vimrc:

let g:fzf_command_prefix = 'your_prefix'

Ich benutze Fzfals Präfix, das ist , warum ich nicht geben , :Agaber :FzfAg.


Wenn Sie es vorziehen, git grepstatt zu verwenden ag, können Sie anscheinend Ihren eigenen benutzerdefinierten Wrapper :GGrepwie folgt installieren :

command! -bang -nargs=* GGrep
  \ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)

Es ist in erklärt :h fzf-vim-customization.

Auch, wenn fzfeine 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 verwenden bash, wird die folgende Zeile in Ihrer hinzugefügt ~/.bashrc:

[ -f ~/.fzf.bash ] && source ~/.fzf.bash

Dies gibt die Datei als Quelle aus ~/.fzf.bash. Letzteres enthält Code:

# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
  export PATH="$PATH:/home/user/.fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null

# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"

Dieser Code fügt einen Pfad zur Umgebungsvariable $PATH: /home/user/.fzf/bin; Welches ist der Ordner mit dem fzfProgramm.

Es werden auch 2 andere Dateien bereitgestellt:

/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash

Die erste scheint Vervollständigungsfunktionen zu definieren, während die zweite Tastenkombinationen installiert.

Leider können die Tastenbelegungen die Standardfunktionen überschreiben readline.
Zum Beispiel fzfbindet die Funktion fzf-file-widgetzu C-t. Diese Taste wird normalerweise von readline verwendet, um die transpose-charsFunktion auszuführen .

Wenn Sie dies nicht möchten, besteht eine mögliche Lösung darin, die Tastenkombinationen in Ihrem wiederherzustellen ~/.bashrc, nachdem Sie fzfdie Konfiguration vorgenommen haben. Wenn Sie beispielsweise C-tdas alte Verhalten beibehalten möchten, fzf-file-widgetdh die 2 Zeichen um den Cursor herum transponieren und an eine andere Taste binden möchten C-x C-t, können Sie die folgenden Zeilen am Ende hinzufügen ~/.bashrc:

bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'

Das Gleiche gilt für die zshShell, aber die Syntax zum Installieren einer Schlüsselbindung ist etwas anders:

bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars

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.

~/.bashrcKommentieren Sie zunächst in Ihrem vorübergehend die Zeile aus, aus der die fzfKonfiguration stammt. Öffnen Sie dann ein Terminal erneut und sehen Sie sich die Ausgabe des bind -PBefehls an, die Sie in einem Vim-Puffer lesen können:

bind -P | vim -R -

Ich bin nicht sicher, aber ich denke, es sollte die meisten oder alle readlineTastenzuordnungen anzeigen . Wenn Sie nach dem Namen der Readline-Funktion suchen, die an den C-tSchlüssel gebunden ist, suchen Sie im Vim-Puffer \\C-t. Und wenn Sie nach der einen suchen würden, die an M-c(Meta / Alt-Taste) gebunden ist , würden Sie suchen \\ec( \esteht für die Escape-Taste und M-cerzeugt anscheinend die gleichen Schlüsselcodes wie escape + c).

Sie können dasselbe tun, zshindem Sie sich die Ausgabe des bindkeyBefehls 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, fzfderen Name das Schlüsselwort enthält . Sie verwenden die Tastenfolgen C-i(wie Tab) C-r,, C-tund M-c. Sie sind an folgende Funktionen gebunden:

C-i    fzf-completion
C-r    fzf-history-widget
C-t    fzf-file-widget
M-c    fzf-cd-widget

Auf meinem System haben diese Tasten ursprünglich readline(die Bibliothek, mit bashder die Befehlszeile bearbeitet wurde) an folgende Funktionen gebunden:

C-i     complete
C-r     reverse-search-history
C-t     transpose-chars
M-c     capitalize-word

Und zle(der von verwendete Zeileneditor zsh) hat sie gebunden an:

C-i     expand-or-complete
C-r     history-incremental-search-backward
C-t     transpose-chars
M-c     capitalize-word

1
Muss agein separates Plugin / Tool installiert werden?
ideasman42

@ ideasman42 Ja, tut mir leid, ich habe vergessen, dass der Shell-Befehl agauch notwendig war. Ich habe die Antwort aktualisiert.
User9433424

1
Es ist wahrscheinlich erwähnenswert, dass diese Tools ziemlich aufdringlich sind und standardmäßig Ihre bash- und zsh-Konfigurationen ersetzen.
ideasman42

@ ideasman42 Du hast Recht, ich habe die Antwort aktualisiert, um dieses Problem zu erwähnen.
user9433424
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.