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

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 さんの記事になります。お楽しみに!

コメント

このブログの人気の投稿

就職活動現況報告

今週若干余裕があるので少しネタの更新・・と思っていますが 研究も進めないといかんので保留。。 本を読む本 (講談社学術文庫) をほぼ読み終わったので 電車の中で次はviの本かWebプログラミング基本みたいな本を読もうと思います。 後は久々に漫画を衝動買い。 ぷりぞな6 1 (サンデーGXコミックス) これ。絵描いてる人が韓国の人らしい。 ブラックラグーンの作者が支持みたいなことが書いてあったので読んで見ました。 まー絵は萌え系みたいな感じだけどシリアス混じってて面白そうかな? Amazonでは絵が無いですが一応公式の紹介は GX作家&作品紹介 こんな感じです。 結構表紙飾っているようなので見たことある人も居るかもしれません。 で、タイトルの就活現況では、前回順調とか言ってましたが 志望していた6社のうちとうとう1社落ちました。 しかも結構でかいところです。 グループ面接の時点で落ちてしまったので、 もしかしたら表面の部分(礼儀とか仕草)で落とされたのかもしれないですが、 反省としては 内容が冗長で話す内容が長かった 何か反論された時に言い訳じみた答えを返してしまった 自分はエンジニア経験があるんだ的な内容を押しすぎた 辺りと考えています。 で、対策。 まず冗長分ですが、今のところ話す内容を完全に決めてしまわずに、 ある程度の枠を決めてその場で考えて話しているので もうちょっと 質問の後に結論を考えてから内容を話す ように気をつけようと思います。 反論じみた言い訳というのは、とっさに返してしまう対応策みたいなもので、 相手に この人は実務でミスしてもその場対応するんじゃないか という印象を与えてしまった気がしております。 ので、対策としては 一度相手の内容を肯定して、その上で簡潔にこうすればいいんじゃないかと思うと一言返す 位に留めようと思います。 最後にエンジニア押しは、一応自分の売りの一つではあるので止めることはせずに 事実だけをしっかり伝えて冗長分は省く というような感じにしようかと思います。 以上。 自分の反省なので発信するような内容じゃないんですが、 文に書かないとなかなか省みない性格なので文にして発信。 結論を言えば「もっと落ち着いて簡潔に」を心がけるといったところでしょう。 正直面接凄い苦手なのでなかなか落ち着くのはきついですが、 省みなずに 運

USBメモリでポータブル環境を作る(その2)

その1では、環境作りの前の下地を作成しました。 その2では、実際にソフトを入れ、完成させて、使ってみます。 2.ポータブル環境用ソフト選び この辺りは基本的にこの二つのサイト 「USBメモリに入れて持ち運べる便利なソフト」まとめ PortableApps.com を参照して、自分の使いやすい環境にすべくソフトを詰め込みます。 中でも恐らく必須なのは、ランチャーです。 自分は前者のサイトでも紹介されている CraftLaunch をデスクトップやノートPCでも愛用しているので、こちらを使いました。 ランチャー選びの注意点として、 接続するPCによってドライバ名が変わるため ランチャーは相対パスで指定できなければなりません。 その辺り対応しているランチャーが先ほどの まとめ や、 USBメモリ徹底活用術 で紹介されているので 使いやすそうなものを選んでみてください。 自分はコマンド入力式のランチャーがなければ生きていけません。 残りのアプリケーションは好みで。 参考までに自分が入れているアプリケーションをさらすと CraftLaunch FFFTP FireFoxPortable foobar2000 DeleteDust StartScr Suspend IDM LimeChat PidginPortable SunbirdPortable TeraPad Twit UnplugDrive Portable Vim 現在のところこれらになります。 今現在使っているUSBメモリがそれほど容量が大きくなく、転送速度もそれなりなため あまり重そうなソフトは入れていませんが、 軽くて便利なソフトは他にも多々あるので、 個々使えそうなアプリを探してみてください。 重そうなので入れていませんが、OpenOfficeのPortableバージョンなどもあります。 3.用途と感想等 ということで、ここまで携帯環境構築を色々と垂れ流しました。 様々なソフトの設定がいつでもどこでも保持されている状態なので、 いつどこのどのPCでも自分の使いやすい環境が維持されることになります。 ただしまぁセキュリティ上ネカフェとかのPCで使うのはやめておいた方が良いと思いますが。 転送速度が十分速いお高めのUSBメモリであれば、 USBメモリに入れているアプリは自分の使う自宅

sonictemplate-vim を denite.nvim で使うための source と kind を書きました

sonictemplate-vim を denite.nvim で使うための source と kind を書きました こうなって こうなって こう宣言したので Meguro.vim #9 で 進捗 を出してきました コメント等合わせても 50行 程度の実装です 概要 sonictemplate-vim を denite.nvim から呼び出すための拡張用 source & kindを書きました sonictemplate-vim-denite-extension これはなに? mattn さんが作成されている sonictemplate-vim の機能を、 Shougo さんが作成されている denite.nvim を経由して呼び出せるようにするための source と kind の実装です なにができるの? :Denite sonictemplate を execute すると、適用対象テンプレートの候補が denite.nvim のインターフェースでリスト表示される リストからテンプレートを選択( <Enter> )すると、ソースコードに適用される それ :Template でできるよ そもそも :Template までが command モードで入力された状態で <Tab> 等を押せば、候補が表示&補完される機能が本家の sonictemplate-vim 自身に備わっているので、必要十分ではあります ならなんで作ったの? 自分が denite.nvim のインターフェースにかなり依存して Neovim を用いているため、作業中の操作を極力ひとつに統一させておきたい denite.nvim 上で候補リストを表示することで、候補の絞り込み機能が提供されるため、少し便利になる Vimスクリプトコーディングのリハビリを兼ねて書きたかった (Python スクリプトだけど) 辺りが主な理由です なんで fork じゃなく別リポジトリで作ったの? 以前 unite.vim 用の source & kind を作ったときは、 Vim があれば使えたので一緒でも良かったのですが(実際当時はそこまで考えてませんでしたが)、今回は de