2012-01-12 7 views
27

En el modo Org, cuando intento abrir un enlace a un archivo PDF, no ocurre nada. Además, cuando hago C-c C-e d para exportar como LaTeX y procesar a PDF y abrir, el PDF se genera pero no se abre. ¿Cómo hago que Org-mode abra archivos PDF en Evince?¿Cómo puedo hacer que Org-mode abra archivos PDF en Evince?

Estoy usando Org-mode 7.6 en GNU Emacs 23.3.1 y Evince 3.2.1 en Ubuntu 11.10.

Respuesta

9

Otra posible construcción que podrían funcionar para esto sería use eval-after-load en lugar de add-hook. Solo establecerá los valores una vez al inicio, no tendrá que preocuparse por las entradas que se agreguen o no (a menos que vuelva a cargar regularmente org).

Combina eso con setcdr y puedes evitar tener que eliminar de la lista y luego volver a agregar, agrega if y te asegurarás de agregar o cambiar el valor. El if solo es necesario para los valores que no están en la lista de forma predeterminada, solo para asegurarse de que no termine con conflictos en algún punto de la línea.

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

Editar una aclaración

eval-after-load sólo evalúa el bloque cuando (require 'org) se llama. Si org ya está cargado, se evaluará inmediatamente (creí erróneamente que se ejecutaba cada vez que se cargaba una biblioteca, pero parece ser solo la primera vez). La diferencia entre add-hook y eval-after-load se explica here.

Desde org-file-apps es una defcustom no va a cambiar los valores si los presentaron se carga org, si se construye la lista desde cero (incluyendo valores por defecto como en su segunda solución (feo)) que podría simplemente setq en tu init.el y todo funcionaría. También significa que no sobrescribirá tus cambios.

Agregando (if (assoc a la entrada PDF no hará daño, simplemente se asegurará de que si se eliminan archivos PDF de la predeterminada org-file-apps que todavía se agregará. La única solución que no fallaría si se eliminaran archivos PDF es la segunda.Todos los demás asumen que la entrada existe de una forma u otra.

+0

A veces cargo org-mode para almacenamientos intermedios varias veces en una sesión. ¿Eso afecta esta solución? ¿O es solo si uso 'org-reload'? Además, ¿podría agregar una estructura '(if (assoc) para pdfs para que sea una prueba futura? –

+0

@NN agregó algunos detalles en una edición que debería responder esa pregunta. –

+0

Gracias por su elaboración. Esta solución es la más elegante hasta ahora . –

21
M-x customize-variable [RET] org-file-apps [RET] 

Si org usa los valores predeterminados de su sistema, debe editar su archivo ./mailcap.

Trate de añadir esta línea:

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

¿Hay alguna línea que pueda agregar a mis .emacs en lugar de tener que usar 'M-x customize-variable [RET] org-file-apps [RET]'? –

+0

'org-file-apps' incluye' ("\\. Pdf \\ '". Default) 'de acuerdo con' find-variable'. –

+0

Probablemente pueda agregar algo a su .emacs siguiendo las líneas de '(setq org-file-apps ...)', pero no veo por qué no establecería la variable de acuerdo con sus necesidades. Si prueba 'F1 v org-file-apps', el primer ejemplo que aparece es este' Example: ("pdf". "Evince% s") para abrir archivos PDF con evince. 'Así que eche un vistazo al archivo de ayuda e intenta configurarlo para demostrarlo. – certainly

7

Se puede utilizar una construcción similar a https://stackoverflow.com/a/3985552/789593 pero adaptarlo a archivos PDF y Evince. Lo que quiere hacer es alterar la lista org-file-apps. Esto se puede hacer añadiendo lo siguiente a su .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")))) 

Esto eliminará la configuración predeterminada para archivos PDF y en lugar de abrirlos en Evince (y retener todo lo demás incluido en org-file-apps). Soy nuevo en elisp, así que no sé si esta solución es sólida, pero funciona para mí y parece ser más elegante que la de abajo.

Otra opción, que parece más feo, es mirar en su lugar los valores por defecto y los puso a todo eso, pero cambiar el valor de los archivos 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"))))) 
+0

¡Parece una buena solución! – certainly

+0

@cierto, he editado la solución porque 'append' agregó la entrada cada vez que se invoca org-mode que inundó la variable. Tal vez pueda hacer algo más elegante con 'add-to-list'. –

+0

@cierto, he agregado algo que podría ser más elegante. –

Cuestiones relacionadas