diff --git a/lisp/org.el b/lisp/org.el index d299356ee..c6bd70216 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -14714,26 +14714,30 @@ When argument POS is non-nil, retrieve tags for headline at POS. According to `org-use-tags-inheritance', tags may be inherited from parent headlines, and from the whole document, through -`org-file-tags'. However, when optional argument LOCAL is -non-nil, only return tags specified at the headline. +`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. + +However, when optional argument LOCAL is non-nil, only return +tags specified at the headline. Inherited tags have the `inherited' text property." (if (and org-trust-scanner-tags - (or (not pos) (eq pos (point))) - (not local)) + (or (not pos) (eq pos (point))) + (not local)) org-scanner-tags (org-with-point-at (or pos (point)) (unless (org-before-first-heading-p) - (org-back-to-heading t) - (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 itags (append (mapcar #'org-add-prop-inherited - (org--get-local-tags)) - itags))) - (delete-dups - (append (org-remove-uninherited-tags itags) ltags)))))))) + (org-back-to-heading t) + (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 (append org-file-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." diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index a77c0f729..38df73d04 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -6217,6 +6217,17 @@ Paragraph" (let ((org-use-tag-inheritance t) (org-tags-exclude-from-inheritance '("foo"))) (org-get-tags))))) + ;; Test the collection of tags from #+filetags and parent tags. + (should + (equal '("a" "b" "c" "d") + (org-test-with-temp-text (concat "#+filetags: a\n" + "* Level 1 :b:\n" + "** Level 2 :c:\n" + "*** Level 3 :d:\n" + "") + (let ((org-use-tag-inheritance t)) + (org-mode-restart) ;So that `org-file-tags' get populated from #+filetags + (org-get-tags))))) ;; Pathological case: tagged headline with an empty body. (should (org-test-with-temp-text "* :tag:" (org-get-tags))))