org-element.el: Allow user to interrupt cache sync by default

* lisp/org-element.el (org-element--cache-interrupt-C-g,
org-element--cache-interrupt-C-g-max-count,
org-element--cache-interrupt-C-g-count): Add docstring and change
default value of `org-element--cache-interrupt-C-g' to t.
(org-element--parse-to): Show informative message when user tries to
interrupt in the middle of cache sync.
This commit is contained in:
Ihor Radchenko 2021-10-23 13:57:56 +08:00
parent 5315773e8a
commit 0a92b2db19
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 19 additions and 6 deletions

View File

@ -5772,9 +5772,16 @@ Properties are modified by side-effect."
(plist-get properties key))))
(and value (plist-put properties key (+ offset value)))))))
(defvar org-element--cache-interrupt-C-g nil)
(defvar org-element--cache-interrupt-C-g-max-count 5)
(defvar org-element--cache-interrupt-C-g-count 0)
(defvar org-element--cache-interrupt-C-g t
"When non-nil, allow the user to abort `org-element--cache-sync'.
The execution is aborted upon pressing `\\[keyboard-quit]'
`org-element--cache-interrupt-C-g-max-count' times.")
(defvar org-element--cache-interrupt-C-g-max-count 5
"`\\[keyboard-quit]' count to interrupt `org-element--cache-sync'.
See `org-element--cache-interrupt-C-g'.")
(defvar org-element--cache-interrupt-C-g-count 0
"Current number of `org-element--cache-sync' calls.
See `org-element--cache-interrupt-C-g'.")
(defun org-element--cache-sync (buffer &optional threshold future-change)
"Synchronize cache with recent modification in BUFFER.
@ -6267,15 +6274,21 @@ the process stopped before finding the expected result."
(while t
(when (org-element--cache-interrupt-p time-limit)
(throw 'interrupt nil))
(when (and inhibit-quit org-element--cache-interrupt-C-g)
(when (and inhibit-quit org-element--cache-interrupt-C-g quit-flag)
(when quit-flag
(cl-incf org-element--cache-interrupt-C-g-count)
(setq quit-flag nil))
(when (> org-element--cache-interrupt-C-g-count
(when (>= org-element--cache-interrupt-C-g-count
org-element--cache-interrupt-C-g-max-count)
(setq quit-flag t)
(setq org-element--cache-interrupt-C-g-count 0)
(org-element-cache-reset)
(error "org-element: Parsing aborted by user. Cache has been cleared.")))
(error "org-element: Parsing aborted by user. Cache has been cleared.
If you observe Emacs hangs frequently, please report this to Org mode mailing list (M-x org-submit-bug-report)."))
(message (substitute-command-keys
"`org-element--parse-buffer': Suppressed `\\[keyboard-quit]'. Press `\\[keyboard-quit]' %d more times to force interruption.")
(- org-element--cache-interrupt-C-g-max-count
org-element--cache-interrupt-C-g-count)))
(unless element
;; Do not try to parse within blank at EOB.
(unless (save-excursion