Emacs: 小物色々 (Mew 編)

Mew の機能を拡張する小物です。

# 特定キーワードのハイライト
メール中の特定キーワードに色付けできます。
利用法としては発送案内等の定型文メールの中から、運送会社等知りたい情報だけすぐ視認できる等があります。

## インストール
`.mew.el` や `init.el` 等に以下を追記します。

```emacs-lisp:match-highlight.el
(defvar mew-match-highlight-face 
  (defface deeppink-face '((t :foreground "DeepPink" :weight bold)) "DeepPink."))

(defvar mew-match-highlight-word-list nil)

(defun match-highlight (&optional word face)
  "buffer 内で WORD-LIST にマッチした文字列すべてをハイライト表示。"
  (let ((regexp (regexp-opt (or word mew-match-highlight-word-list)))
        (face   (or face mew-match-highlight-face)))
    (save-excursion
      (goto-char (point-min))
      (while (re-search-forward regexp nil t)
        (overlay-put (make-overlay (match-beginning 0) (match-end 0)) 'face face)))))

(add-hook 'mew-message-hook 'match-highlight)
```


## 基本設定
変数 `mew-match-highlight-word-list` にハイライトしたいワードをリストで設定します。
このワードを関数 `regexp-opt` でひとつの正規表現にするので、メタ文字を使うとおかしくなるかもしれません。

```emacs-lisp:
(setq  mew-match-highlight-word-list
       '("ヤマト" "日本郵便" "カトーレック" "佐川"
         "有効期限" "SBS即配サポート" "デリバリープロバイダ"))
```

デフォルトではピンクのボールドになります。
変更したい場合は `mew-match-highlight-face` にフェイスを設定してください。

```emacs-lisp:
(setq mew-match-highlight-face 'highlight)
```

# 補完リストを更新順にする

メールフォルダ名を補完したときの候補リストが更新された順になります。
振り分けてどこかにいってしまったメールを探すとき探しやすくなります。

本当は補完自体を ido で丸々置き換えたかったのですが、 mew の方が古くからあるツールなので、補完ルーチンを自前で持っていて、簡単に差し替えできず断念しました。

以下を `.mew.el` や `init.el` 等に以下を追記します。

```emacs-lisp:mew-local-folder-time-alist.el
(advice-add 'mew-local-folder-alist :after 'mew-local-folder-time-alist)
(defun mew-local-folder-time-alist ()
  (setq mew-local-folder-alist
	(sort
	 mew-local-folder-alist
	 #'(lambda (a b)
	     (time-less-p
	      (sixth
	       (file-attributes
		(concat mew-mail-path (replace-regexp-in-string "\\+" "/" (car b)))))
	      (sixth
	       (file-attributes
		(concat mew-mail-path (replace-regexp-in-string "\\+" "/" (car a))))))))))
```

# メール中の URL をブラウザで一気に開く
テキストメールの中に書かれた複数(またはひとつ)の URLアドレスを一発ですべて開きます。
文脈によって除外するアドレスの指定ができます。

## ダウンロードとインストール
これは少し大きいので[こちら](https://gist.github.com/s-fubuki/3e30d7bc0ffc612bb5000d4cbb130afb)に置いてあります。

これを `load-path` の通ったところに置き `.mew.el` や `init.el` 等に以下を追記します。

```emacs-lisp:
(require 'browse-open-all-url)
(add-hook 'mew-summary-mode-hook
	  '(lambda ()
             (local-set-key [remap mew-summary-execute-external] 'browse-open-branch)))
```

`C-c C-e` で
HTML なら Mew デフォルトの `mew-summary-execute-external` に渡し、通常メールならこの `browse-open-all-url` を起動するよう振り分けられます。

## 除外リスト
`browse-open-ignore-word-list` に正規表現リストで指定します。
メールの中の URL が書かれた行とそのひとつ前の行に指定キーワードが含まれていれば、その URL が除外されます。

```emacs-lisp:
(setq browse-open-ignore-word-list
      '("パス" "登録" "変更" "解除" "問い合" "修正" "停止" "マイページ"
        "いいね" "シェア" "TERMS" "PRIVACY" "POLICY" "UNSUBSCRIBE"
        "facebook" "twitter" "line" "unsub_center" "antispam" "profile_center"
        "link.rakuten" "news.html" "/auctions.yahoo.co.jp/"))
```

## 細やかな設定
通常日本のメールの場合「解除」等の文言は アドレスの1行前か、アドレス先頭に書かれているので、デフォルト(before)でだいたい問題ないのですが、海外のものだとアドレスの後に書かれいるもの等も存在するので、なるべく狙った動作になるよう `From:` によって見る箇所をコントロールできるようにしてあります。

car にはメアドを指定し、 cdr で指定する範囲指定のキーワードは以下の表の通りです。

| キー   | 範囲                  |
|:-------+:----------------------|
| just   | アドレスのみ          |
| before | アドレス行と 1行前    |
| here   | アドレスを含むその行  |
| after  | アドレスとその 1行後  |
| around | アドレス行と1行前と後 |


以下の場合 メールアドレスに "foo" が含まれていれば アドレスの行とその次の行を対象にします。

```emacs-lisp:
(setq browse-open-scan-direction-alist '(("foo" . after)))
```


いくつか指定したい場合以下のようにリストにして追加します。

```emacs-lisp:browse-open-all-url.el
(setq browse-open-scan-direction-alist '(("foo" . after) ("bar" . around) ("baz" . just)))
```



## トラッキング
仕様として洗練されていないのですが、HTTPパターン以外に数字列12桁にもマッチするようになっていて、数値12桁だった場合その数値の前に
`browse-open-url-search-prefix` で設定された文字列を付け足してブラウザに渡します。
トラッキングサーチ用です。

# 動作確認している Emacs と Mew のバージョン

> GNU Emacs 25.3.1 (i686-w64-mingw32) of 2017-09-18
> Mew version 6.7