hnwの日記

bashでtcsh風なM-p/M-nでのヒストリ検索を行う

最初に触ったUNIX系OSSunOS/Solarisであるような老人たちは、最初に触ったシェルがtcshである人が多いかと思います(もっと老人の人はまた別かもしれませんが)。しかし、いまやtcsh使いは珍しい存在になりつつあります。私も学生時代はtcsh一本でしたが、仕事でLinuxを触るようになってすぐにbashへ移行しました。


移行に際しては結構苦労があった気がしますが、キー操作に関して言えばbashでも殆どtcshと同様にEmacs風なキーバインディングが動くので、それほど不便を感じなかったように思います。ただ、コマンドの先頭何文字かをタイプしてから「M-p」「M-n」でその先頭何文字かが一致するコマンド履歴を辿る機能が無くなったのが非常にストレスでした。


しばらく不便を我慢して使っていましたが、あるとき検索して解決方法を見つけたように記憶しております。しかし、先日tcsh歴が10年オーバーの友人と飲んでいてbashについて同じ不便を感じていると言っていたので記事にしてみることにしました。


と言っても、解決方法は$HOME/.inputrcに下記のように書くだけです。もはや私自身意味がわからない行も多いのですが、M-p/M-nに関するものは最後の4行だけです。以前は最後の2行は不要だったのですが、最近のcygwin環境だと最後の2行でないと動きません。その原因が何なのか私は把握していませんけど、readlineのバージョンの差くらいしか思いつかないです…。実際のところは何なんでしょうかね。

# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off

# Enable 8bit input
set meta-flag on
set input-meta on

# Turns off 8th bit stripping
set convert-meta off

# Keep the 8th bit for display
set output-meta on

# none, visible or audible
set bell-style none

# tcsh-like history search
"\M-p": history-search-backward
"\M-n": history-search-forward
"\ep": history-search-backward
"\en": history-search-forward

zshもbindkey -eしただけだと少し挙動が違うので、将来zshに移行する時があったらまた悩まないといけないようです。既に解決済みの方がいらしたら是非ご教授ください。