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


12

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

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それらに従ってハードコードされています。

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


ちなみに、私はvimのドキュメンテーションで問題の解決策を探しました。ここSUとWebでは、空っぽになりました。明らかな何かを見落としたら、この質問を喜んで削除します。
AP


@MartinSchröder:vi SEがあることを知ってうれしい!私はすでに知っていたので、これらの答えは、しかし、私の問題に対処しないgqgw。私もそこでやめなかったことがうれしいです:g。:)
AP

回答:


16
:%norm! gww

これにより、normalコマンドgww(現在の行をgwカスタマイズされたマッピングを考慮せずに、バッファー全体にします(たとえば、gw他のものにマップされた場合の問題を回避するため)。

見る

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

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


gwwバッファ内の各行にプログラムで適用する:

:g/^/norm gww

:help :gおよびを参照してください:help norm^行の先頭に一致します。実際には、これはすべての行に一致します

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

:g/\%>60v/norm gww

(を参照:help \%<)ですが、実際にgwwは、textwidthとにかくので、速度も結果もそれほど重要ではないかもしれません。

(私はv「列」の代わりに「仮想列」に使用しています。c後者は実際に行に特定のバイト数を計算するためです。これにより、マルチバイトエンコーディングを使用するときに予期しない結果が生じることがあります。実際には、それは上記と同じ理由で実際の問題ではありません、それはとにかくgwwより短い行を再フォーマットしませtextwidthん。


どうやら:gパターンなしで失敗するので、:g//norm gww動作しませんが:g/.*/norm gww動作します。
AP

@AP:ええ、私のために働いています。Debian UnstableのVim 7.4.488-6を使用しています。
ダニエルアンダーソン

4
:g//最後の検索パターンを再利用します。ない場合は失敗します。すべての:g/^/に適用するために使用します。
インゴカルカット

@IngoKarkat:ああ、理にかなっています。テスト中の最後のパターンは、後で示した行の長さを意識したパターンだったからです。答えを更新します。ヘルプのどこでこの「空のパターン」動作が言及されているか知っていますか?私はそれを簡単に見つけることができません。
ダニエルアンダーソン

マニュアルを見ると:help last-pattern、通常の検索で指定された情報が:globalコマンドにも適用されることが示唆されています。
ダニエルアンダーソン

4

すでにgqand gwコマンドのマニュアルを読んでいるので、長い行に手動で移動してからgw0gw$または別のgwコマンドを使用して現在の行のみをフォーマットするよりも便利なものがおそらく必要だと思います。

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

ファイル全体の場合:

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

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

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

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

  • -w, --width=WIDTH–最大行幅(デフォルトは75列)。このオプション-WIDTHは、省略形です--width=DIGITS(この省略形を使用する場合は、最初のオプションでなければなりません)。

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


言及してくれてありがとうfmt。ただし、vimのみを必要とするため、他の回答を受け入れることを好みました。
AP

@AP心配なし。それはすばらしい答えであり、私はそれを受け入れました。それとあなたの質問の両方が賛成に値する。
アンソニー

1

から:

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.

「lorem ipsum」行にマーカーを置き、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.

私にはあなたが求めているもののように思えます。そうでない場合は、お気軽にご説明ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.