ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

bashの補完を自作する

qiita.com

を読んで、会社で使っている開発環境用や自作スクリプトの補完が出来たら便利そうだと思い、いくつか作って試している。

業務のためのスクリプトで、渡すオプション引数なんだっけ?と毎回helpを見たりすることもなく、とりあえずTABを押せば良い感じに補完するようになり、ちょっとしたストレスを解消できる。

基本的には上の記事にあるような

_chrome()
{
  local cur=${COMP_WORDS[COMP_CWORD]}
  case "$COMP_CWORD" in
  1)
    COMPREPLY=( $(compgen -W "standard beta dev canary" -- $cur) );;
  *)
    COMPREPLY=( $(compgen -W "$(ls)" -- $cur) );;
  esac
}

complete -F _chrome chrome

を.bashrcにゴリゴリ追記している。

便利なのがlsと組み合わせる方法で、たとえば自作のスクリプトが拡張子datのみしか対象にしないのであれば、

_myscript()
{
  local cur=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -W "$(ls *.dat)" -- $cur) );;
  esac
}

complete -F _myscript myscript

と書けば、保管時にはカレントディレクトリのdatファイルのみが表示される。

要するにシェルスクリプトなので、ちょっと複雑な処理をさせて補完することも出来る。 やろうとすれば、特定フォルダのパスリストを取得しフィルタをかけて補完することや、WebのAPIを叩いて得られるリストを補完する引数リストにすることも出来る。 うまくやれば、-hや--helpなどを渡して得られるコマンドリストをうまく加工して補完するようなものも作れるだろう。