【问题标题】:Word Wrap in Vim (preserving indentation)Vim 中的自动换行(保留缩进)
【发布时间】:2010-05-13 15:45:40
【问题描述】:

我只是在看this post,它描述了如何在 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               |
|                                       |
|---------------------------------------|

有什么想法吗?

【问题讨论】:

  • +1 表示为使问题尽可能清晰而付出的努力。
  • 您希望文本在窗口边缘软换行,还是在行达到一定长度时硬换行?我认为您想要硬换行(在“将”一词之后在文本中插入换行符),但是从您的示例中很难分辨。
  • @Bill,我最感兴趣的是软包装,但硬包装解决方案也是可以接受的。
  • 你想要的功能目前还没有内置到 Vim 中。然而,有一个接近的补丁:groups.google.com/group/vim_dev/web/vim-patches(它是 #15,“正确缩进换行”)。
  • 相关:VimCasts 有一个关于使用外部 unix 实用程序处理此问题的精彩片段:vimcasts.org/e/18

标签: vim word-wrap


【解决方案1】:

最初提出问题时这不起作用,但从 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。我猜它需要更广泛一些,但很快就会被普遍采用。
  • 在 Vim 7.4 @ ArchLinux 中工作。
  • 你可以改用这个测试:if has("patch-7.4.354")
  • 这并没有回答关于 OP 评论的问题:相同数量的标签 (...) 加一个。顺便说一句,在我看来这也很重要,您可能经常希望保留额外的缩进并将包裹的片段向右移动(紧密排列的列表、注释等);
【解决方案2】:

breakindent patch 有你要找的东西。我使用此线程中的说明成功应用了它:

Patch Vim with the breakindent patch on OS X with Homebrew

具体来说,echristopherson 的 Homebrew 公式。

我知道这个帖子很旧,但它在谷歌上很受欢迎,我在尝试找到解决方案时多次遇到它。

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

在 Yosemite (Mac OS X) 上,我在 hombrew 中使用了 snowbound 的命令:

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

【讨论】:

  • 该补丁似乎不适用于自制软件上最新的 macvim? @Exit42 你是怎么让它工作的?
  • 非虚拟机。我用自制软件最前沿编译了 macvim brew install macvim --with-features=huge --override-system-vim --HEAD
  • 在下面查看我的答案:stackoverflow.com/questions/2828174/… 在较新版本的 vim 中不需要补丁。
【解决方案3】:

你会得到最好的选择是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“缩进”相当大(即大于代码中常见的任何缩进)来避免这种情况) 但仍然足够小,可以为文本的清晰换行提供足够的空间。对于许多用途,我认为 40 或 50 个空格的 showbreak 缩进会很好地做到这一点。

【讨论】:

  • 您可以通过转义将空格放入 showbreak::set showbreak=\ \ \ \ 。但是,仍然不适用于标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多