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 ).