Vim は様々な機能をサポートしていますが、利用しない機能も多く、コンパイル時の設定で機能の有効・無効を選択できるようになっています。Ubuntu の Vim に比べると RHEL 系の標準の Vim (vi コマンドで起動)は、折り畳み機能 など色々な機能が制限されています。サポートされている機能の一覧を見るには --version オプションを使用します。サポート機能には +、未サポート機能には - がつきます。
$ vi --version
機能の一覧は下記を参照してください。
メモ帳や秀丸などの通常のテキストエディタとは異なり、ノーマルモード(normal mode)と挿入モード(insert mode) があります。vim 起動時はノーマルモードです。ノーマルモードでは j
や k
などのキーを押しても文字は挿入されず、j
(下に移動)、k
(上に移動)などキーに応じたコマンドが実行されます。ノーマルモードから挿入モードに遷移するには i
などのコマンドを打ちます。
i : カーソルの位置から挿入モードに遷移する(Insert) (<Insert>でも可) a : カーソルの次の文字から挿入モードに遷移する(Append) o : カーソルの次の行から挿入モードに遷移する I : カーソル行の行頭から挿入モードに遷移する(ホワイトスペースではない行頭) gI : カーソル行の行頭から挿入モードに遷移する(ホワイトスペースを含む行頭) A : カーソル行の行末から挿入モードに遷移する O : カーソルの上の行から挿入モードに遷移する
挿入モードからノーマルモードに戻るには <Esc>
キーを押します。
<Esc> : 挿入モードを終了する
コマンドの前に数値 N を指定した場合は、挿入モードに入ってから抜けるまでの間に挿入した文字列を N 回挿入します。例えば、64iA<Esc>
は64個のAを挿入します。(→ 回数指定)
[N]i : 挿入モードに遷移する(Insert) (<Insert>でも可) [N]a : カーソルの次の文字から挿入モードに遷移する(Append) [N]I : 行の先頭から挿入モードに遷移する [N]A : 行の末尾から挿入モードに遷移する [N]o : カーソルの次の行から挿入モードに遷移する [N]O : カーソルの上の行から挿入モードに遷移する
ノーマルモードではノーマルモードコマンドを使用できます。上記の挿入モード(i
)、追記(a
)、行頭に挿入(I
) などもノーマルモードのコマンドです。下記はカーソルを移動させるノーマルモードコマンドです。
h : 1文字左に移動 j : 1行下に移動 k : 1行上に移動 l : 1文字右に移動
ノーマルモードでは :
に続けて Exコマンドも使用できます。例えば :right
コマンドはカーソルがある行を右寄せします。
:right
: の前に数字を入れるとカーソル行から N 行に対してコマンドを実行します。
3:right : 現在行から3行右寄せする
対象とする行を {range} で指定することもできます。
:{range}{ExCommand} :3,5right : 3行目から5行目を右寄せする :.,5right : 現在の行(.)から5行目までを右寄せする :.,.+2right : 現在の行(.)から2行下の行(.+2)までを右寄せする :.,'aright : 現在の行(.)からマーク a までの行('a)を右寄せする :%right : すべての行を右寄せする
Exコマンドの入力を途中で中断することもできます。
<Esc><Esc> : Exコマンドの入力を中断する Ctrl-c : Exコマンドの入力を中断する
直前に実施したExコマンドを繰り返し実行することもできます。
@: : 最後に実行したExコマンドを繰り返す [N]& : 最後に実行した s コマンド(置換)を N回繰り返す
過去に実行した Exコマンドの履歴を参照することもできます。
:<Up> : 過去に実行したExコマンドの古いものを参照する :<Down> : 過去に実行したExコマンドの新しいものを参照する q: : コマンド履歴をウィンドウ表示し、選択して実行
Exコマンド名は省略することができます。例えば :right(:ri) や :ri[ght]
のように記述されている場合、少なくとも :ri まで入力すれば残りの文字を省略することができます。
:right(:ri) : 右寄せする :ri : :right と解釈される :rig : :right と解釈される :righ : :right と解釈される :right : :right と解釈される
Vim
は多くのオプション変数をサポートしてます。例えば tabstop
というオプションはタブ文字数を意味します。
:set tabstop? : 現在の tabstop の値を表示する :set tabstop=2 : tabstop の値を 2 に変更する
On か Off かの二値を持つオプションもあります。例えば autoindent
は自動インデントを行う・行わないの二値を持つオプションです。:set
を行うと有効に、:set no~
を行うと無効になります。
:set autoindent : autoindent を有効にする :set noautoindent : autoindent を無効にする
文字列型のオプションに空白を使用する場合は空白の前にバックスラッシュ(\)をつけます。
:set equalprg=indent\ -br\ -ce (equalprg に indent -br -ce を設定)
オプションの多くは省略形の名前を持ちます。例えば、tabstop は ts、autoindent は ai という省略名を持ちます。
:set ts=2 : :set tabstop=2 と同じ :set ai : :set autoindent と同じ :set noai : :set noautoindent と同じ
多くのノーマルモードコマンドの前に回数を指定することができます。回数を指定することが可能なコマンドは次のように表記します。[...]
は ...
が省略可能であることを示します。
[N]j : N行下に移動する [N]dd : N行削除する
例えば j
は「1行下に移動」のコマンドですが、5j
とタイプすると「5行下に移動」します。同様に dd
は「1行削除」のコマンドですが 13dd
は「13行削除」します。
いくつかのノーマルモードコマンドではレジスタを指定することができます。レジスタ指定可能なコマンドは次の様に表記します。[...]
は ...
が省略可能であることを示します。例えば、dd
は「1行削除して記憶」、p
は「記憶した文字列を挿入」するコマンドですが、"gdd
と打つと、1行削除した文字列が g という名前のレジスタに格納されます。また、"gp
と打つと、レジスタ g に格納された文字列が挿入されます。レジスタ名はダブルクォーテーション(")を含む1文字の半角英数で指定します。
["x]dd : 行を削除する ["x]p : コピーバッファの内容を張り付ける
:registers
はレジスタの一覧を表示します。
:reg[isters] : レジスタの一覧を表示
いくつかのノーマルモードコマンドでは {motion}
を指定することができます。モーションはカーソル移動を意味します。例えば y
は {motion}
までの文字列をコピー(ヤンク)するコマンドです。3w
は 3単語分カーソルを移動するコマンドです。これを組み合わせて、y3w
は現在のカーソル位置から3単語分をコピーします。
y{motion}
よく使用されるのは cw
です。c
は {motion} までのテキストをカットして挿入モードに入るコマンドです。w
は1単語分移動するコマンドです。これを組み合わせて cw
とすると、カーソル位置から1単語分削除して挿入モードに入ります。単語を別の単語に補正する際によく使用します。
c{motion}
マークとの組み合わせもよく使用されます。例えば、10行目から20行目を削除したい場合、まず、10行目にカーソルを合わせて ma
をタイプし、10行目を a という名前でマークします。20行目に移動して、'a
をタイプするとマークしていた 10行目に移動しますが、削除コマンドの d
と移動コマンドの 'a
を組み合わせて d'a
とタイプすると、現在のカーソル行から a の行(10行目)までの間を削除することができます。
d{motion}
ビジュアルモード で選択した範囲を {motion} として参照することもできます。