シェルスクリプトで対話的な選択を出来るようにするスクリプトを作った で紹介したsentaku というスクリプトに対してEmasc的なキーバインドを実装しました。
Emacsキーバインド
sentakuは複数のインプットを並べて インタラクティブに選択出来るようにしたBash/Zshのスクリプトです。
選択時に行を移動させるのに、デフォルトだとVimのjが下、kが上、
みたいなキーバインドになってますが、
これに加えてEmacsの様に<C-n>で下、<C-p>で上、に移動できる様なオプションを付けました。
使い方は直接sentaku -Eと-Eのオプションを与えるか、
常にEmacsモードにしたい場合は環境変数で
export SENTAKU_KEYMODE=1
と、SENTAKU_KEYMODEという変数を1にします(デフォルトは0=Vim Mode)。
Emacs移動は
- <C-n>: 一行下を選択
- <C-p>: 一行上を選択
- <C-v>: Page down
- <M-p>: Page up
の4つ。(Macでは<M-p>=<Cmd-p>が上手く動かないかもしれません。)
ただ、Vim Modeであっても他のキーとバッティングしないので 両方で有効になっています。
特に、Vim ModeでSearchに入った時、
ESCを押さずにも<C-n>とかで直接移動出来るようにもなりました。
Emacs Mode専用で良い点は、Controlとかがついてない普通のキーを入力すると すぐにインクリメンタルサーチを始められるところです。 検索して絞り込んで決定、をよく使う場合はこちらの方が便利かもしれません。
検索モードのオプション追加
ついでに、検索の仕方についてもオプションを追加しました。
これまでは、入力した文字から始まる物を検索してましたが、
SENTAKU_SEARCH_OPTという環境変数を設定することで、
以下の4つを選べます。
- 0: AND search (ignore case) (Default)
- 1: AND search (case sensitive)
- 2: Starts with (ignore case)
- 3: Starts with(case sensitive)
これまでのデフォルトは3に当たるものでしたが、
現在のデフォルトは0で、
大文字小文字区別せず、入力文字が含まれてたら該当するようになっています。
また、スペースで区切って入力するとそれらのAND検索になります。
Macのスポットライト検索とかと同じ感じ。

同じような機能を持つもの
ついでに最近見つけたsentakuと似たような事を目的とした物について。 結構昔からあるので、なんで今まで気づかなかったのかな、と。
もともとBashのシェルスクリプトを書いてて その内の一部がいくつかのスクリプトで共有できそうだったので 切り分けた形なので、先にこういうのあるかな、と検索してなかったからだとは思いますが。
上のEmacsモード入れてみよう、と思ったのは実はこれらを見つけて 見てみたというのが理由。
- zsh-users/zaw
    - Zsh用
- キーバインドはEmacsライクのみ?
- zawで快適シェル生活
 
- mooz/percol
    - Python (なのでBashでもZshでもOK)
- キーバインドはEmacsライクにもVimライクにも出来る。
- ターミナル版anything的なpercolをzawの代わりに試してみた - $shibayu36->blog;
 
基本的に同じ様な機能だと思います。
sentakuならそのままBashでもZshでもシェルスクリプトとして簡単に(自分的に) 拡張できますよ、という点が利点ということで。
