curluneの日記

日々試行錯誤。雑多に、気ままに、てきとーに。HoloLens/Oculus Rift,Touchと戯れる日々。

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キーで、Esc2回は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が無くて仕方なく...

Man page of BASH