別の可能な構造になり、このために働くことができます:醜いようだ
別のオプションは、代わりにデフォルト値を検索し、それらすべてのことを設定しますが、PDFファイルの値を変更することですadd-hook
ではなくeval-after-load
を使用してください。起動時に一度だけ値を設定するので、(orgを定期的にリロードしない限り)追加されているかどうか心配する必要はありません。
setcdr
と組み合わせてリストから削除してから再度追加することを避けてif
を追加すると、値を追加したり変更したりすることができます。 ifは、デフォルトでリストにない値に対してのみ必要です。行の下のどこかで競合が発生しないようにするためです。
(eval-after-load "org"
'(progn
;; .txt files aren't in the list initially, but in case that changes
;; in a future version of org, use if to avoid errors
(if (assoc "\\.txt\\'" org-file-apps)
(setcdr (assoc "\\.txt\\'" org-file-apps) "notepad.exe %s")
(add-to-list 'org-file-apps '("\\.txt\\'" . "notepad.exe %s") t))
;; Change .pdf association directly within the alist
(setcdr (assoc "\\.pdf\\'" org-file-apps) "evince %s")))
明確化
eval-after-load
ための編集のみ(require 'org)
が呼び出されたブロックを評価します。 orgが既にロードされている場合、すぐに評価されます(私は誤ってライブラリがロードされるたびに実行されると考えましたが、初めてのようです)。 add-hook
とeval-after-load
の違いはhereです。 org-file-apps
以来
は、あなたがそれらを設定した場合、組織がロードされる前に、あなたは(2番目の(醜い)溶液中で、デフォルトの値を含む)最初からリストを構築する場合、それはあなたができただけでsetq
で、値を変更しませんdefcustom
ですあなたのinit.elとすべてがうまくいくでしょう。また、変更が上書きされないことを意味します。
(if (assoc
をPDFエントリに追加しても問題はありませんが、PDFがデフォルトのorg-file-apps
から削除されてもそれが確実に削除されることを保証します。 PDFを削除しても失敗しない唯一のソリューションは、2番目のソリューションです。他の人はすべて、そのエントリーが1つの形式または別の形式で存在すると仮定します。
私は時々、セッションのバッファにorg-modeを数回ロードします。それがこの解決策に影響しますか?それとも、 'org-reload'を使うのですか?また、 '(if(assoc'構造体を追加して将来の証明にすることができますか? –
@NNは、その質問に答えるべき編集内容をいくつか追加しました) –
この解決策はこれまでのところ最もエレガントです。 –