Vim:换行文本(“gq”)而不修改带下划线的标题

Posted

技术标签:

【中文标题】Vim:换行文本(“gq”)而不修改带下划线的标题【英文标题】:Vim: wrap text ("gq") without modifying underlined headings 【发布时间】:2010-04-21 11:45:05 【问题描述】:

在 Vim 中是否有一种方法可以对带有下划线标题的文本进行格式化?

在 Markdown 中,有两种表示标题的方式:

#Level 1 heading
##Level 2 heading
###Level 3 heading

仅适用于 1 级和 2 级:

Level 1 heading
===============

Level 2 heading
---------------

我喜欢下划线的风格,因为我觉得它读起来更好。

当我在 Vim 中使用 :set textwidth=72 编写 markdown 时,我希望能够使用 gggqG 重新格式化整个文档,但它会将这些带下划线的标题视为段落,并将它们压缩到一行中。因此,如果我从以下内容开始:

Lorem ipsum
===========

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 

在整个段落上运行gq 后,我最终会得到这样的结果:

Lorem ipsum ===========

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. 

有什么方法可以阻止 Vim 格式化带下划线的标题?

我想必须有一个使用formatexprformatprg 的解决方案。我研究了par 的文档,尽管它非常强大,但它看起来好像不是它的功能之一。所以我想知道是否有另一个外部程序可以与formatprg 一起使用,它可以理解降价,或者是否可以使用带有formatexpr 设置的vimscript 来实现。

【问题讨论】:

【参考方案1】:

sorta 工作的一个选项是将下划线字符串添加到comments 变量。

如果你的下划线字符串是固定大小的,你可以只添加那些:

:set comments+=:---------------,:===============

如果它们的大小可变(不止一个):

:set comments+=n:--,n:==

使用多于一个允许段落以单个 -= 开头,并防止后续行添加注释字符串。

删除上面的 + 以将 cmets 设置为这些字符串,而不是添加它们。

在某些情况下,格式会出现意外情况(例如,连续行上的下划线)。我确信有一种更合适的方法可以做到这一点,但希望这能让你开始。

:h comments
:h format-comments
:h formatoptions
:h fo-table

【讨论】:

这感觉有点骇人听闻,但只要q 标志包含在formatoptions 设置中,它就可以正常工作。我的下划线字符串通常与上一行文本的长度相匹配,因此我使用了可变大小设置。感谢您的帮助。除了答案中列出的帮助参考之外,我发现这很有帮助::help 30.6【参考方案2】:

至少你可以为它设置一些宏。

例如以某种方式将文本放置在第一段,搜索第一个标题下划线,然后向下移动 2 行,然后在视觉上选择下一个下划线减去 3 行的区域,然后格式化:

qa/^===========$/jjv/^===========$/-3<CR>gqq

现在您可以使用您的a 宏了。

HTH

【讨论】:

以上是关于Vim:换行文本(“gq”)而不修改带下划线的标题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Cmder 设置为不换行文本输出

使用 innerHTML 时换行文本

使用 CSS 调整换行文本的大小 [重复]

IOS:UITextView 旋转 iOS 7 换行文本

像最新的 Safari 一样使用空格换行文本:pre

为啥 macOS 中的 SwiftUI 多行换行文本在 Preview 中有效,但在实际应用中无效?