行号特定的文本宽度设置


9

我使用gvim编写电子邮件,并用于tw=72延长行数。现在,我还在同一文档中编辑基本邮件头,例如,我将收件人添加到邮件中。现在,tw=72它每次也会中断72个字符。

如何tw=0在前4行(即标题部分)以及tw=72文档的其余部分设置?

我的formatoptions看起来像这样,如果相关的话:

set fo+=tcqn

textwidth应用于整个缓冲区。
romainl

3
另请参阅:防止Vim在markdown中破坏标签中间的链接。您可以为电子邮件,或者通过检查是否使用类似的解决方案line('.') < 5,或者通过检查线开始使用电子邮件标头(例如From: To: 等)。
马丁·图尔诺伊

@Carpetsmoker非常感谢,这是解决方案的关键。我添加了完整的答案并进行了必要的修改。
mxmehl

Answers:


6

感谢@Carpetsmoker对我的问题的评论,我能够完全按照自己的意愿解决此问题。

在.vimrc中使用以下功能(或在我的情况下,仅在编辑我的电子邮件时加载的特殊文件中),如果行号小于5,则将tw设置为500,否则将其设置为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,则会为您突出显示标题:

在此处输入图片说明

我们可以使用语法信息来确定行是否为标题,并相应地设置文本宽度。

头的语法名称是mailHeaderKeymailSubjectmailHeaderEmail,和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在markdown的中间标记处断开链接。


0

我不认为这是可能的。但是,有两种解决方法。

  1. 您可以写您的标头,然后 :set tw=72。由于tw不适用于缓冲区中已有的文本,因此,

  2. 您可以键入与整个事情:set tw=0,然后,一旦你完成后,招行4 :set tw=72gqG。或者,如果您不想手动执行此操作,则可以对其进行宏化或映射。例如,这两个都可以工作:

    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文件混淆。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.