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

Pregunta:

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

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

Creo que es un truco bastante bueno, pero necesito mejorarlo: estoy tratando de insertar el número de la línea antes de su 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 en un comando global puedo obtener el número de la línea coincidente y cómo puedo usar este número?

Para que quede claro, aquí hay 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 A y 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 conseguir es:

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

La bonificación del tirón también incluye la sangría de la línea, sería genial si pudiera eliminarla directamente del comando global.

Respuesta:

Una forma de hacerlo:

  1. limpiar el registro:

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

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

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

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

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım