Настройка ширины текста для номера строки

9

Я использую gvim для написания электронных писем и tw=72разбиваю длинные строки. Теперь я также редактирую основные заголовки почты в том же документе, например, добавляю получателей к своей почте. Теперь с tw=72ним также порвется каждый раз после 72 символов.

Как я могу установить tw=0первые 4 строки (это часть заголовка) и tw=72остальную часть документа?

Мои форматирования выглядят так, если это уместно:

set fo+=tcqn
mxmehl
источник
textwidthприменяется ко всему буферу.
Ромен
3
Также смотрите: Предотвращение разрыва ссылок в середине тега в уценке . Вы можете использовать подобное решение для электронной почты, либо проверив, если 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 *на фиксированный путь или суффикс файла.

mxmehl
источник
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: Предотвратите Vim от разрыва ссылок в середине тега в уценке.

mMontu
источник
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>
    

    («р» для «переформатировать»)

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

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

    Конечно, вам придется перейти *.emailна любое расширение файла, которое вы на самом деле используете. Если вы используете что-то вроде этого .txt, я бы не советовал, потому что это будет портить каждый .txt файл, который у вас есть.

Джеймс
источник