在大约 80 个字符处断开长行并在每个新行前添加字符

Breaking long lines at ~80 characters and prepending characters to each new line

我有几行非常长的文本,我基本上想在 80 个字符标记之前或之上的字边界处硬换行(打断)。但是,我还需要在每个新断开的行前添加字符,如下所示:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra euismod pulvinar. Fusce quis nibh commodo, commodo massa eu, ultricies nisi. Phasellus ac nulla odio.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra
    \ euismod pulvinar. Fusce quis nibh commodo, commodo massa eu, ultricies
    \ nisi. Phasellus ac nulla odio.

我找到了很多方法来打断长行,但是 none 我已经能够修改这些方法以生成如上所示的输出,我不能在事后简单地添加它,因为这将再次扩展超过 80 个字符的行。

任何人都可以推荐一个 Vim 兼容的正则表达式或本机命令来进行上述格式化吗?也欢迎使用 sed 或 fmt 或其他外部工具,但在这种情况下,我可以在 Vim 中使用的东西将是首选。

到目前为止我发现和尝试的内容:

我确信我遗漏了一些相当简单的东西,但仍然坚持如何执行该条件格式以基本上在 80 个字符之前的最后 space 处中断。任何建议将不胜感激。谢谢。

你需要修改两点:

  • 用 0 到 80 的量词 \{0,80}(或 \{0,78} 替换恰好 80 的量词,因为看起来你想要 80-2=78 的限制,因为 \t\ 将是两个您要插入的其他字符)
  • 在末尾添加一个尾随单词边界,\>
  • \t\ 添加到替换模式以在创建的行中插入 TAB 字符和 \

您可以使用

:%s/.\{0,78}\>/&\r\t\/g

冗长的 awk 命令也可以很好地完成工作:

awk -v n=76 '
{
   len = 0
   for (i=1; i<=NF; ++i) {
      len += 1 + length($i)
      printf "%s", $i
      if (len > n && i < NF) {
         printf "%s\t\ ", ORS
         len = 6
      }
      else
         printf "%s", OFS
    }
    print ""
}' file

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra
    \ euismod pulvinar. Fusce quis nibh commodo, commodo massa eu, ultricies
    \ nisi. Phasellus ac nulla odio.

对于下面提供的第二个示例,我得到了这个输出:

_Array1DToHistogram _ArrayAdd _ArrayBinarySearch _ArrayColDelete _ArrayColInsert
    \ _ArrayCombinations _ArrayConcatenate _ArrayDelete _ArrayDisplay _ArrayExtract
    \ _ArrayFindAll _ArrayInsert _ArrayMax _ArrayMaxIndex _ArrayMin _ArrayMinIndex
    \ _ArrayPermute _ArrayPop _ArrayPush _ArrayReverse _ArraySearch _ArrayShuffle

每行的长度为:

80
80
79
79