Dans Vim, comment insérer efficacement les mêmes caractères sur plusieurs lignes?

Parfois, je souhaite modifier un certain bloc de texte visuel sur plusieurs lignes.

Par exemple, je prendrais un texte qui ressemble à ceci:

name comment phone email 

Et fais comme ça

 vendor_name vendor_comment vendor_phone vendor_email 

Actuellement, je le ferais maintenant …

  1. Sélectionnez toutes les lignes de 4 lignes du bloc en appuyant sur V puis sur j 4 fois.
  2. Indent avec > .
  3. Retournez une lettre avec h .
  4. Allez bloquer le mode visuel avec ctrl v .
  5. Sélectionnez 4 lignes en appuyant 4 fois sur j . À ce stade, vous avez sélectionné un bloc visuel 4×1 (4 lignes, 1 cols).
  6. Appuyez sur c . Remarquez ceci à peu près en retrait à gauche d’une colonne.
  7. Tapez un " vendor_" sans le devis. Notez l’espace supplémentaire que nous avons dû remettre.
  8. Appuyez sur esc . C’est l’une des rares fois où j’utilise esc pour sortir du mode insertion. ctrl c ne modifie que la première ligne.
  9. Répétez l’étape 1.
  10. Retourner dans l’autre sens avec < .

Je n’ai pas besoin d’indenter s’il y a au moins une colonne d’espacement avant les mots. Je n’aurais pas besoin de l’espace si je n’avais pas à effacer le bloc visuel avec c .

Mais si je dois effacer, y a-t-il un moyen de faire ce que j’ai réalisé ci-dessus sans créer les espaces blancs nécessaires avec indentation?

De plus, pourquoi l’édition de plusieurs lignes à la fois ne fonctionne-t-elle qu’en quittant le mode d’insertion avec esc sur ctrl c ?

Modifier:

Voici un exemple plus compliqué

 name = models.CharField( max_length = 135 ) comment = models.TextField( blank = True ) phone = models.CharField( max_length = 135, blank = True ) email = models.EmailField( blank = True ) 

à

 name = models.whatever.CharField( max_length = 135 ) comment = models.whatever.TextField( blank = True ) phone = models.whatever.CharField( max_length = 135, blank = True ) email = models.whatever.EmailField( blank = True ) 

dans cet exemple, je ferais le bloc visuel vertical sur le . , puis réinsérez-le en mode insertion, c’est-à-dire tapez .whatever. . J’espère que maintenant vous pouvez voir l’inconvénient de cette méthode. Je suis limité à sélectionner uniquement une colonne de texte qui sont tous les mêmes dans une position verticale .

  1. Déplacez le curseur sur le name n .
  2. Entrer en mode bloc visuel ( ctrl v ).
  3. Appuyez trois fois sur j .
  4. Appuyez sur I (majuscule i).
  5. Tapez vendor_ .
  6. Appuyez sur esc .

mini-screencast démontrant la méthode

Un I majuscule doit être utilisé plutôt qu’un minuscule i car le minuscule i est interprété comme le début d’un object texte , ce qui est plutôt utile en soi, par exemple pour sélectionner un bloc de tag à l’intérieur:

mini-screencast montrant l'utilité de l'objet texte it

Une autre approche consiste à utiliser le . ( dot ) commande en combinaison avec I.

  1. Déplace le curseur où tu veux commencer
  2. Appuyez sur I
  3. Tapez le préfixe que vous voulez (par exemple, vendor_ )
  4. Appuyez sur esc .
  5. Appuyez sur j pour descendre une ligne
  6. Tapez pour répéter la dernière modification, en insérant automatiquement le préfixe à nouveau
  7. Alterner rapidement entre j et .

Je trouve que cette technique est souvent plus rapide que le mode bloc visuel pour un petit nombre d’ajouts et présente l’avantage supplémentaire que si vous n’avez pas besoin d’insérer le texte sur chaque ligne d’une plage, vous pouvez facilement les sauter en appuyant sur j s.

Notez que pour un grand nombre d’ajouts contigus, l’approche par blocs ou la macro sera probablement supérieure.

Je voudrais utiliser une macro pour enregistrer mes actions, puis le répéter.

  1. Placez votre curseur sur la première lettre du nom.
  2. Hit qq pour commencer à enregistrer dans le tampon q .
  3. Appuyez sur i pour passer en mode insertion et tapez vector_ , puis appuyez sur ESC pour quitter le mode insertion.
  4. Maintenant, appuyez sur 0 pour revenir au début de la ligne.
  5. Maintenant, appuyez sur j pour descendre.
  6. q nouveau sur q pour arrêter l’enregistrement.

Vous avez maintenant une belle macro.

