From: Xue Fuqiao <xfq.free@gmail.com>
To: emacs-devel@gnu.org
Subject: [patch] Some fixes for flymake
Date: Sat, 23 Feb 2013 22:06:56 +0800 [thread overview]
Message-ID: <20130223220656.f500844733abd534265bd6f2@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 199 bytes --]
I made some fixes for flymake, most of them are doc fixes. If the attached
patches are OK, I will send the ChangeLog entries.
--
Best regards, Xue Fuqiao.
http://www.emacswiki.org/emacs/XueFuqiao
[-- Attachment #2: flymake.el.patch --]
[-- Type: text/x-diff, Size: 14696 bytes --]
*** trunk/lisp/progmodes/flymake.el 2013-02-03 09:46:50.383143000 +0800
--- trunk/lisp/progmodes/flymake.el.new 2013-02-23 21:49:13.333088549 +0800
***************
*** 1,4 ****
! ;;; flymake.el -- a universal on-the-fly syntax checker
;; Copyright (C) 2003-2013 Free Software Foundation, Inc.
--- 1,4 ----
! ;;; flymake.el --- a universal on-the-fly syntax checker
;; Copyright (C) 2003-2013 Free Software Foundation, Inc.
***************
*** 26,32 ****
;;
;; Flymake is a minor Emacs mode performing on-the-fly syntax
;; checks using the external syntax check tool (for C/C++ this
! ;; is usually the compiler)
;;; Bugs/todo:
--- 26,32 ----
;;
;; Flymake is a minor Emacs mode performing on-the-fly syntax
;; checks using the external syntax check tool (for C/C++ this
! ;; is usually the compiler).
;;; Bugs/todo:
***************
*** 66,73 ****
"Same as `flymake-err-info', effective when a syntax check is in progress.")
(make-variable-buffer-local 'flymake-new-err-info)
! ;;;; [[ cross-emacs compatibility routines
(defsubst flymake-makehash (&optional test)
(if (fboundp 'make-hash-table)
(if test (make-hash-table :test test) (make-hash-table))
(with-no-warnings
--- 66,76 ----
"Same as `flymake-err-info', effective when a syntax check is in progress.")
(make-variable-buffer-local 'flymake-new-err-info)
! ;;;; [[ cross-emacsen compatibility routines
(defsubst flymake-makehash (&optional test)
+ "Create and return a new hash table using TEST to compare keys.
+ It uses the function `make-hash-table' to make a hash-table if
+ you use GNU Emacs, otherwise it uses `makehash'."
(if (fboundp 'make-hash-table)
(if test (make-hash-table :test test) (make-hash-table))
(with-no-warnings
*************** Zero-length substrings at the beginning
*** 106,115 ****
(lambda () temporary-file-directory)))
(defun flymake-posn-at-point-as-event (&optional position window dx dy)
! "Return pixel position of top left corner of glyph at POSITION,
! relative to top left corner of WINDOW, as a mouse-1 click
! event (identical to the event that would be triggered by clicking
! mouse button 1 at the top left corner of the glyph).
POSITION and WINDOW default to the position of point in the
selected window.
--- 109,120 ----
(lambda () temporary-file-directory)))
(defun flymake-posn-at-point-as-event (&optional position window dx dy)
! "Return pixel position of top left corner of glyph at POSITION.
!
! The position is relative to top left corner of WINDOW, as a
! mouse-1 click event (identical to the event that would be
! triggered by clicking mouse button 1 at the top left corner of
! the glyph).
POSITION and WINDOW default to the position of point in the
selected window.
*************** See `x-popup-menu' for the menu specifie
*** 164,170 ****
(if (featurep 'xemacs) (progn
! (defun flymake-nop ())
(defun flymake-make-xemacs-menu (menu-data)
"Return a menu specifier using MENU-DATA."
--- 169,176 ----
(if (featurep 'xemacs) (progn
! (defun flymake-nop ()
! "Do nothing.")
(defun flymake-make-xemacs-menu (menu-data)
"Return a menu specifier using MENU-DATA."
*************** See `x-popup-menu' for the menu specifie
*** 187,192 ****
--- 193,199 ----
(count-lines (window-start) (point))))
(defun flymake-selected-frame ()
+ "Return the frame that is now selected."
(if (fboundp 'window-edges)
(selected-frame)
(selected-window)))
*************** See `x-popup-menu' for the menu specifie
*** 217,247 ****
:group 'flymake
:type 'integer)
(defun flymake-log (level text &rest args)
"Log a message at level LEVEL.
If LEVEL is higher than `flymake-log-level', the message is
ignored. Otherwise, it is printed using `message'.
TEXT is a format control string, and the remaining arguments ARGS
! are the string substitutions (see `format')."
(if (<= level flymake-log-level)
(let* ((msg (apply 'format text args)))
(message "%s" msg)
;;(with-temp-buffer
;; (insert msg)
;; (insert "\n")
! ;; (flymake-save-buffer-in-file "d:/flymake.log" t) ; make log file name customizable
;;)
)))
(defun flymake-ins-after (list pos val)
! "Insert VAL into LIST after position POS."
! (let ((tmp (copy-sequence list))) ; (???)
(setcdr (nthcdr pos tmp) (cons val (nthcdr (1+ pos) tmp)))
tmp))
(defun flymake-set-at (list pos val)
! "Set VAL at position POS in LIST."
! (let ((tmp (copy-sequence list))) ; (???)
(setcar (nthcdr pos tmp) val)
tmp))
--- 224,263 ----
:group 'flymake
:type 'integer)
+ ;; (defcustom flymake-log-file-name "~/flymake.log"
+ ;; "Where to put the flymake log if logging is enabled.
+
+ ;; See `flymake-log-level' if you want to control what is logged."
+ ;; :group 'flymake
+ ;; :type 'string)
+
(defun flymake-log (level text &rest args)
"Log a message at level LEVEL.
If LEVEL is higher than `flymake-log-level', the message is
ignored. Otherwise, it is printed using `message'.
TEXT is a format control string, and the remaining arguments ARGS
! are the string substitutions (see the function `format')."
(if (<= level flymake-log-level)
(let* ((msg (apply 'format text args)))
(message "%s" msg)
;;(with-temp-buffer
;; (insert msg)
;; (insert "\n")
! ;; (flymake-save-buffer-in-file "~/flymake.log") ; make log file name customizable
;;)
)))
(defun flymake-ins-after (list pos val)
! "Insert VAL into LIST after position POS.
! POS counts from zero."
! (let ((tmp (copy-sequence list))) ; Bind `tmp' to a copy of LIST
(setcdr (nthcdr pos tmp) (cons val (nthcdr (1+ pos) tmp)))
tmp))
(defun flymake-set-at (list pos val)
! "Set VAL at position POS in LIST.
! POS counts from zero."
! (let ((tmp (copy-sequence list))) ; Bind `tmp' to a copy of LIST
(setcar (nthcdr pos tmp) val)
tmp))
*************** are the string substitutions (see `forma
*** 249,255 ****
"List of currently active flymake processes.")
(defvar flymake-output-residual nil)
-
(make-variable-buffer-local 'flymake-output-residual)
(defgroup flymake nil
--- 265,270 ----
*************** are the string substitutions (see `forma
*** 284,294 ****
:type '(repeat (string symbol symbol symbol)))
(defun flymake-get-file-name-mode-and-masks (file-name)
! "Return the corresponding entry from `flymake-allowed-file-name-masks'."
(unless (stringp file-name)
(error "Invalid file-name"))
(let ((fnm flymake-allowed-file-name-masks)
! (mode-and-masks nil))
(while (and (not mode-and-masks) fnm)
(if (string-match (car (car fnm)) file-name)
(setq mode-and-masks (cdr (car fnm))))
--- 299,309 ----
:type '(repeat (string symbol symbol symbol)))
(defun flymake-get-file-name-mode-and-masks (file-name)
! "Return the function(s) correspond(s) to FILE-NAME in `flymake-allowed-file-name-masks'."
(unless (stringp file-name)
(error "Invalid file-name"))
(let ((fnm flymake-allowed-file-name-masks)
! (mode-and-masks nil))
(while (and (not mode-and-masks) fnm)
(if (string-match (car (car fnm)) file-name)
(setq mode-and-masks (cdr (car fnm))))
*************** are the string substitutions (see `forma
*** 296,335 ****
(flymake-log 3 "file %s, init=%s" file-name (car mode-and-masks))
mode-and-masks))
- (defun flymake-can-syntax-check-file (file-name)
- "Determine whether we can syntax check FILE-NAME.
- Return nil if we cannot, non-nil if we can."
- (if (flymake-get-init-function file-name) t nil))
-
(defun flymake-get-init-function (file-name)
! "Return init function to be used for the file."
(let* ((init-f (nth 0 (flymake-get-file-name-mode-and-masks file-name))))
;;(flymake-log 0 "calling %s" init-f)
;;(funcall init-f (current-buffer))
init-f))
(defun flymake-get-cleanup-function (file-name)
! "Return cleanup function to be used for the file."
(or (nth 1 (flymake-get-file-name-mode-and-masks file-name))
'flymake-simple-cleanup))
(defun flymake-get-real-file-name-function (file-name)
! (or (nth 2 (flymake-get-file-name-mode-and-masks file-name))
'flymake-get-real-file-name))
(defvar flymake-find-buildfile-cache (flymake-makehash 'equal))
(defun flymake-get-buildfile-from-cache (dir-name)
(gethash dir-name flymake-find-buildfile-cache))
(defun flymake-add-buildfile-to-cache (dir-name buildfile)
(puthash dir-name buildfile flymake-find-buildfile-cache))
(defun flymake-clear-buildfile-cache ()
(clrhash flymake-find-buildfile-cache))
(defun flymake-find-buildfile (buildfile-name source-dir-name)
! "Find buildfile starting from current directory.
Buildfile includes Makefile, build.xml etc.
Return its file name if found, or nil if not found."
(or (flymake-get-buildfile-from-cache source-dir-name)
--- 311,355 ----
(flymake-log 3 "file %s, init=%s" file-name (car mode-and-masks))
mode-and-masks))
(defun flymake-get-init-function (file-name)
! "Return init function to be used for the file FILE-NAME."
(let* ((init-f (nth 0 (flymake-get-file-name-mode-and-masks file-name))))
;;(flymake-log 0 "calling %s" init-f)
;;(funcall init-f (current-buffer))
init-f))
+ (defun flymake-can-syntax-check-file (file-name)
+ "Determine whether we can syntax check FILE-NAME.
+ Return t if we can, nil if we cannot."
+ (if (flymake-get-init-function file-name) t nil))
+
(defun flymake-get-cleanup-function (file-name)
! "Return cleanup function to be used for the file FILE-NAME."
(or (nth 1 (flymake-get-file-name-mode-and-masks file-name))
'flymake-simple-cleanup))
(defun flymake-get-real-file-name-function (file-name)
! "Return function that translates FILE-NAME to real file name."
! (or (nth 4 (flymake-get-file-name-mode-and-masks file-name))
'flymake-get-real-file-name))
(defvar flymake-find-buildfile-cache (flymake-makehash 'equal))
(defun flymake-get-buildfile-from-cache (dir-name)
+ "Look up DIR-NAME in cache and return its associated value.
+ If DIR-NAME is not found, return nil."
(gethash dir-name flymake-find-buildfile-cache))
(defun flymake-add-buildfile-to-cache (dir-name buildfile)
+ "Associate DIR-NAME with BUILDFILE in the buildfile cache."
(puthash dir-name buildfile flymake-find-buildfile-cache))
(defun flymake-clear-buildfile-cache ()
+ "Clear the buildfile cache."
(clrhash flymake-find-buildfile-cache))
(defun flymake-find-buildfile (buildfile-name source-dir-name)
! "Find BUILDFILE-NAME starting from current directory.
Buildfile includes Makefile, build.xml etc.
Return its file name if found, or nil if not found."
(or (flymake-get-buildfile-from-cache source-dir-name)
*************** Return its file name if found, or nil if
*** 344,350 ****
nil)))))
(defun flymake-fix-file-name (name)
! "Replace all occurrences of '\' with '/'."
(when name
(setq name (expand-file-name name))
(setq name (abbreviate-file-name name))
--- 364,370 ----
nil)))))
(defun flymake-fix-file-name (name)
! "Replace all occurrences of '\' with '/' in filename NAME."
(when name
(setq name (expand-file-name name))
(setq name (abbreviate-file-name name))
*************** Return t if so, nil if not."
*** 371,377 ****
(defvar flymake-included-file-name)
(defun flymake-find-possible-master-files (file-name master-file-dirs masks)
! "Find (by name and location) all possible master files.
Master files include .cpp and .c for .h. Files are searched for
starting from the .h directory and max max-level parent dirs.
File contents are not checked."
--- 391,397 ----
(defvar flymake-included-file-name)
(defun flymake-find-possible-master-files (file-name master-file-dirs masks)
! "Find (by FILE-NAME and MASTER-FILE-DIRS) all possible master files.
Master files include .cpp and .c for .h. Files are searched for
starting from the .h directory and max max-level parent dirs.
File contents are not checked."
*************** instead of reading master file from disk
*** 516,522 ****
(current-buffer)))
(defun flymake-check-include (source-file-name inc-name include-dirs)
! "Check if SOURCE-FILE-NAME can be found in include path.
Return t if it can be found via include path using INC-NAME."
(if (file-name-absolute-p inc-name)
(flymake-same-files source-file-name inc-name)
--- 536,542 ----
(current-buffer)))
(defun flymake-check-include (source-file-name inc-name include-dirs)
! "Check if SOURCE-FILE-NAME can be found in INCLUDE-DIRS.
Return t if it can be found via include path using INC-NAME."
(if (file-name-absolute-p inc-name)
(flymake-same-files source-file-name inc-name)
*************** Return t if so, nil if not."
*** 537,543 ****
(get-buffer buffer-name))))
(defun flymake-create-master-file (source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp)
! "Save SOURCE-FILE-NAME with a different name.
Find master file, patch and save it."
(let* ((possible-master-files (flymake-find-possible-master-files source-file-name flymake-master-file-dirs masks))
(master-file-count (length possible-master-files))
--- 557,563 ----
(get-buffer buffer-name))))
(defun flymake-create-master-file (source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp)
! "Save SOURCE-FILE-NAME with a different name PATCHED-SOURCE-FILE-NAME.
Find master file, patch and save it."
(let* ((possible-master-files (flymake-find-possible-master-files source-file-name flymake-master-file-dirs masks))
(master-file-count (length possible-master-files))
*************** Find master file, patch and save it."
*** 571,576 ****
--- 591,598 ----
nil))))
(defun flymake-save-buffer-in-file (file-name)
+ "Save the entire buffer contents into file FILE-NAME.
+ It also creates optionally any nonexistent parent directories."
(make-directory (file-name-directory file-name) 1)
(write-region nil nil file-name nil 566)
(flymake-log 3 "saved buffer %s in file %s" (buffer-name) file-name))
*************** Use CREATE-TEMP-F for creating temp copy
*** 1842,1844 ****
--- 1864,1868 ----
(provide 'flymake)
;;; flymake.el ends here
+
+ ;; LocalWords: DIRS POS odl tex init GNUmakefile Makefile
[-- Attachment #3: flymake.texi.patch --]
[-- Type: text/x-diff, Size: 34149 bytes --]
*** trunk/doc/misc/flymake.texi 2013-02-17 22:42:17.309803000 +0800
--- trunk/doc/misc/flymake.texi.new 2013-02-23 21:20:27.468530453 +0800
*************** modify this GNU manual.''
*** 63,75 ****
@cindex Overview of Flymake
Flymake is a universal on-the-fly syntax checker implemented as an
! Emacs minor mode. Flymake runs the pre-configured syntax check tool
(compiler for C++ files, @code{perl} for perl files, etc.)@: in the
background, passing it a temporary copy of the current buffer, and
! parses the output for known error/warning message patterns. Flymake
then highlights erroneous lines (i.e., lines for which at least one
error or warning has been reported by the syntax check tool), and
! displays an overall buffer status in the mode line. Status information
displayed by Flymake contains total number of errors and warnings
reported for the buffer during the last syntax check.
--- 63,75 ----
@cindex Overview of Flymake
Flymake is a universal on-the-fly syntax checker implemented as an
! Emacs minor mode. Flymake runs the pre-configured syntax check tool
(compiler for C++ files, @code{perl} for perl files, etc.)@: in the
background, passing it a temporary copy of the current buffer, and
! parses the output for known error/warning message patterns. Flymake
then highlights erroneous lines (i.e., lines for which at least one
error or warning has been reported by the syntax check tool), and
! displays an overall buffer status in the mode line. Status information
displayed by Flymake contains total number of errors and warnings
reported for the buffer during the last syntax check.
*************** line, respectively.
*** 79,92 ****
Calling @code{flymake-display-err-menu-for-current-line} will popup a
menu containing error messages reported by the syntax check tool for
! the current line. Errors/warnings belonging to another file, such as a
@code{.h} header file included by a @code{.c} file, are shown in the
! current buffer as belonging to the first line. Menu items for such
! messages also contain a filename and a line number. Selecting such a
menu item will automatically open the file and jump to the line with
error.
! Syntax check is done 'on-the-fly'. It is started whenever
@itemize @bullet
@item buffer is loaded
--- 79,92 ----
Calling @code{flymake-display-err-menu-for-current-line} will popup a
menu containing error messages reported by the syntax check tool for
! the current line. Errors/warnings belonging to another file, such as a
@code{.h} header file included by a @code{.c} file, are shown in the
! current buffer as belonging to the first line. Menu items for such
! messages also contain a filename and a line number. Selecting such a
menu item will automatically open the file and jump to the line with
error.
! Syntax check is done 'on-the-fly'. It is started whenever
@itemize @bullet
@item buffer is loaded
*************** patterns. @xref{Configuring Flymake}.
*** 107,113 ****
Flymake is packaged in a single file, @code{flymake.el}.
To install/update Flymake, place @code{flymake.el} to a directory
! somewhere on Emacs load path. You might also want to byte-compile
@code{flymake.el} to improve performance.
Also, place the following line in the @code{.emacs} file.
--- 107,113 ----
Flymake is packaged in a single file, @code{flymake.el}.
To install/update Flymake, place @code{flymake.el} to a directory
! somewhere on Emacs load path. You might also want to byte-compile
@code{flymake.el} to improve performance.
Also, place the following line in the @code{.emacs} file.
*************** You might also map the most frequently u
*** 141,153 ****
@section Flymake mode
@cindex flymake-mode
! Flymake is an Emacs minor mode. To use Flymake, you
must first activate @code{flymake-mode} by using the
@code{flymake-mode} function.
Instead of manually activating @code{flymake-mode}, you can configure
Flymake to automatically enable @code{flymake-mode} upon opening any
! file for which syntax check is possible. To do so, place the following
line in @code{.emacs}:
@lisp
--- 141,153 ----
@section Flymake mode
@cindex flymake-mode
! Flymake is an Emacs minor mode. To use Flymake, you
must first activate @code{flymake-mode} by using the
@code{flymake-mode} function.
Instead of manually activating @code{flymake-mode}, you can configure
Flymake to automatically enable @code{flymake-mode} upon opening any
! file for which syntax check is possible. To do so, place the following
line in @code{.emacs}:
@lisp
*************** line in @code{.emacs}:
*** 159,167 ****
@cindex Manually starting the syntax check
When @code{flymake-mode} is active, syntax check is started
! automatically on any of the three conditions mentioned above. Syntax
check can also be started manually by using the
! @code{flymake-start-syntax-check-for-current-buffer} function. This
can be used, for example, when changes were made to some other buffer
affecting the current buffer.
--- 159,167 ----
@cindex Manually starting the syntax check
When @code{flymake-mode} is active, syntax check is started
! automatically on any of the three conditions mentioned above. Syntax
check can also be started manually by using the
! @code{flymake-start-syntax-check-for-current-buffer} function. This
can be used, for example, when changes were made to some other buffer
affecting the current buffer.
*************** affecting the current buffer.
*** 171,177 ****
After syntax check is completed, lines for which at least one error or
warning has been reported are highlighted, and total number of errors
! and warning is shown in the mode line. Use the following functions to
navigate the highlighted lines.
@multitable @columnfractions 0.25 0.75
--- 171,177 ----
After syntax check is completed, lines for which at least one error or
warning has been reported are highlighted, and total number of errors
! and warning is shown in the mode line. Use the following functions to
navigate the highlighted lines.
@multitable @columnfractions 0.25 0.75
*************** navigate the highlighted lines.
*** 184,190 ****
@end multitable
! These functions treat erroneous lines as a linked list. Therefore,
@code{flymake-goto-next-error} will go to the first erroneous line
when invoked in the end of the buffer.
--- 184,190 ----
@end multitable
! These functions treat erroneous lines as a linked list. Therefore,
@code{flymake-goto-next-error} will go to the first erroneous line
when invoked in the end of the buffer.
*************** when invoked in the end of the buffer.
*** 193,199 ****
@cindex Viewing error messages
To view error messages belonging to the current line, use the
! @code{flymake-display-err-menu-for-current-line} function. If there's
at least one error or warning reported for the current line, this
function will display a popup menu with error/warning texts.
Selecting the menu item whose error belongs to another file brings
--- 193,199 ----
@cindex Viewing error messages
To view error messages belonging to the current line, use the
! @code{flymake-display-err-menu-for-current-line} function. If there's
at least one error or warning reported for the current line, this
function will display a popup menu with error/warning texts.
Selecting the menu item whose error belongs to another file brings
*************** The following statuses are defined.
*** 209,220 ****
@multitable @columnfractions 0.25 0.75
@item Flymake* or Flymake:E/W*
! @tab Flymake is currently running. For the second case, E/W contains the
error and warning count for the previous run.
@item Flymake
! @tab Syntax check is not running. Usually this means syntax check was
! successfully passed (no errors, no warnings). Other possibilities are:
syntax check was killed as a result of executing
@code{flymake-compile}, or syntax check cannot start as compilation
is currently in progress.
--- 209,220 ----
@multitable @columnfractions 0.25 0.75
@item Flymake* or Flymake:E/W*
! @tab Flymake is currently running. For the second case, E/W contains the
error and warning count for the previous run.
@item Flymake
! @tab Syntax check is not running. Usually this means syntax check was
! successfully passed (no errors, no warnings). Other possibilities are:
syntax check was killed as a result of executing
@code{flymake-compile}, or syntax check cannot start as compilation
is currently in progress.
*************** OFF for the buffer.
*** 232,238 ****
@multitable @columnfractions 0.25 0.75
@item CFGERR
@tab Syntax check process returned nonzero exit code, but no
! errors/warnings were reported. This indicates a possible configuration
error (for example, no suitable error message patterns for the
syntax check tool).
--- 232,238 ----
@multitable @columnfractions 0.25 0.75
@item CFGERR
@tab Syntax check process returned nonzero exit code, but no
! errors/warnings were reported. This indicates a possible configuration
error (for example, no suitable error message patterns for the
syntax check tool).
*************** OFF for the buffer.
*** 253,265 ****
@cindex Troubleshooting
Flymake uses a simple logging facility for indicating important points
! in the control flow. The logging facility sends logging messages to
! the @code{*Messages*} buffer. The information logged can be used for
resolving various problems related to Flymake.
! Logging output is controlled by the @code{flymake-log-level}
! variable. @code{3} is the most verbose level, and @code{-1} switches
! logging off.
@node Configuring Flymake
@chapter Configuring and Extending Flymake
--- 253,265 ----
@cindex Troubleshooting
Flymake uses a simple logging facility for indicating important points
! in the control flow. The logging facility sends logging messages to
! the @code{*Messages*} buffer. The information logged can be used for
resolving various problems related to Flymake.
! Logging output is controlled by the @code{flymake-log-level} variable.
! @code{3} is the most verbose level, and @code{-1} switches logging
! off.
@node Configuring Flymake
@chapter Configuring and Extending Flymake
*************** started after @code{flymake-no-changes-t
*** 321,327 ****
@item flymake-gui-warnings-enabled
A boolean flag indicating whether Flymake will show message boxes for
! non-recoverable errors. If @code{flymake-gui-warnings-enabled} is
@code{nil}, these errors will only be logged to the @code{*Messages*}
buffer.
--- 321,327 ----
@item flymake-gui-warnings-enabled
A boolean flag indicating whether Flymake will show message boxes for
! non-recoverable errors. If @code{flymake-gui-warnings-enabled} is
@code{nil}, these errors will only be logged to the @code{*Messages*}
buffer.
*************** Which fringe (if any) should show the wa
*** 360,366 ****
@end menu
Syntax check tools are configured using the
! @code{flymake-allowed-file-name-masks} list. Each item of this list
has the following format:
@lisp
--- 360,366 ----
@end menu
Syntax check tools are configured using the
! @code{flymake-allowed-file-name-masks} list. Each item of this list
has the following format:
@lisp
*************** has the following format:
*** 371,384 ****
@item filename-regexp
This field is used as a key for locating init/cleanup/getfname
functions for the buffer. Items in
! @code{flymake-allowed-file-name-masks} are searched sequentially. The
first item with @code{filename-regexp} matching buffer filename is
! selected. If no match is found, @code{flymake-mode} is switched off.
@item init-function
@code{init-function} is required to initialize the syntax check,
! usually by creating a temporary copy of the buffer contents. The
! function must return @code{(list cmd-name arg-list)}. If
@code{init-function} returns null, syntax check is aborted, by
@code{flymake-mode} is not switched off.
--- 371,384 ----
@item filename-regexp
This field is used as a key for locating init/cleanup/getfname
functions for the buffer. Items in
! @code{flymake-allowed-file-name-masks} are searched sequentially. The
first item with @code{filename-regexp} matching buffer filename is
! selected. If no match is found, @code{flymake-mode} is switched off.
@item init-function
@code{init-function} is required to initialize the syntax check,
! usually by creating a temporary copy of the buffer contents. The
! function must return @code{(list cmd-name arg-list)}. If
@code{init-function} returns null, syntax check is aborted, by
@code{flymake-mode} is not switched off.
*************** usually deleting a temporary copy create
*** 389,395 ****
@item getfname-function
This function is used for translating filenames reported by the syntax
! check tool into ``real'' filenames. Filenames reported by the tool
will be different from the real ones, as actually the tool works with
the temporary copy. In most cases, the default implementation
provided by Flymake, @code{flymake-get-real-file-name}, can be used as
--- 389,395 ----
@item getfname-function
This function is used for translating filenames reported by the syntax
! check tool into ``real'' filenames. Filenames reported by the tool
will be different from the real ones, as actually the tool works with
the temporary copy. In most cases, the default implementation
provided by Flymake, @code{flymake-get-real-file-name}, can be used as
*************** provided by Flymake, @code{flymake-get-r
*** 400,407 ****
To add support for a new syntax check tool, write corresponding
@code{init-function}, and, optionally @code{cleanup-function} and
@code{getfname-function}. If the format of error messages reported by
! the new tool is not yet supported by Flymake, add a new entry to
! the @code{flymake-err-line-patterns} list.
The following sections contain some examples of configuring Flymake
support for various syntax check tools.
--- 400,407 ----
To add support for a new syntax check tool, write corresponding
@code{init-function}, and, optionally @code{cleanup-function} and
@code{getfname-function}. If the format of error messages reported by
! the new tool is not yet supported by Flymake, add a new entry to the
! @code{flymake-err-line-patterns} list.
The following sections contain some examples of configuring Flymake
support for various syntax check tools.
*************** support for various syntax check tools.
*** 411,417 ****
@cindex Adding support for perl
In this example, we will add support for @code{perl} as a syntax check
! tool. @code{perl} supports the @code{-c} option which does syntax
checking.
First, we write the @code{init-function}:
--- 411,417 ----
@cindex Adding support for perl
In this example, we will add support for @code{perl} as a syntax check
! tool. @code{perl} supports the @code{-c} option which does syntax
checking.
First, we write the @code{init-function}:
*************** In this example we will add support for
*** 463,469 ****
@command{gcc} called via @command{make}.
We're not required to write any new functions, as Flymake already has
! functions for @command{make}. We just add a new entry to the
@code{flymake-allowed-file-name-masks}:
@lisp
--- 463,469 ----
@command{gcc} called via @command{make}.
We're not required to write any new functions, as Flymake already has
! functions for @command{make}. We just add a new entry to the
@code{flymake-allowed-file-name-masks}:
@lisp
*************** command line:
*** 489,495 ****
@code{base-dir} is a directory containing @code{Makefile}, see @ref{Locating the buildfile}.
! Thus, @code{Makefile} must contain the @code{check-syntax} target. In
our case this target might look like this:
@verbatim
--- 489,495 ----
@code{base-dir} is a directory containing @code{Makefile}, see @ref{Locating the buildfile}.
! Thus, @code{Makefile} must contain the @code{check-syntax} target. In
our case this target might look like this:
@verbatim
*************** check-syntax:
*** 527,538 ****
Syntax check is started by calling @code{flymake-start-syntax-check-for-current-buffer}.
Flymake first determines whether it is able to do syntax
! check. It then saves a copy of the buffer in a temporary file in the
buffer's directory (or in the system temp directory, for java
files), creates a syntax check command and launches a process with
! this command. The output is parsed using a list of error message patterns,
and error information (file name, line number, type and text) is
! saved. After the process has finished, Flymake highlights erroneous
lines in the buffer using the accumulated error information.
@node Determining whether syntax check is possible
--- 527,538 ----
Syntax check is started by calling @code{flymake-start-syntax-check-for-current-buffer}.
Flymake first determines whether it is able to do syntax
! check. It then saves a copy of the buffer in a temporary file in the
buffer's directory (or in the system temp directory, for java
files), creates a syntax check command and launches a process with
! this command. The output is parsed using a list of error message patterns,
and error information (file name, line number, type and text) is
! saved. After the process has finished, Flymake highlights erroneous
lines in the buffer using the accumulated error information.
@node Determining whether syntax check is possible
*************** Two syntax check modes are distinguished
*** 550,564 ****
@item
Buffer can be syntax checked in a standalone fashion, that is, the
! file (its temporary copy, in fact) can be passed over to the compiler to
! do the syntax check. Examples are C/C++ (.c, .cpp) and Java (.java)
! sources.
@item
Buffer can be syntax checked, but additional file, called master file,
! is required to perform this operation. A master file is a file that
includes the current file, so that running a syntax check tool on it
! will also check syntax in the current file. Examples are C/C++ (.h,
.hpp) headers.
@end enumerate
--- 550,564 ----
@item
Buffer can be syntax checked in a standalone fashion, that is, the
! file (its temporary copy, in fact) can be passed over to the compiler
! to do the syntax check. Examples are C/C++ (.c, .cpp) and Java
! (.java) sources.
@item
Buffer can be syntax checked, but additional file, called master file,
! is required to perform this operation. A master file is a file that
includes the current file, so that running a syntax check tool on it
! will also check syntax in the current file. Examples are C/C++ (.h,
.hpp) headers.
@end enumerate
*************** copies, finding master files, etc.), as
*** 579,585 ****
After the possibility of the syntax check has been determined, a
temporary copy of the current buffer is made so that the most recent
! unsaved changes could be seen by the syntax check tool. Making a copy
is quite straightforward in a standalone case (mode @code{1}), as it's
just saving buffer contents to a temporary file.
--- 579,585 ----
After the possibility of the syntax check has been determined, a
temporary copy of the current buffer is made so that the most recent
! unsaved changes could be seen by the syntax check tool. Making a copy
is quite straightforward in a standalone case (mode @code{1}), as it's
just saving buffer contents to a temporary file.
*************** name.
*** 595,605 ****
Locating a master file is discussed in the following section.
Patching just changes all appropriate lines of the master file so that they
! use the new (temporary) name of the current file. For example, suppose current
file name is @code{file.h}, the master file is @code{file.cpp}, and
! it includes current file via @code{#include "file.h"}. Current file's copy
is saved to file @code{file_flymake.h}, so the include line must be
! changed to @code{#include "file_flymake.h"}. Finally, patched master file
is saved to @code{file_flymake_master.cpp}, and the last one is passed to
the syntax check tool.
--- 595,605 ----
Locating a master file is discussed in the following section.
Patching just changes all appropriate lines of the master file so that they
! use the new (temporary) name of the current file. For example, suppose current
file name is @code{file.h}, the master file is @code{file.cpp}, and
! it includes current file via @code{#include "file.h"}. Current file's copy
is saved to file @code{file_flymake.h}, so the include line must be
! changed to @code{#include "file_flymake.h"}. Finally, patched master file
is saved to @code{file_flymake_master.cpp}, and the last one is passed to
the syntax check tool.
*************** the syntax check tool.
*** 609,655 ****
Master file is located in two steps.
! First, a list of possible master files is built. A simple name
! matching is used to find the files. For a C++ header @code{file.h},
Flymake searches for all @code{.cpp} files in the directories whose relative paths are
stored in a customizable variable @code{flymake-master-file-dirs}, which
! usually contains something like @code{("." "./src")}. No more than
@code{flymake-master-file-count-limit} entries is added to the master file
! list. The list is then sorted to move files with names @code{file.cpp} to
the top.
Next, each master file in a list is checked to contain the appropriate
! include directives. No more than @code{flymake-check-file-limit} of each
file are parsed.
For @code{file.h}, the include directives to look for are
! @code{#include "file.h"}, @code{#include "../file.h"}, etc. Each
include is checked against a list of include directories
(see @ref{Getting the include directories}) to be sure it points to the
correct @code{file.h}.
! First matching master file found stops the search. The master file is then
! patched and saved to disk. In case no master file is found, syntax check is
aborted, and corresponding status (!) is reported in the mode line.
@node Getting the include directories
@section Getting the include directories
@cindex Include directories (C/C++ specific)
! Two sets of include directories are distinguished: system include directories
! and project include directories. The former is just the contents of the
! @code{INCLUDE} environment variable. The latter is not so easy to obtain,
! and the way it can be obtained can vary greatly for different projects.
! Therefore, a customizable variable
! @code{flymake-get-project-include-dirs-function} is used to provide the
! way to implement the desired behavior.
The default implementation, @code{flymake-get-project-include-dirs-imp},
! uses a @command{make} call. This requires a correct base directory, that is, a
directory containing a correct @file{Makefile}, to be determined.
As obtaining the project include directories might be a costly operation, its
! return value is cached in the hash table. The cache is cleared in the beginning
of every syntax check attempt.
@node Locating the buildfile
--- 609,655 ----
Master file is located in two steps.
! First, a list of possible master files is built. A simple name
! matching is used to find the files. For a C++ header @code{file.h},
Flymake searches for all @code{.cpp} files in the directories whose relative paths are
stored in a customizable variable @code{flymake-master-file-dirs}, which
! usually contains something like @code{("." "./src")}. No more than
@code{flymake-master-file-count-limit} entries is added to the master file
! list. The list is then sorted to move files with names @code{file.cpp} to
the top.
Next, each master file in a list is checked to contain the appropriate
! include directives. No more than @code{flymake-check-file-limit} of each
file are parsed.
For @code{file.h}, the include directives to look for are
! @code{#include "file.h"}, @code{#include "../file.h"}, etc. Each
include is checked against a list of include directories
(see @ref{Getting the include directories}) to be sure it points to the
correct @code{file.h}.
! First matching master file found stops the search. The master file is then
! patched and saved to disk. In case no master file is found, syntax check is
aborted, and corresponding status (!) is reported in the mode line.
@node Getting the include directories
@section Getting the include directories
@cindex Include directories (C/C++ specific)
! Two sets of include directories are distinguished: system include
! directories and project include directories. The former is just the
! contents of the @code{INCLUDE} environment variable. The latter is
! not so easy to obtain, and the way it can be obtained can vary greatly
! for different projects. Therefore, a customizable variable
! @code{flymake-get-project-include-dirs-function} is used to provide
! the way to implement the desired behavior.
The default implementation, @code{flymake-get-project-include-dirs-imp},
! uses a @command{make} call. This requires a correct base directory, that is, a
directory containing a correct @file{Makefile}, to be determined.
As obtaining the project include directories might be a costly operation, its
! return value is cached in the hash table. The cache is cleared in the beginning
of every syntax check attempt.
@node Locating the buildfile
*************** of every syntax check attempt.
*** 659,676 ****
@cindex Makefile, locating
Flymake can be configured to use different tools for performing syntax
! checks. For example, it can use direct compiler call to syntax check a perl
script or a call to @command{make} for a more complicated case of a
! @code{C/C++} source. The general idea is that simple files, like perl
scripts and html pages, can be checked by directly invoking a
! corresponding tool. Files that are usually more complex and generally
used as part of larger projects, might require non-trivial options to
be passed to the syntax check tool, like include directories for
! C++. The latter files are syntax checked using some build tool, like
Make or Ant.
All Make configuration data is usually stored in a file called
! @code{Makefile}. To allow for future extensions, flymake uses a notion of
buildfile to reference the 'project configuration' file.
Special function, @code{flymake-find-buildfile} is provided for locating buildfiles.
--- 659,676 ----
@cindex Makefile, locating
Flymake can be configured to use different tools for performing syntax
! checks. For example, it can use direct compiler call to syntax check a perl
script or a call to @command{make} for a more complicated case of a
! @code{C/C++} source. The general idea is that simple files, like perl
scripts and html pages, can be checked by directly invoking a
! corresponding tool. Files that are usually more complex and generally
used as part of larger projects, might require non-trivial options to
be passed to the syntax check tool, like include directories for
! C++. The latter files are syntax checked using some build tool, like
Make or Ant.
All Make configuration data is usually stored in a file called
! @code{Makefile}. To allow for future extensions, flymake uses a notion of
buildfile to reference the 'project configuration' file.
Special function, @code{flymake-find-buildfile} is provided for locating buildfiles.
*************** for possible master files.
*** 679,685 ****
@ignore
A customizable variable
@code{flymake-buildfile-dirs} holds a list of relative paths to the
! buildfile. They are checked sequentially until a buildfile is found.
@end ignore
In case there's no build file, syntax check is aborted.
--- 679,685 ----
@ignore
A customizable variable
@code{flymake-buildfile-dirs} holds a list of relative paths to the
! buildfile. They are checked sequentially until a buildfile is found.
@end ignore
In case there's no build file, syntax check is aborted.
*************** Buildfile values are also cached.
*** 690,696 ****
@cindex Syntax check process
The command line (command name and the list of arguments) for launching a process is returned by the
! initialization function. Flymake then just calls @code{start-process}
to start an asynchronous process and configures process filter and
sentinel which is used for processing the output of the syntax check
tool.
--- 690,696 ----
@cindex Syntax check process
The command line (command name and the list of arguments) for launching a process is returned by the
! initialization function. Flymake then just calls @code{start-process}
to start an asynchronous process and configures process filter and
sentinel which is used for processing the output of the syntax check
tool.
*************** tool.
*** 701,724 ****
The output generated by the syntax check tool is parsed in the process
filter/sentinel using the error message patterns stored in the
! @code{flymake-err-line-patterns} variable. This variable contains a
list of items of the form @code{(regexp file-idx line-idx
err-text-idx)}, used to determine whether a particular line is an
error message and extract file name, line number and error text,
! respectively. Error type (error/warning) is also guessed by matching
! error text with the '@code{^[wW]arning}' pattern. Anything that was not
! classified as a warning is considered an error. Type is then used to
sort error menu items, which shows error messages first.
Flymake is also able to interpret error message patterns missing err-text-idx
! information. This is done by merely taking the rest of the matched line
! (@code{(substring line (match-end 0))}) as error text. This trick allows
to make use of a huge collection of error message line patterns from
! @code{compile.el}. All these error patterns are appended to
the end of @code{flymake-err-line-patterns}.
The error information obtained is saved in a buffer local
! variable. The buffer for which the process output belongs is
determined from the process-id@w{}->@w{}buffer mapping updated
after every process launch/exit.
--- 701,724 ----
The output generated by the syntax check tool is parsed in the process
filter/sentinel using the error message patterns stored in the
! @code{flymake-err-line-patterns} variable. This variable contains a
list of items of the form @code{(regexp file-idx line-idx
err-text-idx)}, used to determine whether a particular line is an
error message and extract file name, line number and error text,
! respectively. Error type (error/warning) is also guessed by matching
! error text with the '@code{^[wW]arning}' pattern. Anything that was not
! classified as a warning is considered an error. Type is then used to
sort error menu items, which shows error messages first.
Flymake is also able to interpret error message patterns missing err-text-idx
! information. This is done by merely taking the rest of the matched line
! (@code{(substring line (match-end 0))}) as error text. This trick allows
to make use of a huge collection of error message line patterns from
! @code{compile.el}. All these error patterns are appended to
the end of @code{flymake-err-line-patterns}.
The error information obtained is saved in a buffer local
! variable. The buffer for which the process output belongs is
determined from the process-id@w{}->@w{}buffer mapping updated
after every process launch/exit.
*************** after every process launch/exit.
*** 727,733 ****
@cindex Erroneous lines, faces
Highlighting is implemented with overlays and happens in the process
! sentinel, after calling the cleanup function. Two customizable faces
are used: @code{flymake-errline} and
@code{flymake-warnline}. Errors belonging outside the current
buffer are considered to belong to line 1 of the current buffer.
--- 727,733 ----
@cindex Erroneous lines, faces
Highlighting is implemented with overlays and happens in the process
! sentinel, after calling the cleanup function. Two customizable faces
are used: @code{flymake-errline} and
@code{flymake-warnline}. Errors belonging outside the current
buffer are considered to belong to line 1 of the current buffer.
*************** and @code{flymake-warning-bitmap}.
*** 749,759 ****
The only mode flymake currently knows about is @code{compile}.
Flymake can be configured to not start syntax check if it thinks the
! compilation is in progress. The check is made by the
@code{flymake-compilation-is-running}, which tests the
! @code{compilation-in-progress} variable. The reason why this might be
useful is saving CPU time in case both syntax check and compilation
! are very CPU intensive. The original reason for adding this feature,
though, was working around a locking problem with MS Visual C++ compiler.
Flymake also provides an alternative command for starting compilation,
--- 749,759 ----
The only mode flymake currently knows about is @code{compile}.
Flymake can be configured to not start syntax check if it thinks the
! compilation is in progress. The check is made by the
@code{flymake-compilation-is-running}, which tests the
! @code{compilation-in-progress} variable. The reason why this might be
useful is saving CPU time in case both syntax check and compilation
! are very CPU intensive. The original reason for adding this feature,
though, was working around a locking problem with MS Visual C++ compiler.
Flymake also provides an alternative command for starting compilation,
next reply other threads:[~2013-02-23 14:06 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-23 14:06 Xue Fuqiao [this message]
2013-05-10 1:20 ` [patch] Some fixes for flymake Glenn Morris
2013-05-10 8:19 ` Xue Fuqiao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130223220656.f500844733abd534265bd6f2@gmail.com \
--to=xfq.free@gmail.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).