Как получить автодополнение в стиле bash в zsh (для команды git)

Как получить автодополнение в стиле bash в zsh (для команды git)

Я переключился назши найдите это лучше, чемБаш, но у меня проблема со-мой-зш's (далее "ОМЗ") функция автозаполнения.

Когда я печатаю git chec, OMZ дополняет это до git check; вБашон будет завершен до git checkout. У меня также есть проблема с удаленными ветвями: oriзавершено до oriG, и origдо origin, вБашон будет завершенorigin/

У меня такая же проблема с другимимерзавецтакие команды как checkout.

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

Есть ли способ получитьБашавтодополнение (я знаю, что в bash нет встроенного автодополнения) взш? Или способ взломать плагин OMZ, чтобы он не ломался при каждом обновлении.

решение1

Завершение и то, откуда оно берется, может быть довольно запутанным. Возьмем в качестве примера систему Ubuntu 14.04:

$ dpkg -L zsh-common | grep git
/usr/share/zsh/functions/Completion/Debian/_git-buildpackage
/usr/share/zsh/functions/Completion/Unix/_stgit
/usr/share/zsh/functions/Completion/Unix/_git
/usr/share/zsh/functions/Completion/Unix/_topgit
/usr/share/zsh/functions/VCS_Info/Backends/VCS_INFO_get_data_git
/usr/share/zsh/functions/VCS_Info/Backends/VCS_INFO_detect_git
/usr/share/zsh/functions/Misc/run-help-git

Пакет zsh-commonпоставляет функции завершения git. С другой стороны, gitпакет также поставляется с файлами завершения для bash и zsh:

$ dpkg -L git | grep compl
/etc/bash_completion.d
/etc/bash_completion.d/git-prompt
/usr/share/bash-completion
/usr/share/bash-completion/completions
/usr/share/bash-completion/completions/git
/usr/share/bash-completion/completions/gitk

Который содержит такие файлы, как

$ head -n 5 /usr/share/bash-completion/completions/gitk
# bash/zsh completion support for core Git.
#
# Copyright (C) 2006,2007 Shawn O. Pearce <[email protected]>
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
# Distributed under the GNU General Public License, version 2.0.

Пакет git даже предоставляет приглашение git aware, которое можно включить, и все это без всяких дополнительных расширений, таких как oh-my-zsh.

Подводя итог, можно сказать, что завершение подкоманды git может осуществляться из вашей оболочки (zsh):

https://github.com/zsh-users/zsh/blob/master/Completion/Unix/Command/_git

из гита

https://github.com/git/git/tree/master/contrib/completion

или с помощью плагинов, таких как oh-my-zsh.

Возвращаясь к вашему вопросу: старое поведение завершения git chec, которое вы описываете, на самом деле глючное. checвсе еще неоднозначно, и правильный скрипт завершения не должен завершать его до checkout, поскольку есть несколько подкоманд, которые начинаются с chec. Если вы хотите такое поведение, выясните, какой из множества скриптов завершения вы использовали раньше, отключите плагин git oh-my-zsh и продолжайте использовать старый скрипт завершения.

В качестве альтернативы я бы рекомендовал создать псевдоним и привыкнуть к нему. Вы можете использовать

git config --global alias.co checkout

чтобы создать git coсвой новый git checkout- плагин oh-my-zsh знает об этих псевдонимах и все равно заполнит имена веток и тегов в дальнейшем!

Связанный контент