git エイリアスの場合、git コマンドのオートコンプリート機能 ( __git()
) は への呼び出しを使用してgit config --get "alias.$1"
、同等のオートコンプリート機能を決定します。これは単純なマッピングでは機能しますが、より複雑なエイリアスでは機能しなくなります。
これを回避するには、エイリアスに一致する名前でオートコンプリート関数を定義します_git_tagarchive()
。git のオートコンプリート機能は、それを取得してオートコンプリートに使用する必要があります。
例えば:
[me@home]$ git tagarchive <TAB><TAB>
AUTHORS gentleSelect/ .gitignore LICENSE test_multiple.html
cron/ .git/ index.html README.md
[me@home]$ _git_tagarchive() {
> _git_branch # reuse that of git branch
> }
[me@home]$ git tagarchive <TAB><TAB>
enable_multiple master origin/gh-pages v0.1 v0.1.3
FETCH_HEAD ORIG_HEAD origin/HEAD v0.1.1 v0.1.3.1
HEAD origin/enable_multiple origin/master v0.1.2
より永続的な解決策として、関数定義をbashrc
ファイルに追加するだけです。例えば:
_git_tagarchive()
{
_git_branch
}
のオートコンプリート機能を単に再利用したことに注意してくださいgit branch
。これをより適切なものに変更したり、独自のものを作成したりすることができます。
より詳しい情報
このソリューションは、 の調査に基づいて特定されました/etc/bash_completion.d/git
。
通常、エイリアス化された git コマンドは__git_aliased_commands()
、出力を解析しgit config --get "alias.$1"
て使用するオートコンプリート機能を決定する関数によって処理されます。より複雑なシェル コマンドをエイリアス ターゲットとして使用すると、当然のことながら、このアプローチは無効になります。
さらに見てみると、サブコマンドのオートコンプリート機能の git ( _git()
) チェーンのオートコンプリート機能は、関数の先頭に_git_
(コマンド内のダッシュ ( -
) をアンダースコアに置き換えて) 追加するだけで表示されます。これはチェックされる前に行わ__git_aliased_command()
れるので、これは使用できるものです。
_git ()
{
# .....
local completion_func="_git_${command//-/_}"
declare -f $completion_func >/dev/null && $completion_func && return
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
completion_func="_git_${expansion//-/_}"
declare -f $completion_func >/dev/null && $completion_func
fi
}
したがって、私が行ったアプローチは、エイリアスに一致する関数が存在することを確認することです_git_tagarchive()
。