Как использовать внешнюю программу в качестве способа открытия PDF-файлов из Emacs по умолчанию?

42

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

tmalsburg
источник

Ответы:

34

Попробуй openwith. Следующий код включит его и позволит открывать PDF-файлы с помощью evince(перейдите в любимую программу просмотра PDF):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
Дэн
источник
1
Я удивлен, что нужен сторонний пакет для чего-то простого. Но это работает, спасибо!
tmalsburg
Это не нужно (см. Ответ Дрю), но это хороший и чистый способ сделать это. Обратите внимание, что это может привести к конфликту с другими программами, такими как программа чтения музыки (mpg123), если вы ее используете.
Ehvince
У этого решения есть проблемы. Похоже, что некоторым пакетам не нравится, когда вы связываетесь с ними find-file. Например, отправка электронных писем с вложенными PDF-файлами (через mu4e) приводит к тому, что вложенный PDF-файл открывается во внешнем редакторе и происходит сбой отправки ( подробности см. Здесь ).
tmalsburg
1
@tmalsburg: взгляните на эту ветку SO, обсуждая проблему с вложениями электронной почты и решение в этом конкретном случае использования.
Дан
Я просто написал немного кода, чтобы посоветовать командам, с которыми он не работает, openwith-modeотключить его: посмотрите эту суть .
Омар
21

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

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-tools не доступны через стандартные менеджеры пакетов, а процедура установки, по-видимому, не работает с emacs 24.4: /
Clément
Меня устраивает. Но вы должны клонировать pdf-toolsрепозиторий, скомпилировать и установить часть C везде, где ваш Emacs может увидеть двоичный файл, перед установкой и использованием части Emacs Lisp.
Ту До
Позволяет ли pdf-tools выделять (то есть желтым цветом) слова и фразы или нет?
Лампа накаливания
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 файла и , если эта команда / программа связана с регулярным выражением \.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 . Для закладок вам также понадобится Bookmark + - см. Закладка файлов, которые вы не можете посетить с помощью 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 и файл слова, он автоматически открывает файл с помощью системного приложения по умолчанию.

Мне действительно нравится механизм рекомендаций, предоставляемый Emacs, см. (Elisp) Функции консультирования . Совмещая существующие функции совместимым способом, я избегаю повторного связывания общих ключей, например, C-x C-fс новой функцией.

Лэй Чжао
источник