viで複数行をすばやくインデントする


2158

ささいなことで、助けになることさえあるかもしれませんが、ナビゲートする方法がわかりません。viで複数行をすばやくインデントするにはどうすればよいですか?

回答:


2552

>コマンドを使用します。5行をインデントするには、5>>。行のブロックをマークしてインデントするには、Vjj>3行をインデントします(Vimのみ)。中括弧ブロックをインデントするには、カーソルを中括弧の1つに置き、>%ブロック内の任意の場所から使用します。>iB

テキストのブロックをコピーしていて、ブロックのインデントを新しい場所に揃える必要がある場合は、の]p代わりにを使用してくださいp。これにより、貼り付けたブロックが周囲のテキストに揃えられます。

また、このshiftwidth設定では、インデントするスペースの数を制御できます。


77
私は> i}(インデント{}ブロック)を使用しています。vimで動作します。viで動作するかどうかは不明です。
R.マルティーニョフェルナンデス

11
私の問題(gVimで)は、コマンドが2つ以上の空白をインデントすることです(2つの空白だけが必要ですが、> 5つの空白のようなものをインデントします)
Kamran Bigdely

28
@カムラン:shiftwidthそれを変更する方法については、設定を参照してください。
グレッグ・ヒューギル、2011年

4
@MattStevens:あなたがここにこの現象についての拡張の議論を見つけることができます:meta.stackexchange.com/questions/9731/...を
グレッグHewgill

5
XMLファイルに貼り付けられたいくつかのタグを修正するなど、ビジュアルブロックを連続してインデントすることがよくあります。毎回ビジュアルモードでブロックを再選択するのではなく、「gv」を使用して最後のビジュアルブロックを再利用できます。参考superuser.com/questions/220666/...
デヴィッド・マン

958

この回答は、この質問の他の回答とコメントをまとめたものであり、VimのドキュメントVim wikiに基づいて追加情報を追加しています。簡潔にするために、この回答ではViとVim固有のコマンドを区別していません。

以下のコマンドでは、「再インデント」は「インデント設定に従って行をインデントする」ことを意味しますshiftwidthインデントを制御する主要な変数です。

一般的なコマンド

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces
5>>  Indent 5 lines
5==  Re-indent 5 lines

>%   Increase indent of a braced or bracketed block (place cursor on brace first)
=%   Reindent a braced or bracketed block (cursor on brace)
<%   Decrease indent of a braced or bracketed block (cursor on brace)
]p   Paste text, aligning indentation with surroundings

