こんばんは。この記事は、 Vim Advent Calendar 2012 の 50日目の記事です。
49日目は、 @uryt さんの vim.orgにアップロードされていないプラグインがあるかチェックするgit-unreleased-vimplugins作った でした。
本日は、長いこと自前で作成している、 unite を利用して 簡単な git 操作を行える unite-source 、 giti を紹介します。
vim-unite-giti
https://github.com/kmnk/vim-unite-giti
現在はドキュメントも書いたので、自分以外の方にも、お使いいただける物になっていると思います。
言わずと知れた unite のインターフェースを用いて、 git の色々な操作を実現するための plugin's plugin になります。
unite を使って git 操作をしたい気持ちになる方に、是非使ってみて頂きたいです。
普段の仕事でヘビーに使っているので、基本的な操作に関しては、この source で(多分)完結できるはずです。
自分も、仕事で使うバージョン管理システムが svn から git に移行したタイミングで、最初は使おうとしていました。
ですが、長らく(こちらも自前の) vim-unite-svn で、バージョン管理システムを unite 経由で使うことに慣れきってしまっており、
差分をコミットするごとにフラストレーションが溜まり、限界を超えた頃、気づくと自前で作成していました。
source 名を羅列すると、以下のような物を用意してあります。
* giti/branch, giti/branch_all
* giti/config
* giti/log
* giti/remote
* giti/status
それぞれ、簡単に説明してみます。
指定した branch に対して、 delete や merge 、 rebase などをの action を実行する kind を用意してあるので、
# branch を一覧する
# 指定した branch に対して何かする
という操作を、コマンドを打たずに選択するだけで行えます。
例えば、 typo を修正するために切った branch を master に merge したい場合は
giti/branch source を実行(:Unite giti/branch)し、 master が current branch になっている状態で fix_typo branch を選択して
tab 等で action リストを展開し、 merge を実行すると
merge が実行されます。
新しい branch を master から切りたい場合は、 giti/branch source を実行して、作成したい branch 名を入力して [new branch] とある行を選択した状態で Enter を押すと、
デフォルトで branch/new kind が起動して、 start point を聞いてくるので、 master の行を選択して、再び Enter を押すと、 master から branch が切られます。
直接 config 名を入力すると config を追加できます。また、 write や remove などの action を持った kind を用意しています。
ローカルの clone の一部だけ user.name などを書き換えたい時など、現在の値を参照しながら、変更することができます。
diff や reset_hard 、 revert などの action を持った kind を用意しています。
一行のみを選択している状態での diff は、その行の差分を新たな tab に表示しますが、
二行選択して diff を実行した場合、その commit 間の diff を表示します。
その他、 comment を見ながら reset --hard したかったり、 revert したかったりする commit を探して、 hash をコピペするなどなしに、一発で実行できるところなどが地味に便利です。
直接 remote 名を入力すると、新たな remote を追加できます。また、 fetch や delete 、rename 等の action を持った kind を用意しています。
remote に追加している、ある repository だけ fetch したいときなど、 repository に付けた名前などを思い出す必要なく、選択して Enter だけで fetch できます。
ファイルに対して操作する git コマンド(add 、 commit 、 checkout 等)に対応する action を持った kind を用意しています。
普段使いでは、一番お世話になる source なので、色々と action を持っています。
例えば、あるファイルに修正を加えた状態で
checkout action を実行すると、
変更のない状態に戻ります。
自分の一部の設定は、ドキュメント(doc/vim-unite-giti.txt)に書いているので、一例としてご参照ください。
test ディレクトリ下に h1mesuke さんの vim-unittest に依存して、ほぼ全 source をカバーした仕様化テストを入れています。
vim-unittest がロードされた状態で、ルートディレクトリ上で make test_all を実行すると、全テストを実行します。
vim script でテストを書くという例があまり無く、試行錯誤しながら書いていました。
良い書き方などあったら参考にさせていただきたいです。
また、内部操作はシェルで git コマンドを叩いて、結果をフィルタリングして、 map して、 format して unite に流しこむをしているだけなので、
徐々に動作が遅くなってる箇所が目立ってきていて、もう少しデータの取り方を考えたほうが良いかなとも考えています。
直近では、軽量化するのではなく、重い動作をしている際に、進捗を見られるようにしたいと思っています。
以上です。お付き合いいただきありがとうございました。
明日は @asionfb さんの記事になります。お楽しみに!
49日目は、 @uryt さんの vim.orgにアップロードされていないプラグインがあるかチェックするgit-unreleased-vimplugins作った でした。
本日は、長いこと自前で作成している、 unite を利用して 簡単な git 操作を行える unite-source 、 giti を紹介します。
vim-unite-giti
https://github.com/kmnk/vim-unite-giti
これは何?
初期構想としては、自分の自分による自分のための git 操作用 unite source です。現在はドキュメントも書いたので、自分以外の方にも、お使いいただける物になっていると思います。
言わずと知れた unite のインターフェースを用いて、 git の色々な操作を実現するための plugin's plugin になります。
unite を使って git 操作をしたい気持ちになる方に、是非使ってみて頂きたいです。
普段の仕事でヘビーに使っているので、基本的な操作に関しては、この source で(多分)完結できるはずです。
何故作ったの?
git の vim plugin と言えば、有名な vim-fugitive があります。自分も、仕事で使うバージョン管理システムが svn から git に移行したタイミングで、最初は使おうとしていました。
ですが、長らく(こちらも自前の) vim-unite-svn で、バージョン管理システムを unite 経由で使うことに慣れきってしまっており、
差分をコミットするごとにフラストレーションが溜まり、限界を超えた頃、気づくと自前で作成していました。
何ができるの?
(自分が仕事を使ってる分には不自由しない程度に)基本的な操作は大体出来ます。source 名を羅列すると、以下のような物を用意してあります。
* giti/branch, giti/branch_all
* giti/config
* giti/log
* giti/remote
* giti/status
それぞれ、簡単に説明してみます。
giti/branch, giti/branch_all
git branch や git branch -a を叩いた結果をリストにして表示する source です。指定した branch に対して、 delete や merge 、 rebase などをの action を実行する kind を用意してあるので、
# branch を一覧する
# 指定した branch に対して何かする
という操作を、コマンドを打たずに選択するだけで行えます。
例えば、 typo を修正するために切った branch を master に merge したい場合は
giti/branch source を実行(:Unite giti/branch)し、 master が current branch になっている状態で fix_typo branch を選択して
tab 等で action リストを展開し、 merge を実行すると
merge が実行されます。
新しい branch を master から切りたい場合は、 giti/branch source を実行して、作成したい branch 名を入力して [new branch] とある行を選択した状態で Enter を押すと、
デフォルトで branch/new kind が起動して、 start point を聞いてくるので、 master の行を選択して、再び Enter を押すと、 master から branch が切られます。
giti/config
git config -l を実行した結果を format して、リストにして表示する source です。直接 config 名を入力すると config を追加できます。また、 write や remove などの action を持った kind を用意しています。
ローカルの clone の一部だけ user.name などを書き換えたい時など、現在の値を参照しながら、変更することができます。
giti/log
git log を実行した結果をリストにして表示する source です。diff や reset_hard 、 revert などの action を持った kind を用意しています。
一行のみを選択している状態での diff は、その行の差分を新たな tab に表示しますが、
二行選択して diff を実行した場合、その commit 間の diff を表示します。
その他、 comment を見ながら reset --hard したかったり、 revert したかったりする commit を探して、 hash をコピペするなどなしに、一発で実行できるところなどが地味に便利です。
giti/remote
git remote を実行した結果をリストにして表示する source です。直接 remote 名を入力すると、新たな remote を追加できます。また、 fetch や delete 、rename 等の action を持った kind を用意しています。
remote に追加している、ある repository だけ fetch したいときなど、 repository に付けた名前などを思い出す必要なく、選択して Enter だけで fetch できます。
giti/status
git status -s を実行した結果を format して、リストにして表示する source です。ファイルに対して操作する git コマンド(add 、 commit 、 checkout 等)に対応する action を持った kind を用意しています。
普段使いでは、一番お世話になる source なので、色々と action を持っています。
例えば、あるファイルに修正を加えた状態で
checkout action を実行すると、
変更のない状態に戻ります。
どうやって使うの?
NeoBundle などを用いて頂いて、インストールした後、各機能をキーマップして使ってください。自分の一部の設定は、ドキュメント(doc/vim-unite-giti.txt)に書いているので、一例としてご参照ください。
他に何か言いたいこととか
機能面の話ではないのですが、自分は機能実装と同じくらいか、それ以上にテストを書くのが好きなため、test ディレクトリ下に h1mesuke さんの vim-unittest に依存して、ほぼ全 source をカバーした仕様化テストを入れています。
vim-unittest がロードされた状態で、ルートディレクトリ上で make test_all を実行すると、全テストを実行します。
vim script でテストを書くという例があまり無く、試行錯誤しながら書いていました。
良い書き方などあったら参考にさせていただきたいです。
これからどうするの?
基本的な作業には不自由しない段階にまでは実装が終わったので、この後は、自分が欲しいと思った機能や、作って欲しいと言われた便利そうな機能を都度実装していこうと思っています。また、内部操作はシェルで git コマンドを叩いて、結果をフィルタリングして、 map して、 format して unite に流しこむをしているだけなので、
徐々に動作が遅くなってる箇所が目立ってきていて、もう少しデータの取り方を考えたほうが良いかなとも考えています。
直近では、軽量化するのではなく、重い動作をしている際に、進捗を見られるようにしたいと思っています。
以上です。お付き合いいただきありがとうございました。
明日は @asionfb さんの記事になります。お楽しみに!
コメント
コメントを投稿