web-dev-qa-db-fra.com

Vim: insère les mêmes caractères sur plusieurs lignes

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

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

name
comment
phone
email

Et donne le comme ça

vendor_name
vendor_comment
vendor_phone
vendor_email

Actuellement, je le ferais maintenant ...

  1. Sélectionnez les 4 lignes du bloc en appuyant sur V et alors j 4 fois.
  2. Mettre en retrait avec >.
  3. Recule d'une lettre avec h.
  4. Aller au mode visuel bloqué avec ctrlv.
  5. Sélectionnez 4 lignes vers le bas en appuyant sur j 4 fois. A ce stade, vous avez sélectionné un bloc visuel 4x1 d'espaces (4 lignes, 1 colonnes).
  6. Presse c. Remarquez cela assez en retrait à gauche d'une colonne.
  7. Tapez un " vendor_" sans la citation. Remarquez l'espace supplémentaire que nous avons dû redonner.
  8. Presse esc. C’est l’une des rares fois que j’utilise esc pour sortir du mode insertion. ctrlc ne modifierait que la première ligne.
  9. Répétez l'étape 1.
  10. Indenter dans l'autre sens avec <.

Je n'ai pas besoin d'indenter s'il y a au moins une colonne d'espaces avant les mots. Je n'aurais pas besoin des espaces si je n'avais pas à effacer le bloc visuel avec c.

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

Aussi, pourquoi éditer plusieurs lignes à la fois ne fonctionne-t-il qu'en sortant du mode insertion avec esc plus de ctrlc?

Edit:

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 voudrais exécuter le bloc visuel vertical sur le ., puis le réinsérer en mode insertion, c'est-à-dire taper .whatever.. J'espère que maintenant vous pouvez voir les inconvénients de cette méthode. Je suis limité à la sélection d'une colonne de texte qui sont tous identiques dans une position verticale.

261
hobbes3
  1. Déplacez le curseur sur n dans name.
  2. Entrer en mode bloc visuel (ctrlv).
  3. Presse j trois fois (ou 3j).
  4. Presse I (capital i).
  5. Tapez vendor_.
  6. Presse esc.

mini-screencast demonstrating the method

Un I majuscule doit être utilisé plutôt qu'un i minuscule, car le i minuscule est interprété comme le début d'un objet texte , ce qui est plutôt utile en soi, par exemple. pour sélectionner un bloc de balises ( it ):

mini-screencast showing the usefulness of the it text object

795
icktoofay

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

  1. Déplacez le curseur à l'endroit où vous voulez commencer
  2. Presse I
  3. Tapez le préfixe souhaité (par exemple vendor_)
  4. Presse esc.
  5. Presse j descendre une ligne
  6. Type . répéter la dernière modification, en réinsérant automatiquement le préfixe
  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’additions et présente l’avantage supplémentaire que si vous n’avez pas besoin d’insérer du texte sur chaque ligne d’une plage, vous pouvez facilement les ignorer en appuyant sur extra j's.

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

62
danprice
  1. Sélectionnez les lignes que vous souhaitez modifier à l'aide de CtrlV.
  2. Presse:

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

  4. Presse Esc appliquer les modifications à toutes les lignes sélectionnées.
27
Loukan ElKadi

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

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

Vous avez maintenant une macro Nice.

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

27
Brian Neal
:%s/^/vendor_/

ou est-ce que je manque quelque chose?

24
srini.venigalla

Mis à jour en janvier 2016

Bien que la réponse acceptée soit une excellente solution, elle représente en réalité un peu moins de frappes au clavier et évolue mieux - en principe sur la base de la réponse acceptée.

  1. Déplacez le curseur sur ndans namename__.
  2. Entrer en mode bloc visuel (ctrlv).
  3. Presse 3j
  4. Presse Iname__.
  5. Tapez vendor_.
  6. Presse esc.

visual illustration

Notez que le nombre de frappes au clavier est inférieur au nombre de réponses acceptées fournies (comparez l’étape 3). Nous ne comptons que le nombre d'actions j à effectuer.

Si les numéros de ligne sont activés (comme illustré ci-dessus) et que vous connaissez le numéro de ligne que vous souhaitez déplacer, vous pouvez passer à l'étape 3 en #G où # est le numéro de la ligne recherchée.

Dans notre exemple ci-dessus, ce serait 4G. Cependant, s’il s’agit de quelques numéros de ligne, un décompte explicite fonctionne bien.

11
arcseldon

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 visualiser le bloc sélectionné "Monde" dans les deux lignes.

Tapez c pour changer - Vous allez maintenant être en mode insertion.

Insérez le matériel que vous voulez et appuyez sur échapper. 

Les deux se reflètent verticalement. Cela fonctionne comme "je" sauf qu'il remplace le bloc par le nouveau texte au lieu de l'insérer.

5
Nishant

Supposons que vous ayez ce fichier:

something

name
comment
phone
email

somethine else
and more ...

Vous souhaitez ajouter "vendor_" devant "nom", "commentaire", "télé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 laisser tomber si vous ne voulez pas l'invite.

5
Manish

Je voulais commenter un lot de lignes dans un fichier de configuration sur un serveur qui ne contenait que vi (no nano), la méthode visuelle était donc fastidieuse.

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

:35,77s/^/#/

Remarque: les nombres sont inclus, les lignes de 35 à 77, les deux incluses seront modifiées.

Pour supprimer/annuler le commentaire, utilisez simplement :35,77s/^#//

Si vous souhaitez ajouter un texte Word sous forme de commentaire après chaque ligne de code, vous pouvez également utiliser:

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

:35,77s/;$/;\/\/test/ (pour des 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

4
computingfreak

C'est une vieille question, mais je souhaite proposer une solution de remplacement 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écuter les clés suivantes en mode normal
  • I == Insérer au début de la ligne
  • XYZ == Le texte que vous souhaitez 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_

1
Aubrey Lavigne
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
0
Arpan Saini
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
0
Arpan Saini