=i{  Re-indent the 'inner block', i.e. the contents of the block
=a{  Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block

>i{  Increase inner block indent
<i{  Decrease inner block indent

あなたは置き換えることができ{}か、B例えば、=iB有効なブロックのインデントコマンドです。見てみましょう「のインデントコード・ブロック」にこれらのコマンドを試してみるための良い例のために。

また、覚えておいてください

.    Repeat last command

、インデントコマンドを簡単かつ便利に繰り返すことができます。

完全なファイルの再インデント

別の一般的な状況は、ソースファイル全体でインデントを修正する必要がある場合です。

gg=G  Re-indent entire buffer

このアイデアを複数のファイルに拡張できます。

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall

または複数のバッファ:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

ビジュアルモード

Vjj> Visually mark and then indent three lines

挿入モード

これらのコマンドは現在の行に適用されます。

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

exコマンド

これらは、カーソルを動かさずに特定の範囲の行をインデントする場合に便利です。

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

マーカーを使用したインデント

別のアプローチはマーカーを経由することです:

ma     Mark top of block to indent as marker 'a'

...カーソルを終了位置に移動します

>'a    Indent from marker 'a' to current location

インデントを制御する変数

これらは.vimrcファイルで設定できます

set expandtab       "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4    "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing <TAB>

set autoindent      "Keep indentation from previous line
set smartindent     "Automatically inserts indentation in some cases
set cindent         "Like smartindent, but stricter and more customisable

Vimには、ファイルタイプに基づいたインテリジェントなインデントがあります。これを.vimrcに追加してみてください:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

参考文献


13
この答えとその上の答えはどちらも素晴らしかった。しかし、最後のコマンドを繰り返す「ドット」演算子を思い出させたので、これを+1しました。これは、を押し続ける必要なく、ブロック全体を複数のシフトスペース(またはインデント)にインデントする必要がある場合に非常に役立ち>}ます。長い間ありがとう
2013

1
5 >> 5行のインデント:このコマンドは、5行ではなく5行目をインデントします。これは私のVIM設定が原因である可能性がありますか、それともあなたの表現が間違っていますか?
Wipqozn 2011

1
@Wipqozn-それは奇妙です。Vim 7.2.330でテストされた次の5行は確実にインデントされます。
ire_and_curses 2011

8
> 42ggインデントあなたがライン42にどこから
スティーブ

素晴らしい要約!また、「ブロック内のインデント」と「すべてのブロックのインデント」(<i {> a {など)は、かっこや角かっこ(> a(<i]など)でも機能することにも注意してください。 <>に加えて、d、c、yなどでも機能します)
aqn

123

大きな選択は次のようになります:

gg=G

それは本当に速く、すべてがインデントされます;-)


1
XMLファイルがあり、構文の強調表示をオンにしました。入力するgg=Gと、位置1から始まるすべての行が配置されます。すべての空白が削除されました。XMLに固有のものは他にありますか?
2014年

2
set cindentvimrcにあるか:set cindent、そのコマンドを実行する前に実行する必要があると思います
アマヌエルネガ

3
最初にcindentを設定する必要があると思います。@asgsこれはcstyleプログラミング言語でのみ機能すると思います。
アマヌエルネガ

110

Cインデントインデントにもこれを試してください。やる:help =詳細については:

={

これにより、現在のコードブロックが自動的にインデントされます。

あるいは単に:

==

現在の行を自動インデントします。


2
私にとっては機能しません。カーソルを「現在のコードブロック」の開始ブレースの上の行にダンプします。
underscore_d

79

より視覚的な人々のためのキープレス:

  1. コマンドモードに入る:
    Escape

  2. インデントする領域の先頭に移動します。
    hjkl

  3. ブロックを開始します。
    v

  4. インデントする領域の最後まで移動します。
    hjkl

  5. (オプション)必要なインデントレベルの数を入力します
    0..9

  6. ブロックでインデントを実行します。
    >


2
これはすばらしいですが、タブではなくスペースを使用します。これを修正する可能な方法はありますか?
Shane Reustle、2011年

12
タブの代わりにスペースを使用している場合は、おそらくスペースを使用するようにインデントが設定されているためです。=)。
Kent Fredric、2011年

4
'expandtab'オプションがオフの場合(これがデフォルトです)、Vimは可能な限り<Tab>を使用してインデントを作成します。(:help:>)
ケントフレドリック

1
私が変更した唯一のタブ/スペース関連のvim設定は:set tabstop = 3です。>>: "<tab> <space> <space>"を使用するたびに実際に挿入されます。ブロックのインデントと同じです。何か案は?
シェーンリスル

3
「スペースvsタブ」で確認したい3つの設定は、1。tabstop 2. shiftwidth 3. expandtabです。おそらく「shiftwidth = 5 noexpandtab」があるので、「タブ」は3つのスペースであり、インデントレベルは「5」スペースなので、1つのタブと2つのスペースで5を構成します。
ケントフレドリック

66

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

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

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

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

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

=G

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

n==

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

4==

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

=%

これらは、複数の行をインデントするための最も単純で強力なコマンドです。


3
これはちょうどでありvim、ではありませんvi
rojomoke 14

3
私のSolarisまたはAIXボックスにはありません。等号キーは、常に私の標準のアドホックマクロ割り当ての1つでした。vimとしてリンクされているを見ていませんviか?
rojomoke 14

3
ええ、Linuxでは、viはほとんど常にvimへのリンクです。vi内で:veコマンドを実行してみてください。
rojomoke 2014

4
私はこの種の答えが大好きです。明確、正確、そして簡潔です。Debian Jessieで働いてくれました。ありがとう、@ SJain
digitai

1
私はviではなくvimを使用しているので、かなり気の利いたこの答えはここにあります。ありがとう。
Dan Nissenbaum 2017

66

すでに与えられ受け入れられいる答えに加えてマーカーを配置して、現在のカーソルからマーカーまですべてをインデントすることもできます。

したがって、maインデントされたブロックの最上部にしたい場所を入力し、必要なだけカーソルを下に移動してから入力します>'a(「a」は有効なマーカー名の代わりに使用できることに注意してください)。これは、5>>またはより簡単な場合がありvjjj>ます。


1
これは本当に便利です。これで何が機能するかを調べなければなりません。私はダアとヤアを知っています、他に何ですか?
user606723

2
インデントしたい行の数を数える必要がなくなるので、これは非常に便利です。
ジギー

29

本文の先頭へ

  • 押すvとビジュアルモードになります。
  • up/ down矢印を使用してテキストを強調表示します。
  • を押し=て、強調表示したすべての行をインデントします。

28

提供されているソリューションと同様に、私は一度にパラグラフで物事を行うのが好きです >}


2
うん、これが私の大きなおしっこの1つが、それ以外は空の行にある空白である理由です。それらは、vimの「段落」の概念を台無しにしています。
aqn 2013年

28

ブロックを選択し>てインデントに使用すると、インデントは通常モードに戻ります。私の.vimrcファイルにこれがあります:

vnoremap < <gv

vnoremap > >gv

これにより、選択範囲を必要なだけインデントできます。


17
選択範囲を複数回インデントするには、を押すだけです。前のコマンドを繰り返す。
sundar-モニカを

2
の問題。この状況では、指を動かす必要があります。@mikeのソリューション(私が使用しているものと同じ)を使用すると、インデントキーにすでに指が触れているので、切り替えて他のことをするのではなく、キーを押し続けてインデントを維持できます。期間を使用すると、手を動かす必要があり、2番目の異なる操作であるため、より多くの検討が必要になるため、時間がかかります。
masukomi

21

コードのインデントに2つのスペースを使用するとします。タイプ:

:set shiftwidth=2
  • タイプv(ビジュアルブロック編集モードに入る)
  • 矢印キー(またはh/ j/ k/ l)を使用してカーソルを移動し、インデントまたはインデント解除する行を強調表示します。

次に:

  • タイプ >1回インデントするためにします(2スペース)。
  • タイプ 2>2回インデントする(4スペース)。
  • 3>3回インデントするために入力します(6スペース)。
  • ...
  • <下げを1回入力します(2スペース)。
  • 2<インデントを2回入力します(4スペース)。
  • 3<3回インデントを解除して入力します(6スペース)。
  • ...

あなたはアイデアを得ます。

空の行はインデントされません。これはちょっといいと思います。


ブロックをインデントするための(g)vimドキュメントで答えを見つけました:

:help visual-block
/indent

コマンドにカウントを指定する場合は、演算子文字を入力する直前に「v {move-around} 3>」(行の3インデントを右に移動)にします。


18

VimのUIの優れている点は、その一貫性です。編集コマンドは、コマンドとカーソル移動で構成されます。カーソルの動きは常に同じです:

  • H画面の上部Lへ、下部Mへ、中央へ
  • n個Gの行に移動するには、NG、ファイルの下に一人でggトップに
  • n次の検索一致、N前の検索に移動する
  • } 段落の終わりまで
  • % 括弧またはタグの種類のいずれかで、次の一致する括弧に
  • enter 次の行へ
  • 'xマークへのx 、xは文字または別のです'
  • など、より多くの、wそしてW言葉のために、$または0ではないので、ここでは適用されませんなどのラインの先端に、ラインの動き。

したがって、vimを使用するには、カーソルを移動する方法を学び、たとえば>インデント(および<「アウトデント」)。

したがって、あなたが画面の上部にカーソル位置から行を字下げするために>H>Gファイルの一番下にインデントします。

と入力する代わりに>H、あなたが入力dHすると、同じ行のブロックを削除したりcH、置き換えたりします。

一部のカーソルの動きは、特定のコマンドに適しています。特に、この%コマンドはHTMLまたはXMLブロック全体をインデントするのに便利です。ファイルの構文が強調表示されている場合(:syn on)、カーソルをタグのテキストに設定します(<div>の「i」など)。>%終了の</ div>タグまでインデントされます。

これがVimのしくみです。カーソルの動きとコマンドだけを覚え、それらをどのように組み合わせるかを覚えておく必要があります。この質問に対する私の答えは次のようになりますので、「あなたはインデントしたい行のブロックの一方の端に移動し、入力>コマンドやブロックのもう一方の端への移動を」場合インデントは、ラインをシフトすると解釈される=場合にはインデントきれいな印刷のように解釈されます。


2
vi / vimはほとんど一貫していると私は言うでしょう。たとえば、DはSおよびYと同じように動作しません。:)
aqn 2013年