Tapez 3@q pour exécuter votre macro 3 fois pour faire le rest des lignes.

 :%s/^/vendor_/ 

ou est-ce que je manque quelque chose?

  1. Sélectionnez les lignes que vous souhaitez modifier en utilisant Ctrl V.
  2. Presse:

    • I : Insérer avant ce qui est sélectionné.
    • A : Ajoute après ce qui est sélectionné.
    • C : Remplacez ce qui est sélectionné.
  3. Tapez le nouveau texte.

  4. Appuyez sur Echap pour appliquer les modifications à toutes les lignes sélectionnées.

Mis à jour en janvier 2016

Bien que la réponse acceptée soit une excellente solution, il s’agit en fait d’un peu moins de frappes, et les échelles sont meilleures, en principe basées sur la réponse acceptée.

  1. Déplacez le curseur sur le name n .
  2. Entrer en mode bloc visuel ( ctrl v ).
  3. Appuyez sur 3j
  4. Appuyez sur I
  5. Tapez vendor_ .
  6. Appuyez sur esc .

illustration visuelle

Notez que cela a moins de frappes que la réponse acceptée fournie (comparez l’étape 3). Nous comptons simplement le nombre de j actions à effectuer.

Si vous avez activé les numéros de ligne (comme illustré ci-dessus) et que vous connaissez le numéro de ligne que vous souhaitez déplacer, l’étape 3 peut être modifiée en # G où # est le numéro de ligne souhaité.

Dans notre exemple ci-dessus, ce serait 4G . Cependant, en ne traitant que quelques numéros de ligne, un décompte explicite fonctionne bien.

Supposons que vous ayez ce fichier:

 something name comment phone email somethine else and more ... 

Vous voulez append “vendor_” devant “name”, “comment”, “phone” et “email”, quel que soit leur emplacement dans le fichier .

 :%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc 

Le drapeau c vous invitera à confirmer. Vous pouvez supprimer cela si vous ne voulez pas l’invite.

Vous pouvez également avoir un cas d’utilisation où vous souhaitez supprimer un bloc de texte et le remplacer.

Comme ça

 Hello World Hello World 

À

 Hello Cool Hello Cool 

Vous pouvez simplement sélectionner le bloc “World” dans les deux lignes.

Tapez c pour changer – Maintenant vous serez en mode insertion.

Insérez les choses que vous voulez et appuyez sur échapper.

Les deux sont réfléchis verticalement. Cela fonctionne exactement comme «je» sauf qu’il remplace le bloc par le nouveau texte au lieu de l’insérer.

Je voulais commenter beaucoup de lignes dans un fichier de configuration sur un serveur qui n’avait que vi (pas de nano), donc la méthode visuelle était trop lourde. Voici comment je l’ai fait.

  1. Ouvrir le fichier vi file
  2. Afficher les numéros de ligne :set number! ou :set number
  3. Ensuite, utilisez les numéros de ligne pour remplacer le début de ligne par “#”, comment?

:35,77s/^/#/

Note: les chiffres sont inclus, les lignes de 35 à 77, toutes deux incluses, seront modifiées.

Pour :35,77s/^#// , utilisez simplement :35,77s/^#//

Si vous souhaitez append un mot de texte en tant que commentaire après chaque ligne de code, vous pouvez également utiliser:

:35,77s/$/#test/ (pour les langages comme Python)

:35,77s/;$/;\/\/test/ (pour les langages comme Java)

crédits / références:

  1. https://unix.stackexchange.com/questions/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-lines-at-once

 Use Ctrl+V to enter visual block mode Move Up/Down to select the columns of text in the lines you want to comment. Then hit Shift+i and type the text you want to insert. Then hit Esc, wait 1 second and the inserted text will appear on every line 
 1. ctrl + v to go to visual block 2. select the lines using up and down arrow 3. enter small 3i ( presess SMALL I three times) 4. I (Press capital I, That will take you into insert mode) 4. Write the text you want to add 5. esc 6. press down arrow 

C’est une vieille question, mais je veux proposer une alternative plus flexible:

Exemple: pour entrer le texte XYZ au début de la ligne

:%norm IXYZ

Qu’est-ce qu’il se passe ici?

  • % == Exécuter sur chaque ligne
  • norm == Exécutez les touches suivantes en mode normal
  • I == Insérer en début de ligne
  • XYZ == Le texte que vous voulez entrer

Ensuite, vous appuyez sur Entrée, et il s’exécute.

Spécifique à votre demande:

:%norm Ivendor_

Vous pouvez également choisir une gamme particulière:

:2,4norm Ivendor_

Ou exécutez sur une plage visuelle sélectionnée:

:'<,'>norm Ivendor_