Cómo obtener y usar el número de cada línea coincidente en un comando global


8

En su (muy bueno) libro "Pratical Vim", Drew Neil muestra cómo recopilar todas las líneas que contienen la palabra "TODO" en un registro para usarlas posteriormente.

Para hacerlo, simplemente usa un comando global: :g/TODO/yank A(La mayúscula Apermite pasar líneas al registro nombrado a).

Creo que es un truco genial, pero necesito mejorarlo: estoy tratando de insertar el número de la línea antes de que sea contenido. Creo que la solución sería obtener el número de línea y usarlo en la última parte del comando que mencioné antes. El problema es que no sé cómo obtener este número de línea.

Entonces mi pregunta es: ¿cómo puedo obtener el número de la línea coincidente en un comando global y cómo puedo usar este número?

Solo para que quede claro aquí es un ejemplo. Consideremos este archivo:

1  //TODO: Hey this is a todo
2  int main(void){
3      //TODO: and this is another one
4      printf("Hello world");
5
6      return 0;
7  }

Cuando escribo :g/TODO/yank Ay pongo el contenido del registro en un archivo obtengo:

//TODO: Hey this is a todo
    //TODO: and this is another one

Lo que me gustaría obtener es:

1 //TODO: Hey this is a todo
3    //TODO: and this is another one

Bonificación del tirón también incluyen el sangrado de la línea, sería muy bien si pudiera retirarlo directamente desde el comando global.

Respuestas:


7

Una forma de hacerlo:

  1. borrar el registro:

    :let @a=''
    
  2. agregar resultados de búsqueda en él:

    :g/TODO/let @A = getpos('.')[1] . ' ' . getline('.') . "\n"
    

Re: BONO eliminar sangría en el comando global:

    :g/TODO/let @A = getpos('.')[1] . ' ' . substitute(getline('.'), '^\s*', '', '') . "\n"

1
¡Gracias, eso es exactamente lo que estaba buscando! No conocía los comandos getpos()y getline(). Además, a medida que respondió la pregunta adicional, se merece una galleta de baile ;)
statox

A cookie, yay :)
VanLaser

1
Marca esta @statox: :help function-list. Es una referencia muy útil. Además, +1 por la mención de "Practical Vim". :)
lcd047

@ lcd047: ¡Guau, gracias! Desearía conocer esta entrada de ayuda antes, es bueno tener esta lista aquí. ¡La documentación de Vim es realmente increíble! También sí, soy bastante nuevo en vim y "Practical Vim" es mi Biblia en este momento :)
statox

@Laser también una forma más rápida de vaciar el aregistro en modo normal es grabar una macro vacía con qaqtal vez que sea menos elegante que su solución, pero funciona;) También su solución se puede usar en un vimscript, mientras que no creo que sea posible con mía.
statox
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.