14

これを行う:

$vi .vimrc

次の行を追加します。

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

これはcppファイル専用です。これも、ファイルタイプを変更するだけで、別のファイルタイプに対して実行できます...


13

norm iコマンドを使用して、行の先頭に特定のテキストを挿入できます。2行目から10行目までの間に10個のスペースを挿入するには:

:2,10norm 10i 

コマンドの最後にスペース文字が必要であることに注意してください。これが挿入したい文字になります。他のテキストで行をインデントすることもできます。たとえば、ファイル内のすべての行を5つのアンダースコア文字でインデントすることができます。

:%norm 5i_

またはもっともっと豪華なもの:

:%norm 2i[ ]

より実用的な例は、#文字でBash / Python / etcコードにコメントを付けることです。

:1,20norm i#

をインデントするxには、の代わりにを使用しますi。たとえば、すべての行から最初の5文字を​​削除するには:

:%norm 5x

1
これはファイルの左側から始まります...ブロックの現在の位置ではありません
Eliethesaiyan

12

これを使用してこれを行う簡単な方法 VISUAL MODE使用は、コードブロックにコメントを付けるのと同じプロセス使用します。

これは、変更したくない場合に便利です。 shiftwidthsetディレクティブディレクティブを使用 TABS、SPACES、またはその他の文字を操作するのに十分な柔軟性があります。

  1. ブロックの先頭にカーソルを置きます
  2. vに切り替える -- VISUAL MODE --
  3. インデントするテキストを選択します
  4. 入力:してプロンプトに切り替えます
  5. 3つの先行スペースで置き換える:

    :'<,'>s/^/ /g

  6. または、先頭のタブに置き換える:

    :'<,'>s/^/\t/g

  7. 簡単な説明:

    '<,'> -視覚的に選択された範囲内

    s/^/ /g -全範囲の各行の先頭に3つのスペースを挿入します

    (または)

    s/^/\t/g- Tab全範囲内のすべての行の先頭に挿入します


