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

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 $BRANCH_NAME
    • giti#commit#dry_run(files)
      $ git commit --dry-run $FILES
    • giti#push#run()
      $ git push
    • giti#push#run(repository, refspec)
      repository と refspec を指定して push
    • giti#push#expressly()
      repository と refspec の入力を対話的にやる
    追記(02/26): よくよく考えたら、関数提供しても command  にしないと CommandLine で使いにくいことに気づいたので、いくつか command を追加しました。
    • GitiDiff
    • GitiDiff $FILE1 $FILE2 ...
    • GitiDiffCached
    • GitiDiffCached $FILE1 $FILE2 ...
    • GitiPush
    • GitiPush $REPOSITORY $REFSPEC
    • GitiPushExpressly
    下記のような感じに設定しています。

    if globpath(&rtp, 'plugin/giti.vim') != ''
      nnoremap <expr> <silent> <Space>gD ':<C-u>GitiDiff ' . expand('%:p') . '<CR>'
      nnoremap <expr> <silent> <Space>gd ':<C-u>GitiDiffCached ' . expand('%:p') .  '<CR>'
      nnoremap <silent> <Space>gp :<C-u>GitiPush<CR>
      nnoremap <silent> <Space>gP :<C-u>GitiPush
    endif
    追記ここまで(02/26)



    以下、例によって簡単な動作デモ


    :Unite giti/status




    何もないときでも、commit --amend などは実行したいので、常に候補としてdummyを表示しています。


    action はこんな感じに。


    file を編集して保存したので、差分が出ます。新ファイルなので Untracked


    add


    IndexStatus が Added になります。


    更に編集すると、 WorkStatus が変わるので


    また add


    こんな感じで繰り返していきます。


    間違えて編集したとき(まだ add してないとき(WorkStatus が Modified))は、


    checkout で戻す


    戻りました。add 済みであれば reset を使います(reset HEADが実行されます)。


    しばらく作業したら commit したいファイルを選択して


    commit


    コメントを編集して ZZ


    commit できました


    新規に add したけど、やっぱり要らなくなったものは


    rm_cached


    Untrackedにもどります。


    commit しちゃったけど要らなくなったものは、


    file kind に追加されている git_rm action を実行


    Deleted になります


    giti/branch も入ってますが、しっかり動作確認できていないです。多分動く…

    かっとなって作ったため、まだ仕事で使っておらず、動作が不安定な箇所もあると思います。バグや要望等ありましたらお知らせ下さい。
    一応、そのうちやりたいなということは、README の TO DO に書いていますが、実装予定は未定です。。

    Vim script on Vim script もドキュメントしっかり書いた方が良いのかな…

    コメント

    1. こんにちは。unite.vimの作者です。これはかなり良い機能だと思います。が、やはりこういった各プラグインに分かれてしまっているVCSの操作というのは一つにまとめるべきだと思っています。この機能をvim-vcsに統合できないでしょうか。
      https://github.com/Shougo/vim-vcs

      返信削除
    2. > Shougoさん
      はい、vcsとしてまとめることには賛成です。
      可能であれば統合したいです。
      まだしっかりと考えていないですが、gitとsvnだけでも細かい操作までは対応付けが難しそう、詳細の機能までインターフェースを合わせるのは大変そう、と時間がかかりそうなイメージがあったのと、
      直近の仕事でgitを使い始め、作業に差し支えが生じてきたので、取り急ぎ作ってしまっていました。

      まず、svnの方の対応を考えつつ、どういうインターフェースを切るのが良いのか妄想してみたいと思っています。手をつけ始めましたらご相談させてください。

      返信削除

    コメントを投稿

    このブログの人気の投稿

    就職活動現況報告

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

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

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

    あけましておめでとうございます 2020

    あけましておめでとうございます。 去年は1年通して仕事が忙しかったことを言い訳に、何も抱負を達成せずにのんべんだらりと過ごしてしまった一年でした。 去年一切達成できなかった抱負ですが、盛大にハードルを下げつつ、今年も書いておこうと思います。 - 英会話コースを受講する - 隔月で新しいことを体験する(間の月は次の月にやることを考える) - 個人でゲームを作成してプラットフォームへ上げる - 4半期ごとに達成状況を確認して、余裕があったら目標を追加する 以上です。 今年もよろしくお願いいたします。