Làm cách nào để sử dụng chương trình bên ngoài làm cách mặc định để mở tệp PDF từ Emacs?


42

Khi tôi M-x find-filePDF, nó được mở trong Emacs. Mặc dù điều này là tốt, nhưng trình xem PDF của Emacs thiếu nhiều tính năng mà tôi cần và thay vào đó tôi muốn mở tệp PDF trong một chương trình bên ngoài. Làm cách nào tôi có thể định cấu hình Emacs để sử dụng chương trình bên ngoài làm trình xem mặc định cho các tệp PDF?

Câu trả lời:


34

Hãy thử openwith. Đoạn mã sau sẽ kích hoạt nó và cho phép bạn mở các tệp PDF bằng evince(thay đổi trình xem PDF yêu thích của bạn):

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

1
Tôi ngạc nhiên rằng một gói của bên thứ ba là cần thiết cho một cái gì đó đơn giản như vậy. Nhưng nó hoạt động, cảm ơn bạn!
tmalsburg

Nó không cần thiết (xem câu trả lời của Drew) nhưng đó là một cách hay và sạch sẽ để làm điều đó. Lưu ý rằng nó có thể sẽ xung đột với các chương trình khác, như trình đọc nhạc (mpg123) nếu bạn sử dụng một chương trình.
Ehvince

Giải pháp này có vấn đề. Có vẻ như một số gói không thích nó khi bạn gặp rắc rối find-file. Chẳng hạn, gửi email với các tệp PDF đính kèm (thông qua mu4e) khiến tệp PDF đính kèm được mở trong trình chỉnh sửa bên ngoài và gửi không thành công (xem tại đây để biết chi tiết).
tmalsburg

1
@tmalsburg: hãy xem chủ đề SO này thảo luận về vấn đề với các tệp đính kèm email và một giải pháp trong trường hợp sử dụng cụ thể đó.
Dân

Tôi chỉ viết một chút mã để thông báo các lệnh không hoạt động openwith-modeđể tắt nó: xem ý chính này .
Omar

21

Nếu bạn muốn xem PDF với nhiều tính năng (làm nổi bật tìm kiếm, tô sáng lựa chọn, chú thích, cây nội dung), hãy sử dụng các công cụ pdf . Như bạn có thể thấy trong bản demo , tôi có thể sử dụng Isearch với phần tô sáng. Emacs hiện là trình đọc PDF yêu thích của tôi. Bạn cũng có thể đánh dấu trang PDF cụ thể bằng cách sử dụng Bookmark (+).

EDIT : Nếu bạn sử dụng helmvà muốn sử dụng chương trình bên ngoài, helmđã có một trong menu hành động để mở tệp bên ngoài : Open file externally C-c C-x. C-u to choose again. Những gì nó làm là nó cung cấp một danh sách tất cả các chương trình có sẵn trong hệ thống của bạn và cung cấp cho bạn một giao diện Helm đẹp để lựa chọn; một khi bạn chọn, Helm sẽ nhớ nó cho đến khi bạn chạy lệnh với đối số tiền tố C-uđể chọn một cái mới.


3
+1 Tôi không thể cảm ơn bạn đủ để đề cập pdf-tools!! Gói AMAZING. Yêu nó! Bản demo của bạn cũng rất tuyệt, mặc dù nó chỉ làm trầy xước bề mặt của những gì có thể ... :)
itjeyd

Mặc dù vậy, các công cụ pdf dường như không có sẵn thông qua các trình quản lý gói tiêu chuẩn và quy trình cài đặt dường như không hoạt động với emacs 24.4: /
Clément

Nó làm việc cho tôi. Nhưng bạn phải sao chép pdf-toolsrepo và biên dịch và cài đặt phần C ở bất cứ nơi nào Emacs của bạn có thể nhìn thấy nhị phân, trước khi cài đặt và sử dụng phần Lisp của Emacs.
Từ Đô

Công cụ pdf có cho phép bạn đánh dấu các từ và cụm từ (nghĩa là màu vàng) hay không?
sợi đốt

11

