Nicolas Goaziou <m...@nicolasgoaziou.fr> writes: Hello,
> Thorsten Jolitz <tjol...@gmail.com> writes: > >> when programming with Org elements sometimes things seem to work and >> then something strange happens - what smells like a cache problem. I >> don't mean a cache bug, but a programmer (me) not taking the cache >> into account the right way. > > It might also be a cache problem. Do not hesitate to report it. Ok >> Is there a short introduction somewhere about the 'todos' and 'nogos' in >> programming with elements wrt to the org-element-cache? > > The only "nogo" is to never modify (destructively) a value returned by > `org-element-at-point' or `org-element-context'. Consider their return > value as read-only, and possibly invalid as soon as you modify the > buffer. This one directly applies to my use-case (wrt `org-element-at-point'). Is it ok to do these two things: - let-bind a value returned by `org-element-at-point' and modify it (with plist-put), and 1. then return the interpreted value or 2. do (delete-region ...) on old element and then insert the (interpreted) new one? - globally set a value returned by `org-element-at-point', modify it (with plist-put) in a function call, but use the variable as a quoted (!) function arg and reset the original value with this trick: #+begin_src emacs-lisp (setq X (org-element-at-point)) (defun foo (element &optional replace-p) (let ((elem (eval element))) [...destructively modify elem...] [...interpret elem ...] (when replace-p [...delete old-element ...] [...insert interpreted elem, goto beg ...] (set element (org-element-at-point))))) (foo 'X t) #+end_src > These advices don't apply to `org-element-parse-buffer', which doesn't > use cache (if it did, it should copy cached elements beforehand anyway). Ok -- cheers, Thorsten