gistコマンドよりちょっと便利なgisty

メモやちょっとしたスクリプトなどをペーストするとgitのリポジトリとして管理してくれるgistというサービスがあります。そのgistにコマンドラインから投稿するツールがあって、それは前に少し紹介したんですが、それをもうちょっと便利にしたものを作りました。

swdyh's gisty at master ― GitHub
http://github.com/swdyh/gisty/tree/master

gistコマンドとの違いはこんな感じです。

  • ポストするときにファイルを指定。ファイル名、拡張子つきでアップされる。
  • ポスト時に複数ファイルを指定できる。
  • ポスト後、ブラウザで開く。(Macのみ)
  • ポスト後、ローカルにcloneする。
  • 過去のgistにアップしたのを全部のclone、またはpullする機能

gistyを使うと簡単にファイル名と拡張子つきでポストできて、そのままローカルにcloneされるので、変更したい場合も、そのファイルを編集してpushすれば済みます。なので、Webのフォームを全く使わずにgist使えるようになります。ただメモをペーストする場合ファイル名はあんまり意味がないけれど、cloneしてあとで編集しようとすると、ファイル名があった方がずっと分りやすいです。あと拡張子をつけておくとシンタックスハイライトが有効になります。あと、gistyではgithubのアカウントで投稿することを前提にしていて、無名の投稿は想定してません。

インストール方法

 gem install gisty

初期設定

環境変数のGISTY_DIRで、アップしたgistをcloneしてくるディレクトリを指定します。自分の場合は、.zshrcでこんな感じに指定してます。

 export GISTY_DIR="$HOME/dev/gists"

gistコマンドと同じく、git configでユーザIDとAPIトークンを設定します。

 git config --global github.user your_id
 git config --global github.token your_token

githubのアカウントページ(https://github.com/account)の、"Global Git Config"というところを押すと、やり方が表示されます。

zshを使っているひとは、ここから_gistyというファイルを落として、$fpathのディレクトリに入れおくと、コマンドが補完されてより便利です。

http://github.com/swdyh/gisty/raw/master/_gisty

使い方

gisty post file1 file2 ...
ファイルをgistにポストします。
gisty private_post file1 file2 ...
ファイルをプライベートな状態でgistにポストします。
gisty sync
gistにアップされたものを全てcloneしてきます。
gisty sync_delete
ローカルの方にしかないgistを削除して、syncします。
gisty pull_all
ローカルのgistでpullを実行します。
gisty list
ローカルにcloneしてきたgistの一覧を表示します。
gisty help
ヘルプを表示します。
gisty about
gistyに関する情報を表示します。

実装の話

gistへのポストはgistコマンドを参考にしながら、複数ファイルもいけるようにしました。ポスト後は、クリップボードにURLを入れるよりブラウザで開いた方がいいなあと思ったのでそうしました。ただMac以外の環境でのやり方がわからなかったので、とりあえずMacのみです。gist syncは、自分の一覧が必要なのでmineのページをnokogiriでスクレイピングしてます。件数が多いと取得するページ数が増えて時間がかかるかもしれません。Webページを取ってきたり、gitのコマンドを実行したりと、いろいろ外部に依存していてるので、テストはrrというモックフレームワークを使って、open_uriやsystemコマンドを差し替えるようにして書きました。