Skip to content

Latest commit

 

History

History
130 lines (100 loc) · 5.3 KB

1410110752.org-confirm-elisp-link-function.org

File metadata and controls

130 lines (100 loc) · 5.3 KB

Emacs org-modeのelisp・shellリンクを快適かつ安全に実行する方法

org-mode はハイパーリンク機能も装備しています。

つまり、Wikiのような記法でリンクを書くことができ、 リンク先へジャンプできるのです。

リンク先はファイルはもちろんのこと、 メール(mewGNUSWL)、 シェルコマンド、 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