クラウドワークス エンジニアブログ

日本最大級のクラウドソーシング「クラウドワークス」の開発の裏側をお届けするエンジニアブログ

Vimの作業を効率化するためgit-switcher.vimを作った話

dotfilesいじりが趣味の岩下(@ToruIwashita)です。

昨年末の クラウドワークス Advent Calendar で「VimでGitのブランチ毎にセッションを簡単に保持できるようにする」という記事を公開してからというもの、あの設定だと vim-session プラグインvim-fugitive プラグインに依存しているから微妙かなと思ったり、Vim上でブランチを切り替えつつセッションも同時に切り替えられるようにしたらもっと便利になるじゃんと思ったりして、うまいこと作り直したい欲求が抑えられなくなったのでプラグインを作る事にしました。

まずはじめにした事

プラグインを作る事にしたと言いつつ、既に誰かが作ってくれていたら自分で作らずむしろそれを使いたいので、まずは既存のプラグインの調査から始めました。

vim-session

GitHub - xolox/vim-session: Extended session management for Vim (:mksession on steroids)

普段愛用しているセッション管理プラグイン。 実装を見ると SaveSessionOpenSession コマンドでブランチ名を補完してくれるようで、若干Gitを考慮しているみたいでしたが、ブランチを切り替える機能までは見当たらず。

・gitsessions.vim

GitHub - wting/gitsessions.vim: Auto save/load vim sessions based on directory and git branch.

Gitのブランチ毎にセッションを自動で保存・復元できるようになるプラグインアドベントカレンダーの設定を作る前にこれを見つけていたらこれで事足りた。。でもブランチの切り替えまではできなそう。

vim-git-session

GitHub - rnaveiras/vim-git-session: Save vim sessions follow the automatic name branch-repo-name

こちらもGitのブランチ毎にセッションを自動で保存・復元できるようになるプラグインgitsessions.vim よりも軽量な実装。 しかしこちらもブランチの切り替えまではできなそう。

さくっと検索してみた結果、上記3つのプラグインが候補になりました。 特に gitsessions.vim はかなりやりたい事に近く、after/plugin を使用すればやりたい事は実現出来そうでしたが、細かい所まで作っていくと after/plugin のファイルが大きくなりそうで嫌だし、やっぱり自分で作ってしまおうという結論になりました。

※ ちなみに自分は unite.vim を使っておらず、ctrlp.vim を軸にVimを育てているので unite.vim を使えば簡単に実現できてしまうのかもしれません。

作ってみた

最終的に作ったプラグインはこちらです。

github.com

git_switcher_example

Git管理下のディレクトリで、Vimでファイルを編集している時に以下のコマンドを使ってセッションとブランチを操作する感じになります。

基本的に :Gsw ブランチ名 だけ使っていれば状態の切り替えを簡単に行う事ができます。

Gsw

カレントブランチのセッションを保存、ブランチの切り替え、新しいブランチのセッションを復元。

Gsw!

Gswの動作でセッションの保存をスキップし、ブランチの切り替えと新しいブランチのセッションを復元。

GswSave

現在の状態をカレントブランチのセッションとして保存。

GswLoad

カレントブランチのセッションを復元。

現状ヘルプドキュメントが無かったり作りこみの余地はあるのですが、これから徐々に改善していくつもりです。

最後に

プラグインを作るにあたって、困った時にググればすぐに日本語の記事がヒットする環境があるというのはありがたい事だなとすごく思いました。 Vimの諸先輩方に感謝です。

We're hiring!

自分はVim好きなのでVimの記事を書かせてもらいましたが、社内ではもちろん各自好きなエディタを使って開発を行っています!

クラウドソーシングサイトのクラウドワークスでは公開できそうな機能を積極的に切り出してOSS化する事が好きなエンジニアを募集しています。

© 2016 CrowdWorks, Inc., All rights reserved.