VIM的textwidth无效

34

这感觉像一个愚蠢的问题,但我在互联网上(或者在VIM帮助中)找不到答案。我正在使用Mac OS X上的VIM 7.2。我想做的就是将我的行包装在72个字符处,但是执行

:set textwidth=72 

没有效果。textwidth已经正确设置(当我查询“:set textwidth”时可以看到),但是既有的行也不会被换行,我在设置textwidth之后输入的新行也不会被换行。如果我换了一行,它仍然不会换行。打开和关闭文件,也没有任何变化。我还尝试过使用:set wrapmargin=72(textwidth=0),但没有效果。

我错过了什么吗?

7个回答

30

将新的文本宽度应用到整个缓冲区,请尝试使用gggqG

  • gg 表示:跳转到缓冲区开头
  • gq 表示:重新格式化运动中包含的文本
  • G 表示:跳转到缓冲区末尾

(如果正确设置了格式选项,例如Zyx帖子中所述,则会起作用)

另外,您还可以通过在文件开头或结尾添加一个modeline来强制将现有文本文件调整为72个字符的宽度。请参阅:help modeline

类似vim:tw=72这样的内容应该可以起作用。


不错!你让我的一天变得美好了。 - Aluthren

16
我正在寻找关于同样问题的答案,在找到VIM文档中的解决方案之前必须进行一些周折。因此,我想更新此线程并节省其他人的时间。
在我的情况下,问题是默认的ftplugin禁用了textwidth。
仅更新您的.vimrc(:set tw = 79 &&:set formatoptions + = t )不起作用,因为vimrc之后会源泉fplugins。
以下是我遵循的步骤:
1)找出您当前的formatoptions(在vim内部)
:set formatoptions?
formatoptions=croql (note no 't')

2) 根据vimdocs建议创建一个filetype.vim文件 (http://vimdoc.sourceforge.net/htmldoc/filetype.html#ftplugin-overrule)

Overrule the settings after loading the global plugin.
You must create a new filetype plugin in a directory from the end of
'runtimepath'.  For Unix, for example, you could use this file:
    vim ~/.vim/after/ftplugin/fortran.vim
In this file you can change just those settings that you want to change.

3) 在该文件中添加以下行::set formatoptions+=t && :set textwidth=79

完成!下次打开文件时,它将把文本宽度设置为您想要的字符数。

作为调试辅助工具,您可以始终检查哪个文件覆盖了您的vimrc设置,方法是在命令前加上verbose。例如,如果我想检查最后更新formatoptions的人是谁,我会键入:

:verbose set formatoptions? 
formatoptions=croqlt
Last set from ~/.vim/after/ftplugin/fortan.vim

这是对OP答案的解决方案。https://stackoverflow.com/users/513198/xavier-t的回答是更新未遵守textwidth的文件的最佳方法,但它无法使文件类型开始遵守它。 - Tyler Abair

13

什么是

:set formatexpr?
:set indentexpr?
:set cindent?
:set filetype?
:set paste?
:filetype

打印。

其中至少有一个(我认为所有的)将覆盖textwidth设置。

例如,如果您正在编辑C源文件,则C缩进规则会覆盖textwidth


2
也尝试使用 :set paste? 命令。它有时也会产生干扰。 - pattivacek
对我而言,它是:set paste命令,我已将其映射到一个 leader sequence 上。谢谢@patrickvacek. - OregonTrail

7

Vim不会做任何事情,除非被请求。如果你在formatoptions中有t(仅限非注释),c(仅限注释)或两者都有,则textwidth将对当前编辑的行产生影响(如果a不存在,则只有当您达到由textwidth设置的边缘时才会自动换行),或者如果您使用gq重新格式化文本。如果我没有错,您可以设置这样的formatexprformatprg,以便忽略textwidth


4
set formatoptions+=t

这个链接 可能会对您有所帮助。


4
我遇到了完全相同的问题,找到了以下解决方法,对我来说足够好了:
autocmd FileType python setlocal textwidth=79 formatoptions+=t

随意更改 python 为您选择的文件类型(例如,* 或逗号分隔的列表 python,ruby,go,sh,javascript

有关 formatoptions 的详细信息,请参见 :h fo-table


这是我唯一有效的方法。本地文件类型定义会覆盖.vimrc文件中的任何textwidth值,因此您需要使用它。 - NuclearFission

1
我正在使用Neovim,也遇到了这个问题。在我的init.vim中将textwidth设置为80后,打开文本文件时内容不会改变。对于现有的文本,我们必须手动使用gggqG进行格式化。
当您在一行中输入新字符时,textwidth选项将起作用(如果字符数达到80,则会自动换行)。

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