emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] emacs-26 7a1133f: Misc. minor adjustments to Flymake


From: João Távora
Subject: [Emacs-diffs] emacs-26 7a1133f: Misc. minor adjustments to Flymake
Date: Wed, 4 Oct 2017 22:10:26 -0400 (EDT)

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

    Misc. minor adjustments to Flymake
    
    - Add a half-decent minor-mode menu;
    - Fix "waiting for backends" mode line message;
    - Adjust the flymake-diag-region API;
    - Autoload the flymake-log macro;
    - Auto-disable the legacy backend in more situations;
    - Fix a couple of warnings in legacy backend.
    
    * lisp/progmodes/flymake-proc.el
    (flymake-proc--diagnostics-for-pattern): Use new
    flymake-diag-region.
    
    * lisp/progmodes/flymake-proc.el
    (flymake-proc-legacy-flymake): Do error when no
    buffer-file-name or not writable.
    (flymake-proc-legacy-flymake)
    (flymake-proc-simple-cleanup): Don't reference flymake-last-change-time
    
    * lisp/progmodes/flymake.el (flymake-diag-region):
    Autoload.  Take buffer as first argument.
    
    * lisp/progmodes/flymake.el (flymake-switch-to-log-buffer):
    New command.
    (flymake-menu): Add a simple menu.
    (flymake--mode-line-format): Use menu.  Fix message.  Switch to
    log buffer when clicking exceptional warnings.
---
 lisp/progmodes/flymake-proc.el |  38 +++++++--------
 lisp/progmodes/flymake.el      | 103 ++++++++++++++++++++++++-----------------
 2 files changed, 80 insertions(+), 61 deletions(-)

diff --git a/lisp/progmodes/flymake-proc.el b/lisp/progmodes/flymake-proc.el
index 47ec27f..d088197 100644
--- a/lisp/progmodes/flymake-proc.el
+++ b/lisp/progmodes/flymake-proc.el
@@ -522,13 +522,13 @@ Create parent directories as needed."
          for buffer = (and full-file
                            (find-buffer-visiting full-file))
          if (and (eq buffer (process-buffer proc)) message)
