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は正当化できないようです(以下を参照)が、スペースで区切られた行を切り取った場合(fmtまたはfold上記のアプローチ)、出力を保存し、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 プログラムが過去に提案されたことは知っていますが、標準ツールでそれを自力で作成できるかどうか知りたいです。

編集1

(マシュー・ストローブリッジに感謝) 最初の行を削除する+- ... -+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 つ目のパターンはそうでないのはなぜですか?);
  2. 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

また

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

At this point, I consider my "problem" solved, but anybody willing to continue with the alternative par approach is welcome!

Thanks again to anybody and thanks glts also for the Vim "lesson".

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) で始まる行として識別しました。

この手順をバッチ プロセスの一部にするために、これらのコマンドを、たとえばmyformat.vim. :sourceこれは、Vim へのコマンドライン引数として提供された多数のテキスト ファイルに対して繰り返し行うことができます。

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

:argdoこれは、コマンドが輝く状況の 1 つです。

于 2013-06-01T10:03:57.527 に答える