2 votes

Jusqu'à la lettre, puis effacer jusqu'à la lettre, et répéter.

D'après "vim pratique", j'ai compris qu'une bonne pratique consiste à essayer de bouger, d'agir, puis de répéter.

Disons que j'ai cette chaîne :

foo_bar fooo_bar foo abar foo_bar

Je voudrais aller de l'avant jusqu'à ce que je trouve un f et ensuite supprimer jusqu'à ce que je trouve un b et répétez.

J'aurais pensé que la méthode suivante fonctionnerait :

ff
dtb
;
.
;
.

ff serait l'ordre de bouger, et ensuite dtb celui qui doit agir.

Cependant, lorsque j'appuie sur ; il continue vers l'avant jusqu'à juste avant le prochain b tandis que je voudrais répéter ma commande "move", c'est-à-dire ff .

Y a-t-il un moyen de faire cela, de sorte que la commande "act" ne modifie pas le comportement de la commande "move" ?

6voto

romainl Points 55506

; répète le dernier fFtT qui, dans votre cas, est tb pas ff . Il n'y a aucun moyen de faire ; répéter quelque chose d'autre.

Voici des méthodes alternatives

  • Con :help / :

    ff
    d/b<CR>    " delete until next b
    ;
    .
    ;
    .

    Comme mentionné par @mattb, l'astuce consiste à utiliser un mouvement différent de celui de l'un ou l'autre des éléments suivants fFtT pour l'opération afin que votre ff est toujours le dernier mouvement répétable avec ; o , .

  • Con :help recording :

    qq         " start recording in register q
    ff
    dtb
    q          " stop recording
    @q         " play it back
    @q         " play it back

    L'astuce consiste à encapsuler le mouvement initial et l'opération dans une seule macro qui peut être répétée à l'infini sans faire appel à la fonction ; du tout.

3voto

mattb Points 938

Vous pourriez enregistrer une macro dans un registre et la rejouer. En utilisant le a registre :

qaffdtbq

cela se décompose en :

  • qa pour commencer à enregistrer la macro dans le a enregistrez
  • ffdtb sont les commandes que vous vouliez exécuter
  • q pour arrêter l'enregistrement

et ensuite, avec le curseur sur le premier caractère, exécuter la macro 4 fois avec 4@a pour changer cela :

foo_bar fooo_bar foo abar foo_bar

à ça :

foo_bar bar bar bar

ou simplement exécuter la macro une fois avec @a et puis appuyez sur @@ pour le répéter

1voto

Bob Qi Points 11

Peut-être que ce n'est pas ce dont vous avez besoin, mais vous pourriez faire la même chose en utilisant la fonction :s commandement.

:s/f[^ft]*t//g

0voto

buddemat Points 2030

Vous pouvez également rechercher le f con / puis passer à la suivante avec n :

Entrée :

foo_bar fooo_bar foo abar foo_bar

Actions :

/f<CR>
dtb
n
.
n
.

Résultat :

foo_bar bar bar bar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X