Como obter e usar o número de cada linha correspondente em um comando global

8

Em seu (muito bom) livro "Pratical Vim", Drew Neil mostra como coletar todas as linhas que contêm a palavra "TODO" em um registro para usá-las posteriormente.

Para fazer isso, ele simplesmente usa um comando global: :g/TODO/yank A(A capital Apermite que ocorram linhas no registro nomeado a).

Eu acho que é um truque bem legal, mas preciso melhorá-lo: estou tentando inserir o número da linha antes do conteúdo. Acho que a solução seria obter o número da linha e usá-lo na última parte do comando que mencionei antes. O problema é que não sei como obter esse número de linha.

Portanto, minha pergunta é: como em um comando global posso obter o número da linha correspondente e como posso usar esse número?

Só para ficar claro, aqui está um exemplo. Vamos considerar este arquivo:

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 digito :g/TODO/yank Ae coloco o conteúdo do registro em um arquivo, recebo:

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

O que eu gostaria de obter é:

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

Bonus o puxão também incluem o recuo da linha, seria muito legal se eu poderia removê-lo diretamente a partir do comando global.

statox
fonte

Respostas:

7

Uma maneira de fazer isso:

  1. limpe o registro:

    :let @a=''
    
  2. acrescente os resultados da pesquisa:

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

Re: BONUS remover recuo no comando global:

    :g/TODO/let @A = getpos('.')[1] . ' ' . substitute(getline('.'), '^\s*', '', '') . "\n"
VanLaser
fonte
1
Obrigado, é exatamente o que eu estava procurando! Eu não conhecia os comandos getpos()e getline(). Além disso, ao responder à pergunta do bônus, você merece um biscoito de dança ;)
statox
Um cookie, yay :)
VanLaser
1
@statox Bookmark esta: :help function-list. É uma referência muito útil. Além disso, +1 pela menção de "Practical Vim". :)
lcd047
@ lcd047: Uau, obrigado! Eu gostaria de conhecer essa entrada de ajuda antes, é muito bom ter essa lista aqui. A documentação do Vim é realmente incrível! Também yay Eu sou muito novo para o vim e "Vim Prático" é minha Bíblia no momento :)
statox
O @Laser também é uma maneira mais rápida de esvaziar o aregistro no modo normal: gravar uma macro vazia com qaqtalvez seja menos elegante que sua solução, mas funciona;) Também sua solução pode ser usada em um vimscript, embora eu não ache possível meu.
Statox