Come utilizzare un programma esterno come modo predefinito per aprire PDF da Emacs?


42

Quando ho M-x find-fileun PDF, viene aperto in Emacs. Anche se questo è carino, il visualizzatore di PDF di Emacs manca di molte funzionalità di cui ho bisogno e preferirei invece aprire PDF in un programma esterno. Come posso configurare Emacs per utilizzare un programma esterno come visualizzatore predefinito per i PDF?

Risposte:


34

Prova openwith. Il seguente codice lo abilita e ti consente di aprire i PDF con evince(passa al tuo visualizzatore di PDF preferito):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))

1
Sono sorpreso che sia necessario un pacchetto di terze parti per qualcosa di semplice. Ma funziona, grazie!
tmalsburg,

Non è necessario (vedi la risposta di Drew) ma è un modo carino e pulito per farlo. Nota che potrebbe essere in conflitto con altri programmi, come un lettore musicale (mpg123) se ne usi uno.
Ehvince,

Questa soluzione ha problemi. Sembra che ad alcuni pacchetti non piaccia quando si scherza find-file. Ad esempio, l'invio di e-mail con PDF allegati (tramite mu4e) provoca l'apertura del PDF allegato nell'editor esterno e l'invio non riesce (vedere qui per i dettagli).
tmalsburg,

1
@tmalsburg: dai un'occhiata a questo thread SO che discute il problema con gli allegati e-mail e una soluzione in quel particolare caso d'uso.
Dan

Ho appena scritto un po 'di codice per consigliare i comandi che non funzionano openwith-modeper disattivarlo: vedi questo riassunto .
Omar,

21

Se vuoi visualizzare PDF con molte funzionalità (evidenziare la ricerca, evidenziare la selezione, annotare, albero dei contenuti), usa pdf-tools . Come puoi vedere nella demo , posso usare Isearch con l'evidenziazione. Emacs è ora il mio lettore PDF preferito. Puoi anche aggiungere un segnalibro a una pagina PDF specifica usando Segnalibro (+).

EDIT : Se si utilizza helme si desidera utilizzare un programma esterno, helmha già uno nel menu di azione per l'apertura di file esterno: Open file externally C-c C-x. C-u to choose again. Cosa fa che offre un elenco di tutti i programmi disponibili nel tuo sistema e ti presenta una bella interfaccia Helm tra cui scegliere; una volta selezionato, Helm lo ricorda fino a quando non si esegue il comando con argomento prefisso C-uper selezionarne uno nuovo.


3
+1 Non posso ringraziarti abbastanza per averlo menzionato pdf-tools!! Pacchetto INCREDIBILE. Lo adoro! Anche la tua demo è fantastica, anche se graffia solo la superficie di ciò che è possibile ... :)
itsjeyd

pdf-tools non sembra disponibile tramite i gestori di pacchetti standard e la procedura di installazione non sembra funzionare con emacs 24.4: /
Clément

Per me funziona. Ma devi clonare il pdf-toolsrepository, compilare e installare la parte C ovunque il tuo Emacs possa vedere il binario, prima di installare e utilizzare la parte Emacs Lisp.
Tu Do,

Gli strumenti pdf ti permettono di evidenziare (cioè in giallo) parole e frasi o no?
incandescentman,

11

Hai chiesto di find-file. Oltre a ciò che altri (ad es. Dan) dicono a questo proposito, vale la pena conoscere anche l'apertura dei file usando un'applicazione associata al tipo di file (ad es. Estensione) in opzione dired-guess-shell-alist-user. E se usi Emacs su MS Windows, vale la pena sapere come aprire un file usando le associazioni di file di Windows.

L'opzione dired-guess-shell-alist-userè disponibile dopo aver caricato la libreria standard dired-x.el. L'associazione predefinita di un file PDF è definita in variabile dired-guess-shell-alist-defaulted è un programma xpdf(disponibile su UNIX e GNU / Linux). Utilizzando l'opzione dired-guess-shell-alist-userè possibile, ad esempio, associarlo invece con Adobe Acrobat Reader con l'aggiunta di questa associazione al alist: ("\.pdf$" . "AcroRd32.exe").

Quindi puoi aprire un file PDF in Dired semplicemente usando !. Ciò fornisce programmi predefiniti come "ipotesi", a cui è possibile accedere ripetendo M-n. Quindi !seguito da M-nti darà il comando shell AcroRd32.exese punto è su un nome file PDF e se quel comando / programma è associato a regexp \.pdf$.

Oltre a Dired, puoi utilizzare le associazioni di file dired-guess-shell-alist-usercome gestore di file di segnalibri, ovvero fare in modo che l'associazione di file PDF abbia effetto per tutti i segnalibri in file PDF, se usi la libreria Segnalibro + . Il valore corrente di dired-guess-shell-alist-userviene utilizzato come valore predefinito dell'opzione bmkp-default-handlers-for-file-types, che controlla questo.

Puoi pensare alle opzioni dired-guess-shell-alist-usere bmkp-default-handlers-for-file-typesin qualche modo analogo a auto-mode-alist. Ma mappano modelli di nomi di file su azioni di file anziché mapparli su modalità buffer. E hanno effetto solo quando si utilizzano determinati comandi.

Se usi MS Windows, puoi invece (o anche) sfruttare le associazioni di file Windows esistenti quando apri un file in Dired o "salti" su un segnalibro. Per questo hai bisogno di una biblioteca w32-browser.el.

Per Dired, è necessaria anche la libreria Dired + : consultare Uso delle associazioni di file di Windows in Dired . Per i segnalibri, è necessario anche Segnalibro + : consultare i file di segnalibri che non è possibile visitare con Emacs e l' apertura dei segnalibri utilizzando le associazioni di file di Windows .


3

Sto usando il corridore . Ecco un estratto del mio file di configurazione

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

0

Il mio modo per raggiungere questo obiettivo senza plug-in è il seguente. Corro Emacs 25.3 con Ubuntu 16.04 LTS. Se il tuo sistema operativo è macOS o Windows, devi assolutamente cambiare la prima funzione xdg-open definita qui. Ho trovato questo link molto utile come punto di partenza.

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

Dopo aver caricato il codice sopra, quando si preme C-x C-fper PDF e file di parole, si aprirà automaticamente il file utilizzando l'app predefinita di sistema.

Mi piace molto il meccanismo di consulenza fornito da Emacs, vedi (elisp) Funzioni di consulenza . Raccomandando la funzione esistente in modo compatibile, evito di rilegare i tasti comuni come C-x C-fa una nuova funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.