2017/04/03

Emacs Org mode 9.0.5でのリンクのハイライト

Org mode 9.0.5のデフォルトの設定ではDouble bracket links([[]]で囲まれたリンク)の後に続く文字が正しくハイライトされません。以下に例を挙げます。

1. [[http://example.com]]は例に使えるドメイン名です。
2. これは[[http://example.com][リンク]]です。

この問題はPlain text linksが原因のようで、"http:"に続く文字列は次の空白が見つかるまでリンクになってしまいます。M-x customizeからOrg Highlight LinksのPlane text linksを無効にすることで問題を回避できます。

以下はその他調べたことなどです。

--

Emacsなので関連語句を適当にハイフンでつないで検索します。

$ cd ~/.emacs.d/elpa/org-20170210
rg plain-link
(ターミナル出力略)

出力から探し物はorg.elっぽいことがわかります。org.elの内の関数org-make-link-regexpsの中にハイライトするリンクの正規表現がまとめて書かれています。elispの正規表現はこの辺(1) (2) (3)に書いてあります。

肝心のPlain text linksは以下のようになっています。

(setq
  ...
  org-plain-link-re
 (concat   "\\<" types-re ":"
  "\\([^ \t\n()<>]+\\(?:([[:word:]0-9_]+)\\|\\([^[:punct:] \t\n]\\|/\\)\\)\\)")
  ...)

types-reはletによって以下のようにバインドされています。

(types-re (regexp-opt (org-link-types) t))

org-link-typesは関数です。

(defun org-link-types ()
  "Return a list of known link types."
  (mapcar #'car org-link-parameters))

org-link-parametersは以下です。

(defcustom org-link-parameters
  '(("doi" :follow org--open-doi-link)
    ("elisp" :follow org--open-elisp-link)
    ("file" :complete org-file-complete-link)
    ("ftp" :follow (lambda (path) (browse-url (concat "ftp:" path))))
    ("help" :follow org--open-help-link)
    ("http" :follow (lambda (path) (browse-url (concat "http:" path))))
    ("https" :follow (lambda (path) (browse-url (concat "https:" path))))
    ("mailto" :follow (lambda (path) (browse-url (concat "mailto:" path))))
    ("message" :follow (lambda (path) (browse-url (concat "message:" path))))
    ("news" :follow (lambda (path) (browse-url (concat "news:" path))))
    ("shell" :follow org--open-shell-link))

doi、elisp、file、...となっている部分がミソです。Org modeでこれらの文字列の後に:が続いてdoi:<パス>などとなった場合にPlain text linksとして認識されるようです。

その他、org-activate-plain-linksの中にadd-text-propertiesがあるので、ここで文書をハイライトしているようです。

このあたりまで調べたところで上述の解決策で何とかなることに気がつきました。