2009-09-25 10 views
38

¿Cómo extraes todas las líneas que coinciden en un búfer?¿Cómo elimino todas las líneas coincidentes en un buffer?

dado un archivo como:

match 1 
skip 
skip 
match 2 
match 3 
skip 

Quiero ser cuestión de poder una orden de dar un tirón todas las líneas que coinciden con un patrón (/^partidos/para este ejemplo) en una sola memoria intermedia de modo que pueda poner en otro documento, o en un resumen o lo que sea.

El comando debe terminar con esto de una memoria intermedia:

match 1 
match 2 
match 3 

Mi primer pensamiento fue intentar:

:g/^match/y 

Pero acabo de llegar al último partido. Esto tiene sentido, porque el comando: g repite efectivamente el y para cada línea coincidente.

Quizás haya una manera de agregar un tirón al búfer, en lugar de sobreescribirlo. No pude encontrarlo

+1

He estado haciendo este tipo de cosas todo el día y encuentro que la solución es menos de lo que me gustaría. Hago 'qaq' seguido de': g/pattern/normal "AY' (no noté el comando: yank antes) luego voy a mi buffer y lo pego. ¿No hay una manera directa de redirigir directamente a un buffer? (Anteriormente había estado haciendo ': redir @ a'': g/pattern/'': redir END', así que este es ciertamente un paso en la dirección correcta, pero solo quiero uno, más ... paso ...) :-) Supongo que podría escribir una función con la suficiente facilidad ... –

+0

Ambas voté esta pregunta porque me resultó útil y voté para cerrarla porque esa es la única forma en que veo que dice "esto debería estar en superuser.com "Es una gran pregunta, pero creo que ese es el lugar correcto para ello. Lamento que un voto" cerrado "sea la única forma de votar para mudarnos. –

+0

@NathanLong, creo que esta pregunta es anterior al superusuario. Probablemente debería migrarse, aunque – daotoad

Respuesta

14
:help registers 
:help quote_alpha 

especificar una letra capital como el nombre de registro con el fin de añadir a ella, como :yank A.

67

:g/^match/yank A

Esto ejecuta el comando global de dar un tirón cualquier línea que coincide con ^match y ponerlo en el registro a. Como a está en mayúscula, en lugar de simplemente establecer el registro en el valor, se agregará a él. Dado que el comando global ejecuta el comando contra todas las líneas coincidentes, como resultado obtendrá todas las líneas anexadas entre sí.

Lo que esto significa es que probablemente desee restablecer el registro a una cadena vacía antes de comenzar: :let @a="".

Y, naturalmente, puede utilizar el mismo con cualquier registro con nombre.

+22

Lo que está implícito aquí es que uno no puede agregar al búfer sin nombre, al menos no en un solo comando. También es posible que necesite borrar primero el búfer: : let @ a = "" –

+8

Solo un consejo si optimiza para las pulsaciones de tecla. El registro de borrado puede hacerse más rápidamente, registrando macroqaq vacío. – slawek

+0

@ J.A.Faucett sin nombre * register *, no buffer. Además, puede hacerlo de alguna manera ([en función de esta respuesta] (http://stackoverflow.com/a/18536633/210945)): ':% g/regexp/let @" = @ ". Getline ('. ') '. Une las líneas juntas, aunque puede haber una forma de evitarlo. – naught101

7

Oh Me di cuenta después de comentar por encima de que es fácil dar un tirón a las líneas que coincidan en un buffer temporal ...

:r !grep "pattern" file.txt

Las soluciones más simples vienen una vez que se ha renunciado a la búsqueda de ellos. :)

+1

': call setreg ('a', system ('grep' pattern 'file.txt'))' o simplemente ': let @ a = system ('grep' pattern 'file.txt')' si lo desea un registro. – sabgenton

+2

Una solución más general puede usar 'expand ('%')' para el nombre de archivo del búfer en uso, p. Ej. ': let @ a = system (patrón" grep "" '.expand ('% ')) ' –

Cuestiones relacionadas