91 votes

Comment puis-je ajouter du texte à plusieurs lignes dans Vim ?

Disons que j'ai dix lignes et que je veux faire précéder le texte d'un mot qui apparaît dans ces lignes ? Il n'est pas nécessaire qu'il soit au début de la ligne.

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

à

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

Est-il également possible de ne pas seulement faire précéder l'option bar( mais entourent en fait foo avec bar(foo) ?

Je voudrais aussi un moyen rapide d'ajouter // des commentaires sur plusieurs lignes (commentaires de style C).

J'utilise Vim/GVim 7.2.

170voto

sth Points 91594

Allez au premier foo , appuyez sur Ctrl - v pour passer en mode bloc visuel et appuyez sur la touche jusqu'à ce que toutes les lignes avec le symbole foo sont marqués. Appuyez ensuite sur Shift - i à insérer au début (du bloc). Lorsque vous avez terminé et que vous appuyez sur Esc les caractères insérés seront ajoutés à chaque ligne à gauche du bloc marqué.

Pour insérer à la fin, appuyez à nouveau sur Ctrl - v déplacez-vous vers le haut/bas pour marquer toutes les lignes concernées, puis appuyez sur End o $ pour étendre la sélection jusqu'à la fin des lignes. Vous pouvez maintenant appuyer sur Shift - a pour ajouter à la fin de toutes les lignes, comme précédemment avec Shift - i .

La sélection visuelle peut également être effectuée avec des commandes de mouvement normales. Ainsi, pour commenter un bloc entier en C, vous pouvez vous déplacer vers l'accolade d'ouverture et taper Ctrl - v % Shift - i // Esc .

44voto

Brian Agnew Points 143181

Pour répondre à votre première question, les éléments suivants

:%s/foo/bar(&)/g

cherchera à foo et entourer le modèle correspondant avec bar() . Le site /g le fera plusieurs fois dans une même ligne.

Puisque vous ne faites que correspondre foo vous pourriez faire un simple :s/foo/bar(foo)/g . La méthode ci-dessus fonctionnera toutefois si vous décidez de faire correspondre une expression régulière plutôt qu'un simple mot (par ex. f[a-z][a-z] ). Le "&" dans l'exemple ci-dessus représente ce que vous avez fait correspondre.

18voto

Laurence Gonsalves Points 50783

Pour préfixer une série de lignes, j'utilise l'une des deux approches suivantes :

Une approche est le bloc select (mentionné par qqch). En général, vous pouvez sélectionner une région rectangulaire avec ctrl-V suivi du déplacement du curseur. Une fois que vous avez mis en évidence un rectangle, appuyez sur shift-I insérera des caractères sur le côté gauche du rectangle, ou bien shift-A les ajoutera sur le côté droit du rectangle. Ainsi, vous pouvez utiliser cette technique pour créer un rectangle qui inclut la colonne la plus à gauche des lignes que vous voulez préfixer, en appuyant sur shift-I tapez le préfixe, puis appuyez sur Echap.

L'autre approche consiste à utiliser une substitution (comme mentionné par Brian Agnew). La substitution de Brian affectera le fichier entier (le % dans la commande signifie "toutes les lignes"). Pour n'affecter que quelques lignes, l'approche la plus simple est de taper shift-V (ce qui permet d'activer le mode ligne visuelle) alors que vous êtes sur la première/dernière ligne, puis passez à la dernière/première ligne. Puis tapez :

:s/^/YOUR PREFIX/

Le ^ est une regex (dans ce cas, le début de la ligne). En tapant ceci en mode ligne visuelle, vous verrez que '<,'> est automatiquement inséré avant le 's'. Cela signifie que l'étendue de la substitution sera la sélection visuelle.

Conseil supplémentaire : si votre préfixe contient des slashs, vous pouvez soit les échapper avec des backslashs, soit utiliser un autre caractère de ponctuation comme séparateur dans la commande. Par exemple, pour ajouter des commentaires à la ligne C++, j'écris habituellement :

:s:^:// :

Pour l'ajout d'un suffixe, l'approche par substitution est généralement plus facile, sauf si toutes vos lignes sont exactement de la même longueur. Utilisez simplement $ pour le motif au lieu de ^ et votre chaîne sera ajoutée au lieu d'être pré-intégrée.

Si vous voulez ajouter un préfixe et un suffixe simultanément, vous pouvez faire quelque chose comme ceci :

:s/.*/PREFIX & SUFFIX/

Le .* correspond à la ligne entière. Le & dans le remplacement remet le texte correspondant (la ligne entière), mais avec votre préfixe et votre suffixe ajoutés.

BTW : lorsque vous commentez du code, vous voudrez probablement le décommenter plus tard. Vous pouvez utiliser visual-block ( ctrl-V ) pour sélectionner les barres obliques et ensuite appuyer sur d pour les supprimer, ou vous pouvez utiliser une substitution (probablement avec une sélection de ligne visuelle, faite avec shift-V ) pour supprimer les barres obliques de tête, comme ceci :

:s:// ::

6voto

:normal à la rescousse !

:%norm Wibar(

:%norm WEa)

:norm(al) restitue les commandes comme si vous les aviez tapées :

W - passe au mot suivant

i - lance le mode d'insertion

bar( - saisit la séquence "bar(".

Ou en une seule ligne :

:%norm Wibar(ctrlvESCEa)

Si vous êtes sous Windows, tapez ctrlq au lieu de ctrlv .

3voto

Godfrey Parke Points 31

Une autre possibilité (probablement moins utile dans votre cas de test, mais pratique dans d'autres situations) consiste à délimiter la zone que vous souhaitez modifier à l'aide de marques.

  • Placez le curseur n'importe où dans la ligne supérieure et appuyez sur 'a
  • Placez le curseur n'importe où dans la dernière ligne et appuyez sur 'b
  • Émettez la commande :'a,'b s/foo/bar(&)/

J'aime généralement le mode bloc visuel si tout est visible à l'écran, et je préfère généralement les marques si le début et la fin sont séparés par de nombreux écrans.

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