如何使用外部程序作为从Emacs打开PDF的默认方法?


42

当我M-x find-file打开PDF时,它将在Emacs中打开。虽然这很好,但是Emacs的PDF查看器缺少我需要的许多功能,因此我宁愿在外部程序中打开PDF。如何配置Emacs以将外部程序用作PDF的默认查看器?

Answers:


34

尝试openwith。以下代码将启用它,并允许您使用打开PDF evince(更改为您喜欢的PDF查看器):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))

1
我很惊讶如此简单的东西需要第三方软件包。但这有效,谢谢!
tmalsburg 2014年

不需要它(请参阅Drew的答案),但这是一种不错且干净的方法。请注意,如果您使用它,它可能会与其他程序(例如音乐阅读器(mpg123))冲突。
Ehvince 2014年

此解决方案有问题。当您与混淆时,似乎有些软件包不喜欢它find-file。例如,发送带有附件PDF的电子邮件(通过mu4e)导致附件PDF在外部编辑器中打开,并且发送失败(有关详细信息,请参见此处)。
tmalsburg 2014年

1
@tmalsburg:看看这个SO线程,讨论电子邮件附件的问题以及该特定用例的解决方案。

我只是编写了一些代码来建议无法使用的命令openwith-mode将其关闭:请参见本要点
奥马尔

21

如果要查看具有许多功能的PDF(突出显示搜索,突出显示选择,注释,内容树),请使用pdf-tools。如您在演示中所看到,我可以将Isearch与突出显示一起使用。Emacs现在是我最喜欢的PDF阅读器。您也可以使用Bookmark(+)为特定的PDF页面添加书签。

编辑:如果您使用helm并想使用外部程序,helm则在操作菜单中已经有一个用于打开外部文件的:Open file externally C-c C-x. C-u to choose again。它的作用是提供系统中所有可用程序的列表,并为您提供一个不错的Helm界面供您选择;选择后,Helm会记住它,直到您运行带有prefix参数的命令C-u以选择一个新命令为止。


3
+1我非常感谢您提到我pdf-tools!惊人的包。爱它!您的演示也很棒,尽管它只是刮擦了一切的可能……:)
itsjeyd 2014年

pdf-tools似乎无法通过标准软件包管理器获得,并且安装过程似乎不适用于emacs 24.4:/
Clément14年

这个对我有用。但是pdf-tools在安装和使用Emacs Lisp部分之前,您必须克隆存储库并编译并在Emacs可以看到二进制文件的任何地方安装C部分。
Tu Do

pdf工具是否允许您突出显示(即以黄色显示)单词和短语(或否)?
白炽灯

11

你问了一下find-file。除了其他人(例如Dan)所说的那样,还应该了解如何使用与option中与文件类型(例如,扩展名)相关联的应用程序打开文件dired-guess-shell-alist-user。而且,如果您在MS Windows上使用Emacs,那么有必要知道如何使用Windows文件关联打开文件。

dired-guess-shell-alist-user加载标准库后,可以使用该选项dired-x.el。PDF文件的默认关联在变量中定义dired-guess-shell-alist-default,并且是程序的xpdf(在UNIX和GNU / Linux上可用)。dired-guess-shell-alist-user例如,通过使用选项,您可以通过将以下关联添加到清单中来将其与Adobe Acrobat Reader关联("\.pdf$" . "AcroRd32.exe")

然后,您可以使用来打开Dired中的PDF文件!。它将默认程序提供为“猜测”,您可以通过重复访问M-n。因此!,如果point在PDF文件名上并且该命令/程序与regexp关联,那么后面M-n将给您提供shell命令。AcroRd32.exe\.pdf$

除了Dired之外,您还可以将文件关联dired-guess-shell-alist-user用作书签文件处理程序,即,如果您使用库Bookmark +,则使PDF文件关联对所有指向PDF文件的书签都生效。的当前值dired-guess-shell-alist-user用作option的默认值bmkp-default-handlers-for-file-types,它控制着它。

您可以想到选项dired-guess-shell-alist-userbmkp-default-handlers-for-file-types并且有点像auto-mode-alist。但是它们将文件名模式映射到文件操作,而不是将它们映射到缓冲模式。并且仅当您使用某些命令时它们才会生效。

如果使用MS Windows,则在Dired或“跳转”到书签中打开文件时,可以(也可以)利用现有的Windows文件关联。为此,您需要图书馆w32-browser.el

对于Dired,您还需要Dired +库-请参阅使用Dired中的Windows文件关联。对于书签,您还需要Bookmark + -请参阅使用Emacs无法访问的文件添加书签使用Windows File Associations打开书签


3

我正在使用Runner。这是我的配置文件的摘录

    (defun my:open-file-with-dired (file)
      "Ask dired how it would open FILE.
This code is useful if dired is well configured to open files
with external applications. I recommend using the `runner`
package to do so."
      (use-package dired-aux)
      (dired-do-async-shell-command
       (dired-guess-shell-command (format  "Open %s " file) (list file))
       0
       (list file)))

    (add-to-list 'org-file-apps '(t . (my:open-file-with-dired file)))
    (add-to-list 'org-file-apps '("\\.png\\'" . default))

0

我无需任何插件即可实现此目标的方法如下。我在Ubuntu 16.04 LTS下运行Emacs 25.3。如果您的操作系统是macOS或Windows,则肯定需要更改xdg-open 此处定义的第一个功能。我发现此链接非常有用。

(defun xdg-open (filename)
  (interactive "fFilename: ")
  (let ((process-connection-type))
    (start-process "" nil "xdg-open" (expand-file-name filename))))

(defun find-file-auto (orig-fun &rest args)
  (let ((filename (car args)))
    (if (cl-find-if
         (lambda (regexp) (string-match regexp filename))
         '("\\.pdf\\'" "\\.docx?\\'"))
        (xdg-open filename)
      (apply orig-fun args))))

(advice-add 'find-file :around 'find-file-auto)

加载上述代码后,当您按下C-x C-f以获取PDF和Word文件时,它将使用系统默认应用程序自动打开文件。

我真的很喜欢Emacs提供的建议机制,请参阅(elisp)Advising Functions。通过以兼容的方式建议现有功能,可以避免将常见的键重新绑定C-x C-f到新功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.