-         collect (with-current-buffer buffer
-                   (pcase-let ((`(,beg . ,end)
-                                (flymake-diag-region line-number col-number)))
-                     (flymake-make-diagnostic
-                      buffer beg end
-                      (guess-type flymake-proc-diagnostic-type-pred message)
-                      message)))
+         collect (pcase-let ((`(,beg . ,end)
+                              (flymake-diag-region buffer line-number 
col-number)))
+                   (flymake-make-diagnostic
+                    buffer beg end
+                    (with-current-buffer buffer
+                      (guess-type flymake-proc-diagnostic-type-pred message))
+                    message))
          else
          do (flymake-log 2 "Reference to file %s is out of scope" fname))
       (error
@@ -742,16 +742,18 @@ can also be executed interactively independently of
            "There's already a Flymake process running in this buffer")
           (kill-process proc))))
     (when
-        ;; A number of situations make us not want to error right away
-        ;; (and disable ourselves), in case the situation changes in
-        ;; the near future.
-        (and buffer-file-name
-             ;; Since we write temp files in current dir, there's no point
-             ;; trying if the directory is read-only (bug#8954).
-             (file-writable-p (file-name-directory buffer-file-name))
-             (or (not flymake-proc-compilation-prevents-syntax-check)
+        ;; This particular situation make us not want to error right
+        ;; away (and disable ourselves), in case the situation changes
+        ;; in the near future.
+        (and (or (not flymake-proc-compilation-prevents-syntax-check)
                  (not (flymake-proc--compilation-is-running))))
-      (let ((init-f (flymake-proc--get-init-function buffer-file-name)))
+      (let ((init-f
+             (and
+              buffer-file-name
+              ;; Since we write temp files in current dir, there's no point
+              ;; trying if the directory is read-only (bug#8954).
+              (file-writable-p (file-name-directory buffer-file-name))
+              (flymake-proc--get-init-function buffer-file-name))))
         (unless init-f (error "Can find a suitable init function"))
         (flymake-proc--clear-buildfile-cache)
         (flymake-proc--clear-project-include-dirs-cache)
@@ -768,7 +770,6 @@ can also be executed interactively independently of
                 (flymake-log 0 "init function %s for %s failed, cleaning up"
                              init-f buffer-file-name))
                (t
-                (setq flymake-last-change-time nil)
                 (setq proc
                       (let ((default-directory (or dir default-directory)))
                         (when dir
@@ -878,8 +879,7 @@ can also be executed interactively independently of
 (defun flymake-proc-simple-cleanup ()
   "Do cleanup after `flymake-proc-init-create-temp-buffer-copy'.
 Delete temp file."
-  (flymake-proc--safe-delete-file flymake-proc--temp-source-file-name)
-  (setq flymake-last-change-time nil))
+  (flymake-proc--safe-delete-file flymake-proc--temp-source-file-name))
 
 (defun flymake-proc-get-real-file-name (file-name-from-err-msg)
   "Translate file name from error message to \"real\" file name.
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 0b28dc3..acc0637 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -180,6 +180,11 @@ If nil, never start checking buffer automatically like 
this."
                        level)
                      "*Flymake log*")))
 
+(defun flymake-switch-to-log-buffer ()
+  "Go to the *Flymake log* buffer."
+  (interactive)
+  (switch-to-buffer "*Flymake log*"))
+
 ;;;###autoload
 (defmacro flymake-log (level msg &rest args)
   "Log, at level LEVEL, the message MSG formatted with ARGS.
@@ -282,41 +287,43 @@ verify FILTER, a function, and sort them by COMPARE 
(using KEY)."
 (define-obsolete-face-alias 'flymake-warnline 'flymake-warning "26.1")
 (define-obsolete-face-alias 'flymake-errline 'flymake-error "26.1")
 
-(defun flymake-diag-region (line &optional col)
-  "Compute region (BEG . END) corresponding to LINE and COL.
-If COL is nil, return a region just for LINE.
-Return nil if the region is invalid."
+;;;###autoload
+(defun flymake-diag-region (buffer line &optional col)
+  "Compute BUFFER's region (BEG . END) corresponding to LINE and COL.
+If COL is nil, return a region just for LINE.  Return nil if the
+region is invalid."
   (condition-case-unless-debug _err
-      (let ((line (min (max line 1)
-                       (line-number-at-pos (point-max) 'absolute))))
-        (save-excursion
-          (goto-char (point-min))
-          (forward-line (1- line))
-          (cl-flet ((fallback-bol
-                     () (progn (back-to-indentation) (point)))
-                    (fallback-eol
-                     (beg)
-                     (progn
-                       (end-of-line)
-                       (skip-chars-backward " \t\f\t\n" beg)
-                       (if (eq (point) beg)
-                           (line-beginning-position 2)
-                         (point)))))
-            (if (and col (cl-plusp col))
-                (let* ((beg (progn (forward-char (1- col))
-                                   (point)))
-                       (sexp-end (ignore-errors (end-of-thing 'sexp)))
-                       (end (or (and sexp-end
-                                     (not (= sexp-end beg))
-                                     sexp-end)
-                                (ignore-errors (goto-char (1+ beg)))))
-                       (safe-end (or end
-                                     (fallback-eol beg))))
-                  (cons (if end beg (fallback-bol))
-                        safe-end))
-              (let* ((beg (fallback-bol))
-                     (end (fallback-eol beg)))
-                (cons beg end))))))
+      (with-current-buffer buffer
+        (let ((line (min (max line 1)
+                         (line-number-at-pos (point-max) 'absolute))))
+          (save-excursion
+            (goto-char (point-min))
+            (forward-line (1- line))
+            (cl-flet ((fallback-bol
+                       () (progn (back-to-indentation) (point)))
+                      (fallback-eol
+                       (beg)
+                       (progn
+                         (end-of-line)
+                         (skip-chars-backward " \t\f\t\n" beg)
+                         (if (eq (point) beg)
+                             (line-beginning-position 2)
+                           (point)))))
+              (if (and col (cl-plusp col))
+                  (let* ((beg (progn (forward-char (1- col))
+                                     (point)))
+                         (sexp-end (ignore-errors (end-of-thing 'sexp)))
+                         (end (or (and sexp-end
+                                       (not (= sexp-end beg))
+                                       sexp-end)
+                                  (ignore-errors (goto-char (1+ beg)))))
+                         (safe-end (or end
+                                       (fallback-eol beg))))
+                    (cons (if end beg (fallback-bol))
+                          safe-end))
+                (let* ((beg (fallback-bol))
+                       (end (fallback-eol beg)))
+                  (cons beg end)))))))
     (error (flymake-error "Invalid region line=%s col=%s" line col))))
 
 (defvar flymake-diagnostic-functions nil
@@ -872,8 +879,17 @@ applied."
   (flymake-goto-next-error (- (or n 1)) filter interactive))
 
 
-;;; Mode-line fanciness
+;;; Mode-line and menu
 ;;;
+(easy-menu-define flymake-menu flymake-mode-map "Flymake"
+  `("Flymake"
+    [ "Go to next error"      flymake-goto-next-error t ]
+    [ "Go to previous error"  flymake-goto-prev-error t ]
+    [ "Check now"             flymake-start t ]
+    [ "Go to log buffer"      flymake-switch-to-log-buffer t ]
+    "--"
+    [ "Turn off Flymake"      flymake-mode t ]))
+
 (defvar flymake--mode-line-format `(:eval (flymake--mode-line-format)))
 
 (put 'flymake--mode-line-format 'risky-local-variable t)
@@ -903,18 +919,16 @@ applied."
                             "mouse-1: go to log buffer ")
                    keymap
                    ,(let ((map (make-sparse-keymap)))
-                      (define-key map [mode-line mouse-1]
-                        (lambda (_event)
-                          (interactive "e")
-                          (switch-to-buffer "*Flymake log*")))
+                      (define-key map [mode-line down-mouse-1]
+                        flymake-menu)
                       map))
       ,@(pcase-let ((`(,ind ,face ,explain)
                      (cond ((null known)
                             `("?" mode-line "No known backends"))
                            (some-waiting
                             `("Wait" compilation-mode-line-run
-                              ,(format "Waiting for %s running backends"
-                                       (length running))))
+                              ,(format "Waiting for %s running backend(s)"
+                                       (length some-waiting))))
                            (all-disabled
                             `("!" compilation-mode-line-run
                               "All backends disabled"))
@@ -924,7 +938,12 @@ applied."
             `((":"
                (:propertize ,ind
                             face ,face
-                            help-echo ,explain)))))
+                            help-echo ,explain
+                            keymap
+                            ,(let ((map (make-sparse-keymap)))
+                               (define-key map [mode-line mouse-1]
+                                 'flymake-switch-to-log-buffer)
+                               map))))))
       ,@(unless (or all-disabled
                     (null known))
           (cl-loop



reply via email to

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