7

i use alias which adds some parameters to some program.

for example:

alias git.home='git --git-dir=$HOME/.git.home/'

complete -o bashdefault -o default -o nospace -F _git git.home \
  2>/dev/null || complete -o default -o nospace -F _git git.home

it works with bash-completion v.1:2.0-1 ("debian 7 wheezy"):
tab completes parameters and options for alias git.home as well as for "original" git.

but with bash-completion v.1:2.1-4 ("debian 8 jessie") after typing git.home and pressing tab i get this error:

bash: completion: function `_git' not found

how to re-use existing completion (for example for git) with recent versions of package bash-completion?


update

found partial solution: do source /usr/share/bash-completion/completions/git before complete ...

but i get another error - git.home log + space + tab results in:

fatal: Not a git repository (or any of the parent directories): .git HEAD

3 Answers3

8

how to re-use existing completion (for example for git) with recent versions of package bash-completion

Add the following lines to your ~/.bashrc:

_completion_loader git
eval $(complete -p git | perl -pe 's/(\s)git$/$1git.home/')

Explanation:

bash-completion uses a dynamic loading of completions since 1.90. So, the git compspec unavailable before your typing git,Space,Tab.

Try:

bash
complete -p git # bash: complete: git: no completion specification
git<space><tab>
complete -p git # complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

_completion_loader git imitates git,Space,Tab (i.e. loads a compspec for git)

complete -p git | perl -pe 's/(\s)git$/$1git.home/' builds a compspec for git.home (replaces git to git.home in a git's compspec)

eval execute the resulting compspec.

Type git.home,Space,pTab. You should see:

popt   pull   push

But git.home log,Space,Tab produces:

fatal: Not a git repository (or any of the parent directories): .git HEAD

This message is a result of the git completion bug. There is a fix in the upstream: completion: silence "fatal: Not a git repository" error

Looks like another question:)

_githome(){ 
   GIT_DIR=$HOME/.git.home
   complete -o default -o nospace -F _git git.home
 }

doesn't work as expected. You set GIT_DIR for current session. Try with your solution:

bash
git clone git://git.debian.org/git/bash-completion/bash-completion.git ~/bash-completion
cd ~/bash-completion
git log<space><tab> # completion for current repo
git.home log<space><tab> # completion for GIT_DIR
git log<space><tab> # completion for GIT_DIR
Stephen Kitt
  • 434,908
Evgeny
  • 5,476
  • doesn't work as expected — it works for me as expected. f.e., git log shows history for the repo in ./.git/, and git.home log shows history for the repo in ~/.git.home/. and completion of branches in both cases is working correctly. – aleksandr barakin Jul 18 '15 at 10:20
  • hm, I can't reproduce. What do you see after last git log<space><tab>? What do you see for git --git-dir=.git log<space><tab> in ~/bash_completion? – Evgeny Jul 18 '15 at 10:33
  • use jessie and "official" package bash-completion. 2. append these lines to ~/.bashrc and re-login. 3. cp -a /some/repo/.git ~/.git.home. 4. cd. 5. try git.home log, git.home status etc.
  • – aleksandr barakin Jul 18 '15 at 10:47
  • What do you see after last git log — hmm. in home dir this should cause the error, but i see branches from ~/.git.home – aleksandr barakin Jul 18 '15 at 10:52
  • yes, cd, git.home log, git.home status works fine. but git log<space><tab> always shows git --git-dir=$HOME/.git.home for-each-ref '--format=%(refname:short)' refs/tags refs/heads refs/remotes and HEAD. i.e. git.home completion affects git completion – Evgeny Jul 18 '15 at 11:03
  • Looks like another question — not anymore. – aleksandr barakin Jul 18 '15 at 13:32
  • cool! I updated my answer: added info about git completion bug: completion: silence "fatal: Not a git repository" error – Evgeny Jul 19 '15 at 15:02
  • a! realized. but, in my opinion, an error message per se is not a bug. – aleksandr barakin Jul 19 '15 at 15:20
  • yes, you are right. Unknown git-dir in git.home completion was a real bug – Evgeny Jul 19 '15 at 15:25