Function: org-fold-core--property-symbol-get-create
org-fold-core--property-symbol-get-create is a byte-compiled function
defined in org-fold-core.el.gz.
Signature
(org-fold-core--property-symbol-get-create SPEC &optional BUFFER RETURN-ONLY)
Documentation
Return a unique symbol suitable as folding text property.
Return value is unique for folding SPEC in BUFFER.
If the buffer already have buffer-local setup in char-property-alias-alist
and the setup appears to be created for different buffer,
copy the old invisibility state into new buffer-local text properties,
unless RETURN-ONLY is non-nil.
Source Code
;; Defined in /usr/src/emacs/lisp/org/org-fold-core.el.gz
;; This is the core function used to fold text in buffers. We use
;; text properties to hide folded text, however 'invisible property is
;; not directly used (unless risky `org-fold-core--optimize-for-huge-buffers' is
;; enabled). Instead, we define unique text property (folding
;; property) for every possible folding spec and add the resulting
;; text properties into `char-property-alias-alist', so that
;; 'invisible text property is automatically defined if any of the
;; folding properties is non-nil. This approach lets us maintain
;; multiple folds for the same text region - poor man's overlays (but
;; much faster). Additionally, folding properties are ensured to be
;; unique for different buffers (especially for indirect
;; buffers). This is done to allow different folding states in
;; indirect buffers.
(defun org-fold-core--property-symbol-get-create (spec &optional buffer return-only)
"Return a unique symbol suitable as folding text property.
Return value is unique for folding SPEC in BUFFER.
If the buffer already have buffer-local setup in `char-property-alias-alist'
and the setup appears to be created for different buffer,
copy the old invisibility state into new buffer-local text properties,
unless RETURN-ONLY is non-nil."
(if (eq org-fold-core-style 'overlays)
(or (gethash (cons 'global spec) org-fold-core--property-symbol-cache)
(puthash (cons 'global spec)
(org-fold-core-get-folding-property-symbol spec nil 'global)
org-fold-core--property-symbol-cache))
(let* ((buf (or buffer (current-buffer))))
;; Create unique property symbol for SPEC in BUFFER
(let ((local-prop (or (gethash (cons buf spec) org-fold-core--property-symbol-cache)
(puthash (cons buf spec)
(org-fold-core-get-folding-property-symbol
spec buf
(org-fold-core-get-folding-spec-property spec :global))
org-fold-core--property-symbol-cache))))
(prog1
local-prop
(unless return-only
(with-current-buffer buf
;; Update folding properties carried over from other
;; buffer (implying that current buffer is indirect
;; buffer). Normally, `char-property-alias-alist' in new
;; indirect buffer is a copy of the same variable from
;; the base buffer. Then, `char-property-alias-alist'
;; would contain folding properties, which are not
;; matching the generated `local-prop'.
(unless (member local-prop (cdr (assq 'invisible char-property-alias-alist)))
;; Copy all the old folding properties to preserve the folding state
(with-silent-modifications
(dolist (old-prop (cdr (assq 'invisible char-property-alias-alist)))
(org-with-wide-buffer
(let* ((pos (point-min))
(spec (org-fold-core-get-folding-spec-from-folding-prop old-prop))
;; Generate new buffer-unique folding property
(new-prop (when spec (org-fold-core--property-symbol-get-create spec nil 'return-only))))
;; Copy the visibility state for `spec' from `old-prop' to `new-prop'
(unless (eq old-prop new-prop)
(while (< pos (point-max))
(let ((val (get-text-property pos old-prop))
(next (next-single-char-property-change pos old-prop)))
(when val
(put-text-property pos next new-prop val))
(setq pos next)))))))
;; Update `char-property-alias-alist' with folding
;; properties unique for the current buffer.
(setq-local char-property-alias-alist
(cons (cons 'invisible
(mapcar (lambda (spec)
(org-fold-core--property-symbol-get-create spec nil 'return-only))
(org-fold-core-folding-spec-list)))
(remove (assq 'invisible char-property-alias-alist)
char-property-alias-alist)))
;; Set folding property stickiness according to
;; their `:font-sticky' and `:rear-sticky'
;; parameters.
(let (full-prop-list)
(org-fold-core-cycle-over-indirect-buffers
(setq full-prop-list
(append full-prop-list
(delq nil
(mapcar (lambda (spec)
(cond
((org-fold-core-get-folding-spec-property spec :front-sticky)
(cons (org-fold-core--property-symbol-get-create spec nil 'return-only)
nil))
((org-fold-core-get-folding-spec-property spec :rear-sticky)
nil)
(t
(cons (org-fold-core--property-symbol-get-create spec nil 'return-only)
t))))
(org-fold-core-folding-spec-list))))))
(org-fold-core-cycle-over-indirect-buffers
(setq-local text-property-default-nonsticky
(delete-dups (append
text-property-default-nonsticky
full-prop-list))))))))))))))