Hi,

When I run (org-set-tags t t) to realign all tags in the buffer, it
doesn't work unless the point is currently on a headline, because
org-set-tags calls (org-get-tags-string) early on, and
org-get-tags-string raises an error if not on a headline. This can be
fixed by moving the binding of `current' to `(org-get-tags-string)'
into the else clause of the first if statment. I have attached a patch

-Ryan
--
diff --git a/lisp/org.el b/lisp/org.el
index dc45871..1745116 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -12113,7 +12113,7 @@ If DATA is nil or the empty string, any tags will be removed."
 With prefix ARG, realign all tags in headings in the current buffer."
   (interactive "P")
   (let* ((re (concat "^" outline-regexp))
-	 (current (org-get-tags-string))
+	 ;(current (org-get-tags-string))
 	 (col (current-column))
 	 (org-setting-tags t)
 	 table current-tags inherited-tags ; computed below when needed
@@ -12126,68 +12126,71 @@ With prefix ARG, realign all tags in headings in the current buffer."
 	      (org-set-tags nil t)
 	      (end-of-line 1)))
 	  (message "All tags realigned to column %d" org-tags-column))
-      (if just-align
-	  (setq tags current)
-	;; Get a new set of tags from the user
-	(save-excursion
-	  (setq table (append org-tag-persistent-alist
-			      (or org-tag-alist (org-get-buffer-tags))
-			      (and org-complete-tags-always-offer-all-agenda-tags
-				   (org-global-tags-completion-table (org-agenda-files))))
-		org-last-tags-completion-table table
-		current-tags (org-split-string current ":")
-		inherited-tags (nreverse
-				(nthcdr (length current-tags)
-					(nreverse (org-get-tags-at))))
-		tags
-		(if (or (eq t org-use-fast-tag-selection)
-			(and org-use-fast-tag-selection
-			     (delq nil (mapcar 'cdr table))))
-		    (org-fast-tag-selection
-		     current-tags inherited-tags table
-		     (if org-fast-tag-selection-include-todo org-todo-key-alist))
-		  (let ((org-add-colon-after-tag-completion t))
-		    (org-trim
-		     (org-without-partial-completion
-		      (org-icompleting-read "Tags: " 'org-tags-completion-function
-				       nil nil current 'org-tags-history)))))))
-	(while (string-match "[-+&]+" tags)
-	  ;; No boolean logic, just a list
-	  (setq tags (replace-match ":" t t tags))))
-
-      (if org-tags-sort-function
-      	  (setq tags (mapconcat 'identity
-      				(sort (org-split-string tags (org-re "[^[:alnum:]...@]+"))
-      				      org-tags-sort-function) ":")))
-
-      (if (string-match "\\`[\t ]*\\'" tags)
-	  (setq tags "")
-	(unless (string-match ":$" tags) (setq tags (concat tags ":")))
-	(unless (string-match "^:" tags) (setq tags (concat ":" tags))))
-
-      ;; Insert new tags at the correct column
-      (beginning-of-line 1)
-      (cond
-       ((and (equal current "") (equal tags "")))
-       ((re-search-forward
-	 (concat "\\([ \t]*" (regexp-quote current) "\\)[ \t]*$")
-	 (point-at-eol) t)
-	(if (equal tags "")
-	    (setq rpl "")
-	  (goto-char (match-beginning 0))
-	  (setq c0 (current-column) p0 (if (equal (char-before) ?*)
-					   (1+ (point)) (point))
-		c1 (max (1+ c0) (if (> org-tags-column 0)
-				    org-tags-column
-				  (- (- org-tags-column) (length tags))))
-		rpl (concat (make-string (max 0 (- c1 c0)) ?\ ) tags)))
-	(replace-match rpl t t)
-	(and (not (featurep 'xemacs)) c0 indent-tabs-mode (tabify p0 (point)))
-	tags)
-       (t (error "Tags alignment failed")))
-      (org-move-to-column col)
-      (unless just-align
-	(run-hooks 'org-after-tags-change-hook)))))
+      ;(let ((current (unless arg (org-get-tags-string))))
+      (let ((current (org-get-tags-string)))
+        (if just-align
+
+            (setq tags current)
+          ;; Get a new set of tags from the user
+          (save-excursion
+            (setq table (append org-tag-persistent-alist
+                                (or org-tag-alist (org-get-buffer-tags))
+                                (and org-complete-tags-always-offer-all-agenda-tags
+                                     (org-global-tags-completion-table (org-agenda-files))))
+                  org-last-tags-completion-table table
+                  current-tags (org-split-string current ":")
+                  inherited-tags (nreverse
+                                  (nthcdr (length current-tags)
+                                          (nreverse (org-get-tags-at))))
+                  tags
+                  (if (or (eq t org-use-fast-tag-selection)
+                          (and org-use-fast-tag-selection
+                               (delq nil (mapcar 'cdr table))))
+                      (org-fast-tag-selection
+                       current-tags inherited-tags table
+                       (if org-fast-tag-selection-include-todo org-todo-key-alist))
+                    (let ((org-add-colon-after-tag-completion t))
+                      (org-trim
+                       (org-without-partial-completion
+                        (org-icompleting-read "Tags: " 'org-tags-completion-function
+                                              nil nil current 'org-tags-history)))))))
+          (while (string-match "[-+&]+" tags)
+            ;; No boolean logic, just a list
+            (setq tags (replace-match ":" t t tags))))
+
+        (if org-tags-sort-function
+            (setq tags (mapconcat 'identity
+                                  (sort (org-split-string tags (org-re "[^[:alnum:]...@]+"))
+                                        org-tags-sort-function) ":")))
+
+        (if (string-match "\\`[\t ]*\\'" tags)
+            (setq tags "")
+          (unless (string-match ":$" tags) (setq tags (concat tags ":")))
+          (unless (string-match "^:" tags) (setq tags (concat ":" tags))))
+
+        ;; Insert new tags at the correct column
+        (beginning-of-line 1)
+        (cond
+         ((and (equal current "") (equal tags "")))
+         ((re-search-forward
+           (concat "\\([ \t]*" (regexp-quote current) "\\)[ \t]*$")
+           (point-at-eol) t)
+          (if (equal tags "")
+              (setq rpl "")
+            (goto-char (match-beginning 0))
+            (setq c0 (current-column) p0 (if (equal (char-before) ?*)
+                                             (1+ (point)) (point))
+                  c1 (max (1+ c0) (if (> org-tags-column 0)
+                                      org-tags-column
+                                    (- (- org-tags-column) (length tags))))
+                  rpl (concat (make-string (max 0 (- c1 c0)) ?\ ) tags)))
+          (replace-match rpl t t)
+          (and (not (featurep 'xemacs)) c0 indent-tabs-mode (tabify p0 (point)))
+          tags)
+         (t (error "Tags alignment failed")))
+        (org-move-to-column col)
+        (unless just-align
+          (run-hooks 'org-after-tags-change-hook))))))
 
 (defun org-change-tag-in-region (beg end tag off)
   "Add or remove TAG for each entry in the region.
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

Reply via email to