vim通过设置formatoptions选项解决回车后新行默认注释的问题


一直以来,刚装的系统,都受到了这么一种困扰:

    在一个注释行中,回车后,新行也变成了注释行,即默认插入了注释符。这是个很让人蛋疼的问题,特别是当你粘贴代码的时候。之前为了解决这个问题,设置了:set paste ,但是这个设置影响太大了,我在前面的博客(delimitmate插件)中提过,就是因为设置了:set paste,才导致括号补全等失效。

    所以,今天为了解决注释行的问题,再次进行了一番搜寻并且探究了下问题形成的原因。  



这个是通过formatoptions选项控制的。查看帮助

t Auto-wrap text using textwidth
c Auto-wrap comments using textwidth, inserting the current comment
leader automatically.
r Automatically insert the current comment leader after hitting
<Enter> in Insert mode.
o Automatically insert the current comment leader after hitting 'o' or
'O' in Normal mode.
q Allow formatting of comments with "gq".
Note that formatting will not change blank lines or lines containing
only the comment leader. A new paragraph starts after such a line,
or when the comment leader changes.
w Trailing white space indicates a paragraph continues in the next line.
A line that ends in a non-white character ends a paragraph.
a Automatic formatting of paragraphs. Every time text is inserted or
deleted the paragraph will be reformatted. See auto-format.
When the 'c' flag is present this only happens for recognized
comments.
n When formatting text, recognize numbered lists. This actually uses

可以看到,r选项意味着在插入模式下,回车时会自动的将当前的注释符插入到新行中。

我们可以查看当前的formatoptions  选项,通过:
:set fo?
formatoptions=jcroql
如果是上面的这个结果,就说明有注释行回车新行自动插入注释符的问题。我们可以修改.vimrc文件去除这些注释选项:
    set fo-=cro

但一般仅仅使用这个是不会产生效果的,因为许多文件类型会自定义 set/expand 的formatoption 选项并且-=cro有的时候会无效(原因后面会提到)

那么,我们有更好的方法:

    1.针对所有的文件类型设置fo选项:
        au FileType * set fo-=c fo-=r fo-=o
上面这个设置有效,是因为文件类型加载后会执行该文件类型的autocmd 命令。
    2.仅针对vim文件
        au FileType vim set fo-=c fo-=r fo-=o


也许我们看到有些教程,是设置

    au FileType * set fo-=cro
这种配置之所以不生效,是因为 fo的设置是有一定顺序的,比如你输入set fo?得到的是 jrcoql,那么你设置 -cro就不会生效,因为顺序不对,找不到这个字符串,相反,如果设置 -= rco就可以了。
所以,为了让同一个配置到处都生效,我们将cro几个选项的取消分开设置:
    au FileType * set fo-=c fo-=r fo-=o



评论

发表评论