diff --git a/lisp/org.el b/lisp/org.el index 308bb7d51..025513e7a 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -12660,12 +12660,21 @@ Inherited tags have the `inherited' text property." (defun org-get-buffer-tags () "Get a table of all tags used in the buffer, for completion." - (org-with-point-at 1 - (let (tags) - (while (re-search-forward org-tag-line-re nil t) - (setq tags (nconc (split-string (match-string-no-properties 2) ":") - tags))) - (mapcar #'list (delete-dups (append org-file-tags tags)))))) + (if (org-element--cache-active-p) + ;; `org-element-cache-map' is about 2x faster compared to regexp + ;; search. + (let ((tags (org-element-cache-map + (lambda (el) (org-element-property :tags el))))) + (mapcar #'list (mapcar #'substring-no-properties + (delete-dups + (append org-file-tags + (apply #'append tags)))))) + (org-with-point-at 1 + (let (tags) + (while (re-search-forward org-tag-line-re nil t) + (setq tags (nconc (split-string (match-string-no-properties 2) ":") + tags))) + (mapcar #'list (delete-dups (append org-file-tags tags))))))) ;;;; The mapping API