Como usar o registro com CTRL-A ou CTRL-X no vim

1

Suponha que eu tenha um número no registro r .

Como eu poderia usar este valor com CTRL A e CTRL X

Veja um exemplo para esclarecer:

Suponha que eu tenha este arquivo de texto:

10
13
15

Eu quero aumentar esses números com o valor no registro r para obter (se ele contiver 5)

15
18
20

Por que estou perguntando isso? Porque eu quero usar CTRL A em uma macro, mas o número de vezes que eu preciso aplicar CTRL A é apenas conhecido em "tempo de execução".

De uma maneira mais geral, como eu poderia executar um comando um número de vezes armazenado em um registro?

Todas essas perguntas e respostas são interessantes, mas não respondem à minha pergunta: link
link

    
por Luc M 11.06.2012 / 23:02

1 resposta

4

Você poderia fazer um mapeamento como este:

noremap <Leader><C-A> :<C-U>execute 'normal!' str2nr(getreg('r')) . '<C-A>'<CR>

Ele mapeia \ Controle-A ( <Leader> assume como padrão \ , veja :help leader ) para executar o usual Control-A o número de vezes especificado no r register. Você poderia até usar isso para religar o Control-A padrão (deixe de fora <Leader> ), mas isso pode causar confusão mais tarde se você esquecer o mapeamento.

Quando o r register contém 5 , ele funciona assim (mudou para a notação de aspas duplas, já que é impossível representar Control-A em uma string com aspas simples):

As funções getreg() e str2nr() são avaliadas, resultando neste comando Ex:

:execute 'normal!' 5 . "\<C-A>"

Isso resulta em outro comando Ex:

:normal! "5\<C-A>"

Isso executa um comando de modo normal:

5Control-A

Que usa a contagem de prefixo antes do usual Control-A (não mapeado, devido a ! em :normal! ).

Esta versão usa sempre o valor no r register; ele explicitamente ignora qualquer contagem prefixada (ao contrário do usual Control-A ). Implementações alternativas são possíveis (por exemplo, quando uma contagem prefixada substitui ou multiplica o valor no registro r ), mas elas seriam um pouco mais complexas.

Você também pode colocar o comando diretamente na macro, em vez de usar um mapeamento:

qq…:execute 'normal!' str2nr(getreg('r')) . 'Control-A'Return

Você tem que digitar o atual Control-A e Retornar ao invés de seus <> equivalentes, porque isso não faz mais parte de um mapeamento onde o Vim fará automaticamente o tradução. Além disso, o Control-U é descartado, já que estava lá apenas para proteger contra uma possível contagem de prefixo antes do inicial : (você pode proteger contra isso no próprio conteúdo da macro ).

    
por 12.06.2012 / 08:15

Tags