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

91

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 possible de non seulement préfixer bar(mais en réalité Surround fooavec bar(foo)?

Je voudrais également un moyen rapide d'ajouter des //commentaires à plusieurs lignes (commentaires de style C).

J'utilise Vim / GVim 7.2.

Allen
la source
1
Les commentaires de style C sont / * * / Les commentaires de style BCPL sont //
William Pursell

Réponses:

169

Allez au premier foo, appuyez sur Ctrl- vpour passer en mode de blocage visuel et appuyez sur jusqu'à ce que toutes les lignes avec foosoient marquées. Appuyez ensuite sur Shift- ipour 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 sur Ctrl- v, déplacez-vous vers le haut / bas pour marquer toutes les lignes affectées, puis appuyez sur Endou $pour étendre la sélection jusqu'à la fin des lignes. Vous pouvez maintenant appuyer sur Shift- apour 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 normal. Donc, pour commenter un bloc entier en C, vous pouvez passer à l'accolade ouvrante et taper Ctrl- v % Shift- i // Esc.

qc
la source
5
Juste un ajout: si Ctrl-V ne démarre pas le mode bloc visuel dans Vim sous Windows, il faut utiliser Ctrl-Q à la place.
Paul
3
Une variante de la réponse est alors de marquer le bloc visuel avec shift + V puis de modifier le bloc en mode ex:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / Note que "'< , '> "est imprimé automatiquement par vim lorsque vous appuyez sur": ".
dimba
1
Pour décommenter, utilisez le bloc visuel (marquez avec Ctrl + V). Une colonne avec le signe de commentaire "//" est marquée, appuyez sur "d" pour supprimer les commentaires. n'oubliez pas les commentaires C ++ (/ ** /) aussi :)
dimba
9
Il est intéressant de noter que sous Linux, j'ai dû sortir du mode Insertion avant que le préfixe ne soit appliqué à toutes les lignes, et c'est un capital dont j'avais besoin pour passer en mode insertion à partir du mode visuel - c'est-à-dire Shift + I, préfixe de type, Escape, Escape.
Joshua Enfield
6
Cela ne fonctionne pas sur le mastic. Quand j'appuie, irien ne se passe. Lorsque j'appuie sur shift+ila sélection disparaît mais je peux insérer du texte (à l'endroit actuel où se trouve uniquement le curseur).
Jürgen Paul
44

Pour répondre à votre première question, ci-dessous

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

recherchera fooet entourera le motif correspondant avec bar(). Le /gfera cela plusieurs fois en une seule ligne.

Puisque vous ne faites que correspondre foo, vous pouvez 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 exemple f[a-z][a-z]). Le «&» ci-dessus représente ce que vous avez trouvé.

Brian Agnew
la source
J'ai eu une grande réponse longue avec des macros. C'est beaucoup plus facile :-)
Brian Ramsay
Comment faites-vous pour plusieurs lignes? Un cas pratique est celui où vous avez un bloc de code composé de lignes similaires qui nécessitent cette substitution.
Cela semble bien fonctionner sur toutes les lignes ... notez les:% s et / g.
ojrac
ce qui est intéressant, c'est que:% s / foo / bar (&) / gc ne confirme pas - 'c' n'a aucun effet..Ugh
1
Le texte entre le :et le sdétermine les lignes sur lesquelles il opère. Rien ne signifie que la ligne actuelle. 1,30signifie les lignes 1 à 30 (incluses). '<,'>désigne les lignes de la sélection visuelle actuelle.
rampion
17

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 qc). En général, vous pouvez sélectionner une région rectangulaire avec ctrl-Vsuivi du déplacement du curseur. Une fois que vous avez mis en surbrillance un rectangle, appuyez sur shift-Ipour insérer des caractères sur le côté gauche du rectangle ou shift-Ales ajouter 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 le fichier entier (le% dans la commande signifie "toutes les lignes"). Pour n'affecter que quelques lignes, l'approche la plus simple consiste à frapper shift-V(qui active le mode ligne visuelle) sur la première / dernière ligne, puis à passer à 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é automatiquement avant le s. 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 modèle au lieu de ^ et votre chaîne sera ajoutée au lieu de pré-suspendue.

Si vous souhaitez ajouter un préfixe et un suffixe simultanément, 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), 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 visual-block ( 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 de ligne visuelle, faite avec shift-V) pour supprimer les barres obliques comme ceci:

:s:// ::
Laurence Gonsalves
la source
6

: 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 insertion

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

Ou en une seule ligne:

:%norm Wibar(ctrlvESCEa)

Si vous utilisez Windows, tapez à la ctrlqplace de ctrlv.

Cyber ​​Oliveira
la source
3

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
  • É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 l'arrêt sont séparés par de nombreux écrans.

Godfrey Parke
la source
Il devrait être mau lieu de 'définir un nouveau marqueur. 'est pour sauter à la ligne d'un marqueur existant. `saute à la ligne et à la colonne de ce marqueur.
tiktak
1

Une autre expression régulière simple est:

%s/^/<text you want to prepend>/
Artorias2718
la source
0

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

maxwellb
la source