aboutsummaryrefslogtreecommitdiff
path: root/working/org-element-cache-persist-bug/refute-fontify-rearms.el
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)