diff options
author | Carsten Dominik <carsten.dominik@gmail.com> | 2013-02-28 08:57:44 +0100 |
---|---|---|
committer | Carsten Dominik <carsten.dominik@gmail.com> | 2013-02-28 09:35:34 +0100 |
commit | 9c58082c46ef1ca0399953a7e9ff8e4a50f9e573 (patch) | |
tree | c5ffb3eba3b2edd332ec218eba84fd4ce8245db4 | |
parent | cbba811a733a1a49213d8df13a7b598f1229212f (diff) | |
download | org-mode-9c58082c46ef1ca0399953a7e9ff8e4a50f9e573.tar.gz |
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.
-rw-r--r-- | lisp/ox.el | 48 |
1 files changed, 34 insertions, 14 deletions
@@ -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'. |