web-dev-qa-db-ja.com

vimで長い行を分割する方法は?

私は次のようなブロックで形成された非常に大きなテキストファイルを持っています

Short line.
Really long line.
Short line.

空の行で区切られています。vim(Linuxの場合)を使用して長い行を分解し、次のようなブロックを取得したいと思います。

Short line.
This was
part of
a long line.
Short line.

gq(およびgw)に関する私の問題は、各ブロックを段落全体としてリフローすることです。つまり、各ブロック内の2つの改行が保持されず、:help fo-tableによると、gqのフォーマットオプションのいずれも私が望むことを実行できません。 。また、改行文字を段落区切り文字として定義できれば目標を達成できると思いましたが、:help paragraphによれば、それらはハードコーディングされています。

編集:gqまたはgwを使用して各長い行を1つずつフォーマットできることを知っていますが、ファイルが数千行以上実行されるため、これを自動的に実現する方法を探しています。

12
A.P.
:%norm! gww

これは、カスタマイズされたマッピングを考慮せずに、バッファ全体にnormalコマンドgww(現在の行をgwでフォーマットする)を適用します(例:gwは別のものにマップされています)。

見る

  • :help :%
  • :help :norm
  • :help gww

この代替案は、コメントでのベンの提案に従っており、正規表現のマッチング機能により他の同様の状況でより適切に適合する可能性があるため、以下に保存されている元のソリューションよりも簡単です。ただし、「すべての行に一致する」場合は、不必要に野蛮です。


プログラムでバッファ内の個々の行ごとにgwwを適用します。

:g/^/norm gww

見る :help :gおよび:help norm^は行の先頭に一致します。これにより、実際にはこの一致が行われますevery line。

たとえば、より長い行のみを選択することもできます。 60文字で

:g/\%>60v/norm gww

(見る :help \%<)ですが、実際にはgwwtextwidthより長い行のみを再フォーマットするため、速度も結果もそれほど重要ではありません。

(「列」にvではなくcを使用しています。後者は実際に行の特定のバイト数を計算するためです。これを使用すると、予期しない結果が生じる可能性があります。マルチバイトエンコーディング。これは多くの場合注意が必要な理由です。実際には、gwwtextwidthより短い行を再フォーマットしないことに関して、上記と同じ理由で実際の問題ではありません。)

16

gqおよびgwコマンドのマニュアルをすでに読んでいるので、長い行に手動で移動してgw0gw$または別のgwコマンドを使用して、現在の行のみをフォーマットします。

テキストのブロック上でVimの長い行を分割する簡単な方法がわかりません。ただし、GNU/LinuxシステムでVimを使用しているとおっしゃっていたので、GNU fmtコマンドでテキストをフィルタリングすることをお勧めします。

ファイル全体:

:%!fmt --width=75 --split-only

現在の段落の場合(短いオプションを使用):

:'{,'}!fmt -75 -s

関連するfmtオプションの説明は次のとおりです。

  • -w, --width=WIDTH –最大行幅(デフォルトは75列)。オプション-WIDTH--width=DIGITSの省略形です(この省略バージョンを使用する場合は、最初のオプションである必要があります)。

  • -s, --split-only –長い行を分割しますが、補充しないでください。これは、既存の改行を保持するオプションです。

4

から:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing 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.
Short line.

「loremipsum」行にマーカーを置き、gwwを押すと(textwidth=40 明確にするために):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing 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.
Short line.

私にはあなたが求めているもののように思えます。そうでない場合は、遠慮なく明確にしてください。

1