Zeilennummernspezifische Einstellung für die Textbreite

9

Ich benutze gvim zum Schreiben von E-Mails und tw=72zum Brechen langer Schlangen . Jetzt bearbeite ich auch grundlegende Mail-Header im selben Dokument, z. B. füge ich meiner Mail Empfänger hinzu. Jetzt tw=72bricht es auch jedes Mal nach 72 Zeichen.

Wie kann ich in tw=0den ersten 4 Zeilen (das ist der Kopfteil) und tw=72für den Rest des Dokuments festlegen ?

Meine Formatoptionen sehen folgendermaßen aus, wenn dies relevant ist:

set fo+=tcqn
mxmehl
quelle
textwidthwird auf den gesamten Puffer angewendet.
Romainl
3
Siehe auch: Verhindern Sie, dass Vim Links mitten im Tag beim Markdown auflöst . Sie könnten eine ähnliche Lösung für E - Mails verwenden, entweder durch Prüfen , ob line('.') < 5oder durch Prüfen , ob die Zeile beginnt mit einem E - Mail - Header (zB From: , To: usw.).
Martin Tournoij
@Carpetsmoker Vielen Dank, dies war der Schlüssel zur Lösung. Ich habe meine vollständige Antwort mit den notwendigen Änderungen hinzugefügt.
Mxmehl

Antworten:

6

Dank des Kommentars von @ Carpetsmoker zu meiner Frage konnte ich das genau so lösen, wie ich es mir vorgestellt hatte.

Mit der folgenden Funktion in .vimrc (oder in meinem Fall in einer speziellen Datei, die nur beim Bearbeiten meiner E-Mails geladen wurde) wird tw auf 500 gesetzt, wenn die Zeilennummer kleiner als 5 ist, andernfalls auf 72. au CursorMovedIDies wird jedes Mal überprüft, wenn die Cursor bewegt sich.

" 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

Wenn jemand dies implementieren möchte, sollten Sie den Platzhalter au CursorMovedI *durch einen festen Pfad oder ein Dateisuffix ersetzen .

mxmehl
quelle
4

Eine robustere Alternative zu mxmehls Antwort.

Wenn Sie filetype=mailVim verwenden, werden Überschriften für Sie hervorgehoben:

Geben Sie hier die Bildbeschreibung ein

Wir können die Syntaxinformationen verwenden, um festzustellen, ob eine Zeile eine Kopfzeile ist, und die Textbreite entsprechend festlegen.

Die Syntax Name der Header sind mailHeaderKey, mailSubject, mailHeaderEmail, und mailHeader. Ich fand das heraus, indem ich es mir ansah /usr/share/vim/vim74/syntax/mail.vim.

Der Grund, warum ich diese Lösung bevorzuge, ist, dass sie nicht von beliebigen Zeilennummern abhängt, sondern für E-Mails mit einem Header und zwanzig Headern gleichermaßen korrekt funktioniert.

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
quelle
2

Sie können dies mit autocmds erreichen. Sie können sie in Ihr vimrc aufnehmen, aber es ist normalerweise besser, sie in einen Dateityp aufzunehmen, wie hier erläutert .

Dann könnten Sie Folgendes verwenden:

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

Wenn Sie es lieber ohne ein Dateityp-Plugin verwenden möchten, müssen Sie das durch ein Dateimuster ersetzen <buffer>.

Die Idee ist, den 'textwidth'Modus zu ändern, wenn Sie in den Einfügemodus wechseln, und ihn wiederherzustellen, wenn Sie ihn verlassen.

Wenn Sie normalerweise im Einfügemodus im Text navigieren (z. B. mit den Pfeiltasten), können Sie ihn basierend auf dem von @Carpetsmoke erwähnten Link verbessern: Verhindern Sie, dass Vim Links während des Markdowns in der Mitte des Tags aufbricht.

mMontu
quelle
0

Ich glaube nicht, dass das möglich ist. Es gibt jedoch einige Problemumgehungen.

  1. Sie könnten Ihren Header schreiben und dann :set tw=72 . Da twdies nicht rückwirkend auf den Text angewendet wird, der sich bereits in Ihrem Puffer befindet,

  2. Sie können das Ganze mit tippen :set tw=0und dann, wenn Sie fertig sind, mit Zeile 4 :set tw=72und fortfahren gqG. Wenn Sie dies nicht manuell tun möchten, können Sie es auch makro oder zuordnen. Zum Beispiel würden beide funktionieren:

    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" für "neu formatieren")

    Sie können dies sogar so einrichten, dass es beim Schließen von vim automatisch erfolgt, vorausgesetzt, Sie möchten, dass es beim Schließen von vim neu formatiert wird, und es gibt einen Dateityp, den Sie nur für E-Mails verwenden. Wenn beispielsweise alle Ihre E-Mails die .emailErweiterung hätten, könnten Sie Folgendes tun:

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

    Natürlich müssten Sie *.emailzu der Dateierweiterung wechseln , die Sie tatsächlich verwenden. Wenn Sie so etwas verwenden .txt, würde ich dies nicht empfehlen, da es mit jeder .txt Datei, die Sie haben, durcheinander kommt .

James
quelle