Help us understand the problem. What is going on with this article?

fish で bck-i-search

More than 3 years have passed since last update.

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 を叩くのがポイント。

cesare
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away