From 24c1c9c423cd92d307033d56ca07692a23eab089 Mon Sep 17 00:00:00 2001 From: Allen Li Date: Tue, 18 Aug 2020 15:34:38 -0700 Subject: [PATCH] org.el: Don't exclude local tags that are also inherited This fixes a bug in set-tags-command excluding a tag that is both set locally and inherited from the initial minibuffer input by modifying org-get-tags to prefer keeping the locally set tag over the inherited tag, as this behavior is more intuitive for org-get-tags anyway. * lisp/org.el (org-get-tags): Keep local tags over inherited * testing/lisp/test-org.el (test-org/set-tags-command): Add test --- lisp/org.el | 14 ++++++++------ testing/lisp/test-org.el | 11 +++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index fb95590fc..71dbc611e 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -12290,7 +12290,8 @@ According to `org-use-tag-inheritance', tags may be inherited from parent headlines, and from the whole document, through `org-file-tags'. In this case, the returned list of tags contains tags in this order: file tags, tags inherited from -parent headlines, local tags. +parent headlines, local tags. If a tag appears multiple times, +only the most local tag is returned. However, when optional argument LOCAL is non-nil, only return tags specified at the headline. @@ -12306,12 +12307,13 @@ Inherited tags have the `inherited' text property." (let ((ltags (org--get-local-tags)) itags) (if (or local (not org-use-tag-inheritance)) ltags (while (org-up-heading-safe) - (setq itags (append (mapcar #'org-add-prop-inherited - (org--get-local-tags)) - itags))) + (setq itags (nconc (mapcar #'org-add-prop-inherited + (org--get-local-tags)) + itags))) (setq itags (append org-file-tags itags)) - (delete-dups - (append (org-remove-uninherited-tags itags) ltags)))))))) + (nreverse + (delete-dups + (nreverse (nconc (org-remove-uninherited-tags itags) ltags)))))))))) (defun org-get-buffer-tags () "Get a table of all tags used in the buffer, for completion." diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 4f8c74539..6144a7af1 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -6953,6 +6953,17 @@ Paragraph" (let ((org-use-fast-tag-selection nil) (org-tags-column 1)) (org-set-tags-command))) + (buffer-substring (point) (line-end-position))))) + ;; Handle tags both set locally and inherited. + (should + (equal "b :foo:" + (org-test-with-temp-text "* a :foo:\n** b :foo:" + (cl-letf (((symbol-function 'completing-read) + (lambda (prompt coll &optional pred req initial &rest args) + initial))) + (let ((org-use-fast-tag-selection nil) + (org-tags-column 1)) + (org-set-tags-command))) (buffer-substring (point) (line-end-position)))))) (ert-deftest test-org/toggle-tag () -- 2.28.0