Comment rejoindre une ligne sur deux dans Vim?


28

Je voudrais joindre un grand nombre (~ 1000) de lignes, mais seulement toutes les paires avec la suivante. A la main je pourrais faire

Jj

500 fois et faites-le. Cependant, comment puis-je exécuter ces deux instructions 500 fois en une seule commande? Dactylographie

500Jj

rejoindra les 500 lignes suivantes, puis descendra d'une ligne.

Exemple:

J'ai:

a
b
c
d
e
f
g
h

Je voudrais:

a b
c d
e f
g h

Edit: j'ai essayé de mapper:

:map X Jj
500X

mais apparemment, je devrais relire les documents de cartographie. Ça ne marche pas.

Réponses:


30

je ferais ceci:

  1. commencer à enregistrer une macro 'q': qqJjq

  2. relisez la macro «q» 500 fois: 500@q

(en fait, ce n'est pas une macro appelée 'q', c'est un registre nommé appelé 'q'. au lieu de remplir ce registre de manière interactive comme dans 1., vous pouvez également faire :let @q = "Jj"puis faire 2.)


Cool, merci de me souvenir des macros!
Boldewyn

:% normal J a été très rapide et facile (voir la 2ème solution supérieure ci-dessous) ... par rapport à cette solution macro qui l'exécute sur plus de 50 000 lignes
ihightower

@ihightower c'est pourquoi j'ai également voté pour cette réponse. Il y a 6 ans :)
akira

@akira votre macro vient de sauver ma journée car j'avais besoin de cette solution de macro aujourd'hui pour un but différent.
ihightower

24

Pour ce faire sur chaque ligne du fichier:

:%normal J

ou, plus court:

:%norm J

Pour ce faire, sur une partie seulement du fichier, sélectionnez les lignes avec Vou obtenez une plage d'une autre manière:

:'<,'>global/^/normal J

ou, plus court:

:'<,'>g/^/norm J

Kevin, il cherche à exécuter deux commandes sur chaque fichier, pas une seule.
JNK

1
l'utilisation des :gréponses OP besoin.
Luc Hermitte

2
Cela rejoindra en effet une ligne sur deux. Essayez!
Kevin Panko

Merci pour l' globalastuce. Dans mon cas cependant, l'enregistrement de la macro a été plus facile et plus rapide.
Boldewyn

2
Juste une supposition - il exécute la commande sur chaque ligne dans l'ordre, et après avoir fait la première ligne, la deuxième ligne a maintenant disparu (ayant été jointe à la première ligne), elle est donc obligée de passer à la troisième ligne.
Kevin Panko

9

Et ça:

:g/$/j  

ou

:g/$/j!  

et regrouper toutes les trois lignes

:g/$/j3 

1
Ceci est une TRÈS belle solution Miro. C'est encore mieux dans la mesure où vous pouvez également l'utiliser dans le standard vi, bien que de manière étrange, lorsque vous utilisez le numéro de fin dans SVR4.0 vi (comme sur Solaris) au lieu que j3 fasse 3 colonnes, il en fait 4. (vous devez donc utiliser j2 là pour le regroupement toutes les 3 lignes)
JohnGH


-1

Je ne suis pas un utilisateur de Vim, mais en vérifiant les documents en ligne, il ressemble

500(Jj) 

pourrait fonctionner car il analyse les choses entre parenthèses comme une unité.


Hm, merci pour l'essai, mais dans ma version, Vim ignore simplement les parenthèses. Pourriez-vous me dire le lien où vous avez trouvé cette syntaxe?
Boldewyn

1
vimdoc.sourceforge.net/htmldoc/syntax.html - Désolé, cela n'a pas aidé!
JNK

Vérifiez réellement ce lien: vim.org/scripts/script.php?script_id=2136 voyez si cela fait ce que vous recherchez.
JNK
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.