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 foo
avec bar(foo)
?
Je voudrais également un moyen rapide d'ajouter des //
commentaires à plusieurs lignes (commentaires de style C).
J'utilise Vim / GVim 7.2.
Réponses:
Allez au premier
foo
, appuyez sur Ctrl- vpour passer en mode de blocage visuel et appuyez sur jusqu'à ce que toutes les lignes avecfoo
soient 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.
la source
i
rien ne se passe. Lorsque j'appuie surshift+i
la sélection disparaît mais je peux insérer du texte (à l'endroit actuel où se trouve uniquement le curseur).Pour répondre à votre première question, ci-dessous
recherchera
foo
et entourera le motif correspondant avecbar()
. Le/g
fera 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 exemplef[a-z][a-z]
). Le «&» ci-dessus représente ce que vous avez trouvé.la source
:
et les
détermine les lignes sur lesquelles il opère. Rien ne signifie que la ligne actuelle.1,30
signifie les lignes 1 à 30 (incluses).'<,'>
désigne les lignes de la sélection visuelle actuelle.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:
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:
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:
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:
la source
: normal à la rescousse!
: norm (al) rejoue les commandes comme si vous les aviez tapées:
Ou en une seule ligne:
Si vous utilisez Windows, tapez à la ctrlqplace de ctrlv.
la source
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.
:'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.
la source
m
au 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.Une autre expression régulière simple est:
la source
Pour les commentaires de style C, utilisez la réponse rationnelle de Brian, faites correspondre la fin de la ligne
$
et insérez-la.la source