org-mode に Chrome で開いてるページへのリンクを貼りたい

org-mode のリンクマークアップはちょっと特殊で、エスケープの仕様も独特です。

また、 2019年の12月にリリースされたバージョン 9.3 で後方互換性の無い仕様変更が入る ということも有りました。

Version 9.3

Incompatible changes

Change bracket link escaping syntax Org used to percent-encode sensitive characters in the URI part of the bracket links.

Now, escaping mechanism uses the usual backslash character, according to the following rules, applied in order:

(defun org-link-unescape (link)
  "Remove escaping backslash characters from string LINK."
  (replace-regexp-in-string
   (rx (group (one-or-more "\\")) (or string-end (any "[]")))
   (lambda (_)
     (concat (make-string (/ (- (match-end 1) (match-beginning 1)) 2) ?\\)))
   link nil t 1))
ソースコード 1: (参考) org-mode 9.3 でのエスケープ実装

こういう背景もあり、 org-mode の外で工夫して org-mode 形式のリンクを生成するよりは、 org-mode 自体に任せてしまうのが安心です。

org-cliplink というパッケージもありますが、これだとログインが必要なページへのリンクは (Basic 認証を設定していなければ)生成出来ません。

もっと手軽に、 Chrome で見ているページへのリンクを挿入する手段として、 CreateLink という Chrome 拡張機能を使う方法があります。

以下のように改行区切りでコピーするような設定を追加します:

%text%%newline%%url%

CreateLink の %text% は改行をスペースに変換する仕様になっているので、区切り文字として改行を利用するのは安全なハズです。

そして、以下のような独自関数を定義します:

(require 's)

(defun ytn-org-insert-weblink ()
  (interactive)
  (let* ((pair (s-split "\n" (with-temp-buffer (clipboard-yank) (buffer-string))))
         (desc (first pair))
         (link (second pair)))
    (insert (org-make-link-string link desc))))

単純に改行で区切って org-make-link-string に渡すだけです。

これを、個人的には M-L にアサインしています( use-packagebind-key を利用しています):

(bind-key "M-L" #'ytn-org-insert-weblink org-mode-map)

以上、ちょっとした小ネタでした。

yewton
ソフトウェアエンジニア

父親兼エンジニア

comments powered by Disqus

関連項目