Eu gostaria de executar uma macro em cada linha de uma seleção, em vez de totalizar o número de linhas na minha cabeça. Por exemplo, posso escrever uma macro para transformar:
Last, First
Para dentro
First Last
e gostaria que fosse executado em todas estas linhas:
Stewart, John
Pumpkin, Freddy
Mai, Stefan
...
Alguma ideia dos gurus do Vim?
EDITAR: Este é apenas um exemplo, obviamente, é trivialmente regexável, mas há outras instâncias que aparecem que não são tão fáceis que eu prefiro usar macros.
Respostas:
Suponha que você tenha uma macro
q
que foi executada (e permaneceu) em uma única linha. Então, você pode executá-lo em cada linha de sua seleção com:(se você já tiver um grupo de linhas selecionado, acertando
:
produz:'<,'>
na linha de comando)Por exemplo, a macro a seguir coloca todas as palavras em maiúscula, exceto a primeira em uma linha:
Então, executando-o no seguinte (onde as
+
linhas são selecionadas)Com o
normal @q
comando acima , produz:fonte
:'<,'>normal! @q
@q
. De:help normal
- "Se [!] For fornecido, os mapeamentos não serão usados."@
em modo visual como este:vnoremap @ :normal @
. Dessa forma, você ainda pode fazer@a
o que esperava (embora tenha que pressionar enter depois :()Selecione as linhas e pressione
:
para entrar no modo de comando. O Vim irá preencher automaticamente'<,'>
, o que restringe o intervalo às linhas selecionadas. Para seu exemplo, você pode usar o:s
comando para fazer a troca:Isso trocará duas palavras separadas por vírgula em cada linha na seleção visual.
Você também pode usar
'<
e'>
como qualquer outro marcador ou posição de linha, por exemplo, como parte de um comando de movimento, portanto, no modo normal,d'<
o apagará da posição atual do cursor até o início da primeira linha na seleção visual. As marcas permanecem em vigor mesmo que o bloco não seja mais destacado visualmente.Se você deseja reproduzir uma macro gravada em cada linha, você precisa executar a macro com o
:normal
comando. Infelizmente, o:normal
comando não opera em um intervalo de linhas, mas você pode corrigir isso com o:global
comando. Isso executa um:ex
comando em cada linha que corresponde a um regex, então você pode fazer o seguinte:Explicação:
fonte
^
com.
fazer a macro rodar apenas em linhas que contenham algum texto, não é?Você pode adicionar a função abaixo ao seu
~/.vimrc
ou simplesmente copiá-la no seu navegador e rodar:@+
A vantagem é que você pode aplicar qualquer macro na seleção visual. Você precisa dar a letra da macro como argumento, como:
fonte