Paramètre de largeur de texte spécifique au numéro de ligne

9

J'utilise gvim pour rédiger des e-mails et tw=72pour rompre les longues lignes. Maintenant, je modifie également les en-têtes de courrier de base dans le même document, par exemple, j'ajoute des destinataires à mon courrier. Maintenant, tw=72il se casse également à chaque fois après 72 caractères.

Comment puis-je définir tw=0sur les 4 premières lignes (c'est la partie d'en-tête) et tw=72pour le reste du document?

Mes options de format ressemblent à ceci, si cela est pertinent:

set fo+=tcqn
mxmehl
la source
textwidthest appliqué à l'ensemble du tampon.
romainl
3
Voir également: Empêcher Vim de rompre les liens au milieu du tag dans le démarque . Vous pouvez utiliser une solution similaire pour les e - mails, que ce soit en vérifiant si line('.') < 5, ou en vérifiant si la ligne commence par un en- tête de courrier électronique (par exemple From: , To: etc.).
Martin Tournoij
@Carpetsmoker Merci beaucoup, c'était la clé de la solution. J'ai ajouté ma réponse complète avec les modifications nécessaires.
mxmehl

Réponses:

6

Grâce au commentaire de @ Carpetsmoker sur ma question, j'ai pu résoudre ce problème exactement comme je le voulais.

Avec la fonction suivante dans .vimrc (ou dans mon cas dans un fichier spécial qu'il n'a chargé que lors de la modification de mes e-mails), tw est défini sur 500 si le numéro de ligne est inférieur à 5, sinon c'est 72. Avec au CursorMovedIcela est vérifié à chaque fois que le le curseur se déplace.

" 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

Si quelqu'un prévoit de l'implémenter, pensez à remplacer le caractère générique au CursorMovedI *par un chemin fixe ou un suffixe de fichier.

mxmehl
la source
4

Une alternative plus robuste à la réponse de mxmehl.

Si vous utilisez filetype=mailVim mettra en évidence les en-têtes pour vous:

entrez la description de l'image ici

Nous pouvons utiliser les informations de syntaxe pour déterminer si une ligne est un en-tête et définir la largeur de texte en conséquence.

Le nom de la syntaxe des en- têtes sont mailHeaderKey, mailSubject, mailHeaderEmailet mailHeader. J'ai découvert cela en regardant /usr/share/vim/vim74/syntax/mail.vim.

La raison pour laquelle je préfère cette solution est qu'elle ne dépend pas de numéros de ligne arbitraires, mais qu'elle fonctionne également correctement pour les e-mails avec un en-tête et vingt en-têtes.

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
Martin Tournoij
la source
2

Vous pouvez y parvenir en utilisant les autocmds. Vous pouvez les inclure dans votre vimrc, mais il est généralement préférable de les inclure dans un type de fichier, comme expliqué ici .

Ensuite, vous pouvez utiliser les éléments suivants:

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

Si vous préférez l'utiliser sans plugin <buffer>de type de fichier, vous devrez remplacer le par un modèle de fichier.

L'idée est de changer le 'textwidth'lorsque vous entrez en mode d'insertion et de le restaurer lorsque vous le quittez.

Si vous naviguez généralement dans le texte en mode d'insertion (par exemple: en utilisant les touches fléchées), vous pouvez l'améliorer en fonction du lien mentionné par @Carpetsmoke: Empêcher Vim de rompre les liens au milieu de la balise lors du démarquage.

mMontu
la source
0

Je ne pense pas que ce soit possible. Cependant, il existe quelques solutions de contournement.

  1. Vous pouvez écrire votre en-tête et ensuite :set tw=72 . Étant donné twque ne s'applique pas rétroactivement au texte déjà dans votre tampon,

  2. Vous pouvez taper le tout avec :set tw=0, puis une fois que vous avez terminé, passez à la ligne 4 :set tw=72,, et gqG. Ou, si vous n'avez pas envie de le faire manuellement, vous pouvez le macro ou le mapper. Par exemple, les deux fonctionneraient:

    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" pour "reformater")

    Vous pouvez même configurer cela pour qu'il se produise automatiquement lorsque vous fermez vim, en supposant que vous souhaitiez le reformater lorsque vous fermez vim, et qu'il existe un type de fichier que vous utilisez uniquement pour les e-mails. Par exemple, si tous vos e-mails avaient l' .emailextension, vous pouvez faire:

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

    Bien sûr, vous devrez changer *.emailpour n'importe quelle extension de fichier que vous utilisez réellement. Si vous utilisez quelque chose comme .txt, je ne le recommanderais pas , car il gâchera tous les .txt fichiers que vous avez.

James
la source