emacs org-mode 导出 odt 文件但使用 PDF 查看器打开
emacs org-mode exports odt file but opens with PDF viewer
出于某种原因,org-mode 可以正确导出到 ODT 文件,但使用默认的 PDF 查看器 (okular) 而不是 libreoffice 打开它。我已经尝试了类似 post 中提到的所有解决方案,但没有任何运气。作为参考,我在下面复制了我的 init 文件的相关部分。我的 emacs 是 27.0.50,我的 org-mode 是 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))
这是当我尝试导出 NOTES.org 文件时 org-open-file
上的 edebug 的一个输出。
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 中可用的任何选项相匹配。
出于某种原因,org-mode 可以正确导出到 ODT 文件,但使用默认的 PDF 查看器 (okular) 而不是 libreoffice 打开它。我已经尝试了类似 post 中提到的所有解决方案,但没有任何运气。作为参考,我在下面复制了我的 init 文件的相关部分。我的 emacs 是 27.0.50,我的 org-mode 是 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))
这是当我尝试导出 NOTES.org 文件时 org-open-file
上的 edebug 的一个输出。
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 中可用的任何选项相匹配。