emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] emacs-26 11b37b4: Be lazy when starting Flymake checks


From: João Távora
Subject: [Emacs-diffs] emacs-26 11b37b4: Be lazy when starting Flymake checks
Date: Mon, 9 Oct 2017 06:13:15 -0400 (EDT)

branch: emacs-26
commit 11b37b4a9f3a032f307ff644ed76b31c3133f718
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>

    Be lazy when starting Flymake checks
    
    Don't start the check immediately if the buffer is not being
    displayed.  Wait until it is, using window-configuration-change-hook.
    
    This enables the user to batch-enable flymake-mode on many buffers and
    not have that operation exhaust system resources for checking each
    one.  Likewise, an editing or save operation in a currently
    non-displayed buffer does not immediately start a check.
    
    * lisp/progmodes/flymake.el (flymake-start-on-flymake-mode):
    Rename from flymake-start-syntax-check-on-find-file.
    (flymake-start-syntax-check-on-find-file): Obsolete alias for
    flymake-start-on-flymake-mode.
    (flymake-start): Redesign.  Affect the global post-command-hook
    and local window-configuraiton-change-hook.
    (flymake--schedule-timer-maybe)
    (flymake-after-change-function, flymake-after-save-hook): Pass
    t to flymake-start.
    
    * test/lisp/progmodes/flymake-tests.el (flymake-tests--call-with-fixture)
    (dummy-backends, recurrent-backend): Start flymake check
    explicitly and immediately.
---
 lisp/progmodes/flymake.el            | 89 ++++++++++++++++++++++++------------
 test/lisp/progmodes/flymake-tests.el | 12 +++--
 2 files changed, 68 insertions(+), 33 deletions(-)

diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 4c4d6ae..27ec7a1 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -123,10 +123,14 @@ If nil, never start checking buffer automatically like 
this."
 (make-obsolete-variable 'flymake-gui-warnings-enabled
                        "it no longer has any effect." "26.1")
 
