|
@@ -14205,21 +14205,28 @@ If ONOFF is `on' or `off', don't toggle but set to this state."
|
|
|
|
|
|
(defun org--align-tags-here (to-col)
|
|
|
"Align tags on the current headline to TO-COL.
|
|
|
-Assume point is on a headline."
|
|
|
- (when (and (org-match-line org-tag-line-re)
|
|
|
- (< (point) (match-beginning 1)))
|
|
|
- (let ((pos (point))
|
|
|
- (shift (if (>= to-col 0) to-col
|
|
|
- (- (abs to-col) (string-width (match-string 1))))))
|
|
|
- ;; Delete all blanks before tags.
|
|
|
- (goto-char (match-beginning 1))
|
|
|
- (skip-chars-backward " \t")
|
|
|
- (delete-region (point) (match-beginning 1))
|
|
|
- ;; Insert new blanks.
|
|
|
- (insert (make-string (max 1 (- shift (current-column))) ?\s))
|
|
|
- ;; Preserve initial position, if possible. In any case, stop
|
|
|
- ;; before tags.
|
|
|
- (when (< pos (point)) (goto-char pos)))))
|
|
|
+Assume point is on a headline. Preserve point when aligning
|
|
|
+tags."
|
|
|
+ (when (org-match-line org-tag-line-re)
|
|
|
+ (let* ((shift (if (>= to-col 0) to-col
|
|
|
+ (- (abs to-col) (string-width (match-string 1)))))
|
|
|
+ (origin (point-marker))
|
|
|
+ (column (current-column))
|
|
|
+ (tags-start (match-beginning 1))
|
|
|
+ (blank-start (save-excursion
|
|
|
+ (goto-char tags-start)
|
|
|
+ (skip-chars-backward " \t")
|
|
|
+ (point)))
|
|
|
+ (in-blank? (and (> origin blank-start)
|
|
|
+ (<= origin tags-start))))
|
|
|
+ (delete-region blank-start tags-start)
|
|
|
+ (goto-char blank-start)
|
|
|
+ (let ((indent-tabs-mode nil)) (indent-to shift 1))
|
|
|
+ ;; Try to move back to original position. If point was in the
|
|
|
+ ;; blanks before the tags, ORIGIN marker is of no use because it
|
|
|
+ ;; now points to BLANK-START. Use COLUMN instead.
|
|
|
+ (if in-blank? (org-move-to-column column)
|
|
|
+ (goto-char origin)))))
|
|
|
|
|
|
(defun org-set-tags-command (&optional arg)
|
|
|
"Set the tags for the current visible entry.
|
|
@@ -14246,57 +14253,61 @@ in Lisp code use `org-set-tags' instead."
|
|
|
'region)
|
|
|
(lambda () (when (org-invisible-p) (org-end-of-subtree nil t))))))
|
|
|
(t
|
|
|
- (org-back-to-heading)
|
|
|
- (let* ((all-tags (org-get-tags))
|
|
|
- (table (setq org-last-tags-completion-table
|
|
|
- (org--tag-add-to-alist
|
|
|
- (and org-complete-tags-always-offer-all-agenda-tags
|
|
|
- (org-global-tags-completion-table
|
|
|
- (org-agenda-files)))
|
|
|
- (or org-current-tag-alist (org-get-buffer-tags)))))
|
|
|
- (current-tags
|
|
|
- (cl-remove-if (lambda (tag) (get-text-property 0 'inherited tag))
|
|
|
- all-tags))
|
|
|
- (inherited-tags
|
|
|
- (cl-remove-if-not (lambda (tag) (get-text-property 0 'inherited tag))
|
|
|
- all-tags))
|
|
|
- (tags
|
|
|
- (replace-regexp-in-string
|
|
|
- ;; Ignore all forbidden characters in tags.
|
|
|
- "[^[:alnum:]_@#%]+" ":"
|
|
|
- (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
|
|
|
- (and org-fast-tag-selection-include-todo org-todo-key-alist))
|
|
|
- (let ((org-add-colon-after-tag-completion (< 1 (length table))))
|
|
|
- (org-trim (completing-read
|
|
|
- "Tags: "
|
|
|
- #'org-tags-completion-function
|
|
|
- nil nil (org-make-tag-string current-tags)
|
|
|
- 'org-tags-history)))))))
|
|
|
- (org-set-tags tags)))))
|
|
|
+ (save-excursion
|
|
|
+ (org-back-to-heading)
|
|
|
+ (let* ((all-tags (org-get-tags))
|
|
|
+ (table (setq org-last-tags-completion-table
|
|
|
+ (org--tag-add-to-alist
|
|
|
+ (and org-complete-tags-always-offer-all-agenda-tags
|
|
|
+ (org-global-tags-completion-table
|
|
|
+ (org-agenda-files)))
|
|
|
+ (or org-current-tag-alist (org-get-buffer-tags)))))
|
|
|
+ (current-tags
|
|
|
+ (cl-remove-if (lambda (tag) (get-text-property 0 'inherited tag))
|
|
|
+ all-tags))
|
|
|
+ (inherited-tags
|
|
|
+ (cl-remove-if-not (lambda (tag) (get-text-property 0 'inherited tag))
|
|
|
+ all-tags))
|
|
|
+ (tags
|
|
|
+ (replace-regexp-in-string
|
|
|
+ ;; Ignore all forbidden characters in tags.
|
|
|
+ "[^[:alnum:]_@#%]+" ":"
|
|
|
+ (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
|
|
|
+ (and org-fast-tag-selection-include-todo org-todo-key-alist))
|
|
|
+ (let ((org-add-colon-after-tag-completion (< 1 (length table))))
|
|
|
+ (org-trim (completing-read
|
|
|
+ "Tags: "
|
|
|
+ #'org-tags-completion-function
|
|
|
+ nil nil (org-make-tag-string current-tags)
|
|
|
+ 'org-tags-history)))))))
|
|
|
+ (org-set-tags tags))))))
|
|
|
|
|
|
(defun org-align-tags (&optional all)
|
|
|
"Align tags in current entry.
|
|
|
When optional argument ALL is non-nil, align all tags in the
|
|
|
visible part of the buffer."
|
|
|
- (save-excursion
|
|
|
- (if all (goto-char (point-min)) (org-back-to-heading t))
|
|
|
- (catch :single
|
|
|
- (while (re-search-forward org-tag-line-re nil t)
|
|
|
- (let* ((offset (if (bound-and-true-p org-indent-mode)
|
|
|
- (* (1- org-indent-indentation-per-level)
|
|
|
- (1- (org-current-level)))
|
|
|
- 0))
|
|
|
- (tags-column (+ org-tags-column
|
|
|
- (if (> org-tags-column 0) (- offset) offset))))
|
|
|
- (beginning-of-line)
|
|
|
- (org--align-tags-here tags-column)
|
|
|
- (if all (forward-line) (throw :single nil)))))))
|
|
|
+ (let ((get-indent-column
|
|
|
+ (lambda ()
|
|
|
+ (let ((offset (if (bound-and-true-p org-indent-mode)
|
|
|
+ (* (1- org-indent-indentation-per-level)
|
|
|
+ (1- (org-current-level)))
|
|
|
+ 0)))
|
|
|
+ (+ org-tags-column
|
|
|
+ (if (> org-tags-column 0) (- offset) offset))))))
|
|
|
+ (if (and (not all) (org-at-heading-p))
|
|
|
+ (org--align-tags-here (funcall get-indent-column))
|
|
|
+ (save-excursion
|
|
|
+ (if all
|
|
|
+ (while (re-search-forward org-tag-line-re nil t)
|
|
|
+ (org--align-tags-here (funcall get-indent-column)))
|
|
|
+ (org-back-to-heading t)
|
|
|
+ (org--align-tags-here (funcall get-indent-column)))))))
|
|
|
|
|
|
(defun org-set-tags (tags)
|
|
|
"Set the tags of the current entry to TAGS, replacing current tags.
|