¿Hay alguna manera de 'canalizar' el texto de un registro a otro registro o conjunto de registros? Por ejemplo, pasar "q
a registros a "1
través "5
.
A menudo deseo crear versiones ligeramente diferentes de la misma macro, por lo que es útil poder copiar una macro 'plantilla' en varios registros y luego modificar cada una de ellas en su lugar.
Para dar un ejemplo práctico, aquí está el problema que provocó esta pregunta para mí.
Necesito convertir la siguiente línea de un lenguaje de descripción de hardware en muchos bloques repetidos,
RAM64(in=in, load=load0, address=address[0..5], out=out1);
a
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);
Tengo una macro que realiza esto, usando la función de incremento, yypW^At)^A
que almacené en el registro "a
.
A veces, necesito que el patrón de incremento sea ligeramente 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);
donde "b
estaría la macro en el registro yypW^At)^A^A
.
Quiero un registro para hacer esto, pero para cada incremento de 1-5. El registro "a
podría (de alguna manera) copiarse a los registros b a través de e. Luego pegaría cada registro en el búfer, realizaría la modificación requerida (agregaría más términos, cambiaría el carácter que sigue al t
movimiento, etc.) y tiraría la expresión modificada nuevamente al registro. Idealmente, este último paso podría incluso incluirse en los comandos para copiar los registros
Esto me evita repetir todos los caracteres de la macro que NO requieren cambios. Para mi ejemplo, puede ser trivial, pero puedo prever momentos en que podría ser muy útil hacer lo que le pido.
fuente
Respuestas:
Las macros son solo texto.
Abra un nuevo búfer vacío y coloque su macro allí. Puede duplicar las líneas, cambiar una cosa aquí y otra en otra parte, luego tirar de una línea y usarla de inmediato
@"
.No es necesario contaminar sus registros, especialmente los registros de números que tienen un propósito completamente diferente.
- editar -
Su pregunta es más fácil de entender ahora que agregó alguna explicación.
Como resultado, solo necesita cambiar su grabación inicial para lograr su objetivo, sin jugar con los registros como si fueran variables:
Para crear 5 copias de la línea actual con el último número incrementado en 2:
o 12 copias, con el último número incrementado en 23:
fuente
abcde
está en@q
, entonces yo quiero@x="bcdea"
,@y="abcde"
y@z="eabcd"
. Podría comenzar dejando@x
,@y
y@z
todos iguales@q
y luego modificándolos según sea necesario. Obviamente, acabo de inventar esto, pero parece que podría haber algunos casos en los que algo similar podría ser útil.Usando
getreg
ysetreg
Para copiar de
q
a los registros1
-5
:Para copiar a una lista más general:
Utilizando
execute
Para copiar de
q
a los registros1
-5
:Para copiar a una lista más general:
Explicación. El comando
let
se puede usar comolet @x=@y
, qué copias se registrany
para registrarsex
. Esencialmente, solo estamos construyendo estos comandos en un bucle (cambiando el valor dex
en la forma anterior) yexecute
usándolos.fuente
:exe
aquí. Las funcionesgetreg()
ysetreg()
serían más limpias.Para responder directamente a la pregunta, si desea copiar rápida y fácilmente el contenido de un registro a otro, puede poner lo siguiente en su .vimrc. Luego puede ejecutar
<leader>rcab
para copiar el contenido del registroa
para registrarseb
. Como ejemplo, elegí<leader>rc
representar 'copia de registro'fuente
getreg(sourceReg, 1)
.