Impostazione della larghezza del testo specifica del numero di riga


9

Uso gvim per scrivere e-mail e uso tw=72per spezzare le righe. Ora modifico anche le intestazioni di base della posta nello stesso documento, ad esempio sto aggiungendo destinatari alla mia posta. Ora con tw=72esso si rompe anche ogni volta dopo 72 caratteri.

Come posso impostare tw=0le prime 4 righe (questa è la parte dell'intestazione) e tw=72per il resto del documento?

Le mie formati sono simili a questo, se è rilevante:

set fo+=tcqn

textwidthviene applicato all'intero buffer.
romainl

3
Vedi anche: Impedisci a Vim di interrompere i collegamenti a metà tag nel markdown . È possibile utilizzare una soluzione simile per le e-mail, controllando se line('.') < 5o controllando se la riga inizia con un'intestazione di posta elettronica (ad es From: . To: , Ecc.).
Martin Tournoij,

@Carpetsmoker Grazie mille, questa è stata la chiave della soluzione. Ho aggiunto la mia risposta completa con le modifiche necessarie.
mxmehl,

Risposte:


6

Grazie al commento di @ Carpetsmoker sulla mia domanda, sono stato in grado di risolverlo esattamente come volevo.

Con la seguente funzione in .vimrc (o nel mio caso in un file speciale che è stato caricato solo durante la modifica delle mie e-mail), tw è impostato su 500 se il numero di riga è inferiore a 5, altrimenti è 72. Con au CursorMovedIquesto viene controllato ogni volta che il cursore si sposta.

" Set tw to 500 if in the first 4 lines, else 500
au CursorMovedI * call ModifyTextWidth()   " execute when cursor has moved, use for all files
function! ModifyTextWidth()
    if line('.') < 5               " if line number smaller than 5
        setlocal textwidth=500     " use high tw setting
    else
        setlocal textwidth=72      " Otherwise use normal textwidth
    endif
endfunction

Se qualcuno prevede di implementarlo, considera di sostituire il carattere jolly au CursorMovedI *con un percorso fisso o un suffisso di file.


4

Un'alternativa più solida alla risposta di mxmehl.

Se usi filetype=mailVim, evidenzierai le intestazioni per te:

inserisci qui la descrizione dell'immagine

Possiamo usare le informazioni sulla sintassi per determinare se una riga è un'intestazione e impostare la larghezza del testo di conseguenza.

Il nome della sintassi delle intestazioni sono mailHeaderKey, mailSubject, mailHeaderEmail, e mailHeader. L'ho scoperto guardando /usr/share/vim/vim74/syntax/mail.vim.

Il motivo per cui preferisco questa soluzione è che non dipende da numeri di riga arbitrari, ma che funziona altrettanto bene per le e-mail con un'intestazione e venti intestazioni.

augroup filetypes
    autocmd!

    autocmd FileType mail call s:mail()
augroup end

" Set up ft=mail
fun! s:mail()
    augroup ft_mail
        autocmd!
        autocmd CursorMoved,CursorMovedI *
            \  if index(["mailHeaderKey", "mailSubject", "mailHeaderEmail", "mailHeader"], synIDattr(synID(line('.'), col('.'), 1), 'name')) >= 0
            \|     setlocal textwidth=500
            \| else
            \|     setlocal textwidth=72
            \| endif
    augroup end
endfun

2

Puoi farlo usando autocmds. Potresti includerli nel tuo vimrc, ma di solito è meglio includerli in un tipo di file, come spiegato qui .

Quindi è possibile utilizzare quanto segue:

augroup headerTw
   au!
   autocmd InsertEnter <buffer>
            \ if line('.') < 5 |
            \    setl tw=0 |
            \ endif
   autocmd InsertLeave <buffer>
            \ if line('.') < 5 |
            \    setl tw=72 |
            \ endif
augroup END

Se si preferisce utilizzarlo senza un plug-in di tipo di file, è necessario sostituirlo <buffer>con un modello di file.

L'idea è quella di cambiare 'textwidth'quando si accede alla modalità di inserimento e ripristinarla quando la si lascia.

Se di solito navighi nel testo mentre sei in modalità di inserimento (es: usando i tasti freccia) puoi migliorarlo in base al link menzionato da @Carpetsmoke: Impedisci a Vim di spezzare i collegamenti a metà tag nel markdown.


0

Non credo sia possibile. Tuttavia, ci sono un paio di soluzioni alternative.

  1. È possibile scrivere l'intestazione e quindi :set tw=72 . Poiché twnon si applica retroattivamente al testo già presente nel buffer,

  2. È possibile digitare l'intera cosa con :set tw=0e, una volta terminato, passare alla riga 4 :set tw=72e gqG. Oppure, se non hai voglia di farlo manualmente, puoi macro o mapparlo. Ad esempio, entrambi funzionerebbero:

    let @r=":set tw=72<cr>4GgqG:set tw=0<cr>"
    nnoremap <silent> <leader>r :set tw=72<cr>4GgqG:set tw=0<cr>
    

    ("r" per "riformattare")

    Potresti anche impostare questo in modo che accada automaticamente quando chiudi VIM, supponendo che desideri riformattarlo quando chiudi VIM e che esiste un tipo di file che usi solo per le e-mail. Ad esempio, se tutte le tue e-mail avevano l' .emailestensione, puoi fare:

    autocommand VimLeavePre *.email set tw=72 | exe "normal! 4GgqG" | w
    

    Ovviamente, dovresti cambiare l' *.emailestensione del file che usi effettivamente. Se usi qualcosa del genere .txt, non lo consiglierei, poiché rovinerà tutti i .txt file che hai.

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.