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.