diff options
author | Gerd Moellmann <gerd@gnu.org> | 1999-10-30 19:21:43 +0000 |
---|---|---|
committer | Gerd Moellmann <gerd@gnu.org> | 1999-10-30 19:21:43 +0000 |
commit | dd24f431bebaf977d84fbb9c6e0fe69bde7ffbf0 (patch) | |
tree | 09c8a70d085e2eb79508d39f6a08a46da2f2b2a8 /lisp/whitespace.el | |
parent | e8d017d059d234c10805f15ac89ec749d1656e3c (diff) | |
download | emacs-dd24f431bebaf977d84fbb9c6e0fe69bde7ffbf0.tar.gz |
(whitespace-version): Update to 2.6
(whitespace-display-in-modeline): Add custom
variable to control displaying the whitespace errors on the
modeline based on suggestion from <klaus.berndl@sdm.de>
(whitespace-buffer): Now returns `t' if unclean
and `nil' if clean, to enable using as a hook function, as
suggested by Puneet Goel <puneet@computer.org>
(whitespace-buffer): Fix a subtle bug that cleaned
up only if quiet was not set, even with whitespace-auto-cleanup set.
(whitespace-mode-line): Now uses less modeline
real estate and shows whitespaces as W:<x>!<y> where <x> is any
type of whitespace which is present in the file, and <y> is any
type of whitespace whose check has been suppressed by setting
`whitespace-check-<whitespace-type>' to nil.
(whitespace-unchecked-whitespaces): New function
to return the list of whitespaces for whom checks have been
suppressed.
(whitespace-display-unchecked-whitespaces):
Renamed to `whitespace-update-modeline' to reflect its functionality.
(whitespace-version): Update to 2.5
Diffstat (limited to 'lisp/whitespace.el')
-rw-r--r-- | lisp/whitespace.el | 231 |
1 files changed, 127 insertions, 104 deletions
diff --git a/lisp/whitespace.el b/lisp/whitespace.el index 2e648f1b2c8..84e67eaeda2 100644 --- a/lisp/whitespace.el +++ b/lisp/whitespace.el @@ -42,7 +42,7 @@ (add-hook 'find-file-hooks 'whitespace-buffer) (add-hook 'kill-buffer-hook 'whitespace-buffer) -(defvar whitespace-version "2.3" "Version of the whitespace library.") +(defvar whitespace-version "2.6" "Version of the whitespace library.") ;; Find out what type of Emacs we are running in. (defvar whitespace-running-emacs (if (string-match "XEmacs\\|Lucid" emacs-version) nil t) @@ -59,6 +59,17 @@ visited by the buffers.") (defvar whitespace-rescan-timer nil "Timer object used to rescan the files in buffers that have been modified.") +;; Tell Emacs about this new kind of minor mode +(defvar whitespace-mode nil + "Non-nil when Whitespace mode (a minor mode) is enabled.") +(make-variable-buffer-local 'whitespace-mode) +(put 'whitespace-mode 'permanent-local nil) + +(defvar whitespace-mode-line nil + "String to display in the mode line for Whitespace mode.") +(make-variable-buffer-local 'whitespace-mode-line) +(put 'whitespace-mode-line 'permanent-local nil) + ;; For users of Emacs 19.x, defgroup and defcustom are not defined. (eval-when-compile @@ -174,16 +185,10 @@ To disable timer scans, set this to zero." :type 'integer :group 'whitespace) -;; Tell Emacs about this new kind of minor mode -(defvar whitespace-mode nil - "Non-nil when Whitespace mode (a minor mode) is enabled.") -(make-variable-buffer-local 'whitespace-mode) -(put 'whitespace-mode 'permanent-local nil) - -(defvar whitespace-mode-line nil - "String to display in the mode line for Whitespace mode.") -(make-variable-buffer-local 'whitespace-mode-line) -(put 'whitespace-mode-line 'permanent-local nil) +(defcustom whitespace-display-in-modeline t + "Display whitespace errors on the modeline." + :type 'boolean + :group 'whitespace) (if (not (assoc 'whitespace-mode minor-mode-alist)) (setq minor-mode-alist (cons '(whitespace-mode whitespace-mode-line) @@ -212,91 +217,94 @@ and: 1. the major mode is one of the whitespace-modes, or 2. `whitespace-buffer' was explicitly called with a prefix argument." (interactive) - (whitespace-check-whitespace-mode current-prefix-arg) - (if (and buffer-file-name (> (buffer-size) 0) whitespace-mode) - (progn - (whitespace-check-buffer-list (buffer-name) buffer-file-name) - (whitespace-tickle-timer) - (if whitespace-auto-cleanup - (if (and (not quiet) buffer-read-only) - (message "Can't Cleanup: %s is read-only." (buffer-name)) - (whitespace-cleanup)) - (let ((whitespace-leading (if whitespace-check-leading-whitespace - (whitespace-buffer-leading) - nil)) - (whitespace-trailing (if whitespace-check-trailing-whitespace - (whitespace-buffer-trailing) - nil)) - (whitespace-indent (if whitespace-check-indent-whitespace - (whitespace-buffer-search - whitespace-indent-regexp) - nil)) - (whitespace-spacetab (if whitespace-check-spacetab-whitespace + (let ((whitespace-error nil)) + (whitespace-check-whitespace-mode current-prefix-arg) + (if (and buffer-file-name (> (buffer-size) 0) whitespace-mode) + (progn + (whitespace-check-buffer-list (buffer-name) buffer-file-name) + (whitespace-tickle-timer) + (if whitespace-auto-cleanup + (if buffer-read-only + (if (not quiet) + (message "Can't cleanup: %s is read-only" (buffer-name))) + (whitespace-cleanup)) + (let ((whitespace-leading (if whitespace-check-leading-whitespace + (whitespace-buffer-leading) + nil)) + (whitespace-trailing (if whitespace-check-trailing-whitespace + (whitespace-buffer-trailing) + nil)) + (whitespace-indent (if whitespace-check-indent-whitespace (whitespace-buffer-search - whitespace-spacetab-regexp) + whitespace-indent-regexp) nil)) - (whitespace-ateol (if whitespace-check-ateol-whitespace - (whitespace-buffer-search - whitespace-ateol-regexp) - nil)) - (whitespace-errmsg nil) - (whitespace-error nil) - (whitespace-filename buffer-file-name) - (whitespace-this-modeline "")) - - ;; Now let's complain if we found any of the above. - (setq whitespace-error (or whitespace-leading whitespace-indent - whitespace-spacetab whitespace-ateol - whitespace-trailing)) - - (if whitespace-error - (progn - (setq whitespace-errmsg - (concat whitespace-filename " contains:\n" - (if whitespace-leading "Leading whitespace\n") - (if whitespace-indent - (concat "Indentation whitespace" - whitespace-indent "\n")) - (if whitespace-spacetab - (concat "Space followed by Tab" - whitespace-spacetab "\n")) - (if whitespace-ateol - (concat "End-of-line whitespace" - whitespace-ateol "\n")) - (if whitespace-trailing - "Trailing whitespace.\n") - "\ntype " - "`whitespace-cleanup' to cleanup the file.")) - (setq whitespace-this-modeline - (concat (if whitespace-ateol "e") - (if whitespace-indent "i") - (if whitespace-leading "l") - (if whitespace-spacetab "s") - (if whitespace-trailing "t"))) - (setq whitespace-mode-line - (concat " W:" whitespace-this-modeline)) - (whitespace-force-mode-line-update))) - - ;; Now test and set the whitespaces that are not checked. - (whitespace-display-unchecked-whitespaces - (if whitespace-error - (concat " W:" whitespace-this-modeline))) - (save-excursion - (get-buffer-create whitespace-errbuf) - (kill-buffer whitespace-errbuf) - (get-buffer-create whitespace-errbuf) - (set-buffer whitespace-errbuf) - (if whitespace-errmsg + (whitespace-spacetab (if whitespace-check-spacetab-whitespace + (whitespace-buffer-search + whitespace-spacetab-regexp) + nil)) + (whitespace-ateol (if whitespace-check-ateol-whitespace + (whitespace-buffer-search + whitespace-ateol-regexp) + nil)) + (whitespace-errmsg nil) + (whitespace-filename buffer-file-name) + (whitespace-this-modeline "")) + + ;; Now let's complain if we found any of the above. + (setq whitespace-error (or whitespace-leading whitespace-indent + whitespace-spacetab whitespace-ateol + whitespace-trailing)) + + (if whitespace-error (progn - (insert whitespace-errmsg) - (if (not (or quiet whitespace-silent)) - (display-buffer whitespace-errbuf t)) - (if (not quiet) - (message "Whitespaces: [%s] in %s" - whitespace-this-modeline - whitespace-filename))) - (if (not quiet) - (message "%s clean" whitespace-filename))))))))) + (setq whitespace-errmsg + (concat whitespace-filename " contains:\n" + (if whitespace-leading + "Leading whitespace\n") + (if whitespace-indent + (concat "Indentation whitespace" + whitespace-indent "\n")) + (if whitespace-spacetab + (concat "Space followed by Tab" + whitespace-spacetab "\n")) + (if whitespace-ateol + (concat "End-of-line whitespace" + whitespace-ateol "\n")) + (if whitespace-trailing + "Trailing whitespace\n") + "\ntype `M-x whitespace-cleanup' to " + "cleanup the file.")) + (setq whitespace-this-modeline + (concat (if whitespace-ateol "e") + (if whitespace-indent "i") + (if whitespace-leading "l") + (if whitespace-spacetab "s") + (if whitespace-trailing "t"))))) + (whitespace-update-modeline whitespace-this-modeline) + (save-excursion + (get-buffer-create whitespace-errbuf) + (kill-buffer whitespace-errbuf) + (get-buffer-create whitespace-errbuf) + (set-buffer whitespace-errbuf) + (if whitespace-errmsg + (progn + (insert whitespace-errmsg) + (if (not (or quiet whitespace-silent)) + (display-buffer whitespace-errbuf t)) + (if (not quiet) + (message "Whitespaces: [%s%s] in %s" + whitespace-this-modeline + (let ((whitespace-unchecked + (whitespace-unchecked-whitespaces))) + (if whitespace-unchecked + (concat "!" whitespace-unchecked) + "")) + whitespace-filename))) + (if (not quiet) + (message "%s clean" whitespace-filename)))))))) + (if whitespace-error + t + nil))) ;;;###autoload (defun whitespace-region (s e) @@ -360,9 +368,7 @@ whitespace problems." (whitespace-cleanup) (progn (message "%s clean" buffer-file-name) - (setq whitespace-mode-line nil) - (whitespace-force-mode-line-update) - (whitespace-display-unchecked-whitespaces))) + (whitespace-update-modeline))) (setq tab-width whitespace-tabwith-saved)))) ;;;###autoload @@ -479,18 +485,35 @@ whitespace problems." (delete-region (match-beginning 0) (point)) (indent-to column))))) -(defun whitespace-display-unchecked-whitespaces (&optional whitespace-str) - "Update modeline with whitespaces whose testing has been turned off." +(defun whitespace-unchecked-whitespaces () + "Return the list of whitespaces whose testing has been suppressed." (let ((whitespace-this-modeline (concat (if (not whitespace-check-ateol-whitespace) "e") (if (not whitespace-check-indent-whitespace) "i") (if (not whitespace-check-leading-whitespace) "l") (if (not whitespace-check-spacetab-whitespace) "s") (if (not whitespace-check-trailing-whitespace) "t")))) - (setq whitespace-mode-line whitespace-str) (if (not (equal whitespace-this-modeline "")) - (setq whitespace-mode-line - (concat whitespace-str " Woff:" whitespace-this-modeline))) + whitespace-this-modeline + nil))) + +(defun whitespace-update-modeline (&optional whitespace-err) + "Update modeline with whitespace errors and whitespaces whose testing has +been turned off." + (if whitespace-display-in-modeline + (setq whitespace-mode-line nil) + ;; Whitespace errors + (if (and whitespace-err (not (equal whitespace-err ""))) + (setq whitespace-mode-line whitespace-err)) + ;; Whitespace suppressed errors + (let ((whitespace-unchecked (whitespace-unchecked-whitespaces))) + (if whitespace-unchecked + (setq whitespace-mode-line + (concat whitespace-mode-line "!" whitespace-unchecked)))) + ;; Add the whitespace modeline prefix + (setq whitespace-mode-line (if whitespace-mode-line + (concat " W:" whitespace-mode-line) + nil)) (whitespace-force-mode-line-update))) ;; Force mode line updation for different Emacs versions @@ -589,8 +612,8 @@ of whitespace problems that commonly exist in source code. Whitespace errors are reported in a buffer, and on the modeline. -Modeline will show a W:<x> to denote a particular type of whitespace, where -`x' can be one (or more) of: +Modeline will show a W:<x>!<y> to denote a particular type of whitespace, +where `x' and `y' can be one (or more) of: e - End-of-Line whitespace. i - Indentation whitespace. @@ -599,7 +622,7 @@ s - Space followed by Tab. t - Trailing whitespace. If any of the whitespace checks is turned off, the modeline will display a -Woff:<x>, where `x' can be one (or more) of the above. +!<y>. (since (3) is the most controversial one, here is the rationale: Most terminal drivers and printer drivers have TAB configured or even |