web-dev-qa-db-ja.com

zshでbashスタイルのオートコンプリートを取得する方法(gitコマンドの場合)

zshに切り替えて、bashよりも優れていることがわかりましたが、oh-my-zsh(以下、「-」」に問題があります。 [〜#〜] omz [〜#〜] ")オートコンプリート機能。

git checと入力すると、OMZはそれをgit checkに完了します。 in bashgit checkoutまで完了します。リモートブランチにも問題があります。orioriGに完了し、origOriginに、bashで取得されます。 Origin/まで完了

checkoutのような他のgitコマンドでも同じ問題があります。

問題は、プラグインによって追加されたエイリアスだと思います。慣れたくないので使用しませんが、オートコンプリートが壊れてしまいます。

zshbashオートコンプリート(bashに組み込みのオートコンプリートがないことはわかっています)を取得する方法はありますか?または、OMZプラグインをハックして、更新のたびに壊れないようにする方法。

4
Hunsu

完了とそれがどこから来るのかは、かなり混乱する可能性があります。例としてUbuntu14.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パッケージは、oh-my-zshなどの凝ったアドオンなしで有効にできるgit対応のプロンプトも提供します。

要約すると、gitサブコマンドの完了はシェル(zsh)から取得できます。

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

gitから

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

またはoh-my-zshなどのプラグインから。

あなたの質問に戻るには:あなたが説明するgit checを完了するという古い振る舞いは、実際にはバグがあります。 checはまだあいまいであり、checkoutで始まるサブコマンドが複数あるため、適切な完了スクリプトでchecまで完了しないでください。その動作が必要な場合は、以前に使用していた多くの完了スクリプトのどれを見つけ、oh-my-zsh gitプラグインを無効にして、古い完了スクリプトを引き続き使用します。

または、エイリアスを設定して慣れることをお勧めします。使用できます

git config --global alias.co checkout

git coを新しいgit checkoutにするために-oh-my-zshプラグインはこれらのエイリアスを認識し、次にブランチ名とタグ名を完成させます!

4
barbaz