emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 38439a4 301/433: Reparse mmm-mode buffer when Emacs is idl


From: Dmitry Gutov
Subject: [elpa] master 38439a4 301/433: Reparse mmm-mode buffer when Emacs is idle
Date: Thu, 15 Mar 2018 19:44:24 -0400 (EDT)

branch: master
commit 38439a4cea8c414159c27235546db68d0e86e796
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    Reparse mmm-mode buffer when Emacs is idle
---
 mmm-region.el | 10 +++++++---
 mmm-vars.el   | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/mmm-region.el b/mmm-region.el
index b3b0c5d..7d94b75 100644
--- a/mmm-region.el
+++ b/mmm-region.el
@@ -592,11 +592,15 @@ different keymaps, syntax tables, local variables, etc. 
for submodes."
 (defun mmm-add-hooks ()
   (if (featurep 'xemacs)
       (make-local-hook 'post-command-hook))
-  ;; FIXME: Use text properties `point-entered' and `point-left' instead?
-  (add-hook 'post-command-hook 'mmm-update-submode-region nil 'local))
+  (add-hook 'post-command-hook 'mmm-update-submode-region nil t)
+  (when mmm-parse-when-idle
+    (add-hook 'pre-command-hook 'mmm-mode-reset-timer nil t)
+    (add-hook 'after-change-functions 'mmm-mode-edit nil t)))
 
 (defun mmm-remove-hooks ()
-  (remove-hook 'post-command-hook 'mmm-update-submode-region 'local))
+  (remove-hook 'post-command-hook 'mmm-update-submode-region t)
+  (remove-hook 'pre-command-hook 'mmm-mode-reset-timer t)
+  (remove-hook 'after-change-functions 'mmm-mode-edit t))
 
 ;;}}}
 ;;{{{ Local Variables
diff --git a/mmm-vars.el b/mmm-vars.el
index 6f171c6..f1023b6 100644
--- a/mmm-vars.el
+++ b/mmm-vars.el
@@ -784,6 +784,44 @@ parent buffer.  In general, this has been found to cause 
more problems
 than it solves, but some modes require it.")
 
 ;;}}}
+;;{{{ Idle Parsing
+
+(defcustom mmm-parse-when-idle nil
+  "Non-nil to automatically reparse the buffer when it has some
+  modifications and Emacs has been idle for `mmm-idle-timer-delay'."
+  :type 'boolean
+  :group 'mmm)
+
+(defcustom mmm-idle-timer-delay 0.2
+  "Delay in secs before re-parsing after user makes changes."
+  :type 'number
+  :group 'mmm)
+(make-variable-buffer-local 'mmm-idle-timer-delay)
+
+(defvar mmm-mode-parse-timer nil "Private variable.")
+(make-variable-buffer-local 'mmm-mode-parse-timer)
+(defvar mmm-mode-buffer-dirty nil "Private variable.")
+(make-variable-buffer-local 'mmm-mode-buffer-dirty)
+
+(defun mmm-mode-edit (beg end len)
+  (setq mmm-mode-buffer-dirty t)
+  (mmm-mode-reset-timer))
+
+(defun mmm-mode-reset-timer ()
+  (when mmm-mode-parse-timer
+    (cancel-timer mmm-mode-parse-timer))
+  (setq mmm-mode-parse-timer
+        (run-with-idle-timer mmm-idle-timer-delay nil
+                             #'mmm-mode-idle-reparse (current-buffer))))
+
+(defun mmm-mode-idle-reparse (buffer)
+  (with-current-buffer buffer
+    (when mmm-mode-buffer-dirty
+      (mmm-apply-all)
+      (setq mmm-mode-buffer-dirty nil)
+      (setq mmm-mode-parse-timer nil))))
+
+;;}}}
 
 ;; NON-USER VARIABLES
 ;;{{{ Mode Variable



reply via email to

[Prev in Thread] Current Thread [Next in Thread]