วิธีใช้โปรแกรมภายนอกเป็นวิธีเริ่มต้นในการเปิด PDF จาก Emacs


42

เมื่อฉันM-x find-fileเป็น PDF ไฟล์นั้นจะเปิดขึ้นใน Emacs แม้ว่านี่จะดี แต่โปรแกรมดู PDF ของ Emacs ขาดคุณสมบัติมากมายที่ฉันต้องการและฉันต้องการเปิด PDF ในโปรแกรมภายนอกแทน ฉันจะกำหนดค่า Emacs ให้ใช้โปรแกรมภายนอกเป็นเครื่องมือดูค่าเริ่มต้นสำหรับ PDF ได้อย่างไร

คำตอบ:


34

ลองopenwithดู รหัสต่อไปนี้จะเปิดใช้งานและอนุญาตให้คุณเปิด PDF ด้วยevince(เปลี่ยนเป็นโปรแกรมดู PDF ที่คุณชื่นชอบ):

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

1
ฉันประหลาดใจที่จำเป็นต้องใช้แพ็คเกจของบุคคลที่สามเพื่อให้ง่ายขึ้น แต่ใช้งานได้ดีขอบคุณ!
tmalsburg

มันไม่จำเป็น (ดูคำตอบของ Drew) แต่มันเป็นวิธีที่ดีและสะอาดในการทำ โปรดทราบว่าอาจขัดแย้งกับโปรแกรมอื่นเช่นโปรแกรมอ่านเพลง (mpg123) หากคุณใช้งาน
Ehvince

วิธีนี้มีปัญหา find-fileปรากฏว่าแพคเกจบางคนไม่ชอบมันเมื่อคุณรับประทานอาหารที่มี ตัวอย่างเช่นการส่งอีเมลพร้อมไฟล์ PDF ที่แนบมา (ผ่าน mu4e) ทำให้ไฟล์ PDF ที่แนบมาถูกเปิดในตัวแก้ไขภายนอกและการส่งล้มเหลว (ดูรายละเอียดที่นี่ )
tmalsburg

1
@tmalsburg: ดูที่หัวข้อ SO นี้เพื่อหารือเกี่ยวกับปัญหาของไฟล์แนบอีเมลและวิธีแก้ไขในกรณีการใช้งานเฉพาะนั้น
แดน

ฉันเพิ่งเขียนโค้ดเล็กน้อยเพื่อแนะนำคำสั่งที่ไม่openwith-modeสามารถปิดได้: ดูส่วนสำคัญนี้
โอมาร์

21

หากคุณต้องการที่จะดูรูปแบบไฟล์ PDF ด้วยคุณสมบัติมากมาย (ค้นหาไฮไลท์เน้นการเลือกคำอธิบาย, ต้นไม้เนื้อหา) ใช้รูปแบบไฟล์ PDF เครื่องมือ อย่างที่คุณเห็นในการสาธิตฉันสามารถใช้ Isearch กับการเน้น Emacs ตอนนี้เป็นโปรแกรมอ่าน PDF ที่ฉันโปรดปราน คุณสามารถบุ๊กมาร์กหน้า PDF เฉพาะได้โดยใช้คั่นหน้า (+)

แก้ไข : หากคุณใช้helmและต้องการใช้โปรแกรมภายนอกhelmมีหนึ่งในเมนูการกระทำสำหรับการเปิดไฟล์ภายนอก: Open file externally C-c C-x. C-u to choose again. มันทำอะไรได้บ้างที่จะนำเสนอรายการโปรแกรมที่มีอยู่ทั้งหมดในระบบของคุณและนำเสนออินเตอร์เฟส Helm ที่ดีให้เลือก; เมื่อคุณเลือกแล้ว Helm จะจดจำมันจนกว่าคุณจะรันคำสั่งด้วยอาร์กิวเมนต์ prefix C-uเพื่อเลือกคำสั่งใหม่


3
+1 ฉันไม่สามารถขอบคุณมากพอที่จะกล่าวถึงpdf-tools!! แพ็คเกจสุดมหัศจรรย์ รักมัน! การสาธิตของคุณนั้นยอดเยี่ยมเช่นกันแม้ว่าจะเป็นเพียงรอยขีดข่วนพื้นผิวของสิ่งที่เป็นไปได้ ... :)
itsjeyd

เครื่องมือ pdf ดูเหมือนจะไม่พร้อมใช้งานผ่านผู้จัดการแพ็คเกจมาตรฐานและขั้นตอนการติดตั้งดูเหมือนจะไม่ทำงานกับ emacs 24.4: /
Clément

มันใช้งานได้สำหรับฉัน แต่คุณต้องโคลนpdf-toolsrepo และคอมไพล์และติดตั้งส่วน C ที่ใดก็ได้ที่ Emacs ของคุณสามารถดูไบนารีได้ก่อนที่จะติดตั้งและใช้ส่วน Emacs Lisp
Tu Do

เครื่องมือ pdf ช่วยให้คุณสามารถเน้น (เช่นสีเหลือง) คำและวลีหรือไม่?
ยอง

11