Bạn hỏi về find-file. Ngoài những gì người khác (ví dụ, Dan) nói về điều đó, cũng đáng để biết về việc mở tệp bằng ứng dụng được liên kết với loại tệp (ví dụ: tiện ích mở rộng) trong tùy chọn dired-guess-shell-alist-user. Và nếu bạn sử dụng Emacs trên MS Windows, thì đáng để biết cách mở tệp bằng các liên kết tệp Windows.

Tùy chọn dired-guess-shell-alist-usercó sẵn sau khi bạn tải thư viện tiêu chuẩn dired-x.el. Liên kết mặc định của tệp PDF được xác định theo biến dired-guess-shell-alist-defaultvà đó là chương trình xpdf(có sẵn trên UNIX và GNU / Linux). dired-guess-shell-alist-userVí dụ, bằng cách sử dụng tùy chọn, bạn có thể liên kết nó với Adobe Acrobat Reader bằng cách thêm liên kết này vào danh sách : ("\.pdf$" . "AcroRd32.exe").

Sau đó, bạn có thể mở tệp PDF trong Dired chỉ bằng cách sử dụng !. Điều đó cung cấp các chương trình mặc định là "dự đoán", mà bạn có thể truy cập bằng cách lặp lại M-n. Vì vậy, !tiếp theo M-nsẽ cung cấp cho bạn lệnh shell AcroRd32.exenếu điểm nằm trên tên tệp PDF và nếu lệnh / chương trình đó được liên kết với regrec \.pdf$.

Ngoài Dired, bạn có thể sử dụng các liên kết tệp trong dired-guess-shell-alist-usertrình xử lý tệp dấu trang, nghĩa là, liên kết tệp PDF có hiệu lực đối với bất kỳ dấu trang nào đối với tệp PDF, nếu bạn sử dụng thư viện Bookmark + . Giá trị hiện tại của dired-guess-shell-alist-userđược sử dụng làm giá trị mặc định của tùy chọn bmkp-default-handlers-for-file-types, điều khiển này.

Bạn có thể nghĩ về các tùy chọn dired-guess-shell-alist-userbmkp-default-handlers-for-file-typeshơi giống với auto-mode-alist. Nhưng họ ánh xạ các mẫu tên tệp thành các hành động tệp thay vì ánh xạ chúng sang các chế độ đệm. Và chúng chỉ có hiệu lực khi bạn sử dụng một số lệnh nhất định.

Nếu bạn sử dụng MS Windows thì bạn có thể thay thế (hoặc cũng) tận dụng các liên kết tệp Windows hiện có khi bạn mở tệp trong Dired hoặc "nhảy" vào dấu trang. Đối với điều này, bạn cần thư viện w32-browser.el.

Đối với Dired, bạn cũng cần thư viện Dired + - xem Sử dụng Hiệp hội tệp Windows trong Dired . Đối với dấu trang, bạn cũng cần Bookmark + - xem Đánh dấu tệp bạn không thể truy cập bằng biểu tượng cảm xúcmở dấu trang bằng cách sử dụng liên kết tệp Windows .


3

Tôi đang sử dụng Á hậu . Đây là một đoạn trích của tập tin cấu hình của tôi

    (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

Cách của tôi để đạt được điều này mà không cần bất kỳ plugin nào là như sau. Tôi chạy Emacs 25.3 trong Ubuntu 16.04 LTS. Nếu HĐH của bạn là macOS hoặc Windows, bạn chắc chắn cần thay đổi chức năng đầu tiên xdg-open được xác định ở đây. Tôi thấy liên kết này rất hữu ích như một điểm khởi đầu.

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

Sau khi mã ở trên được tải, khi bạn nhấn C-x C-ftệp PDF và từ, nó sẽ tự động mở tệp bằng ứng dụng mặc định của hệ thống.

Tôi thực sự thích cơ chế tư vấn được cung cấp bởi Emacs, xem (elisp) Chức năng tư vấn . Bằng cách tư vấn chức năng tồn tại theo cách tương thích, tôi tránh ràng buộc lại các khóa phổ biến như C-x C-fchức năng mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.