Come ottenere e utilizzare il numero di ciascuna linea abbinata in un comando globale


8

Nel suo (ottimo) libro "Pratical Vim", Drew Neil mostra come raccogliere tutte le righe contenenti la parola "TODO" in un registro per usarle in seguito.

Per fare ciò usa semplicemente un comando globale: :g/TODO/yank A(La maiuscola Aconsente di eseguire le linee al registro indicato a).

Penso che sia un trucco piuttosto interessante, ma devo migliorarlo: sto cercando di inserire il numero della riga prima che sia contenuto. Penso che la soluzione sarebbe quella di ottenere il numero di riga e usarlo nell'ultima parte del comando che ho menzionato prima. Il problema è che non so come ottenere questo numero di riga.

Quindi la mia domanda è: come in un comando globale posso ottenere il numero della linea abbinata e come posso usare questo numero?

Giusto per essere chiari qui è un esempio. Consideriamo questo file:

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  }

Quando scrivo :g/TODO/yank Ae inserisco il contenuto del registro in un file ottengo:

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

Quello che vorrei ottenere è:

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

Bonus lo yank include anche il rientro della linea, sarebbe piuttosto bello se potessi rimuoverlo direttamente dal comando globale.

Risposte:


7

Un modo per farlo:

  1. cancella il registro:

    :let @a=''
    
  2. aggiungi i risultati della ricerca:

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

Ri: BONUS rimuove il rientro nel comando globale:

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

1
Grazie è esattamente quello che stavo cercando! Non conoscevo i comandi getpos()e getline(). Anche quando hai risposto alla domanda bonus ti meriti un biscotto danzante ;)
statox

Un biscotto, yay :)
VanLaser

1
@statox Bookmark questo: :help function-list. È un riferimento molto utile. Inoltre, +1 per la menzione di "Pratica Vim". :)
lcd047

@ lcd047: Wow grazie !! Vorrei sapere questa voce di aiuto prima, è così bello avere questo elenco qui. La documentazione di Vim è davvero incredibile! Inoltre, sono abbastanza nuovo per Vim e "Practical Vim" è la mia Bibbia al momento :)
statox

@Laser anche un modo più rapido per svuotare il aregistro in modalità normale è quello di registrare una macro vuota con qaqforse è meno elegante della tua soluzione ma funziona;) Inoltre la tua soluzione può essere utilizzata in un vimscript mentre non penso che sia possibile con il mio.
statox
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.