Как получить завершение bash для работы с псевдонимами? - PullRequest
181 голосов
/ 05 декабря 2008

Показательный пример:

Я на Mac с bash v3.2.17, я использую git, установленный через macports с вариантом bash_completion.

Когда я печатаю git checkout m<tab>. например, я получаю его заполненным до master.

Однако у меня есть псевдоним git checkout, gco. Когда я набираю gco m<tab>, я не получаю название автозаполнения.

В идеале я хотел бы, чтобы автозаполнение просто волшебным образом работало для всех моих псевдонимов. Является ли это возможным? В противном случае я бы хотел вручную настроить его для каждого псевдонима. Итак, как мне поступить?

Ответы [ 12 ]

0 голосов
/ 19 марта 2019

Есть много ответов на этот вопрос, и я, как и я, держу пари, что многие смущенные читатели. В моем случае у меня также было требование, чтобы мои dotfiles работали на нескольких платформах с разными версиями Git. Я также не alias g=git, но вместо этого g определен как функция.

Чтобы достичь этого, мне пришлось собрать воедино разные ответы в одном решении. Хотя это повторяет ответы уже, я думал, что кто-то в моей лодке мог бы счесть этот сборник полезным, как я сделал бы, когда я впервые пришел к этому вопросу.

Это предполагает более старое и новое завершение Git, значения по умолчанию Ubuntu и brew install git в MacOS. В последнем случае установленные brew дополнения не обрабатывались bash (что я буду диагностировать позже).

# Alias g to git

g() {
  if [[ $# > 0 ]]; then
    git "$@"
  else
    git status -sb
  fi
}

# Preload git completion in Ubuntu which is normally lazy loaded but we need
# the __git_wrap__git_main function available for our completion.
if [[ -e /usr/share/bash-completion/completions/git ]]; then
  source /usr/share/bash-completion/completions/git
elif [[ -e /usr/local/etc/bash_completion.d/git-completion.bash ]]; then
  source /usr/local/etc/bash_completion.d/git-completion.bash
fi

if command_exists __git_complete; then
  __git_complete g _git
elif command_exists __git_wrap__git_main; then
  complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g
fi
0 голосов
/ 27 июля 2018

Сначала посмотрите исходную команду завершения. Пример:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

Теперь добавьте их в свой скрипт запуска (например, ~ / .bashrc):

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

# load dynamically loaded completion functions (may not be required)
_completion_loader git

Строка _completion_loader может не потребоваться. Но в некоторых ситуациях функция завершения загружается динамически только после того, как вы наберете команду и нажмете TAB в первый раз. Так что, если вы не использовали исходную команду и попробовали псевдоним + TAB, вы можете получить сообщение об ошибке типа «bash: завершение: функция '_docker' not found».

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