Налаштування конкретної ширини тексту для номера рядка


9

Я використовую gvim для написання електронних листів і використовую tw=72для переривання довгих рядків. Тепер я також редагую основні заголовки пошти в тому самому документі, наприклад, я додаю одержувачів до своєї пошти. Тепер з tw=72ним також кожен раз ламається після 72 символів.

Як я можу встановити tw=0для перших 4 рядків (це частина заголовка), а tw=72для решти документа?

Мої форми виглядають приблизно так, якщо це доречно:

set fo+=tcqn

textwidthзастосовується до всього буфера.
romainl

3
Також дивіться: Не дозволяйте Vim розривати середні теги посилань у розмітці . Ви можете використовувати аналогічне рішення для електронної пошти, або шляхом перевірки line('.') < 5, чи шляхом перевірки , якщо рядок починається з заголовком електронної пошти (наприклад From: , To: і т.д.).
Мартін Турноїй

@Carpetsmoker Спасибі велике, це було ключем до рішення. Я доповнив свою повну відповідь необхідними модифікаціями.
mxmehl

Відповіді:


6

Завдяки коментарю @ Carpetsmoker до мого запитання, я зміг вирішити це саме так, як я хотів.

З наступною функцією в .vimrc (або в моєму випадку у спеціальному файлі, який він завантажується лише під час редагування моїх електронних листів), tw встановлюється на 500, якщо номер рядка менше 5, інакше це 72. З au CursorMovedIцим перевіряється кожен раз курсор рухається.

" 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

Якщо хтось планує це здійснити, подумайте про заміну підстановки au CursorMovedI *на фіксований шлях або суфікс файлу.


4

Більш міцна альтернатива відповіді mxmehl.

Якщо ви використовуєте filetype=mailVim, підкреслить заголовки для вас:

введіть тут опис зображення

Ми можемо використовувати інформацію про синтаксис, щоб визначити, чи є рядок заголовком, і відповідно встановити ширину тексту.

Ім'я синтаксису заголовків є mailHeaderKey, mailSubject, mailHeaderEmail, і mailHeader. Я це з’ясував, переглянувши /usr/share/vim/vim74/syntax/mail.vim.

Тому я вважаю за краще це рішення в тому, що воно не залежить від довільних номерів рядків, а те, що воно працює однаково правильно для електронних листів з одним заголовком та двадцятьма заголовками.

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

Ви можете досягти цього, використовуючи autocmds. Ви можете включити їх у свій vimrc, але зазвичай краще включити їх у тип файлу, як пояснено тут .

Тоді ви можете використовувати наступне:

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

Якщо ви віддаєте перевагу використовувати його без додаткового файлу, вам потрібно буде замінити <buffer>файл на шаблон.

Ідея полягає в тому, щоб змінити, 'textwidth'коли ви переходите в режим вставки, і відновити його, коли ви виходите з нього.

Якщо ви зазвичай переходите по тексту в режимі вставки (наприклад: за допомогою клавіш зі стрілками), ви можете покращити його на основі посилання, згаданого @Carpetsmoke .


0

Я не вірю, що це можливо. Однак є кілька обхідних шляхів.

  1. Ви можете написати свій заголовок, а потім :set tw=72 . Оскільки twне застосовується заднім числом до тексту, який уже є у вашому буфері,

  2. Ви можете ввести всю річ, :set tw=0а потім, коли закінчите, переходите до рядків 4 :set tw=72, та gqG. Або, якщо вам це не подобається робити вручну, ви можете зробити це макросом або зіставити його. Наприклад, обидва вони будуть працювати:

    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" для "переформатування")

    Ви навіть можете налаштувати, що це відбувається автоматично, коли ви закриваєте vim, припускаючи, що ви хочете, щоб він переформатувався, коли ви закриваєте vim, і що існує файл, який ви використовуєте лише для електронної пошти. Наприклад, якщо у всіх ваших електронних листах було .emailрозширення, ви можете:

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

    Звичайно, вам доведеться змінити *.emailбудь-яке розширення файлу, яке ви фактично використовуєте. Якщо ви використовуєте щось подібне .txt, я б не рекомендував цього, оскільки це буде псувати кожен .txt файл, який у вас є.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.