github用にhub
というgit
のラッパーコマンドがあることを会社で教えてもらって
使ってみたら、当然の如くzshの補完が効かなくてコマンドの使い方もよく分からなかったので、
コマンド理解とzsh補完関数の書き方の勉強も兼ねて自分で作ってみた。
最初はhubコマンドの補完関数を作ってたんですが、利用方法としてaliasを充てて
gitの代わりに使うことが推奨されており、そもそもgitのラッパーで
gitコマンドの補完も出来ないと意味が無いので、gitの補完関数自体に
手を入れて、hubのカスタムコマンドも利用出来るようにした。
検証環境は下記
Mac OSX 10.7.3, Scientific Linux 6.1
git version 1.7.7.5
hub version 1.8.2
zsh 4.3.11, 4.3.12
/usr/local/share/zsh/4.3.11/functions/_git
を元に修正した内容は下記
diff --git a/test_zsh-completion/_git b/test_zsh-completion/_git
index 8a48c04..b3d53ea 100644
--- a/test_zsh-completion/_git
+++ b/test_zsh-completion/_git
@@ -4700,6 +4700,15 @@ _git_commands () {
patch-id:'compute unique ID for a patch'
stripspace:'filter out empty lines')
+ local -a hub_custom_commands
+ hub_custom_commands=(
+ create:"repo created on GitHub"
+ browse:"open repository's GitHub page in the system's default web browser"
+ compare:"open a GitHub compare view page in the system's default web browser."
+ fork:"repo forked on GitHub"
+ pull-request:"opens a pull request on GitHub for the project that the 'origin' remote points to."
+ )
+
local -a user_commands
zstyle -a :completion:$curcontext: user-commands user_commands
@@ -4725,6 +4734,7 @@ _git_commands () {
plumbing_sync_commands[(I)$name:*] ||
plumbing_sync_helper_commands[(I)$name:*] ||
plumbing_internal_helper_commands[(I)$name:*] )) || unique_aliases+=$alias
+ hub_custom_commands[(I)$name:*] ||
done
integer ret=1
@@ -4743,6 +4753,7 @@ _git_commands () {
_describe -t plumbing-sync-commands 'plumbing sync command' plumbing_sync_commands && ret=0
_describe -t plumbing-sync-helper-commands 'plumbing sync helper command' plumbing_sync_helper_commands && ret=0
_describe -t plumbing-internal-helper-commands 'plumbing internal helper command' plumbing_internal_helper_commands && ret=0
+ _describe -t hub-custom-command 'hub custom command' hub_custom_commands && ret=0
return ret
}
できあがったのがこちら
追記 2012年2月27日 githubに公開しました
利用方法
hubをあらかじめ導入しておいて、$fpath
配下に上記補完関数を配置。
もとからある_git
と重複してもsite-functions
配下に置くと
優先的にそちらが利用されます。
1
2
3
4
mkdir ~/src
cd ~/src
git clone git://github.com/glidenote/hub-zsh-completion.git
sudo cp hub-zsh-completion/_git /usr/share/zsh/site-functions/
.zshrc
に下記を書いて、
をして、反映させる。
hubをgitのラッパーとして動作させると、git [tab]
で下記hubカスタムコマンドが補完されるようになります。
1
2
3
4
5
browse -- open repository's GitHub page in the system's default web browser
compare -- open a GitHub compare view page in the system's default web browser.
create -- repo created on GitHub
fork -- repo forked on GitHub
pull-request -- opens a pull request on GitHub for the project that the 'origin' remote points to.
それにしてもgitの補完関数6000行超えてて、同じようなのを自分で一から書こうとすると心が折れます。
参考