emacs org-mode экспортирует файл odt, но открывается в программе просмотра PDF - PullRequest
0 голосов
/ 01 июля 2018

По какой-то причине org-mode правильно экспортирует в ODT-файл, но открывает его с помощью программы просмотра PDF по умолчанию (okular) вместо libreoffice. Я попробовал все решения, упомянутые в похожем посте , но безуспешно. Для справки я копирую ниже соответствующие разделы моего файла инициализации. Мой emacs - 27.0.50, а мой режим - 9.1.13.

;; Enable export in ODT format
(eval-after-load "org" '(require 'ox-odt nil t)) ; enable odt backend
;; Open ODT files with libre office
(defun my-org-export-to-odt-and-open ()
  (interactive)
  (org-open-file (org-odt-export-to-odt)))

и в моих пользовательских переменных набора

 '(org-file-apps
   '((auto-mode . emacs)
     ("\\.mm\\'" . default)
     ("\\.x?html?\\'" . default)
     ("\\.odt\\'" . "libreoffice %s") 
     ("\\.pdf\\'" . "okular %s")))

Заранее благодарю за любую помощь.

Это выходное значение org-file-apps

Value:
((auto-mode . emacs)
 ("\\.mm\\'" . default)
 ("\\.x?html?\\'" . default)
 ("\\.odt\\'" . "libreoffice %s")
 ("\\.pdf\\'" . "okular %s"))
Original value was 
((auto-mode . emacs)
 ("\\.mm\\'" . default)
 ("\\.x?html?\\'" . default)
 ("\\.pdf\\'" . default))

и это один из выводов edebug на org-open-file, когда я пытался экспортировать файл NOTES.org.

Debugger entered--returning value: nil
  string-match("\\$\\(?:\\(?1:[[:alnum:]_]+\\)\\|{\\(?1:[^{}]+\\)}\\|\\$\\)" "/home/andre/org/NOTES.odt" 0)
