2009-05-21 7 views
5

Je n'ai pas activé python/ruby. Ma question: Je dois souvent écrire des choses comme ce qui suit:Comment puis-je obtenir une variable de compteur dans Vim sans python ou ruby?

%macro(200701);x gzip /home/test/200701.txt;run; 
%macro(200702);x gzip /home/test/200702.txt;run; 
%macro(200703);x gzip /home/test/200703.txt;run; 
%macro(200704);x gzip /home/test/200704.txt;run; 
%macro(200705);x gzip /home/test/200705.txt;run; 
%macro(200706);x gzip /home/test/200706.txt;run; 
%macro(200707);x gzip /home/test/200707.txt;run; 
%macro(200708);x gzip /home/test/200708.txt;run; 
%macro(200709);x gzip /home/test/200709.txt;run; 
%macro(200710);x gzip /home/test/200710.txt;run; 
%macro(200711);x gzip /home/test/200711.txt;run; 
%macro(200712);x gzip /home/test/200712.txt;run; 

%macro(200801);x gzip /home/test/200801.txt;run; 
%macro(200802);x gzip /home/test/200802.txt;run; 
%macro(200803);x gzip /home/test/200803.txt;run; 
%macro(200804);x gzip /home/test/200804.txt;run; 
%macro(200805);x gzip /home/test/200805.txt;run; 
%macro(200806);x gzip /home/test/200806.txt;run; 
%macro(200807);x gzip /home/test/200807.txt;run; 
%macro(200808);x gzip /home/test/200808.txt;run; 
%macro(200809);x gzip /home/test/200809.txt;run; 
%macro(200810);x gzip /home/test/200810.txt;run; 
%macro(200811);x gzip /home/test/200811.txt;run; 
%macro(200812);x gzip /home/test/200812.txt;run; 

Existe-t-il un moyen rapide de faire cela dans Vim?

Je habituellement taper:

%macro(200701);x gzip /home/test/200701.txt;run; 

puis utilisez les commandes suivantes:

yy11p10<up>13<right>r2<down>r3<down>r4<down>... 

En d'autres termes, je coller la ligne 11 fois plus, puis en utilisant la commande « remplacer le caractère » run à travers la liste des dates. Ensuite, je vais copier tout le bloc et dans le nouveau bloc de type

:s/2007/2008/<enter>12&11<up>12& 

de substituer 2007 pour 2008 dans le deuxième bloc. Vim est tellement puissant que je me dis qu'il doit y avoir un meilleur moyen de remplacer manuellement de 1 à 12 sur chacune des lignes.

Répondre

13

Ecris la première ligne:

%macro(200701);x gzip /home/test/200701.txt;run; 

Puis, tout en restant sur cette ligne, passez en mode de commande et enregistrer une macro une qui copie la ligne (yyp), incrémente le premier numéro (ctrl a, écrit ^A), se déplace d'un caractère vers la droite (l) et incrémente l'autre numéro:

qayyp^Al^Aq 

(Notez que le démarrage et l'arrêt de l'enregistrement de macro qui se passe avec 0 .) Maintenant jouer macro un 110 fois:

[email protected] 
+0

Les macros vim +1 peuvent être un peu effrayantes quand vous les entrez (en particulier en lisant le code macro d'autres personnes), mais c'est absolument incroyable la quantité de travail qu'elles peuvent économiser sur les tâches répétitives d'édition de texte. Je pense qu'il est préférable de simplement plonger et expérimenter, une fois que vous êtes à l'aise avec vim et que vous connaissez les commandes pour enregistrer et lire les macros. –

+0

Merci! C'était très efficace! – Dan

8

Il peut également être fait avec vim 7 fonctions:

:let t=map(range(200801,200815), '"macro(".v:val.");x gzip /home/test/".v:val.".txt;run;"') 
:put=t 
6

Si vous avez les utilitaires Unix/Linux à votre disposition il y a d'une manière qui est plus facile à retenir, au moins si vous êtes habitué à utiliser commandes de bloc:

(1) générons la séquence en utilisant seq (1)

:r!seq 200801 200812 

suivants permet également formatant comme ceci:

:r!seq -f "\%03.0f" 10 121 

Le signe pour cent doit être échappé.

(2) Double ce bloc avec les commandes de bloc Vim: Mark avec Cv, Yank, mettre

(3) Insérer (ou ajouter) le texte entre ces blocs: Mark avec CV, insérez avec I

Voir: aide blockwise-visual pour plus.

2

Voir aussi Vimtip#150.

Ceci explique comment marquer un bloc de texte et augmenter automatiquement les nombres dans le bloc marqué.

Questions connexes