我使用gvim编写电子邮件,并用于tw=72
延长行数。现在,我还在同一文档中编辑基本邮件头,例如,我将收件人添加到邮件中。现在,tw=72
它每次也会中断72个字符。
如何tw=0
在前4行(即标题部分)以及tw=72
文档的其余部分设置?
我的formatoptions看起来像这样,如果相关的话:
set fo+=tcqn
line('.') < 5
,或者通过检查线开始使用电子邮件标头(例如From:
,To:
等)。
我使用gvim编写电子邮件,并用于tw=72
延长行数。现在,我还在同一文档中编辑基本邮件头,例如,我将收件人添加到邮件中。现在,tw=72
它每次也会中断72个字符。
如何tw=0
在前4行(即标题部分)以及tw=72
文档的其余部分设置?
我的formatoptions看起来像这样,如果相关的话:
set fo+=tcqn
line('.') < 5
,或者通过检查线开始使用电子邮件标头(例如From:
,To:
等)。
Answers:
感谢@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 *
使用固定路径或文件后缀替换通配符。
一个更强大的替代mxmehl的答案。
如果您使用filetype=mail
Vim,则会为您突出显示标题:
我们可以使用语法信息来确定行是否为标题,并相应地设置文本宽度。
头的语法名称是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
您可以使用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的中间标记处断开链接。
我不认为这是可能的。但是,有两种解决方法。
您可以写您的标头,然后 :set tw=72
。由于tw
不适用于缓冲区中已有的文本,因此,
您可以键入与整个事情: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
文件混淆。
textwidth
应用于整个缓冲区。