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

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

      返信削除

    コメントを投稿

    このブログの人気の投稿

    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_allgit branch や git branch -a を叩いた結果を…

    builderscon tokyo 2017 に行ってきた

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

    のどか(と窓使いの憂鬱)のvim風キーバインド設定を書いてみた

    せっかくのどかを購入したのにあんまりキーバインドの改造をしていないので、練習がてらざっくりとvim風キーバインド設定を書いてみました。

    多分窓使いの憂鬱でも動きます。動作確認はしていないです。

    個人的に以下のキーバインドを先に行っているので、それ前提で見ていただければ。


    # CapsLock 単発だと Esc になり、押しながら何かを押すと Ctrl になる
    mod ctrl += !!英数
    key *英数 = *Esc

    # SemiColon を Enter に
    key *IC-SemiColon = Enter

    # Control を押しながら SemiColon で SemiColon
    key *IC-C-~S-SemiColon = SemiColon


    で、以下がvim風キーバインド


    ### vim mode
    ## vim mode トグル
    key C-OpenBracket = &Toggle(Lock0)

    ## keymaps
    # 一行ヤンク
    keymap2 LineYankReady
    key L0-*S-*C-*A-Y = Home S-End C-C Home

    # 一行デリート
    keymap2 LineDeleteReady
    key L0-*S-*C-*A-D = Home S-End C-X

    # 一行カット
    keymap2 LineCutReady
    key L0-*S-*C-*A-C = Home S-End C-X

    # 頑張って一番上まで戻ろうとする
    keymap2 GoTopReady
    key L0-*S-*C-*A-G = PageUp PageUp PageUp PageUp PageUp

    # exモードセーブ
    keymap2 ex_mode_save
    key L0-*S-*C-*A-Enter = C-S
    key L0-*S-*C-*A-SemiColon = C-S # Enter代替

    # exモード
    keymap2 ex_mode
    key L0-*S-*C-*A-W = &Prefix(ex_mode_save)

    keymap Global

    ## vim mode 時の挙動
    # default mode (Lock0 : on)
    key L0-*S-*C-*A-_1 = &Undefined
    key L0-*S-*C-*A-_2 = &…