Function: org-buffer-property-keys
org-buffer-property-keys is a byte-compiled function defined in
org.el.gz.
Signature
(org-buffer-property-keys &optional SPECIALS DEFAULTS COLUMNS)
Documentation
Get all property keys in the current buffer.
When SPECIALS is non-nil, also list the special properties that reflect things like tags and TODO state.
When DEFAULTS is non-nil, also include properties that has special meaning internally: ARCHIVE, CATEGORY, SUMMARY, DESCRIPTION, LOCATION, and LOGGING and others.
When COLUMNS in non-nil, also include property names given in COLUMN formats in the current buffer.
Source Code
;; Defined in /usr/src/emacs/lisp/org/org.el.gz
(defun org-buffer-property-keys (&optional specials defaults columns)
"Get all property keys in the current buffer.
When SPECIALS is non-nil, also list the special properties that
reflect things like tags and TODO state.
When DEFAULTS is non-nil, also include properties that has
special meaning internally: ARCHIVE, CATEGORY, SUMMARY,
DESCRIPTION, LOCATION, and LOGGING and others.
When COLUMNS in non-nil, also include property names given in
COLUMN formats in the current buffer."
(let ((case-fold-search t)
(props (append
(and specials org-special-properties)
(and defaults (cons org-effort-property org-default-properties))
;; Get property names from #+PROPERTY keywords as well
(mapcar (lambda (s)
(nth 0 (split-string s)))
(cdar (org-collect-keywords '("PROPERTY")))))))
(org-with-wide-buffer
(goto-char (point-min))
(while (re-search-forward org-property-start-re nil t)
(catch :skip
(let ((range (org-get-property-block)))
(unless range (throw :skip nil))
(goto-char (car range))
(let ((begin (car range))
(end (cdr range)))
;; Make sure that found property block is not located
;; before current point, as it would generate an infloop.
;; It can happen, for example, in the following
;; situation:
;;
;; * Headline
;; :PROPERTIES:
;; ...
;; :END:
;; *************** Inlinetask
;; #+BEGIN_EXAMPLE
;; :PROPERTIES:
;; #+END_EXAMPLE
;;
(if (< begin (point)) (throw :skip nil) (goto-char begin))
(while (< (point) end)
(let ((p (progn (looking-at org-property-re)
(match-string-no-properties 2))))
;; Only add true property name, not extension symbol.
(push (if (not (string-match-p "\\+\\'" p)) p
(substring p 0 -1))
props))
(forward-line))))
(outline-next-heading)))
(when columns
(goto-char (point-min))
(while (re-search-forward "^[ \t]*\\(?:#\\+\\|:\\)COLUMNS:" nil t)
(let ((element (org-element-at-point)))
(when (org-element-type-p element '(keyword node-property))
(let ((value (org-element-property :value element))
(start 0))
(while (string-match "%[0-9]*\\([[:alnum:]_-]+\\)\\(([^)]+)\\)?\
\\(?:{[^}]+}\\)?"
value start)
(setq start (match-end 0))
(let ((p (match-string-no-properties 1 value)))
(unless (member-ignore-case p org-special-properties)
(push p props))))))))))
(sort (delete-dups
(append props
;; for each xxx_ALL property, make sure the bare
;; xxx property is also included
(delq nil (mapcar (lambda (p)
(and (string-match-p "._ALL\\'" p)
(substring p 0 -4)))
props))))
(lambda (a b) (string< (upcase a) (upcase b))))))