12

>}または>{現在の行から次の段落までインデント

<}または<{同じインデント解除


11

インデントするテキストをマークしたい:

  1. テキストの行の先頭に移動して、次のように入力しますmaa「m'arkのラベルです。任意の文字にすることができます)。
  2. テキストの最後の行に移動して入力しますmz(ここでも、z任意の文字を使用できます)
  3. :'a,'z>または:'a,'z<インデントまたはアウトデントします(これは単語ですか?)
  4. 出来上がり!テキストが移動されます(空の行はスペースなしで空のままです)。

PS:この:'a,'z手法を使用して、行、数字、またはを使用する可能性のある任意の操作(d、y、s ///など)の範囲をマークできます%


10

:help left

では、またはをex mode使用して、指定した量の線を整列できます。具体的には、[範囲]内の行左揃えにします。行のインデントを[indent](デフォルトは0)に設定します。:left:le:left

:%le3or :%le 3 または:%left3or :%left 3は、3つのスペースを埋め込んでファイル全体を位置合わせします。

:5,7 le 3 5行目から7行目までを3つのスペースで埋めて位置合わせします。

:le:le 0がない場合、または0のパディングで左揃えになります。

これはVimとgVimで動作します。


1
すごい、まさに私が探していたもの(特定の数のスペースを挿入する方法-マークダウンコード用に4つのスペース-通常のインデントを上書きする方法)。私の場合、ビジュアルモードで特定の数の行をインデントしたいので、shift-vで行を強調表示して:'<,'>le4からスペースを挿入しました。ありがとう!
Subfuzion 2017

9

私にとって、MacVim(ビジュアル)ソリューションは、マウスで選択して ">"を押しましたが、次の行を "〜/ .vimrc"に置いた後、タブではなくスペースが好きです。

set expandtab
set tabstop=2
set shiftwidth=2

また、コマンドライン(Terminal.app)からMacVimを呼び出すことができると便利です。そのため、次のヘルパーディレクトリ "〜/ bin"に "macvim"というスクリプトを配置しています。

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

そしてもちろん "〜/ .bashrc":

export PATH=$PATH:$HOME/bin

MacPortsは "〜/ .profile"をいじるので、PATH環境変数はかなり長くなる可能性があります。


9

5== 現在のカーソル位置から5行インデントします。

したがって、前に任意の数値を入力できます==。行数をインデントします。これはコマンドモードです。

gg=G ファイル全体を上から下にインデントします。


9

コメントで使用する方法が見つからなかったので、共有します(Vimのみだと思います)。

  1. Esc コマンドモードに入る
  2. インデントしたい最後の行の最初の文字に移動する
  3. Ctrl+ Vブロック選択を開始するには
  4. インデントしたい最初の行の最初の文字に移動する
  5. Shift+ I特別な挿入モードに入ります
  6. インデントするのに必要な数のスペース/タブを入力します(たとえば2つ
  7. プレスEscとスペースはすべての行に表示されます

これは、インデント/タブ設定を変更したくない場合vimrcや、編集中に変更することを覚えておきたい場合に便利です。

インデントを解除するには、同じCtrl+ Vブロック選択を使用してスペースを選択し、で削除しDます。


9

このような簡単な答えを見つけるのがなぜ難しいのかわかりません...

私自身、これを知るために多くの苦労がありました。とても簡単です:

  • .vimrcホームディレクトリの下のファイルを編集します。
  • この行を追加

    set cindent
    

    適切にインデントしたいファイル内。

  • 通常/コマンドモードタイプ

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    

8
:line_num_start,line_num_end>

例えば、

14,21> shifts line number 14 to 21 to one tab

タブを増やすには、「>」記号を増やします。

例えば、

14,21>>> for three tabs

1
これを解決する方法は明らかにたくさんありますが、vimではデフォルトで行番号が表示され、計算を必要としないため、これが最も簡単に実装できます。
HoldOffHunger 2017

@HoldOffHunger行番号はデフォルトでは表示されません。あなたは使用する必要があります:set number(彼らはトグル行番号にオフデフォルト)、または置くset numberあなたのvimrcで。
DryLabRebel

7

Pythonを頻繁に使用していると、ブロックを複数のインデントでシフトする必要が頻繁に生じます。ブロック選択方法のいずれかを使用してこれを行うことができ、次にジャンプする直前にジャンプするインデントの数を入力します。>

たとえば、V5j3>は5行を3回インデントします。インデントに4つのスペースを使用する場合、これは12スペースです。


7

ファイルタイプのすべての行をインデントしEsc、次にG=gg


6

強調表示されたコードをviですぐにいくつかのスペースでインデントする方法:

オプション1:ビジュアルブロックモードで、viのコードブロックを3つのスペースにインデントします。

  1. インデントするコードブロックを選択します。これをCtrl+V通常モードで使用し、下向き矢印を使用してテキストを選択します。選択した状態でEnterキー:を押すと、選択したテキストのブロックにコマンドが与えられます。

  2. コマンドラインに次のように表示されます。 :'<,'>

  3. インデントを3つのスペースに設定するには、le 3入力してEnter キーを押します。これが表示されます::'<,'>le 3

  4. 選択したテキストはすぐに3つのスペースにインデントされます。

オプション2:Visual Lineモードで、viのコードブロックを3つのスペースにインデントします。

  1. viでファイルを開きます。
  2. カーソルをコードの上に置く
  3. 通常モードになり、次のキーを押します。

    Vjjjj:le 3
    

    あなたがしたことの解釈:

    V テキストの選択を開始することを意味します。

    jjjj 4行下矢印、4行を強調表示します。

    : 強調表示されたテキストの指示を入力することをviに伝えます。

    le 3 ハイライトされたテキストを3行インデントすることを意味します。

    選択したコードはすぐに3つのスペースインデントに増加または減少します。

オプション3:インデントを増やすには、ビジュアルブロックモードと特別な挿入モードを使用します。

  1. viでファイルを開きます。
  2. カーソルをコードの上に置く
  3. 通常モードで次のキーを押します。

    Ctrl+V

    jjjj
    

    (スペースバーを5回押します)

    Esc Shift+i

    ハイライトされたすべてのテキストは、さらに5つのスペースがインデントされます。


6

私はブロックモードのビジュアル選択を使用します:

  • ブロックの前に移動して移動します(上部または下部)。
  • Ctrl+を押すVをビジュアルブロックモードに入ります。
  • ナビゲートして、行の前の列を選択します。
  • プレスIShift+I)を挿入モードに入ります。
  • スペースをいくつか入力します。
  • を押しEscます。すべての行がシフトします。

これはユニタスカーではありません。できます:

  • 行の真ん中に。
  • すべての行に任意の文字列を挿入します。
  • 列を変更するcには(の代わりに使用I)。
  • ヤンク、削除、置換など...

これは厄介ですが、コアVIMの外部でフォーマットを行う場合(たとえば、vim-prettierデフォルトのインデントエンジンの代わりに使用する場合)に行く方法です。>そうでない場合、を使用すると、Prettierによって行われたフォーマットが忠実に修正されます。
オリゴフレン2018年

おかしい、面倒なことは何でも見つける。これはユニタスカーではありません!この方法を学ぶことには、インデント以外にも多くの用途があります。
sqqqrly

何が起こっているのか、私が選択している行と私がしているアクションを見ることができるので、私はそれが受け入れられた答えよりも優れていると感じます。
user405205​​4

5
  • コードのブロックの場合、{}:=+%

  • 選択した行の場合:Shift+ v上/下矢印キーを使用して選択し、を押し=ます。

  • ファイル全体:gg+ =+G

注:「gg」は1行目に移動することを意味し、「=」はインデントコマンド、「G」はカーソルをファイルの終わりに移動します


4

すべてのファイルを4字下げするには:

esc 4G=G

3
...何?「4スペースずつインデント」?いいえ、これは4行目にジャンプし、現在選択されているインデントモード(ある場合)を使用して、そこからファイルの最後まですべてをインデントします。
underscore_d

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