Come unire ogni seconda riga in Vim?


28

Mi piacerebbe unire un sacco (~ 1000) di linee, ma solo ogni dispari con il prossimo. A mano ho potuto fare

Jj

500 volte e ce l'ho fatta. Tuttavia, come posso eseguire queste due istruzioni 500 volte in un singolo comando? Digitando

500Jj

si unirà alle successive 500 linee e poi si sposta in basso di una riga.

Esempio:

Io ho:

a
b
c
d
e
f
g
h

Voglio:

a b
c d
e f
g h

Modifica: ho provato a mappare:

:map X Jj
500X

ma apparentemente dovrei leggere di nuovo i documenti di mappatura. Non funziona

Risposte:


30

farei questo:

  1. inizia a registrare una macro 'q': qqJjq

  2. riprodurre la macro 'q' 500 volte: 500@q

(in realtà non è una macro chiamata 'q', è un registro chiamato 'q'. Invece di riempire interattivamente quel registro come in 1., potresti anche fare :let @q = "Jj"e poi fare 2.)


Bene, grazie per avermi ricordato le macro!
Boldewyn,

:% normale J è stato molto semplice e veloce (vedi la seconda soluzione in alto di seguito) ... rispetto a questa soluzione macro che la esegue su oltre 50.000 linee
ihightower

@ihightower è per questo che ho votato anche quella risposta. 6 anni fa :)
Akira,

@akira la tua macro mi ha appena salvato la giornata poiché avevo bisogno solo di questa soluzione macro oggi per uno scopo diverso.
ihightower,

24

Per fare ciò su ogni riga del file:

:%normal J

o, più breve:

:%norm J

Per fare ciò solo su una parte del file, selezionare le linee con Vo ottenere un intervallo in altro modo:

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

o, più breve:

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

Kevin sta cercando di eseguire due comandi su ogni file, non solo uno.
JNK,

1
l'uso delle :grisposte OP necessita.
Luc Hermitte,

2
Questo in effetti si unirà ad ogni seconda riga. Provalo!
Kevin Panko,

Grazie per il globaltrucco. Nel mio caso, tuttavia, la registrazione della macro è stata più semplice e veloce.
Boldewyn,

2
Solo un'ipotesi: esegue il comando su ogni riga in ordine, e dopo aver eseguito la prima riga, la seconda riga è scomparsa (essendo stata unita alla prima riga), quindi è costretta a passare alla terza riga.
Kevin Panko,

9

Che dire di questo:

:g/$/j  

o

:g/$/j!  

e raggruppa ogni tre righe

:g/$/j3 

1
Questa è una soluzione MOLTO bella Miro. È anche meglio che puoi usarlo anche nello standard vi, anche se stranamente, quando usi il numero finale in SVR4.0 vi (come su Solaris) invece di j3 facendo 3 colonne ne fa 4. (quindi devi usare j2 lì per raggruppare ogni 3 righe)
JohnGH,


-1

Non sono un utente di Vim, ma sembra che stia verificando i documenti online

500(Jj) 

potrebbe funzionare poiché analizza le cose all'interno delle parentesi come unità.


Hm, grazie per il tentativo, ma nella mia versione Vim ignora solo le parentesi. Potresti dirmi il link dove hai trovato questa sintassi?
Boldewyn,

1
vimdoc.sourceforge.net/htmldoc/syntax.html - Mi dispiace, non ha aiutato!
JNK,

Veramente controlla questo link: vim.org/scripts/script.php?script_id=2136 vedi se fa quello che cerchi.
JNK,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.