Подтвердить что ты не робот

Как я могу открыть файлы PDF в формате Org в Evince?

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

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

4b9b3361

Ответ 1

Другой возможной конструкцией, которая могла бы работать для этого, было бы использовать 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 файлы будут удалены, является вашим вторым. Остальные все предполагают, что запись существует в той или иной форме.

Ответ 2

M-x customize-variable [RET] org-file-apps [RET]

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

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

application/pdf; /usr/bin/evince %s

Ответ 3

Вы можете использовать конструкцию, похожую на fooobar.com/info/199852/..., но адаптировать ее к файлам 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")))))