¿Cómo puede enumerar las coincidencias de la búsqueda de Vim?

101

Me gustaría enumerar las coincidencias, cuando presiono:

/example

para ver dónde están todas las coincidencias a la vez.

Léo Léopold Hertz 준영
fuente

Respuestas:

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
fuente
1
Me gustan mucho tus ideas F5-F8. Sería bueno tener aquí algunas visualizaciones / salidas de esos comandos. ¿Cómo está diseñado para funcionar F8? ¿Busca solo en el directorio actual? - - La omisión de un directorio es una costumbre - - ¿ node_modulesPor qué ? - - ¿Cómo las expresiones regulares de perl cambian el funcionamiento predeterminado de Vim? - - Lo siguiente es cómo he diseñado mi búsqueda de archivos .tex askubuntu.com/a/789769/25388 Sería bueno aprender de usted cómo mejorarla. No es tan intuitivo, así que también me olvidé de la lógica a menudo.
Léo Léopold Hertz 준영
node_modules es el directorio que contiene una gran cantidad de código js de los módulos npm si desarrollara front-end ... es solo un ejemplo ...
Yordan Georgiev
1
haga una copia de seguridad de su .vimrc y agregue esas configuraciones, cárguelas con: entonces% y luego intente ejecutar las "ayudas" en los comandos ... vim es difícil - tendría que repetir esas miles de veces, pero una vez que domínalos te reirás @todos los que señalen sus nuevas y geniales características de UI IDE ...
Yordan Georgiev
226
:g//p

En su forma más larga:

:global/regular-expression/print

Puede omitir el patrón / expresión regular y Vim reutilizará el término de búsqueda anterior.

Trivia: la herramienta grep recibió el nombre de esta secuencia de comandos.

demasiado php
fuente
18
:g//- dado que p (rint) es la acción predeterminada, también puede omitirla.
dekeguard
6
:g/es aún más corto!
Sparhawk
2
¿Es posible ver el contexto aquí, como en grep --context 9?
Vitaly Zdanevich
@VitalyZdanevich Try :%s/regular-expression//gn It producirá algo como esto:X matches on Y lines
Alexej Magura
@AlexejMagura Quiero decir, ¿cómo ver algunas líneas antes y después de la cadena?
Vitaly Zdanevich
50

También puedes hacer una:

g/pattern/#

que imprimirá el patrón que desea y el número de la línea.

Tauro Olson
fuente
2
Buena esa. Pero si ya tiene habilitados los números de línea, entonces #no es necesario. Muestra los números de línea por defecto
Pavan Manjunath
44

si desea ver esta lista y saltar rápidamente entre las coincidencias, considere usar

:vimgrep example %

o

:grep example %

Esto llenará la "lista de errores" con todas las coincidencias para que pueda usar :copenpara listarlas todas en el búfer de corrección rápida, presione enter en una línea en particular para saltar a esa coincidencia, o use comandos como :cny :cppara ir y venir.

para una explicación detallada, vea mi respuesta a una pregunta similar

Paul Ivanov
fuente
Esto da E499: Empty file name for '%' or '#', only works with ":p:h"en MacVim 8.1
Lincoln Bergeson
35

Acabo de aprender uno nuevo: el Location List!
Escriba :lvim foo %para buscar fooen el archivo actual e ingrese todas las coincidencias que contengan fooen la lista de ubicaciones .
Escriba :lopenpara abrir la lista de ubicaciones en la ventana de corrección rápida, que es totalmente navegable como de costumbre.
Use :lnext/ :lpreviousto para recorrer la lista (use tpope / mappings unimpaired para la mejor experiencia)

freeo
fuente
2
Buen consejo! esto me llevó a hacer este mapeo que expande automáticamente la palabra debajo del cursor y se abre en un barrido: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen
16

Otra posibilidad es utilizar los comandos de búsqueda de archivos incluidos.

[I

Esto mostrará una lista de todas las apariciones de la palabra debajo del cursor. Sin embargo, puede ser más de lo que necesita, porque también buscará cualquier archivo que esté incluido en el archivo actual.

Pero lo bueno de este comando es que la pantalla de resultados de la búsqueda también muestra un recuento del número de coincidencias, además del número de línea de cada coincidencia.

:help include-search

para ver muchas variantes.

Una nota sobre

:g//p

Esto se puede reducir aún más a

:g//

porque, como han dicho otros, p (rint) es la acción predeterminada.

dekeguard
fuente
¿Es posible obtener resultados [Icon contexto, como en grep --context 9?
Vitaly Zdanevich
10

puede obtener una bonita quickfixventana con las coincidencias de su patrón de búsqueda actual

:vim // %
:copen

muy útil si anteriormente creó un patrón de búsqueda complejo utilizando solo /pattern

Editar : acabo de descubrir que esto también funciona para todos los búferes abiertos

:bufdo vimgrepadd // %
:copen
usuario1859022
fuente
10

El uso :set hlsearchresaltará todas las coincidencias en amarillo, lo que le permitirá escanear el archivo fácilmente en busca de coincidencias. Sin embargo, puede que eso no sea lo que desea, después de buscar,: g // p le dará las coincidencias enumeradas

Kevin
fuente
2
Debería ser ': set hlsearch' not ': hlsearch'.
demasiado php
También es útil mapear :nohlpara borrar los aspectos más destacados cuando ya no los necesite.
Kos
9

Para desarrollar esto ... en lugar de

/example
:g//p

también puedes escribir directamente

:g/example/p

o, como p (rint) es la acción predeterminada para el comando: g (lobal), esto se puede abreviar a

:g/example

Y en lugar de p (rint), son posibles otras acciones, por ejemplo, d (elete). Ver: ayuda: global

usuario55400
fuente
6
g/pattern

Si es así :set number, el comando anterior también muestra números de línea.

Si no lo ha hecho :set number, entonces

g/pattern/#

mostrará los números de línea.

Sagar Jain
fuente
0

He escrito un fragmento de código para esto. De hecho, evita los problemas en vimgrep. Funciona incluso con archivos sin nombre. Y es más fácil de usar.

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

Cuando lo llama con un patrón, abre las ventanas de ubicación con todas las coincidencias.

Esto podría ser un comando

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

Así que todo lo que necesitas hacer es escribir :Mat pattern

También utilizo el siguiente mapeo para obtener las coincidencias de la selección visual actual.

vnoremap Y "xy:call Matches(@x)<CR>
usuario2679290
fuente
-1

Ctrl-f para listar todos los resultados de la búsqueda:

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