Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix *nix中两边的自动换行和对齐_Unix_Vim_Justify_Par - Fatal编程技术网

Unix *nix中两边的自动换行和对齐

Unix *nix中两边的自动换行和对齐,unix,vim,justify,par,Unix,Vim,Justify,Par,我有一个包含以下内容的文本文件: +----------------------------------------------------------------+ | This is a section | +----------------------------------------------------------------+ #################### This is

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

+----------------------------------------------------------------+
|                       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.
但它只是为了达到行的极限而打断单词,并且使用
-s
选项,其行为类似于
fmt
(在旧版openSUSE上,它还删除空行)

如果行长度超过其指定的文本宽度(见下文),Vim似乎无法证明这一点,但如果我将行按空格(
fmt
折叠
方法)切割,则保存输出,在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程序,但我想知道标准工具是否可以自行开发

编辑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
可能是解决这个问题的一个非常好的工具,现在变成:

  • 指示
    par
    忽略
    +--+模式(顺便问一下,为什么第一个表示障碍,而第二个不表示障碍?)
    
  • 指示
    par
    不要编辑“节”和“小节”内的空格。这可能会转化为“不要在最后一个字符不是空格的情况下用所需的字符数触摸行”(假设我不使用制表符)
  • (请注意,一般情况下,该文件可能更长,“节”和“子节”模式可能会重复多次)

    非常感谢大家,很抱歉长度过长

    编辑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
    
    在这一点上,我认为我的“问题”已经解决了,但是任何愿意继续使用“<代码> PAR< <代码> >的人都是受欢迎的!p>
    再次感谢所有人,也感谢glts提供的Vim“课程”。

    您可以在Vim中完成很多这方面的工作

    例如,这里有一个交互式方法,可以满足您的要求

  • 'textwidth'
    设置为66,并使用运算符将行格式化为段落

    :set textwidth=66
    :g/^\a/normal! gqq
    
  • Source
    macros/justify.vim
    并对齐段落

    :runtime macros/justify.vim
    :g/^\a/Justify 66 3
    
  • 这项工作的效果取决于现有格式的一致性。我已将段落标识为以
    \a
    开头的行,即字母字符(请参阅)

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

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

    这是命令发出的情况之一。

    您可以在Vim中执行很多操作

    例如,这里有一个交互式方法,可以满足您的要求

  • 'textwidth'
    设置为66,并使用运算符将行格式化为段落

    :set textwidth=66
    :g/^\a/normal! gqq
    
  • Source
    macros/justify.vim
    并对齐段落

    :runtime macros/justify.vim
    :g/^\a/Justify 66 3
    
  • 这项工作的效果取决于现有格式的一致性。我已将段落标识为以
    \a
    开头的行,即字母字符(请参阅)

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

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

    这是命令发挥作用的情况之一。

    也许你可以用nroff做点什么?嗨,好吧,它需要直接的交互,比如LaTeX,但我觉得这种方法增加了问题的复杂性。也许我在寻找一个更简单的与古鲁相关的答案,比如“是的,这些程序存在并且是…”或者“不,你不能使用普通的纯文本工具,所以如果你真的需要它,就切换到更高级的文本合成系统”。无论如何,我会试试看。不管怎样,谢谢。如果您将您的文件摘要传递给它,
    par
    是否能按预期工作?可能只是因为有一行奇怪的字符导致了问题(例如,一行超过66个字符,不包含空格),您可以识别并修复这些问题。@Matthew非常感谢您的建议,我相应地编辑了我的问题。现在的问题主要是让
    par
    忽略一些模式(如果可能的话)。也许你可以用nroff做些什么?嗨,好吧,它需要直接的交互,比如乳胶,但我觉得这种方法增加了问题的复杂性。也许我在寻找一个更简单的与古鲁相关的答案,比如“是的,这些程序存在并且是…”或者“不,你不能使用普通的纯文本工具,所以如果你真的需要它,swi