Jak używać zewnętrznego programu jako domyślnego sposobu otwierania plików PDF z Emacsa?

42

Kiedy mam M-x find-fileplik PDF, jest on otwierany w Emacsie. Chociaż jest to miłe, przeglądarka plików PDF Emacsa nie ma wielu potrzebnych funkcji i wolałbym zamiast tego otwierać pliki PDF w zewnętrznym programie. Jak skonfigurować Emacsa do używania zewnętrznego programu jako domyślnej przeglądarki plików PDF?

Tmalsburg
źródło

Odpowiedzi:

34

Spróbować openwith. Poniższy kod włączy go i pozwoli ci otwierać pliki PDF za pomocą evince(zmień na swoją ulubioną przeglądarkę PDF):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
Dan
źródło
1
Dziwi mnie, że potrzebny jest pakiet innej firmy do czegoś prostego. Ale to działa, dziękuję!
tmalsburg
Nie jest potrzebny (patrz odpowiedź Drew), ale jest to przyjemny i czysty sposób na zrobienie tego. Zauważ, że prawdopodobnie spowoduje konflikt z innymi programami, takimi jak czytnik muzyki (mpg123), jeśli go używasz.
Ehvince
To rozwiązanie ma problemy. Wygląda na to, że niektórym pakietom się to nie podoba, gdy się z nimi bałagan find-file. Na przykład wysyłanie wiadomości e-mail z załączonymi plikami PDF (przez mu4e) powoduje otwarcie załączonego pliku PDF w zewnętrznym edytorze i wysyłanie kończy się niepowodzeniem ( szczegółowe informacje znajdują się tutaj ).
tmalsburg
1
@tmalsburg: spójrz na ten wątek SO omawiający problem z załącznikami e-mail i rozwiązanie w tym konkretnym przypadku użycia.
Dan
Właśnie napisałem trochę kodu, aby doradzić komendom, które nie działają, openwith-modeaby go wyłączyć: zobacz tę treść .
Omar,
21

Jeśli chcesz przeglądać pliki PDF z wieloma funkcjami (zaznaczanie wyszukiwania, zaznaczanie wyboru, adnotacja, drzewo treści), użyj narzędzi pdf . Jak widać w wersji demo , mogę używać Isearch z podświetlaniem. Emacs jest teraz moim ulubionym czytnikiem plików PDF. Możesz także utworzyć zakładkę do określonej strony PDF, używając Zakładki (+).

EDIT : Jeśli używasz helmi chcesz używać programu zewnętrznego, helmma już jeden w menu działań na rzecz otwarcia pliku zewnętrznego: Open file externally C-c C-x. C-u to choose again. Co to robi, że oferuje listę wszystkich dostępnych programów w twoim systemie i prezentuje ci ładny interfejs Helm do wyboru; po wybraniu Helm zapamiętuje je, dopóki nie uruchomisz polecenia z argumentem przedrostka, C-uaby wybrać nowe.

Do zrobienia
źródło
3
+1 Nie mogę ci wystarczająco podziękować za wzmiankę pdf-tools!! NIESAMOWITY pakiet. Kocham to! Twoje demo jest również świetne, mimo że rysuje tylko powierzchnię tego, co jest możliwe ... :)
itsjeyd
narzędzia pdf nie wydają się być dostępne za pośrednictwem standardowych menedżerów pakietów, a procedura instalacji nie działa z emacs 24.4: /
Clément,
Mi to pasuje. Ale musisz sklonować pdf-toolsrepo, skompilować i zainstalować część C w dowolnym miejscu, w którym Twój Emacs może zobaczyć plik binarny, przed zainstalowaniem i użyciem części Emacs Lisp.
Tu Do
Czy narzędzia pdf pozwalają wyróżniać (tj. Żółte) słowa i frazy, czy nie?
incandescentman
11

Zapytałeś o find-file. Oprócz tego, co mówią o tym inni (np. Dan), warto również wiedzieć o otwieraniu plików za pomocą aplikacji powiązanej z typem pliku (np. Rozszerzeniem) w opcji dired-guess-shell-alist-user. A jeśli używasz Emacsa w MS Windows, warto wiedzieć, jak otworzyć plik za pomocą skojarzeń plików Windows.

Opcja dired-guess-shell-alist-userjest dostępna po załadowaniu standardowej biblioteki dired-x.el. Domyślne skojarzenie pliku PDF jest zdefiniowane w zmiennej dired-guess-shell-alist-defaulti jest to program xpdf(dostępny w systemach UNIX i GNU / Linux). Korzystanie z opcji dired-guess-shell-alist-usermożna na przykład powiązać go zamiast z Adobe Acrobat Reader, dodając ten związek do alist: ("\.pdf$" . "AcroRd32.exe").

Następnie możesz otworzyć plik PDF w Dired za pomocą !. Zapewnia to domyślne programy jako „domysły”, do których można uzyskać dostęp, powtarzając M-n. Tak więc !następuje M-npolecenie powłoki, AcroRd32.exejeśli punkt znajduje się na nazwie pliku PDF i jeśli to polecenie / program jest powiązany z wyrażeniem regularnym \.pdf$.

Oprócz Dired możesz używać skojarzeń plików dired-guess-shell-alist-userjako modułu obsługi plików zakładek, to znaczy, że skojarzenie plików PDF będzie obowiązywać dla wszystkich zakładek do plików PDF, jeśli używasz biblioteki Bookmark + . Bieżąca wartość dired-guess-shell-alist-userjest używana jako domyślna wartość opcji bmkp-default-handlers-for-file-types, która to kontroluje.

Możesz myśleć o opcjach dired-guess-shell-alist-useri bmkp-default-handlers-for-file-typesjak nieco analogicznie do auto-mode-alist. Ale odwzorowują wzorce nazw plików na akcje plików zamiast mapować je na tryby buforowe. I działają tylko wtedy, gdy używasz pewnych poleceń.

Jeśli używasz MS Windows, możesz zamiast tego (lub też) skorzystać z istniejących powiązań plików Windows , otwierając plik w Dired lub „przeskakując” do zakładki. Do tego potrzebujesz biblioteki w32-browser.el.

W przypadku Dired potrzebujesz także biblioteki Dired + - patrz Korzystanie z powiązań plików systemu Windows w Dired . W przypadku zakładek potrzebujesz także Zakładki + - zobacz Zakładki do plików, których nie można odwiedzić za pomocą Emacsa i Otwieranie zakładek za pomocą skojarzeń plików Windows .

Rysował
źródło
3

Używam biegacza . Oto fragment mojego pliku konfiguracyjnego

    (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
źródło
0

Mój sposób na osiągnięcie tego bez żadnych wtyczek jest następujący. Używam Emacsa 25.3 pod Ubuntu 16.04 LTS. Jeśli twój system operacyjny to macOS lub Windows, zdecydowanie musisz zmienić pierwszą xdg-open zdefiniowaną tutaj funkcję . Uważam ten link za bardzo pomocny jako punkt wyjścia.

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

Po załadowaniu powyższego kodu naciśnięcie przycisku C-x C-fPDF i pliku słowego spowoduje automatyczne otwarcie pliku przy użyciu domyślnej aplikacji systemowej.

Naprawdę podoba mi się mechanizm porad dostarczony przez Emacsa, patrz (elisp) Funkcje doradcze . Informując istniejącą funkcję w zgodny sposób, unikam ponownego wiązania wspólnych klawiszy, takich jak C-x C-fnowa funkcja.

Lei Zhao
źródło