web-dev-qa-db-ja.com

Viで複数行を素早くインデントする

それは些細なことであり、それは助けになるかもしれませんが、私はそれをナビゲートする方法を理解することができません。 viで複数行を素早くインデントするにはどうすればいいですか?

2061
Allain Lalonde

使用 > コマンド。 5行インデントするには 5>>。行ブロックをマークしてインデントするには、 Vjj> 3行インデントする(vimのみ)中括弧ブロックをインデントするには、カーソルをいずれかの中括弧の上に置いて、 >% またはブロック内のどこからでも >iB

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

また、 shiftwidth 設定を使用すると、インデントするスペース数を制御できます。

2442
Greg Hewgill

この回答はこの質問の他の回答とコメントを要約し、 VimのドキュメントVim wiki に基づく追加情報を追加します。簡潔にするために、この答えはViとVim特有のコマンドを区別しません。

以下のコマンドで、 "re-indent"は "あなたの インデント設定に従って行をインデントする "を意味します。 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 3 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

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

もう一つのアプローチは marker :です。

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

参考文献

922
ire_and_curses

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

gg=G

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

121
Johan

C字下げ indentationでも試してみてください。詳細は:help =をご覧ください。

={

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

あるいは単に:

==

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

107
svec

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

  1. コマンドモードに入ります。
    Escape

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

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

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

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

  6. ブロックに字下げを実行します。
    >

77
Kent Fredric

すでに与えられて受け入れられている答えに加えて、マーカーを配置してから現在のカーソルからマーカーまでのすべてをインデントすることも可能です。したがって、インデントされたブロックの先頭にする場所にmaを入力し、必要なところまでカーソルを移動して>'aと入力します(有効なマーカー名の代わりに「a」を使用できます)。これは5>>vjjj>より時々簡単です。

64
Daniel Spiewak

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

これはファイル全体をインデントします。

そして以下はVimやgVimで素早く行をインデントするために使われるシンプルで洗練されたコマンドのいくつかです。

現在行を字下げする
==

現在の行より下のすべての行を字下げする

=G

現在行の下のn行を字下げする

n==

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

4==

コードブロックをインデントするには、中括弧の1つに移動してコマンドを使用します。

=%

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

62
Sagar Jain

テキストの先頭に行く

  • 押す v ビジュアルモード用.
  • つかいます up/down テキストを強調表示するための矢印。
  • 押す = 強調表示したすべての行を字下げします。
29
Michael Durrant

提供された解決策と同様に、私は>}を使って一度に一段落で物事をやりたいです。

27
Paul Tomblin

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

vnoremap < <gv

vnoremap > >gv

それはあなたがあなたが望むだけの時間あなたの選択をインデントすることを可能にします。

25
Michael Ekoka

コードをインデントするために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行目のインデントを右に移動)。

21
John Sonderson

VimのUIの長所は一貫しているということです。編集コマンドは、コマンドとカーソル移動で構成されています。カーソルの動きは常に同じです。

  • H 画面の上部に L 下へ M 真ん中に
  • nG n行目に移動する G 単独でファイルの下まで gg トップに
  • n 次の検索一致に移動する N 前へ
  • } 段落末まで
  • % かっこまたはタグの種類のいずれかで、次に一致する大括弧へ
  • enter 次の行へ
  • 'x xに英字または別の文字を付けます。
  • さらに多くの w そして W Wordの $ または  lineされていないので、ここでは適用されません。

だから、vimを使うためには、カーソルを動かして、例えば、のようなコマンドのレパートリーを覚えることを学ぶ必要があります。 > インデントする(そして < 「アウトデント」へ).
したがって、カーソル位置から画面上部までの行をインデントするには、次のようにします。 >H、 >G ファイルの末尾までインデントします。

入力する代わりに >H、あなたがタイプ dH それからあなたは同じ行ブロックを削除しています、 cH 交換用など.

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

これがvimのしくみです。カーソルの動きとコマンドだけを覚えていて、それらをどのように混在させるのかということです。
それで、この質問に対する私の答えは、「あなたがインデントしたい行ブロックの片端に行き、そして > commandとブロックのもう一方の端への移動 "if indentは行をシフトするように解釈されます。 = if indentはプリティプリントのように解釈されます。

18
Juan Lanus

これを行う

$vi .vimrc

そしてこの行を追加

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

これはcppファイルのためだけのもので、ファイルタイプを変更するだけで他のファイルタイプのためにこれを行うことができます...

14
pankaj ukumar

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

これはshiftwidthを変更したくない場合やset指令を使用したくない場合に便利で、TABSやSPACES、その他の文字を扱うのに十分な柔軟性があります。

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

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

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

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

  7. 簡単な説明

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

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

    (または)

    s/^/\t/g - 範囲内の各行の先頭にTabを挿入

12
Eric Kigathi

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

