git-gutter.elを書いてみました

ST2の中でGitDiffを視覚化するGitGutterが死ぬほど便利だった - mizchi log


という記事を見て、作ってみました。上記のサイトであるように
"git diff"を視覚化するものです。

以下のようなコミット済みのファイルがあったとします。

#!/usr/bin/env ruby
# -*- coding:utf-8 -*-

def orig_func
  # I'm orig func
end

def foo
  puts "hello foo"
end


それを以下のように変更します。

#!/usr/bin/env ruby
# -*- coding:utf-8 -*-

def orig_func
  # I'm orig func
end


def added_func
  # I'm added func
end


def foo
  puts "hello foo"
end


そして "M-x git-gutter"と実行すると以下のようになります。


どの部分を修正したかが視覚的に確認できます。

設定例

定期的にか、保存時ごとに git-gutterを実行するようにすると
良いでしょうか

(require 'git-gutter)

(add-hook 'after-save-hook
          (lambda ()
            (if (zerop (call-process-shell-command "git rev-parse --show-toplevel"))
                (git-gutter))))

問題点

diffの解析方法はオリジナルと同じにしているんですが、ある同一行の修正の
近くに新規の追加があるといい感じに表示されません。先ほどの例で不自然な
改行がありますが、それを削除すると以下のようになってしまいます。
このあたりをもっとよくするとかなりいい感じになりそうです。

制限

linum-modeの実装と同じ方法を用いているので、現状 linum-modeと
併用できません。それを回避するために fringeを使った方法を現在
検討しています。冬休みに余裕があったら試してみるというところ
でしょうか。

おわりに

結構どんな感じを修正したかというのの確認に "git diff"を使うことが
多かったので、もっと diffの解析がよくなれば重宝しそうですね。
本家の修正を見つつ、改善できたらと思います。