Posso giustificare il testo in Vim?


38

L'unico motivo per cui avrei mai modificato un file di testo in Pico o Nano e non in Vim era il suo comando "Giustifica" ^J. Riformattarebbe un paragrafo di testo, creando interruzioni di riga in corrispondenza delle interruzioni di parole in modo che il testo fluttui correttamente su uno schermo a larghezza fissa - formatta il testo per adattarlo a 80 colonne predefinite, creando interruzioni di riga solo tra le parole. Per quanto limitata fosse la funzione, era molto utile se formattare lunghi blocchi di commenti, file di documentazione o semplicemente sostituire una linea infinita di parametri con qualcosa di più leggibile.

Posso fare qualcosa del genere in Vim?

Risposte:


37

È possibile utilizzare gli operatori gqo in gwcombinazione con un comando di movimento. Per impostazione predefinita, utilizza il fmtprogramma (in Linux) per formattare il testo specificato. Tuttavia, per quanto ne sappia, non giustifica le linee, quindi otterrai margini corretti.

Il modo in cui lo uso è gwip(modalità normale) con il cursore su un paragrafo. Questo formatterà il paragrafo corrente mantenendo il cursore nella stessa posizione. Lo uso in questo modo per assicurarmi che sia formattato solo il paragrafo corrente. Quando si modifica un file di testo, l'emissione gwG(modalità normale) all'inizio del file formatterà l'intero testo. Come buona prassi, assicurarsi di lasciare almeno una riga vuota tra i paragrafi.

C'è molta configurazione che può essere fatta. Per cominciare, ecco qualche aiuto rilevanti: :h gq, :h gw, :h fo(opzioni di formato), :h fp(programma di formattazione), :h fo-table(una spiegazione delle possibili opzioni).


1
gq / gw è sicuramente la strada da percorrere. per aggiungere a questo messaggio è possibile modificare il formato del programma alla pari per avere più opzioni. Acquista vimcasts.org/episodes/formatting-text-with-par
Bambu

3
Per impostazione predefinita, Vim non utilizza alcun programma esterno, sebbene sia possibile scegliere di utilizzarne uno impostando l' 'formatprg'opzione.
Jamessan,

15

C'è un ottimo VimCast su questo argomento.

http://vimcasts.org/episodes/formatting-text-with-par/

Fondamentalmente, è necessario installare par:

$ brew install par
# or
$ sudo apt-get install par

E poi, poiché vuoi che le colonne siano avvolte in 80 colonne:

:set formatprg=par\ -w80

Ora puoi usare l' gqoperatore, come in altre risposte (ad es. gqip), E utilizzerà Par invece del formatter incorporato di Vim.

Par è piuttosto avanzato e formatterà i commenti in questo modo:

/* This is a long */
/* multiline comment */

11

Da :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Quindi, tutto ciò che devi fare è correre

:ru macros/justify.vim

e quindi digitare

_j

per giustificare il testo nell'intero file.

(Naturalmente, potresti anche aggiungere ru macros/justify.vimal tuo .vimrc in modo da non doverlo digitare ogni volta.)

Nota : questo non aggiunge interruzioni di linea per te. Devi aggiungere quelli manualmente con gq. Per questo è necessario anche impostare textwidth(il valore predefinito è 0) sul valore desiderato tramite

set textwidth=80

e — se vuoi — lo spostamento automatico del testo impostando t-flag via

set formatoptions+=t

Se vuoi, puoi impostare una mappatura nel tuo .vimrc per fare tutto per te:

nnoremap <C-j> gggqG_j

Questo si sposta all'inizio del file ( gg), avvolge tutte le righe ( gqfino a G) e quindi _jutilizza il testo.


Per uno sguardo più attento alla formattazione, consultare: MANUALE UTENTE VIM - Modifica del testo formattato
Suuuehgi

Ho appena trovato l' :set fo+=aopzione molto utile per la riformattazione automatica dell'intero paragrafo. Dai un'occhiata ad :help fo-tablealtre opzioni. C'è anche un bel video tutorial qui .
Suuuehgi,

+1 per una soluzione completamente integrata. La _jmappatura aggiunta dalla macro sembra giustificare l'intero file per me, oppure può essere limitata con una selezione visiva lineare.
ches

5

Mentre l'aiuto di nano chiama il ^Jcomando "Giustifica" in realtà non giustifica il testo, ma riformatta il testo spezzando le linee prima del margine destro dello schermo (o in una colonna configurabile, immagino).

Puoi fare la stessa cosa in VIM impostando la variabile textwidth, da :help 'textwidth':

Larghezza massima del testo che viene inserito. Una linea più lunga verrà interrotta dopo lo spazio bianco per ottenere questa larghezza. Un valore zero lo disabilita.

Vale a dire: durante la digitazione, se una linea è più lunga dei textwidthcaratteri, VIM avvolgerà la linea nel primo spazio per mantenere la lunghezza della linea inferiore o uguale textwidth.

Affinché ciò funzioni, l'opzione formatoptionsdeve contenere la lettera t. Vedi :help 'formatoptions'e :help fo-tableper le opzioni disponibili, ad esempio potresti essere interessato call'opzione per far funzionare la formattazione con i commenti.

Edit : è possibile eseguire la stessa operazione, senza la necessità di mettere tin formatoptions, utilizzando il comando gw{motion}, si formatta il testo tra la posizione corrente del cursore e la posizione del cursore dopo {motion}. Il gwcomando è disponibile anche in modalità visiva, formatta il testo selezionato.


1
Va bene per scrivere. Posso applicarlo per il testo preesistente?
SF.

3

Ecco due semplici opzioni:

  1. con un blocco di testo selezionato, digitare !fmt
  2. con il cursore all'inizio di un blocco, digitare !}fmt

Entrambi inviano un blocco di testo a unix fmt, vedere man fmtper le opzioni. Puoi passare gli argomenti delle opzioni da vim. Ad esempio, per formattare un blocco largo 50 caratteri, digitare !}fmt -w 50.


scusatemi, risolto ora
Kaan

Puoi anche formattare l'intero file digitando :%!fmte annullando con un singolo use non ti piace il risultato.
Wildcard il

-1

Contrassegna il testo utilizzando il comando visivo, quindi usa:

:!par 40j 

dove 40 è la larghezza della colonna e jsignifica giustificare.


2
Benvenuti nel nostro sito! La tua domanda è attualmente di bassa qualità perché manca di spiegazioni sullo strumento che stai utilizzando ( par) e sul perché la tua soluzione funzioni. Potresti voler aggiungere ulteriori dettagli per migliorare la qualità della tua risposta e renderla più utile per i futuri lettori.
statox
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.