Wie verwende ich ein externes Programm als Standardmethode zum Öffnen von PDFs aus Emacs?

42

Wenn ich M-x find-fileein PDF, wird es in Emacs geöffnet. Obwohl dies nett ist, fehlen Emacs 'PDF-Viewer viele Funktionen, die ich benötige, und ich würde es vorziehen, PDFs stattdessen in einem externen Programm zu öffnen. Wie kann ich Emacs so konfigurieren, dass ein externes Programm als Standardanzeige für PDFs verwendet wird?

Tmalsburg
quelle

Antworten:

34

Versuchen Sie es openwith. Mit dem folgenden Code wird es aktiviert und Sie können PDFs mit öffnen evince(zu Ihrem bevorzugten PDF-Viewer wechseln):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
Dan
quelle
1
Ich bin überrascht, dass für so etwas Einfaches ein Drittanbieterpaket benötigt wird. Aber es funktioniert, danke!
Tmalsburg
Es wird nicht benötigt (siehe Drews Antwort), aber es ist eine schöne und saubere Art, es zu tun. Beachten Sie, dass es möglicherweise zu Konflikten mit anderen Programmen (z. B. einem Musiklesegerät (mpg123)) kommt, wenn Sie eines verwenden.
Ehvince
Diese Lösung hat Probleme. Es scheint, dass einige Pakete es nicht mögen, wenn Sie mit verwirren find-file. Wenn Sie beispielsweise E-Mails mit angehängten PDF-Dateien senden (über mu4e), wird die angehängte PDF-Datei im externen Editor geöffnet und der Versand schlägt fehl (siehe hier für Details).
Tmalsburg
1
@tmalsburg: Schauen Sie sich diesen SO-Thread an , in dem das Problem mit E-Mail-Anhängen und eine Lösung für diesen speziellen Anwendungsfall diskutiert werden.
Dan
Ich habe nur ein bisschen Code geschrieben, um die Befehle, mit denen es nicht funktioniert openwith-mode, anzuweisen, es zu deaktivieren : siehe folgende Übersicht .
Omar
21

Wenn Sie PDF mit vielen Funktionen anzeigen möchten (Suche hervorheben, Auswahl hervorheben, Anmerkungen hinzufügen, Inhaltsbaum), verwenden Sie PDF-Tools . Wie Sie in der Demo sehen können , kann ich Isearch mit Hervorhebung verwenden. Emacs ist jetzt mein Lieblings-PDF-Reader. Sie können bestimmte PDF-Seiten auch mit einem Lesezeichen (+) versehen.

EDIT : Wenn Sie helmmögen externes Programm verwenden, helmhat bereits eine im Aktionsmenü für die externe Datei zu öffnen: Open file externally C-c C-x. C-u to choose again. Was es bewirkt, ist, dass es eine Liste aller verfügbaren Programme in Ihrem System bietet und Ihnen eine schöne Helm-Oberfläche zur Auswahl bietet. Sobald Sie ausgewählt haben, merkt sich Helm, bis Sie den Befehl mit dem Präfix-Argument ausführen C-u, um einen neuen auszuwählen.

Tu Do
quelle
3
+1 Ich kann dir nicht genug für die Erwähnung danken pdf-tools!! ERSTAUNLICHES Paket. Liebe es! Ihre Demo ist auch großartig, obwohl sie nur die Oberfläche des Möglichen zerkratzt ... :)
itsjeyd
pdf-tools scheinen jedoch nicht über Standard-Paketmanager verfügbar zu sein, und der Installationsvorgang scheint mit Emacs 24.4: /
Clément
Für mich geht das. Aber Sie müssen das pdf-toolsRepo klonen und den C-Teil kompilieren und installieren, wo immer Ihr Emacs die Binärdatei sehen kann, bevor Sie den Emacs-Lisp-Teil installieren und verwenden.
Tu Do
Können Sie mit PDF-Tools Wörter und Ausdrücke (dh in Gelb) hervorheben oder nein?
Glühbirne
11

