Comment répéter certaines actions certaines fois sur Vim?

Dans Vim, je veux généralement répéter quelques séries de commandes à certaines reprises. Dites, je veux commenter 5 lignes, j'utiliserais

I//<Esc>j
.j.j.j.j

Est-il possible de répéter le dernier".j" partie plusieurs fois?

21
demandé sur Martín Fixman 2010-07-14 00:17:24

5 réponses

Une façon de le faire est d'assigner votre séquence de touches à une macro, puis exécutez la macro une fois suivie de la commande @@ run-last-macro. Par exemple:

qa.jq@a@@

Si vous savez combien de fois vous voulez répéter la macro, vous pouvez utiliser 4@@ ou autre.

32
répondu Greg Hewgill 2010-07-13 20:23:12

, Vous pouvez sélectionner visuellement les lignes que vous souhaitez répéter, tapez - :normal! . pour utiliser vim . sur chaque ligne. Parce que vous avez commencé avec une sélection visuelle, cela finit par ressembler à ceci:

:'<,'>normal! .

Cependant, si vous ajoutez et supprimez beaucoup de Commentaires //, vous trouverez peut-être les mappages suivants utiles:

" add // comment with K
noremap K :s,^\(//\)\=,//,e <BAR> nohls<CR>j
" remove // comment with CTRL+K
noremap <C-K> :s,^//,,e <BAR> nohls<CR>j

, Vous pouvez utiliser 5K commenter 5 lignes, vous pouvez utiliser le mode visuel pour sélectionner vos premières lignes, ou vous pouvez simplement marteau K jusqu'à ce que vous avez commenté tout ce que vous vouloir.

13
répondu too much php 2010-07-14 00:36:00

En ce qui concerne votre exemple spécifique, je préfère faire l'insertion de plusieurs lignes en utilisant le mode de bloc visuel (accessible avec Ctrl-v). Par exemple, si j'avais les lignes suivantes:

This should be a comment.
So should this.
This is definitely a comment.
Is this a comment? Yes.

Je voudrais aller au premier caractère en haut de la ligne supérieure, frapper Ctrl-v pour entrer en mode bloc visuel, naviguer jusqu'à la dernière ligne (peut-être en utilisant 3j pour descendre 3 lignes, peut-être en utilisant 4g pour aller directement à la 4ème ligne, ou peut-être simplement G pour aller à la fin), puis une fois:

// This should be a comment.
// So should this.
// This is definitely a comment.
// Is this a comment? Yes.

En outre, il y a un plugin commenter/un-commenter très pratique qui prend en charge de nombreuses langues ici. C'est plus facile que d'insérer/supprimer manuellement des commentaires.

8
répondu michaelmichael 2010-07-13 21:07:08

Pour votre exemple particulier. vous pouvez également utiliser une plage .,.5s#^#//# (pour ce faire et les 5 lignes suivantes) ou un bloc visuel (appuyez sur v, puis sélectionnez le texte que vous voulez) suivi de :%s#^#//#.

3
répondu daryn 2010-07-13 20:26:04

Une autre façon de le faire est de définir des marques et d'exécuter des substitutions sur cette plage:

ma
jjjj
mb
:'a,'bs,^,// ,
2
répondu Greg Bacon 2010-07-13 20:27:50