この記事は Git Advent Calendar 2015 の 9日目です。
昨日は kaneshin さんの Gitリポジトリをメンテナンスして軽量化する - Qiita でした。 レポジトリをダイエットしたい時に便利そうですね。
"git " って打つのめんどくさくない…?
git って打つのめんどくさいですよね。
git stって打とうとしてgits tなどと打ってしまうと、zsh: command not found: gitsなどと言われてしまうと、もうやる気もなくなって家に帰りたくなってしまいますよね。
また、gitコマンドは連続で打つことが多々あります。
$ git st $ git df $ git aa $ git ci $ git st $ git ps
などと打ってると生きるのがつらくなってきますね。
これだけのコマンドにgitって6回打っています。スペースを含めると24文字です。
なんて無駄なタイプ数なのでしょうか。
(ちなみに、上のコマンドはそれぞれstatus, diff, add ., commit, pushの alias です。)

じゃあ "git" 抜きでサブコマンドを実行できればいいじゃん!
と思ったら、gitshというものがあるようです。便利な世の中ですね。
賢明な皆様は勿論 Arch Linux をお使いのことだと思いますが、PKGBUILDが用意されているので簡単にインストール出来るようです。
また、Macの場合はhomebrewからインストール出来るようです。
詳しいインストール方法はレポジトリのREADMEをご覧ください。
下記のGIF動画は、実際にgitshを動かしている画面です。

gitを打つ必要がなくなっています。
圧倒的タイプ数の削減ですね!
gitsh 最高……?
gitsh さいこーじゃん!と言いたいところですが、私としてはいくつか問題点があると思っています。
インストールがめんどい
Arch であれば PKGBUILD、Macであればhomebrewが用意されているようですが、それ以外のディストリ/OSは手で入れる必要がありそうです。
また、Rubyに依存しているのでRubyを入れる必要もあります。
なのにgemで入らないのはすこし残念かなーと思います…。
補完
zsh の補完と、gitsh の補完だと、かなりの差があります。
例えば、git s まで打って<Tab>を押すと、以下の様になります。
zsh のもの

gitsh のもの

zsh の補完の方が情報量が多く、見やすいですね。
これは gitsh の残念な点です。
外部コマンドの実行
急にlsを実行したくなることは誰にでもあるはずです。
そんな時、gitsh では!lsのようにすることで実行することが出来ます。

しかし、下記のような問題がいくつかあります。
- シェルのような強い補完が効かない
- シェルで設定しているaliasは効かない(
alias ll='ls -l'など)
つまり、これは外部コマンド実行であってシェルじゃないのです…!
git コマンド以外には対応していない
これは問題点というよりかは難癖をつけているだけなのですが、gitshは勿論gitの為のツールなので、当然gitコマンドにしか対応していません。
しかし、世の中にはgit以外にもサブコマンドを取るコマンドは多数存在します。
例えば、goとかbundle execとか…。
顧客が本当に必要だったものとは
git コマンドを(もしくは他のサブコマンドも!)勝手に補完してくれる、タダのシェルなのでは…!
というわけで、作りました
というか、ちょっとしたzshスクリプトを書きました。
subsh という関数です(どうでもいいけどsubshってsushiっぽいですね)。
Installation
function subsh() { eval "__precmd_for_subsh() { print -z '$* ' }" autoload -Uz add-zsh-hook add-zsh-hook precmd "__precmd_for_subsh" }
上記のスクリプトを~/.zshrcに追記するだけでokです。
パッケージのインストールなどはなにも必要ありません(簡単!)。
bash or fish 使いの人はごめんなさい…!
Usage

$ subsh git
のように使います。
これを実行したあとは、コマンドを実行し終わる度に常にgitが入力された状態になります。
gitsh との比較
- インストールがめんどい
subshの場合、.zshrcに数行追記するだけなのでインストールの簡単さは段違いですね!
- 補完
subshはzshをそのまま使用しているので、そのままzshの高機能な補完を使用することが出来ます。
- 外部コマンドの実行
外部コマンドを実行するには、そのままgitと入力されているものを削除するだけで済みます。
<C-w>などで一発で削除できるのでとても簡単ですね。
また、繰り替えしになりますが、zshをそのまま使用しているので、外部コマンドの実行にもいつものzshの補完が効きます。
- git コマンド以外への対応
subshに渡す引数を変えることで、任意のコマンドを入力した状態にすることが出来ます。
つまり、任意のコマンドに対してgitshの様なものを使用することが出来ます!
応用が広がりそうですね。
まとめ
gitsh便利!- でも
subsh関数を自前で用意するともっと便利かも?!
ほか
GIF動画を取るのには、Linuxデスクトップ環境を Gifに記録する - Qiita を使用しました。
Linux Desktop Advent Calendar 2015 - Qiita の記事です。めっちゃべんり…!
またちょっとしたTipsですが、subshを使っていると(あるいは通常のgitの使用でも)
$ git git st
などと、いつの間にかgitコマンドを2重に打ってしまっていることがまれによくあります。
以下のようなaliasを~/.gitconfigに書いておくことで、このような場合でも正しくgitコマンドを発行することが出来ます。
[alias]
git = !git
簡単なTipsを紹介する記事になりましたが、お役に立てれば幸いです。
楽しい git life を送りましょう…!