find-fileคุณถามเกี่ยวกับ นอกเหนือไปจากสิ่งที่คนอื่น (เช่นแดน) กล่าวว่าเกี่ยวกับว่ามันคุ้มค่าที่จะยังไม่ทราบเกี่ยวกับไฟล์ที่เปิดใช้โปรแกรมที่เกี่ยวข้องกับประเภทของไฟล์ (เช่นส่วนขยาย) dired-guess-shell-alist-userในตัวเลือก และถ้าคุณใช้ Emacs บน MS Windows คุณควรรู้วิธีเปิดไฟล์โดยใช้การเชื่อมโยงไฟล์ของ Windows

ตัวเลือกที่สามารถใช้ได้หลังจากที่คุณโหลดห้องสมุดมาตรฐานdired-guess-shell-alist-user dired-x.elการเชื่อมโยงเริ่มต้นของไฟล์ PDF ถูกกำหนดไว้ในตัวแปรdired-guess-shell-alist-defaultและเป็นโปรแกรมxpdf(มีให้ใน UNIX และ GNU / Linux) โดยใช้ตัวเลือกdired-guess-shell-alist-userที่คุณสามารถเช่นเชื่อมโยงมันแทนด้วยโปรแกรม Adobe Acrobat Reader โดยการเพิ่มการเชื่อมโยงนี้จะ alist ("\.pdf$" . "AcroRd32.exe")นี้:

จากนั้นคุณสามารถเปิดไฟล์ PDF ใน Dired !โดยใช้เพียงแค่ ที่ให้โปรแกรมเริ่มต้นว่า "คาดเดา" M-nซึ่งคุณสามารถเข้าถึงได้โดยการทำซ้ำ ดังนั้น!ตามมาด้วยM-nจะทำให้คุณคำสั่งเปลือกAcroRd32.exeถ้าจุดคือที่ชื่อไฟล์ PDF และหากที่คำสั่ง / โปรแกรมที่เกี่ยวข้องกับ \.pdf$regexp

นอกจากนี้ในการ Dired คุณสามารถใช้ประโยชน์จากความสัมพันธ์ของแฟ้มในdired-guess-shell-alist-userขณะที่ตัวจัดการไฟล์บุ๊ก, ที่อยู่, มีรูปแบบ PDF file ผลการเชื่อมโยงใช้สำหรับบุ๊กใด ๆ กับไฟล์ PDF ถ้าคุณใช้ห้องสมุดBookmark + ค่าปัจจุบันของdired-guess-shell-alist-userถูกใช้เป็นค่าเริ่มต้นของตัวเลือกbmkp-default-handlers-for-file-typesซึ่งควบคุมสิ่งนี้

คุณสามารถคิดของตัวเลือกdired-guess-shell-alist-userและเป็นที่ค่อนข้างคล้ายคลึงกับbmkp-default-handlers-for-file-types auto-mode-alistแต่จะแม็พรูปแบบชื่อไฟล์กับการกระทำของไฟล์แทนการแม็พกับโหมดบัฟเฟอร์ และจะมีผลเมื่อคุณใช้คำสั่งบางอย่างเท่านั้น

หากคุณใช้ MS Windows คุณสามารถ (หรือ) ใช้ประโยชน์จากการเชื่อมโยงไฟล์ Windowsที่มีอยู่เมื่อคุณเปิดไฟล์ใน Dired หรือ "ข้าม" ไปยังบุ๊คมาร์ค w32-browser.elสำหรับนี้คุณต้องห้องสมุด

สำหรับ Dired คุณยังต้องห้องสมุดDired + - ดูการใช้ Windows File สมาคมใน Dired สำหรับบุ๊กคุณยังต้องBookmark + - ดูBookmarking ไฟล์ที่คุณไม่สามารถเข้าเยี่ยมชมด้วย Emacsและ บุ๊กเปิดการใช้ Windows สมาคมไฟล์


3

ฉันใช้วิ่ง นี่คือข้อความที่ตัดตอนมาจากไฟล์กำหนดค่าของฉัน

    (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

วิธีของฉันเพื่อให้บรรลุสิ่งนี้โดยไม่ต้องมีปลั๊กอินใด ๆ ฉันใช้ Emacs 25.3 ภายใต้ Ubuntu 16.04 LTS หากระบบปฏิบัติการของคุณเป็น macOS หรือ Windows คุณต้องเปลี่ยนฟังก์ชั่นแรกที่xdg-open กำหนดไว้ที่นี่อย่างแน่นอน ฉันพบว่าลิงก์นี้มีประโยชน์มากในฐานะจุดเริ่มต้น

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

หลังจากโหลดโค้ดด้านบนเมื่อคุณกดC-x C-fสำหรับ PDF และไฟล์ word ไฟล์จะเปิดไฟล์โดยอัตโนมัติโดยใช้แอปเริ่มต้นของระบบ

ผมชอบกลไกการให้คำแนะนำที่มีให้โดย Emacs ดู(Elisp) ฟังก์ชั่นให้คำปรึกษา โดยการให้คำแนะนำฟังก์ชั่นที่มีอยู่ในวิธีที่เข้ากันได้ฉันหลีกเลี่ยงการผูกคีย์ทั่วไปอีกครั้งเหมือนกับC-x C-fฟังก์ชั่นใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.