* substitute-env-vars("/home/andre/org/NOTES.odt" t)
* substitute-env-in-file-name("/home/andre/org/NOTES.odt")
* substitute-in-file-name("/home/andre/org/NOTES.odt")
* #f(compiled-function (path &optional in-emacs line search) "Open the file at PATH.\nFirst, this expands any special file name abbreviations.  Then the\nconfiguration variable `org-file-apps' is checked if it contains an\nentry for this file type, and if yes, the corresponding command is launched.\n\nIf no application is found, Emacs simply visits the file.\n\nWith optional prefix argument IN-EMACS, Emacs will visit the file.\nWith a double \\[universal-argument] \\[universal-argument] prefix arg, Org tries to avoid opening in Emacs\nand to use an external application to visit the file.\n\nOptional LINE specifies a line to go to, optional SEARCH a string\nto search for.  If LINE or SEARCH is given, the file will be\nopened in Emacs, unless an entry from org-file-apps that makes\nuse of groups in a regexp matches.\n\nIf you want to change the way frames are used when following a\nlink, please customize `org-link-frame-setup'.\n\nIf the file does not exist, an error is thrown." #<bytecode 0x1524219>)("NOTES.odt" system)
* apply(#f(compiled-function (path &optional in-emacs line search) "Open the file at PATH.\nFirst, this expands any special file name abbreviations.  Then the\nconfiguration variable `org-file-apps' is checked if it contains an\nentry for this file type, and if yes, the corresponding command is launched.\n\nIf no application is found, Emacs simply visits the file.\n\nWith optional prefix argument IN-EMACS, Emacs will visit the file.\nWith a double \\[universal-argument] \\[universal-argument] prefix arg, Org tries to avoid opening in Emacs\nand to use an external application to visit the file.\n\nOptional LINE specifies a line to go to, optional SEARCH a string\nto search for.  If LINE or SEARCH is given, the file will be\nopened in Emacs, unless an entry from org-file-apps that makes\nuse of groups in a regexp matches.\n\nIf you want to change the way frames are used when following a\nlink, please customize `org-link-frame-setup'.\n\nIf the file does not exist, an error is thrown." #<bytecode 0x1524219>) ("NOTES.odt" system))
* org-open-file("NOTES.odt" system)
  (if a (org-odt-export-to-odt t s v) (org-open-file (org-odt-export-to-odt nil s v) 'system))
  (lambda (a s v b) (if a (org-odt-export-to-odt t s v) (org-open-file (org-odt-export-to-odt nil s v) 'system)))(nil t nil nil)
  org-export-dispatch(nil)
  funcall-interactively(org-export-dispatch nil)
  call-interactively(org-export-dispatch nil nil)
  command-execute(org-export-dispatch)

Я продолжал двигаться вперед до точки, показанной ниже. Выглядит так, как будто файл соответствует \\.mm\\?

Debugger entered--returning value: (10578 10582)
  match-data()
* regexp-opt-depth("\\.mm\\'")
* org-file-apps-entry-match-against-dlink-p(("\\.mm\\'" . default))
* cl-remove(nil ((auto-mode . emacs) ("\\.mm\\'" . default) ("\\.x?html?\\'" . default) ("\\.odt\\'" . "libreoffice %s") ("\\.pdf\\'" . "okular %s") (remote . emacs) (system . mailcap) (t . mailcap)) :if org-file-apps-entry-match-against-dlink-p)
* apply(cl-remove nil ((auto-mode . emacs) ("\\.mm\\'" . default) ("\\.x?html?\\'" . default) ("\\.odt\\'" . "libreoffice %s") ("\\.pdf\\'" . "okular %s") (remote . emacs) (system . mailcap) (t . mailcap)) :if org-file-apps-entry-match-against-dlink-p nil)
* cl-remove-if(org-file-apps-entry-match-against-dlink-p ((auto-mode . emacs) ("\\.mm\\'" . default) ("\\.x?html?\\'" . default) ("\\.odt\\'" . "libreoffice %s") ("\\.pdf\\'" . "okular %s") (remote . emacs) (system . mailcap) (t . mailcap)))
* #f(compiled-function (path &optional in-emacs line search) "Open the file at PATH.\nFirst, this expands any special file name abbreviations.  Then the\nconfiguration variable `org-file-apps' is checked if it contains an\nentry for this file type, and if yes, the corresponding command is launched.\n\nIf no application is found, Emacs simply visits the file.\n\nWith optional prefix argument IN-EMACS, Emacs will visit the file.\nWith a double \\[universal-argument] \\[universal-argument] prefix arg, Org tries to avoid opening in Emacs\nand to use an external application to visit the file.\n\nOptional LINE specifies a line to go to, optional SEARCH a string\nto search for.  If LINE or SEARCH is given, the file will be\nopened in Emacs, unless an entry from org-file-apps that makes\nuse of groups in a regexp matches.\n\nIf you want to change the way frames are used when following a\nlink, please customize `org-link-frame-setup'.\n\nIf the file does not exist, an error is thrown." #<bytecode 0x1524219>)("NOTES.odt" system)
* apply(#f(compiled-function (path &optional in-emacs line search) "Open the file at PATH.\nFirst, this expands any special file name abbreviations.  Then the\nconfiguration variable `org-file-apps' is checked if it contains an\nentry for this file type, and if yes, the corresponding command is launched.\n\nIf no application is found, Emacs simply visits the file.\n\nWith optional prefix argument IN-EMACS, Emacs will visit the file.\nWith a double \\[universal-argument] \\[universal-argument] prefix arg, Org tries to avoid opening in Emacs\nand to use an external application to visit the file.\n\nOptional LINE specifies a line to go to, optional SEARCH a string\nto search for.  If LINE or SEARCH is given, the file will be\nopened in Emacs, unless an entry from org-file-apps that makes\nuse of groups in a regexp matches.\n\nIf you want to change the way frames are used when following a\nlink, please customize `org-link-frame-setup'.\n\nIf the file does not exist, an error is thrown." #<bytecode 0x1524219>) ("NOTES.odt" system))
* org-open-file("NOTES.odt" system)
  (if a (org-odt-export-to-odt t s v) (org-open-file (org-odt-export-to-odt nil s v) 'system))
  (lambda (a s v b) (if a (org-odt-export-to-odt t s v) (org-open-file (org-odt-export-to-odt nil s v) 'system)))(nil t nil nil)
  org-export-dispatch(nil)
  funcall-interactively(org-export-dispatch nil)
  call-interactively(org-export-dispatch nil nil)
  command-execute(org-export-dispatch)

На самом деле я продолжал двигаться вперед, и не было ни одного совпадения ни с одним из параметров, доступных в org-file-apps.

1 Ответ

0 голосов
/ 11 декабря 2018

После долгих копаний я наткнулся на эти сообщения: post1 post2 из которого возникло следующее решение:

;; Enable export in ODT format
(setcdr (assq 'system org-file-apps-defaults-gnu ) "xdg-open %s")
(setq process-connection-type nil)

без каких-либо настроек в org-file-apps.

...