Comment ajouter du texte à la fin de chaque ligne dans Vim?

116

Dans Vim, j'ai le texte suivant:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

Je voudrais ajouter "," à la fin de chaque ligne. Le texte précédent deviendra le suivant:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

Est-ce que quelqu'un sait comment faire ça? Est-il possible d'utiliser le mode bloc visuel pour accomplir cela?

Grace Shao
la source
Question similaire ici .
glts

Réponses:

163

Cela le fera à chaque ligne du fichier:

:%s/$/,/

Si vous souhaitez créer un sous-ensemble de lignes au lieu du fichier entier, vous pouvez les spécifier à la place du fichier %.

Une méthode consiste à effectuer une sélection visuelle, puis à taper le fichier :. Il se remplira :'<,'>pour vous, puis vous tapez le reste (notez que vous n'avez qu'à ajouter s/$/,/)

:'<,'>s/$/,/
Alan Curry
la source
4
La dernière ligne a un extra ', devrait être :'<,'>s/$/,/.
cjg
pourquoi n'y a-t-il pas besoin d'un g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen
@ ThorbjørnE.K.Christensen parce que les /$/correspondances une seule fois de toute façon.
Bubaya
156

Il existe en fait un moyen de le faire en utilisant le mode bloc visuel. Une simple pression $Aen mode Bloc visuel ajoute à la fin de toutes les lignes de la sélection. Le texte ajouté apparaîtra sur toutes les lignes dès que vous appuyez sur Esc.

Voici donc une solution possible:

vip<C-V>$A,<Esc>

Autrement dit, en mode Normal, Visual sélectionnez un paragraphe vip, passez en mode Bloc visuel CTRLV, ajoutez $Aune virgule à toutes les lignes ,, puis appuyez sur Escpour confirmer.

La documentation est à :h v_b_A. Il y a même une illustration de la façon dont cela fonctionne dans la section des exemples: :h v_b_A_example.

glts
la source
1
Non, c'est Vim standard: sélectionnez quelques lignes en mode Bloc visuel (avec C-V) puis déplacez le curseur à la fin de la ligne $et ajoutez-les à toutes A. Vous allez adorer :h v_b_A, ce qui est vraiment approfondi.
glts
1
Oh, je vois ce qui se passe! J'utilise généralement Ctrl-C au lieu de <Esc> pour quitter le mode insertion, et apparemment avec Ctrl-C cela ne fonctionne pas! Tellement bizzare.
weronika le
3
Vous pouvez enregistrer une frappe en utilisant <C-V>ipà la place de vip<C-V>.
Aaron Thoma
1
@accolade, ne passe pas en mode blocage visuel de cette façon et ne fonctionnera pas. <CV> doit se reproduire après si vous le faites de cette façon.
imagineerQue
@imagineerThat, bizarre - cela fonctionne pour moi - doit être dû à une option non par défaut. (Non 'virtualedit'- j'ai testé cela.) Je confirme que cela ne fonctionne pas dans un vim propre. Merci pour la note!
Aaron Thoma
44

Une autre solution, utilisant une autre fonctionnalité intéressante:

:'<,'>norm A,

Voir :help :normal.

romainl
la source
1
@Swiss, vous aimerez ce commentaire , alors.
romainl
1
@Swiss, vous aimerez peut-être aussi l'exposé d'udioca sur :normal. J'ai trouvé ça instructif!
Conner
1
Je ne savais pas à propos de ce subreddit. Merci.
romainl
33

Le mode ex est le plus simple:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma
Ned Batchelder
la source
10

La commande de substitution peut être appliquée à une sélection visuelle. Faites un bloc visuel sur les lignes que vous souhaitez modifier et tapez :, et notez que la ligne de commande est initialisé comme ceci: :'<,'>. Cela signifie que la commande de substitution fonctionnera sur la sélection visuelle, comme ceci:

:'<,'>s/$/,/

Et c'est une substitution qui devrait fonctionner pour votre exemple, en supposant que vous voulez vraiment la virgule à la fin de chaque ligne comme vous l'avez mentionné. S'il y a des espaces à la fin, vous devrez peut-être ajuster la commande en conséquence:

:'<,'>s/\s*$/,/

Cela remplacera toute quantité d'espaces blancs précédant la fin de la ligne par une virgule, supprimant efficacement les espaces blancs de fin.

Les mêmes commandes peuvent fonctionner sur une plage de lignes, par exemple pour les 5 lignes suivantes: :,+5s/$/,/ou pour l'ensemble du tampon: :%s/$/,/.

pb2q
la source
3

Si vous voulez ajouter ',' à la fin des lignes commençant par 'key', utilisez:

:%s/key.*$/&,
kiddorails
la source
Ou :g/key/s/$/,. Voir :help :global.
romainl
2

J'ai <M-DOWN>mappé (flèche vers le bas) <DOWN>.pour que je puisse répéter la dernière commande sur une série de lignes très rapidement. avec cette cartographie, je peux:

A,<ESC>

Et puis maintenez alt tout en appuyant à plusieurs reprises pour ajouter la virgule à la fin de chaque ligne.
Cela fonctionne bien pour moi parce que cela permet un très bon contrôle sur ce que font les lignes et n'obtient pas le changement.
(J'ai également les autres flèches mappées de la même manière pour permettre une répétition facile de .)

Voici la ligne de mappage à coller dans votre vimrc:

map <M-DOWN> <DOWN>.
Sam Brinck
la source
1
:%s/$/,/g

$ correspond à la fin de la ligne

Kalhartt
la source
2
Cela ajoutera également $à la ligne, pas seulement ,.
ZyX
2
/gest utilisé pour effectuer la substitution à chaque occurrence d'une ligne. Parce qu'il n'y en a qu'un $dans une ligne, vous pouvez le déposer en toute sécurité.
romainl
Ouais mon erreur sur le, $. et le / g vient d'habbit, et oui, il est facultatif.
kalhartt
1

La macro suivante peut également être utilisée pour accomplir votre tâche.

qqA,^[0jq4@q
dvk317960
la source