Parcourir la source

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.
Carsten Dominik il y a 12 ans
Parent
commit
9c58082c46
1 fichiers modifiés avec 34 ajouts et 14 suppressions
  1. 34 14
      lisp/ox.el

+ 34 - 14
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'.