如何正确使用vim自动换行?

How to use vim autowrap correctly?

我正在尝试使用 vim 自动换行功能,在我键入时实时自动将我的段落换行到不超过 80 个字母的行中。这可以通过 set textwidth=80set fo+=a 来完成。 vim formatoptionsfoa 选项基本上告诉 vim 在键入时将整个段落换行。

但是,有一个非常烦人的副作用,我不能再通过简单地按 enter 来换行。

This is a sample sentence.

对于上面这句话来说,如果我想把它变成:

This is

a sample sentence.

通常我可以将光标移动到"a"并进入插入模式,然后按回车。但是在 set fo+=a 之后,当我在 "a" 的插入模式下按 enter 时,什么也不会发生。我注意到的一件事是,如果 "is" 和 "a" 之间没有 space,按回车键将插入一个 space。但之后就不会发生其他事情了。

那么我在这里错过了什么?我该如何阻止这种烦人的行为?

您可以运行 :help fo-table查看选项的解释:

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.

这意味着每次您插入一个字符时,vim 都会尝试自动格式化该段落。这将导致它将所有内容移回同一行。

我认为您根本不需要添加 a。我使用 neovim,但这里的行为应该是相同的。根据帮助页面,默认值是:

(default: "tcqj", Vi default: "vt")

尝试从您的 .vimrc 中完全删除 set fo+=a。保持 set textwidth=80。那应该可以解决您的问题。

编辑:一旦你有set textwidth=80,如果你想格式化现有段落,你可以在视觉选择中突出显示它并按gq

经过一番探索,我找到了一种解决方法,虽然不完美,但可以在一定程度上解决问题。

基本思路是输入换行符时,发送<CR>时暂时禁用auto-wrapping,然后恢复auto-wrapping。有多种方法可以做到这一点。据我所知,最好的方法是使用粘贴模式,因为您不必在进入粘贴模式时退出插入模式。因此,只需在插入模式下将以下命令放入您喜欢的任何键绑定即可。我现在用的是inoremap <C-N> <F2><CR><F2>

我认为这个不是最佳的原因是由于某种原因我不能以这种方式绑定<Enter>,而是必须使用另一个密钥。

如果<Enter>或者<CR>都可以这样配置那么问题100%解决

以下允许我使用 enter 键开始新行,同时将文本宽度设置为 79 个字符:

set tw=79 "width of document                                                                            
set fo=cqt                                                                      
set wm=0 "# margin from right window border