bashでメニュー補完を使う ひとりぷちアドベントカレンダー2017 07日目
CUIオンリーの場合、ファイルは目の前にあるけれど名前のせいで手を出せずに悔しい、ってことがたまにありますよね。先頭の文字が文字化けだったり、特殊文字だったりで入力できないという状況。
そんな時に活躍するのが、候補を順次入力してくれるメニュー補完(menu-complete)です。
機能自体はbash
に内蔵されているのでキーを割り当てるだけで利用できます。
動作の違い
通常の補完(complete)は共通する一致箇所までを入力してくれます。
メニュー補完の場合は、候補を順次入力してくれます。 vimのデフォルト?の補完のような動作です。 ファイル数が少ない場合や、先頭文字が入力できない、という時に便利です。
元に戻す方法
変更の前に元に戻す方法です。
\C-
というのは、Ctrl
を押しながら、のキーです。
\C-i
というのは特別な意味があってtab
キーと同じ扱いです。
tab
キーに通常の補完を割り当てることで、一致部分までの補完に戻ります。
bind '"\C-i": complete'
bind
コマンドで遊ぶ時は、新たにbash
を実行して分けておくとリセットが楽です。
補完動作を置換える
単に置換えてしまうのであればこれで行けます。
bind '"\C-i": menu-complete'
全ての候補を順次入力してくれます。
いつものように?先頭数文字を入力してから補完を開始すると、先頭一致の中で順次入力してくれます。
どちらも使えるようにする
使うたびにショートカットを上書きしても良いですが、もう少し使いやすくしてみます。
シンプルに別々のキーに割り当てる
空きキーがあるのであればこの方法。それぞれ好きなキーに割り当てる事でどちらもつかえます。
候補としては使いやすい箇所は \C-i
の他に\e\e
や\C-x
の後に好きなキーを使う、辺りです。
\e
というのはEsc
キーで、Esc
2回はtab
と同じように補完が割り当てられています。
\C-x
はプレフィックスとして他のキーと組み合わせて使われています。
続くキーには空きが多いので割り当てやすいです。
関数で切り替える
雑ですが関数を作るとトグルな切替もできます。
次のようなものを.bashrc
辺りに保存して読み直す(. ~/.bashrc
)とtoggleComplete
を実行するたびに切替できます。
_IS_MENU_COMPLETE=false function toggleComplete() { if [ "$_IS_MENU_COMPLETE" = true ]; then bind '"\C-i": complete' _IS_MENU_COMPLETE=false else _IS_MENU_COMPLETE=true bind '"\C-i": menu-complete' fi }
ショートカットも追加する
さらに次のような割当も追加すると、Ctrl+x``tab
の順の入力で切り替える事ができます。
bind -x '"\C-x\C-i": toggleComplete'
機会はないと思いますが、入力の途中でも切り替える事もできます。
終わりに
bash
にもメニュー補完する機能はある、という事を知っているといつか役に立つかもしれません。
# 実際のところはvim
の :!
経由で対処する場合の方が多いです。けれどたまーにvim
が無くて仕方なく...