Comment utiliser un programme externe comme méthode par défaut pour ouvrir des PDF à partir d'Emacs?

42

Quand je suis M-x find-fileun PDF, il est ouvert dans Emacs. Bien que cela soit agréable, le visualiseur de PDF d'Emacs manque de nombreuses fonctionnalités dont j'ai besoin et je préférerais ouvrir les PDF dans un programme externe. Comment puis-je configurer Emacs pour utiliser un programme externe comme visualiseur par défaut pour les PDF?

Tmalsburg
la source

Réponses:

34

Essayez openwith. Le code suivant l'activera et vous permettra d'ouvrir les PDF avec evince(changer de lecteur de PDF préféré):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
Dan
la source
1
Je suis surpris qu'un package tiers soit nécessaire pour quelque chose d'aussi simple que cela. Mais ça marche, merci!
Tmalsburg
Ce n'est pas nécessaire (voir la réponse de Drew) mais c'est une façon agréable et propre de le faire. Notez qu'il peut éventuellement entrer en conflit avec d'autres programmes, comme un lecteur de musique (mpg123), si vous en utilisez un.
Ehvince
Cette solution a des problèmes. Il semble que certains paquets ne l’aiment pas quand on joue avec find-file. Par exemple, l'envoi d'e-mails avec des fichiers PDF joints (via mu4e) entraîne l'ouverture du fichier PDF joint dans l'éditeur externe et l'échec de l'envoi (voir ici pour plus de détails).
Tmalsburg
1
@tmalsburg: jetez un oeil à ce fil SO pour discuter du problème des pièces jointes et d'une solution dans ce cas d'utilisation particulier.
Dan
Je viens d' écrire un peu de code pour conseiller les commandes qui ne fonctionnent pas avec openwith-modede l' éteindre: voir ce point essentiel .
Omar
21

Si vous souhaitez afficher un PDF comportant de nombreuses fonctionnalités (sélection de la recherche, sélection de la sélection, annotation, arborescence du contenu), utilisez les outils pdf . Comme vous pouvez le voir dans la démo , je peux utiliser Isearch avec la surbrillance. Emacs est maintenant mon lecteur PDF préféré. Vous pouvez également créer un signet pour une page PDF spécifique en utilisant Signet (+).

EDIT : Si vous utilisez helmet que vous voulez utiliser le programme externe, helma déjà un dans le menu d'action pour ouvrir un fichier externe: Open file externally C-c C-x. C-u to choose again. Qu'est-ce que cela fait qu'il offre une liste de tous les programmes disponibles dans votre système et vous présente une belle interface Helm parmi laquelle vous pourrez faire votre choix; Une fois que vous avez sélectionné, Helm s'en souvient jusqu'à ce que vous exécutiez la commande avec l'argument préfixe C-upour en sélectionner un nouveau.

Tu Do
la source
3
+1 je ne peux pas vous remercier assez pour mentionner pdf-tools!! Forfait incroyable. Aimer! Votre démo est également excellente, même si elle ne fait
qu'effleurer
Cependant, pdf-tools ne semble pas disponible par le biais des gestionnaires de paquets standard, et la procédure d'installation ne semble pas fonctionner avec emacs 24.4: /
Clément
Ça marche pour moi. Mais vous devez cloner le pdf-toolsréférentiel, compiler et installer la partie C partout où votre Emacs peut voir le fichier binaire, avant d'installer et d'utiliser la partie Lisp d'Emacs.
Tu Do
Les outils pdf vous permettent-ils de surligner (par exemple en jaune) des mots et des phrases ou non?
incandescentman
11

Vous avez demandé à propos de find-file. En plus de ce que d’autres (par exemple, Dan) en disent, il est utile de savoir également comment ouvrir des fichiers à l’aide d’une application associée au type de fichier (par exemple, une extension) en option dired-guess-shell-alist-user. Et si vous utilisez Emacs sur MS Windows, il est utile de savoir comment ouvrir un fichier avec les associations de fichiers Windows.

L'option dired-guess-shell-alist-userest disponible après le chargement de la bibliothèque standard dired-x.el. L'association par défaut d'un fichier PDF est définie dans variable dired-guess-shell-alist-defaultet il s'agit d'un programme xpdf(disponible sous UNIX et GNU / Linux). Option à l' aide que dired-guess-shell-alist-uservous pouvez, par exemple, l' associer à la place avec Adobe Acrobat Reader en ajoutant cette association à l'alist: ("\.pdf$" . "AcroRd32.exe").

Ensuite, vous pouvez ouvrir un fichier PDF dans Dired simplement en utilisant !. Cela fournit des programmes par défaut sous forme de "suppositions", auxquelles vous pouvez accéder en répétant M-n. Donc !suivi de M-nvous donnera la commande shell AcroRd32.exesi point est sur un nom de fichier PDF et si cette commande / programme est associé à regexp \.pdf$.

En plus de Dired, vous pouvez utiliser les associations de fichiers en dired-guess-shell-alist-usertant que gestionnaire de fichiers de signets, c'est-à-dire que l'association de fichiers PDF prend effet pour tous les signets en fichiers PDF, si vous utilisez la bibliothèque Bookmark + . La valeur actuelle de dired-guess-shell-alist-userest utilisée comme valeur par défaut de l'option bmkp-default-handlers-for-file-types, qui contrôle cela.

Vous pouvez penser aux options dired-guess-shell-alist-useret bmkp-default-handlers-for-file-typesquelque peu comme analogue auto-mode-alist. Mais ils mappent les modèles de nom de fichier sur les actions de fichier au lieu de les mapper sur les modes tampon. Et ils ne prennent effet que lorsque vous utilisez certaines commandes.

Si vous utilisez MS Windows, vous pouvez à la place (ou aussi) tirer parti des associations de fichiers Windows existantes lorsque vous ouvrez un fichier dans Dired ou que vous passez à un signet. Pour cela, vous avez besoin d'une bibliothèque w32-browser.el.

Pour Dired, vous avez également besoin de la bibliothèque Dired + - voir Utilisation des associations de fichiers Windows dans Dired . Pour les signets, vous avez également besoin de Bookmark + - consultez la section Signalisation de fichiers que vous ne pouvez pas visiter avec Emacs et Ouverture de signets à l'aide d'associations de fichiers Windows .

A dessiné
la source
3

J'utilise runner . Voici un extrait de mon fichier de configuration

    (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
la source
0

Ma façon de réaliser ceci sans aucun plugin est la suivante. Je lance Emacs 25.3 sous Ubuntu 16.04 LTS. Si votre système d'exploitation est macOS ou Windows, vous devez absolument modifier la première fonction xdg-open définie ici. J'ai trouvé ce lien très utile comme point de départ.

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

Une fois le code ci-dessus chargé, lorsque vous appuyez sur C-x C-fpour les fichiers PDF et Word, le fichier sera automatiquement ouvert à l'aide de l'application par défaut du système.

J'aime beaucoup le mécanisme de conseil fourni par Emacs, voir Fonctions de conseil (elisp) . En conseillant la fonction existante de manière compatible, j'évite de relier des clés communes comme C-x C-fpour une nouvelle fonction.

Lei Zhao
la source