bashエイリアスでGitオートコンプリート?


84

go単純なbashエイリアスとして使用していgit checkout branchnameます。私が見逃しているのは、完全なgit checkout branchna...コマンドで機能するオートコンプリート機能ですが、エイリアスでは機能しません。

別のコマンドのオートコンプリート「ドライバー」を「継承」するようにBashに指示する方法はありますか?




関連:エイリアスがカスタムを設定する場合は、これgit-dirを使用ます。
user2027 2919年

回答:


47

元のコマンドで使用されている完了関数が見つかった場合は、を使用してエイリアスに割り当てることができます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 

1
Ubuntuの上で12.04補完はに住んでいるように見える:/etc/bash_completion.d/gitなく/etc/bash_complete.d/git
MAKS

8
場合はcomplete -Fあなたのための作業をしない、程度の回答を参照__git_complete以下stackoverflow.com/a/24665529/3779
スティーブ・クレイ

100

使用後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

4
@LưuVĩnhPhúc私は同じ問題を抱えていました。これは、現在bashプロファイルで提供されていない__git_completebash-completionパッケージ(homebrewを介してインストールされた)に関数が含まれていたためbrew install bash-completionです。この行を〜/ .bash_profileに追加する必要がありました:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
jangosteve 2017年

1
git checkoutエイリアスの下に__git_completeを追加すると、魅力のように機能しました!!!
ラジャラマン

2
__git_mainではなく、である必要があり_gitます。_git存在する理由は、下位互換性のためだけであり、基本的に__git_mainラップされています。
FelipeC

19

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つの最新の回答にまとめたものです。ありがとうございました。


ssh / terminalのみのセッションに追加したいので、すべてを.bashrcに入れます。.bash_profileにgitの完全なものがあり、.bashrcにエイリアスがあり、それを機能させることができませんでした。echo "profile"/を追加するまで、私はそれをecho "rc"理解しませんでした。
mtonc

18

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

1
手動でロードする必要がある理由は、現在Bashがそれらのファイルを動的にロードするためです。これまでのところ、名前に従ってロードされます。Gitが完了するまでファイルは読み込まれません。これは、.bashrc読み取られるまでには遅すぎます。
フランクリンユー

2

他の優れた回答に追加するには:通常、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


1

の場合macOS、以下を実行してbash補完をインストールします

 brew install bash-completion

次に、以下を追加します

[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" 

.bashrcまたは.bash_profileに


1

Ubuntu20.04ではこれをに追加します ~/.bashrc

source /usr/share/bash-completion/completions/git
alias g='git'
__git_complete g _git
alias go='git checkout'
__git_complete go _git_checkout

1

他の誰かが答えたように__git_complete、使用する必要があります。そうしないと、スクリプトが失敗します。

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

ただし_git、メインコマンドには使用しないでください__git_main

残念ながら、完了に関する多くの情報は隠されていますが、私のフォークのREADMEで詳細を見つけることができます:git-completion


0

あなたが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 ; ... '".
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.