Come puoi elencare le corrispondenze della ricerca di Vim?


101

Vorrei elencare le corrispondenze, quando premo:

/example

in modo da vedere dove sono tutte le partite contemporaneamente.

Risposte:


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
Mi piacciono molto le tue idee F5-F8. Sarebbe bello avere qui alcune visualizzazioni / output di questi comandi. Come è progettato per funzionare F8? Cerca solo la directory corrente? - - L'omissione di una directory è un'usanza - - perché node_modules? - - In che modo le espressioni regolari Perl cambiano il funzionamento predefinito di Vim? - - Ecco come ho progettato la mia ricerca di file .tex askubuntu.com/a/789769/25388 Sarebbe bello imparare da te come migliorarla. Non è così intuitivo, quindi ho dimenticato spesso anche la logica.
Léo Léopold Hertz 준영

node_modules è la directory contenente molto codice js dai moduli npm se dovessi sviluppare front-end ... è solo un esempio ...
Yordan Georgiev

1
fai un backup del tuo .vimrc e aggiungi quelle impostazioni, caricale con: so% e poi prova a eseguire "aiuta" nei comandi ... vim è difficile - dovresti ripetere quelle migliaia di volte, ma una volta padroneggiarli, riderai @tutti coloro che indicano le loro nuove funzionalità IDE UI ...
Yordan Georgiev

226
:g//p

Nella sua forma più lunga:

:global/regular-expression/print

Puoi omettere il pattern / regex e Vim riutilizzerà il termine di ricerca precedente.

Curiosità: lo strumento grep prende il nome da questa sequenza di comandi.


18
:g//- poiché p (rint) è l'azione predefinita, puoi anche tralasciarla.
dekeguard

6
:g/è ancora più breve!
Sparhawk

2
È possibile vedere il contesto qui, come in grep --context 9?
Vitaly Zdanevich

@VitalyZdanevich Try :%s/regular-expression//gn It produrrà qualcosa del genere:X matches on Y lines
Alexej Magura

@AlexejMagura Voglio dire - come vedere poche righe prima e dopo la stringa?
Vitaly Zdanevich

50

Puoi anche fare:

g/pattern/#

che stamperà il motivo desiderato e il numero della riga.


2
Ben fatto. Ma se i numeri di riga sono già abilitati, #non è necessario. Mostra i numeri di riga per impostazione predefinita
Pavan Manjunath

44

se vuoi dare un'occhiata a questo elenco e saltare velocemente tra le partite, considera l'utilizzo

:vimgrep example %

o

:grep example %

Questo popolerà la "lista degli errori" con tutte le corrispondenze in modo che tu possa usare :copenper elencarle tutte nel buffer di correzione rapida, premere Invio su una riga particolare per saltare a quella corrispondenza, o usare comandi come :cne :cpper andare avanti e indietro.

per una spiegazione approfondita, vedere la mia risposta a una domanda simile


Questo dà E499: Empty file name for '%' or '#', only works with ":p:h"su MacVim 8.1
Lincoln Bergeson

35

Ne ho appena imparato uno nuovo: il Location List!
Digita :lvim foo %per cercare foonel file corrente e inserisci tutte le corrispondenze che contengono foonell'elenco delle posizioni .
Digita :lopenper aprire l'elenco delle posizioni nella finestra di correzione rapida, che è completamente navigabile come al solito.
Usa :lnext/ :lpreviousper scorrere l'elenco (usa le mappature tpope / non danneggiate per la migliore esperienza)


2
Bel suggerimento! questo mi ha portato a fare questa mappatura che espande automaticamente la parola sotto il cursore e si apre in un colpo solo: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen

16

Un'altra possibilità è usare i comandi di ricerca di file include.

[I

Questo elencherà tutte le occorrenze della parola sotto il cursore. Potrebbe essere più del necessario, perché cercherà anche tutti i file inclusi nel file corrente.

Ma la cosa bella di questo comando è che la visualizzazione dei risultati della ricerca mostra anche un conteggio del numero di corrispondenze, oltre al numero di riga di ciascuna corrispondenza.

:help include-search

per vedere molte varianti.

Una nota su

:g//p

Questo può essere ridotto ulteriormente a

:g//

perché, come altri hanno detto, p (rint) è l'azione predefinita.


È possibile ottenere risultati dal [Icontesto, come su grep --context 9?
Vitaly Zdanevich

10

puoi ottenere una bella quickfixfinestra con le corrispondenze dal tuo modello di ricerca corrente

:vim // %
:copen

super utile se in precedenza hai creato un modello di ricerca complesso usando solo /pattern

Modifica : ho appena scoperto che funziona anche per tutti i buffer aperti

:bufdo vimgrepadd // %
:copen

10

Utilizzando :set hlsearchevidenzierà tutte le corrispondenze in giallo, consentendo di scansionare facilmente il file per le corrispondenze. Potrebbe non essere quello che vuoi però, dopo la ricerca: g // p ti darà le corrispondenze elencate


2
Dovrebbe essere ': set hlsearch' not ': hlsearch'.
troppo php

È utile anche mappare :nohlper cancellare i punti salienti quando non ne hai più bisogno.
Kos

9

Per approfondire questo ... invece di

/example
:g//p

puoi anche scrivere direttamente

:g/example/p

oppure, poiché p (rint) è l'azione predefinita per il comando: g (lobal), questo può essere abbreviato in

:g/example

E invece di p (rint), sono possibili altre azioni, ad esempio d (elete). Vedi: help: global


6
g/pattern

Se lo hai :set number, il comando sopra mostra anche i numeri di riga.

Se non l'hai fatto :set number, allora

g/pattern/#

visualizzerà i numeri di riga.


0

Ho scritto un pezzo di codice per questo. In realtà evita i problemi in vimgrep. Funziona anche con file senza nome. Ed è più facile da usare.

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

Quando lo chiami con uno schema, apre le finestre di posizione con tutte le corrispondenze.

Potrebbe essere un comando

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

Quindi tutto ciò che devi fare è digitare :Mat pattern

Uso anche la seguente mappatura per ottenere le corrispondenze della selezione visiva corrente.

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

-1

Ctrl-f per elencare tutti i risultati della ricerca:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.