如何强制vimdiff换行?

44

在VIM中比较两个文件时,我更喜欢将行进行换行处理。然而,默认情况下vimdiff会将换行关闭。

是否有一种方法可以自动为每个差异设置行换行?


谢谢您的输入。它可以工作,但仅当在diff模式下启动vim时才能使用。我还想在从vim内部启动diff时强制换行。是否也可以通过类似的命令实现?谢谢! - mgouin
很有趣,但我恰好遇到相反的问题,但“set nowrap”不起作用。如果我进入diff模式,行会自动换行。 - ka3ak
8个回答

46

我使用以下内容:

autocmd FilterWritePre * if &diff | setlocal wrap< | endif

FilterWritePre 在生成的差异写入缓冲区之前立即触发,setlocal wrap< 复制了全局变量 wrap 的值。当然也可以直接强制执行 setlocal wrap


1
非常感谢!这正是我在寻找的。我想投票,但我不能(太新了)... - mgouin
1
我不知道为什么,但这个不起作用。我在Debian机器上使用vim 7。user2442259的答案有效。 - eddy147
@eddy147 你的全局设置是wrap还是nowrap?如果是后者,请尝试使用setlocal wrap而不是setlocal wrap<来执行相同的autocmd - Nikita Kouevda

44

你可以将以下内容放入你的vimrc文件中。

au VimEnter * if &diff | execute 'windo set wrap' | endif

6
对我来说,实际上这个方法对我有效,但被接受的答案却不行。 - BHS

23

当vim已经启动时,在每个分割窗口文件上开始diff和wrap的命令为:

:diffthis
:set wrap

然而,diff + wrap显示不正确:

如果一边文件上有一行很长的行,而另一边文件上的行很短或者缺失,那么长行将占据两行,而短行或缺失行只占一行。

这导致了两个文件的垂直位移。当然,颜色有助于在视觉上弥补这种位移。但是在几行差异中,位移可能会超过窗口的高度,使得diff难以阅读。

所以问题并没有完全解决... 请给予建议。


7
":windo set wrap" 在两个拆分窗口中设置自动换行。 - Sophia Feng
@SophiaFeng 这不是我们正在讨论的问题。每当来自2个文件的当前行占用不同数量的虚拟行以进行显示时,都会使滚动绑定更加不同步。 - noname

6
您可以运行这个。
vimdiff -c 'set wrap' -c 'wincmd w' -c 'set wrap' file1 file2

3

我必须为演示解决这个问题,其中我想让vimdiff仅在从特定终端启动时换行。

最后我采取了粗略的方法:

alias vimdiff='vimdiff +"windo set wrap"'
vimdiff file.orig file

3
如果你有更多的文件,并且不想在vimrc中永久设置,可以使用以下命令:
vimdiff -c 'windo set wrap' file1 file2 file3 [file4]

在vim打开后,您只需执行window set wrap命令即可。

0
从VIM 8.2.2490开始,diffopt有一个followwrap选项。您可以使用:set diffopt+=followwrap进行设置。

0

我发现:set diffopt+=followwrap设置只影响第二个窗格,原因我不知道。我必须单独使用:setlocal wrap来使第一个窗格也换行,而且这个设置只在diffopt设置也生效的情况下才有效。虽然很奇怪,但至少它能用。现在的问题是将其放入某个条件语句中,检查vim版本,以便我可以拥有一个跨平台通用的.vimrc


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