Vimとは
元々はエディタ「vi」(ヴィーアイ)を改良して作られたもので「Vi IMproved(改良版vi)」 の略が Vim です。サーバー内のテキスト編集(設定ファイルの修正など)でよく使われます。GUIがない環境でも軽快に動作し、慣れると他のエディタよりも効率的に操作できるようです。
起動方法
ターミナルでvim {ファイル名}を入力するとVimで対象のファイルを開くことができる。
各モードの説明
Vimには複数の操作モードがあり、代表的なものは以下の通り。
| モード | 説明 |
|---|---|
| ノーマルモード | デフォルトの状態。コマンド入力の基本モード |
| 挿入モード | 文字入力をして編集していくモード |
| ビジュアルモード | 選択範囲を視覚的に確認できるモード |
| コマンドラインモード |
:から始まるコマンドをファイル保存や終了などのコマンド実行 |
基本操作
カーソルの移動方法
^ h キーは左方向に移動します。
k j キーは下方向に移動します。
< h l > k キーは上方向に移動します。
j l キーは右方向に移動します。
v
コマンド一覧
| コマンド | 説明 |
|---|---|
| x | カーソル下の文字を削除 |
| r | カーソル下の文字を1文字置き換え |
| R | カーソル下の文字から複数の文字を置き換え |
| u | 直近の変更の取り消し |
| U | 行全体の取り消し |
| Ctrl + R | 取り消しの取り消し |
| p | 貼り付け |
| . | 直前のコマンド繰り返し |
| Esc | ノーマルモードへ戻る |
| :q! | 変更を破棄して終了 |
| :wq | 変更を保存して終了 |
| :help | オンラインヘルプを開く。:help wのように引数を与えることもできる |
pコマンドの「貼り付け」は、コピーした文書だけでなく、削除や変更した文書なども貼り付けることができる。
Vimでは削除、変更やヤンク(コピー)などの操作対象テキストがレジスタに保存されるが、pコマンドはそのレジスタに入っている最新のテキストを貼り付けることができるからである。
挿入モード
Vimには文字を編集するための挿入モードがあり、いくつかのコマンドから挿入モードに入ることができる。
| コマンド | 説明 |
|---|---|
| i | カーソルの前から挿入 |
| a | カーソルの後ろから挿入 |
| o | 現在の行の下に新しい行を追加してから挿入 |
| I | 行の先頭から挿入 |
| A | 行の末尾から挿入 |
| O | 現在の行の上に新しい行を追加してから挿入 |
ビジュアルモード
選択範囲を視覚的に確認できるモード。複数の選択方法があるがCtrl + vの使い勝手が良いので最初はCtrl + vだけでも覚えるのが良いと思われる。VSCodeのマルチカーソルに似ていて複数行の編集の際に便利。
| コマンド | 説明 |
|---|---|
| v | 文字単位で選択 |
| V | 行単位で選択 |
| Ctrl + v | 矩形選択。列単位で複数行選択できる |
実例
Ctrl + v → jjj(下3行選択) → $ → dでカーソルから行末まで3行分を同じように削除できる。
移動系のコマンド(モーション)
| コマンド | 操作 |
|---|---|
| w | 単語移動 |
| b | 単語移動(逆順) |
| e | 単語末尾に移動 |
| $ | 行末に移動 |
| ^ | 行頭の最初の非空白文字へ |
| 0 | 行頭へ移動 |
| gg | 先頭行に移動 |
| G | 最終行に移動。10Gと入力すると10行目に移動できる。 |
| t{文字} |
txで文字xの手前に移動 |
| f{文字} |
fxで文字xに移動 |
| ( | 前の文へ |
| ) | 次の文へ |
| { | 前の段落へ |
| } | 次の段落へ |
| % | 対応する括弧へ移動。 カーソルを括弧に合わせて使用する。 |
| Ctrl + f | 1ページ分下へスクロール |
| Ctrl + b | 1ページ分上へスクロール |
| Ctrl + d | 半ページ下へスクロール |
| Ctrl + u | 半ページ上へスクロール |
テキスト操作
オペレーターと呼ばれる操作の種類を表すコマンドと一部のモーションコマンドは組み合わせることで便利にテキスト操作をすることができる。
オペレーター
| コマンド | 操作 |
|---|---|
| d | 削除 |
| y | ヤンク(コピー) |
| c | 変更 |
| > | 右にインデント |
| < | 左にインデント |
オペレーターとモーションの組み合わせの例
| 例 | 意味 |
|---|---|
| dw | 単語を削除 |
| y$ | カーソル位置から行末までコピー |
| C0 | 行頭まで変更 |
| d} | 次の段落まで削除 |
| dgg | ファイル先頭まで削除 |
| dG | ファイル末尾まで削除 |
行操作
オペレーターのコマンドを2回繰り返すことで行全体への操作となる
| コマンド | 操作 |
|---|---|
| dd | 行削除 |
| yy | 行コピー |
| cc | 行変更 |
| >> | 行全体を右にインデント |
| << | 行全体を左にインテンド |
テキストオブジェクト
テキストオブジェクトは括弧の中や""で囲われた範囲など意味のある単位を対象にすることができる。
実際に使用する際はオペレーターやi(inner)やa(around)といった修飾子と合わせて使用される。
例えばオペレータであるcコマンドの変更と修飾子のi、テキストオブジェクトの"を組み合わせてci"と入力すると""で囲われた範囲が変更できる。
修飾子
| 修飾子 | 範囲 |
|---|---|
| i | テキストオブジェクト自体は含まず、その内側だけを対象とする。 |
| a | テキストオブジェクトを含めて囲われた範囲内を対象とする。 |
挿入モードに切り替える時もiやaを使うが、あちらはinsert、appendの意味で
修飾子として使う時とは違う意味になるので注意。オペレーターの後につくiやaは修飾子として扱われる。
テキストオブジェクト一覧
| オブジェクト | 対象範囲 | 例 |
|---|---|---|
| w | 単語 |
daw → 単語ごと削除 |
| p | 段落 |
dap → 段落削除 |
| s | 文 |
das → 文を削除 |
" ' ( [ { <
|
対応する括弧や引用符の内外 |
di(, da", da{ など括弧や引用符で囲われた範囲を削除 |
| t | HTMLタグ |
dit → タグの中身を削除 |
検索
例えば/wordと入力しEnterキーを押すとwordの文字列がないか検索することができる。
検索に関する代表的なものは以下の通り。
| コマンド | 操作 |
|---|---|
| /{検索したい文字} | 下方向に検索したい文字を部分一致で検索 |
| ?{検索したい文字} | 上方向に検索したい文字を部分一致で検索 |
| n | 同じ方向に次の検索結果へ |
| N | 逆方向の次の検索結果へ |
| * | カーソル下にある単語を下方向へ完全一致検索できる |
| # | カーソル下にある単語を上方向に完全一致検索できる |
| g* | カーソル下にある単語を下方向へ部分一致検索できる |
| #* | カーソル下にある単語を上方向に部分一致検索できる |
検索は削除や変更などのコマンドと組み合わせて使用できる。
例えばd/wordと入力すると現在のカーソル位置からwordの直前までを削除することができる。
置き換え
基本的には:s/置き換え前の文字/置き換え後の文字で置き換えることができる。
以下の様に置き換えにはいくつかの種類がある。
| コマンド | 操作 |
|---|---|
| :s/old/new | 現在行の最初の old を new に置換する |
| :s/old/new/g | 現在行の全ての old を new に置換する。 |
| :#,#s/old/new/g | #,# には置き換える範囲の開始と終了の行番号を指定する。 指定した行の間で条件にあったものを置き換えする |
| :%s/old/new/g | ファイル全体で見つかるものに対して変更する。 |
| :%s/old/new/gc | ファイル全体で見つかるものに対して 1つ1つ確認をとりながら変更する。 |
外部コマンドの実行
:! コマンドを入力してEnterキーを押すと外部シェルコマンドを実行できる。
例えば:!lsでlsコマンドを実行できる。
余談
ヘルプでどんなコマンドがあるか見ていたら:smileというコマンドがあったので、実行したら以下のアスキーアートが表示されました。こういった遊び心があるとちょっと好きになりますね。
