将大约80个字符的长行打断,并在每一新行前加上字符



我有几行非常长的文本,我基本上想在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.

我已经找到了很多打断长行的方法,但没有一种是我能够修改的,以生成如上所述的输出,而且我不能简单地在事后添加它,因为这会再次将行扩展到80个字符以上。

有人能推荐一个与Vim兼容的regex或本机命令来进行上述格式化吗?使用sed或fmt或其他外部工具的东西也很受欢迎,但在这种情况下,我可以在Vim中使用的东西会更受欢迎。

到目前为止,我发现并尝试了什么:

  • regex在处换行,精确地Vim中的80个字符,或后的第一个空格-非常接近,但我不知道如何添加条件来在或80个字符上换行
  • 原生Vim格式化命令、fmt、fold等-所有这些都是关于80个字符硬包装的好建议,但似乎不可能修改为预先准备所需的字符
  • notepadd++风格的regex硬包装为80个字符-这可能适合我的需求,但不知道如何修改该regex以使其与Vim兼容
  • C#regex基本上也在做同样的事情,但同样,我不知道如何修改以供Vim使用

我确信我缺少了一些相当简单的东西,但我一直在思考如何使用条件格式来突破80个字符之前的最后一个空格。如有任何建议,我们将不胜感激。谢谢

您需要修改两件事:

  • 用零到80的量词{0,80}(或者{0,78},因为t\将是您想要插入的两个额外字符,所以您似乎希望有80-2=78的限制(替换正好为80的量词
  • 在末尾添加尾随字边界>
  • t\添加到替换图案中,以在创建的行中插入TAB字符和

您可以使用

:%s/.{0,78}>/&rt\/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 "%st\ ", 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