2299

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

4

33 に答える 33

2725

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

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

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

于 2008-10-25T03:28:37.450 に答える
1007

この回答は、この質問の他の回答とコメントを要約したものであり、 VimのドキュメントとVimwikiに基づいて追加情報を追加します。簡潔にするために、この回答では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

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

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

もう1つの一般的な状況は、ソースファイル全体でインデントを修正する必要があることです。

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

参考文献

于 2011-03-06T17:29:30.413 に答える
127

大きな選択肢は次のとおりです。

gg=G

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

于 2009-01-20T21:11:13.267 に答える
113

C-indentingインデントにもこれを試してください。:help =詳細については、次を実行してください。

={

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

あるいは単に:

==

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

于 2008-10-25T04:21:02.197 に答える
82

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

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

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

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

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

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

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

于 2008-10-25T09:16:00.620 に答える
69

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

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

于 2008-10-25T04:00:31.363 に答える
30

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

vnoremap < <gv

vnoremap > >gv

選択範囲を何度でもインデントできます。

于 2009-02-15T05:42:04.327 に答える
29

提供されるソリューションと同様に、一度に 1 段落ずつ行うのが好きです。>}

于 2008-10-25T04:08:38.650 に答える
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 インデント分右に移動)。

于 2015-01-31T19:17:54.243 に答える
20

The beauty of Vim's UI is that its consistency. Editing commands are made up of the command and a cursor move. The cursor moves are always the same:

  • H to top of screen, L to bottom, M to middle
  • nG to go to line n, G alone to bottom of file, gg to top
  • n to move to next search match, N to previous
  • } to end of paragraph
  • % to next matching bracket, either of the parentheses or the tag kind
  • enter to the next line
  • 'x to mark x where x is a letter or another '.
  • many more, including w and W for word, $ or 0 to tips of the line, etc., that don't apply here because are not line movements.

So, in order to use vim you have to learn to move the cursor and remember a repertoire of commands like, for example, > to indent (and < to "outdent").

Thus, for indenting the lines from the cursor position to the top of the screen you do >H, >G to indent to the bottom of the file.

If, instead of typing >H, you type dH then you are deleting the same block of lines, cH for replacing it, etc.

Some cursor movements fit better with specific commands. In particular, the % command is handy to indent a whole HTML or XML block. If the file has syntax highlighted (:syn on) then setting the cursor in the text of a tag (like, in the "i" of <div> and entering >% will indent up to the closing </div> tag.

This is how Vim works: one has to remember only the cursor movements and the commands, and how to mix them. So my answer to this question would be "go to one end of the block of lines you want to indent, and then type the > command and a movement to the other end of the block" if indent is interpreted as shifting the lines, = if indent is interpreted as in pretty-printing.

于 2012-09-18T14:12:41.853 に答える
17

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

:2,10norm 10i 

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

:%norm 5i_

または、さらに凝ったもの:

:%norm 2i[ ]

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

:1,20norm i#

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

:%norm 5x
于 2015-08-21T13:33:52.253 に答える
14

これを行う:

$vi .vimrc

次の行を追加します。

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

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

于 2009-11-11T17:33:42.180 に答える
13
:line_num_start,line_num_end>

例えば、

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

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

例えば、

14,21>>> for three tabs
于 2014-07-15T09:22:47.537 に答える
12

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

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

于 2012-02-17T15:16:52.450 に答える
12

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

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

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

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

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

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

  7. 簡単な説明:

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

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

    (また)

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

于 2012-01-04T00:41:53.617 に答える
11

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

  1. テキスト行の先頭に移動してから入力しますma(aは「m」アークのラベルです: 任意の文字である可能性があります)
  2. テキストの最後の行に移動して入力しますmz(ここzでも任意の文字を使用できます)
  3. :'a,'z>or :'a,'z<will indent or outdent (これは単語ですか?)
  4. 出来上がり!テキストが移動されます (空行はスペースなしで空のままになります)

PS: この:'a,'z手法を使用して、行、数字、または%.

于 2010-11-10T19:16:06.600 に答える
10

:help left

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

:%le3or :%le 3 or :%left3or:%left 3は、3 つのスペースでパディングしてファイル全体を揃えます。

:5,7 le 3行 5 から行 7 を 3 つのスペースでパディングして位置合わせします。

:le値なし、または:le 0パディング 0 で左揃えになります。

これは Vim と gVim で機能します。

于 2015-09-10T18:41:24.017 に答える
9

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

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

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

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

于 2013-11-05T16:19:18.740 に答える
9

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

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

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

于 2013-05-07T07:13:15.853 に答える
9

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

私自身、これを知るのにかなり苦労しました。とても簡単です:

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

    set cindent
    

    適切にインデントするファイル内。

  • ノーマル/コマンドモードタイプ

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    
于 2014-02-06T04:04:42.950 に答える
7

ファイル タイプのすべての行をインデントするにはEscG=gg.

于 2015-03-01T13:20:25.460 に答える
3

ファイル全体を 4 インデントするには:

esc 4G=G
于 2014-12-19T20:18:30.537 に答える
3

<TAB>->Tabおよび<S-TAB>-> Shift+を使用して選択した行をインデントする最新のエディターが好きな人向けTab:

vnoremap <TAB> >gv
vnoremap <S-TAB> <gv

使用法:V行単位のビジュアル モードでヒットし、必要な行を選択してからTab(おそらく でshift) ヒットすると、必要に応じてインデントが適用され、選択が残ります...

于 2020-07-22T21:06:11.570 に答える