pockestrap

Web Programmer's memo

"git " って打つのめんどくさい…!

この記事は Git Advent Calendar 2015 の 9日目です。

qiita.com

昨日は 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 です。)

f:id:Pocke:20151208191303g:plain

じゃあ "git" 抜きでサブコマンドを実行できればいいじゃん!

と思ったら、gitshというものがあるようです。便利な世の中ですね。

github.com

賢明な皆様は勿論 Arch Linux をお使いのことだと思いますが、PKGBUILDが用意されているので簡単にインストール出来るようです。
また、Macの場合はhomebrewからインストール出来るようです。
詳しいインストール方法はレポジトリのREADMEをご覧ください。

下記のGIF動画は、実際にgitshを動かしている画面です。

f:id:Pocke:20151208191441g:plain

gitを打つ必要がなくなっています。
圧倒的タイプ数の削減ですね!

gitsh 最高……?

gitsh さいこーじゃん!と言いたいところですが、私としてはいくつか問題点があると思っています。

インストールがめんどい

Arch であれば PKGBUILDMacであればhomebrewが用意されているようですが、それ以外のディストリ/OSは手で入れる必要がありそうです。
また、Rubyに依存しているのでRubyを入れる必要もあります。
なのにgemで入らないのはすこし残念かなーと思います…。

補完

zsh の補完と、gitsh の補完だと、かなりの差があります。
例えば、git s まで打って<Tab>を押すと、以下の様になります。

  • zsh のもの f:id:Pocke:20151208191532p:plain

  • gitsh のもの f:id:Pocke:20151208191541p:plain

zsh の補完の方が情報量が多く、見やすいですね。
これは gitsh の残念な点です。

外部コマンドの実行

急にlsを実行したくなることは誰にでもあるはずです。
そんな時、gitsh では!lsのようにすることで実行することが出来ます。

f:id:Pocke:20151208191723p:plain

しかし、下記のような問題がいくつかあります。

  • シェルのような強い補完が効かない
  • シェルで設定している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

f:id:Pocke:20151208191808g:plain

$ subsh git

のように使います。 これを実行したあとは、コマンドを実行し終わる度に常にgitが入力された状態になります。

gitsh との比較

  • インストールがめんどい

subshの場合、.zshrcに数行追記するだけなのでインストールの簡単さは段違いですね!

  • 補完

subshzshをそのまま使用しているので、そのまま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 を送りましょう…!