作って学ぶbashタブ補完、mixコマンドを補完する
「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
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がまったく書けなくて辛かったです
「いいね」よろしくお願いします。
Author And Source
この問題について(作って学ぶbashタブ補完、mixコマンドを補完する), 我々は、より多くの情報をここで見つけました https://qiita.com/pojiro/items/7891000a4ffd708509fc著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .