【问题标题】:How do I make Org-mode open PDF files in Evince?如何在 Evince 中以 Org 模式打开 PDF 文件?
【发布时间】: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。

【问题讨论】:

    标签: pdf emacs org-mode


    【解决方案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-hookeval-after-load 之间的区别在 here 中进行了解释。

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

    (if (assoc 添加到PDF 条目不会造成任何损害,它只会确保如果PDF 从默认org-file-apps 中删除,它仍然会被添加。如果删除 PDF,唯一不会失败的解决方案是您的第二个解决方案。其他人都假设条目以一种或另一种形式存在。

    【讨论】:

    • 我有时会在会话中多次为缓冲区加载 org-mode。这会影响这个解决方案吗?还是只是我使用org-reload?另外,我可以为 pdf 添加一个(if (assoc 结构以使其成为未来的证明吗?
    • @N.N 在应该回答该问题的编辑中添加了一些细节。
    • 感谢您的详细说明。这个解决方案是迄今为止最优雅的。
    【解决方案2】:

    您可以使用类似于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 做一些更优雅的事情。
    • @当然我添加了一些可能更优雅的东西。
    • 您的解决方案看起来应该可以胜任!我不了解 elisp,所以我很高兴在 Emacs 中拥有自定义系统,但它并非没有缺陷。我希望有一天会有一个更高级的工具来组织和跟踪 emacs 中的偏好,具有更直观的界面。有一些项目指向这个方向,但 AFAIK 没有什么是真正方便的。
    【解决方案3】:
    M-x customize-variable [RET] org-file-apps [RET]
    

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

    尝试添加这一行:

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

    【讨论】:

    • 有没有我可以添加到我的 .emacs 而不必使用 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多