Sie fragten nach find-file. Zusätzlich zu dem, was andere (z. B. Dan) dazu sagen, lohnt es sich, das Öffnen von Dateien mit einer Anwendung zu kennen, die dem Dateityp (z. B. Erweiterung) in Option zugeordnet ist dired-guess-shell-alist-user. Und wenn Sie Emacs unter MS Windows verwenden, sollten Sie wissen, wie Sie eine Datei mit Windows-Dateizuordnungen öffnen.

Die Option dired-guess-shell-alist-userist verfügbar, nachdem Sie die Standardbibliothek geladen haben dired-x.el. Die Standardzuordnung einer PDF-Datei wird in Variable definiert dired-guess-shell-alist-defaultund ist Programm xpdf(verfügbar unter UNIX und GNU / Linux). Mit der Option dired-guess-shell-alist-userkönnen Sie zum Beispiel verbinden sie stattdessen mit Adobe Acrobat Reader , indem Sie diese Zuordnung zu dem alist fügt hinzu: ("\.pdf$" . "AcroRd32.exe").

Dann können Sie eine PDF-Datei in Dired öffnen, indem Sie einfach verwenden !. Das liefert Standardprogramme als "Vermutungen", auf die Sie durch Wiederholen zugreifen können M-n. So !gefolgt von M-nwerden Sie den Shell - Befehl geben , AcroRd32.exewenn der Punkt auf einen Namen PDF - Datei ist und wenn das Kommando / Programm mit regexp zugeordnet \.pdf$.

Zusätzlich zu Dired können Sie die Dateizuordnungen in dired-guess-shell-alist-userals Lesezeichen- Dateihandler verwenden, dh, die PDF-Dateizuordnung wird für alle Lesezeichen zu PDF-Dateien wirksam, wenn Sie die Bibliothek Bookmark + verwenden . Der aktuelle Wert von dired-guess-shell-alist-userwird als Standardwert der Option verwendet bmkp-default-handlers-for-file-types, die dies steuert.

Sie können Optionen dired-guess-shell-alist-userund bmkp-default-handlers-for-file-typesals etwas analog zu denken auto-mode-alist. Sie ordnen Dateinamenmuster jedoch Dateiaktionen zu, anstatt sie den Puffermodi zuzuordnen. Und sie werden nur wirksam, wenn Sie bestimmte Befehle verwenden.

Wenn Sie MS Windows verwenden, können Sie stattdessen (oder auch) vorhandene Windows-Dateizuordnungen nutzen, wenn Sie eine Datei in Dired öffnen oder zu einem Lesezeichen "springen". Hierfür benötigen Sie eine Bibliothek w32-browser.el.

Für Dired benötigen Sie auch die Bibliothek Dired + - siehe Verwenden von Windows-Dateizuordnungen in Dired . Für Lesezeichen benötigen Sie außerdem Bookmark + - siehe Lesezeichen für Dateien, die Sie nicht mit Emacs besuchen können, und Öffnen von Lesezeichen mit Windows-Dateizuordnungen .

Drew
quelle
3

Ich benutze Läufer . Hier ist ein Auszug meiner Konfigurationsdatei

    (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))
Damien Cassou
quelle
0

Mein Weg, dies ohne Plugins zu erreichen, ist der folgende. Ich verwende Emacs 25.3 unter Ubuntu 16.04 LTS. Wenn Sie ein MacOS- oder Windows-Betriebssystem haben, müssen Sie auf jeden Fall die erste xdg-open hier definierte Funktion ändern . Ich fand diesen Link als Ausgangspunkt sehr hilfreich.

(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)

Wenn Sie nach dem Laden des obigen Codes C-x C-fauf PDF- und Word-Datei klicken, wird die Datei automatisch mit der Systemstandard-App geöffnet.

Ich mag den von Emacs bereitgestellten Beratungsmechanismus sehr , siehe (elisp) Beratungsfunktionen . Indem ich vorhandene Funktionen auf kompatible Weise berate, vermeide ich das erneute Verknüpfen von allgemeinen Schlüsseln C-x C-fmit neuen Funktionen.

Lei Zhao
quelle