vi で複数行を素早くインデントする
-
04-07-2019 - |
質問
簡単なはずで、ヘルプにも載っているかもしれませんが、操作方法がわかりません。vi で複数の行を素早くインデントするにはどうすればよいですか?
解決
<!> gt; コマンドを使用します。 5行インデントするには、 5 <!> gt; <!> gt; 。行のブロックをマークしてインデントするには、 V j j <!> gt; で3行インデントします(vimのみ)。中括弧ブロックをインデントするには、カーソルを中括弧の1つに合わせて <!> gt; %を使用するか、ブロック内のどこからでも <! > gt; i B 。
<!>#8217;テキストのブロックをコピーしていて、新しい場所でブロックのインデントを揃える必要がある場合は、] p の代わりに使用しますただ p 。これにより、貼り付けたブロックが周囲のテキストに揃えられます。
また、 shiftwidth
設定により、方法を制御できます。インデントする多くのスペース。
他のヒント
この回答は、この質問の他の回答とコメントを要約し、 Vimドキュメントに基づいて追加情報を追加します。および Vim wiki 。簡潔にするために、この回答ではViとVim固有のコマンドを区別しません。
以下のコマンドでは、<!> quot; re-indent <!> quot; <!> quot; インデント設定に従って行をインデントすることを意味します。<!> quot; 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
は有効なブロックインデントコマンドです。 <!> quot;コードブロックのインデント<!> quot; を見てください。これらのコマンドを試してみる例。
また、覚えておいてください
. 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
マーカーを使用したインデント
別のアプローチは、マーカーを使用する方法です:
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
参照
- コードブロックのインデント
- 視覚的にブロックを移動する
- ソースコードのインデント
-
:help =
大きな選択肢は次のとおりです。
gg=G
非常に高速で、すべてがインデントされます;-)
Cインデントインデントにもこれを試してください。詳細については:help =
を実行してください:
={
現在のコードブロックを自動的にインデントします。
または単に:
==
現在の行を自動インデントします。
より視覚的な人々のためのキープレス:
-
コマンドモードに入ります:
エスケープ -
インデントする領域の先頭に移動します:
h j k l <!>#8593; <! >#8595; <!>#8592; <!>#8594; -
ブロックを開始します。
v -
インデントする領域の終わりに移動します:
h j k l <!>#8593; <! >#8595; <!>#8592; <!>#8594; -
(オプション)必要なインデントレベルの数を入力します
0..9 -
ブロックのインデントを実行します。
<!> gt;
すでに与えられ受け入れられた答えに加えて、マーカーを配置し、現在のカーソルからマーカーまでのすべてをインデントすることもできます。したがって、インデントされたブロックの最上部が必要な場所にma
を入力し、必要な位置までカーソルを下ろしてから、>'a
と入力します(<!> quot; a
<!> quot;は、有効なマーカー名)。これは、5>>
またはvjjj>
より簡単な場合があります。
すべてのコマンドのマスターは
gg=G
これはファイル全体をインデントします!
以下は、VimまたはgVimで行をすばやくインデントするために使用されるシンプルでエレガントなコマンドの一部です。
現在の行をインデントするには
==
現在の行の下にあるすべての行をインデントするには
=G
現在の行の下にあるn
行をインデントするには
n==
たとえば、現在の行の下に4行インデントするには
4==
コードのブロックをインデントするには、中括弧の1つに移動してコマンドを使用します
=%
これらは、複数行をインデントするための最も簡単で強力なコマンドです。
テキストの先頭に移動
- ビジュアルモードで v を押します。
- 上 / 下矢印を使用してテキストを強調表示します。
- = を押して、強調表示したすべての行をインデントします。
提供されるソリューションと同様に、>}
ブロックを選択し、 <!> gt; を使用してインデントすると、インデントされてから通常モードに戻ります。 .vimrcファイルにこれがあります:
vnoremap < <gv
vnoremap > >gv
選択範囲を必要な回数だけインデントできます。
2つのスペースを使用してコードをインデントするとします。タイプ:
:set shiftwidth=2
- 「 v 」と入力します(ビジュアルブロック編集モードに入る)
- カーソルを矢印キー(または h / j / k / l )で移動しますインデントまたはインデント解除する行を強調表示します。
その後:
- <!> gt; と入力して、1回インデントします(2スペース)。
- 「 2 <!> gt; 」と入力して、2回インデントします(4スペース)。
- 3 <!> gt; と入力して、3回インデントします(6スペース)。
- ...
- <!> lt; と入力して、1回インデントを解除します(2スペース)。
- 2 <!> lt; と入力して、2回インデントを解除します(4スペース)。
- 3 <!> lt; と入力して、インデントを3回解除します(6スペース)。
- ...
アイデアが得られます。
(空の行はインデントされません。これはちょっといいと思います。)
ブロックをインデントするための(g)vimドキュメントで答えを見つけました:
:help visual-block
/indent
コマンドにカウントを与えたい場合は、入力する直前にこれを行います 演算子文字:<!> quot; v {move-around} 3 <!> gt; <!> quot; (行3のインデントを移動します 右)。
vimのUIの利点は、一貫性があることです。編集コマンドは、コマンドとカーソルの移動で構成されます。 カーソルの動きは常に同じです:
- H を画面の上部に、 L を下部に、 M を中央に
- n G は行nに、 G は単独でファイルの最後に、 g g は先頭に
- n は次の検索一致に移動し、 N は前の一致に移動します
- } から段落の終わりまで
- %を次の一致する括弧、括弧またはタグの種類のいずれか 次の行に
- enter
- ' x でxをマークします。xは文字または別の'
- その他、単語の場合は w および W 、行の先端までは $ または 0 、など、ラインの移動ではないため、ここでは適用されません。
したがって、vimを使用するには、カーソルを移動し、たとえば <!> gt; などのコマンドのレパートリーを覚えて、インデント(および <! > lt; から<!> quot; outdent <!> quot;)。
したがって、カーソル位置から画面上部までの行をインデントするには、 <!> gt; H 、 <!> gt; G でファイルの下部にインデントします。
<!> gt; H と入力する代わりに、 d H と入力すると、同じ行ブロックを削除する、 c H を置換するなど。
特定のコマンドに適したカーソル移動があります。特に、%コマンドは、HTMLまたはXMLブロック全体をインデントするのに便利です。
ファイルの構文が強調表示されている場合(:syn on
)、タグのテキストにカーソルを設定します(<!> lt; div <!> gt;の<!> quot; i <!> quot;のように、 <!> gt; %を入力すると、終了<!> lt; / div <!> gt;タグまでインデントされます。
これがvimの仕組みです。カーソルの動きとコマンドだけを覚えておく必要があり、それらをどのように組み合わせるかです。
したがって、この質問に対する私の答えは、<!> quot;インデントする行のブロックの一方の端に移動して、 <!> gt; コマンドを入力し、もう一方に移動しますブロックの終わり<!> quot; indent が行のシフトとして解釈される場合、
これを行う
$vi .vimrc
この行を追加します
autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent
これはcppファイル専用です。ファイルタイプを変更するだけで、別のファイルタイプでもこれを実行できます...
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'ark」のラベルです。任意の文字を使用できます)
- テキストの最後の行に移動してmzと入力します(zは任意の文字にすることができます)
- : 'a、' z <!> gt;または: 'a、' z <!> lt;インデントまたはアウトデントします(これは単語ですか?)
- ボイラ!テキストが移動されます(空の行はスペースなしで空のままになります)
PS:: 'a、' zテクニックを使用して、行、数字、または%を使用する可能性のある操作(d、y、s ///など)の範囲をマークできます
>}
または>{
現在の行から次の段落までインデントします
<}
または<{
同じインデント解除
まだ言及されていないもう 1 つの方法があります。 norm i
指定されたテキストを行の先頭に挿入するコマンド。2 行目から 10 行目までに 10 個のスペースを挿入するには、次のようにします。
:2,10norm 10i
コマンドの最後にはスペース文字が必要であることに注意してください。これが挿入したい文字になります。また、他のテキストで行をインデントすることもできます。たとえば、ファイル内のすべての行を 5 つのアンダースコア文字でインデントすることができます。
:%norm 5i_
または、さらに派手なもの:
:%norm 2i[ ]
より実用的な例は、# 文字を使用して Bash/Python/etc コードをコメント化することです。
:1,20norm i#
再インデントするには バツ の代わりに 私. 。たとえば、すべての行から最初の 5 文字を削除するには、次のようにします。
:%norm 5x
私にとって、MacVim(Visual)ソリューションは、マウスで選択して<!> quot; <!> gt; <!> quot;を押しましたが、次の行を<!> quot;〜/に入れた後です。 vimrc <!> quot;私はタブではなくスペースが好きだから:
set expandtab
set tabstop=2
set shiftwidth=2
また、コマンドライン(Terminal.app)からMacVimを呼び出すことができると便利です。次のヘルパーディレクトリ<!> quot;〜/ bin <!> quot;があるので、スクリプトを配置します<!> quot; macvim <!> quot;:
#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@
そしてもちろん<!> quot;〜/ .bashrc <!> quot;:
export PATH=$PATH:$HOME/bin
Macportsは<!> quot;〜/ .profile <!> quot;で混乱します。たくさんあるので、PATH環境変数はかなり長くなる可能性があります。
コメントで使用するメソッドが見つからなかったので、共有します(vimのみと思います):
- Esc でコマンドモードに入ります
- 識別したい最後の行の最初の文字に移動します
- ctrl - v でブロック選択を開始
- 特定する最初の行の最初の文字に移動します
- shift - i で特別な挿入モードに入ります
- インデントする必要がある数の空間/タブを入力します(たとえば2
- Esc を押すと、すべての行にスペースが表示されます
これは、vimrcでident / tab設定を変更したくない場合、または編集中に変更を記憶しておく場合に便利です。
インデントを解除するには、同じ ctrl - v ブロック選択を使用してスペースを選択し、 d で削除します。
このような簡単な答えを見つけるのがなぜ難しいのかわからない...
私自身はこれを知るために苦労しなければなりませんでした その非常にシンプルな
ホームディレクトリの下の.vimrc
ファイルを編集します
この行を追加
set cindent
適切にインデントしたいファイル内で
通常/コマンドモードタイプ
10== (this will indent 10 lines from the current cursor location )
gg=G (complete file will be properly indented)
5==
は、現在のカーソル位置から5行インデントします。
==
の前に任意の数字を入力できるため、行数をインデントします。
これはコマンドモードです。
gg=G
は、ファイル全体を上から下にインデントします。
:help left
ex mode
では、:left
または:le
を使用して、指定した量だけ行を整列できます。
具体的には、:%le3
は[範囲]で行を左揃えにします。行のインデントを[indent](デフォルトは0)に設定します。
:%le 3
または:%left3
または:%left 3
または:5,7 le 3
は、3つのスペースを埋めることでファイル全体を揃えます。
:le 0
は5行目から7行目に3つのスペースを埋めて整列します。
vim
値なしまたはgvim
は、0のパディングで左揃えになります。
これは、<=>および<=>で機能します。
:line_num_start,line_num_end>
e.g。
14,21> shifts line number 14 to 21 to one tab
「<!> gt;」を増やすより多くのタブの記号
e.g。
14,21>>> for 3 tabs
Pythonを頻繁に使用していると、ブロックを複数のインデントだけ頻繁にシフトする必要があります。これを行うには、任意のブロック選択方法を使用し、ジャンプするインデントの数を>
たとえばV5j3>
は5行を3回インデントします-インデントに4スペースを使用する場合は12スペースです
ファイルタイプのすべての行をインデントするには、 esc 、G = gg
viで強調表示されたコードをスペースの数だけすぐにインデントする方法:
オプション1:ビジュアルブロックモードでviのコードブロックを3つのスペースにインデントします:
-
インデントするコードのブロックを選択します。これを行うには、 Ctrl + V を通常モードで使用し、矢印を使用してテキストを選択します。選択した状態で、
:
を入力して、選択したテキストのブロックにコマンドを与えます。 -
以下がコマンドラインに表示されます:
:'<,'>
-
インデントを3つのスペースに設定するには、
le 3
と入力してEnterキーを押します。これが表示されます::'<,'>le 3
-
選択したテキストは、すぐに3つのスペースにインデントされます。
オプション2:Visual Lineモードでviのコードブロックを3つのスペースにインデントします:
- VIでファイルを開きます。
- いくつかのコードの上にカーソルを置きます
-
通常モードで次のキーを押します。
Vjjjj:le 3
あなたがしたことの解釈:
V
は、テキストの選択を開始することを意味します。jjjj
4行下矢印、4行を強調表示します。<=>は、強調表示されたテキストの指示を入力するようにviに指示します。
<=>は、強調表示されたテキストを3行インデントします。
選択したコードは、すぐに3スペースのインデントに増減します。
オプション3:ビジュアルブロックモードと特別な挿入モードを使用してインデントを増やす:
- VIでファイルを開きます。
- いくつかのコードの上にカーソルを置きます
-
通常モードで次のキーを押します。
Ctrl + V
jjjj
(スペースバーを5回押す)
Esc Shift + i
強調表示されたテキストはすべて、さらに5スペース分インデントされます。
すべてのファイルを4ずつインデントするには:
esc 4G=G
ブロックモードのビジュアル選択を使用します:
- ブロックの前に移動して(上または下に)移動します。
- ctrl-vを押して視覚ブロックモードに入ります。
- 移動して、行の前の列を選択します。
- I(Shift i)を押して挿入モードに入ります。
- いくつかのスペースを入力します。
- ESCを押します。すべての行がシフトします。
これはユニタスカーではありません。動作します:
- 行の途中。
- すべての行に任意の文字列を挿入します。
- 列を変更するには(Iの代わりにcを使用します)。
- ヤンク、削除、置換など...
-
コードブロック{}の場合: = + %
-
選択した行の場合: Shift + v 上/下矢印キーを使用して選択し、 = を押します。
-
ファイル全体の場合: gg + = + G
注: 'gg'は1行目に移動することを意味し、 '='はインデントコマンドで、 'G'はカーソルをファイルの末尾に移動します。
|
がVimのカーソルの位置を表すとします。インデントするテキストが次のようなコードブロックで囲まれている場合:
int main() {
line1
line2|
line3
}
>i{
を実行できます。これは、<!> quot; インデント(>
)ブロック(i
)ブロック({
) <!> quot;取得:
int main() {
line1
line2|
line3
}
次のように、行は連続しているがブロックの外側にあるとします:
do
line2|
line3
line4
done
行2から4をインデントするには、行を視覚的に選択して、>2j
と入力します。または、より高速に>Nj
を実行して以下を取得できます。
do
line2|
line3
line4
done
N
は、現在の行から下のset relativenumber
行へのインデントを意味することに注意してください。インデントする行数が大きい場合、ユーザーが<=>の適切な値を数えるのに数秒かかることがあります。貴重な時間を節約するには、<=>で相対番号のオプションを有効にします(Vimバージョン7.3以降で使用可能)。