Unisci le linee all'interno dei paragrafi in vim


13

Supponiamo di aver digitato un lungo documento in vim con l'interruzione di riga automatica attivata, quindi tutte le righe sono state interrotte, diciamo, a 79 caratteri. Potresti anche aver applicato la formattazione all'intero documento per interrompere tutte le linee a quella lunghezza.

I paragrafi sono delimitati nel documento da righe vuote.

Ora decidi di non voler interrompere affatto le righe all'interno dei paragrafi.

Come è possibile rimuovere tutte le interruzioni di riga all'interno dei paragrafi senza eliminare del tutto i confini del paragrafo?

Ho fatto questo trucco rapido e idiota, ma sto cercando il modo giusto.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks

ehi, non bussare se la tua soluzione funziona e la tua soluzione funziona.
pdwalker,

Risposte:


12

Penso che questo faccia quello che vuoi: assicurati che ci sia una riga vuota alla fine del file, quindi unisci ogni paragrafo (terminato da una riga vuota).

G:a

.
:g/^./ .,/^$/-1 join

Spiegazione: prima vai alla fine del file e aggiungi una riga vuota in più :a(forse c'è un modo più elegante per farlo; in modo interattivo, puoi sostituire le prime tre righe con o<ESC>). Quindi, per ogni riga non vuota che non è stata ancora considerata ( :g/^./), applica il joincomando all'intervallo che inizia dalla riga selezionata ( .) e termina una riga prima della successiva riga vuota ( /^$/-1).

Facoltativamente, :g/^$/dse non si desidera che rimanga alcuna riga vuota (è possibile rimuovere -1).


Grazie. Questo mi sta avvicinando molto, tuttavia, sta eliminando le righe vuote tra i paragrafi. (Ho provato fileformat unix e dos per vedere se era una cosa di Windows). Inoltre, potresti tradurre un po 'i comandi? G va all'ultima riga. : un secondo aiuto è "append" ma non sono sicuro di cosa faccia. Anche il g / pattern / cmd che hai lì mi ha perso. Qual è il comando?
Dggoldst,

@dggoldst: ho modificato il comando per conservare le righe vuote. Le prime tre righe servono solo per aggiungere una riga vuota alla fine del file (altrimenti l'ultimo paragrafo non verrà abbinato). L'ultimo comando è :g, che applica un comando a tutte le righe corrispondenti; vedi :help :ge forse questo thread su come :gsi comporta quando elimini le interruzioni di riga .
Gilles 'SO- smetti di essere malvagio' il

:$pu _ alla fine metti il ​​registro del buco nero, che si traduce in una riga vuota alla fine.
SergioAraujo,

12

Questo dovrebbe farlo:

:set tw=99999
gggqG

twè impostato su un valore almeno pari al numero di caratteri nel paragrafo più lungo. ggsposta il cursore sulla prima riga; gqè il comando per riformattare; Gsposta il cursore sull'ultima riga, dicendo gqdi riformattare dalla posizione corrente del cursore all'ultima riga.


5
  1. Posiziona il cursore all'interno del paragrafo desiderato

  2. Genere: vipJ

( vipevidenzia il paragrafo corrente, Junisce tutte le righe)


2

Potrebbe non essere il modo più pulito per farlo, ma ecco cosa vorrei usare:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Funziona in VIM 7.2. )

A seconda di come i paragrafi sono stati divisi quando sono stati originariamente formattati, potresti voler sostituire il gJcomando (unisci senza spazi) con il Jcomando (unisci con spazi).

Il 999conteggio arbitrario deve essere almeno il numero di paragrafi nel file: è possibile selezionare un numero maggiore se si desidera e non si perde altro che i cicli del processore. Supponendo una e una sola riga vuota tra i paragrafi, è possibile ottenere un conteggio dei paragrafi più accurato utilizzando:

:%s/^$//gn     # returns "999 matches on 999 lines"

Questo funziona per me. Sarebbe bene aggiungere un "gg" all'inizio per posizionare il cursore nella parte superiore del file. Inoltre, l'uso di J invece di gJ non causa la fusione di parole separate in una sola. Questo potrebbe essere solo il caso dei miei valori di "formatoptions", che attualmente mi stanno sconcertando.
Dggoldst,
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.