株式会社クリアコード > ククログ

ククログ


Mewで色付きでコミットメールを表示する方法

普通のフリーソフトウェアの開発のように、クリアコードでの開発では他の人のコミットを読むことは当たり前です。コミットを読むコストを下げるため、コミットメールを利用しています。

コミットメールを使うとコミットされたら随時メールで通知がくるので、push型の読み方になります。自分でそれぞれのリポジトリーをgit logsvn logするpull型の読み方に比べて、自分でそれぞれのリポジトリーのコミットを取得する手間がない分、コミットを読むコストが下がります。

クリアコードではGitのコミットメールはclear-code/git-utilsに置いているスクリプトで送信しています。このスクリプトはtext/plainとtext/htmlのmultipart/alternativeなコミットメールを送信することができ、text/htmlの方はdiffに色を付けるというような整形をしています。

EmacsでMewを使ってコミットメールを読むときでもtext/htmlのコミットメールを色付きで表示する方法を紹介します。

MewでのHTMLメール表示の設定

Mewはバッファー内でHTMLメールを表示する仕組みを用意しています。mew-prog-text/html変数に関数を指定する仕組みがそれです。

MewでHTMLメールを表示するときはEmacs-w3mを使うことが多いのですが、残念ながらEmacs-w3mは色に対応していないのでコミットメールを色付きで見るために使うことはできません。

Emacs 24.1からSimple HTML Rendererというモジュール(shr.el)が付属しています。このSimple HTML Rendererは元々はGnusに含まれていたモジュールで、Emacs 24.4で追加されたEmacs Web Wowser(Emacsで動くEmacs Lispで実装されたWebブラウザー)のレンダリングでも使われているモジュールです。

このSimple HTML Rendererは色にも対応しているので、MewとSimple HTML Rendererを連携させることで色付きでコミットメールを読むことができます。実際にSimple HTML Rendererで表示すると次のようになります。

Mewで色付きでコミットメールを表示しているスクリーンショット

Simple HTML Rendererを使う最小限の設定は次の通りです。この設定は~/.mew.elに記述します。

1
2
(when (fboundp 'shr-render-region)
  (setq mew-prog-text/html 'shr-render-region))

Simple HTML Rendererは内部でlibxml2を使っていて、Emacsがlibxml2サポート付きでビルドされていないと実行時エラーになります。もし、実行時エラーを避けたいのであれば、次のようにlibxml-parse-html-regionが束縛されているかもチェックするとよいですが、多くの場合はlibxml2サポート付きでビルドされているでしょうからそこまでチェックする必要はないでしょう。

1
2
3
(when (and (fboundp 'shr-render-region)
           (fboundp 'libxml-parse-html-region))
  (setq mew-prog-text/html 'shr-render-region))

この設定をすると、明示的に「.」を押せばHTMLをレンダリングしてくれるようになります。

次のようにmew-use-text/htmltにすると、自動でHTMLをレンダリングしてくれるようになります。

1
2
3
(when (fboundp 'shr-render-region)
  (setq mew-prog-text/html 'shr-render-region)
  (setq mew-use-text/html t))

さらに、multipart/alternativeにtext/htmlがあった場合はtext/plainよりも優先して表示するようにしたい場合は次のようにmew-mime-multipart-alternative-listも設定します。これで、コミットメールのHTMLを自動で表示してくれるようになります。

1
2
3
4
5
(when (fboundp 'shr-render-region)
  (setq mew-prog-text/html 'shr-render-region)
  (setq mew-use-text/html t)
  (setq mew-mime-multipart-alternative-list
          '("Text/Html" "Text/Plain" ".*")))

表示するだけならこれで十分ですが、HTMLメール内のリンクを簡単に辿りやすくするともっと便利になります。たとえば、リポジトリーブラウザー上のコミットのページや特定の行に行くと周辺のコードを見れて便利です。

Mewでは、Messageモード内で「TAB」を押すと次のリンクに移動できます。これはmew-urlテキストプロパティーを探すことで実現しています。Simple HTML RendererはHTMLをレンダリングするとリンクにshr-urlテキストプロパティーを設定します。Simple HTML Rendererでレンダリングした後、shr-urlテキストプロパティーが設定されているテキストにmew-urlテキストプロパティーも設定することで、Mewの「次のリンクに移動」機能を使うことができます。それを実現すると次のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(defun mew-render-html-shr (begin end)
  (save-excursion
    (save-restriction
      (narrow-to-region begin end)
      (shr-render-region (point-min) (point-max))
      (goto-char (point-min))
      (let ((url-begin-pos (next-single-property-change (point) 'shr-url))
            (url-end-pos))
        (while url-begin-pos
          (goto-char url-begin-pos)
          (setq url-end-pos
                (or (next-single-property-change (point) 'shr-url)
                    (point-max)))
          (put-text-property (point) url-end-pos
                             'mew-url (get-text-property (point) 'shr-url))
          (setq url-begin-pos
                (next-single-property-change url-end-pos 'shr-url)))))))

(when (fboundp 'shr-render-region)
  (setq mew-prog-text/html 'mew-render-html-shr)
  (setq mew-use-text/html t)
  (setq mew-mime-multipart-alternative-list
        '("Text/Html" "Text/Plain" ".*")))

これでEmacsで色付きのコミットメールを読みやすくなります。

まとめ

Emacs上でMewを使って色付きのコミットメールを読む方法を紹介しました。Mewでメールを読んでいる人は参考にしてください。

2015-03-17

«前の記事: 「リーダブルコード」に関する有料ワークショップ「実践リーダブルコード」を開催 最新記事 次の記事: クリアコードに入社した理由: フリーソフトウェアを仕事にしたい»
タグ:
年・日ごとに見る
2008|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|