comando vim per ristrutturare / forzare il testo su 80 colonne


240

So che ci sono modi per impostare automaticamente la larghezza del testo in vim usando set textwidth(come i problemi di layout delle colonne di Vim 80 ). Quello che sto cercando è qualcosa di simile a =(il comando della riga del rientro) ma per concludere con 80. Il caso d'uso è a volte si modifica il testo con la larghezza del testo e dopo aver unito le linee o eliminato / aggiunto il testo risulta scartato.

Idealmente, questo comando riorganizzerebbe completamente le linee selezionate e taglierebbe le linee lunghe aggiungendole a quelle corte. Un esempio:

long line is long!  
short

Dopo aver eseguito il comando (supponendo che l'avvolgimento fosse 13 cols):

long line is  
long! short

Se ciò non è possibile con un vero comando vim, forse esiste un programma a riga di comando che fa ciò a cui posso inoltrare l'input?

Dopo aver cercato ho trovato questo riferimento che ha alcune altre opzioni: http://www.cs.swarthmore.edu/help/vim/reformatting.html


9
Potresti anche essere interessato a sapere che Vim può delegare la formattazione del testo a un programma esterno, come il par . Ho realizzato uno screencast che dimostra come formattare il testo con il par .
nelstrom,

@nelstrom grazie, TIL circa par. È fantastico!
Steven Lu,

2
Quando vuoi che il testo appaia sottile e tagliato (ben tagliato?), Pensa sempre a gq: Gentleman's Quarterly . (Scuse per il maschio antropomorfizzante, ma le opere mnemoniche.)
Ruffin,

Risposte:


372

Impostare textwidthsu 80 ( :set textwidth=80), spostarsi all'inizio del file (può essere fatto con Ctrl- Homeo gg) e digitare gqG.

gqGformatta il testo a partire dalla posizione corrente e fino alla fine del file. Unirà automaticamente le righe consecutive quando possibile. È possibile posizionare una riga vuota tra due righe se non si desidera che queste due vengano unite.


14
E funziona anche con selezioni visive. Vale a dire qualcosa come: V}gq. In questo modo vedi cosa stai per formattare prima di formattarlo.
Plouff,

6
A proposito, cosa fa esattamente qda solo?
Richard-Degenne,

1
C'è un modo per farlo con linee che sono solo una lunga serie di caratteri, senza spazi? EDIT: ho scoperto l'utilità "fold". Mi chiedo ancora di farlo in vi.
Donald Smith,

7
usare set tw=80invece di set textwidth=80risparmiare tempo
Yibo Yang

4
@dmranck Dopo che le set textwidth=76tue righe si scaricano automaticamente durante la digitazione. La mia lamentela è che non fa nulla per la modifica delle linee esistenti. Ma V}gqè estremamente utile al riguardo. Ventra nella modalità di selezione visiva, }seleziona fino all'interruzione di paragrafo successiva ed gqesegue il formatter corrente su di esso (o usa gwper chiamare esplicitamente il formatter vi). Inoltre, {selezionerà verso l'alto. Puoi selezionare l'intero documento e il formato ggVGgqanche se forse c'è un modo più semplice. Salvalo come macro usando @per renderlo più semplice. Utilizzare vipgqper visualizzare il paragrafo corrente.
ktbiz,

94

La soluzione di Michael è la chiave, ma molto spesso trovo che voglio riformattare il resto dell'attuale paragrafo; per questo comportamento, utilizzare gq}.


17
espandendoti su questo - puoi usare gq <motion> per formattare ciò che desideri.
Dan Schnau,

1
Inoltre, l'opzione 'nojoinspaces' che impedisce la visualizzazione di due spazi dopo i periodi in cui le linee sono unite a una frase. Buono quando il tuo stile tipografico è spazi singoli tra le frasi in inglese.
Alex Hirzel,

36

È possibile utilizzare gqcon qualsiasi operatore di movimento. Ad esempio, se si desidera riformattare solo fino alla fine della riga corrente (ovvero per avvolgere la riga su cui si trova il cursore) è possibile utilizzaregq$

Puoi anche riformattare selezionando il testo in modalità visiva (usando `v e spostando) e quindi digitando gq.

Ci sono altre opzioni per forzare anche le linee da avvolgere.

Se vuoi che vim avvolga le tue linee mentre stai inserendo del testo in esse invece di dover aspettare fino alla fine per ristrutturare il testo, troverai utili queste opzioni:

:set textwidth=80
:set wrapmargin=2

(Non farti seguire da wrape linebreak, che riformatta solo il testo visualizzato sullo schermo e non modifica il testo nel buffer)


9
Dalla guida wrapmargin: quando "textwidth" è diverso da zero questa opzione non viene utilizzata.
Mmoya,

21

Grazie a un commento di DonaldSmith l'ho trovato, in quanto l' textwidthopzione non ha riformattato la mia lunga riga di testo (stavo convertendo giocando con conversioni esadecimali):

:%!fold -w 60

Ciò ha riformato l'intero file (che era una riga per me) in righe di lunghezza 60.


1
Questo è molto carino. Tutte le risposte si concentrano sulla limitazione della larghezza di una linea quando una linea viene suddivisa in spazi in parole. Questa soluzione funziona per parole molto lunghe (sequenze di DNA).
Pedrosaurio,

1
Per lunghi URL si tratta dell'unica cosa che ho trovato che funziona. Ho già parlato della larghezza del testo ma non romperà le stringhe ininterrotte (che di solito è una buona cosa)
SkyLeach

13

Se stai cercando un modo non Vim , ci sono sempre i comandi UNIX fmt e par .

Appunti:

  • Non posso commentare Unicode, potrebbe o meno comportarsi diversamente.
  • @nelstrom ha già menzionato l'uso parnel suo webcast.

Ecco come utilizzeremo entrambi per il tuo esempio.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Per utilizzare dall'interno di Vim:

:%! fmt -w 13
:%! par 13gr

È inoltre possibile impostare :formatprgsu par o fmt e sovrascrivere gq. Per ulteriori informazioni, chiama :help formatprgall'interno di Vim.


9

Quasi sempre lo uso gqin modalità visiva. Dico ai miei studenti che sta per "Gentlemens 'Quarterly", una rivista per persone esigenti.

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.