Ensure that org-get-tags returns all local tags

* lisp/org.el: (org-get-tags) Create a clearer separation between
  local and inherited tags in the function, so that
  org-remove-uninherited tags is only run on inherited tags. This is
  important to avoid destroying existing tags when adding new tags.
* testing/lisp/test-org.el: (test-org/get-tags) Add regression test
This commit is contained in:
Matt Lundin 2018-07-25 07:48:10 -05:00 committed by Nicolas Goaziou
parent ab1f7712de
commit 5e27b2fd32
2 changed files with 15 additions and 7 deletions

View File

@ -14722,14 +14722,15 @@ Inherited tags have the `inherited' text property."
(org-with-point-at (or pos (point))
(unless (org-before-first-heading-p)
(org-back-to-heading t)
(let ((tags (org--get-local-tags)))
(if (or local (not org-use-tag-inheritance)) tags
(let ((ltags (org--get-local-tags)) itags)
(if (or local (not org-use-tag-inheritance)) ltags
(setq itags org-file-tags)
(while (org-up-heading-safe)
(setq tags (append (mapcar #'org-add-prop-inherited
(org--get-local-tags))
tags)))
(org-remove-uninherited-tags
(delete-dups (append org-file-tags tags)))))))))
(setq itags (append (mapcar #'org-add-prop-inherited
(org--get-local-tags))
itags)))
(delete-dups
(append (org-remove-uninherited-tags itags) ltags))))))))
(defun org-get-buffer-tags ()
"Get a table of all tags used in the buffer, for completion."

View File

@ -6190,6 +6190,13 @@ Paragraph<point>"
(equal '("foo")
(org-test-with-temp-text "* H1 :foo:\n* <point>H2 :bar:"
(org-get-tags 1))))
;; Make sure tags excluded from inheritance are returned if local
(should
(equal '("foo")
(org-test-with-temp-text "* Test :foo:"
(let ((org-use-tag-inheritance t)
(org-tags-exclude-from-inheritance '("foo")))
(org-get-tags)))))
;; Pathological case: tagged headline with an empty body.
(should (org-test-with-temp-text "* :tag:" (org-get-tags))))