のgo
単純なbashエイリアスとして使用していgit checkout branchname
ます。私が見逃しているのは、完全なgit checkout branchna...
コマンドで機能するオートコンプリート機能ですが、エイリアスでは機能しません。
別のコマンドのオートコンプリート「ドライバー」を「継承」するようにBashに指示する方法はありますか?
のgo
単純なbashエイリアスとして使用していgit checkout branchname
ます。私が見逃しているのは、完全なgit checkout branchna...
コマンドで機能するオートコンプリート機能ですが、エイリアスでは機能しません。
別のコマンドのオートコンプリート「ドライバー」を「継承」するようにBashに指示する方法はありますか?
回答:
元のコマンドで使用されている完了関数が見つかった場合は、を使用してエイリアスに割り当てることができますcomplete -F
。
たとえば、私のubuntuボックスでは、によって使用される補完関数git checkout
は_git_checkout
(にあります/etc/bash_complete.d/git
)です。
実行する前にcomplete -F
:
[me@home]$ git checkout <TAB><TAB>
HEAD master origin/HEAD origin/master
[me@home]$ alias go="git checkout"
[me@home]$$ go <TAB><TAB>
.git/ precommit_config.py README.md SvnSentinel/
.gitignore precommit.py startcommit.py tests/
後:
[me@home]$$ complete -F _git_checkout go
[me@home]$$ go <TAB><TAB>
HEAD master origin/HEAD origin/master
使用後complete -F
:
complete -F _git_checkout go
後にタブを付けると、次のgo
結果になる場合があります。
bash: [: 1: unary operator expected
complete
、__git_complete
これは、この目的のためのgit bashcompletionの組み込み関数です。
エイリアスを宣言したら、正しいオートコンプリート関数をそれにバインドします。
alias g="git"
__git_complete g _git
alias go="git checkout"
__git_complete go _git_checkout
alias gp="git push"
__git_complete gp _git_push
__git_complete
bash-completionパッケージ(homebrewを介してインストールされた)に関数が含まれていたためbrew install bash-completion
です。この行を〜/ .bash_profileに追加する必要がありました:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
git checkout
エイリアスの下に__git_completeを追加すると、魅力のように機能しました!!!
__git_main
ではなく、である必要があり_git
ます。_git
存在する理由は、下位互換性のためだけであり、基本的に__git_main
ラップされています。
Ubuntu 18.04(Bionic)では、次のように動作します。お好みのbashの設定ファイルなどに(あなたの別名を持つ)このスニペットのようなものを追加し.bashrc
、.bash_aliases
.bash_profile
。
# define aliases
alias gc='git checkout'
alias gp='git pull'
# setup autocompletion
if [ -f "/usr/share/bash-completion/completions/git" ]; then
source /usr/share/bash-completion/completions/git
__git_complete gc _git_checkout
__git_complete gp _git_pull
else
echo "Error loading git completions"
fi
一般に、__git_complete
ディレクティブの形式は次のとおりです。
__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>
これは、既存の回答からの知恵を1つの最新の回答にまとめたものです。ありがとうございました。
echo "profile"
/を追加するまで、私はそれをecho "rc"
理解しませんでした。
Ubuntu 16.04.3 LTSでは、ソースに必要なファイルはでした/usr/share/bash-completion/completions/git
。したがって、.bash_custom
(または.bashrcなど):
[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main
.bashrc
読み取られるまでには遅すぎます。
他の優れた回答に追加するには:通常、Gitエイリアスがたくさんあり、それらすべての補完を手動で転送するのは面倒な場合があります。これを自動的に行うための小さなトリックは次のとおりです。
if [ -f "/usr/share/bash-completion/completions/git" ]; then
# Enable Git completions for aliases
. /usr/share/bash-completion/completions/git
for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do
c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_')
if set | grep -q "^_git_$c *()"; then
eval "__git_complete $a _git_$c"
fi
done
fi
Linux Mintでは、これは私にはうまくいきませんでした。私は得ていましたbash: [: 1: unary operator expected
。
次の応答が非常にうまく機能していることがわかりました。ユーザーが提供したトラブルシューティングセクションが非常に役立ちました。 /superuser/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases
他の誰かが答えたように__git_complete
、使用する必要があります。そうしないと、スクリプトが失敗します。
alias g="git"
__git_complete g __git_main
alias g="gl"
__git_complete gl _git_log
ただし_git
、メインコマンドには使用しないでください__git_main
。
残念ながら、完了に関する多くの情報は隠されていますが、私のフォークのREADMEで詳細を見つけることができます:git-completion。
あなたがbashエイリアスについて具体的に質問していることは承知していますが、複雑なgitエイリアスのbashでオートコンプリートを探している人は、こちらを参照してください。
特に:
# If you use complex aliases of form '!f() { ... }; f', you can use the null
# command ':' as the first command in the function body to declare the desired
# completion style. For example '!f() { : git commit ; ... }; f' will
# tell the completion to use commit completion. This also works with aliases
# of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".