web-dev-qa-db-fra.com

Comment puis-je ajouter du texte au milieu de la ligne à plusieurs lignes dans Vim?

Disons que j'ai dix lignes et que je veux ajouter du texte à un mot qui apparaît dans ces lignes? Il n'est pas nécessaire que ce soit au début de la ligne.

De:

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 d'ajouter non seulement le bar( Mais en fait entourer foo de bar(foo)?

J'aimerais également un moyen rapide d'ajouter des commentaires // À plusieurs lignes (commentaires de style C).

J'utilise Vim/GVim 7.2.

90
Sasha

Accédez au premier foo, appuyez sur Ctrl-v pour passer en mode de blocage visuel et appuyez jusqu'à ce que toutes les lignes avec foo soient marquées. Puis appuyez Shift-i à insérer au début (du bloc). Lorsque vous avez terminé et 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 Ctrl-v, déplacez-vous vers le haut/bas pour marquer toutes les lignes affectées, puis appuyez sur End ou $ pour étendre la sélection jusqu'à la fin des lignes. Vous pouvez maintenant appuyer sur Shift-a à 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. Donc, pour commenter un bloc entier en C, vous pouvez passer à l'accolade d'ouverture et taper Ctrl-v%Shift-i//Esc.

168
sth

Pour répondre à votre première question, voici

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

recherchera foo et entourera le motif correspondant de bar(). Le /g Le fera plusieurs fois sur une seule ligne.

Puisque vous faites juste correspondre foo, vous pouvez faire une simple :s/foo/bar(foo)/g. Cependant, ce qui précède fonctionnera si vous décidez de faire correspondre une expression régulière plutôt qu'un simple mot (par exemple f[a-z][a-z]). Le "&" dans ce qui précède représente ce que vous avez correspondu.

44
Brian Agnew

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

Une approche est la sélection de bloc (mentionnée par sth). En général, vous pouvez sélectionner une région rectangulaire avec ctrl-V suivi d'un mouvement du curseur. Une fois que vous avez mis en surbrillance un rectangle, appuyez sur shift-I insérera des caractères sur le côté gauche du rectangle, ou shift-A les ajoutera sur le côté droit du rectangle. Vous pouvez donc utiliser cette technique pour créer un rectangle qui inclut la colonne la plus à gauche des lignes que vous souhaitez préfixer, appuyez sur shift-I, tapez le préfixe, puis appuyez sur Échap.

L'autre approche consiste à utiliser une substitution (comme mentionné par Brian Agnew). La substitution de Brian affectera tout le fichier (le% dans la commande signifie "toutes les lignes"). Pour n'affecter que quelques lignes, l'approche la plus simple consiste à toucher shift-V (qui active le mode ligne visuelle) sur la première/dernière ligne, puis passez à la dernière/première ligne. Tapez ensuite:

:s/^/YOUR PREFIX/

Le ^ est une expression régulière (dans ce cas, le début de la ligne). En tapant ceci en mode ligne visuelle, vous verrez "<,"> inséré avant le s automatiquement. Cela signifie que la plage de substitution sera la sélection visuelle.

Conseil supplémentaire: si votre préfixe contient des barres obliques, vous pouvez soit les échapper avec une barre oblique inverse, soit utiliser un caractère de ponctuation différent comme séparateur dans la commande. Par exemple, pour ajouter des commentaires de ligne C++, j'écris généralement:

:s:^:// :

Pour ajouter un suffixe, l'approche de substitution est généralement plus facile à moins que toutes vos lignes aient exactement la même longueur. Utilisez simplement $ pour le motif au lieu de ^ et votre chaîne sera ajoutée au lieu de pré-suspendue.

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

:s/.*/PREFIX & SUFFIX/

Le. * Correspond à toute la ligne. Le dans le remplacement remet le texte correspondant (toute la ligne) en arrière, mais maintenant il aura votre préfixe et suffixe ajoutés.

BTW: lorsque vous commentez le code, vous voudrez probablement le décommenter plus tard. Vous pouvez utiliser visual-block (ctrl-V) pour sélectionner les barres obliques, puis appuyez 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 principales comme ceci:

:s:// ::
16
Laurence Gonsalves

: normal à la rescousse!

:%norm Wibar(

:%norm WEa)

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

W - passe au mot suivant

i - démarre le mode d'insertion

bar (- saisit la séquence 'bar ('

Ou en une seule ligne:

:%norm Wibar(ctrlvESCEa)

Si vous exécutez Windows, tapez ctrlq au lieu de ctrlv.

6
Cyber Oliveira

Encore une autre possibilité (probablement pas si utile dans votre cas de test, mais pratique dans d'autres situations) est de délimiter la zone que vous souhaitez modifier avec des marques.

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

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

3
Godfrey Parke

Une autre expression régulière simple est:

%s/^/<text you want to prepend>/
1
Artorias2718

Pour les commentaires de style C, utilisez la réponse regexp de Brian et faites correspondre la fin de la ligne $, et insérez.

0
maxwellb