Como posso gravar uma macro aninhada?

11

Eu quero gravar uma macro dentro de uma macro, assim:

qa
    [ first macro ... ]
    qb
        [ second macro ... ]
    q
    [ some more stuff, involving @b ... ]
q

No entanto, o segundo qé interpretado como uma solicitação para interromper a primeira macro e o restante é interpretado como comandos.

Existe alguma maneira de começar a gravar uma segunda macro em uma macro?

Caso contrário, existe outra maneira de obter o efeito desejado de repetir uma certa sequência de pressionamentos de tecla, enquanto já estiver dentro de uma macro?

Maçaneta
fonte
1
Você não pode primeiro gravar a macro be depois gravar a achamada de macro @b?
statox
@statox O problema é que isso btem efeitos destrutivos, então não posso gravá-lo primeiro (a menos que queira gravá-lo, pressione uvárias vezes e depois comece a gravar a).
Doorknob
1
Eu acho que é a sua melhor solução. Observe que você também pode gravá-lo em outro buffer ( enew, gravação bd) ou editar diretamente o bregistro, escrevendo em seu arquivo o conteúdo da sua macro e, em seguida, "gravando", colocando os caracteres no registro com "by.
statox

Respostas:

10

AFAIK, você não pode gravar duas macros de qx...quma só vez. Para sua exigência, você deve criar macro baté qb....qentão qa...@bq.

Se você não quer "record" bque você pode fazer let @b='whatever', em seguida, @birá reproduzir a macro. Por exemplo, let @b='ggdG'defina uma macro bpara remover todo o conteúdo do seu buffer atual sem "gravar".

Existe um truque de definição de macro, que pode não ser relevante para sua pergunta. É uma macro recursiva, não uma macro aninhada. Ou seja, você pode fazer:

qa..whatever..@aq

isso repetirá a macro recursivamente a. Às vezes, é útil quando não sabemos quantas vezes queremos reproduzir a macro. Porque quando ocorre um erro, a reprodução da macro para automaticamente. Isso salva, 999@apor exemplo.

Kent
fonte
1

Gravar as teclas digitadas na macro @a é o mesmo que puxar o texto correspondente a essas teclas para registrar a. Depois que algo é armazenado em um registro, você pode colocá-lo ou reproduzi-lo como uma macro / pressionamento de teclas. Assim, você pode começar a gravar uma macro em @a via e qa, enquanto a macro estiver gravando, puxe algum texto para registrar b, talvez usando algo como "bye. Tudo o que faz é puxar o texto para um registro diferente do que seria se você não especificasse o registro b. Agora que o registro b possui algum texto, você pode reproduzir esse texto como toque nas teclas pressionando @b. Você pode fazer isso enquanto a macro @a ainda estiver sendo gravada. É metamacrólico!

A principal desvantagem disso é que provavelmente seria mais fácil escrever alguma função vimscript que faça o que você deseja e, talvez, chamá-la durante uma gravação de macro. A beleza das macros é que você pode ver o efeito do que está gravando enquanto o grava, mas essa técnica de gravação de meta macro tira isso um pouco.

still_dreaming_1
fonte