如何正确使用vim自动换行?
How to use vim autowrap correctly?
我正在尝试使用 vim 自动换行功能,在我键入时实时自动将我的段落换行到不超过 80 个字母的行中。这可以通过 set textwidth=80
和 set fo+=a
来完成。 vim formatoptions
或 fo
的 a
选项基本上告诉 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
我正在尝试使用 vim 自动换行功能,在我键入时实时自动将我的段落换行到不超过 80 个字母的行中。这可以通过 set textwidth=80
和 set fo+=a
来完成。 vim formatoptions
或 fo
的 a
选项基本上告诉 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