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

Parfois je veux éditer un certain bloc visuel de texte à travers plusieurs lignes.

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

name
comment
phone
email

Et looke comme ce

vendor_name
vendor_comment
vendor_phone
vendor_email

actuellement, la façon dont je le ferais maintenant est...

  1. sélectionner les 4 lignes de bloc en appuyant sur V et ensuite j 4 fois.
  2. tiret avec > .
  3. retournez une lettre avec h .
  4. Allez à bloquer le mode visuel avec ctrl v .
  5. sélectionnez 4 lignes en appuyant sur j 4 fois. A ce point vous avez sélectionné un bloc visuel 4x1 de whitespace (4 lignes, 1 cols).
  6. de la Presse c . Remarquez ceci à peu près indenté vers la gauche par une colonne.
  7. tapez un " vendor_" sans la citation. Remarquez l'espace supplémentaire que nous avons dû remettre.
  8. Appuyez sur esc . C'est l'une des très rares fois où j'utilise esc pour sortir du mode insertion. Ctrl c ne modifierait que la première ligne.
  9. Répétez l'étape 1.
  10. Tiret, l'autre avec < .

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

mais si je dois effacer, alors y a-t-il un moyen de faire ce que j'ai exécuté ci-dessus sans créer l'espace nécessaire avec indentation?

pourquoi éditer plusieurs lignes à la fois ne fonctionne-t-il qu'en sortant du mode insertion avec esc au-dessus de ctrl c ?

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 réaliserais le blocage visuel vertical au-dessus du . , puis le réinsérer en mode insert, c'est-à-dire taper .whatever. . Espérons maintenant, vous pouvez voir l'inconvénient de cette méthode. Je me limite à choisir une colonne de texte qui sont toutes les mêmes dans une position verticale .

242
vim
demandé sur Brad Solomon 2012-03-04 00:44:45

12 réponses

  1. déplacez le curseur sur le n dans name .
  2. passe en mode bloc visuel ( ctrl" 1519130920 v ).
  3. Appuyez sur j trois fois (ou 3j ).
  4. de la Presse I (i majuscule).
  5. Type vendor_ .
  6. presse esc .

mini-screencast demonstrating the method

une majuscule I doit être utilisée plutôt qu'une minuscule i parce que la minuscule i est interprétée comme le début d'un objet texte , ce qui est plutôt utile en soi, p.ex. pour sélectionner un bloc d'étiquettes( it ):

mini-screencast showing the usefulness of the it text object

740
répondu icktoofay 2018-10-04 01:38:11

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

  1. déplacer le curseur où vous voulez commencer
  2. Presse I
  3. tapez le préfixe désiré (par exemple vendor_ )
  4. Appuyez sur esc .
  5. presser j pour descendre une ligne
  6. Type . pour répéter la dernière édition, en insérant automatiquement le préfixe
  7. alternent rapidement entre j et .

je trouve que cette technique est souvent plus rapide que le mode de bloc visuel pour les petits nombres d'ajouts et a l'avantage supplémentaire que si vous n'avez pas besoin d'insérer le texte sur chaque ligne simple dans une gamme vous pouvez facilement sautez en appuyant sur la touche supplémentaire j .

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

59
répondu danprice 2014-08-04 14:04:00

j'utiliserais une macro pour enregistrer mes actions, puis je la répéterais.

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

vous avez maintenant une bonne macro.

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

27
répondu Brian Neal 2012-03-03 20:50:16
:%s/^/vendor_/

ou est-ce que je rate quelque chose?

24
répondu srini.venigalla 2012-03-06 21:57:23
  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 : ajouter après ce qui est sélectionné.
    • C : remplacer ce qui est sélectionné.
  3. Tapez le nouveau texte.

  4. appuyez sur Esc pour appliquer les modifications à toutes les lignes sélectionnées.
24
répondu Loukan ElKadi 2018-03-30 20:20:30

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 des échelles mieux fondées en principe sur la réponse acceptée.

  1. déplacez le curseur sur le n dans name .
  2. entrer en mode bloc visuel ( ctrl" 1519170920 v ).
  3. Appuyez sur 3j
  4. presse I .
  5. Type vendor_ .
  6. Appuyez sur esc .

visual illustration

notez qu'il y a moins de touches que la réponse acceptée fournie (comparer L'Étape 3). Nous comptons juste le nombre d'actions de j à effectuer.

si vous avez activé les numéros de ligne (tel qu'illustré ci-dessus), et que vous connaissez le numéro de ligne vers lequel vous souhaitez vous déplacer, alors l'étape 3 peut être changée en # G où # est le numéro de ligne désiré.

dans notre exemple ci-dessus, ce serait 4G . Toutefois, lorsqu'il s'agit de quelques chiffres de ligne, un comptage explicite fonctionne bien.

11
répondu arcseldon 2016-01-01 10:25:49

supposons que vous ayez ce fichier:

something

name
comment
phone
email

somethine else
and more ...

vous voulez ajouter" vendor_ "devant" name"," comment"," phone", et" email", indépendamment de l'endroit où ils apparaissent dans le fichier .

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

le drapeau c vous demandera confirmation. Vous pouvez laisser tomber si vous ne voulez pas l'invite.

5
répondu Manish 2012-03-04 13:50:18

vous pouvez aussi avoir un cas d'utilisation où vous voulez supprimer un bloc de texte et le remplacer.

comme ceci

Hello World

Hello World

à

Hello Cool

Hello Cool

vous pouvez simplement sélectionner le bloc visuel" monde " dans les deux lignes.

Type c pour le changement - Maintenant, vous allez être en mode insertion.

insérez ce que vous voulez et appuyez sur escape.

les deux se reflètent verticalement. Il fonctionne tout comme "je", sauf qu'il remplace le bloc avec le nouveau texte au lieu de l'insérer.

5
répondu Nishant 2014-11-29 22:32:42

je voulais commenter un lot de lignes dans un fichier de configuration sur un serveur qui n'avait que vi( pas de nano), donc la méthode visuelle était lourde aussi bien 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. alors utilisez les numéros de ligne pour remplacer le début de ligne par"#", comment?

:35,77s/^/#/

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

décommenter/annuler cela, il suffit d'utiliser :35,77s/^#//

si vous voulez ajouter un mot texte comme commentaire après chaque ligne de code, vous pouvez aussi utiliser:

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

:35,77s/;$/;\/\/test/ (pour les langues 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
répondu computingfreak 2017-10-18 00:57:32
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
répondu Arpan Saini 2017-02-17 23:02:37
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
répondu Arpan Saini 2018-03-21 00:59:12

C'est une vieille question, mais je veux fournir une alternative qui peut être plus souple:

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

:%norm IXYZ

que se passe-t-il ici?

  • % == exécuter sur chaque ligne
  • norm = = exécuter les touches suivantes en mode normal
  • I = = insérer au début de la ligne
  • XYZ == Le texte que vous voulez entrer

puis vous appuyez sur Entrée, et il exécute.

spécifique à votre demande:

:%norm Ivendor_

vous pouvez également choisir une gamme particulière:

:2,4norm Ivendor_

ou exécuter sur une plage de vision sélectionnée:

:'<,'>norm Ivendor_

0
répondu Aubrey Lavigne 2018-05-02 14:47:40