From 7a1133f1ff002943ce32b5a05a7261bba520288c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Thu, 5 Oct 2017 02:42:01 +0100 Subject: [PATCH] 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 47ec27f611b..d08819713a3 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 0b28dc31cfc..acc0637ec35 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 -- 2.39.5