como reutilizar a conclusão existente com a recente conclusão do bash?

6

eu uso alias , o que adiciona alguns parâmetros a alguns programas.

por exemplo:

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

funciona com bash-completion v.1:2.0-1 ("debian 7 wheezy"): A aba completa parâmetros e opções para alias git.home , bem como para "original " git .

mas com bash-completion v.1:2.1-4 ("debian 8 jessie") depois de digitar git.home e pressionar a aba eu recebo este erro:

bash: completion: function '_git' not found

como reutilizar a conclusão existente (por exemplo, para git ) com versões recentes do pacote bash-completion ?

atualização

encontrou a solução parcial: do source /usr/share/bash-completion/completions/git antes de complete ...

mas recebo outro erro - git.home log + espaço + tab resulta em:

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

    
por aleksandr barakin 17.07.2015 / 16:34

2 respostas

2

atualizado

solução para alias git.home , que opera com ~/.git.home como repo.

parcialmente com base na esta resposta .

adicione a ~/.bashrc :

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

_completion_loader git
eval "$(complete -p git | sed -r 's/(\s)git$/git.home/')"

eval "$(type __gitdir | 
  sed '1d;1,/if/s|if|if [[ "$COMP_LINE" == "git.home "* ]]; then\necho "$HOME/.git.home"\nelif|')"

explicação do último eval (para outras linhas, consulte answer ):

estamos corrigindo a função __gitdir() , que retorna um caminho para o diretório do repositório do git. de:

$ type __gitdir | head -n 4
__gitdir is a function
__gitdir () 
{ 
    if [ -z "${1-}" ]; then

para:

$ type __gitdir | head -n 7
__gitdir is a function
__gitdir () 
{ 
    if [[ "$COMP_LINE" == "git.home "* ]]; then
        echo "$HOME/.git.home";
    else
        if [ -z "${1-}" ]; then

, ou seja, se o comando começar com "git.home " , a função retornará $HOME/.git.home .

    
por 17.07.2015 / 19:47
3

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

Adicione as seguintes linhas ao seu ~/.bashrc :

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

Explicação:

bash-completion usa um carregamento dinâmico de conclusões desde 1.90 . Portanto, o git compspec não está disponível antes da sua digitação git , Espaço , Tab .

Tente:

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 imita git , Espaço , Separador (isto é, carrega um compspec para git )

complete -p git | perl -pe 's/(\s)git$/$1git.home/' cria uma compspec para git.home (substitui git para git.home na compspec de git )

eval executa a compspec resultante.

Digite git.home , Espaço , p Guia . Você deveria ver:

popt   pull   push

Mas git.home log , Espaço , o Tab produz:

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

Esta mensagem é resultado do erro de conclusão do git. Há uma correção no upstream: conclusão: silêncio "fatal: não é um repositório git"

Parece com outra pergunta:)

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

não funciona como esperado. Você define GIT_DIR para a sessão atual. Experimente com sua solução:

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
    
por 18.07.2015 / 11:44