Existe uma maneira de canalizar o texto de um registro para outro registro ou conjunto de registros? Por exemplo, vá "q
para registradores "1
através de "5
.
Muitas vezes, desejo criar versões ligeiramente diferentes da mesma macro, portanto, é útil poder copiar uma macro 'modelo' para vários registros e depois modificar cada um deles no lugar.
Para dar um exemplo prático, aqui está o problema que levou essa pergunta para mim.
Preciso transformar a seguinte linha de uma linguagem de descrição de hardware em muitos blocos repetidos,
RAM64(in=in, load=load0, address=address[0..5], out=out1);
para
RAM64(in=in, load=load1, address=address[0..5], out=out2);
RAM64(in=in, load=load2, address=address[0..5], out=out3);
RAM64(in=in, load=load3, address=address[0..5], out=out4);
RAM64(in=in, load=load4, address=address[0..5], out=out5);
Eu tenho uma macro que executa isso, usando a função de incremento, yypW^At)^A
que eu armazenei no registro "a
.
Às vezes, preciso que o padrão de incremento seja ligeiramente diferente, como
RAM512(in=in, load=load1, address=address[0..8], out=out2);
RAM512(in=in, load=load2, address=address[0..8], out=out4);
RAM512(in=in, load=load3, address=address[0..8], out=out6);
RAM512(in=in, load=load4, address=address[0..8], out=out8);
onde "b
estaria a macro no registro yypW^At)^A^A
.
Quero um registro para fazer isso, mas para cada incremento de 1 a 5. O registro "a
pode (de alguma forma) ser copiado nos registros b a e. Em seguida, colava cada registro no buffer, fazia a modificação necessária (adicionava mais termos, alterava o caractere que segue o t
movimento etc.) e puxava a expressão modificada de volta para o registro. Idealmente, esse último passo pode ser incluído no (s) comando (s) para copiar os registradores
Isso evita que eu repita todos os caracteres na macro que NÃO exigem alteração. Para meu exemplo, pode ser trivial, mas posso prever momentos em que pode ser muito útil fazer o que estou pedindo.
Respostas:
Macros são apenas texto.
Abra um novo buffer vazio e coloque sua macro lá. Você pode duplicar as linhas, alterar uma coisa aqui e outra em outro lugar, depois puxar uma linha e usá-la imediatamente
@"
.Não há necessidade de poluir seus registros, especialmente os registros numéricos que servem a um propósito totalmente diferente.
- editar -
Sua pergunta é mais fácil de entender agora que você adicionou alguma explicação.
Como se vê, você só precisa alterar sua gravação inicial para atingir seu objetivo, sem brincar com os registradores como se fossem variáveis:
Para criar 5 cópias da linha atual com o último número incrementado por 2:
ou 12 cópias, com o último número incrementado em 23:
fonte
abcde
está em@q
, então eu quero@x="bcdea"
,@y="abcde"
e@z="eabcd"
. Eu poderia começar por deixar@x
,@y
e@z
tudo igual@q
e, em seguida, modificá-los conforme necessário. Obviamente, acabei de inventar isso, mas parece que pode haver alguns casos em que algo semelhante pode ser útil.Usando
getreg
esetreg
Para copiar de
q
para registros1
-5
:Para copiar para uma lista mais geral:
Usando
execute
Para copiar de
q
para registros1
-5
:Para copiar para uma lista mais geral:
Explicação. O comando
let
pode ser usado comolet @x=@y
, que copia o registroy
para registrarx
. Basicamente, estamos apenas construindo esses comandos em um loop (alterando o valorx
no formulário acima) e osexecute
ingando.fonte
:exe
aqui. As funçõesgetreg()
esetreg()
seriam mais limpas.Para responder diretamente à pergunta, se você deseja copiar rápida e facilmente o conteúdo de um registro para outro, você pode colocar o seguinte em seu arquivo .vimrc. Você pode então executar
<leader>rcab
para copiar o conteúdo do registroa
para registrarb
. Como exemplo, eu escolhi<leader>rc
a opção "registrar cópia"fonte
getreg(sourceReg, 1)
.