4

Я переключился на zsh и нашел его лучше, чем bash, но у меня проблема с функцией автозаполнения oh-my-zsh (здесь и далее « OMZ »).

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

У меня такая же проблема с другими командами git, как checkout .

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

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

1 ответ1

4

Завершение и откуда это может быть довольно запутанным. Возьмем систему 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 <spearce@spearce.org>
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
# Distributed under the GNU General Public License, version 2.0.

В пакете git даже есть подсказка о git, которую можно включить, и все это без особых надстроек, таких как 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

или из плагинов, таких как ой-мой-zsh.

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

Кроме того, я бы порекомендовал создать псевдоним и привыкнуть к нему. Ты можешь использовать

git config --global alias.co checkout

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .