web-dev-qa-db-ja.com

vimの段落内の行を結合する

自動改行をオンにしてvimで長いドキュメントを入力したため、すべての行がたとえば79文字で改行されたとします。ドキュメント全体にフォーマットを適用して、その長さのすべての行を分割することもできます。

段落は、ドキュメント内で空白行で区切られています。

ここで、段落内に改行を入れたくないと判断しました。

段落の境界を完全に削除せずに、段落内のすべての改行を削除するにはどうすればよいですか?

私はこれを素早くばかげたハックにしましたが、適切な方法を探しています。

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
13
dggoldst

これはあなたが望むことをしていると思います:ファイルの終わりに空の行があることを確認してから、すべての段落を結合します(空の行で終了します)。

G:a

.
:g/^./ .,/^$/-1 join

説明:最初にファイルの最後に移動し、:aを追加して空の行を追加します(これを行うためのより洗練された方法があるかもしれません。対話的に、最初の3行をo<ESC>に置き換えることができます)。次に、まだ考慮されていない空白以外の行(:g/^./)ごとに、選択した行(.)で始まり1行で終わる範囲にjoinコマンドを適用します。次の空の行の前の行(/^$/-1)。

必要に応じて、空白行を残したくない場合は:g/^$/d(その後、-1を削除できます)。

これはそれを行う必要があります:

:set tw=99999
gggqG

twは、少なくとも最長の段落の文字数と同じ大きさの値に設定されます。 ggはカーソルを最初の行に移動します。 gqは再フォーマットするコマンドです。 Gはカーソルを最後の行に移動し、gqに現在のカーソル位置から最後の行に再フォーマットするように指示します。

12
garyjohn
  1. 目的の段落内にカーソルを置きます

  2. タイプ:vipJ

vipは現在の段落を強調表示し、Jはすべての行を結合します)

5
Juan

それを行うための最もクリーンな方法ではないかもしれませんが、これが私が使用するものです:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one Word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first Word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

VIM 7.2。で動作します)

段落が最初にフォーマットされたときに分割された正確な方法によっては、gJコマンド(スペースなしで結合)をJコマンド(スペース付きで結合)に置き換えることができます。

任意の999 countは少なくともファイル内の段落数である必要があります-必要に応じてより大きな数を選択し、プロセッササイクルだけを失うことができます。段落間に空白行が1つしかない場合、次のコマンドを使用して、より正確な段落数を取得できます。

:%s/^$//gn     # returns "999 matches on 999 lines"
2
goldPseudo