VIMでは、1つの本当に長い行を複数の行に分割するにはどうすればよいですか?


170

VIMエディターに非常に長い行があるとします(たとえば、約300文字以上)。それを複数行に分割して、単語の境界がおおよそ80文字で分割されるようにするにはどうすればよいですか?

例:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...

回答:


254

Vimはこれを非常に簡単に行います(単語の境界で改行します)。

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

私はあなたがチェックアウトをお勧めしたい:help gq:help gw

また、テキスト幅(tw)を設定すると、入力中に超えたときに自動改行が行われます。それも使用されgqますが、無効にした場合gq、どちらが先かによってウィンドウサイズまたは79で中断します。

:set tw=80

テキスト幅を含めるようにフォーマットオプションを設定すると、vimはtw設定で自動的に中断します。

:set fo+=t

5
したがって、あなたのケースでは、gqコマンドは<ESC>(挿入/置換/ etcモードから抜け出す)となり、gq80l
MidnightLightning

6
これはCtrl + jの反対です(複数の行を1つに結合します)。
イズミールラミレス

9
Vimが私を驚かせ続けることは決してありません。これは純金です。
Jondlm 2013年

10
これを見つけた次の人のために、gqは一行のソリッドテキストを分割するだけではなく、そのために空白が必要です
stringy05

2
[実行gqq] aaaahhh、それは美しい
underscore_d

85

最初に、80文字が必要であることを認識させるようにvimを設定します。

:set tw=80

次に、行を強調表示します。

V

そしてvimにそれを再フォーマットさせます:

gq

17

これは実際にはVIMとは関係ありませんが、次のようにfmtプログラムを使用できます。

$ fmt myfile

38
:%!fmt% "vim関連にすることができます:)
Maxim Sloyko

2
viには便利ですが、vimではgqqを使用します。
WhyNotHugo 2014

13

テキストの実線の場合は、通常モードでvを使用して領域を強調表示してから、

:s/\v(.{80})/\1\r/g

これにより、80文字ごとの終わりに改行が追加されます。

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline

これは、長いbase64文字列で機能する唯一のソリューションです。
jviotti 2017

6

* nixをfold使用している場合は、おそらく利用可能です。

を使用して領域を選択し、v幅80のスペースを次のように使用して分割できます。

!fold --spaces --width=80

これは本質的にを使用する場合と同じgqです。

ただし、文字80で改行したいだけで、空白に制限されない場合は、次のように使用できます。

!fold --width=80

1回のキーストロークでそれが必要な場合は、マッピングを設定するだけです-私は使用しました

vmap <f1> !fold --width=80<CR>


これは、空白で区切られていない長い文字列に対して機能する答えです。ただし、macOSでは、foldではなくgfoldを使用する必要がある場合があります。
アーロンD

Mac OSでは、!fold -w 80
user674669 '10

5

すでに存在する改行を削除せずに完全なドキュメントの長い行を分割するには、次のコマンドを使用します。

:set formatoptions+=w
:set tw=80
gggqG

4

1行ではなく、ファイル全体を再フォーマットする必要がありました。Wernseyが指摘しているように、「fmt」を使用することもできましたが、vimでの次のシーケンスもトリックを実行しました(ここのさまざまな回答から借用します)。

<ESC>
:setl tw=80 fo=t
1GVGgq

3

手早くて厄介なこととして、多分次のマップを試してください:

map q 080lwbels<CR><ESC>

それは言う:

  • 行の0番目の位置を開始します。
  • 右の80番目の文字に移動し、
  • 次の単語の最初に移動し、
  • 前の単語に戻る、
  • 現在の単語の最後に移動し、
  • 1文字右に移動し、
  • その文字をCRに置き換えます。

次にqとCRを押すと、行が単語の境界でチャンクに分割されます。


-1

各LONGLINEの最後の空白文字の後、80列の前に、手動で「\」(およびCR /タブでフォーマット)を挿入しました。つまり、

1 this is a long, long, line

今のように見えます

1 this is a long, \
        long line

正常にコンパイルされます。

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