Как сделать, чтобы Org-режим открывал PDF-файлы в Evince? - PullRequest
31 голосов
/ 12 января 2012

В режиме Org при попытке открыть ссылку на файл PDF ничего не происходит.Кроме того, когда я делаю Cc Ce d для экспорта в формате LaTeX и обработки в PDF и открытия PDF, создается, но не открывается.Как сделать, чтобы Org-режим открывал PDF-файлы в Evince?

Я использую Org-mode 7.6 в GNU Emacs 23.3.1 и Evince 3.2.1 в Ubuntu 11.10.

Ответы [ 3 ]

21 голосов
/ 12 января 2012
M-x customize-variable [RET] org-file-apps [RET]

Если org использует системные настройки по умолчанию, вам нужно отредактировать файл ./mailcap.

Попробуйте добавить эту строку:

application/pdf; /usr/bin/evince %s
11 голосов
/ 02 февраля 2012

Другая возможная конструкция, которая могла бы работать для этого, будет использовать eval-after-load вместо add-hook.Он будет устанавливать значения только один раз при запуске, вам не придется беспокоиться о добавлении записей или об их отсутствии (если вы регулярно не перезагружаете org).

Объедините это с setcdr, и вы сможете избежать необходимости удалятьдобавьте if из списка, а затем снова добавьте, и вы убедитесь, что добавили или изменили значение.If необходим только для значений, которых нет в списке по умолчанию, просто чтобы убедиться, что вы не столкнетесь с конфликтами где-то внизу.

(eval-after-load "org"
  '(progn
     ;; .txt files aren't in the list initially, but in case that changes
     ;; in a future version of org, use if to avoid errors
     (if (assoc "\\.txt\\'" org-file-apps)
         (setcdr (assoc "\\.txt\\'" org-file-apps) "notepad.exe %s")
       (add-to-list 'org-file-apps '("\\.txt\\'" . "notepad.exe %s") t))
     ;; Change .pdf association directly within the alist
     (setcdr (assoc "\\.pdf\\'" org-file-apps) "evince %s")))

Редактировать для пояснения

eval-after-load оценивает блок только при вызове (require 'org).Если org уже загружен, он будет оцениваться немедленно (я ошибочно думал, что он запускался каждый раз при загрузке библиотеки, но, похоже, только в первый раз).Разница между add-hook и eval-after-load объясняется здесь .

Поскольку org-file-apps является defcustom, он не изменит значения, если вы установите их перед загрузкой org, если вы построите список с нуля (включая значения по умолчанию, как в вашем втором (более уродливом) решении)) вы можете просто setq в вашем init.el и все будет работать.Это также означает, что оно не будет перезаписывать ваши изменения.

Добавление (if (assoc к записи PDF ничего не повредит, это просто гарантирует, что если PDF-файлы когда-либо будут удалены из значения по умолчанию org-file-apps, это будетеще будет добавлено.Единственное решение, которое не потерпит неудачу, если PDF-файлы будут удалены, это ваше второе.Все остальные предполагают, что запись существует в той или иной форме.

9 голосов
/ 12 января 2012

Вы можете использовать конструкцию, аналогичную https://stackoverflow.com/a/3985552/789593, но адаптировать ее к файлам PDF и Evince. Что вы хотите сделать, это изменить список org-file-apps. Это можно сделать, добавив в ваш .emacs следующее:

;; PDFs visited in Org-mode are opened in Evince (and not in the default choice) https://stackoverflow.com/a/8836108/789593
(add-hook 'org-mode-hook
      '(lambda ()
         (delete '("\\.pdf\\'" . default) org-file-apps)
         (add-to-list 'org-file-apps '("\\.pdf\\'" . "evince %s"))))

Это удалит настройки по умолчанию для файлов PDF и вместо этого откроет их в Evince (и сохранит все остальное, включенное в org-file-apps). Я новичок в elisp, поэтому не знаю, насколько надежно это решение, но оно работает для меня и выглядит более элегантно, чем приведенное ниже.

Другой вариант, который кажется уродливее, - вместо этого искать значения по умолчанию и устанавливать их все это, но изменять значение для файлов PDF:

;; PDFs visited in Org-mode are opened in Evince (and other file extensions are handled according to the defaults)
(add-hook 'org-mode-hook
      '(lambda ()
         (setq org-file-apps
           '((auto-mode . emacs)
             ("\\.mm\\'" . default)
             ("\\.x?html?\\'" . default)
             ("\\.pdf\\'" . "evince %s")))))
...