aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman2005-04-30 20:13:39 +0000
committerRichard M. Stallman2005-04-30 20:13:39 +0000
commit53ec26edede151a986ca4d828efb58c9ecc4edd6 (patch)
tree41a5e2ec3d3248739c69dbd32bb552773ffd40c7
parentf6c9b68362f40a48c21176cf49de74be14f11988 (diff)
downloademacs-53ec26edede151a986ca4d828efb58c9ecc4edd6.tar.gz
emacs-53ec26edede151a986ca4d828efb58c9ecc4edd6.zip
(flymake-split-string)
(flymake-split-string, flymake-log, flymake-pid-to-names) (flymake-reg-names, flymake-get-source-buffer-name) (flymake-unreg-names, flymake-add-line-err-info) (flymake-add-err-info): Clarify docstrings. (flymake-popup-menu, flymake-make-emacs-menu) (flymake-make-xemacs-menu): Add docstrings. (flymake-get-buffer-*, flymake-set-buffer-*): Functions deleted. Set variables directly throughout.
-rw-r--r--lisp/progmodes/flymake.el278
1 files changed, 108 insertions, 170 deletions
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 73d77affdc4..a2fa660bff0 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -62,7 +62,8 @@
62 (replace-in-string str regexp rep))) 62 (replace-in-string str regexp rep)))
63 63
64(defun flymake-split-string (str pattern) 64(defun flymake-split-string (str pattern)
65 "Split, then remove first and/or last in case it's empty." 65 "Split STR into a list of substrings bounded by PATTERN.
66Zero-length substrings at the beginning and end of the list are omitted."
66 (let* ((splitted (split-string str pattern))) 67 (let* ((splitted (split-string str pattern)))
67 (if (and (> (length splitted) 0) (= 0 (length (elt splitted 0)))) 68 (if (and (> (length splitted) 0) (= 0 (length (elt splitted 0))))
68 (setq splitted (cdr splitted))) 69 (setq splitted (cdr splitted)))
@@ -86,7 +87,12 @@
86 (lambda (&optional arg) (save-excursion (end-of-line arg) (point))))) 87 (lambda (&optional arg) (save-excursion (end-of-line arg) (point)))))
87 88
88(defun flymake-popup-menu (pos menu-data) 89(defun flymake-popup-menu (pos menu-data)
89 (if (and (fboundp 'popup-menu) (fboundp 'make-event)) 90 "Pop up the flymake menu at position POS, using the data MENU-DATA.
91POS is a list of the form ((X Y) WINDOW), where X and Y are
92pixels positions from the top left corner of WINDOW's frame.
93MENU-DATA is a list of error and warning messages returned by
94`flymake-make-err-menu-data'."
95 (if (featurep 'xemacs)
90 (let* ((x-pos (nth 0 (nth 0 pos))) 96 (let* ((x-pos (nth 0 (nth 0 pos)))
91 (y-pos (nth 1 (nth 0 pos))) 97 (y-pos (nth 1 (nth 0 pos)))
92 (fake-event-props '(button 1 x 1 y 1))) 98 (fake-event-props '(button 1 x 1 y 1)))
@@ -96,6 +102,10 @@
96 (x-popup-menu pos (flymake-make-emacs-menu menu-data)))) 102 (x-popup-menu pos (flymake-make-emacs-menu menu-data))))
97 103
98(defun flymake-make-emacs-menu (menu-data) 104(defun flymake-make-emacs-menu (menu-data)
105 "Return a menu specifier using MENU-DATA.
106MENU-DATA is a list of error and warning messages returned by
107`flymake-make-err-menu-data'.
108See `x-popup-menu' for the menu specifier format."
99 (let* ((menu-title (nth 0 menu-data)) 109 (let* ((menu-title (nth 0 menu-data))
100 (menu-items (nth 1 menu-data)) 110 (menu-items (nth 1 menu-data))
101 (menu-commands nil)) 111 (menu-commands nil))
@@ -109,6 +119,7 @@
109(defun flymake-nop ()) 119(defun flymake-nop ())
110 120
111(defun flymake-make-xemacs-menu (menu-data) 121(defun flymake-make-xemacs-menu (menu-data)
122 "Return a menu specifier using MENU-DATA."
112 (let* ((menu-title (nth 0 menu-data)) 123 (let* ((menu-title (nth 0 menu-data))
113 (menu-items (nth 1 menu-data)) 124 (menu-items (nth 1 menu-data))
114 (menu-commands nil)) 125 (menu-commands nil))
@@ -152,7 +163,11 @@
152 :type 'integer) 163 :type 'integer)
153 164
154(defun flymake-log (level text &rest args) 165(defun flymake-log (level text &rest args)
155 "Log a message with optional arguments." 166 "Log a message at level LEVEL.
167If LEVEL is higher than `flymake-log-level', the message is
168ignored. Otherwise, it is printed using `message'.
169TEXT is a format control string, and the remaining arguments ARGS
170are the string substitutions (see `format')."
156 (if (<= level flymake-log-level) 171 (if (<= level flymake-log-level)
157 (let* ((msg (apply 'format text args))) 172 (let* ((msg (apply 'format text args)))
158 (message msg) 173 (message msg)
@@ -176,69 +191,37 @@
176 tmp)) 191 tmp))
177 192
178(defvar flymake-pid-to-names (flymake-makehash) 193(defvar flymake-pid-to-names (flymake-makehash)
179 "pid -> source buffer name, output file name mapping.") 194 "Hash table mapping PIDs to source buffer names and output files.")
180 195
181(defun flymake-reg-names (pid source-buffer-name) 196(defun flymake-reg-names (pid source-buffer-name)
182 "Save into in PID map." 197 "Associate PID with SOURCE-BUFFER-NAME in `flymake-pid-to-names'."
183 (unless (stringp source-buffer-name) 198 (unless (stringp source-buffer-name)
184 (error "Invalid buffer name")) 199 (error "Invalid buffer name"))
185 (puthash pid (list source-buffer-name) flymake-pid-to-names)) 200 (puthash pid (list source-buffer-name) flymake-pid-to-names))
186 201
187(defun flymake-get-source-buffer-name (pid) 202(defun flymake-get-source-buffer-name (pid)
188 "Return buffer name stored in PID map." 203 "Return buffer name associated with PID in `flymake-pid-to-names'."
189 (nth 0 (gethash pid flymake-pid-to-names))) 204 (nth 0 (gethash pid flymake-pid-to-names)))
190 205
191(defun flymake-unreg-names (pid) 206(defun flymake-unreg-names (pid)
192 "Delete PID->buffer name mapping." 207 "Remove the entry associated with PID from `flymake-pid-to-names'."
193 (remhash pid flymake-pid-to-names)) 208 (remhash pid flymake-pid-to-names))
194 209
195(defun flymake-get-buffer-var (buffer var-name)
196 "Switch to BUFFER if necessary and return local variable VAR-NAME."
197 (unless (bufferp buffer)
198 (error "Invalid buffer"))
199
200 (if (eq buffer (current-buffer))
201 (symbol-value var-name)
202 (with-current-buffer buffer
203 (symbol-value var-name))))
204
205(defun flymake-set-buffer-var (buffer var-name var-value)
206 "Switch to BUFFER if necessary and set local variable VAR-NAME to VAR-VALUE."
207 (unless (bufferp buffer)
208 (error "Invalid buffer"))
209
210 (if (eq buffer (current-buffer))
211 (set var-name var-value)
212 (with-current-buffer buffer
213 (set var-name var-value))))
214
215(defvar flymake-buffer-data (flymake-makehash) 210(defvar flymake-buffer-data (flymake-makehash)
216 "Data specific to syntax check tool, in name-value pairs.") 211 "Data specific to syntax check tool, in name-value pairs.")
217 212
218(make-variable-buffer-local 'flymake-buffer-data) 213(make-variable-buffer-local 'flymake-buffer-data)
219 214
220(defun flymake-get-buffer-data (buffer)
221 (flymake-get-buffer-var buffer 'flymake-buffer-data))
222
223(defun flymake-set-buffer-data (buffer data)
224 (flymake-set-buffer-var buffer 'flymake-buffer-data data))
225
226(defun flymake-get-buffer-value (buffer name) 215(defun flymake-get-buffer-value (buffer name)
227 (gethash name (flymake-get-buffer-data buffer))) 216 (gethash name (with-current-buffer buffer flymake-buffer-data)))
228 217
229(defun flymake-set-buffer-value (buffer name value) 218(defun flymake-set-buffer-value (buffer name value)
230 (puthash name value (flymake-get-buffer-data buffer))) 219 (puthash name value (with-current-buffer buffer flymake-buffer-data)))
231 220
232(defvar flymake-output-residual nil) 221(defvar flymake-output-residual nil)
233 222
234(make-variable-buffer-local 'flymake-output-residual) 223(make-variable-buffer-local 'flymake-output-residual)
235 224
236(defun flymake-get-buffer-output-residual (buffer)
237 (flymake-get-buffer-var buffer 'flymake-output-residual))
238
239(defun flymake-set-buffer-output-residual (buffer residual)
240 (flymake-set-buffer-var buffer 'flymake-output-residual residual))
241
242(defcustom flymake-allowed-file-name-masks 225(defcustom flymake-allowed-file-name-masks
243 '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name) 226 '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
244 (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name) 227 (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
@@ -642,35 +625,38 @@ It's flymake process filter."
642 625
643 (flymake-parse-residual source-buffer) 626 (flymake-parse-residual source-buffer)
644 (flymake-post-syntax-check source-buffer exit-status command) 627 (flymake-post-syntax-check source-buffer exit-status command)
645 (flymake-set-buffer-is-running source-buffer nil)))) 628 (setq flymake-is-running nil))))
646 (error 629 (error
647 (let ((err-str (format "Error in process sentinel for buffer %s: %s" 630 (let ((err-str (format "Error in process sentinel for buffer %s: %s"
648 source-buffer (error-message-string err)))) 631 source-buffer (error-message-string err))))
649 (flymake-log 0 err-str) 632 (flymake-log 0 err-str)
650 (flymake-set-buffer-is-running source-buffer nil))))))) 633 (with-current-buffer source-buffer
634 (setq flymake-is-running nil))))))))
651 635
652(defun flymake-post-syntax-check (source-buffer exit-status command) 636(defun flymake-post-syntax-check (source-buffer exit-status command)
653 (flymake-set-buffer-err-info source-buffer (flymake-get-buffer-new-err-info source-buffer)) 637 (with-current-buffer source-buffer
654 (flymake-set-buffer-new-err-info source-buffer nil) 638 (setq flymake-err-info flymake-new-err-info)
655 639 (setq flymake-new-err-info nil)
656 (flymake-set-buffer-err-info source-buffer (flymake-fix-line-numbers 640 (setq flymake-err-info
657 (flymake-get-buffer-err-info source-buffer) 641 (flymake-fix-line-numbers
658 1 642 flymake-err-info 1 (flymake-count-lines source-buffer))))
659 (flymake-count-lines source-buffer)))
660 (flymake-delete-own-overlays source-buffer) 643 (flymake-delete-own-overlays source-buffer)
661 (flymake-highlight-err-lines source-buffer (flymake-get-buffer-err-info source-buffer)) 644 (flymake-highlight-err-lines
662 645 source-buffer (with-current-buffer source-buffer flymake-err-info))
663 (let ((err-count (flymake-get-err-count (flymake-get-buffer-err-info source-buffer) "e")) 646 (let (err-count warn-count)
664 (warn-count (flymake-get-err-count (flymake-get-buffer-err-info source-buffer) "w"))) 647 (with-current-buffer source-buffer
665 648 (setq err-count (flymake-get-err-count flymake-err-info "e"))
666 (flymake-log 2 "%s: %d error(s), %d warning(s) in %.2f second(s)" 649 (setq warn-count (flymake-get-err-count flymake-err-info "w"))
650 (flymake-log 2 "%s: %d error(s), %d warning(s) in %.2f second(s)"
667 (buffer-name source-buffer) err-count warn-count 651 (buffer-name source-buffer) err-count warn-count
668 (- (flymake-float-time) (flymake-get-buffer-check-start-time source-buffer))) 652 (- (flymake-float-time) flymake-check-start-time))
669 (flymake-set-buffer-check-start-time source-buffer nil) 653 (setq flymake-check-start-time nil))
654
670 (if (and (equal 0 err-count) (equal 0 warn-count)) 655 (if (and (equal 0 err-count) (equal 0 warn-count))
671 (if (equal 0 exit-status) 656 (if (equal 0 exit-status)
672 (flymake-report-status source-buffer "" "") ; PASSED 657 (flymake-report-status source-buffer "" "") ; PASSED
673 (if (not (flymake-get-buffer-check-was-interrupted source-buffer)) 658 (if (not (with-current-buffer source-buffer
659 flymake-check-was-interrupted))
674 (flymake-report-fatal-status (current-buffer) "CFGERR" 660 (flymake-report-fatal-status (current-buffer) "CFGERR"
675 (format "Configuration error has occured while running %s" command)) 661 (format "Configuration error has occured while running %s" command))
676 (flymake-report-status source-buffer nil ""))) ; "STOPPED" 662 (flymake-report-status source-buffer nil ""))) ; "STOPPED"
@@ -679,38 +665,34 @@ It's flymake process filter."
679(defun flymake-parse-output-and-residual (source-buffer output) 665(defun flymake-parse-output-and-residual (source-buffer output)
680 "Split OUTPUT into lines, merge in residual if necessary." 666 "Split OUTPUT into lines, merge in residual if necessary."
681 (with-current-buffer source-buffer 667 (with-current-buffer source-buffer
682 (let* ((buffer-residual (flymake-get-buffer-output-residual source-buffer)) 668 (let* ((buffer-residual flymake-output-residual)
683 (total-output (if buffer-residual (concat buffer-residual output) output)) 669 (total-output (if buffer-residual (concat buffer-residual output) output))
684 (lines-and-residual (flymake-split-output total-output)) 670 (lines-and-residual (flymake-split-output total-output))
685 (lines (nth 0 lines-and-residual)) 671 (lines (nth 0 lines-and-residual))
686 (new-residual (nth 1 lines-and-residual))) 672 (new-residual (nth 1 lines-and-residual)))
687 673 (with-current-buffer source-buffer
688 (flymake-set-buffer-output-residual source-buffer new-residual) 674 (setq flymake-output-residual new-residual)
689 (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines 675 (setq flymake-new-err-info
690 (flymake-get-buffer-new-err-info source-buffer) 676 (flymake-parse-err-lines
691 source-buffer lines))))) 677 flymake-new-err-info
678 source-buffer lines))))))
692 679
693(defun flymake-parse-residual (source-buffer) 680(defun flymake-parse-residual (source-buffer)
694 "Parse residual if it's non empty." 681 "Parse residual if it's non empty."
695 (with-current-buffer source-buffer 682 (with-current-buffer source-buffer
696 (when (flymake-get-buffer-output-residual source-buffer) 683 (when flymake-output-residual
697 (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines 684 (setq flymake-new-err-info
698 (flymake-get-buffer-new-err-info source-buffer) 685 (flymake-parse-err-lines
699 source-buffer 686 flymake-new-err-info
700 (list (flymake-get-buffer-output-residual source-buffer)))) 687 source-buffer
701 (flymake-set-buffer-output-residual source-buffer nil)))) 688 (list flymake-output-residual)))
689 (setq flymake-output-residual nil))))
702 690
703(defvar flymake-err-info nil 691(defvar flymake-err-info nil
704 "Sorted list of line numbers and lists of err info in the form (file, err-text).") 692 "Sorted list of line numbers and lists of err info in the form (file, err-text).")
705 693
706(make-variable-buffer-local 'flymake-err-info) 694(make-variable-buffer-local 'flymake-err-info)
707 695
708(defun flymake-get-buffer-err-info (buffer)
709 (flymake-get-buffer-var buffer 'flymake-err-info))
710
711(defun flymake-set-buffer-err-info (buffer err-info)
712 (flymake-set-buffer-var buffer 'flymake-err-info err-info))
713
714(defun flymake-er-make-er (line-no line-err-info-list) 696(defun flymake-er-make-er (line-no line-err-info-list)
715 (list line-no line-err-info-list)) 697 (list line-no line-err-info-list))
716 698
@@ -725,12 +707,6 @@ It's flymake process filter."
725 707
726(make-variable-buffer-local 'flymake-new-err-info) 708(make-variable-buffer-local 'flymake-new-err-info)
727 709
728(defun flymake-get-buffer-new-err-info (buffer)
729 (flymake-get-buffer-var buffer 'flymake-new-err-info))
730
731(defun flymake-set-buffer-new-err-info (buffer new-err-info)
732 (flymake-set-buffer-var buffer 'flymake-new-err-info new-err-info))
733
734;; getters/setters for line-err-info: (file, line, type, text). 710;; getters/setters for line-err-info: (file, line, type, text).
735(defun flymake-ler-make-ler (file line type text &optional full-file) 711(defun flymake-ler-make-ler (file line type text &optional full-file)
736 (list file line type text full-file)) 712 (list file line type text full-file))
@@ -1067,7 +1043,11 @@ Return its components if so, nil if no."
1067 (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two))))))) 1043 (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two)))))))
1068 1044
1069(defun flymake-add-line-err-info (line-err-info-list line-err-info) 1045(defun flymake-add-line-err-info (line-err-info-list line-err-info)
1070 "Insert new err info favoring sorting: err-type e/w, filename nil/non-nil." 1046 "Update LINE-ERR-INFO-LIST with the error LINE-ERR-INFO.
1047For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'.
1048The new element is inserted in the proper position, according to
1049the predicate `flymake-line-err-info-is-less-or-equal'.
1050The updated value of LINE-ERR-INFO-LIST is returned."
1071 (if (not line-err-info-list) 1051 (if (not line-err-info-list)
1072 (list line-err-info) 1052 (list line-err-info)
1073 (let* ((count (length line-err-info-list)) 1053 (let* ((count (length line-err-info-list))
@@ -1079,7 +1059,10 @@ Return its components if so, nil if no."
1079 line-err-info-list))) 1059 line-err-info-list)))
1080 1060
1081(defun flymake-add-err-info (err-info-list line-err-info) 1061(defun flymake-add-err-info (err-info-list line-err-info)
1082 "Add error info (file line type text) to err info list preserving sort order." 1062 "Update ERR-INFO-LIST with the error LINE-ERR-INFO, preserving sort order.
1063Returns the updated value of ERR-INFO-LIST.
1064For the format of ERR-INFO-LIST, see `flymake-err-info'.
1065For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
1083 (let* ((line-no (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info))) 1066 (let* ((line-no (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info)))
1084 (info-and-pos (flymake-find-err-info err-info-list line-no)) 1067 (info-and-pos (flymake-find-err-info err-info-list line-no))
1085 (exists (car info-and-pos)) 1068 (exists (car info-and-pos))
@@ -1202,16 +1185,16 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1202 (unless (bufferp buffer) 1185 (unless (bufferp buffer)
1203 (error "Expected a buffer")) 1186 (error "Expected a buffer"))
1204 (with-current-buffer buffer 1187 (with-current-buffer buffer
1205 (flymake-log 3 "flymake is running: %s" (flymake-get-buffer-is-running buffer)) 1188 (flymake-log 3 "flymake is running: %s" flymake-is-running)
1206 (when (and (not (flymake-get-buffer-is-running buffer)) 1189 (when (and (not flymake-is-running)
1207 (flymake-can-syntax-check-file (buffer-file-name buffer))) 1190 (flymake-can-syntax-check-file (buffer-file-name buffer)))
1208 (when (or (not flymake-compilation-prevents-syntax-check) 1191 (when (or (not flymake-compilation-prevents-syntax-check)
1209 (not (flymake-compilation-is-running))) ;+ (flymake-rep-ort-status buffer "COMP") 1192 (not (flymake-compilation-is-running))) ;+ (flymake-rep-ort-status buffer "COMP")
1210 (flymake-clear-buildfile-cache) 1193 (flymake-clear-buildfile-cache)
1211 (flymake-clear-project-include-dirs-cache) 1194 (flymake-clear-project-include-dirs-cache)
1212 1195
1213 (flymake-set-buffer-check-was-interrupted buffer nil) 1196 (setq flymake-check-was-interrupted nil)
1214 (flymake-set-buffer-data buffer (flymake-makehash 'equal)) 1197 (setq flymake-buffer-data (flymake-makehash 'equal))
1215 1198
1216 (let* ((source-file-name (buffer-file-name buffer)) 1199 (let* ((source-file-name (buffer-file-name buffer))
1217 (init-f (flymake-get-init-function source-file-name)) 1200 (init-f (flymake-get-init-function source-file-name))
@@ -1225,7 +1208,7 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1225 (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name) 1208 (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name)
1226 (funcall cleanup-f buffer)) 1209 (funcall cleanup-f buffer))
1227 (progn 1210 (progn
1228 (flymake-set-buffer-last-change-time buffer nil) 1211 (setq flymake-last-change-time nil)
1229 (flymake-start-syntax-check-process buffer cmd args dir)))))))) 1212 (flymake-start-syntax-check-process buffer cmd args dir))))))))
1230 1213
1231(defun flymake-start-syntax-check-process (buffer cmd args dir) 1214(defun flymake-start-syntax-check-process (buffer cmd args dir)
@@ -1242,9 +1225,10 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1242 1225
1243 (flymake-reg-names (process-id process) (buffer-name buffer)) 1226 (flymake-reg-names (process-id process) (buffer-name buffer))
1244 1227
1245 (flymake-set-buffer-is-running buffer t) 1228 (with-current-buffer buffer
1246 (flymake-set-buffer-last-change-time buffer nil) 1229 (setq flymake-is-running t)
1247 (flymake-set-buffer-check-start-time buffer (flymake-float-time)) 1230 (setq flymake-last-change-time nil)
1231 (setq flymake-check-start-time (flymake-float-time)))
1248 1232
1249 (flymake-report-status buffer nil "*") 1233 (flymake-report-status buffer nil "*")
1250 (flymake-log 2 "started process %d, command=%s, dir=%s" 1234 (flymake-log 2 "started process %d, command=%s, dir=%s"
@@ -1264,7 +1248,8 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1264 (signal-process pid 9) 1248 (signal-process pid 9)
1265 (let* ((buffer-name (flymake-get-source-buffer-name pid))) 1249 (let* ((buffer-name (flymake-get-source-buffer-name pid)))
1266 (when (and buffer-name (get-buffer buffer-name)) 1250 (when (and buffer-name (get-buffer buffer-name))
1267 (flymake-set-buffer-check-was-interrupted (get-buffer buffer-name) t))) 1251 (with-current-buffer (get-buffer buffer-name)
1252 (setq flymake-check-was-interrupted t))))
1268 (flymake-log 1 "killed process %d" pid)) 1253 (flymake-log 1 "killed process %d" pid))
1269 1254
1270(defun flymake-stop-all-syntax-checks () 1255(defun flymake-stop-all-syntax-checks ()
@@ -1288,56 +1273,26 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1288 1273
1289(make-variable-buffer-local 'flymake-is-running) 1274(make-variable-buffer-local 'flymake-is-running)
1290 1275
1291(defun flymake-get-buffer-is-running (buffer)
1292 (flymake-get-buffer-var buffer 'flymake-is-running))
1293
1294(defun flymake-set-buffer-is-running (buffer is-running)
1295 (flymake-set-buffer-var buffer 'flymake-is-running is-running))
1296
1297(defvar flymake-timer nil 1276(defvar flymake-timer nil
1298 "Timer for starting syntax check.") 1277 "Timer for starting syntax check.")
1299 1278
1300(make-variable-buffer-local 'flymake-timer) 1279(make-variable-buffer-local 'flymake-timer)
1301 1280
1302(defun flymake-get-buffer-timer (buffer)
1303 (flymake-get-buffer-var buffer 'flymake-timer))
1304
1305(defun flymake-set-buffer-timer (buffer timer)
1306 (flymake-set-buffer-var buffer 'flymake-timer timer))
1307
1308(defvar flymake-last-change-time nil 1281(defvar flymake-last-change-time nil
1309 "Time of last buffer change.") 1282 "Time of last buffer change.")
1310 1283
1311(make-variable-buffer-local 'flymake-last-change-time) 1284(make-variable-buffer-local 'flymake-last-change-time)
1312 1285
1313(defun flymake-get-buffer-last-change-time (buffer)
1314 (flymake-get-buffer-var buffer 'flymake-last-change-time))
1315
1316(defun flymake-set-buffer-last-change-time (buffer change-time)
1317 (flymake-set-buffer-var buffer 'flymake-last-change-time change-time))
1318
1319(defvar flymake-check-start-time nil 1286(defvar flymake-check-start-time nil
1320 "Time at which syntax check was started.") 1287 "Time at which syntax check was started.")
1321 1288
1322(make-variable-buffer-local 'flymake-check-start-time) 1289(make-variable-buffer-local 'flymake-check-start-time)
1323 1290
1324(defun flymake-get-buffer-check-start-time (buffer)
1325 (flymake-get-buffer-var buffer 'flymake-check-start-time))
1326
1327(defun flymake-set-buffer-check-start-time (buffer check-start-time)
1328 (flymake-set-buffer-var buffer 'flymake-check-start-time check-start-time))
1329
1330(defvar flymake-check-was-interrupted nil 1291(defvar flymake-check-was-interrupted nil
1331 "Non-nil if syntax check was killed by `flymake-compile'.") 1292 "Non-nil if syntax check was killed by `flymake-compile'.")
1332 1293
1333(make-variable-buffer-local 'flymake-check-was-interrupted) 1294(make-variable-buffer-local 'flymake-check-was-interrupted)
1334 1295
1335(defun flymake-get-buffer-check-was-interrupted (buffer)
1336 (flymake-get-buffer-var buffer 'flymake-check-was-interrupted))
1337
1338(defun flymake-set-buffer-check-was-interrupted (buffer interrupted)
1339 (flymake-set-buffer-var buffer 'flymake-check-was-interrupted interrupted))
1340
1341(defcustom flymake-no-changes-timeout 0.5 1296(defcustom flymake-no-changes-timeout 0.5
1342 "Time to wait after last change before starting compilation." 1297 "Time to wait after last change before starting compilation."
1343 :group 'flymake 1298 :group 'flymake
@@ -1345,12 +1300,13 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1345 1300
1346(defun flymake-on-timer-event (buffer) 1301(defun flymake-on-timer-event (buffer)
1347 "Start a syntax check for buffer BUFFER if necessary." 1302 "Start a syntax check for buffer BUFFER if necessary."
1348 ;;+(flymake-log 3 "timer: running=%s, time=%s, cur-time=%s" (flymake-get-buffer-is-running buffer) (flymake-get-buffer-last-change-time buffer) (flymake-float-time)) 1303 (when (bufferp buffer)
1349 (when (and (bufferp buffer) (not (flymake-get-buffer-is-running buffer)))
1350 (with-current-buffer buffer 1304 (with-current-buffer buffer
1351 (when (and (flymake-get-buffer-last-change-time buffer) 1305 (when (and (not flymake-is-running)
1352 (> (flymake-float-time) (+ flymake-no-changes-timeout (flymake-get-buffer-last-change-time buffer)))) 1306 flymake-last-change-time
1353 (flymake-set-buffer-last-change-time buffer nil) 1307 (> (flymake-float-time) (+ flymake-no-changes-timeout flymake-last-change-time)))
1308
1309 (setq flymake-last-change-time nil)
1354 (flymake-log 3 "starting syntax check as more than 1 second passed since last change") 1310 (flymake-log 3 "starting syntax check as more than 1 second passed since last change")
1355 (flymake-start-syntax-check buffer))))) 1311 (flymake-start-syntax-check buffer)))))
1356 1312
@@ -1391,7 +1347,7 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1391 "Display a menu with errors/warnings for current line if it has errors and/or warnings." 1347 "Display a menu with errors/warnings for current line if it has errors and/or warnings."
1392 (interactive) 1348 (interactive)
1393 (let* ((line-no (flymake-current-line-no)) 1349 (let* ((line-no (flymake-current-line-no))
1394 (line-err-info-list (nth 0 (flymake-find-err-info (flymake-get-buffer-err-info (current-buffer)) line-no))) 1350 (line-err-info-list (nth 0 (flymake-find-err-info flymake-err-info line-no)))
1395 (menu-data (flymake-make-err-menu-data line-no line-err-info-list)) 1351 (menu-data (flymake-make-err-menu-data line-no line-err-info-list))
1396 (choice nil) 1352 (choice nil)
1397 (mouse-pos (flymake-get-point-pixel-pos)) 1353 (mouse-pos (flymake-get-point-pixel-pos))
@@ -1442,46 +1398,27 @@ Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if
1442 1398
1443(make-variable-buffer-local 'flymake-mode-line) 1399(make-variable-buffer-local 'flymake-mode-line)
1444 1400
1445(defun flymake-get-buffer-mode-line (buffer)
1446 (flymake-get-buffer-var buffer 'flymake-mode-line))
1447
1448(defun flymake-set-buffer-mode-line (buffer mode-line-string)
1449 (flymake-set-buffer-var buffer 'flymake-mode-line mode-line-string))
1450
1451(defvar flymake-mode-line-e-w nil) 1401(defvar flymake-mode-line-e-w nil)
1452 1402
1453(make-variable-buffer-local 'flymake-mode-line-e-w) 1403(make-variable-buffer-local 'flymake-mode-line-e-w)
1454 1404
1455(defun flymake-get-buffer-mode-line-e-w (buffer)
1456 (flymake-get-buffer-var buffer 'flymake-mode-line-e-w))
1457
1458(defun flymake-set-buffer-mode-line-e-w (buffer e-w)
1459 (flymake-set-buffer-var buffer 'flymake-mode-line-e-w e-w))
1460
1461(defvar flymake-mode-line-status nil) 1405(defvar flymake-mode-line-status nil)
1462 1406
1463(make-variable-buffer-local 'flymake-mode-line-status) 1407(make-variable-buffer-local 'flymake-mode-line-status)
1464 1408
1465(defun flymake-get-buffer-mode-line-status (buffer)
1466 (flymake-get-buffer-var buffer 'flymake-mode-line-status))
1467
1468(defun flymake-set-buffer-mode-line-status (buffer status)
1469 (flymake-set-buffer-var buffer 'flymake-mode-line-status status))
1470
1471(defun flymake-report-status (buffer e-w &optional status) 1409(defun flymake-report-status (buffer e-w &optional status)
1472 "Show status in mode line." 1410 "Show status in mode line."
1473 (when (bufferp buffer) 1411 (when (bufferp buffer)
1474 (with-current-buffer buffer 1412 (with-current-buffer buffer
1475 (when e-w 1413 (when e-w
1476 (flymake-set-buffer-mode-line-e-w buffer e-w) 1414 (setq flymake-mode-line-e-w e-w))
1477 )
1478 (when status 1415 (when status
1479 (flymake-set-buffer-mode-line-status buffer status)) 1416 (setq flymake-mode-line-status status))
1480 (let* ((mode-line " Flymake")) 1417 (let* ((mode-line " Flymake"))
1481 (when (> (length (flymake-get-buffer-mode-line-e-w buffer)) 0) 1418 (when (> (length flymake-mode-line-e-w) 0)
1482 (setq mode-line (concat mode-line ":" (flymake-get-buffer-mode-line-e-w buffer)))) 1419 (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
1483 (setq mode-line (concat mode-line (flymake-get-buffer-mode-line-status buffer))) 1420 (setq mode-line (concat mode-line flymake-mode-line-status))
1484 (flymake-set-buffer-mode-line buffer mode-line) 1421 (setq flymake-mode-line mode-line)
1485 (force-mode-line-update))))) 1422 (force-mode-line-update)))))
1486 1423
1487(defun flymake-display-warning (warning) 1424(defun flymake-display-warning (warning)
@@ -1532,7 +1469,8 @@ With arg, turn Flymake mode on if and only if arg is positive."
1532 1469
1533 (flymake-report-status (current-buffer) "" "") 1470 (flymake-report-status (current-buffer) "" "")
1534 1471
1535 (flymake-set-buffer-timer (current-buffer) (run-at-time nil 1 'flymake-on-timer-event (current-buffer))) 1472 (setq flymake-timer
1473 (run-at-time nil 1 'flymake-on-timer-event (current-buffer)))
1536 1474
1537 (setq flymake-mode t) 1475 (setq flymake-mode t)
1538 (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer))) 1476 (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer)))
@@ -1550,12 +1488,11 @@ With arg, turn Flymake mode on if and only if arg is positive."
1550 1488
1551 (flymake-delete-own-overlays (current-buffer)) 1489 (flymake-delete-own-overlays (current-buffer))
1552 1490
1553 (when (flymake-get-buffer-timer (current-buffer)) 1491 (when flymake-timer
1554 (cancel-timer (flymake-get-buffer-timer (current-buffer))) 1492 (cancel-timer flymake-timer)
1555 (flymake-set-buffer-timer (current-buffer) nil)) 1493 (setq flymake-timer nil))
1556
1557 (flymake-set-buffer-is-running (current-buffer) nil)
1558 1494
1495 (setq flymake-is-running nil)
1559 (setq flymake-mode nil) 1496 (setq flymake-mode nil)
1560 (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer))))) 1497 (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer)))))
1561 1498
@@ -1571,7 +1508,7 @@ With arg, turn Flymake mode on if and only if arg is positive."
1571 (when (and flymake-start-syntax-check-on-newline (equal new-text "\n")) 1508 (when (and flymake-start-syntax-check-on-newline (equal new-text "\n"))
1572 (flymake-log 3 "starting syntax check as new-line has been seen") 1509 (flymake-log 3 "starting syntax check as new-line has been seen")
1573 (flymake-start-syntax-check-for-current-buffer)) 1510 (flymake-start-syntax-check-for-current-buffer))
1574 (flymake-set-buffer-last-change-time (current-buffer) (flymake-float-time)))) 1511 (setq flymake-last-change-time (flymake-float-time))))
1575 1512
1576(defun flymake-after-save-hook () 1513(defun flymake-after-save-hook ()
1577 (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved? 1514 (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved?
@@ -1580,9 +1517,9 @@ With arg, turn Flymake mode on if and only if arg is positive."
1580 (flymake-start-syntax-check-for-current-buffer)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???) 1517 (flymake-start-syntax-check-for-current-buffer)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???)
1581 1518
1582(defun flymake-kill-buffer-hook () 1519(defun flymake-kill-buffer-hook ()
1583 (when (flymake-get-buffer-timer (current-buffer)) 1520 (when flymake-timer
1584 (cancel-timer (flymake-get-buffer-timer (current-buffer))) 1521 (cancel-timer flymake-timer)
1585 (flymake-set-buffer-timer (current-buffer) nil))) 1522 (setq flymake-timer nil)))
1586 1523
1587(defun flymake-find-file-hook () 1524(defun flymake-find-file-hook ()
1588 ;;+(when flymake-start-syntax-check-on-find-file 1525 ;;+(when flymake-start-syntax-check-on-find-file
@@ -1636,9 +1573,9 @@ With arg, turn Flymake mode on if and only if arg is positive."
1636(defun flymake-goto-next-error () 1573(defun flymake-goto-next-error ()
1637 "Go to next error in err ring." 1574 "Go to next error in err ring."
1638 (interactive) 1575 (interactive)
1639 (let ((line-no (flymake-get-next-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no)))) 1576 (let ((line-no (flymake-get-next-err-line-no flymake-err-info (flymake-current-line-no))))
1640 (when (not line-no) 1577 (when (not line-no)
1641 (setq line-no (flymake-get-first-err-line-no (flymake-get-buffer-err-info (current-buffer)))) 1578 (setq line-no (flymake-get-first-err-line-no flymake-err-info))
1642 (flymake-log 1 "passed end of file")) 1579 (flymake-log 1 "passed end of file"))
1643 (if line-no 1580 (if line-no
1644 (flymake-goto-line line-no) 1581 (flymake-goto-line line-no)
@@ -1647,9 +1584,9 @@ With arg, turn Flymake mode on if and only if arg is positive."
1647(defun flymake-goto-prev-error () 1584(defun flymake-goto-prev-error ()
1648 "Go to prev error in err ring." 1585 "Go to prev error in err ring."
1649 (interactive) 1586 (interactive)
1650 (let ((line-no (flymake-get-prev-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no)))) 1587 (let ((line-no (flymake-get-prev-err-line-no flymake-err-info (flymake-current-line-no))))
1651 (when (not line-no) 1588 (when (not line-no)
1652 (setq line-no (flymake-get-last-err-line-no (flymake-get-buffer-err-info (current-buffer)))) 1589 (setq line-no (flymake-get-last-err-line-no flymake-err-info))
1653 (flymake-log 1 "passed beginning of file")) 1590 (flymake-log 1 "passed beginning of file"))
1654 (if line-no 1591 (if line-no
1655 (flymake-goto-line line-no) 1592 (flymake-goto-line line-no)
@@ -1721,7 +1658,8 @@ With arg, turn Flymake mode on if and only if arg is positive."
1721Delete temp file." 1658Delete temp file."
1722 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name"))) 1659 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))
1723 (flymake-safe-delete-file temp-source-file-name) 1660 (flymake-safe-delete-file temp-source-file-name)
1724 (flymake-set-buffer-last-change-time buffer nil))) 1661 (with-current-buffer buffer
1662 (setq flymake-last-change-time nil))))
1725 1663
1726(defun flymake-get-real-file-name (buffer file-name-from-err-msg) 1664(defun flymake-get-real-file-name (buffer file-name-from-err-msg)
1727 "Translate file name from error message to \"real\" file name. 1665 "Translate file name from error message to \"real\" file name.