Vim中的智能包裹

qcbq4gxm  于 2022-11-11  发布在  其他
关注(0)|答案(8)|浏览(169)

我一直想知道Vim是否有智能换行的功能,这样它就可以保持与它缩进的行相同的缩进。我在一些其他的文本编辑器上注意到了这一点,比如电子文本编辑器,发现它帮助我更容易地理解我所看到的内容。
例如与其说

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
an example
    </a>
</p>

它将显示为

<p>
    <a href="somelink">
        This is a bogus link, used to demonstrate
        an example
    </a>
</p>
hwazgwia

hwazgwia1#

有一个补丁可以解决这个问题,但是它已经存在了 * 年 * 了,而且上次我检查的时候并没有完全应用它。请参见http://groups.google.com/group/vim_dev/web/vim-patches中的“正确缩进换行”条目--我真的希望这个能出现在主线中。
更新:该链接似乎已bitrotted. Here is a more up to date version of the patch
更新2:它已经是merged上游(截至7. 4. 345),所以现在你只需要:set breakindent

kmynzznz

kmynzznz2#

我认为不可能有完全相同的缩进,但您仍然可以通过设置“showbreak”选项来获得更好的视图。

:set showbreak=>>>

示例:

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
>>>an example
    </a>
</p>

真实的的代码看起来比上面的示例代码要好,因为Vim对'〉〉〉'使用了不同的颜色。

qgelzfjb

qgelzfjb3#

更新:2014年6月,一个patch to support a breakindent option被合并到Vim(版本7.4.346或更高版本,以获得最佳支持)。
你也可以试试:set nowrap,它允许vim通过向右滚动来显示较长的行,这对于检查文档的整体结构可能很有用,但是对于实际编辑来说可能不太方便。
与您所寻找的内容相近的其他选项是linebreakshowbreak。使用showbreak,您可以修改换行行左边距显示的内容,但遗憾的是,它不允许根据当前上下文进行可变缩进。

9bfwbjaz

9bfwbjaz4#

我所知道的唯一方法是使用一个回车符(Cfreak提到的),并将textwidth选项与各种缩进选项结合起来。如果缩进配置正确(我相信默认情况下是html语法,否则请参见autoindentsmartindent选项),您可以:

:set formatoptions = tcqw
:set textwidth = 50
gggqG

如果您对formatoptions设置有任何自定义设置,最好简单地执行以下操作:

:set fo += w
:set tw = 50
gggqG

它的作用:

:set fo+=w  " Add the 'w' flag to the formatoptions so 
            " that reformatting is only done when lines
            " end in spaces or are too long (so your <p>
            " isn't moved onto the same line as your <a...).
:set tw=50  " Set the textwidth up to wrap at column 50
gg          " Go to the start of the file
gq{motion}  " Reformat the lines that {motion} moves over.
G           " Motion that goes to the end of the file.

请注意,这与软包络不同:它会在源文件和屏幕上换行(当然,除非你不保存它!)。还有其他一些设置可以添加到formatoptions中,当你键入时,这些设置会自动格式化:详情请参见:help fo-table
如需详细信息,请参阅:

:help 'formatoptions'
:help fo-table
:help 'textwidth'
:help gq
:help gg
:help G
:help 'autoindent'
:help 'smartindent'
czfnxgou

czfnxgou5#

:set smartindent
:set autoindent

我想你还是要用退货的

6tqwzwtp

6tqwzwtp6#

如果您的HTML格式足够好,通过xmllint运行它可能会有所帮助:

:%!xmllint --html --format
j8yoct9x

j8yoct9x7#

A宏解决方案:

编辑:

操作gq{motion}自动格式化为变量“textwidth”设置的任何值。这比使用我的宏的80lBi^M更容易/更好。
如果启用了自动缩进

:set autoindent

然后在行尾输入回车,下一行将缩进相同的缩进量。如果愿意,可以使用此方法在换行中硬输入。下面的宏利用此方法自动缩进文本:
将寄存器Z设置为:

gg/\v^.{80,}$^M@x (change 80 to whatever length you want your text to be)

并将寄存器X设置为:

80lBi^M^[n@x (change 80 to whatever length you want your text to be)

那就做

@x

以激活宏。几秒钟后,您的文本将全部以80个字符或更少的正确缩进行显示。

说明:

以下是宏的剖析:
第1部分(宏z):

gg/\v^.{80,}$^M@x

gg - start at the top of the file (this avoids some formatting issues)
/  - begin search
\v - switch search mode to use a more generic regex input style - no weird vim 'magic'
^.{80,}$ - regex for lines that contain 80 or more characters
^M - enter - do the search (don't type this, you can enter it with ctrl+v then enter)
@x - do macro x

第2部分(宏x):

80lBi^M^[n@x

80l - move right 80 characters
B   - move back one WORD (WORDS include characters like "[];:" etc.)
i^M - enter insert mode and then add a return (again don't type this, use ctrl+v)
^[  - escape out of insert mode (enter this with ctrl+v then escape)
@x  - repeat the macro (macro will run until there are no more lines of 80 characters or more)

警告:

  • 如果有一个80个字符或更长的WORD,则此宏将中断。
  • 此宏不会执行智能操作,如缩进标记后面的行。
  • 使用lazyredraw设置(:set lazyredraw)可以加快此过程
9rygscc1

9rygscc18#

这个特性已经被implemented on June 25, 2014作为补丁7.4.338。随后有几个补丁完善了这个特性,最后一个是7.4.354,所以这是你想要的版本。

:help breakindent
:help breakindentopt

下面摘录自vim帮助:

'breakindent'     'bri'   boolean (default off)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Every wrapped line will continue visually indented (same amount of
        space as the beginning of that line), thus preserving horizontal blocks
        of text.

'breakindentopt' 'briopt' string (default empty)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Settings for 'breakindent'. It can consist of the following optional
        items and must be seperated by a comma:
                  min:{n}     Minimum text width that will be kept after
                              applying 'breakindent', even if the resulting
                              text should normally be narrower. This prevents
                              text indented almost to the right window border
                              occupying lot of vertical space when broken.
                  shift:{n}   After applying 'breakindent', wrapped line
                              beginning will be shift by given number of
                              characters. It permits dynamic French paragraph
                              indentation (negative) or emphasizing the line
                              continuation (positive).
                  sbr         Display the 'showbreak' value before applying the 
                              additional indent.
        The default value for min is 20 and shift is 0.

与此相关的还有showbreak设置,它将使用您指定的字符作为偏移量的后缀。

配置示例

" enable indentation
set breakindent

" ident by an additional 2 characters on wrapped lines, when line >= 40 characters, put 'showbreak' at start of line
set breakindentopt=shift:2,min:40,sbr

" append '>>' to indent
set showbreak=>>

行为说明

如果不指定sbr选项,则任何showbreak字符都将追加到缩进中。从上面的示例中删除sbr将导致4个字符的有效缩进;使用这些设置,如果只想使用showbreak而不需要额外缩进,请指定shift:0
您也可以给予负位移,其效果相当于将showbreak字符和换行文字拖曳回任何可用的缩排空间。
当指定min值时,如果终端宽度较窄,则移动量将被压缩,但showbreak字符始终保留。

相关问题