web-dev-qa-db-fra.com

Comment pouvez-vous lister les correspondances de la recherche de Vim?

Je voudrais lister les matchs, quand je frappe:

/example

afin que je voie où tous les matchs sont à la fois.

    " 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
3
Yordan Georgiev
:g//p

Dans sa forme la plus longue:

:global/regular-expression/print

Vous pouvez omettre le motif/regex et Vim réutilisera le terme de recherche précédent.

Trivia: L'outil grep a été nommé d'après cette séquence de commandes.

200
too much php

Vous pouvez aussi faire un:

g/pattern/#

cela va imprimer le motif que vous voulez et le numéro de la ligne.

48
Taurus Olson

si vous souhaitez consulter cette liste et passer rapidement d’un match à l’autre, envisagez d’utiliser 

:vimgrep example %

ou 

:grep example % 

Cela va remplir la "liste des erreurs" avec toutes les correspondances afin que vous puissiez utiliser :copen pour toutes les lister dans le tampon de correction rapide, appuyez sur entrée sur une ligne particulière pour accéder à cette correspondance, ou utilisez des commandes comme :cn et :cp pour revenir et-vient.

pour une explication détaillée, voir ma réponse à une question similaire

41
Paul Ivanov

Je viens d’apprendre un nouveau: le Location List!
Tapez :lvim foo % pour rechercher foo dans le fichier actuel et entrez toutes les correspondances contenant foo dans la liste location .
Tapez :lopen pour ouvrir la liste des emplacements dans la fenêtre de correction rapide, qui est entièrement navigable comme d’habitude.
Utilisez :lnext/:lprevious pour parcourir la liste (utilisez tpope/unimpaired mappings pour une expérience optimale)

30
freeo

Une autre possibilité consiste à utiliser les commandes de recherche de fichier include.

[I

Cela listera toutes les occurrences du mot sous le curseur. Il se peut qu’il soit plus que nécessaire, car il recherchera également tous les fichiers inclus dans le fichier actuel.

Mais le bon côté de cette commande est que l’affichage des résultats de la recherche indique également le nombre de correspondances, en plus du numéro de ligne de chaque correspondance.

:help include-search

voir beaucoup de variantes.

Une note à propos de

:g//p

Ceci peut être réduit davantage à

:g//

car, comme d'autres l'ont dit, p(rint) est l'action par défaut.

13
dekeguard

Utiliser :set hlsearch mettra en évidence toutes les correspondances en jaune, ce qui vous permettra d’analyser facilement le fichier. Cela peut ne pas être ce que vous voulez, cependant, après la recherche: g // p vous donnera les correspondances listées

10
Kevin

Pour élaborer sur cela ... au lieu de

/example
:g//p

vous pouvez aussi écrire directement

:g/example/p

ou, étant donné que p(rint) est l'action par défaut de la commande: g (lobal), vous pouvez la réduire

:g/example

Et au lieu de p (rint), d’autres actions sont possibles, par exemple. effacer). Voir: aide: globale

8
user55400

vous pouvez obtenir une jolie fenêtre quickfix avec les correspondances de votre modèle de recherche actuel

:vim // %
:copen

super pratique si vous avez déjà créé un modèle de recherche complexe en utilisant uniquement /pattern 

Edit : je viens de découvrir que cela fonctionne également pour tous les tampons ouverts

:bufdo vimgrepadd // %
:copen
7
user1859022
g/pattern

Si vous avez :set number, la commande ci-dessus affiche également les numéros de ligne.

Si vous n'avez pas :set number, alors

g/pattern/#

affichera les numéros de ligne.

5
Sagar Jain

J'ai écrit un morceau de code pour cela. En fait, cela évite les problèmes dans vimgrep. Cela fonctionne même avec des fichiers sans nom. Et c'est plus facile à utiliser.

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

Lorsque vous l'appelez avec un motif, il ouvre les fenêtres d'emplacement avec toutes les correspondances.

Cela pourrait être une commande

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

Donc, tout ce que vous avez à faire est de taper :Mat pattern

J'utilise également le mappage suivant pour obtenir les correspondances de la sélection visuelle actuelle. 

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

Ctrl-f pour lister tous les résultats de la recherche:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
0
Fisher