Як використовувати зовнішню програму як спосіб за замовчуванням для відкриття PDF-файлів від Emacs?


42

Коли я завантажую M-x find-filePDF, він відкривається в Emacs. Хоча це приємно, у переглядача PDF Emacs не вистачає багатьох функцій, які мені потрібні, і я вважаю за краще відкрити PDF-файли у зовнішній програмі. Як я можу налаштувати Emacs на використання зовнішньої програми в якості переглядача PDF-файлів за замовчуванням?

Відповіді:


34

Спробуйте openwith. Указаний нижче код дозволить вам відкрити PDF-файли за допомогою evince(змінити улюблений переглядач PDF):

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

1
Я здивований, що необхідний сторонній пакет для чогось простого. Але це працює, дякую!
tmalsburg

Це не потрібно (див. Відповідь Дрю), але це приємний і чистий спосіб зробити це. Зауважте, що, можливо, це буде конфліктувати з іншими програмами, наприклад, зчитувачем музики (mpg123), якщо ви використовуєте її.
Переконати

Це рішення має проблеми. Здається, що деякі пакети не люблять це, коли ви возиться find-file. Наприклад, надсилання електронних листів із доданими PDF-файлами (через mu4e) призводить до відкриття доданого PDF-файлу у зовнішньому редакторі та надсилання помилок (детальніше див. Тут ).
tmalsburg

1
@tmalsburg: ознайомтеся з цією темою SO та обговоріть проблему з вкладеннями електронної пошти та рішення у конкретному випадку використання.
День

Я лише написав трохи коду, щоб порадити команди, які не працюють, openwith-modeщоб його вимкнути: дивіться цю суть .
Омар

21

Якщо ви хочете переглянути PDF з багатьма функціями (виділення пошуку, виділення виділення, примітки, дерево вмісту), використовуйте інструменти pdf . Як ви бачите в демонстрації , я можу використовувати Isearch з виділенням. Зараз Emacs - мій улюблений читач PDF. Ви також можете додати закладку до певної сторінки PDF, використовуючи Bookmark (+).

EDIT : Якщо ви використовуєте helmі хочете використовувати зовнішню програму, helmвже є один в меню дій для відкриття зовнішнього файлу: Open file externally C-c C-x. C-u to choose again. Для чого він пропонує список усіх доступних програм у вашій системі та представляє вам приємний інтерфейс Helm для вибору; Після вибору Helm запам'ятовує його, поки не запустите команду з аргументом префікса C-uдля вибору нового.


3
+1 Я не можу вам подякувати за згадку pdf-tools!! Дивовижний пакет. Любіть це! Ваша демонстрація також чудова, хоча вона лише дряпає поверхню того, що можливо ... :)
itsjeyd

Однак, здається, pdf-інструменти не доступні через стандартні менеджери пакунків, а процедура встановлення не працює з emacs 24.4: /
Clément

Це працює для мене. Але вам потрібно клонувати pdf-toolsрепо, компілювати та встановлювати частину C де завгодно, коли ваш Emacs може побачити двійковий файл, перш ніж встановлювати та використовувати частину Emacs Lisp.
Ту До

Чи дозволяють 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, додавши цю асоціацію з креном: ("\.pdf$" . "AcroRd32.exe").

Тоді ви можете відкрити файл PDF у Dired просто за допомогою !. Це надає програми за замовчуванням як "здогадки", до яких можна отримати доступ, повторивши M-n. Тоді !надається M-nкоманда оболонки, AcroRd32.exeякщо крапка вказана на імені файлу PDF і якщо ця команда / програма пов'язана з regexp \.pdf$.

На додаток до Dired, ви можете використовувати асоціації файлів у dired-guess-shell-alist-userякості обробника файлів закладок, тобто чи застосовувати асоціацію файлів PDF для будь-яких закладок до файлів 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 у Dired . Для закладок вам також потрібна закладка + - див. Закладка файлів, які ви не можете відвідувати за допомогою 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для нової функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.