;;;;;
title: highlight VC diffs
tags: tips, emacs, git, vc, diff
date: 2013-01-25 02:20
format: md
;;;;;

Sometimes you come across these gems of packages that seem to fulfill
a wish that you didn't even realise you had.

Today I came across
[git-gutter](https://github.com/syohex/emacs-git-gutter) for Emacs and
its companion
[git-gutter-fringe](https://github.com/syohex/emacs-git-gutter-fringe),
which are apparently based on an extension for Sumblime Text 2. These
show the status of changes in a special "gutter" next to the fringe or
in the fringe itself. This is very cool stuff.

To enable it I added the following code to my Emacs init file:

``` emacs-lisp
(eval-after-load "git-gutter" '(load "git-gutter-fringe"))

(defun maybe-use-git-gutter ()
  "Run `git-gutter' if the current file is being tracked by git."
  (when (eq (vc-backend (buffer-file-name)) 'Git)
    (git-gutter)))

(add-hook 'after-save-hook 'maybe-use-git-gutter)
(add-hook 'after-change-major-mode-hook 'maybe-use-git-gutter)
(add-hook 'window-configuration-change-hook 'maybe-use-git-gutter)
```

`git-gutter` was easily installed through MELPA, but I had to download
`git-gutter-fringe` separately and use `package-install-file` to
install that.

I had to load `git-gutter-fringe` manually because it didn't seem to
have any autoloads defined, and I had to run it using these three
hooks because the information seemed to disappear if I switched
windows and came back, didn't automatically update after saving and
didn't automatically show anything when first loading the file. This
was all fine, since just calling the function updates the buffer it's
easy to use this way.

Later, though, I stumbled upon
[diff-hl](https://github.com/dgutov/diff-hl) by accident. I was
looking for anything involving the fringe, which I think, for the most
part, is underused.

It does pretty much the same thing, except that it does so at least
for git, bazaar and mercurial (according to the readme). It also
defines some commands for working with the blocks of changes, like
navigating between them and reverting them. It uses the fringe by
default, and doesn't require a separate package to be installed. And
it's much easier to set up.

It can also be installed through MELPA, and afterwards it's just a
line in our init file away:

``` emacs-lisp
(global-diff-hl-mode)
```

Of course if you don't want it enabled globally you can call
`diff-hl-mode` from some hooks, but this way works fine for me.

It's funny how I had no idea these existed, didn't even think about
needing/wanting this feature and then finding two of them in the same
day.

<!-- Local Variables: -->
<!-- mode: markdown -->
<!-- End: -->
