1

我有一个包含以下内容的文本文件:

+----------------------------------------------------------------+
|                       This is a section                        |
+----------------------------------------------------------------+

####################   This is a subsection   ####################

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. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

#################   This is another subsection   #################

我希望每行不超过一定数量的字符(在本例中为 66 个),因此可以在需要时插入换行符;此外,文本应在两边对齐,因此在需要时也可以添加多个空格。最后,不应合并短行,不应修改包含所需字符数量的行,如下所示。

+----------------------------------------------------------------+
|                       This is a section                        |
+----------------------------------------------------------------+

####################   This is a subsection   ####################

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.  Duis  aute  irure  dolor
in reprehenderit in voluptate velit esse cillum dolore  eu  fugiat
nulla pariatur.  Excepteur sint occaecat cupidatat  non  proident,
sunt in culpa qui officia deserunt mollit  anim  id  est  laborum.

#################   This is another subsection   #################

不幸的是,fmt无法证明

fmt --width=67 in

+----------------------------------------------------------------+
|                       This is a section                        |
+----------------------------------------------------------------+

####################   This is a subsection   ####################

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. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.

#################   This is another subsection   #################

par在尝试处理该文件时给出错误(至少在最近的 Ubuntu 上):

par 66j < in

par error:
Cannot justify.

我也试过fold

fold -w 66 in

但它打破单词只是为了达到行的限制,并且通过-s选项它的行为类似于fmt(在旧的 openSUSE 上它也会删除空行)。

似乎 Vim 无法证明该行是否比其指定的 textwidth 长(见下文),但如果我切断以空格分隔的行(fmtfold接近上面),保存输出,在 Vim 中打开它并使用以下说明

:runtime macros/justify.vim
:% call Justify(66,3)   # 3 is the maximum allowed space chars to add

+----------------------------------------------------------------+
|                       This is a section                        |
+----------------------------------------------------------------+

#################### This  is  a  subsection  ####################

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.  Duis  aute  irure  dolor
in reprehenderit in voluptate velit esse cillum dolore  eu  fugiat
nulla pariatur.  Excepteur sint occaecat cupidatat  non  proident,
sunt in culpa qui officia deserunt mollit  anim  id  est  laborum.

################# This  is  another  subsection  #################

我可以获得“几乎”所需的结果(在“小节”内添加空格)。但最糟糕的缺点是需要直接交互,而我需要批处理方法,因为整个过程需要自动化。

综合起来,如果有任何解决方案,我将非常感谢标准的 Unix 文本工具(可能相互通过管道)或以“批处理模式”(如果可能)而不是自定义脚本调用 Vim 宏。我知道过去已经建议了一个名为(尚未尝试过)的 Perl 程序paradj我想知道标准工具是否可以自己制作。

编辑 1

(感谢 Matthew Strawbridge)如果我删除第一行+- ... -+thenpar能够处理文件并返回

|          This          is          a          section          |
+----------------------------------------------------------------+

#################### This is a subsection ####################

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. Duis aute irure dolor in
reprehenderit  in voluptate  velit  esse cillum  dolore eu  fugiat
nulla pariatur.  Excepteur sint  occaecat cupidatat  non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.

################# This is another subsection #################

在我看来,这par可能是解决问题的一个很好的工具,现在变成:

  1. 指示par忽略+- ... -+模式(顺便说一下,为什么第一个代表障碍而第二个不代表?);
  2. 指示par不要编辑“sections”和“subsections”内的空格。这可能会转化为“不要触摸具有所需字符数的行,其中最后一个字符不是空格”(假设我不使用制表符)。

(请注意,通常这个文件可能会更长,并且“section”和“subsections”模式可以重复多次)。

非常感谢大家,对篇幅过长感到抱歉。

编辑 2

(感谢 glts)我已经测试了您的建议,交互式和批处理方法都做得很好;后者唯一的一点是,仍然需要与 Vim 进行最少的交互。

在谷歌搜索了一下之后,我找到了一些语法示例来解决最后一个任务。

vim -E -s in <<-EOF
:set textwidth=66
:g/^\a/normal! gqq
:runtime macros/justify.vim
:g/^\a/Justify 66 3
:update
:quit
EOF

或者

vim -es -c 'set textwidth=66' -c 'g/^\a/normal! gqq' -c 'runtime macros/justify.vim' -c 'g/^\a/Justify 66 3' -c wq in

在这一点上,我认为我的“问题”已经解决,但欢迎任何愿意继续使用替代par方法的人!

再次感谢任何人,也感谢 glts 的 Vim“课程”。

4

1 回答 1

1

你可以在 Vim 中做很多这样的事情。

例如,这是一种交互式方法,可以满足您的要求。

  1. 设置'textwidth'为 66 并使用运算符将​​行格式化为段落gq

    :set textwidth=66
    :g/^\a/normal! gqq
    
  2. 来源macros/justify.vim并证明你的段落。

    :runtime macros/justify.vim
    :g/^\a/Justify 66 3
    

它的效果如何取决于您现有格式的一致性。我已将段落标识为以 开头的行\a,即字母字符(请参阅 参考资料:h /\a)。

为了使这个过程成为批处理的一部分,您可以将这些命令保存在一个 Vim 脚本文件中,例如,myformat.vim. 然后,您可以:source对作为 Vim 的命令行参数提供的大量文本文件重复执行此操作。

$ ls
a.txt  b.txt  c.txt  myformat.vim
$ vim *.txt
:argdo source myformat.vim

这是:argdo命令大放异彩的情况之一。

于 2013-06-01T10:03:57.527 回答