VIM: Tirar múltiples trozos de texto no continuos en un registro

0

Tengo algunas líneas de texto que siguen un patrón y otras que no. Me gustaría copiar las líneas que siguen este patrón y luego copiarlas / jalarlas en un registro para poder pegarlas como en cualquier otro lugar.

Ejemplo:

def function_1(param1,param2):
    // do something1
    // do something2
    // do something3
    return

def function_Nullify(param=None):
    // does nothing
    pass

Ahora básicamente me gustaría seleccionar las líneas que coincidan def.*$, copiarlos y pegarlos.

por lo que la salida sería algo así:

def function_1(param1,param2):
def function_Nullify(param=None):

Quiero saber si es posible hacer esto en vim.

Algo así como copiar las líneas de expresiones regulares en el registro "m. Entonces podré hacer un" mp donde más necesito esto.


Entiendo que algo como sed, awk o grep con algunos operadores de redirección podría ser más adecuado para esta tarea, pero me gustaría saber si puedo usar vim para hacer esto.

ffledgling
fuente
2
Si desea indexar su código, podría estar interesado en ctags o cscope .
romainl
No sabía acerca de estos ¡Gracias! ctags parece que va a ayudar mucho.
ffledgling
Downvoter al azar, por favor explique su alteaste downvote?
ffledgling

Respuestas:

3

Puedes usar "Myy (mayúscula M) para adjuntar en el registro m. Esto le permite escribir un comando global para jalar todas las líneas que coinciden def.*$ y tirar todas las líneas en el registro m. Entonces todo lo que tienes que hacer es pegar el registro m para obtener los contenidos. "mp

:g/def.*$/normal "Myy

El comando global anterior le indica que busque todas las líneas que coincidan con el patrón def.*$ y ejecuta el comando "Myy en modo normal

Sin embargo, esto tiene un problema. ¿Qué sucede si el registro m no está vacío cuando se inicia? Bueno, terminarás con lo que hayas puesto en el registro la última vez más todas las cosas que adjuntas.

Para vaciar el registro, puede utilizar para establecer el registro en la cadena vacía.

:let @m=''

Así que en vim escribirías

:let @m=''
:g/def.*$/normal "Myy

Tirar todo lo que coincida. def.*$ en el registro m.

FDinoff
fuente
5
Una alternativa más corta: :g/def.*$/y M.
romainl
¿Cómo hago para tirar una sub-pareja en particular? Digamos que solo quiero nombres de funciones y tengo el siguiente patrón que los coloca en \1: def\ \([^(]*\).*$. Como modificar el :g... orden de tirar \1 en lugar de la partida completa?
taketwo
@taketwo la submatch() La función parece que podría ayudarte en lo que estás tratando de hacer. Aunque no he podido usarlo correctamente todavía.
ffledgling
@romainl no sabía que pudieras usar y después de una g ... comando. ¡Gracias!
ffledgling
@taketwo, desafortunadamente no puede reutilizar los grupos de captura de :g mando. Lo que pides se puede hacer con una combinación de :global y una macro, sin embargo.
romainl