Existe-t-il un moyen de «diriger» du texte d'un registre vers un autre registre ou ensemble de registres? Par exemple, passez "q
aux registres "1
via "5
.
Je souhaite souvent créer des versions légèrement différentes de la même macro, il est donc utile de pouvoir copier une macro «modèle» dans plusieurs registres, puis de modifier chacun d'eux en place.
Pour donner un exemple pratique, voici le problème qui a suscité cette question pour moi.
J'ai besoin de transformer la ligne suivante d'un langage de description matérielle en plusieurs blocs répétés,
RAM64(in=in, load=load0, address=address[0..5], out=out1);
à
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);
J'ai une macro qui effectue cela, en utilisant la fonction d'incrémentation, yypW^At)^A
que j'ai stockée dans le registre "a
.
Parfois, j'ai besoin que le modèle d'incrémentation soit légèrement différent, tel que
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);
où la macro en registre "b
serait yypW^At)^A^A
.
Je veux un registre pour ce faire, mais pour chaque incrément de 1 à 5. Le registre "a
pourrait (d'une manière ou d'une autre) être copié dans les registres b à e. Ensuite, je collais chaque registre dans la mémoire tampon, apportais la modification requise (ajoutais de termes, changeais le caractère qui suit le t
mouvement, etc.) et retirais l'expression modifiée dans le registre. Idéalement, cette dernière étape pourrait même être incluse dans la ou les commandes pour copier les registres
Cela m'évite de répéter tous les caractères de la macro qui ne nécessitent PAS de modification. Pour mon exemple, cela peut être trivial, mais je peux prévoir des moments où il pourrait être très utile de faire ce que je demande.
la source
Réponses:
Les macros ne sont que du texte.
Ouvrez un nouveau tampon vide et placez-y votre macro. Vous pouvez dupliquer les lignes, changer une chose ici et autre chose ailleurs, puis tirer une ligne et l'utiliser immédiatement avec
@"
.Pas besoin de polluer vos registres, en particulier les registres de numéros qui servent un but entièrement différent.
-- Éditer --
Votre question est plus facile à comprendre maintenant que vous avez ajouté quelques explications.
En fait, il vous suffit de modifier votre enregistrement initial pour atteindre votre objectif, sans jouer avec les registres comme s'il s'agissait de variables:
Pour créer 5 copies de la ligne en cours avec le dernier numéro incrémenté de 2:
ou 12 exemplaires, le dernier chiffre étant incrémenté de 23:
la source
abcde
est@q
, alors je veux@x="bcdea"
,@y="abcde"
et@z="eabcd"
. Je pourrais commencer par laisser@x
,@y
et@z
tous égaux@q
puis les modifier au besoin. Évidemment, je viens de l'inventer, mais il semble qu'il puisse y avoir des cas où quelque chose de similaire pourrait être utile.Utilisation de
getreg
etsetreg
Pour copier à partir
q
de registres1
-5
:Pour copier dans une liste plus générale:
En utilisant
execute
Pour copier à partir
q
de registres1
-5
:Pour copier dans une liste plus générale:
Explication. La commande
let
peut être utilisée en tantlet @x=@y
que copiey
pour s'inscrirex
. Essentiellement, nous construisons simplement ces commandes en boucle (en changeant la valeur dex
dans le formulaire ci-dessus) etexecute
en les ing.la source
:exe
ici. Les fonctionsgetreg()
etsetreg()
seraient plus propres.Pour répondre directement à la question, si vous souhaitez copier rapidement et facilement le contenu d'un registre dans un autre, vous pouvez mettre ce qui suit dans votre .vimrc. Vous pouvez ensuite exécuter
<leader>rcab
pour copier le contenu du registrea
pour vous inscrireb
. A titre d'exemple, j'ai choisi<leader>rc
de représenter «copie d'enregistrement»la source
getreg(sourceReg, 1)
.