Viでファイル全体のインデントを修正するにはどうすればよいですか?


625

Vimですべての行のインデントを修正するコマンドは何ですか?

多くの場合、コードをコピーしてリモート端末に貼り付け、すべてを台無しにしてしまいます。これを一気に直したい。


類似:
正しく

8
治療よりも予防​​が大切です。その精神にこのコメントが付属しています。挿入モードに入る前に ":set paste"を実行し、リモート端末からコードを貼り付けます。
Chthonicプロジェクト2016

回答:


1215

=、インデントコマンドが動きます。だから、ggファイルの先頭を取得するには=、インデントにG、ファイルの終わりにgg=G


39
私は自分の貴重な1Gを習得することはできません=)私のお気に入りの1つは、開始ブラケットに立っている=%です。ブロック全体のインデントを修正します。
PEZ、

2
:0 <return>はそれほど悪くありませんが、ggはいいです。(ええ、私は最初にedを学びました)
Erik Olson

8
現在の行を離れることなくファイル全体をインデントできますか?
ファビオペレス

86
@ファビオ:''(2つの単一引用符)は、元の場所にgg=G''戻るので、インデントしてから戻る必要があります。
Nemo157 2011

@ArchimedesTrajano Mac OSの在庫vimは非常に古いので、HomeBrewバージョンをお勧めします。それははるかに新しいです。Macのvimでいくつかの迷惑な問題がありました。また、組み込みのものをいじってはいけないと聞いたので、細心の注意がない限り自分で更新しないでください。
AlexMA 2014

126

ターミナルに貼り付ける前に、試す:set paste当時と:set nopaste設定が完了した後。これにより、自動インデント、行の折り返しなど、貼り付けを混乱させる機能がオフになります。

編集:また、=インデントよりもはるかに良い結果は通常、外部プログラムを使用して取得できることを指摘しておきます。たとえば、私は:%!perltidyいつも走っています。astylecindentなども使用できます。そしてもちろん、それらをキーストロークにマッピングし、ファイルタイプに応じて異なるものを同じキーストロークにマッピングすることができます。


5
equalprgftplugin のオプションを設定して=、カスタムキーバインドではなく、外部フィルターをインデントに使用できます。
ジョシュリー

ペーストトグルキーバインドオプションもあります。:モードを
切り替える

注:grmlのvimconfigでは、pastetoggleキーがF11にマップされています
Thomas

formatpgmきちんとアスタイルで使っていgqます。ここに私の例をいくつか示します.vimrcau FileType xml set fp=tidy\ -q\ -i\ -xmlおよびau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian 2013

これを読んだ後、perltidyをダウンロードしたところ、デフォルトのvim自動インデントよりもはるかに優れています
Joey Ciechanowicz

29

コードを入力せずに、現在のブロックを再度インデントしたい場合は、次のようにします。

[[=]]

1
これを復活させて申し訳ありませんが、和音でどういう意味ですか?コーディネート?
John P

7
ここで「コード」とは、あるキーを押しながら別のキーを押すことによって発行されるコマンドを指します。音楽のコードと同様に、複数の音が同時に鳴ります。したがって、Gはshift + g、^]はctrl +]などです。これらは、単一キーバインディングよりも入力に時間がかかります。
ラルフジャイルズ

また、=aBカーソルをまったく動かさないようにすることもできます。
amin 2016

7
北欧のキーボードで[[=]]は、5つのコードが必要です:(
k4kuz0

29

すべてのコマンドのマスターは

gg=G

これにより、ファイル全体がインデントされます。

以下は、VimまたはgVimで行をすばやくインデントするために使用されるシンプルでエレガントなコマンドの一部です。

現在の行の下にあるすべての行をインデントするには

=G

現在の行をインデントするには

==

n現在の行の下の行をインデントするには

n==

たとえば、現在の行の下の4行をインデントするには

4==

コードのブロックをインデントするには、中かっこのいずれかに移動し、コマンドを使用します

=%

17

きちんとしたアプリケーション/ユーティリティを使用してHTMLおよびXMLファイルをインデントすることができ、これらのファイルをインデントするのに非常によく機能します。

XMLファイルをきれいにする

:!tidy -mi -xml %

HTMLファイルをきれいにする

:!tidy -mi -html %

16

エスケープを押して、以下の組み合わせをすばやく入力します。

gg=G

28
私はゆっくりとタイプしました、あなたは次に何が起こったのか信じられません。
k0pernikus 2015年

答えとコメントに賛成票を入れただけです。笑@ k0pernikus
2016年

12

1G=G。これにより、ファイル内のすべての行がインデントされます。1G最初の行を受け取り=、自動インデントを開始しG、最後の行はファイルの最後の行を受け取ります。


あるいは1gg=G
Biggybi

1G = Gで修正しました。驚くばかり!
Natus Drew

8

:set paste私のパテを使って、ウィンドウ間でコードをコピーしてしまうあなたの友達です。:set paste(と:set nopaste)をオンにする前は、コピー/貼り付けがその理由で私にぴったりでした。


1
はい、パテも使っています。:set paste is awesome
mmcdole

7

Vimではを使用します:insert。これにより、すべてのフォーマットが保持され、自動インデントは行われません。詳細についてはhelp :insert


7

を使用したくない場合は:set paste、中ボタンをクリックして、set nopasteクリップボードの内容を貼り付けることもできます。

"*p
"+p

そうすれば、通常モードを終了する必要はありません。貼り付けが+必要な場合、または*テキストの選択方法に依存する場合は、を参照してください:help quoteplus


4

vim- autoformatは、言語に固有の外部プログラムを使用してソースファイルをフォーマットします。たとえば、Rubyファイルの「rbeautify」gem、JavaScriptの「js-beautify」npmパッケージなどです。


3

複雑なC ++ファイルの場合、vimの=フィルターコマンドを使用すると、vimは常に正しいフォーマットを取得しません。したがって、そのような状況では、astyle(またはuncrustify)などの外部C ++フォーマッタを使用することをお勧めします。例:

:%!astyle

Vimの '='関数はデフォルトで内部フォーマッターを使用します(常に正しく機能するとは限りません)が、この質問で説明されているように適切に設定することにより、astyleなどの外部フォーマッターを使用するように設定することもできます。



1

これを行うためのマッピングを作成できます。

これはファイル全体を自動的にインデントし、カーソルを現在の位置に保ちます:

nmap <leader>ai mzgg=G`z

0

viエディターの場合は、:insertを使用します。これにより、すべてのフォーマットが保持され、自動インデントは挿入されません。エスケープを押すと、実際にフォーマットされたファイルが表示されます。そうしないと、文字化けが発生します。^ Iのような例:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}

0

vimでビジュアルモードに移動し、=を押すだけで、上から下の行を選択します。選択したすべての行がインデントされます。


これは避けたい。ビジュアルモードは、モーションについて不明な点がある場合に使用します。一連のキャラクターをキャプチャする方法を知っている場合は、ビジュアルモードにドロップする追加のステップに意味がありません。なぜggvG=ときにすることができgg=G。モーションを可視化する目的は何ですか?それは動きをするすべての行動に当てはまります。
alextes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.