diff-hlはファイルの差分をグラフィカルに表示してくれるパッケージです。
emacsのgitクライアントはmagitが最も有名です。magitはgitのコミットからプッシュまでのgitの操作が主体です。一方でdiff-hlはファイルの差分の表示がメインになります。ファイルの変更を確認したり、差分のハンクを移動したり、変更内容を確認できます。
(use-package diff-hl
:ensure t
:init
(global-diff-hl-mode)
(add-hook 'dired-mode-hook 'diff-hl-dired-mode)
(unless (window-system) (diff-hl-margin-mode))
:custom-face
(diff-hl-change ((t (:background "#8adf80"))))
(diff-hl-delete ((t (:background "#ff8f88"))))
(diff-hl-insert ((t (:background "#bfc9ff"))))
:config
(add-hook 'magit-pre-refresh-hook 'diff-hl-magit-pre-refresh)
(add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh))
global-diff-hl-mode
はグローバルでdiff-hlを利用する宣言です。
(add-hook 'dired-mode-hook 'diff-hl-dired-mode)
はemacsのdirモードで差分を表示します。C-x C-f
でファイルを開く代わりにディレクトリを開くと、このように差分が強調表示されます。
(unless (window-system) (diff-hl-margin-mode))
はCUIモードでemacを使っている場合、左にマージンを用意してそこに差分情報を表示します。GUIの場合はEmacsのフレームに描画されるのでこの設定は必要ないので省いています。
カスタムフェイスは好きな色を使って良いと思います。デフォルトの色は多少禍々しかったので、modus-themsのカラーをセットしています。
(diff-hl-change ((t (:background "#8adf80"))))
(diff-hl-delete ((t (:background "#ff8f88"))))
(diff-hl-insert ((t (:background "#bfc9ff"))))
diff-hlはファイルの差分を移動できます。デフォルトで割り振られているキーバインドはやや難解ですが使えなくもありません。"command diff-hl-next-hunk" C-x v ]
は差分のハンクを前に進みます。
"diff-hl-previous-hunk" C-x v [
はハンクを上に戻ります。
ファイルを編集してしまうと、前の状態はgit diff
を実行しないと確認できません。
例えば、下の画像では、なんらかのhtmlが削除されていますが、何が削除されたか分かりません。
目的のハンクでコマンドを実行することで編集前の状態を表示することができます。
カーソルをハンクのあたりに移動させて"diff-hl-show-hunk" C-x v *
を実行します。
変更前の状態が表示されます。右下にdiff-hlが提供するキーが表示されています。
magitとdiff-hlをうまく使うことで、emacsでのgit体験がずっと良くなるので試してみてください。