blob: fd55194bae747e7fa7ad59a2c5f71bc923576469 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
;; Does the preview buffer re-register after the let unwinds, on fontification?
(require 'org) (require 'org-element) (require 'org-persist)
(defvar rk-dir (make-temp-file "refute-" t))
(setq org-persist-directory (expand-file-name "persist" rk-dir))
(setq org-element-use-cache t org-element-cache-persistent t org-log-done nil)
(defvar rk-file (expand-file-name "notes.org" rk-dir))
(with-temp-file rk-file
(dotimes (i 20) (insert (format "* TODO task %d\nbody with src_python{1+1} inline\n" i))))
(defun rk-bufs (buf)
(with-current-buffer buf
(let (s) (avl-tree-mapc (lambda (el) (push (org-element-property :buffer el) s))
org-element--cache)
(delete-dups s))))
(let ((real (find-file-noselect rk-file)))
(with-current-buffer real
(org-element-cache-reset)
(org-element-cache-map #'ignore :granularity 'headline)
(goto-char (point-min)) (re-search-forward "^\\* TODO task 0") (beginning-of-line)
(org-todo "DONE"))
(message "before: %S" (rk-bufs real))
;; preview WITH the fix's environment, then let it LIVE and fontify (the step my tests skip)
(let ((prev (get-buffer-create "*prev*")))
(with-current-buffer prev
(with-silent-modifications
(insert-file-contents rk-file nil 0 1048576)
(setq buffer-file-name rk-file))
(eval `(let ((inhibit-message t) (non-essential t)
(enable-dir-local-variables nil) (enable-local-variables :safe)
(org-element-use-cache nil))
(setq-local delay-mode-hooks t) (set-auto-mode) (font-lock-mode 1)))
(message "after set-auto-mode: local-cache=%S global=%S persist-hook=%S"
org-element-use-cache (default-value 'org-element-use-cache)
(and (memq 'org-persist-write-all-buffer kill-buffer-hook) t))
;; THE MISSING STEP: the preview lives in a window and gets fontified
(font-lock-ensure)
(message "after fontify: persist-hook=%S cache-active=%S"
(and (memq 'org-persist-write-all-buffer kill-buffer-hook) t)
(org-element--cache-active-p)))
(let (kill-buffer-query-functions) (kill-buffer prev)))
(message "after kill: %S" (rk-bufs real))
(with-current-buffer real
(message "parse => %s"
(condition-case e (progn (org-element-cache-map
(lambda (el) (org-element-property :raw-value el))
:granularity 'headline) "OK")
(error (format "ERROR %S" e))))))
(delete-directory rk-dir t)
|