次の内容のテキスト ファイルがあります。
+----------------------------------------------------------------+
| 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
問題を解決するための非常に優れたツールになる可能性があるように思えますが、現在は次のようになります。
par
パターンを無視するように指示し+- ... -+
ます (ちなみに、最初のパターンは障害物を表し、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".