【发布时间】:2012-02-08 17:10:36
【问题描述】:
在 Org 模式下,当我尝试打开 PDF 文件的链接时,没有任何反应。此外,当我执行 C-c C-e d 以导出为 LaTeX 并处理为 PDF 并打开 PDF 时,生成但未打开。如何在 Evince 中以 Org 模式打开 PDF 文件?
我在 GNU Emacs 23.3.1 中使用 Org-mode 7.6,在 Ubuntu 11.10 中使用 Evince 3.2.1。
【问题讨论】:
在 Org 模式下,当我尝试打开 PDF 文件的链接时,没有任何反应。此外,当我执行 C-c C-e d 以导出为 LaTeX 并处理为 PDF 并打开 PDF 时,生成但未打开。如何在 Evince 中以 Org 模式打开 PDF 文件?
我在 GNU Emacs 23.3.1 中使用 Org-mode 7.6,在 Ubuntu 11.10 中使用 Evince 3.2.1。
【问题讨论】:
另一种可行的结构是使用eval-after-load 而不是add-hook。它只会在启动时设置一次值,您不必担心是否添加条目(除非您定期重新加载 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 是defcustom,如果您在加载 org 之前设置它们不会更改值,如果您从头开始构建列表(包括您的第二个(更丑的)解决方案中的默认值),您可以只需 setq 在您的 init.el 中,一切都会正常工作。这也意味着它不会覆盖您的更改。
将(if (assoc 添加到PDF 条目不会造成任何损害,它只会确保如果PDF 从默认org-file-apps 中删除,它仍然会被添加。如果删除 PDF,唯一不会失败的解决方案是您的第二个解决方案。其他人都假设条目以一种或另一种形式存在。
【讨论】:
org-reload?另外,我可以为 pdf 添加一个(if (assoc 结构以使其成为未来的证明吗?
您可以使用类似于https://stackoverflow.com/a/3985552/789593 的构造,但将其调整为适用于 PDF 文件和 Evince。您要做的是更改列表org-file-apps。这可以通过将以下内容添加到您的 .emacs 来完成:
;; PDFs visited in Org-mode are opened in Evince (and not in the default choice) https://stackoverflow.com/a/8836108/789593
(add-hook 'org-mode-hook
'(lambda ()
(delete '("\\.pdf\\'" . default) org-file-apps)
(add-to-list 'org-file-apps '("\\.pdf\\'" . "evince %s"))))
这将删除 PDF 文件的默认设置,而是在 Evince 中打开它们(并保留 org-file-apps 中包含的所有其他内容)。我是 elisp 的新手,所以我不知道这个解决方案是否强大,但它对我有用,而且似乎比下面的那个更优雅。
另一个看起来更丑陋的选择是查找默认值并设置它们,但更改 PDF 文件的值:
;; PDFs visited in Org-mode are opened in Evince (and other file extensions are handled according to the defaults)
(add-hook 'org-mode-hook
'(lambda ()
(setq org-file-apps
'((auto-mode . emacs)
("\\.mm\\'" . default)
("\\.x?html?\\'" . default)
("\\.pdf\\'" . "evince %s")))))
【讨论】:
append 每次调用 org-mode 时都会添加条目,这会淹没变量。也许我可以用add-to-list 做一些更优雅的事情。
M-x customize-variable [RET] org-file-apps [RET]
如果 org 使用您的系统默认设置,您必须编辑您的 ./mailcap 文件。
尝试添加这一行:
application/pdf; /usr/bin/evince %s
【讨论】:
M-x customize-variable [RET] org-file-apps [RET] 的行?
org-file-apps 根据find-variable 包括("\\.pdf\\'" . default)。
(setq org-file-apps...) 的行向您的.emacs 添加一些内容,但我不明白您为什么不根据需要设置变量。如果你尝试F1 v org-file-apps,出现的第一个例子就是Example: ("pdf" . "evince %s") to open PDFs with evince. 所以请查看帮助文件并尝试将其设置为evince。
customize-variable 并添加evince %s 用于pdf 作品。但是我认为customize-variable 混淆了.emacs,所以我想出了一个没有customize-variable 的解决方案,请参阅我的答案stackoverflow.com/a/8836108/789593。