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

101

Je voudrais lister les matchs, quand je frappe:

/example

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

Léo Léopold Hertz 준영
la source

Réponses:

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
Yordan Georgiev
la source
1
J'aime beaucoup vos idées F5-F8. Ce serait bien d'avoir quelques visualisations / sorties de ces commandes ici. Comment F8 est-il conçu pour fonctionner? Il recherche uniquement le répertoire actuel? - - L'omission d'un répertoire est une coutume - - pourquoi node_modules? - - Comment les regex perl modifient le fonctionnement par défaut de Vim? - - Voici comment j'ai conçu ma recherche de fichiers .tex askubuntu.com/a/789769/25388 Ce serait bien d'apprendre de vous comment l'améliorer. Ce n'est pas si intuitif que j'ai souvent oublié la logique moi-même.
Léo Léopold Hertz 준영
node_modules est le répertoire contenant beaucoup de code js des modules npm si vous développez des front-end ... ce n'est qu'un exemple ...
Yordan Georgiev
1
faites une sauvegarde de vous .vimrc et ajoutez ces paramètres, chargez-les avec: so% et essayez d'exécuter les "help" dans les commandes ... vim est difficile - vous devrez répéter ces milliers de fois, mais une fois que vous maîtrisez-les, vous allez rire @everyone qui pointe leurs nouvelles fonctionnalités de l'interface utilisateur IDE ...
Yordan Georgiev
226
:g//p

Dans sa forme plus longue:

:global/regular-expression/print

Vous pouvez omettre le pattern / 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.

trop de php
la source
18
:g//- puisque p (rint) est l'action par défaut, vous pouvez également la laisser de côté.
dekeguard
6
:g/est encore plus court!
Sparhawk
2
Est-il possible de voir le contexte ici, comme dans grep --context 9?
Vitaly Zdanevich
@VitalyZdanevich Try :%s/regular-expression//gn It produira quelque chose du genre :X matches on Y lines
Alexej Magura
@AlexejMagura Je veux dire - comment voir quelques lignes avant et après une chaîne?
Vitaly Zdanevich
50

Vous pouvez également faire un:

g/pattern/#

qui imprimera le motif souhaité et le numéro de la ligne.

Taureau Olson
la source
2
Joli. Mais si vous avez déjà activé les numéros de ligne, cela #n'est pas obligatoire. Il affiche les numéros de ligne par défaut
Pavan Manjunath
44

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

:vimgrep example %

ou

:grep example %

Cela remplira la "liste des erreurs" avec toutes les correspondances afin que vous puissiez les :copenlister toutes dans le tampon de correction rapide, appuyez sur Entrée sur une ligne particulière pour sauter à cette correspondance, ou utilisez des commandes comme :cnet :cppour aller et venir.

pour une explication approfondie, voir ma réponse à une question similaire

Paul Ivanov
la source
Cela donne E499: Empty file name for '%' or '#', only works with ":p:h"sur MacVim 8.1
Lincoln Bergeson
35

Je viens d'en apprendre un nouveau: le Location List!
Tapez :lvim foo %à rechercher foodans le fichier actuel et entrez toutes les correspondances contenant foodans la liste des emplacements .
Tapez :lopenpour ouvrir la liste des emplacements dans la fenêtre de correction rapide, qui est entièrement navigable comme d'habitude.
Utilisez :lnext/ :lpreviousto pour parcourir la liste (utilisez tpope / mappings intacts pour la meilleure expérience)

freeo
la source
2
Bon conseil! cela m'a conduit à faire ce mappage qui développe automatiquement le mot sous le curseur et s'ouvre en un seul passage: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen
16

Une autre possibilité consiste à utiliser les commandes de recherche de fichier d'inclusion.

[I

Cela listera toutes les occurrences du mot sous le curseur. Cela peut être plus que ce dont vous avez besoin, car il recherchera également tous les fichiers inclus dans le fichier actuel.

Mais la bonne chose à propos de cette commande est que l'affichage des résultats de la recherche montre également un décompte du nombre de correspondances, en plus du numéro de ligne de chaque correspondance.

:help include-search

pour voir plein de variantes.

Une note sur

:g//p

Cela peut être réduit davantage à

:g//

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

dekeguard
la source
Est-il possible d'obtenir des résultats [Iavec le contexte, comme sur grep --context 9?
Vitaly Zdanevich
10

vous pouvez obtenir une belle quickfixfenêtre avec les correspondances de votre modèle de recherche actuel

:vim // %
:copen

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

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

:bufdo vimgrepadd // %
:copen
user1859022
la source
10

L'utilisation :set hlsearchmettra en évidence toutes les correspondances en jaune, ce qui vous permettra de scanner facilement le fichier pour les correspondances. Ce n'est peut-être pas ce que vous voulez, après la recherche,: g // p vous donnera les correspondances répertoriées

Kevin
la source
2
Doit être «: set hlsearch» et non «: hlsearch».
trop de php le
Il est également utile de cartographier :nohlpour effacer les points forts lorsque vous n'en avez plus besoin.
Kos
9

Pour élaborer là-dessus ... au lieu de

/example
:g//p

vous pouvez aussi écrire directement

:g/example/p

ou, comme p (rint) est l'action par défaut de la commande: g (lobal), cela peut être raccourci à

:g/example

Et au lieu de p (rint), d'autres actions sont possibles, par exemple d (elete). Voir: help: global

user55400
la source
6
g/pattern

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

Si ce n'est pas le cas :set number, alors

g/pattern/#

affichera les numéros de ligne.

Sagar Jain
la source
0

J'ai écrit un morceau de code pour cela. Cela évite en fait les problèmes 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 de localisation 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>
user2679290
la source
-1

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

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Pêcheur
la source