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.

Boldewyn
la source

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

akira
la source
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 Panko
la source
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 
Miro
la source
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
0

On peut aussi jouer avec:

'<,'>g//s/.*\zs\n\ze.*/ /
Luc Hermitte
la source
-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é.

JNK
la source
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