仕事でgit使っていてレビューとかしていると、どうもgitのブランチ切り替えがだるくなってくる。それで、zawで更新日時順でブランチが並んでいて、選択するとgit checkout出来ればすぐにブランチ切り替えが出来て便利ではと思いやってみた。
bindしたキーを押すと、更新日時順でブランチが表示されて、Enterを押すとチェックアウトする。更新日時順なので数回キーを押すだけで、チェックアウトしたいブランチに辿り着けることが多い。zawを使っているので絞り込みも出来る。
インストール
zawを使っていれば、導入は簡単。
まずzawのsourceのディレクトリに以下のファイルを置く。もしくは適当なところに置いて、zawのloadの後にsourceを使ってloadする。
次にzshrcで適当にbindingを決める。僕はC-x C-bに割り当ててる。
bindkey '^x^b' zaw-git-recent-branches
あとはC-x C-bを押したら使える。
zawが入ってない時は https://github.com/nakamuray/zaw あたりを見て入れてください。
技術的tips
今回は以下の二つを行った。
- gitでブランチを更新日時順で表示する
- zawで絞り込みを行う
gitでブランチを更新日時順で表示する
なんかいつもperlとかrubyとかでいろいろやってたりしたんだけど、git for-each-ref使ったら一行だった。git、奥が深すぎて全く使いこなせない。
ローカルブランチを更新した順に取得
git for-each-ref --format='%(refname:short)' --sort=-committerdate refs/heads
リモートブランチも一緒に取得
git for-each-ref --format='%(refname:short)' --sort=-committerdate refs/heads refs/remotes
zawで絞込みを行う
zawで絞込みを行うにはsource関数を定義し、その中でcandidates, actions, act_descriptions辺りを定義すればいいみたい。今回だったら
function zaw-src-git-recent-branches () { git rev-parse --git-dir >/dev/null 2>&1 if [[ $? == 0 ]]; then candidates=( $(git for-each-ref --format='%(refname:short)' --sort=-committerdate refs/heads) ) fi actions=(zaw-src-git-recent-branches-checkout) act_descriptions=("check out") } function zaw-src-git-recent-branches-checkout () { BUFFER="git checkout $1" zle accept-line } zaw-register-src -n git-recent-branches zaw-src-git-recent-branches
のように
- zaw-src-git-recent-branchesを定義し、candidates, actions, act_descriptionsあたりを定義
- actionでやることを関数で実装(zaw-src-git-recent-branches-checkout)
- zaw-register-srcで登録
まとめ
zaw結構簡単にsourceを作れて便利だった。あとgit奥深すぎて色々出来て全く使いこなせない。