作って学ぶbashタブ補完、mixコマンドを補完する


「mixコマンドの補完が効けばいいのにな」と思ったことはありませんか?
bashのProgrammable Completionで作れるみたいです。

今回はそれを作ったので紹介します。

環境

bash-completionがインストールされていることが前提です。
インストールされていない場合は以下でインストールします。

# debian系
$ sudo apt install bash-completion

作り方

以下がとても詳しいのでココでは解説しません。

compgentコマンドとcompleteコマンドについては以下

既に作られている実装

検索すると同じ目的のいくつかの実装がありました。
てっとりばやく使いたい場合はこれらから選んで使うのもありと思います。

自分で作ってみた

既に作られているものを使うのは簡単だと思ったのですが、
bashのタブ補完は自分で作ることができれば他にも応用できそうな気がしたので作ってみました。

以下を~/.bash_completionとして保存し、terminalを開き直すと使えるようになります。
※ディレクトリ移動後の一発目がちょっともたつきます。

_mix()
{
  local cur prev words cword split
  _init_completion || return
  type mix 1> /dev/null || return

  make_opts(){
    _mix_opts=""
    readarray -t _mix_task_list < <(mix help)

    local task
    for task in "${_mix_task_list[@]}"; do
      task=$(echo "$task" | awk '{print $2}')
      # ignore "mix" self and "iex -S mix"
      case $task in
        "#"|"-S")
        ;;
        *)
          _mix_opts+="$task "
        ;;
      esac
    done
  }

  local current_pwd=$(pwd)
  if [[ -z "$_mix_task_list" ]] || [[ $_mix_last_pwd != $current_pwd ]]; then
    make_opts
  fi
  _mix_last_pwd=$current_pwd

  if [[ $prev == mix ]] || [[ $prev == help ]]; then
    COMPREPLY=( $(compgen -W "$_mix_opts" -- "$cur") )
  fi
} && complete -F _mix mix

おわり

bashがまったく書けなくて辛かったです
「いいね」よろしくお願いします。