Add JIT export back-ends loading

* lisp/org.el (org-modules): Remove export back-ends from the list.
  Update docstring.
(org-export-backends): New variable.
* lisp/ox.el (org-export-async-start): Make sure export framework is
required in the external process.
This commit is contained in:
Nicolas Goaziou 2013-02-03 12:07:17 +01:00
parent 0484c5c64d
commit 918c8a6c8f
2 changed files with 106 additions and 18 deletions

View File

@ -334,8 +334,9 @@ When MESSAGE is non-nil, display a message with the version."
(when (featurep 'org)
(org-load-modules-maybe 'force)))
(defcustom org-modules '(ox-ascii org-bbdb org-bibtex org-docview org-gnus ox-html org-info org-irc ox-latex org-mew org-mhe org-rmail org-vm org-w3m org-wl)
(defcustom org-modules '(org-bbdb org-bibtex org-docview org-gnus org-info org-irc org-mew org-mhe org-rmail org-vm org-w3m org-wl)
"Modules that should always be loaded together with org.el.
If a description starts with <C>, the file is not part of Emacs
and loading it will require that you have downloaded and properly
installed the Org mode distribution.
@ -343,9 +344,11 @@ installed the Org mode distribution.
You can also use this system to load external packages (i.e. neither Org
core modules, nor modules from the CONTRIB directory). Just add symbols
to the end of the list. If the package is called org-xyz.el, then you need
to add the symbol `xyz', and the package must have a call to
to add the symbol `xyz', and the package must have a call to:
\(provide 'org-xyz)"
\(provide 'org-xyz)
For export specific modules, see also `org-export-backends'."
:group 'org
:set 'org-set-modules
:type
@ -358,16 +361,6 @@ to add the symbol `xyz', and the package must have a call to
(const :tag " gnus: Links to GNUS folders/messages" org-gnus)
(const :tag " id: Global IDs for identifying entries" org-id)
(const :tag " info: Links to Info nodes" org-info)
(const :tag " ascii Export buffer to ASCII format" ox-ascii)
(const :tag " beamer Export buffer to LaTeX Beamer presentation" ox-beamer)
(const :tag " html Export buffer to HTML format" ox-html)
(const :tag " icalendar Export buffer to iCalendar format" ox-icalendar)
(const :tag " latex Export buffer to LaTeX format" ox-latex)
(const :tag " man Export buffer to MAN format" ox-man)
(const :tag " md Export buffer to Markdown format" ox-md)
(const :tag " odt Export buffer to ODT format" ox-odt)
(const :tag " texinfo Export buffer to Texinfo format" ox-texinfo)
(const :tag " infojs: Set up Sebastian Rose's JavaScript org-info.js" ox-jsinfo)
(const :tag " habit: Track your consistency with habits" org-habit)
(const :tag " inlinetask: Tasks independent of outline hierarchy" org-inlinetask)
(const :tag " irc: Links to IRC/ERC chat sessions" org-irc)
@ -386,7 +379,6 @@ to add the symbol `xyz', and the package must have a call to
(const :tag "C checklist: Extra functions for checklists in repeated tasks" org-checklist)
(const :tag "C choose: Use TODO keywords to mark decisions states" org-choose)
(const :tag "C collector: Collect properties into tables" org-collector)
(const :tag "C confluence Export buffer to Confluence Wiki format" ox-confluence)
(const :tag "C depend: TODO dependencies for Org-mode\n\t\t\t(PARTIALLY OBSOLETE, see built-in dependency support))" org-depend)
(const :tag "C drill: Flashcards and spaced repetition for Org-mode" org-drill)
(const :tag "C elisp-symbol: Org-mode links to emacs-lisp symbols" org-elisp-symbol)
@ -396,13 +388,11 @@ to add the symbol `xyz', and the package must have a call to
(const :tag "C expiry: Expiry mechanism for Org-mode entries" org-expiry)
(const :tag "C exp-bibtex: Export citations using BibTeX" org-exp-bibtex)
(const :tag "C git-link: Provide org links to specific file version" org-git-link)
(const :tag "C groff Export buffer to Groff format" ox-groff)
(const :tag "C interactive-query: Interactive modification of tags query\n\t\t\t(PARTIALLY OBSOLETE, see secondary filtering)" org-interactive-query)
(const :tag "C invoice: Help manage client invoices in Org-mode" org-invoice)
(const :tag "C jira: Add a jira:ticket protocol to Org-mode" org-jira)
(const :tag "C koma-letter Export buffer to KOMA Scrlttrl2 format" ox-koma-letter)
(const :tag "C learn: SuperMemo's incremental learning algorithm" org-learn)
(const :tag "C mairix: Hook mairix search into Org-mode for different MUAs" org-mairix)
(const :tag "C notmuch: Provide org links to notmuch searches or messages" org-notmuch)
@ -422,6 +412,102 @@ to add the symbol `xyz', and the package must have a call to
(const :tag "C wikinodes: CamelCase wiki-like links" org-wikinodes)
(repeat :tag "External packages" :inline t (symbol :tag "Package"))))
(defvar org-export-registered-backends) ; From ox.el
(declare-function org-export-derived-backend-p "ox" (backend &rest backends))
(defcustom org-export-backends '(ascii html icalendar latex)
"List of export back-ends that should be always available.
If a description starts with <C>, the file is not part of Emacs
and loading it will require that you have downloaded and properly
installed the Org mode distribution.
Unlike to `org-modules', libraries in this list will not be
loaded along with Org, but only once the export framework is
needed.
This variable needs to be set before org.el is loaded. If you
need to make a change while Emacs is running, use the customize
interface or run the following code, , where VALUE stands for the
new value of the variable, after updating it:
\(progn
\(setq org-export-registered-backends
\(org-remove-if-not
\(lambda (backend)
\(or (memq backend val)
\(catch 'parentp
\(mapc
\(lambda (b)
\(and (org-export-derived-backend-p b (car backend))
\(throw 'parentp t)))
val)
nil)))
org-export-registered-backends))
\(let ((new-list (mapcar 'car org-export-registered-backends)))
\(dolist (backend val)
\(cond
\((not (load (format \"ox-%s\" backend) t t))
\(message \"Problems while trying to load export back-end `%s'\"
backend))
\((not (memq backend new-list)) (push backend new-list))))
\(set-default var new-list)))
Adding a back-end to this list will also pull the back-end it
depends on, if any."
:group 'org
:group 'org-export
:set (lambda (var val)
(if (not (featurep 'ox)) (set-default var val)
;; Any back-end not required anymore (not present in VAL and not
;; a parent of any back-end in the new value) is removed from the
;; list of registered back-ends.
(setq org-export-registered-backends
(org-remove-if-not
(lambda (backend)
(or (memq backend val)
(catch 'parentp
(mapc
(lambda (b)
(and (org-export-derived-backend-p b (car backend))
(throw 'parentp t)))
val)
nil)))
org-export-registered-backends))
;; Now build NEW-LIST of both new back-ends and required
;; parents.
(let ((new-list (mapcar 'car org-export-registered-backends)))
(dolist (backend val)
(cond
((not (load (format "ox-%s" backend) t t))
(message "Problems while trying to load export back-end `%s'"
backend))
((not (memq backend new-list)) (push backend new-list))))
;; Set VAR to that list with fixed dependencies.
(set-default var new-list))))
:initialize 'custom-initialize-default
:type '(set :greedy t
(const :tag " ascii Export buffer to ASCII format" ascii)
(const :tag " beamer Export buffer to Beamer presentation" beamer)
(const :tag " html Export buffer to HTML format" html)
(const :tag " icalendar Export buffer to iCalendar format" icalendar)
(const :tag " latex Export buffer to LaTeX format" latex)
(const :tag " man Export buffer to MAN format" man)
(const :tag " md Export buffer to Markdown format" md)
(const :tag " odt Export buffer to ODT format" odt)
(const :tag " texinfo Export buffer to Texinfo format" texinfo)
(const :tag " infojs: Set up Sebastian Rose's JavaScript org-info.js" jsinfo)
(const :tag "C confluence Export buffer to Confluence Wiki format" confluence)
(const :tag "C groff Export buffer to Groff format" groff)
(const :tag "C koma-letter Export buffer to KOMA Scrlttrl2 format" koma-letter)))
(eval-after-load 'ox
'(mapc
(lambda (backend)
(condition-case nil (require (intern (format "ox-%s" backend)))
(error (message "Problems while trying to load export back-end `%s'"
backend))))
org-export-backends))
(defcustom org-support-shift-select nil
"Non-nil means make shift-cursor commands select text when possible.

View File

@ -2688,7 +2688,6 @@ with external parameters overriding Org default settings, but
still inferior to file-local settings.
Return code as a string."
;; Barf if BACKEND isn't registered.
(org-export-barf-if-invalid-backend backend)
(save-excursion
(save-restriction
@ -5031,8 +5030,10 @@ and
"%S"
`(with-temp-buffer
,(when org-export-async-debug '(setq debug-on-error t))
;; Initialize `org-mode' in the external process.
;; Initialize `org-mode' and export framework in the
;; external process.
(org-mode)
(require 'ox)
;; Re-create current buffer there.
(funcall ,,copy-fun)
(restore-buffer-modified-p nil)
@ -5521,6 +5522,7 @@ options as CDR."
(t (org-export-dispatch-ui options key expertp)))))
(provide 'ox)
;; Local variables: