代码之家  ›  专栏  ›  技术社区  ›  sixtyfootersdude

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

  •  85
  • sixtyfootersdude  · 技术社区  · 14 年前

    我只是在看 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               |
    |                                       |
    |---------------------------------------|
    

    不过,我想重新定义这个函数。我希望换行前面的制表符数目与上面的行加一个相同。Ie:

     *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               |
    |                                       |
    |---------------------------------------|
    

    有什么想法吗?

    4 回复  |  直到 6 年前
        1
  •  18
  •   Community rohancragg    7 年前

    这个 breakindent patch 拥有你想要的。我使用这个线程中的指令成功地应用了它:

    Patch Vim with the breakindent patch on OS X with Homebrew

    具体来说,Echristopherson的自制配方。

    我知道这个线程是旧的,但它在谷歌上很流行,当我试图找到一个解决方案时,我多次遇到它。

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

    在约塞米蒂(Mac OS X)上,我使用了Snowbound的命令和Hombrew:

    brew install macvim --with-features=huge --override-system-vim --HEAD 
    
        2
  •  23
  •   Jake T.    6 年前

    这个问题在最初被问到时不起作用,但到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,则不会收到错误消息。

        3
  •  8
  •   too much php    14 年前

    你能得到的最好的是 showbreak 选项,它将在每个包装行前面放置一个固定字符串(我使用 set showbreak=... )

        4
  •  4
  •   Herbert Sitz    14 年前

    我同意这样的回答:“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缩进可以很好地完成这一任务。