bck-i-search
bash とか zsh とかで Ctrl-R で発動するアレ。Ctrl-R に続いて過去に実行したコマンドのどこか一部を適当にタイプすると一致するものを探してきてくれる。便利。
ポイントは部分一致なところ。よくあるのは「コマンドじゃなくて、それに続くパラメータの方がユニークなので、そちらで探す方が効率が良い」みたいなパターン。たとえば、こんな感じの履歴があるとしよう。
$ curl 'http://api.example.com/users?q=foobar' -X GET -H 'Accept: application/json' | jq ".users[] | .name"
ここで困ったことに curl
で始まる履歴はこれ以外にも山ほどある。^Rcurl
とタイプしても似たようなものがいろいろ出てきて絞りきれない。探したいのは curl
に渡したパラメーターに foobar
というキーワードが入っていものである、という場合。慌てず騒がず ^Rfoobar
とタイプすればだいたい見つかる。Ctrl-R は部分一致。
fish で Ctrl-R
fish だと Ctrl-R しても反応しない。少なくとも、デフォルトの設定では動いてくれない。ヒストリー検索的なものがないのかと言うと、そうではない。むしろ Ctrl-R は要らない。コマンドをタイプし始めると、勝手にヒストリーを検索してきて、まだタイプしていない続きの部分を「これでしょ?」とサジェストしてくれる。
便利なのだけど、一つ問題があって、自動的にサジェストまで出してくれるのは前方一致で履歴が見つかった場合に限るということ。たとえば↑と同様に
$ curl 'http://api.example.com/users?q=foobar' -X GET -H 'Accept: application/json' | jq ".users[] | .name"
という履歴があった場合に curl
とタイプするとその横から続きの 'http://api.. (以下略)
をサジェストしてくれるのだが、タイプするのが foobar
だと一見して何も反応がない。ので、fish のヒストリー検索は前方一致しかサポートしてないみたいに見えてしまう。が、実はそうではなかった。
fish で部分一致な bck-i-search
正解は、
- 履歴のどこか一部をタイプした後、
- Ctrl-P
で部分一致なヒストリー検索が発動する。
↑の例だと foobar^P
とタイプすれば ok.
キーワードに続いて Ctrl-P を叩くのがポイント。