テキストエディタに vim を使い、ブラウザでも vimperator / pentadactyl その他を使ってると、知らぬうちに Esc を連打してたり、画面上に jjjjj ...
などという文字が並んだりして、ハッと我に返ることがままあるものです。(ない?)
こうなると、あらゆるところを vim のキーバインドで過ごしたくなるものですが、意外と盲点なのがシェルのキーバインドです。
行頭に移動するために Ctrl + A したり、単語単位で移動するために Meta + F などとしていると違和感を感じませんか?
そうです! これこそ我ら Vimmer が忌み嫌う、あの、Escape Meta Alt Ctrl Shift などと言ってあざ笑う、Emacs のキーバインドそのままじゃないですか!
これは捨ててはおけません。一日の大半を過ごすターミナル上で、まさか Emacs のキーバインドを使って過ごす羽目になっていたとは! これは単なる背信を超えて悲劇的ですらあります。全世界の善良な Vimmer は望む望まざるに関わらず、あの、小指を駆使する非人間的で非効率的なキーバインドを強制されていたのです!
Readline の vi モード
という冗談はさておき、こういうのは誰もが考えることなのでしょう。既にオプションが用意されています。~/.inputrc
に次のように書けば ok です。
# vi モード set editing-mode vi
環境を汚したくない場合は、一時的に切り替えることも出来ます。
# vi モードに切り替える $ set -o vi # 元に戻す $ set -o emacs
これは Bash その他のシェルに備わっている機能ではなく、readline(3) を利用する全てのアプリケーションに影響するものです。そのままでは lftp や Python インタプリタといった、CUI ツールの多くに影響します。
もし、全ての readline アプリケーションではなく、特定のアプリケーションにこの設定を限定したいという軟弱な Vimmer ども、もとい、他の環境との互換性を重視する場合は、次の書式で設定できます。
$if Bash set -o vi $endif
vi モードの使い方
チートシート
readline(及び、後述のeditline)は vi に備わる全てのキーバインドを網羅しているわけではありません。次のチートシートでその一覧を確認してください。
Bash VI Editing Mode (readline) Cheat Sheet
http://www.scribd.com/doc/985243/Bash-VI-Editing-Mode-readline-Cheat-Sheet
vim 7.0 で追加された text-objects が使えないのは痛いです。ci" とか使えたら便利なんですけどね。残念。
vi(vim)の操作方法自体はこの記事を読まれるほどの方には釈迦に説法でありましょう。しかし、readline の vi モードにはちょっと癖があります。
最初からインサートモード
利便性のためか、vi モードではノーマルモードではなく、インサートモードがデフォルトです。コマンドを打ち始めるときに i などのキーを押す必要はありません。
ただ、モードを表示する方法がないのは困りものです。無意識のうちに Esc を押して(Vimmer にはありがちな習性です)ノーマルモードに入り、ログを表示しようとして lv hoge.log
などと打つと、次に説明する vi-edit モードに入ってしまいます。
コレが結構困りものです。readline のキーバインドは ~/.inputrc
で変更可能なようなのですが、既存のバインドを解く方法がいまいちわからんのですよね。どうしたらいいんでしょう?
vi-edit モード(仮称)
ノーマルモードで V を押しますと、環境変数 $EDITOR
に設定したエディタが起動し、そこでコマンドラインを編集することが出来ます。
しかし、上記のような打ち間違いのリスクと考えるといまいち使えない機能です。そんなに長いコマンドなら捨てスクリプトに書いた方がましだと思うんですけどね。
editline で vi モード
readline だけでは完璧ではありません。MySQL のコマンドラインツールなどでは readline の互換ライブラリ libedit (editline) が使われています。
こいつには ~/.inputrc
の設定は効きゃあしません。~/.editrc
を使いましょう。
bind -v
互換ライブラリなのに設定ファイルの書式が違うのは何なんでしょうね? 統一して欲しいものです。
キーバインド自体は readline と変わらないようですが、V を押して vi-edit モードに入ろうとすると MySQL ごとクラッシュしてしまいました。何コレホント使えない……。