372 votes

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

Il m'arrive parfois de vouloir modifier un bloc de texte visuel sur plusieurs lignes.

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

name
comment
phone
email

Et le faire ressembler à ceci

vendor_name
vendor_comment
vendor_phone
vendor_email

Actuellement, la façon dont je procéderais est la suivante...

  1. Sélectionnez les 4 lignes d'un bloc en appuyant sur V et ensuite j quatre fois.
  2. Indenter avec > .
  3. Reculer d'une lettre avec h .
  4. Passez en mode de visualisation des blocs avec Ctrlv .
  5. Sélectionnez les quatre lignes suivantes en appuyant sur j quatre fois. À ce stade, vous avez sélectionné un bloc visuel d'espace blanc de 4x1 (quatre lignes et une colonne).
  6. Presse C . Remarquez que ce texte est indenté d'une colonne vers la gauche.
  7. Tapez un " vendor_" sans la citation. Remarquez l'espace supplémentaire que nous avons dû ajouter.
  8. Presse Esc . C'est l'une des rares fois où j'utilise Esc pour sortir du mode insertion. Ctrlc ne modifierait que la première ligne.
  9. Répéter 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'espace avant les mots. Je n'aurais pas besoin d'espaces blancs si je ne devais pas effacer le bloc visuel avec c .

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

De même, pourquoi l'édition de plusieurs lignes à la fois ne fonctionne-t-elle qu'en quittant le mode d'insertion à l'aide de la touche Esc plus Ctrlc ?


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, j'effectuerais le bloc visuel vertical sur la page . puis le réinsérer en mode insertion, c'est-à-dire taper .whatever. . J'espère que vous voyez maintenant l'inconvénient de cette méthode. Je ne peux sélectionner qu'une colonne de texte. qui sont tous identiques en position verticale .

11 votes

Meilleure solution : ":%s/^/vendeur_/"

1 votes

Merci pour votre réponse. Cela fonctionne si je veux seulement ajouter un mot à chaque ligne. Mais la méthode que j'utilise peut être appliquée à n'importe quelle position. Permettez-moi d'ajouter un autre exemple plus compliqué à mon exemple.

3 votes

Ensuite, mettez en surbrillance les lignes que vous souhaitez modifier avec shift-V, et tapez une commande de recherche et de remplacement appropriée - dans le deuxième exemple, :s/models\./\0whatever./

1057voto

icktoofay Points 60218
  1. Déplacer le curseur sur le n en name .
  2. Entrer dans le mode bloc visuel ( Ctrlv ).
  3. Presse j trois fois (ou 3j ) pour descendre de 3 lignes ; G (g majuscule) pour passer à la dernière ligne
  4. Presse <code>I</code> (capital i).
  5. Type dans vendor_ . Remarque : la mise à jour de l'écran ne se fera que dans l'espace de travail. premier ligne - jusqu'à Esc (6.), ce qui permet de mettre à jour toutes les lignes.
  6. Presse Esc .

mini-screencast demonstrating the method

Une majuscule I doit être utilisé au lieu d'une lettre minuscule i car les minuscules i est interprété comme le début d'un objet texte qui est assez utile en soi, par exemple pour la sélection à l'intérieur d'un bloc de balises ( it ) :

mini-screencast showing the usefulness of the 'it' text object

0 votes

Whoa, je ne savais pas I a travaillé dans le bloc visuel. J'ai évidemment essayé i avant, mais il a émis un bip, alors j'ai utilisé c depuis lors... et j'ai eu la limitation décrite. Merci pour la réponse ! :-)

14 votes

Je n'ai pas réussi à faire fonctionner ce système sous Windows (puisque CTRL+V est utilisé pour le collage dans le presse-papiers). Mais Vim l'a également assigné à Ctrl+Q pour la version Windows.

3 votes

@Ven : Vim n'est pas réellement occupé pendant ce temps - il attend juste que vous appuyiez sur une autre touche, et finit par s'arrêter. Deux expériences pour vous : d'abord, essayez d'appuyer sur escape et ensuite d'appuyer immédiatement sur une autre touche, comme j o ^L . Vous devriez voir que Vim n'était pas occupé après tout ; il attendait simplement. Deuxièmement, essayez de changer 'timeout' à une valeur inférieure, comme 80 (au lieu de l'option par défaut 1000 ) et observez qu'il s'arrête plus rapidement.

82voto

danprice Points 186

Une autre approche consiste à utiliser la fonction . ( dot ) en combinaison avec la commande i .

  1. Déplacez le curseur à l'endroit où vous voulez commencer
  2. Presse i
  3. Tapez le préfixe que vous souhaitez (par ex. vendor_ )
  4. Presse esc .
  5. Presse j descendre une ligne
  6. Type . pour répéter la dernière modification, en insérant automatiquement le préfixe à nouveau
  7. Alterner rapidement entre j y .

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 ignorer en appuyant sur la touche supplémentaire. j 's.

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

0 votes

Il est bon de voir une autre approche.

0 votes

Je préfère cela pour quelques lignes seulement. Beaucoup plus facile à exécuter IMO.

0 votes

Après avoir saisi le préfixe souhaité, ne faut-il pas appuyer sur la touche "Echap" ?

34voto

Brian Neal Points 13668

J'utilisais une macro pour enregistrer mes actions et je les répétais ensuite.

  1. Placez votre curseur sur la première lettre de nom .
  2. Frapper qq pour commencer l'enregistrement dans la mémoire tampon q.
  3. Frapper i pour passer en mode insertion, tapez vecteur_ puis appuyez sur Esc pour quitter le mode insertion.
  4. Maintenant, frappez 0 pour revenir au début de la ligne.
  5. Maintenant, frappez j pour descendre.
  6. Maintenant, frappez q pour arrêter l'enregistrement.

Vous avez maintenant une belle macro.

Type kbd>3@q</kbd d'exécuter votre macro trois fois pour faire le reste des lignes.

0 votes

Le "q" est-il spécial (pour "quick macro" ?)?

0 votes

Comment rendre la macro persistante (fonctionnement sur plusieurs sessions) ?

0 votes

@PeterMortensen Vim dispose d'une fonctionnalité appelée sessions qui permet de conserver les tampons (et bien d'autres choses).

30voto

srini.venigalla Points 3734
:%s/^/vendor_/

ou ai-je oublié quelque chose ?

0 votes

Vous ne tenez pas compte du fait qu'il s'agit probablement d'un sous-texte dans un fichier comportant de nombreuses autres lignes sur lesquelles la fonction vender_ est indésirable.

10 votes

@dan Si vous n'avez besoin que d'un sous-texte, vous pouvez limiter la recherche à un ensemble de numéros de ligne, par exemple 1,4s/^/vendor_/

1 votes

@BradKoch Intéressant. Je n'étais pas au courant des contraintes liées au nombre de lignes, merci pour cette information.

6voto

Manish Points 2293

Supposons que vous ayez ce fichier :

something

name
comment
phone
email

something else
and more ...

Vous voulez ajouter "vendor_" devant "name", "comment", "phone" et "email", quel que soit l'endroit où ils apparaissent dans le fichier .

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

En c Le drapeau vous demandera de confirmer. Vous pouvez laisser tomber cette option si vous ne voulez pas de cette demande.

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