From 9c58082c46ef1ca0399953a7e9ff8e4a50f9e573 Mon Sep 17 00:00:00 2001 From: Carsten Dominik Date: Thu, 28 Feb 2013 08:57:44 +0100 Subject: [PATCH] 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. --- lisp/ox.el | 48 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/lisp/ox.el b/lisp/ox.el index 74d0d862a..26be0fbf3 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -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. - (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)) + (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))) (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 - ;; 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)))))) + (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))))))) (defun org-export--dispatch-ui (options first-key expertp) "Handle interface for `org-export-dispatch'.