Bashでコマンドを入力したり、コマンド履歴を確認する際にはEmacs由来のキーバインディングがデフォルトですが、実はvi(Vim)のキーバインディングに変更できることをご存知でしょうか。
本記事では、Bashのコマンド入力モードをviモードに変更する方法や、効率を上げるための設定・カスタマイズ方法を紹介します。
目次
- 概要とメリット
- viモードへの変更方法
- 主なキーバインディング
- 設定の恒久化とプロンプトのカスタマイズ
- まとめ
概要とメリット
Bashのコマンド入力や履歴操作のインターフェースは、GNU Readline というライブラリによって提供されています。デフォルトではEmacs互換の操作感になっていますが、これをvi互換に切り替えることができます。
現在のモード確認方法
現在の設定を確認するには、以下のコマンドを実行します。
# Bash
set -o | grep -E '^vi|emacs'
表示例:
# Plaintext
emacs on
vi off
メリット
Vimmerにとっての最大のメリットは、普段からVimやNeovimで手に馴染んでいる「ノーマルモード」での移動や編集がそのままシェル上で再現できることです。
行頭・行末への移動、単語単位のジャンプ、文字の削除などがホームポジションから動かずに高速に行えるようになります。
viモードへの変更方法
一時的にviモードを有効にするには、set コマンドを使用します。
# Bash
# viモードを有効化
set -o vi
# emacsモードに戻す場合
set -o emacs
主なキーバインディング
viモードを有効にすると、Vimと同様に「挿入モード」と「コマンドモード(ノーマルモード)」を切り替えて操作します。
- 挿入モード: 通常の入力状態。シェル起動時はこのモードです。
- コマンドモード:
Escで移行。行内の移動や履歴検索を行います。 - エディタ起動: コマンドモードで
vを押すと、環境変数$EDITORで設定されたエディタが立ち上がり、複雑なスクリプトを記述して実行できます。
| モード | キー | 操作内容 |
| 挿入モード | Esc | コマンドモードへ移行 |
| コマンドモード | h, j, k, l | 左・下(履歴次)・上(履歴前)・右へ移動 |
w, b, e | 単語単位で移動(次へ・前へ・単語末尾へ) | |
0, ^, $ | 行頭・文字の先頭・行末へ移動 | |
i, I, a, A | 挿入モードへ(現在位置・行頭・次文字・行末) | |
x, dd, D | 1文字削除・行全体削除・カーソル以降を削除 | |
/, ? | 履歴を前方/後方検索 | |
n, N | 検索候補の次/前へ | |
v | $EDITOR を起動して編集 |
コマンド操作は、「コマンド履歴という1つのファイルをviで編集している」とイメージすると理解しやすくなります。
設定の恒久化とカスタマイズ
設定を永続化させるには、~/.bashrc または ~/.inputrc を編集します。
1. Bashのみをviモードにする場合
~/.bashrc に以下を追記します。
# Bash
set -o vi
2. Readline全体(psql等を含む)に適用する場合
~/.inputrc を作成し、以下を記述します。
set editing-mode vi
プロンプトにモードを表示する
現在のモード(挿入/コマンド)を視覚的に判別できるようにすると非常に便利です。~/.inputrc に以下の設定を追加します。
# プロンプトにモードを表示
set show-mode-in-prompt On
# 各モードの表示文字列をカスタマイズ(任意)
set vi-ins-mode-string (ins)
set vi-cmd-mode-string (cmd)
適用後のイメージ:
# Bash
# 挿入モード
(ins)user@host:~$
# Escキーを押してコマンドモードに変更
(cmd)user@host:~$
まとめ
Readlineの設定をviモードに変更することで、普段使い慣れたキー操作をシェルの入力にも持ち込むことができます。特にプロンプトへのモード表示を組み合わせることで、操作ミスを減らしつつコマンド入力の効率を大幅に向上させることが可能です。Vimmerの方はぜひ設定してみてください。
