作成の動機
ゴール
- linuxでgitコマンドを補完したい
制限
- git-completion.bashがあるが、最新はgit --list-cmdsを内部で使うため、Gitは2.18以上である必要がある
- git、及びbashのバージョンが古く、バージョンアップするのは難しい
- 適切な古いバージョンのgit-completion.bashを入れるのは難しい
解決案
- 幾つかのコマンドに対応するだけなら、自力でなんとかできないか?
- 個人用なので、品質は不問
調査
作成のヒント
結論
スクリプト例
- .bashrcに記載
- あるいは別ファイルにして読み込む
# 必要なモジュールを読み込む(bash-completion.shの内容は以下のコピー) # https://github.com/scop/bash-completion/blob/master/bash_completion . ~/bash-completion.sh # 補完候補 declare -r GIT_OPT="branch checkout diff" _git(){ # cur=入力中の語、prev=一個前に入力した語、cword=入力済みの語数 local cur prev cword local git_checkout_opt # cur, prev, cwordに値をセットする _init_completion || return case "${cword}" in 1) # COMPREPLYに格納した文字列が、タブ補完される # compgenは${GIT_OPT}の内、${cur}から始まるものだけを出力する COMPREPLY=( $(compgen -W "${GIT_OPT}" -- "${cur}") ) ;; *) if [[ "${prev}" == "checkout" ]]; then # 都度ブランチを取得して、補完候補とする git_checkout_opt="$(git branch | sed ':a;N;$!ba;s/[\n|*]/ /g' 2>/dev/null)" COMPREPLY=( $(compgen -W "${git_checkout_opt}" -- "${cur}") ) fi ;; esac } # gitコマンド補完の関数として設定 complete -F _git git
- その他参考
- sedで改行を置換・削除する | 俺的備忘録 〜なんかいろいろ〜
- bashで[ -v "$VAR" ]を使わずに変数が未定義か判定する - Qiita
- bash_completionの
[[ -v $VAR ]]
すら機能しない場合に、頑張って置換する
- bash_completionの
拡張予定
- 他のコマンド例を参考に、モジュールを利用して拡張する
- 例えば
- fileを補完してほしい場合は
_filedir
を呼ぶ - cur, prev以外に全ての入力を取得したい場合は、
_init_completion
の前にlocal cur prev words cword
と宣言し、wordsで入力を取得する
- fileを補完してほしい場合は
まとめ
ひとまずこれでgitコマンドで幾つか補完できるようになった。凝ると余計な時間がかかってしまいそうなので、コスパを考えつつ可能な範囲で拡張していきたい。とはいえ、既に用意されたものをそのまま利用できればそれが一番であることは間違いない……。