在vim编辑git提交信息时,如何防止自动换行?

11

我想做和这个问题相反的事情:

在Vim中自动换行长的Git提交消息

不知何故,git决定在72个字符处换行我的提交消息。我根本不想让它们换行...而且我也没有做任何启用换行的操作。

现在,当我正在编辑提交注释时,我当然可以输入:

:set textwidth&

这将停止换行,但我不想每次都这样做。

附加信息:

  • 我正在使用Devuan GNU/Linux 3(~= Debian 10)。
  • :set ft?显示filetype=gitcommit
  • 当我刚开始使用vim或编辑任何现有文件时,都不会发生换行。

在vim配置文件中保存您的设置? - evolutionxbox
当您编辑Vim提交时,它会报告什么文件类型?:set ft?的输出是什么?它是gitcommit还是只是commit或类似的东西?了解文件类型后,您可以添加覆盖。 - filbranden
1
@evolutionxbox: “我的设置”被覆盖了。当我刚开始使用vim时,这种情况不会发生。 - einpoklum
@filbranden:请查看编辑 - einpoklum
3个回答

17

因为Vim识别到文件类型(gitcommit),并为此加载特定于文件类型的设置,所以您会得到这些git提交消息的设置。

在这种情况下,它来自文件$VIMRUNTIME/ftplugin/gitcommit.vim,其中包括以下行:

setlocal nomodeline tabstop=8 formatoptions+=tl textwidth=72

您可以通过在家目录中添加另一个 gitcommit 文件类型插件来覆盖它,该插件会在 Vim 运行时之后加载。
您可以使用名为 ~/.vim/after/ftplugin/gitcommit.vim 的文件来实现这一点(假设您正在使用 Vim,如果您使用 NeoVim,则路径的初始部分将有所不同)。after 目录用于加载在最后的插件文件,因此通过将文件放置在那里,您可以确保您的代码将在上述代码之后运行。
在该文件中,您可以添加一个命令来撤消换行的不良影响,例如:
setlocal textwidth&

或者:

setlocal formatoptions-=t formatoptions-=l

这两个设置中的任何一个都将防止自动在第72列断行。更改 'formatoptions' 而不是重置 'textwidth' 的优点在于,仅通过更改 'formatoptions',您仍然可以使用诸如 gq 等命令手动格式化文本块以符合 72 字符行宽限制,如果您希望这样做,则可以获得最佳效果。

无论您决定设置哪个选项,请确保使用 :setlocal 而不是 :set,因为该插件仅针对该缓冲区加载,您应尽量仅修改该缓冲区的选项并避免触及全局选项。


2
我不明白为什么你建议两个选项,然后告诉我一定要只使用其中一个。或者 - 我误解了你的最后一句话吗?此外,setlocal textwidth& 是有效的,而 formatoptions-=tc 则无效... - einpoklum
@einpoklum 两者都可以防止自动换行。你可以同时设置两个,但其中任意一个就足够了。最后一句是关于使用 :setlocal 而不是 :set 与它们中的任何一个!我会重新表述一下,让它看起来更好。 - filbranden
1
你在第二个选项中打错了字,它写成了“formatoptions-=tc”,但应该是“formatoptions-=tl”。 - Rafał G.
1
关于 set formatoptions-=abc:我发现 -= 不能如预期般减去一组字母标记。它仅在 'formatoptions' 包含 abc 作为子字符串时才起作用,也就是说,它必须包含以这种确切顺序之间没有其他字母abc 字母。否则,将不会发生任何事情。您应该逐个删除它们。 - Maëlan
5
如果您使用的是 Neovim,正确路径应为 Linux 上的 ~/.config/nvim/after/ftplugin/gitcommit.vim,或 Windows 上的 $env:LOCALAPPDATA/nvim/after/ftplugin/gitcommit.vim - pcesarperez
显示剩余2条评论

2

另一种方法是在您的vimrc中添加一个自动命令。如果您在

.vimrc

之后的任何时间添加它,那么每次打开文件时都会执行该命令。

filetype plugin on

如果在vim中设置了wrap选项,当你打开一个文件时,它会覆盖ftplugin中的任何内容。我用这个方法来关闭git提交中的换行。

" Stops gitcommit from auto wrapping
au Filetype gitcommit call SetGitCommit()
func SetGitCommit()
    setlocal formatoptions-=tl
endfunc

2
formatoptions 中仅提取 t 就足够了,我们不需要将其包装在函数中。因此,以下代码就可以实现:au Filetype gitcommit setlocal formatoptions-=t - M Imam Pratama

1
如果您正在使用Neovim,正确的路径是Linux上的/.config/nvim/after/ftplugin/gitcommit.vim或Windows上的$env:LOCALAPPDATA/nvim/after/ftplugin/gitcommit.vim。感谢@pcesarperez的所有贡献;我只是从第一个答案中复制了他的评论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接