それは些細なことであり、助けになるかもしれませんが、私はそれをナビゲートする方法を理解できません。viで複数の行をすばやくインデントするにはどうすればよいですか?
33 に答える
コマンドを使用し>ます。5行をインデントするには、5>>。行のブロックをマークしてインデントするには、Vjj>3行をインデントします(Vimのみ)。中括弧ブロックをインデントするには、中括弧の1つにカーソルを置き、>%ブロック内のどこからでも使用できます>iB。
テキストのブロックをコピーしていて、ブロックのインデントを新しい場所に揃える必要がある場合は、の]p代わりにを使用してpください。これにより、貼り付けられたブロックが周囲のテキストに揃えられます。
また、このshiftwidth
設定では、インデントするスペースの数を制御できます。
この回答は、この質問の他の回答とコメントを要約したものであり、 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
参考文献
大きな選択肢は次のとおりです。
gg=G
それは本当に速く、すべてがインデントされます;-)
C-indentingインデントにもこれを試してください。:help =
詳細については、次を実行してください。
={
これにより、現在のコード ブロックが自動的にインデントされます。
あるいは単に:
==
現在の行を自動インデントします。
より視覚的な人々のためのキープレス:
コマンド モードに入ります。
Escapeインデントする領域の先頭に移動します。
hjkl↑↓←→ブロックを開始します。
vインデントする領域の最後まで移動します。
hjkl↑↓←→(オプション) 必要なインデント レベルの数を入力します
0..9ブロックでインデントを実行します。
>
すでに与えられ受け入れられている回答に加えて、マーカーを配置して、現在のカーソルからマーカーまでのすべてをインデントすることもできます。
したがって、ma
インデントされたブロックの上部を希望する場所に入力し、必要なところまでカーソルを下げて入力します (" " は有効なマーカー名の代わりに使用できることに>'a
注意してください)。これは、またはa
よりも簡単な場合があります。5>>
vjjj>
ブロックを選択し>てインデントに使用すると、インデントしてから通常モードに戻ります。私は .vimrc ファイルにこれを持っています:
vnoremap < <gv
vnoremap > >gv
選択範囲を何度でもインデントできます。
提供されるソリューションと同様に、一度に 1 段落ずつ行うのが好きです。>}
コードのインデントに 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 インデント分右に移動)。
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.
コマンドを使用して、norm i
特定のテキストを行頭に挿入できます。2 ~ 10 行目の前に 10 個のスペースを挿入するには:
:2,10norm 10i
コマンドの最後にはスペース文字が必要であることに注意してください。これが、挿入したい文字になります。他のテキストで行をインデントすることもできます。たとえば、ファイル内のすべての行を 5 つのアンダースコア文字でインデントします。
:%norm 5i_
または、さらに凝ったもの:
:%norm 2i[ ]
より実用的な例は、Bash/Python/etc コードに # 文字を付けてコメントすることです:
:1,20norm i#
xの代わりに使用を再インデントするにはi。たとえば、すべての行から最初の 5 文字を削除するには、次のようにします。
:%norm 5x
これを行う:
$vi .vimrc
次の行を追加します。
autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent
これは cpp ファイル専用です。ファイルタイプを変更するだけで、別のファイルタイプに対してこれを行うことができます...
:line_num_start,line_num_end>
例えば、
14,21> shifts line number 14 to 21 to one tab
タブを増やすには、「>」記号を増やします。
例えば、
14,21>>> for three tabs
>}
または>{
、現在の行から次の段落までインデントします
<}
または<{
同じインデント解除
を使用してこれを行う簡単な方法VISUAL MODE
は、コードのブロックにコメントを付けるのと同じプロセスを使用します。
これは、ディレクティブを変更したくない、shiftwidth
またはset
ディレクティブを使用したくない場合に便利で、TABS や SPACES またはその他の文字を操作するのに十分な柔軟性があります。
- ブロックの先頭にカーソルを置きます
- vに切り替える
-- VISUAL MODE --
- インデントするテキストを選択
- 入力してプロンプト
:
に切り替えます 先頭の 3 つのスペースに置き換える:
:'<,'>s/^/ /g
または先頭のタブに置き換えます:
:'<,'>s/^/\t/g
簡単な説明:
'<,'>
- 視覚的に選択された範囲内s/^/ /g
- 全範囲内のすべての行の先頭に 3 つのスペースを挿入します(また)
s/^/\t/g
Tab
-全範囲内のすべての行の先頭に挿入
テキストにインデントを付けるのが好きです:
- テキスト行の先頭に移動してから入力しますma(aは「m」アークのラベルです: 任意の文字である可能性があります)
- テキストの最後の行に移動して入力しますmz(ここzでも任意の文字を使用できます)
- :'a,'z>or :'a,'z<will indent or outdent (これは単語ですか?)
- 出来上がり!テキストが移動されます (空行はスペースなしで空のままになります)
PS: この:'a,'z手法を使用して、行、数字、または%.
:help left
またはをex mode
使用して、指定した量の行を揃えることができます。具体的には、[範囲]内の行を左揃えにします。行のインデントを [indent] (デフォルト 0) に設定します。:left
:le
:left
:%le3
or :%le 3
or :%left3
or:%left 3
は、3 つのスペースでパディングしてファイル全体を揃えます。
:5,7 le 3
行 5 から行 7 を 3 つのスペースでパディングして位置合わせします。
:le
値なし、または:le 0
パディング 0 で左揃えになります。
これは Vim と gVim で機能します。
コメントで使用する方法が見つからなかったので、共有します(Vimのみだと思います):
- Escコマンドモードに入る
- インデントする最後の行の最初の文字に移動します
- Ctrl+Vブロック選択を開始する
- インデントする最初の行の最初の文字に移動します
- Shift+I特別な挿入モードに入る
- インデントする必要がある数のスペース/タブを入力します (たとえば 2 つ)
- 押すEscとスペースがすべての行に表示されます
これは、インデント/タブの設定を変更したくない場合vimrc
や、編集中に変更することを覚えておきたい場合に便利です。
インデントを解除するには、同じCtrl+ Vblock select を使用してスペースを選択し、 で削除しDます。
5==
現在のカーソル位置から 5 行インデントします。
したがって、 の前に任意の数字を入力できます==
。行数をインデントします。これはコマンドモードです。
gg=G
ファイル全体を上から下にインデントします。
このような単純な答えを見つけるのがなぜそんなに難しいのかわかりません...
私自身、これを知るのにかなり苦労しました。とても簡単です:
.vimrc
ホーム ディレクトリの下にあるファイルを編集します。この行を追加
set cindent
適切にインデントするファイル内。
ノーマル/コマンドモードタイプ
10== (This will indent 10 lines from the current cursor location) gg=G (Complete file will be properly indented)
ファイル タイプのすべての行をインデントするにはEsc、G=gg.
ファイル全体を 4 インデントするには:
esc 4G=G
<TAB>
->Tabおよび<S-TAB>
-> Shift+を使用して選択した行をインデントする最新のエディターが好きな人向けTab:
vnoremap <TAB> >gv
vnoremap <S-TAB> <gv
使用法:V
行単位のビジュアル モードでヒットし、必要な行を選択してからTab(おそらく でshift) ヒットすると、必要に応じてインデントが適用され、選択が残ります...