Bagaimana cara menggunakan program eksternal sebagai cara default untuk membuka PDF dari Emacs?

42

Ketika saya M-x find-filePDF, itu dibuka di Emacs. Meskipun ini bagus, penampil PDF Emacs 'tidak memiliki banyak fitur yang saya butuhkan dan saya lebih suka membuka PDF dalam program eksternal. Bagaimana saya bisa mengkonfigurasi Emacs untuk menggunakan program eksternal sebagai penampil default untuk PDF?

tmalsburg
sumber

Jawaban:

34

Coba openwith. Kode berikut akan mengaktifkannya, dan memungkinkan Anda untuk membuka PDF dengan evince(ubah ke penampil PDF favorit Anda):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
Dan
sumber
1
Saya terkejut bahwa paket pihak ketiga diperlukan untuk sesuatu yang sederhana seperti itu. Tapi berhasil, terima kasih!
tmalsburg
Itu tidak diperlukan (lihat jawaban Drew) tetapi ini adalah cara yang bagus dan bersih untuk melakukannya. Perhatikan bahwa itu mungkin akan bertentangan dengan program lain, seperti pembaca musik (mpg123) jika Anda menggunakannya.
Ehvince
Solusi ini memiliki masalah. Tampaknya beberapa paket tidak menyukainya saat Anda mengacaukannya find-file. Misalnya, mengirim email dengan PDF yang dilampirkan (via mu4e) menyebabkan PDF terlampir dibuka di editor eksternal dan pengiriman gagal (lihat di sini untuk detailnya).
tmalsburg
1
@ tmalsburg: lihat utas SO ini membahas masalah dengan lampiran email dan solusi dalam hal penggunaan tertentu.
Dan
Saya baru saja menulis sedikit kode untuk menyarankan perintah yang tidak berfungsi openwith-modeuntuk mematikannya: lihat intisari ini .
Omar
21

Jika Anda ingin melihat PDF dengan banyak fitur (menyoroti pencarian, menyoroti pilihan, anotasi, struktur konten), gunakan pdf-tools . Seperti yang Anda lihat di demo , saya bisa menggunakan Isearch dengan highlighting. Emacs sekarang menjadi pembaca PDF favorit saya. Anda juga dapat mem-bookmark halaman PDF tertentu dengan menggunakan Bookmark (+).

EDIT : Jika Anda menggunakan helmdan ingin menggunakan program eksternal, helmsudah memiliki satu dalam menu tindakan untuk membuka file eksternal: Open file externally C-c C-x. C-u to choose again. Apa fungsinya yang menawarkan daftar semua program yang tersedia di sistem Anda dan memberi Anda antarmuka Helm yang bagus untuk dipilih; setelah Anda memilih, Helm akan mengingatnya sampai Anda menjalankan perintah dengan argumen awalan C-uuntuk memilih yang baru.

Tu Do
sumber
3
+1 Saya tidak bisa cukup berterima kasih untuk menyebutkan pdf-tools!! Paket LUAR BIASA. Suka! Demo Anda sangat bagus juga, meskipun hanya menggores permukaan dari apa yang mungkin ... :)
itsjeyd
pdf-tools tampaknya tidak tersedia melalui manajer paket standar, dan prosedur instal tampaknya tidak bekerja dengan emacs 24.4: /
Clément
Ini bekerja untuk saya. Tetapi Anda harus mengkloning pdf-toolsrepo dan kompilasi dan menginstal bagian C di mana saja Emacs Anda dapat melihat biner, sebelum menginstal dan menggunakan bagian Emacs Lisp.
Tu Do
Apakah alat pdf memungkinkan Anda untuk menyoroti kata dan frasa (yaitu berwarna kuning) atau tidak?
incandescentman
11

Anda bertanya tentang find-file. Selain apa yang orang lain (misalnya, Dan) katakan tentang itu, ada baiknya juga mengetahui tentang membuka file menggunakan aplikasi yang terkait dengan jenis file (misalnya ekstensi) dalam opsi dired-guess-shell-alist-user. Dan jika Anda menggunakan Emacs pada MS Windows, maka ada baiknya mengetahui cara membuka file menggunakan asosiasi file Windows.

Opsi dired-guess-shell-alist-usertersedia setelah Anda memuat pustaka standar dired-x.el. Asosiasi default file PDF didefinisikan dalam variabel dired-guess-shell-alist-default, dan ini adalah program xpdf(tersedia di UNIX dan GNU / Linux). Menggunakan pilihan dired-guess-shell-alist-userAnda dapat, misalnya, mengasosiasikannya bukan dengan Adobe Acrobat Reader dengan menambahkan asosiasi ini untuk alist yang: ("\.pdf$" . "AcroRd32.exe").

Kemudian Anda dapat membuka file PDF di Dired hanya dengan menggunakan !. Itu memberikan program default sebagai "tebakan", yang dapat Anda akses dengan mengulangi M-n. Maka !diikuti oleh M-nakan memberi Anda perintah shell AcroRd32.exejika titik ada pada nama file PDF dan jika perintah / program itu dikaitkan dengan regexp \.pdf$.

Selain Dired, Anda dapat menggunakan asosiasi file dired-guess-shell-alist-usersebagai penangan file bookmark, yaitu, apakah asosiasi file PDF berlaku untuk bookmark apa pun ke file PDF, jika Anda menggunakan library Bookmark + . Nilai saat dired-guess-shell-alist-userini digunakan sebagai nilai default opsi bmkp-default-handlers-for-file-types, yang mengontrol ini.

Anda dapat memikirkan opsi dired-guess-shell-alist-userdan bmkp-default-handlers-for-file-typesagak analog auto-mode-alist. Tetapi mereka memetakan pola nama-file untuk mengajukan tindakan alih-alih memetakannya ke mode buffer. Dan mereka berlaku hanya ketika Anda menggunakan perintah tertentu.

Jika Anda menggunakan MS Windows maka Anda dapat (atau juga) mengambil keuntungan dari asosiasi file Windows yang ada saat Anda membuka file di Dired atau "melompat" ke bookmark. Untuk ini, Anda perlu perpustakaan w32-browser.el.

Untuk Dired, Anda juga memerlukan library Dired + - lihat Menggunakan Windows File Associations di Dired . Untuk bookmark, Anda juga perlu Bookmark + - lihat Memberi Bookmark File yang Tidak Dapat Anda Kunjungi Dengan Emacs dan Membuka Bookmark Menggunakan Windows File Associations .

Drew
sumber
3

Saya menggunakan pelari . Ini kutipan file konfigurasi saya

    (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
sumber
0

Cara saya untuk mencapai ini tanpa plugin adalah berikut ini. Saya menjalankan Emacs 25.3 di bawah Ubuntu 16.04 LTS. Jika OS Anda adalah macOS atau Windows, Anda pasti perlu mengubah fungsi pertama yang xdg-open didefinisikan di sini. Saya menemukan tautan ini sangat membantu sebagai titik awal.

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

Setelah kode di atas dimuat, ketika Anda menekan C-x C-funtuk PDF dan file kata, itu akan secara otomatis membuka file menggunakan aplikasi standar sistem.

Saya sangat suka mekanisme saran yang disediakan oleh Emacs, lihat (elisp) Fungsi Penasihat . Dengan menyarankan fungsi yang ada dengan cara yang kompatibel, saya menghindari mengikat kembali kunci umum seperti C-x C-fke fungsi baru.

Lei Zhao
sumber