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?


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/$/,/

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.


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


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

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/$/,/.


3

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

:%s/key.*$/&,

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>.

1
:%s/$/,/g

$ correspond à la fin de la ligne


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.