<}または<{と同じ未インデント

11
jash

まだ言及されていないもう1つの方法があります - norm iコマンドを使用して行の先頭に特定のテキストを挿入することができます。 2〜10行目の前に10個のスペースを挿入するには、次のようにします。

:2,10norm 10i 

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

:%norm 5i_

それとも、もっともっと気の利いたもの:

:%norm 2i[ ]

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

:1,20norm i#

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

:%norm 5x
11
Nykakin

テキストにインデントを付けるのが好きです。

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

シモンズ:あなたが使用することができます:あなたが行、数字、または%を使用するかもしれない任意の操作(d、y、s ///など)の範囲をマークするために 'a、' zテクニック

11
SteveO

私はコメントで私が使う方法を見つけることができなかったので、私はそれを共有するつもりです(私はvimだけだと思います):

  1. Esc コマンドモードに入る
  2. 識別したい最後の行の最初の文字に移動する
  3. ctrl - v ブロック選択を開始する
  4. 識別したい最初の行の最初の文字に移動する
  5. shift - i 特殊挿入モードに入る
  6. あなたがインデントする必要があるのと同じくらい多くのスペース/タブをタイプしなさい(例えば2
  7. 押す Esc スペースはすべての行に表示されます

これはvimrcでident/tab設定を変更したくない場合や、編集中に変更するためにそれらを覚えておきたい場合に便利です。

思わず私は同じものを使います ctrl - v ブロック選択でスペースを選択して削除 d

9
NickSoft

5==は現在のカーソル位置から5行インデントします。そのため、==の前に任意の数を入力できます。行数をインデントします。これはコマンドモードです。

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

9
rohitkadam19

私にとっては、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
mda

私はなぜこのような単純な答えを見つけるのがそれほど難しいのか知りません….

私自身、これを知るためにはとても苦労しなければなりませんでした。

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

set cindent

適切にインデントしたい場所

通常/コマンドモードの場合

10==   (this will indent 10 lines from the current cursor location )
gg=G   (complete file will be properly indented)
9

:help left

ex modeでは、:leftまたは:leを使って、指定した量だけ行を揃えることができます。具体的には、:left [range]内の行を左揃えにします。行のインデントを[indent](デフォルト0)に設定します。

:%le3または:%le 3または:%left3または:%left 3は、3つのスペースで埋め込むことによってファイル全体を位置合わせします。

:5,7 le 3は5行目から7行目を3つのスペースで埋めて整列させます。

値が指定されていない:leまたは:le 0は、0のパディングで左揃えになります。

これはvimgvimで動作します。

9
zundarz

私はPythonを頻繁に使用しているため、自分でブロックを1インデント以上ずらすことが頻繁に必要であることに気付きました。これを行うには、任意のブロック選択方法を使用してから、>の直前にジャンプしたいインデントの数を入力します。

例えば。 V5j3>は5行を3回インデントします - インデントに4つのスペースを使うと12スペースになります

7
John La Rooy

ファイルタイプのすべての行を字下げするには、 esc G = gg

7
kapil
:line_num_start,line_num_end>

例えば.

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

より多くのタブのために '>'シンボルを増やしてください

例えば.

14,21>>> for 3 tabs
7

#で強調表示されたコードを#のスペースですぐにインデントする方法

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

  1. インデントしたいコードブロックを選択します。これを使って Ctrl+V 通常モードで、下向き矢印を押してテキストを選択します。それが選択されている間に、選択されたテキストのブロックにコマンドを与えるために:を入力してください。

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

  3. インデントを3つのスペースに設定するには、le 3を入力してEnterを押します。これは現われるものです::'<,'>le 3

  4. 選択したテキストはすぐに3つのスペースに字下げされます。

オプション2:ビジュアルラインモードで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回押す)

    EscShift+i

    強調表示されたテキストはすべて、さらに5つのスペースで字下げされています。

6
Eric Leschinski

ブロックモードの視覚的選択を使用します。

  • ブロックの前面に移動して(上部または下部に)移動します。
  • Ctrl-vを押してビジュアルブロックモードに入ります。
  • 行の前にある列を選択して選択します。
  • 挿入モードに入るには、I(シフトi)を押します。
  • いくつかのスペースを入力してください。
  • Escキーを押します。すべての行が移動します。

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

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

すべてのファイルを4でインデントするには:

esc 4G=G
4
Michael
  • コードブロック{}の場合: = + %

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

  • ファイル全体の場合 gg + = + G

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

2
Kulamani

|がVimのカーソルの位置を表すとします。字下げするテキストが次のようなコードブロックで囲まれているとします。

int main() {
line1
line2|
line3
}

>i{は "i)block(>の内側のインデント({) - /"を意味します。

int main() {
    line1
    line2|
    line3
}

次のように、行が連続しているがブロックの外側にあるとします。

do
line2|
line3
line4
done

2行目から4行目をインデントするには、行を視覚的に選択して>と入力します。あるいはもっと速くするために>2jを実行することができます。

do
    line2|
    line3
    line4
done

>Njは現在の行から下のN行までのインデントを意味することに注意してください。字下げする行数が多い場合、ユーザーが適切な値のNを数えるのに数秒かかることがあります。貴重な時間を節約するために、 相対番号 のオプションをset relativenumber(Vimバージョン7.3以降で利用可能)で有効にすることができます。

0
Sergio