Wie können Sie die Übereinstimmungen von Vims Suche auflisten?


101

Ich möchte die Übereinstimmungen auflisten, wenn ich drücke:

/example

so dass ich sehe, wo alle Spiele auf einmal sind.

Antworten:


3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps

1
Ich mag deine F5-F8-Ideen sehr. Es wäre schön, hier einige Visualisierungen / Ausgaben dieser Befehle zu haben. Wie funktioniert F8? Es sucht nur das aktuelle Verzeichnis? - - Das Weglassen eines Verzeichnisses ist ein Brauch - - warum node_modules? - - Wie Perl-Regexe die Standardfunktion von Vim ändern? - - Im Folgenden habe ich meine Suche nach .tex-Dateien gestaltet. Askubuntu.com/a/789769/25388 Es wäre schön, von Ihnen zu lernen, wie Sie sie verbessern können. Es ist nicht so intuitiv, deshalb habe ich die Logik auch oft selbst vergessen.
Léo Léopold Hertz 27

node_modules ist das Verzeichnis, das viel js-Code aus den npm-Modulen enthält, wenn Sie Frontends entwickeln würden ... es ist nur ein Beispiel ...
Yordan Georgiev

1
Machen Sie eine Sicherungskopie von Ihnen .vimrc und fügen Sie diese Einstellungen hinzu, laden Sie sie mit: so% und versuchen Sie dann, die "Hilfen" in den Befehlen auszuführen ... vim ist schwer - Sie müssten diese tausendmal wiederholen, aber sobald Sie Meistere sie, du wirst über jeden lachen, der auf seine neuen UI-IDE-Funktionen hinweist ...
Yordan Georgiev

225
:g//p

In seiner längeren Form:

:global/regular-expression/print

Sie können das Muster / den regulären Ausdruck weglassen und Vim verwendet den vorherigen Suchbegriff erneut.

Wissenswertes: Das grep- Tool wurde nach dieser Befehlssequenz benannt.


18
:g//- Da p (rint) die Standardaktion ist, können Sie dies auch weglassen.
Dekeguard

6
:g/ist noch kürzer!
Sparhawk

2
Ist es möglich, hier Kontext zu sehen, wie in grep --context 9?
Vitaly Zdanevich

@VitalyZdanevich Try :%s/regular-expression//gn Es wird etwas in dieser Richtung produzieren:X matches on Y lines
Alexej Magura

@AlexejMagura Ich meine - wie sieht man ein paar Zeilen vor und nach dem String?
Vitaly Zdanevich

50

Sie können auch Folgendes tun:

g/pattern/#

Dadurch werden das gewünschte Muster und die Nummer der Zeile gedruckt.


2
Schön. Aber wenn Sie Zeilennummern haben bereits aktiviert ist , dann #ist nicht erforderlich. Es zeigt standardmäßig Zeilennummern
Pavan Manjunath

44

Wenn Sie sich diese Liste ansehen und schnell zwischen den Spielen wechseln möchten, sollten Sie die Verwendung in Betracht ziehen

:vimgrep example %

oder

:grep example %

Dadurch wird die "Fehlerliste" mit allen Übereinstimmungen :copengefüllt, sodass Sie sie alle im Quickfix-Puffer auflisten, in einer bestimmten Zeile die Eingabetaste drücken können, um zu dieser Übereinstimmung zu springen, oder Befehle wie :cnund verwenden können :cp, um hin und her zu gehen.

Eine ausführliche Erklärung finden Sie in meiner Antwort auf eine ähnliche Frage


Dies gibt E499: Empty file name for '%' or '#', only works with ":p:h"auf MacVim 8.1
Lincoln Bergeson

35

Habe gerade einen neuen gelernt: den Location List!
Geben Sie in die aktuelle Datei ein, :lvim foo %nach dem gesucht foowerden soll, und geben Sie alle Übereinstimmungen fooin die Standortliste ein .
Geben Sie :lopenden Speicherort Liste im quickfix Fenster zu öffnen, die vollständig befahrbar wie es üblich ist.
Verwenden Sie :lnext/ :lpreviousto, um die Liste zu durchsuchen (verwenden Sie tpope / unbeeinträchtigte Zuordnungen, um die beste Erfahrung zu erzielen ).


2
Netter Tipp! Dies führte mich zu dieser Zuordnung, die das Wort unter dem Cursor automatisch erweitert und in einem Durchgang geöffnet wird: nnoremap <Leiter> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen

16

Eine andere Möglichkeit besteht darin, die Suchbefehle für Include-Dateien zu verwenden.

[I

Dadurch werden alle Vorkommen des Wortes unter dem Cursor aufgelistet. Es kann jedoch mehr sein, als Sie benötigen, da auch alle Dateien durchsucht werden, die in der aktuellen Datei enthalten sind.

Das Schöne an diesem Befehl ist jedoch, dass in der Anzeige der Suchergebnisse neben der Zeilennummer jeder Übereinstimmung auch die Anzahl der Übereinstimmungen angezeigt wird.

:help include-search

viele Varianten zu sehen.

Ein Hinweis zu

:g//p

Dies kann weiter reduziert werden auf

:g//

weil, wie andere gesagt haben, p (rint) die Standardaktion ist.


Ist es möglich, Ergebnisse aus dem [IKontext zu erhalten, wie auf grep --context 9?
Vitaly Zdanevich

10

Sie können ein schönes quickfixFenster mit den Übereinstimmungen aus Ihrem aktuellen Suchmuster erhalten

:vim // %
:copen

Super praktisch, wenn Sie zuvor mit just ein komplexes Suchmuster erstellt haben /pattern

Bearbeiten : Ich habe gerade herausgefunden, dass dies auch für alle offenen Puffer funktioniert

:bufdo vimgrepadd // %
:copen

10

Mit :set hlsearchwird alle Übereinstimmungen gelb hervorgehoben, sodass Sie die Datei problemlos nach Übereinstimmungen durchsuchen können. Dies ist jedoch möglicherweise nicht das, was Sie nach der Suche möchten: g // p gibt Ihnen die aufgelisteten Übereinstimmungen


2
Sollte ': set hlsearch' not ': hlsearch' sein.
zu viel PHP

Es ist nützlich, auch eine Zuordnung vorzunehmen :nohl, um die Highlights zu löschen, wenn Sie sie nicht mehr benötigen.
Kos

9

Darauf näher einzugehen ... statt

/example
:g//p

Sie können auch direkt schreiben

:g/example/p

oder da p (rint) die Standardaktion für den Befehl: g (lobal) ist, kann dies auf verkürzt werden

:g/example

Und anstelle von p (rint) sind andere Aktionen möglich, z. B. d (elete). Siehe: Hilfe: global


6
g/pattern

Wenn ja :set number, zeigt der obige Befehl auch Zeilennummern an.

Wenn nicht :set number, dann

g/pattern/#

zeigt die Zeilennummern an.


0

Ich habe dafür einen Code geschrieben. Es vermeidet tatsächlich die Probleme in vimgrep. Es funktioniert auch mit unbenannten Dateien. Und es ist einfacher zu bedienen.

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

Wenn Sie es mit einem Muster aufrufen, werden die Standortfenster mit allen Übereinstimmungen geöffnet.

Dies könnte ein Befehl sein

command! -nargs=1 Mat call Matches(<f-args>)

Sie müssen also nur tippen :Mat pattern

Ich verwende auch die folgende Zuordnung, um die Übereinstimmungen der aktuellen visuellen Auswahl zu erhalten.

vnoremap Y "xy:call Matches(@x)<CR>

-1

Strg-F, um alle Suchergebnisse aufzulisten:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
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.