Vim中的自动换行(保留缩进)


92

我只是在看这篇文章,它描述了如何在vim中包装整个单词。公认的解决方案是这样的:

:set formatoptions=l
:set lbr

其中包含以下文本(选项卡显示为\ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

这完成了这样的行为(选项卡显示为\ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

但是,我想重新定义此功能。我希望包装线的前面具有与上面的行加一相同数量的选项卡。即:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

有任何想法吗?


34
+1以使问题尽可能清楚。
杰弗里·何塞

您是希望文本在窗口的边缘处自动换行,还是在行达到一定长度时重新换行?我认为您想进行硬包装(在文本中将在“ will”之后插入换行符),但是很难从示例中看出来。
Bill Odom

@Bill,我对软包装最感兴趣,但是硬包装解决方案也是可以接受的。
2010年

1
您所需的功能当前未内置在Vim中。但是,有一个补丁即将发布:groups.google.com/group/vim_dev/web/vim-patches(它是#15,“正确缩进换行”)。
Bill Odom

相关信息:VimCasts在使用外部unix实用程序来解决此问题方面表现出色
Damien Wilson

Answers:


18

breakindent补丁有你在找什么。我使用此线程中的说明成功地应用了它:

使用Homebrew在OS X上使用breakindent补丁对Vim进行补丁

特别是echristopherson的Homebrew公式。

我知道这个线程很旧,但是在Google上很流行,在尝试寻找解决方案时我多次遇到它。

编辑:这个补丁现在作为7.4.338补丁包含在vim中。参见:https : //retracile.net/blog/2014/07/18/18.00

在优胜美地(Mac OS X)上,我在hombrew上使用了snowbound的命令:

brew install macvim --with-features=huge --override-system-vim --HEAD 

该补丁似乎无法与自制软件上的最新macvim一起使用?@ Exit42如何使它工作?
2015年

虚拟机 我编译的Macvim带有自制错误的边缘brew install macvim --with-features=huge --override-system-vim --HEAD
下雪了

1
请参阅下面的答案:stackoverflow.com/questions/2828174/… 无需在较新版本的vim中安装补丁。
2015年

26

最初提出问题时,此方法不起作用,但自2014年6月25日起,此方法将起作用。(假设您将vim更新为该日期之前的版本)

添加到您的.vimrc:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

就是这样!

-

有些人(包括我自己)在多台计算机上共享一个.vimrc。在这种情况下,确保该行的健壮性很重要(以避免令人讨厌的错误消息)。这样好一点:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

这样,如果您使用的是较早版本的vim,则不会收到错误消息。


有趣的是,这适用于我的cygwin的7.4 vim,但不适用于我的unbuntu的7.4 vim。我猜想它需要进一步普及,但是很快就会被广泛采用。
2014年

1
在Vim 7.4 @ ArchLinux中工作。
安迪·米哈伊连科

1
您可以改用此测试:if has("patch-7.4.354")
Lawrence Kesteloot

这不能回答有关OP备注的问题:相同数量的制表符(...) 加一个。在我看来,这也是非常重要的,您可能经常需要保留额外的缩进并将包装好的片段向右移(紧紧排列的清单,注释等);
血腥

8

您将获得的最好的showbreak选择是将固定的字符串放在每个换行符的前面(我使用set showbreak=...)。


@AlexanderBird根据:help 'showbreak',不,您不能- showbreak只是一个字符串。
罗里·奥肯

4

我同意“ showbreak”是最佳选择的回答。Showbreak通常不允许您将非打印字符(例如空格或制表符)放入showbreak字符串中,因此通常使用的方法只是沿左边界提供一个指示符,即没有实际缩进。这不是很好,因为我认为OP的主要目标是使包裹的线缩进,以防止它们混乱的左边缘区域并看起来像它们自己的线。

因此,使用showbreak添加(丑陋的)缩进的一种方法是只使用很多字符,例如“:set showbreak => --------------->”。结果是这样的:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

更好的选择是使用不间断的空格字符(假设您的Vim实例启用了unicode),可以使用ctrl-v,160的键序列将每个字符输入到showbreak字符串中。这样,您可以在左侧输入空白的showbreak字符串,并且看起来像是真正的缩进。例如,“:set showbreak = ........... >> >>”,其中每个'。' 该命令中的“#”实际上是通过按ctrl-V,160输入的不间断空格字符。这样一来,您最终会得到一个缩进的包装,如下所示:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

您仍然没有任何能力根据上一行的缩进来更改缩进的级别,但是至少您可以获得干净的换行缩进,并且沿窗口的左边缘没有很多视觉混乱。如果换行的缩进小于实际行的开头,仍然可能会造成混淆,但是可以通过使showbreak“ indent”非常大(即,大于代码中通常发现的任何缩进)来避免这种情况),但仍要足够小,以提供足够的空间来清晰地包裹文字。对于许多用途,我认为40或50个空格的showbreak缩进效果很好。


7
您可以通过转义空格将它们放到showbreak中:set showbreak=\ \ \ \ 。但是对于选项卡仍然不起作用。
Bill Odom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.