¿Cómo usar un programa externo como la forma predeterminada de abrir archivos PDF desde Emacs?

42

Cuando hago M-x find-fileun PDF, se abre en Emacs. Si bien esto es bueno, el visor de PDF de Emacs carece de muchas características que necesito y preferiría abrir archivos PDF en un programa externo. ¿Cómo puedo configurar Emacs para usar un programa externo como el visor predeterminado para archivos PDF?

Tmalsburg
fuente

Respuestas:

34

Tratar openwith. El siguiente código lo habilitará y le permitirá abrir archivos PDF con evince(cambie a su visor de PDF favorito):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
Dan
fuente
1
Me sorprende que se necesite un paquete de terceros para algo tan simple como eso. Pero funciona, gracias!
Tmalsburg el
No es necesario (ver la respuesta de Drew) pero es una forma agradable y limpia de hacerlo. Tenga en cuenta que posiblemente entrará en conflicto con otros programas, como un lector de música (mpg123) si usa uno.
Ehvince
Esta solución tiene problemas. Parece que a algunos paquetes no les gusta cuando juegas find-file. Por ejemplo, el envío de correos electrónicos con archivos PDF adjuntos (a través de mu4e) hace que el PDF adjunto se abra en el editor externo y el envío falla (consulte aquí para más detalles).
tmalsburg el
1
@tmalsburg: eche un vistazo a este hilo SO que discute el problema con los archivos adjuntos de correo electrónico y una solución en ese caso de uso particular.
Dan
Acabo de escribir un poco de código para avisar a los comandos que no funcionan openwith-modepara desactivarlo: vea esta idea .
Omar
21

Si desea ver PDF con muchas funciones (resaltar búsqueda, resaltar selección, anotar, árbol de contenido), use herramientas pdf . Como puede ver en la demostración , puedo usar Isearch con resaltado. Emacs es ahora mi lector de PDF favorito. También puede marcar una página PDF específica mediante el uso de Marcador (+).

EDITAR : si utiliza helmy desea usar un programa externo, helmya tiene uno en el menú de acciones para la apertura de un archivo externo: Open file externally C-c C-x. C-u to choose again. Lo que hace es que ofrece una lista de todos los programas disponibles en su sistema y le presenta una agradable interfaz Helm para seleccionar; una vez que selecciona, Helm lo recuerda hasta que ejecuta el comando con el argumento prefijo C-upara seleccionar uno nuevo.

Tu Do
fuente
3
+1 ¡No puedo agradecerles lo suficiente por mencionarlo pdf-tools! Paquete increíble. ¡Quiéralo! Su demo también es excelente, aunque solo rasca la superficie de lo que es posible ... :)
itsjeyd
Sin embargo, pdf-tools no parece estar disponible a través de los administradores de paquetes estándar, y el procedimiento de instalación no parece funcionar con emacs 24.4: /
Clément
Esto funciona para mi. Pero debe clonar el pdf-toolsrepositorio y compilar e instalar la parte C en cualquier lugar donde sus Emacs puedan ver el binario, antes de instalar y usar la parte Emacs Lisp.
Tu Do
¿Las herramientas pdf le permiten resaltar (es decir, en amarillo) palabras y frases o no?
incandescentman
11

Usted preguntó find-file. Además de lo que otros (por ejemplo, Dan) dicen sobre eso, también vale la pena saber acerca de cómo abrir archivos usando una aplicación asociada con el tipo de archivo (por ejemplo, extensión) en la opción dired-guess-shell-alist-user. Y si usa Emacs en MS Windows, entonces vale la pena saber cómo abrir un archivo usando asociaciones de archivos de Windows.

La opción dired-guess-shell-alist-userestá disponible después de cargar la biblioteca estándar dired-x.el. La asociación predeterminada de un archivo PDF se define en variable dired-guess-shell-alist-defaulty es un programa xpdf(disponible en UNIX y GNU / Linux). El uso de la opción dired-guess-shell-alist-userse puede, por ejemplo, en lugar asociarlo con Adobe Acrobat Reader mediante la adición de esta asociación a la alista: ("\.pdf$" . "AcroRd32.exe").

Luego puede abrir un archivo PDF en Dired simplemente usando !. Eso proporciona programas predeterminados como "conjeturas", a los que puede acceder repitiendo M-n. Entonces, !seguido de M-nle dará el comando de shell AcroRd32.exesi el punto está en un nombre de archivo PDF y si ese comando / programa está asociado con regexp \.pdf$.

Además de Dired, puede hacer uso de las asociaciones de archivos dired-guess-shell-alist-usercomo un controlador de archivos de marcadores, es decir, hacer que la asociación de archivos PDF tenga efecto para cualquier marcador de archivos PDF, si utiliza la biblioteca Bookmark + . El valor actual de dired-guess-shell-alist-userse utiliza como el valor predeterminado de la opción bmkp-default-handlers-for-file-types, que controla esto.

Puedes pensar en las opciones dired-guess-shell-alist-usery bmkp-default-handlers-for-file-typescomo algo análogo auto-mode-alist. Pero asignan patrones de nombre de archivo a acciones de archivo en lugar de asignarlos a modos de búfer. Y surten efecto solo cuando usa ciertos comandos.

Si usa MS Windows, puede aprovechar (o también) las asociaciones existentes de archivos de Windows cuando abre un archivo en Dired o "salta" a un marcador. Para esto necesitas biblioteca w32-browser.el.

Para Dired, también necesita la biblioteca Dired + ; consulte Uso de asociaciones de archivos de Windows en Dired . Para los marcadores, también necesita Bookmark + : consulte Archivos de marcadores que no puede visitar con Emacs y Apertura de marcadores mediante asociaciones de archivos de Windows .

Dibujó
fuente
3

Estoy usando corredor . Aquí hay un extracto de mi archivo de configuración

    (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
fuente
0

Mi manera de lograr esto sin ningún complemento es la siguiente. Ejecuto Emacs 25.3 bajo Ubuntu 16.04 LTS. Si su sistema operativo es macOS o Windows, definitivamente necesita cambiar la primera función xdg-open definida aquí. Encontré este enlace muy útil como punto de partida.

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

Después de cargar el código anterior, cuando presiona C-x C-fpara PDF y archivo de Word, se abrirá automáticamente el archivo utilizando la aplicación predeterminada del sistema.

Realmente me gusta el mecanismo de asesoramiento proporcionado por Emacs, consulte (elisp) Funciones de asesoramiento . Al recomendar la función existente de una manera compatible, evito volver a vincular teclas comunes como C-x C-funa nueva función.

Lei Zhao
fuente