summaryrefslogtreecommitdiff
path: root/emacs.d/elpa/flymake-easy-20140818.755/flymake-easy.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.d/elpa/flymake-easy-20140818.755/flymake-easy.el')
-rw-r--r--emacs.d/elpa/flymake-easy-20140818.755/flymake-easy.el152
1 files changed, 152 insertions, 0 deletions
diff --git a/emacs.d/elpa/flymake-easy-20140818.755/flymake-easy.el b/emacs.d/elpa/flymake-easy-20140818.755/flymake-easy.el
new file mode 100644
index 0000000..a6b3c23
--- /dev/null
+++ b/emacs.d/elpa/flymake-easy-20140818.755/flymake-easy.el
@@ -0,0 +1,152 @@
+;;; flymake-easy.el --- Helpers for easily building flymake checkers
+
+;; Copyright (C) 2012 Steve Purcell
+
+;; Author: Steve Purcell <steve@sanityinc.com>
+;; URL: https://github.com/purcell/flymake-easy
+;; Package-Version: 20140818.755
+;; Package-Commit: de41ea49503f71f997e5c359a2ad08df696c0147
+;; Version: DEV
+;; Keywords: convenience, internal
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library provides the `flymake-easy-load' helper function for
+;; setting up flymake checkers. Just call that function with the
+;; appropriate arguments in a major mode hook function. See
+;; `flymake-ruby' for an example:
+;; https://github.com/purcell/flymake-ruby
+
+;;; Code:
+
+(require 'flymake)
+
+(defvar flymake-easy--active nil
+ "Indicates when flymake-easy-load has successfully run in this buffer.")
+(defvar flymake-easy--command-fn nil
+ "The user-specified function for building the flymake command.")
+(defvar flymake-easy--location nil
+ "Where to create the temp file when checking, one of 'tempdir, 'inplace or
+'temp-with-folder.")
+(defvar flymake-easy--extension nil
+ "The canonical file name extension to use for the current file.")
+
+(mapc 'make-variable-buffer-local
+ '(flymake-easy--active
+ flymake-easy--command-fn
+ flymake-easy--location
+ flymake-easy--extension))
+
+(defun flymake-easy--tempfile-in-temp-dir (file-name prefix)
+ "Create a temporary file for storing the contents of FILE-NAME in the system tempdir.
+Argument PREFIX temp file prefix, supplied by flymake."
+ (make-temp-file (or prefix "flymake-easy")
+ nil
+ (concat "." flymake-easy--extension)))
+
+(defun flymake-easy--flymake-init ()
+ "A catch-all flymake init function for use in `flymake-allowed-file-name-masks'."
+ (let* ((tempfile
+ (flymake-init-create-temp-buffer-copy
+ (cond
+ ((eq 'tempdir flymake-easy--location)
+ 'flymake-easy--tempfile-in-temp-dir)
+ ((eq 'inplace flymake-easy--location)
+ 'flymake-create-temp-inplace)
+ ((eq 'temp-with-folder flymake-easy--location)
+ 'flymake-create-temp-with-folder-structure)
+ (t
+ (error "unknown location for flymake-easy: %s" flymake-easy--location)))))
+ (command (funcall flymake-easy--command-fn tempfile)))
+ (list (car command) (cdr command))))
+
+(defun flymake-easy-exclude-buffer-p ()
+ "Whether to skip flymake in the current buffer."
+ (and (fboundp 'tramp-tramp-file-p)
+ (buffer-file-name)
+ (tramp-tramp-file-p (buffer-file-name))))
+
+(defun flymake-easy-load (command-fn &optional err-line-patterns location extension warning-re info-re)
+ "Enable flymake in the containing buffer using a specific narrow configuration.
+Argument COMMAND-FN function called to build the
+ command line to run (receives filename, returns list).
+Argument ERR-LINE-PATTERNS patterns for identifying errors (see `flymake-err-line-patterns').
+Argument EXTENSION a canonical extension for this type of source file, e.g. \"rb\".
+Argument LOCATION where to create the temporary copy: one of 'tempdir (default), 'inplace or 'temp-with-folder
+Argument WARNING-RE a pattern which identifies error messages as warnings.
+Argument INFO-RE a pattern which identifies messages as infos (supported only
+by the flymake fork at https://github.com/illusori/emacs-flymake)."
+ (let ((executable (car (funcall command-fn "dummy"))))
+ (if (executable-find executable) ;; TODO: defer this checking
+ (unless (flymake-easy-exclude-buffer-p)
+ (setq flymake-easy--command-fn command-fn
+ flymake-easy--location (or location 'tempdir)
+ flymake-easy--extension extension
+ flymake-easy--active t)
+ (set (make-local-variable 'flymake-allowed-file-name-masks)
+ '(("." flymake-easy--flymake-init)))
+ (when err-line-patterns
+ (set (make-local-variable 'flymake-err-line-patterns) err-line-patterns))
+ (dolist (var '(flymake-warning-re flymake-warn-line-regexp))
+ (set (make-local-variable var) (or warning-re "^[wW]arn")))
+ (when (boundp 'flymake-info-line-regexp)
+ (set (make-local-variable 'flymake-info-line-regexp)
+ (or info-re "^[iI]nfo")))
+ (flymake-mode t))
+ (message "Not enabling flymake: '%s' program not found" executable))))
+
+;; Internal overrides for flymake
+
+(defun flymake-easy--find-all-matches (str)
+ "Return every match for `flymake-err-line-patterns' in STR.
+
+This is a judicious override for `flymake-split-output', enabled
+by the advice below, which allows for matching multi-line
+patterns."
+ (let (matches
+ (last-match-end-pos 0))
+ (dolist (pattern flymake-err-line-patterns)
+ (let ((regex (car pattern))
+ (pos 0))
+ (while (string-match regex str pos)
+ (push (match-string 0 str) matches)
+ (setq pos (match-end 0)))
+ (setq last-match-end-pos (max pos last-match-end-pos))))
+ (let ((residual (substring str last-match-end-pos)))
+ (list matches
+ (unless (string= "" residual) residual)))))
+
+(defadvice flymake-split-output (around flymake-easy--split-output (output) activate protect)
+ "Override `flymake-split-output' to support mult-line error messages."
+ (setq ad-return-value (if flymake-easy--active
+ (flymake-easy--find-all-matches output)
+ ad-do-it)))
+
+
+(defadvice flymake-post-syntax-check (before flymake-easy--force-check-was-interrupted activate)
+ (when flymake-easy--active
+ (setq flymake-check-was-interrupted t)))
+
+
+(provide 'flymake-easy)
+
+;; Local Variables:
+;; coding: utf-8
+;; byte-compile-warnings: (not cl-functions)
+;; eval: (checkdoc-minor-mode 1)
+;; End:
+
+;;; flymake-easy.el ends here