In VIM, come faccio a spezzare una linea davvero lunga in più linee?


170

Supponiamo che io abbia una linea super lunga nell'editor VIM (diciamo circa 300+ caratteri). Come lo spezzerei in più righe in modo che i confini delle parole si spezzino all'incirca a 80 caratteri?

Esempio:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

per

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...

Risposte:


254

Vim lo fa molto facilmente (rompere le linee ai confini delle parole).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Ti suggerirei di dare un'occhiata :help gqe :help gw.

Anche l'impostazione di textwidth ( tw) ti darà l'interruzione di linea automatica quando viene superata durante la digitazione. Viene utilizzato gqanche in, anche se disabilitato si gqrompe sulla dimensione della finestra o 79 a seconda di quale viene per primo.

:set tw=80

Impostando le opzioni di formato per includere la larghezza del testo, vim si interromperà automaticamente all'impostazione tw.

:set fo+=t

5
Quindi, nel tuo caso, il gqcomando sarebbe <ESC>(esci dalla modalità Inserisci / Sostituisci / etc), quindigq80l
MidnightLightning

6
Questo è l'opposto di Ctrl + j (combina più righe in una).
Yzmir Ramirez,

9
Vim non smette mai di stupirmi. Questo è oro puro.
Jondlm,

10
solo per la prossima persona che lo trova, gq non dividerà solo una riga di testo solido, ha bisogno di spazi bianchi per fare le sue cose
stringy05

2
[corre gqq] aaaahhh, è bellissimo
underscore_d

85

Innanzitutto imposta il tuo vim in modo che capisca che vuoi 80 caratteri:

:set tw=80

quindi, hilight la linea:

V

e fare in modo che VIM lo riformatta:

gq

17

Questo non è realmente correlato a VIM, ma potresti usare il programma fmt come in

$ fmt myfile

38
:%! fmt% "Può renderlo relativo a Vim :)
Maxim Sloyko il

2
Utile per vi, anche se preferirei gqq su vim.
WhyNotHugo

13

Per linee continue di testo, evidenziare l'area usando v in modalità normale, quindi premere

:s/\v(.{80})/\1\r/g

Ciò aggiungerà una nuova riga alla fine di ogni 80 ° carattere.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline

Questa è l'unica soluzione che ha funzionato per una lunga stringa base64.
jviotti,

6

Se sei su * nix probabilmente hai a folddisposizione.

Seleziona la regione che desideri utilizzare v, quindi puoi interrompere gli spazi con larghezza 80 utilizzando:

!fold --spaces --width=80

Questo è essenzialmente uguale all'utilizzo gq .

Tuttavia, se vuoi solo rompere con il personaggio 80 e non essere limitato agli spazi bianchi puoi usare:

!fold --width=80

Se lo vuoi con un solo tasto, basta impostare una mappatura - l'ho usato

vmap <f1> !fold --width=80<CR>


Questa è la risposta che funziona per stringhe lunghe non separate da spazi bianchi. Tuttavia, su macOS potresti dover usare gfold invece di fold.
Aaron D,

su mac os, dovevo farlo! fold -w 80
user674669

5

Per dividere le righe lunghe nel documento completo senza rimuovere le interruzioni di riga già presenti, utilizzare:

:set formatoptions+=w
:set tw=80
gggqG

4

Avevo bisogno di riformattare un intero file piuttosto che una riga. Come Wernsey sottolinea, avrei potuto usare 'fmt', ma la seguente sequenza in vim ha fatto anche il trucco (prendendo in prestito dalle varie risposte qui):

<ESC>
:setl tw=80 fo=t
1GVGgq

3

Come veloce e sgradevole, forse prova la seguente mappa:

map q 080lwbels<CR><ESC>

che dice:

  • iniziare una 0a posizione della linea,
  • passa all'80 ° carattere a destra,
  • vai all'inizio della parola successiva,
  • torna alla parola precedente,
  • vai alla fine della parola corrente,
  • vai a destra un carattere e
  • sostituire un CR per quel carattere.

Quindi premere q e CR spezzerà l'allineamento in blocchi sul confine della parola.


-1

Ho inserito manualmente '\' (e quindi CR / tab per formattare) in ogni LONGLINE dopo l'ultimo spazio bianco ma prima della colonna 80. Vale a dire:

1 this is a long, long, line

ora sembra

1 this is a long, \
        long line

e compila normalmente.

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.