2011-01-12 15 views
39

Hay una buena función en Google Chrome cuando haces una búsqueda. Te dice el número de coincidencias que hay para la palabra clave que estás buscando. Sin embargo, en Vim no veo esa característica. Algunas personas sugirieron utilizar %s/pattern//gn o similar:Mostrar recuento de coincidencias en Vim

http://vim.wikia.com/wiki/Count_number_of_matches_of_a_pattern
Unable to count the number of matches in Vim

pero que es realmente bastante largo !! Estoy buscando el conteo cuando presiono '*', '%', o hago cualquier búsqueda usando '/' y '?'.

¿Alguna idea?

+0

Puede considerar preguntar esto en [superuser.com] (http://superuser.com). No votaré para cerrar, incluso si no está relacionado con el tema, simplemente porque este podría ser un foro apropiado para encontrar * vim * usuarios. –

+7

(Y SU no sería un buen foro ya que la respuesta requiere secuencias de comandos, ¡y por favor deje de dispersar a las personas que proporcionan respuestas avanzadas!) –

+4

Estoy completamente de acuerdo con Luc: en el faq de stackoverflow (http://stackoverflow.com/faq), dice que "si su pregunta generalmente cubre ... herramientas de software comúnmente utilizadas por los programadores ... ¡entonces está en el lugar correcto para hacer su pregunta!". Por lo tanto, esto definitivamente no está fuera de tema. – DrAl

Respuesta

24

Plugin index search.

La más nueva versión here.

+0

Esa parece ser la mejor respuesta. Lo intentaré y veré si funciona bien para marcar su respuesta como la respuesta aceptada. – Rafid

+1

Parece muy interesante. Solo tenga cuidado de que no provoque que otros complementos dejen de funcionar, ya que está redefiniendo algunas claves bastante fundamentales. – DrAl

+0

Ah, gracias por señalar eso. – Rafid

18

No sé de una manera directa de hacerlo, pero se puede hacer uso de la forma :%s/// utiliza la última búsqueda como el patrón por defecto:

:nmap ,c :%s///gn 

A continuación, debería ser capaz de hacer una buscar y luego presionar ,c para informar el número de coincidencias.

El único problema será que * y # ignoran 'smartcase', por lo que los resultados podrían estar fuera por unos pocos después de usar *. Puede solucionar esto haciendo * seguido por /ArribaENTER y luego ,c.

+2

Puede hacerlo de esta manera para manejar el caso '' smartcase'' apropiadamente: 'nnoremap, c:% s/ = & ignorecase? '\ c': '\ C' /// gn ' –

2

Como alternativa a lo que sugiere @Al puede asignar la combinación de teclas para escribir la mayor parte de la línea y luego mover el cursor a la posición donde se inserta el patrón real:

: nmap, c^[: % s /// gn^[OD^[OD^[OD^[OD

Donde '^ [' es Ctrl + V, Esc y '^ [OD' es Ctrl + V, Izquierda

Luego, al presionar ', c' pasará al modo comando, ingrese el patrón y deje el cursor sobre el segundo '/', listo para insertar el patrón.

12

Una adición a @ respuesta de Al: si usted quiere hacer vim mostrar de forma automática en el línea de estado, trate de añadir lo siguiente a la vimrc:

let s:prevcountcache=[[], 0] 
function! ShowCount() 
    let key=[@/, b:changedtick] 
    if s:prevcountcache[0]==#key 
     return s:prevcountcache[1] 
    endif 
    let s:prevcountcache[0]=key 
    let s:prevcountcache[1]=0 
    let pos=getpos('.') 
    try 
     redir => subscount 
     silent %s///gne 
     redir END 
     let result=matchstr(subscount, '\d\+') 
     let s:prevcountcache[1]=result 
     return result 
    finally 
     call setpos('.', pos) 
    endtry 
endfunction 
set ruler 
let &statusline='%{ShowCount()} %<%f %h%m%r%=%-14.(%l,%c%V%) %P' 
+0

+1: ¡Eso se ve bastante bien! – DrAl

+0

¿Podría solicitar la versión que incorpora ignorecase? : P –

3

Ya tiene una buena cantidad de respuestas, pero me parece que todavía hay un más acerca de este problema.

Esto es realmente algo con lo que tuve que lidiar hace unos días. Agregué una función y un mapeo de tal manera que se golpea la asignación cuando el cursor está debajo de la palabra que desea contar y devuelve el número de coincidencias.

La Función:

" Count number of occurances of a word 
function Count(word) 
    let count_word = "%s/" . a:word . "//gn" 
    execute count_word 
endfunction 

Y el mapeo:

" Count current word 
nmap <Leader>w <Esc>:call Count(expand("<cword>"))<CR> 
7

He aquí una solución barata ... Solía ​​buscar y reemplazar En Vim. Sin guiones sofisticados. Hice una búsqueda X y reemplazo todo con X. Al final, Vim informa "2134 sustituciones en 9892 líneas". X apareció 2134 veces. Uso: q! para salir del archivo sin guardarlo. Ningún daño hecho.

0
:vim[grep][!] /{pattern}/[g][j] {file} ... 

Vimgrep utiliza de Vim incorporada expresión regular motor de búsqueda, por lo que puede volver a utilizar los patrones de búsqueda estándar de comandos de Vim. Por lo tanto, primera prueba del patrón de búsqueda de la forma habitual usando:/{patrón}/

A continuación, introduzca la siguiente:

:vim /CTRL+r//g % 

donde CTRL+r/ se inserte el último patrón de búsqueda después de la primera barra inclinada. La línea de estado se mostrará (1 de máximo), donde max es la cantidad máxima de coincidencias para {pattern}. A continuación, utilice :cnext y :cprev para buscar las próximas & coincidencias anteriores y :cfirst y :clast para la primera y la última coincidencia. Estos 4 comandos se pueden reasignar para hacerlos más rápidos de ejecutar.

0

Este complemento hace precisamente eso. https://github.com/osyo-manga/vim-anzu

Al buscar una palabra en vim, se mostrará el conteo de palabras en la línea de estado. También tiene la opción de mostrar junto a la palabra buscada, es decir. this_is_my_sample_word (3/12), o this_is_my_sample_word (7/12). Esto básicamente dice: esta es la tercera o séptima ocurrencia de un total de 12 ocurrencias.

Cuestiones relacionadas