2011-02-01 7 views
8

Soy un Vimmer de mucho tiempo. Sin embargo, sigo cambiando a shell para realizar búsquedas. Esto me evita usar la funcionalidad quickfix.¿Hay alguna forma de configurar la opción Vim grepprg para evitar esperar hasta que la herramienta externa haya terminado de buscar?

La razón principal para cambiar a shell es que cuando uso grep desde dentro de Vim (con :grep), no puedo seguir el progreso.

Como la base de código que busco suele ser amplia, realmente aprecio los comentarios inmediatos.

Me da la oportunidad de descubrir que mi expresión de búsqueda es incorrecta antes de que se muestren los resultados completos.

Esto me permite cancelar la búsqueda, refinar la expresión y luego reiniciar la búsqueda.

Cualquier sugerencia de cómo reproducir este patrón dentro de Vim sería apreciada.

+0

saber si se puede o bien hacer vimgrep realmente más rápido utilizando noa y limita el número de búsquedas especificando un número? – mb14

+0

Ya no es un problema para mí: ahora estoy en MacOSX Yosemite y Vim 7.4. No tengo idea de cuándo/qué fue lo que lo solucionó. –

Respuesta

1

No veo el mismo comportamiento vim que tú. Cuando ejecuto :grep, aún veo los resultados en vim (no en la corrección) antes de que se complete la búsqueda (pero no puedo hacer nada hasta que se complete la búsqueda).

Incluso he intentado utilizar ninguna configuración de vim o plugins:

gvim -u NONE -U NONE 

Si eso no es su comportamiento, compruebe su grepprg. El mío es el valor por defecto:

:verbose set grepprg 
grepprg=grep -n $* /dev/null 

cuando uso corro grep -e "score" -R /etc veo esta salida en vim:

:!grep -n -e "score" -R /etc /dev/null 2>&1| tee /tmp/voLcaNS/232 

Es posible que el sistema no se encuentra tee o su vim no lo usa (Estoy usando Vim 7.2 en Ubuntu 10.10). tee toma el texto que se le pasa y lo escribe en un archivo y en stdout.


Si usted está buscando una manera de tener la quickfix recibir información actualizada con los resultados de búsqueda y tienen vim no bloquear mientras estás buscando, entonces se podría escribir un script que:

  • búsquedas con grep como un proceso en segundo plano y vuelve a dirigir a un archivo
  • cada segundo hasta que se completa grep, han vim cargar el archivo en quickfix (cgetfile) (se puede decir vim para hacer algo de otro proceso con --remote-expr)

Puede probar mi AsyncCommand plugin para comenzar su código. Hace lo anterior, excepto que solo carga el archivo cuando se completa la búsqueda.

1

¿Está familiarizado con ack.vim en absoluto? No utiliza la ventana quickfix, pero usa un buffer separado en una división. Sin embargo, es bastante más rápido que los resultados vuelvan al marco vim.

+2

Ack es solo más rápido que grep porque omite algunos archivos (por ejemplo, binarios) y directorios (por ejemplo, .git) de forma predeterminada. Grep es igual de rápido (en realidad más rápido) si lo configura para omitir las mismas cosas. Personalmente puse 'grp' en mi camino, que dice: grep -rI --color --exclude-dir = \. Bzr --exclude-dir = \. Git --exclude-dir = \. Hg --exclude -dir = \. svn --exclude-dir = compilación --exclude-dir = dist --exclude = tags $ * –

0

Eche un vistazo a :vimgrep en la documentación en línea. Muestra el nombre de archivo que se busca y actualiza a medida que avanza.

+0

Solo sabes que está haciendo algo, no sabes si está buscando coincidencias. ('vimgrep/gibberishdlgshjkls/g/etc/**/*' todavía devuelve nombres de archivos) – idbrii

0

Esto puede deberse a un almacenamiento en memoria intermedia entre grep y tee, no vim en sí. Para probar esta teoría, ejecute grep desde la línea de comando y canalice la salida a través de tee (es decir, grep <pattern> <files> | tee temp.out). Si se comporta igual que observa dentro de vim, entonces se está produciendo el almacenamiento en búfer.

Para solucionar el problema, instale expect (sudo apt-get install expect-dev en Ubuntu 10.10) y grepprg en unbuffer grep -n $* /dev/null. (Ver Turn off buffering in pipe).

0

Hay tres formas de realizar una búsqueda en proyectos completos.

  • Sistema de comando grep (rápido, pero no funciona bien con la lista Ouickfix)

    =>$ grep -n Example * 
    
  • grep interna Vim (lento, pero tienen un fuerte apoyo patrón)

    :vim[grep] /{pattern}/[g][j] {file} ... 
    
  • Complemento del sistema ack (perfecto)

    1 instalar ack

    brew install ack 
    

    2 añadir a continuación configuraciones a su .vimrc

    :set grepprg=ack\ --nongroup\ --column\ $* 
    
    :set grepformat=%f:%l:%c:%m 
    

    3, puede utilizar grep para llamar ACK en vim como

    :grep "object\." app/**/*.rb 
    
Cuestiones relacionadas