在 vim 中设置 textwidth 而不覆盖特定的文件类型

Ale*_*lex 5 vim word-wrap

我希望 vim 中的 textwidth 默认为 80,但如果特定文件类型有自己的文本宽度(特别是 tw=72 的 gitcommit),我希望 vim 遵守该宽度。

在我的 .vimrc 中,我有一行:

set tw=80
Run Code Online (Sandbox Code Playgroud)

我也试过

setlocal tw=80
Run Code Online (Sandbox Code Playgroud)

然而,这似乎覆盖了 72 的 gitcommit 宽度。

如果我删除该行,则 git commit 可以正常工作(在 72 处换行),但文本文件(例如)不会自动换行。

如果没有指定其他内容,是否可以将 vim 换行到 80,否则请遵循特定的文件类型说明?

顺便说一句,我认为这直到最近才有效。我曾尝试从我的 .virmrc 中删除所有其他内容,但设置 tw=80,但这没有任何区别。

编辑:如果我打开一个 git commit 消息编辑器,然后运行

:verbose set tw?

vim 显示:

   textwidth=80
        Last set from ~/.vimrc
Run Code Online (Sandbox Code Playgroud)

Ing*_*kat 5

Vim 已将其涵盖在全局与缓冲区本地选项中。当你描述,你应该:set在你的全局的缺省值~/.vimrc,有些文件类型可以覆盖与全球默认:setlocal

要进行故障排除,请尝试

:verbose set tw?
Run Code Online (Sandbox Code Playgroud)

这应该会告诉您最后修改选项值的位置。

编辑

对于ft=gitcommit,它具有特殊的逻辑,仅在(全局值)为空时才设置文本宽度:

if &textwidth == 0
    " make sure that log messages play nice with git-log on standard terminals
    setlocal textwidth=72
    let b:undo_ftplugin .= "|setl tw<"
endif
Run Code Online (Sandbox Code Playgroud)

您的全局设置会阻止此操作生效。解决办法是自己无条件设置textwidth:在~/.vim/after/ftplugin/gitcommit.vim,把这个:

    setlocal textwidth=72
    let b:undo_ftplugin .= "|setl tw<"
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是纯金的。我终于明白了如何覆盖插件设置的烦人的映射。 (3认同)