(ご存知かとは思いますが)GNU Bashにはhistory-search-forward及びhistory-search-backwardという関数が用意されており,これには行頭からカーソル位置までの文字列で履歴を前方/後方に非逐次検索し,その結果でコマンドラインを置換するという機能があります。
ble.shには,まだ実装されていないように思います(ble-bind --list-widgets | grep 'history-search'とやっても引っ掛からない)。どうか追加してはいただけないでしょうか。
対応しました。お返事が遅くなってしまい大変申し訳ありません。すぐに実装できると思って敢えて返信しなかったのですが、今週は新学期のごたごたなどがあったのと、手を広げすぎて (isearch, dabbrev の再実装など) なかなかまとめられなくなったので遅くなってしまいました。
Non-incremental 検索 (nsearch) の開始操作は取り敢えず以下の通りです。
| ble widget | rl function | ble.sh default bindings |
|:--|:--|:--:|
| history-search-backward | history-search-backward | C-x C-p, C-x up |
| history-search-forward | history-search-forward | C-x C-n, C-x down |
| history-substring-search-backward | history-substring-search-backward | C-x p |
| history-substring-search-forward | history-substring-search-forward | C-x n |
| history-nsearch-backward | non-incremental-reverse-search-history | C-x < |
| history-nsearch-forward | non-incremental-forward-search-history | C-x > |
検索開始後の操作は以下の通りです。
| 操作 | 動作 |
|:--:|:--:|
| C-g | キャンセル |
| C-m, RET | 確定 (検索を抜ける) |
| C-j, C-RET | 確定の後 RET を実行 |
| C-p, up | 前の候補 (より昔の履歴) |
| C-n, down (訂正済) | 次の候補 (より最近の履歴) |
| 他 | 確定の後その操作を実行 |
また isearch についても確定の動作を多少変更しましたのでご注意ください。
| 操作 | 動作 |
|:--:|:--:|
| C-m, RET (訂正済) | 確定 (検索を抜ける) |
| C-j, C-RET (訂正済) | 確定の後 RET を実行 |
dabbrev では、通り越した候補にまた戻る機能を追加しました。
| 操作 | 動作 |
|:--:|:--:|
| C-s | 前に提示した候補に戻る |
追記: 書き忘れましたが、dabbrev も一緒に変更する必要があったので enhance-complete の方に実装しました。
95268c1 すみません。今 dabbrev の C-s を試したら描画がバグってました…。直しました
忙しいなか対応していただき,ありがとうございます。
すいません,早速要望を付け加えたいんですが,秋学期のこともありますし,ほんとうにいつでも結構です。
あと一つ質問なのですが,編集関数を作成したい場合,どのあたりで定義してあげればいいでしょうか。Vimモードの編集関数を少し自分なりに調整したいと思い,試してみると,vim-load-hookを読み込んでいるブロックの中では定義できず,外では定義できました。しかしVimモードの編集関数をVimモードに関わらない部分で定義してもいいのだろうかと思いまして……。
履歴検索を開始したあとの挙動を変更できるようにしてほしい
ble-bind -m nsearch -f kspecs widget-name です。使える編集関数は ble-bind -L | grep nsearch/ で御覧ください。すみません。キーマップの初期化を必要になるまで遅延しているので、一度検索を実行した後でないと ble-bind -P で出ないのですね…。
編集関数自体はどこで定義しても問題ありません (実行または ble-bind は各モードがロードされた後でないといけません)。ただ、_ble_keymap_vi_load_hook 経由で定義できた方が綺麗 (というか気分が良い) とは思います。 vim-load-hook の中でも定義できる (関数の中で関数を定義) はずだと思ったのですが、もう少し状況を教えて頂ければ原因が分かるかもしれません。
ble-bind -m nsearch -P という様にした時には表示されるようにしました (-m kmap を指定した時点で初期化を実行するようにしました)。isearch はロード時に初期化&キャッシュされるのに、nsearch が既定で初期化されないのは変なので、nsearch もロード時に初期化・キャッシュのリストに入れる事にしました。編集関数の方はいかがでしょうか。こちらで簡単に試した範囲では _ble_keymap_vi_load_hook に登録した関数内で定義して問題なく使えるようです。もし問題が未だ解決していないようでしたらどうぞ新しく Issue を立てて頂ければ幸いです。
こちら閉じますね。
もうしわけないです,いろいろ試している内に報告を忘れていました。問題なく定義できました(Commit ID:bb1553f) 。ただ,関数の中でのコマンドに,aliasが反映されないのが少し気になりました。ble.shの設定後にbashの(aliasを含む)設定をしているので,ある意味当然かも知れませんが……。
なるほど、そこは分かりにくいですが Bash の仕様なので仕方ないですね。実は alias ならば ble.sh の読み込みより先に定義して頂いて問題ありません。
元々 ble.sh を先に読み込んで頂いているのは「bind を ble.sh 側で上書きして、ユーザの bind の設定を ble.sh の設定に翻訳しよう」と思っていたからなのですが、如何せん自分が使わないので実装するきっかけが作れず、未だ実装していません… (いつかは実装しようと思っています)。