92 votes

Comment puis-je insérer du texte au milieu de la ligne sur plusieurs lignes dans Vim?

Dire que j'ai dix lignes et je veux ajouter du texte au début d'un mot qui apparaît dans ces lignes ? Ce n'a pas à être 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 de ne pas seulement ajouter bar( mais en fait entourer foo de bar(foo) ?

J'aimerais aussi une manière rapide d'ajouter des commentaires // à plusieurs lignes (commentaires de style C).

J'utilise Vim/GVim 7.2.

1 votes

Les commentaires de style C sont /* */ Les commentaires de style BCPL sont //

0 votes

170voto

sth Points 91594

Allez au premier foo, appuyez sur Ctrl-v pour entrer en mode de bloc visuel et appuyez vers le bas jusqu'à ce que toutes les lignes avec foo soient marquées. Ensuite, appuyez sur Shift-i pour insérer au début (du bloc). Une fois que vous avez terminé et appuyé 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 affectées, puis appuyez sur End ou $ pour étendre la sélection jusqu'à la fin des lignes. Maintenant, vous pouvez 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 se faire avec des commandes de mouvement normales. Donc, pour commenter un bloc entier en C, vous pourriez vous déplacer vers l'accolade ouvrante et taper Ctrl-v % Shift-i // Esc.

5 votes

Juste une addition : si Ctrl-V ne démarre pas le mode bloc visuel dans Vim sur Windows, il faut utiliser Ctrl-Q à la place.

3 votes

Une variation de la réponse consiste à marquer un bloc visuel avec shift+V puis à modifier le bloc en mode ex : :'<,'>s/^/texte_préfixe/ :'<,'>s/$/texte_suffixe/ Notez que "'<,'>" est automatiquement imprimé par vim lorsque vous appuyez sur ":".

1 votes

Pour décommenter, utilisez le bloc visuel (marquez avec Ctrl+V). Une fois que la colonne avec le signe de commentaire "//" est marquée, appuyez sur "d" pour supprimer les commentaires. N'oubliez pas les commentaires C++ (/**/) aussi :)

44voto

Brian Agnew Points 143181

Pour répondre à votre première question, ce qui suit

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

cherchera foo, et entourera le motif correspondant avec bar(). Le /g fera cela plusieurs fois sur une seule ligne.

Comme vous ne faites que rechercher foo, vous pourriez simplement faire un simple :s/foo/bar(foo)/g. Ce qui précède fonctionnera, cependant, 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 ce qui précède représente ce que vous avez trouvé.

0 votes

J'avais une grande réponse longue avec des macros. C'est beaucoup plus facile :-)

0 votes

Comment faites-vous pour plusieurs lignes? Un cas pratique est lorsque vous avez un bloc de code composé de lignes similaires nécessitant cette substitution.

0 votes

Il semble vraiment que cela fonctionne pour toutes les lignes... notez le :%s et /g.

18voto

Laurence Gonsalves Points 50783

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

Une approche consiste à utiliser la sélection en bloc (mentionnée par qqn). En général, vous pouvez sélectionner une région rectangulaire avec ctrl-V suivi d'un mouvement de curseur. Une fois que vous avez surligné un rectangle, en appuyant sur shift-I, vous insérez des caractères sur le côté gauche du rectangle, ou en appuyant sur shift-A, vous les ajoutez 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 échapper.

L'autre approche consiste à utiliser une substitution (comme mentionné par Brian Agnew). La substitution de Brian affectera l'ensemble du fichier (le % dans la commande signifie "toutes les lignes"). Pour affecter seulement quelques lignes, l'approche la plus simple est d'appuyer sur shift-V (ce qui active le mode de ligne visuelle) en étant sur la première/dernière ligne, puis de passer à la dernière/première ligne. Ensuite, tapez :

:s/^/VOTRE PREFIXE/

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

Astuce supplémentaire : si votre préfixe contient des barres obliques, vous pouvez soit les échapper avec un antislash, soit utiliser un autre caractère de ponctuation 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 d'être préfixée.

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

:s/.*/PREFIXE & SUFIXE/

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

BTW: lorsque vous commentez du code, vous voudrez probablement le décommenter plus tard. Vous pouvez utiliser le bloc visuel (ctrl-V) pour sélectionner les barres obliques, puis appuyer sur d pour les supprimer, ou vous pouvez utiliser une substitution (probablement avec une sélection en ligne visuelle, effectuée avec shift-V) pour supprimer les barres obliques initiales comme ceci :

:s:// ::

6voto

: normal à la rescousse!

:%norm Wibar(

:%norm WEa)

: norme reproduit les commandes comme si vous les aviez tapées:

W - va au mot suivant

i - démarre le mode d'insertion

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

Ou en une seule ligne:

:%norm Wibar(ctrlvESCEa)

Si vous utilisez Windows, tapez ctrlq à la place de ctrlv.

3voto

Godfrey Parke Points 31

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

  • Placez le curseur n'importe où dans la première ligne 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(&)/

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

0 votes

Il devrait être m au lieu de ' pour définir un nouveau marqueur. ' est pour sauter à la ligne d'un marqueur existant. ` saute à la ligne et colonne de ce marqueur.

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