「mixコマンドの補完が効けばいいのにな」と思ったことはありませんか?
bashのProgrammable Completionで作れるみたいです。
今回はそれを作ったので紹介します。
環境
bash-completionがインストールされていることが前提です。
インストールされていない場合は以下でインストールします。
# debian系$ sudo apt install bash-completion
作り方
以下がとても詳しいのでココでは解説しません。
compgentコマンドとcompleteコマンドについては以下
既に作られている実装
検索すると同じ目的のいくつかの実装がありました。
てっとりばやく使いたい場合はこれらから選んで使うのもありと思います。
- https://github.com/unblevable/mix-completion
- https://github.com/dalexj/mix_autocomplete
- https://github.com/bjhaid/elixir_auto_complete
- https://minhajuddin.com/2016/12/23/bash-completion-script-for-mix/
自分で作ってみた
既に作られているものを使うのは簡単だと思ったのですが、
bashのタブ補完は自分で作ることができれば他にも応用できそうな気がしたので作ってみました。
以下を~/.bash_completionとして保存し、terminalを開き直すと使えるようになります。
※ディレクトリ移動後の一発目がちょっともたつきます。
_mix(){local cur prev words cword split
_init_completion ||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$taskin"#"|"-S");;*)
_mix_opts+="$task ";;esacdone}local current_pwd=$(pwd)if[[-z"$_mix_task_list"]]||[[$_mix_last_pwd!=$current_pwd]];then
make_opts
fi
_mix_last_pwd=$current_pwdif[[$prev== mix ]]||[[$prev==help]];then
COMPREPLY=($(compgen-W"$_mix_opts"--"$cur"))fi}&&complete-F _mix mix
おわり
bashがまったく書けなくて辛かったです
「いいね」よろしくお願いします。