如何在vim中停止换行?

298

我喜欢长行可以显示在多个终端行上;我不喜欢vim在我的实际文本中插入新行。我应该更改.vimrc的哪一部分?


9
为了清晰明确:您喜欢长行文本在终端上显示为多行,但不希望Vim在实际文本中插入新行。如果是这样的话,那么:set nowrap并不是您想要的相反效果。请注意不要改变原意。 - Andrew Aylett
@Andrew:是的,你的总结正是我想要的。 - Haiyuan Zhang
在输入.txt文件时出现换行符?如果你使用的是示例.vimrc文件,它会为纯文本文件设置textwidth。我想提一下,以防有人遇到和我一样的问题。 - undefined
11个回答

338
使用
:set wrap
为了在视觉上换行,即使一行文本仍为一行,但Vim会将其显示为多行。

使用

:set nowrap

为了将长行显示为一行(即需要水平滚动才能看到整行内容)。


3
谢谢你们的建议。我采用了:set nowrap和:set textwidth=0的设置,效果非常好。 - Robert Beltran
6
我打字时仍希望看到“可视”的80列限制,并且我不希望vim在我打到第80列后自动添加换行符。我该如何设置? - Olivier Pons
8
这正是我在寻找的答案,但它不是针对 OP 的问题的答案。将其作为最佳答案有点误导人。我不知道如何解决这种情况。我只想编辑您的答案以回答原始问题。但已经有一个适当的答案被高票评选了。所以我投票交换了这两个答案。 - Daniel Darabos
7
这恰恰不是我所期望的答案,也不是回答原帖问题的答案。 - igr
1
这不是问题的答案。 - user6839822

222

我喜欢长行文本被分成多行在终端上显示

这种可视化/虚拟换行可以通过 wrap 窗口选项来启用:

:set wrap

默认情况下,文本将在无法适应窗口的第一个字符处换行。这意味着如果窗口边界正好位于单词中间,则会在单词中间换行。要将其更改为在单词边界处换行,您还可以执行以下操作:

:set linebreak
这将导致wrap仅在breakat设置中的字符处进行换行,该设置默认为空格,制表符和少量标点符号。
:set breatat
  breakat= ^I!@*-+;:,./?

我不喜欢 vim 在我的 actual text 中插入新的行。

为了关闭物理换行,清除 textwidthwrapmargin 缓冲区选项:

:set textwidth=0 wrapmargin=0

1
谢谢!set textwidth=0 wrapmargin=0 是有效的,但如果我将其放入.vimrc中,则对于纯文本文件等没有效果。我该如何找出并消除覆盖? - qubodup
11
您可以通过打开存在问题的文件并输入 :verbose set textwidth? wrapmargin? 来测试是否有内容覆盖了您的 .vimrc 设置。这将告诉您它们当前的值以及设置它们的位置。有可能是某个插件覆盖了它们。在这种情况下,您可以卸载该插件,或者尝试在您的运行时路径(例如:~/.vim/after)或自己的自动命令中稍后覆盖插件设置。正确的方法取决于它被重置的位置/方式。 - Laurence Gonsalves
2
set wrapset linebreak 对我很有帮助。 - Ilia Choly

47
尝试从`formatoptions`中移除`t`选项:
:set formatoptions-=t

选项t将插入换行符,使文本在textwidth设置的宽度处换行。您还可以将此命令放在您的.vimrc中,只需删除冒号(:)。

5
对我而言,这似乎是满足原帖作者需求的最佳方案。我喜欢 Vim 在 tw 处仍然显示竖直线的特点。 - mitchus
7
这实际上是唯一一个回答到了提问者的问题,其他大多数回答则相反。提问者仍希望长行自动换行显示,但是不希望 vim 自动插入换行符。 - sebastian
12年过去了,仍然不是最受赞的答案:s - jpoppe

41

:set tw=0

VIM不会自动插入换行符,但会保持自动换行。


5
我希望你能翻译以下内容:我想完全相反……当我输入时,我仍然想看到“视觉”80列限制,并且我不想让Vim在第80列后自动添加换行符。我该怎么做?答案:我想完全相反......当我输入时,我仍然希望看到“视觉”80列的限制,而且我不希望Vim在第80列后自动添加换行符。请问如何做到这点? - Olivier Pons
正是我所需要的!如果您通常设置了 tw 并想要禁用它,则需要这个。 - young_souvlaki

37

使用:set nowrap命令,能很好地实现不换行!


16
除了它与OP所定义的期望行为相反以外,它实际上做了相反的事情... :P - Morlock
7
@Morlock,但回答了我想知道的问题,而谷歌把我带到了这里 :) - Ben Usman
这个有没有快捷键? - Pini Cheyni
@PiniCheyni,将以下代码添加到您的 .vimrc 文件中: nnoremap <C-w> :set invwrap<CR> 这样您就可以使用 Ctrl+W 来切换文本换行了。 - reas0n

16
你可能会发现set linebreak很有用;当使用set wrap时,它会自动换行,但只会在空格处而不是单词中间进行换行。例如:
without linebreak the li
ne can be split on
a word

并且

with linebreak on the
line will be
split on 
whitespace only

1
强烈建议避免缩写选项,因为将来您将不得不在帮助系统中进行搜索以了解您所设置的内容,因此请使用“set nolinebreak”而不是“set lbr”。 - SergioAraujo

14

set formatoptions-=t 保持可视文本宽度但在插入模式下不添加新行。


5

奇怪的是,这样一个简单的设置需要这么多的“咒语”才能正常工作。

现在回答你的问题,对我来说,似乎以下组合可以正常工作:

:set wrap linebreak nolist

这似乎可以防止现有的行断裂,只需换行即可。

以及

set formatoptions=l

(这可以防止新/编辑的行中断,而+=对我来说无法实现这一点,因为其他设置/插件似乎会找到空间并添加自己的选项,覆盖我的选项。)

4
如果你和我一样在Windows上运行gVim,那么你的.vimrc文件可能会调用另一个“示例”Vimscript文件,该文件会自动为文本文件设置textwidth(在我的情况下为78)。 类似于这个问题的我的答案 - 如何停止gVim在第80列处换行 - 在Vi和Vim Stack Exchange网站上。

In my case, Vitor's comment suggested I run the following:

:verbose set tw?

Doing so gave me the following output:

textwidth=78
      Last set from C:\Program Files (x86)\Vim\vim74\vimrc_example.vim

In vimrc_example.vim, I found the relevant lines:

" Only do this part when compiled with support for autocommands.
if has("autocmd")

  ...

  " For all text files set 'textwidth' to 78 characters.
  autocmd FileType text setlocal textwidth=78

  ...

And I found that my .vimrc is sourcing that file:

source $VIMRUNTIME/vimrc_example.vim

In my case, I don't want textwidth to be set for any files, so I just commented out the relevant line in vimrc_example.vim.


1
与其编辑vimrc_example.vim文件,我只是在vimrc文件中添加了“autocmd FileType text setlocal textwidth=0”,这解决了其他建议的解决方案无法解决的问题。 - GrandAdmiral

3

set nowrap可以让你在vi/vim中粘贴一个长行时不插入新的换行符,但是这样会导致该行过长而难以阅读。相反地,这一行将成为一个需要滚动才能阅读的长行。

如果要使文本自动换行而不插入换行符,需要使用set wrap(这可能已经是默认设置,无需更改),并且设置set textwidth=0

在某些系统上,textwidth=0是默认设置。如果您没有发现这种情况,请将set textwidth=0添加到您的.exrc文件中,以便它成为所有vi/vim会话的默认设置。


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