org-mode はハイパーリンク機能も装備しています。
つまり、Wikiのような記法でリンクを書くことができ、 リンク先へジャンプできるのです。
リンク先はファイルはもちろんのこと、 メール(mew 、 GNUS 、 WL)、 シェルコマンド、 GNU Screen 、 Emacs Lispコード へのリンクも作成できます。
[[shell:ls -l]]
[[elisp:(message "ok")]]
しかし、シェルコマンドやEmacs Lispへのリンクを無闇に踏むのはとても危険です。
なぜなら、rm -rf /を実行するリンクも作成可能だからです。
リンクにはラベルも指定できるので、 リンク先のコードが見えない状態で 危険なリンクを踏んでしまうこともあります。
とくに他の人からorgファイルをもらったとき、 彼に悪意があって、そのリンクを踏んでしまったら…
やばいですね
そこでorg-modeのデフォルトの設定では安全側に倒してあり、 Emacs Lisp、シェルコマンドへのリンクを実行する際、 「このリンクを実行しますか?」とyes/noで訊いてきます。
かといって、こういうリスクはあるものの日常的ではないので かえってうざったいと思うのが普通ですよね。
たとえば、ls -lへのリンク
[[shell:ls -l]]
は安全なのに
Execute "ls -l" in shell? (yes or no) yes
と尋ねられるのは嫌ですよね。
訊くのを全面的にやめさせるにはこうするのですが、
(setq org-confirm-elisp-link-function nil)
(setq org-confirm-shell-link-function nil)
これではセキュリティリスクを負います。
org-mode開発者側はこの問題を認識していて、
- org-confirm-elisp-link-not-regexp
- org-confirm-shell-link-not-regexp
という変数を用意することで正規表現に マッチするリンクは尋ねないようにしています。
それでも安全な正規表現を用意・更新するのは面倒です。
そこで、新しいルールとして 自分が作成したorgファイルは安全 ということにしてしまいましょう。
特定のディレクトリに配置してあるorgファイルや 特定のバッファ名に限っては安全とみなします。
ここでは
"/sync/memo/\\|/sync/junk/"
を満たすディレクトリと *trace-output*バッファを安全とみなし、 それ以外のorgバッファは危険とみなします。
なお、*trace-output*を安全にしているのは *trace-output*をorg-modeにする設定 のためです。
こうしておけば、自分が書いたorg文書をそのディレクトリに 放り込んでおくだけでいいので、 いちいち尋ねられる煩わしさから解放されます。
(defun org-confirm-elisp-link-function--no-confirm-my-org-file (prompt)
"自分が書いたorgファイルの(のディレクトリにある)elispリンクはconfirmなし。
それ以外のディレクトリではconfirmする。"
(or (string-match "/sync/memo/\\|/sync/junk/" (or (buffer-file-name) ""))
(member (buffer-name) '("*trace-output*"))
(y-or-n-p prompt)))
(setq org-confirm-elisp-link-function
'org-confirm-elisp-link-function--no-confirm-my-org-file)
(setq org-confirm-shell-link-function
'org-confirm-elisp-link-function--no-confirm-my-org-file)
$ wget http://rubikitch.com/f/141011075230.org-confirm-elisp-link-function.1.el $ emacs -Q -f package-initialize -l 141011075230.org-confirm-elisp-link-function.1.el