* nix中双方的自动换行和对齐

时间:2013-06-01 09:13:41

标签: unix vim justify par

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

+----------------------------------------------------------------+
|                       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似乎无法证明,但如果我用空格(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宏。我知道过去称为paradj(尚未尝试过)的Perl程序alreadysuggested,但我想知道标准工具是否可以自行制作

编辑1

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

|          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”中的空格。这可能会转化为“不要使用最后一个字符不是空格的所需字符数来触摸行”(假设我不使用制表符)。
  3. (请注意,一般来说,此文件可能会更长,“section”和“subsections”模式可能会重复多次)。

    非常感谢大家,并且抱歉过长。

    编辑2

    (感谢glts)我已经测试了你的建议,交互式和批量方法都做得很好;与后者唯一的关系,仍然需要与Vim的最小互动。

    在谷歌搜索后,我发现some syntax examples也解决了这个最后的任务。

    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方法的人欢迎!

    再次感谢任何人,并感谢Vim“课程”。

1 个答案:

答案 0 :(得分: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
    
  3. 这种效果如何取决于您现有格式的一致性。我已将段落标识为以\a开头的行,即字母字符(请参阅:h /\a)。

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

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

    这是:argdo命令闪耀的情况之一。