2009-02-11 9 views
5

Mi problema es simple. Busco un patrón específico en un archivo (digamos etiqueta en un archivo de Tex)redirección a un archivo de una búsqueda en Vim

:g/label/# 

pero hay un montón de ocurrencias. Así que me gustaría redirigir esta salida a otro archivo para poder trabajar fácilmente con él.

¿Tiene un truco o un comando que no sé?

+0

¿cuál es el significado de # aquí? –

+0

@Aman Jain: uso # para mostrar el número de línea. –

Respuesta

3

Lo que está haciendo es esencialmente 'grep -n label file' desde la línea de comandos. Entonces puede ejecutar ese comando y> en un archivo con la suficiente facilidad.

La derivación de 'grep' es incluso básicamente de la misma fuente.

+0

Gracias por su ayuda. Tu solución funciona perfectamente, por supuesto. Fue tan simple que no lo encontré. –

2

He conseguido este de la red en algún momento:

function GoToLine(mainbuffer) 
    let linenumber = expand("<cword>") 
    silent bd! 
    silent execute "buffer" a:mainbuffer 
    silent execute ":"linenumber 
    silent nunmap <Enter> 
endfunction 
command -nargs=1 GoToLine :call GoToLine(<f-args>) 

function GrepToBuffer(pattern) 
    let mainbuffer = bufnr("%") 
    silent %yank g 

    enew 
    silent put! g 
    execute "%!egrep -n" a:pattern "| cut -b1-80 | sed 's/:/ /'" 
    silent 1s/^/\="# Press Enter on a line to view it\n"/ 
    silent :2 

    silent execute "nmap <Enter> 0:silent GoToLine" mainbuffer "<Enter>" 
    " silent nmap <C-G> <C-O>:bd!<Enter> 
endfunction 
command -nargs=+ Grep :call GrepToBuffer(<q-args>) 

ponerlo en su .vimrc, entonces: Grep Foo

Requiere programa grep externa para que funcione correctamente.

+0

No veo cómo esto es diferente de solo "/ patrón n " –

+0

Lo siento, fue un poco rápido para responder. Redid mi respuesta. Espero eso ayude. – tommym

+0

Gracias. Creo que esto me ayudará. Es incluso mejor de lo que pedí. –

0

(Sólo una idea - no probado.)

Puede eliminar todas las líneas con su patrón en ella, escribir en otro archivo, y deshacer la eliminación.

:g/label/d 
:w matches 
u 
4
:redir > matches.txt|execute 'g/foo/#'|redir END 

Ver :h :redir, también puede redirigir a los registros, variables, el portapapeles, etc.

11

no está claro a partir de la publicación original lo que entendemos por "trabajar fácilmente con ella", pero es a menudo útil para ver y saltar rápidamente entre todas las coincidencias en un búfer sin "extraer" las coincidencias en un búfer separado.

vim tiene un grep interna incorporada. Tu ejemplo sería algo como esto (en vim, % denota el archivo actual)

:vimgrep /label/ % 

Esto le llevará a la primera ocurrencia e informar cuántas coincidencias existen fueron. Lo bueno es que se puede ver en todos los partidos mencionados mediante la apertura de la lista de errores quickfix usando

:cope 

Ahora sólo puede desplazarse alrededor y pulse enter en una línea para saltar a la posición exacta del partido.

La lista de errores de quickfix es exactamente el mismo búfer que usa si ejecuta make desde dentro de vim y su compilador arroja errores: le da una lista de qué y dónde están los errores.

Después de que haya saltado a una ubicación señalada por quickfix, puede ir hacia adelante y hacia atrás en la lista a través de :cn y :cp. :ccl cierra la lista de errores.

También puede ampliar su lista de "error" a través de :vimgrepa /newpattern/ % o :vimgrepadd

El (documentado) advertencia es grep interna que vim es más lento que la mayoría de las implementaciones grep nativos (pero te dan es "gratis" en las ventanas , por ejemplo). Si tiene un grep instalado, puede usar: grep en lugar de: vimgrep para obtener resultados similares.

citando :help grep

Vim tiene dos maneras de encontrar coincidencias para un patrón : interna y externa. La ventaja de del grep interno es que funciona en todos los sistemas y usa los potentes patrones de búsqueda de Vim. Se puede usar un programa grep externo cuando Vim grep no hace lo que desea.

El método interno será más lento, porque los archivos se leen en la memoria. Las ventajas son: - Los separadores de línea y la codificación se reconocen automáticamente, como si se estuviera editando un archivo . - Usa los patrones de búsqueda de Vim. Se pueden usar patrones de varias líneas. - Cuando los complementos están habilitados: se pueden buscar archivos comprimidos y remotos.

También puede utilizar la lista de ubicaciones si ya está utilizando la lista de errores para resolver los errores de compilación. sólo tiene que añadir l (por location) al principio del comando grep (:lvimgrep, :lvimgrepa:lgrep, :lgrepa) y utilizar :lopen:ln:lp:lcl en lugar de los :c* queridos.

Para consultar más comandos

:help grep 
:help quickfix-window 
:help quickfix 
:help quickfix-error-lists 
+0

Gracias por su respuesta. Estos comandos también me ayudaron a hacer lo que yo quería y aprendí algo nuevo. Bueno, mi problema era que había usado la misma etiqueta en un archivo tex, así que necesitaba encontrar sus ocurrencias extra fácilmente, lo cual es más fácil en un archivo donde podría ponerlas todas. –

+0

La mejor respuesta. –

Cuestiones relacionadas