スキップしてメイン コンテンツに移動

git を操作したい時にちょっと便利かもしれない unite-source を書いています


こんばんは。この記事は、 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

これは何?

初期構想としては、自分の自分による自分のための 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 さんの記事になります。お楽しみに!

コメント

このブログの人気の投稿

日記をつけはじめて1年とちょっと経ったまとめ

日記をつけはじめて1年とちょっと経ったまとめ 去年(2017)の 1/11 から日記をつけ始め、気づくともう1年以上ほぼ毎日つけていました まさか習慣化するとは思っていなかったんですが、意外と続いたので一旦まとめておこうと思ってのエントリ このエントリでは どういう手法で続けてきたか や 続けてきた結果どうなったか などをまとめておいて、自分用の改善材料にすること、及び、このエントリを見た人の判断材料にすることを目的としています …ので、書き始めた主要因である書籍 日記の魔力 については、覚えている内容を参考にする程度で、本自体の紹介はほぼしないです(読み返すのが面倒だっただけじゃないです) まとめ 書いてみたら長くなったので、まとめから 自分用のフォーマットを整えれば意外と書くのは楽 愚痴も悩みもとりあえず文字に吐き出すと精神衛生上良い 忘れっぽいと思っていたら、思っていたより数倍物事を忘れていることに気づく 万が一興味を持ったら一度 日記の魔力 を読んでみては 今後は… これまで通り毎日ログを書く ふりかえりの意義を再考して、ちゃんと毎週&毎月ふりかえるようにする ふりかえりの中で、どういうログを書いておくと使いやすいか考えて、日記自体も改善する 以降、自分のふりかえりも兼ねているため長文ですが、つらつらと書きます きっかけ 最初のきっかけは、 Twitter のタイムラインに流れてきたブログのエントリ 思考や行動を改善できる「日記の魔力」とは の引用…だった気がする(この時はまだログをつけていなかったので記録も記憶も残っていない…) ここで紹介されている 日記の魔力 という本を一通り読み、本に書いてあるとおりに 騙されたと思って日記を書き始めてみよう と思ったのが最初の一歩 手法 記憶が朧げですが、確か本の著者の方の手法は ワープロかPCか何かで、毎日のログを隙間時間にファイルに記述する 10日に一度くらいのスパンでそれまで書いた日記をふりかえる ふりかえりの中で、自分が人生で追っていきたい主題みたいなものに関連する内容を別のファイルにコピペして貯めていく みたいな形だったはず。色々と細かいルール(天気などの後から調べれば分かることは書かない等)が少しあった気がするけれど、既に覚えて...

git status と git branch ができる unite の source 書いた

書きました。 https://github.com/kmnk/vim-unite-giti すでに有りそうな気もするんですが、今のところ知らないのと、 http://kmnk.blogspot.com/2011/02/unitesvn-statussvn-diffsource.html で書くといって既に一年経っているのとで自分で書いてみました。 まだ仕事でがっつり使っていないので、バグや動作不全などあるかもしれません。 昔作った svn と違って何故か vim-unite-git じゃなくて giti なのは、日和っただけで深い意味は無いです。 インストール方法は割愛します。unite.vim 使っている方なら余裕なはずという想定で… 作ったsourceの名前は以下。 giti/status giti/branch 追記(02/29): READMEには追加しているんですが、sourceをいくつか追加しました。以後は README.markdown を参照してください。 giti giti/log giti/config  追記ここまで(02/29) それぞれ、独自 kind を定義していて、以下のactionを持っています。 giti/status add $ git add $FILES rm_cached $ git rm --cached -- $FILES reset $ git reset HEAD $FILES commit $ git commit $FILES amend ←動作が怪しい $ git commit --amend $FILES checkout $ git checkout -- $FILES diff $ git diff $FILES diff_cached $ git diff --cached $FILES git/branch run $ git checkout $BRANCH_NAME or git checkout -b $NEW_BRANCH_NAME delete $ git branch -d $BRANCH_NAME その他、以下の関数を用意しています。key map などして使えるかもしれないです。 giti#branch#delete_force(branch) $ git branch -D...

builderscon tokyo 2017 に行ってきた

builderscon tokyo 2017 に行ってきた builderscon tokyo 2017 (2017/08/03-05) の本編1,2日目に行ってきました きっかけは rebuild.fm のスポンサー宣伝 YAPC ASIA の系統をついでいるのもあるのか、 コンテンツ はかなり幅のある内容で、誰でも興味のある内容が何かしらあるであろう。な、カンファレンスでした 発表資料は既に タイムテーブル の各詳細ページに大体公開されているので、内容はそちらを参考にしていただければと思います(リンクが貼られていないものも少し有りますが、検索すればどこかに上がってることが多いはずです) このエントリでは、自分が聞きに行ったセッションがどこだったかのリストとセッション全体についてのざっくりとした感想、及び、カンファレンス自体についてのざっくりとした感想を書いておき、来年以降また開催された時の参加判断の資料にできればと思います 更新履歴 2017.08.07 公開 聞いたセッション 実際にその場に行って、聞いたセッションのリスト 1日目 Opening DeepLearningによるアイドル顔識別を支える技術 ランチセッション A 株式会社VOYAGE GROUP ランチセッションB Momentum株式会社 マイクロチームでの高速な新規開発を支える開発・分析基盤 Goで実装する軽量マークアップ言語パーサー 2日目 静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話 小さく始めて育てるコンパイラ ランチセッション【PR】エンジニアがkintoneを使うべき3つの理由 サイボウズ株式会社 ランチセッション 【PR】検索サービス開発が絶対におもしろいと思う理由 Supership株式会社 polyglot になろう !! WEB+DB PRESS 100号記念 特別企画 聞きたかったセッション 後評判を聞いたりして、聞きたかったかなーと思ったセッション(後でスライド読む) 1日目 Desktop Apps with JavaScript 横山三国志に「うむ」は何コマある?〜マンガ全文検索システムの構築 RDBアンチ...