-(defcustom flymake-start-syntax-check-on-find-file t
-  "Start syntax check on find file."
+(defcustom flymake-start-on-flymake-mode t
+  "Start syntax check when `pflymake-mode'is enabled.
+Specifically, start it when the buffer is actually displayed."
   :type 'boolean)
 
+(define-obsolete-variable-alias 'flymake-start-syntax-check-on-find-file
+  'flymake-start-on-flymake-mode "26.1")
+
 (defcustom flymake-log-level -1
   "Obsolete and ignored variable."
   :type 'integer)
@@ -670,33 +674,59 @@ If it is running also stop it."
        (flymake--disable-backend backend err)))))
 
 (defun flymake-start (&optional deferred force)
-  "Start a syntax check.
-Start it immediately, or after current command if DEFERRED is
-non-nil.  With optional FORCE run even disabled backends.
+  "Start a syntax check for the current buffer.
+DEFERRED is a list of symbols designating conditions to wait for
+before actually starting the check.  If it is nil (the list is
+empty), start it immediately, else defer the check to when those
+conditions are met.  Currently recognized conditions are
+`post-command', for waiting until the current command is over,
+`on-display', for waiting until the buffer is actually displayed
+in a window.  If DEFERRED is t, wait for all known conditions.
+
+With optional FORCE run even disabled backends.
 
 Interactively, with a prefix arg, FORCE is t."
   (interactive (list nil current-prefix-arg))
-  (cl-labels
-      ((start
-        ()
-        (remove-hook 'post-command-hook #'start 'local)
-        (setq flymake-check-start-time (float-time))
-        (run-hook-wrapped
-         'flymake-diagnostic-functions
-         (lambda (backend)
-           (cond
-            ((and (not force)
-                  (flymake--with-backend-state backend state
-                    (flymake--backend-state-disabled state)))
-             (flymake-log :debug "Backend %s is disabled, not starting"
-                          backend))
+  (let ((deferred (if (eq t deferred)
+                      '(post-command on-display)
+                    deferred))
+        (buffer (current-buffer)))
+    (cl-labels
+        ((start-post-command
+          ()
+          (remove-hook 'post-command-hook #'start-post-command
+                       nil)
+          (with-current-buffer buffer
+              (flymake-start (remove 'post-command deferred) force)))
+         (start-on-display
+          ()
+          (remove-hook 'window-configuration-change-hook #'start-on-display
+                       'local)
+          (flymake-start (remove 'on-display deferred) force)))
+      (cond ((and (memq 'post-command deferred)
+                  this-command)
+             (add-hook 'post-command-hook
+                       #'start-post-command
+                       'append nil))
+            ((and (memq 'on-display deferred)
+                  (not (get-buffer-window (current-buffer))))
+             (add-hook 'window-configuration-change-hook
+                       #'start-on-display
+                       'append 'local))
             (t
-             (flymake--run-backend backend)))
-           nil))))
-    (if (and deferred
-             this-command)
-        (add-hook 'post-command-hook #'start 'append 'local)
-      (start))))
+             (setq flymake-check-start-time (float-time))
+             (run-hook-wrapped
+              'flymake-diagnostic-functions
+              (lambda (backend)
+                (cond
+                 ((and (not force)
+                       (flymake--with-backend-state backend state
+                         (flymake--backend-state-disabled state)))
+                  (flymake-log :debug "Backend %s is disabled, not starting"
+                               backend))
+                 (t
+                  (flymake--run-backend backend)))
+                nil)))))))
 
 (defvar flymake-mode-map
   (let ((map (make-sparse-keymap))) map)
@@ -714,8 +744,7 @@ Interactively, with a prefix arg, FORCE is t."
 
     (setq flymake--backend-state (make-hash-table))
 
-    (when flymake-start-syntax-check-on-find-file
-      (flymake-start)))
+    (when flymake-start-on-flymake-mode (flymake-start t)))
 
    ;; Turning the mode OFF.
    (t
@@ -748,7 +777,7 @@ Do it only if `flymake-no-changes-timeout' is non-nil."
              (flymake-log
                :debug "starting syntax check after idle for %s seconds"
                flymake-no-changes-timeout)
-             (flymake-start))
+             (flymake-start t))
             (setq flymake-timer nil))))
       (current-buffer)))))
 
@@ -770,13 +799,13 @@ Do it only if `flymake-no-changes-timeout' is non-nil."
   (let((new-text (buffer-substring start stop)))
     (when (and flymake-start-syntax-check-on-newline (equal new-text "\n"))
       (flymake-log :debug "starting syntax check as new-line has been seen")
-      (flymake-start 'deferred))
+      (flymake-start t))
     (flymake--schedule-timer-maybe)))
 
 (defun flymake-after-save-hook ()
   (when flymake-mode
     (flymake-log :debug "starting syntax check as buffer was saved")
-    (flymake-start)))
+    (flymake-start t)))
 
 (defun flymake-kill-buffer-hook ()
   (when flymake-timer
diff --git a/test/lisp/progmodes/flymake-tests.el 
b/test/lisp/progmodes/flymake-tests.el
index 5e042f2..0b29b6a 100644
--- a/test/lisp/progmodes/flymake-tests.el
+++ b/test/lisp/progmodes/flymake-tests.el
@@ -73,7 +73,9 @@ SEVERITY-PREDICATE is used to setup
             (when sev-pred-supplied-p
               (setq-local flymake-proc-diagnostic-type-pred 
severity-predicate))
             (goto-char (point-min))
-            (unless flymake-mode (flymake-mode 1))
+            (let ((flymake-start-on-flymake-mode nil))
+              (unless flymake-mode (flymake-mode 1)))
+            (flymake-start)
             (flymake-tests--wait-for-backends)
             (funcall fn)))
       (and buffer
@@ -230,7 +232,9 @@ SEVERITY-PREDICATE is used to setup
                    'crashing-backend
                    ))
             (flymake-wrap-around nil))
-        (flymake-mode)
+        (let ((flymake-start-on-flymake-mode nil))
+          (flymake-mode))
+        (flymake-start)
 
         (flymake-tests--assert-set (flymake-running-backends)
           (error-backend warning-backend panicking-backend)
@@ -299,7 +303,9 @@ SEVERITY-PREDICATE is used to setup
         (let ((flymake-diagnostic-functions
                (list 'eager-backend))
               (flymake-wrap-around nil))
-          (flymake-mode)
+          (let ((flymake-start-on-flymake-mode nil))
+            (flymake-mode))
+          (flymake-start)
           (flymake-tests--assert-set (flymake-running-backends)
             (eager-backend) ())
           (cl-loop until tick repeat 4 do (sleep-for 0.2))



reply via email to

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