読者です 読者をやめる 読者になる 読者になる

LGTM

Looks Good To Me

シェルコマンド履歴のインクリメンタルサーチとbc

シェルのコマンド履歴検索って便利ですよね.

bc コマンドも同じくらい便利ですよね.

コマンド履歴検索にCtrl+r (backward search) とCtrl+s (forward search) を使い分けているのですが,こいつはOSX 付属のbc コマンドと相性が悪い という話題です.

注: zshbash に限る.csh はわかりません.

困っていること

ターミナル上でシェルを起動し,しばらく使っていると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'

カッコわるいので,もっといい方法があったらぜひ教えてください.