テキストを80列に再構成/強制するvimコマンド


240

私はvimを使用してvimのテキストの幅を自動的に設定する方法があることを知っていますset textwidthVim 80の列レイアウトの懸念など)。私が探しているのは=(インデント行コマンド)に似ていますが、80に折り返します。使用例は、textwidthでテキストを編集し、行を結合したり、テキストを削除/追加した後に折り返しが不十分になったりすることがあります。

理想的には、このコマンドは、選択した行を完全に再編成し、短い行に追加しながら、長い行を切り捨てます。例:

long line is long!  
short

コマンドを実行した後(ラップが13列であると想定):

long line is  
long! short

これが本当のvimコマンドでは不可能な場合、入力をパイプ処理できるコマンドラインプログラムがあると思いますか?

検索した後、いくつかのオプションがあるこのリファレンスを見つけました:http : //www.cs.swarthmore.edu/help/vim/reformatting.html


9
また、Vimがテキストの書式設定をparなどの外部プログラムに委任できることにも興味があるかもしれません。parでテキストフォーマットする方法を示すスクリーンキャストを作成しました。
nelstrom

@nelstromありがとう、TILについてpar。すごいね!
Steven Lu

2
あなたはテキストが(?うまくカット)スリムに見える&トリミングするときは、常に考えるgq- 紳士の四半期。(男性を擬人化することについての謝罪、ただしニーモニックは機能します。)
ruffin

回答:


372

textwidth80(:set textwidth=80)に設定し、ファイルの先頭に移動し(Ctrl- Homeまたはで実行できますgg)、と入力しgqGます。

gqG現在の位置からファイルの終わりまでのテキストをフォーマットします。可能な場合、自動的に連続する行に参加します。2つの行を結合したくない場合は、2つの行の間に空白行を配置できます。


14
また、ビジュアルセレクションにも使用できます。つまり、次のようなものですV}gq。このようにして、実際にフォーマットする前に、フォーマットする内容を確認できます。
プラウフ14

6
ちなみに、qそれ自体は正確には何をしていますか?
Richard-Degenne、2014

1
スペースのない、1つの長い文字列である行でこれを行う方法はありますか?編集:「fold」ユーティリティを発見しました。これをviで行うことについてはまだ疑問に思っています。
ドナルド・スミス

7
set tw=80代わりに使用set textwidth=80して時間を節約する
Yibo Yang

4
@dmranck入力後set textwidth=76、入力中に行が自動折り返しされます。私の不満は、編集中の既存の行に対しては何もしないということです。しかしV}gq、その点で非常に便利です。 Vビジュアル選択モードに入り}、次の段落区切りまで選択しgq、現在のフォーマッタを実行します(またはgwviフォーマッタを明示的に呼び出すために使用します)。また、{上向きを選択します。ggVGgqより簡単な方法があるかもしれませんが、ドキュメント全体とフォーマットを選択できます。を@使いやすくするために、それをマクロとして保存します。vipgq現在の段落を表示するために使用します。
ktbiz 2017

94

マイケルの解決策が鍵ですが、現在の段落の残りの部分を再フォーマットしたいと思うことがよくあります。この動作には、を使用しますgq}


17
これを拡張します-gq <motion>を使用して、好きなようにフォーマットできます。
Dan Schnau 2013

1
また、 'nojoinspaces'オプションは、行が文の境界で結合されるときにピリオドの後に2つのスペースが表示されないようにします。タイポグラフィスタイルが英語の文の間に1つのスペースがある場合に適しています。
Alex Hirzel 2014

36

gq任意の移動演算子で使用できます。たとえば、現在の行の終わりにのみ再フォーマットしたい場合(つまり、カーソルが置かれている行を折り返す場合)、次のように使用できます。gq$

ビジュアルモードでテキストを選択し( `vを使用して移動)、gqと入力して再フォーマットすることもできます。

行を強制的に折り返す他のオプションもあります。

テキストを挿入している間にvimで行を折り返して、最後までテキストを再構成するのを待つ必要がない場合は、次のオプションが便利です。

:set textwidth=80
:set wrapmargin=2

wrapand によってサイドトラックされないでください。linebreak画面に表示されるテキストを再フォーマットするだけで、バッファ内のテキストは変更されません)


9
wrapmarginヘルプから: 'textwidth'がゼロ以外の場合、このオプションは使用されません。
mmoya 2013

21

DonaldSmithからのコメントのおかげで、このtextwidthオプションは私の長いテキスト行を再フォーマットしなかったので、これを見つけました(16進数からバイトへの変換で再生を変換していました)。

:%!fold -w 60

これにより、ファイル全体(私にとっては1行でした)が長さ60の行に再構成されました。


1
これはすごく素敵。すべての回答は、行がスペースに単語に分割されている場合、行の幅を制限することに焦点を当てています。このソリューションは、非常に長い単語(DNAシーケンス)に対して機能します。
pedrosaurio 2018

1
長いURLの場合、これは私が見つけた唯一の機能です。私はすでにtextwidthについては新しいですが、切れていない文字列を壊しません(これは通常良いことです)
SkyLeach

13

Vim以外の方法を探している場合は、常にUNIXコマンドのfmtparがあります。

ノート:

  • Unicodeについてはコメントできません。動作が異なる場合とそうでない場合があります。
  • @nelstromはすでにpar彼のウェブキャストでの使用について言及しています。

例として両方を使用する方法は次のとおりです。

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Vim内から使用するには:

:%! fmt -w 13
:%! par 13gr

:formatprgparまたはfmtに設定してオーバーライドすることもできますgq。詳細については、:help formatprgVim内を呼び出します。


9

ほとんどの場合gq、ビジュアルモードで使用します。私はそれを生徒たちに言う、それは気難しい人々のための雑誌「Gentlemens 'Quarterly」の略です。

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