Make repeating a subtree-restricted export command remember the subtree

Export commands can be restricted to a specific subtree.  When using a
prefix argument to org-export-dispatch, the restriction did not stick,
i.e. the command would be restricted to whatever note the cursor
happens to be in.  This made it difficult to repeat export of a
subtree while editing it.  This change introduces a new marker and
uses this marker to remember the cursor position of the previous
export command.  So repeating a subtree-restricted command will now
re-export the same subtree, provided you are still in the same
buffer.  To break this connection, just make a new export without
relying on the prefix argument.

* lisp/ox.el (org-export-dispatch-last-position): New variable
  (org-export-dispatch): Save position of cursor at the moment when
  the export command is called.  Restore that position temporarily
  when repeating the previous export command.
This commit is contained in:
Carsten Dominik 2013-02-28 08:57:44 +01:00
parent cbba811a73
commit 9c58082c46
1 changed files with 34 additions and 14 deletions

View File

@ -297,6 +297,10 @@ This variable is set with `org-export-define-backend' and
The value should be a list. Its CAR is the action, as a symbol,
and its CDR is a list of export options.")
(defvar org-export-dispatch-last-position (make-marker)
"The position where the last export command was created using the dispatcher.
This marker will be used with `C-u C-c C-e' to make sure export repetition
uses the same subtree if the previous command was restricted to a subtree.")
;;; User-configurable Variables
@ -5310,17 +5314,23 @@ When ARG is \\[universal-argument] \\[universal-argument], display the asynchron
((and arg org-export-dispatch-last-action))
(t (save-window-excursion
(unwind-protect
;; Store this export command.
(progn
;; Remember where we are
(move-marker org-export-dispatch-last-position
(point))
;; Get and store an export command
(setq org-export-dispatch-last-action
(org-export--dispatch-ui
(list org-export-initial-scope
(and org-export-in-background 'async))
nil
org-export-dispatch-use-expert-ui))
org-export-dispatch-use-expert-ui)))
(and (get-buffer "*Org Export Dispatcher*")
(kill-buffer "*Org Export Dispatcher*")))))))
(action (car input))
(optns (cdr input)))
(unless (memq 'subtree optns)
(move-marker org-export-dispatch-last-position nil))
(case action
;; First handle special hard-coded actions.
(stack (org-export-stack))
@ -5336,13 +5346,23 @@ When ARG is \\[universal-argument] \\[universal-argument], display the asynchron
(memq 'force optns)
(memq 'async optns)))
(publish-all (org-publish-all (memq 'force optns) (memq 'async optns)))
(otherwise (funcall action
(otherwise
(save-excursion
(when arg
;; Repeating command, maybe move cursor
;; to restore subtree context
(if (eq (marker-buffer org-export-dispatch-last-position)
(current-buffer))
(goto-char org-export-dispatch-last-position)
;; We are in a differnet buffer, forget position
(move-marker org-export-dispatch-last-position nil)))
(funcall action
;; Return a symbol instead of a list to ease
;; asynchronous export macro use.
(and (memq 'async optns) t)
(and (memq 'subtree optns) t)
(and (memq 'visible optns) t)
(and (memq 'body optns) t))))))
(and (memq 'body optns) t)))))))
(defun org-export--dispatch-ui (options first-key expertp)
"Handle interface for `org-export-dispatch'.