如何在Evince中创建组织模式打开PDF文件?

时间:2012-01-12 11:51:45

标签: pdf emacs org-mode

在Org-mode中,当我尝试打开PDF文件的链接时,没有任何反应。此外,当我执行 C-c C-e d 导出为LaTeX并处理为PDF并打开PDF时生成但未打开。如何在Evince中制作组织模式打开PDF文件?

我在GNU Emacs 23.3.1中使用Org-mode 7.6,在Ubuntu 11.10中使用Evince 3.2.1。

3 个答案:

答案 0 :(得分:21)

M-x customize-variable [RET] org-file-apps [RET]

如果org使用您的系统默认值,则必须编辑./mailcap文件。

尝试添加此行:

application/pdf; /usr/bin/evince %s

答案 1 :(得分:11)

可能适用于此的另一种可能的构造是使用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-hookeval-after-load之间的差异被解释为here

由于org-file-appsdefcustom,如果您在加载org之前设置它们,它将不会更改值,如果您从头开始构建列表(包括默认值,如第二个(丑陋)解决方案)您可以在init.el中简单地setq,一切都会起作用。这也意味着它不会覆盖您的更改。

(if (assoc添加到PDF条目不会对任何内容产生任何影响,只会确保从默认org-file-apps中删除的PDF仍然会被添加。如果删除PDF,唯一不会失败的解决方案是您的第二个解决方案。其他人都假设条目以某种形式存在。

答案 2 :(得分:9)

您可以使用类似于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")))))