2012-01-12 9 views
27

In modalità Org quando si tenta di aprire un collegamento a un file PDF non accade nulla. Inoltre, quando faccio C-c C-e d per esportare come LaTeX e processare in PDF e aprire il PDF viene generato ma non aperto. Come posso creare file PDF aperti in modalità Org in Evince?Come posso creare file PDF aperti in modalità Org in Evince?

Sto usando Org-mode 7.6 in GNU Emacs 23.3.1 e Evince 3.2.1 in Ubuntu 11.10.

risposta

9

Un'altra possibile costrutto che potrebbe lavorare per questo sarebbe quello di utilizzare eval-after-load anziché add-hook. Imposterà i valori una sola volta all'avvio, non dovrai preoccuparti che le voci vengano aggiunte o meno (a meno che tu non ricarichi periodicamente l'org).

Combina quello con setcdr ed è possibile evitare di dover eliminare dall'elenco e quindi aggiungere nuovamente, aggiungere if e ti assicurerai di aggiungere o modificare il valore. L'if è necessario solo per i valori che non sono nella lista di default, solo per essere sicuri di non finire con conflitti da qualche parte lungo la linea.

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

Modifica chiarimenti

eval-after-load valuta solo il blocco quando (require 'org) si chiama. Se l'org è già caricato, lo valuterà immediatamente (ho erroneamente pensato che fosse eseguito ogni volta che veniva caricata una libreria, ma sembra essere solo la prima volta). La differenza tra add-hook e eval-after-load è spiegata here.

Dal org-file-apps è un defcustom non cambierà i valori, se li si imposta prima org è caricato, se si crea la lista da zero (compresi i valori predefiniti come nella soluzione secondo (brutta)) si può semplicemente setq in il tuo init.el e tutto funzionerebbe. Significa anche che non sovrascriverà le tue modifiche.

Aggiunta (if (assoc alla voce PDF non male a nessuno, sarà semplicemente garantire che, se i PDF vengono mai rimossi dal default org-file-apps che sarà ancora aggiunto. L'unica soluzione che non fallirebbe se i PDF fossero stati rimossi è il tuo secondo.Tutti gli altri presuppongono che la voce esista in una forma o nell'altra.

+0

A volte carico la modalità org per i buffer più volte in una sessione. Ciò influisce su questa soluzione? O è solo se uso 'org-reload'? Inoltre, potrei aggiungere un '(if (struttura per i file PDF per renderlo una prova futura? –

+0

@NN aggiunti alcuni dettagli in una modifica che dovrebbe rispondere a questa domanda –

+0

Grazie per la tua elaborazione. Questa soluzione è la più elegante finora . –

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

Se org usa le impostazioni di sistema predefinite, è necessario modificare il file ./mailcap.

Prova ad aggiungere questa riga:

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

C'è una riga che posso aggiungere al mio .emacs piuttosto che dover usare 'M-x customize-variable [RET] org-file-apps [RET]'? –

+0

'org-file-apps' include' ("\\. Pdf \\ '". Default) 'in base a' find-variable'. –

+0

Probabilmente potresti aggiungere qualcosa al tuo .emacs seguendo le linee di '(setq org-file-apps ...)', ma non vedo perché non si possa impostare la variabile in base alle proprie esigenze. Se provi 'F1 v org-file-apps', il primo esempio che viene fuori è questo' Esempio: ("pdf". "Evince% s") per aprire i PDF con evince. Quindi dai un'occhiata al file di aiuto e prova a impostarlo per evincere. – certainly

7

È possibile utilizzare un costrutto simile a https://stackoverflow.com/a/3985552/789593 ma adattarla ai file PDF e Evince. Quello che vuoi fare è modificare l'elenco org-file-apps. Questo può essere fatto aggiungendo la seguente alle vostre .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")))) 

questo si cancellerà l'impostazione predefinita per i file PDF e invece aprirli in Evince (e mantenere tutto il resto compreso nel org-file-apps). Sono nuovo in elisp quindi non so se questa soluzione è robusta, ma funziona per me e sembra essere più elegante di quella qui sotto.

Un'altra opzione, che sembra più brutta, è quello di cercare invece i valori di default e loro tutto ciò che insieme, ma modificare il valore per i file 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

Sembra una buona soluzione! – certainly

+0

@certainly Ho modificato la soluzione perché 'append' ha aggiunto la voce ogni volta che è stata invocata la modalità org che ha invaso la variabile. Forse posso fare qualcosa di più elegante con 'add-to-list'. –

+0

@certainly ho aggiunto qualcosa che potrebbe essere più elegante. –

Problemi correlati