シェルコマンド履歴のインクリメンタルサーチとbc
シェルのコマンド履歴検索って便利ですよね.
bc コマンドも同じくらい便利ですよね.
コマンド履歴検索にCtrl+r
(backward search) とCtrl+s
(forward search) を使い分けているのですが,こいつはOSX 付属のbc
コマンドと相性が悪い という話題です.
困っていること
ターミナル上でシェルを起動し,しばらく使っていると
Ctrl+s
(fwd-i-search) が効かなくなる
Ctrl+r
(bck-i-search) は使える- シェル起動直後は大丈夫
はじめからCtrl+s
効かないけど? というときは
たぶん,コントロールキャラクターがターミナルに取られています.
$ stty -a | grep "stop =" stop = ^S; susp = ^Z; time = 0; werase = ^W;
zsh のデフォルトもこの動作だと思います.
このままだとCtrl+s
でターミナルを一時的に止められますが,シェルコマンド履歴検索が便利すぎるので そっちを優先したい.
たとえば.zshrc
に追記して,ターミナルにCtrl+s
を無視させればOK です.
# .zshrc
stty stop undef
なぜCtrl+s
(fwd-i-search) が効かなくなるか
私の環境だとOSX でのみ発生しています.
調べると,OSX 付属のbc
を起動したとき,ターミナルがCtrl+s
を解釈するよう再設定されるっぽい!!
余計なお世話.理由もよくわからん.
# 普段は^S を無視 $ stty -a | grep "stop =" stop = <undef>; susp = ^Z; time = 0; werase = ^W; $ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. quit # ^S を解釈しはじめる $ stty -a | grep "stop =" stop = ^S; susp = ^Z; time = 0; werase = ^W;
bc 1.06 をビルドし直したバイナリだと,このような動作にはなりません.
Workaround
bc を終了するたび,undef することにしました.
alias bc='bc; stty stop undef'
カッコわるいので,もっといい方法があったらぜひ教えてください.