Git автозаполнение в псевдонимах Bash? - PullRequest
53 голосов
/ 26 марта 2012

Я использую go в качестве простого псевдонима bash для git checkout branchname. Мне не хватает функции автозаполнения, которая работает с полной командой git checkout branchna..., но не с псевдонимом.

Есть ли способ дать команду Bash "наследовать" драйвер автозаполнения для другой команды?

Ответы [ 6 ]

69 голосов
/ 10 июля 2014

После использования complete -F:

complete -F _git_checkout go

Вкладка после go может привести к:

bash: [: 1: unary operator expected

Вместо complete, используйте __git_complete

Это встроенная функция завершения git bash для этой цели.

После объявления псевдонима, привяжите к нему правильную функцию автозаполнения:

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
37 голосов
/ 26 марта 2012

Если вы можете узнать функцию завершения, используемую исходной командой, вы можете назначить ее псевдониму, используя complete -F.

Например, в моем Ubuntu Box функция завершения, используемая 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 
10 голосов
/ 26 ноября 2017

В 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

(Этот ответ принадлежит в комментарии к theprogrammerin в ответ на jangosteve, но, поскольку мне нужно 50 повторений для создания комментариев, я буду спамить его как собственный ответ.)

7 голосов
/ 04 сентября 2018

На 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 голос
/ 05 мая 2019

Чтобы добавить к другим отличным ответам: обычно у вас много псевдонимов 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 голос
/ 08 октября 2013

В Linux Mint это не сработало для меня.Я получал bash: [: 1: unary operator expected .

Я обнаружил, что следующий ответ работает довольно хорошо - с разделом устранения неполадок, предоставленным пользователем, будет очень полезно.https://superuser.com/questions/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...