riavvolgere automaticamente le righe quando si scrive markdown in VIM


10

Molto spesso, scrivo il markdown in VIM e ci saranno dei paragrafi in questi markdown. Per aiutare la mia modifica, ho impostato il mio Vim per avvolgere una riga su 80 caratteri. Funziona bene se continuo a scrivere, ma il problema è che se devo fare qualche correzione, diventa molto fastidioso.

demo (tratto dalla logica del primo ordine di Wikipedia):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

Fin qui tutto bene. Ma quando rivedo l'articolo, potrei decidere di aggiungere qualcosa nel mezzo, dire:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

nota la riga 3 è quella che voglio avvolgere. Se lo faccio in VIM, dovrò unire manualmente le linee e ricoprire l'intero paragrafo.

Qualcuno ha idea di come fare VIM farlo automaticamente?

Risposte:


6

Ancora più semplice: il aflag per 'formatoptions'abilita la formattazione automatica dei paragrafi ogni volta che il testo viene inserito o eliminato. Vedi i :help fo-tabledettagli sulle 'formatoptions'bandiere e :help autoformat.

:set formatoptions+=a

gqe gwformatterà le linee su cui si sposta il seguente movimento.

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

La differenza tra i due è che gqlascerà il cursore sul primo non vuoto dell'ultima riga formattata. gwriporterà il cursore dove è iniziato.

Puoi facilmente riavvolgere manualmente il paragrafo in cui si trova attualmente il cursore gwapo l'intero documento gggwG, anche se ciò sposterà il cursore grazie al segno iniziale gg.

Con un autocommand, puoi fare in modo che la formattazione avvenga automaticamente. Ecco un esempio che formatta il paragrafo corrente quando si esce dalla modalità di inserimento:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

Esistono altri trigger di autocommand che potresti trovare lavoro migliore per te. Puoi esplorare le opzioni sotto :help autocmd-events. Quelle più rilevanti sono probabilmente nella sottovoce "varie".


una sola parola: geniale!
Jason Hu

1

Vorrei dare un'occhiata :help 'textwidth'. Si interromperà automaticamente le righe durante la digitazione. Tuttavia, questo non funziona se stai modificando il centro di una linea.

Personalmente preferisco lasciar textwidthperdere, quindi ho creato una funzione che si unirà automaticamente e dividerà un paragrafo. (Fondamentalmente auto formattarlo a 80 caratteri) Sembra così:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

Ho quindi una mappatura per chiamarla ogni volta che ne ho bisogno:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

Questa funzione è formatoptions+=jrperfetta anche per la formattazione dei commenti nel codice! Posiziona il cursore sulla prima riga più lunga di 80 caratteri e chiama la funzione.

(Nota: non ho reso generale questa funzione per fare lunghezze diverse da 80, ma penso che devi solo cambiare gli 80 e gli 81 se vuoi renderlo qualcos'altro)

Vedi :help 'textwidth'e :help 'formatoptions'per maggiori informazioni.


Grazie per la tua condivisione Mentre controllo l'impostazione, non viene formattata automaticamente durante la digitazione, giusto? Se è così, allora è ancora una soluzione non ottimale, no?
Jason Hu

textwidthsi formatterà automaticamente durante la digitazione. La mia funzione no. Preferisco controllare quando vim avvolge le cose, quindi funziona per me. Ma se stai specificatamente cercando un formattatore mentre digiti, sì; non si adatta perfettamente al tuo flusso di lavoro.
Tumbler41

1

Per completezza, vorrei menzionare l'opzione basata su plugin.

Se usi qualcosa come ALE che supporta l'esecuzione dei tuoi buffer attraverso un estetista al momento del salvataggio, potresti lasciare che Prettier gestisca il riavvolgimento del codice.

L'ho realizzato inserendo questo ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... e inserendo questo ~/.vimrc:

let g:ale_fix_on_save = 1
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.