Ustawienie szerokości tekstu specyficzne dla numeru linii

9

Używam gvima do pisania e-maili i tw=72łamania długich linii. Teraz edytuję również podstawowe nagłówki wiadomości w tym samym dokumencie, np. Dodam odbiorców do mojej poczty. Teraz z tw=72nim również łamie się za każdym razem po 72 znakach.

Jak ustawić tw=0pierwsze 4 wiersze (to jest część nagłówka) i tw=72resztę dokumentu?

Moje opcje formatu wyglądają tak, jeśli to istotne:

set fo+=tcqn
mxmehl
źródło
textwidthjest stosowany do całego bufora.
romainl,
3
Zobacz także: Nie pozwól Vimowi na zerwanie linków w środkowej części tagu podczas markdown . Można użyć podobnego rozwiązania dla e-maili, poprzez sprawdzenie, czy line('.') < 5, lub sprawdzając, czy rozpoczyna linia z nagłówka e-mail (na przykład From: , To: itd.)
Martin Tournoij,
@Carpetsmoker Wielkie dzięki, to był klucz do rozwiązania. Dodałem pełną odpowiedź z niezbędnymi modyfikacjami.
mxmehl,

Odpowiedzi:

6

Dzięki komentarzowi @ Carpetsmoker do mojego pytania udało mi się rozwiązać to dokładnie tak, jak chciałem.

Dzięki następującej funkcji w .vimrc (lub w moim przypadku w specjalnym pliku, który został załadowany tylko podczas edycji moich wiadomości e-mail), tw jest ustawione na 500, jeśli numer wiersza jest mniejszy niż 5, w przeciwnym razie jest to 72. Przy au CursorMovedItym jest sprawdzane za każdym razem kursor się porusza.

" 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

Jeśli ktoś planuje to zaimplementować, zastanów się nad zastąpieniem symbolu wieloznacznego au CursorMovedI *stałą ścieżką lub sufiksem pliku.

mxmehl
źródło
4

Bardziej niezawodna alternatywa dla odpowiedzi MXMEHL.

Jeśli używasz filetype=mailVima, podświetli dla ciebie nagłówki:

wprowadź opis zdjęcia tutaj

Możemy użyć informacji o składni, aby ustalić, czy wiersz jest nagłówkiem i odpowiednio ustawić szerokość tekstu.

Nazwa Składnia nagłówkach są mailHeaderKey, mailSubject, mailHeaderEmail, i mailHeader. Dowiedziałem się tego, patrząc na /usr/share/vim/vim74/syntax/mail.vim.

Powodem, dla którego wolę to rozwiązanie, jest to, że nie zależy on od dowolnych numerów linii, ale że działa równie poprawnie dla wiadomości e-mail z jednym nagłówkiem i dwudziestoma nagłówkami.

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
źródło
2

Możesz to osiągnąć za pomocą autocmds. Możesz dołączyć je do swojego vimrc, ale zwykle lepiej jest dołączyć je do typu pliku, jak wyjaśniono tutaj .

Następnie możesz użyć następujących opcji:

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

Jeśli wolisz używać go bez wtyczki typu pliku, musisz zastąpić <buffer>ją wzorcem pliku.

Chodzi o zmianę, 'textwidth'kiedy wejdziesz w tryb wstawiania i przywrócenie go, gdy go opuścisz.

Jeśli zazwyczaj poruszasz się po tekście w trybie wstawiania (np. Za pomocą klawiszy strzałek), możesz go ulepszyć na podstawie linku wspomnianego przez @Carpetsmoke: Zapobiegnij Vimowi zerwania linków w środkowym tagu podczas przeceny.

mMontu
źródło
0

Nie wierzę, że to jest możliwe. Istnieje jednak kilka obejść.

  1. Możesz napisać nagłówek, a następnie :set tw=72 . Ponieważ twnie stosuje się z mocą wsteczną do tekstu znajdującego się już w buforze,

  2. Możesz wpisać całą rzecz za pomocą, :set tw=0a następnie, gdy skończysz, przejdź do linii 4 :set tw=72, i gqG. Lub, jeśli nie masz ochoty robić tego ręcznie, możesz go makro lub zmapować. Na przykład oba będą działać:

    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” dla „reformat”)

    Możesz nawet ustawić automatyczne uruchamianie po zamknięciu vima, zakładając, że chcesz go sformatować po zamknięciu vima i że istnieje typ pliku, którego używasz tylko do wiadomości e-mail. Na przykład, jeśli wszystkie e-maile mają .emailrozszerzenie, możesz:

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

    Oczywiście musisz zmienić *.emailna dowolne rozszerzenie pliku, którego faktycznie używasz. Jeśli używasz czegoś podobnego .txt, nie poleciłbym tego, ponieważ spowoduje to bałagan przy każdym .txt pliku, który masz.

James
źródło