[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#13837: 24.2; Make it possible to turn whitespace-mode only when ther

From: Stefan Monnier
Subject: bug#13837: 24.2; Make it possible to turn whitespace-mode only when there are no existing problems
Date: Thu, 28 Feb 2013 11:23:33 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)

> Unfortunately, my current solution is non-optional: it requires
> modifying whitespace-turn-on-if-enabled.  This could be fixed, for
> example by adding a preference.

Indeed.  I suggest to add a whitespace-enable-predicate hook.

Then you can do

  (defun whitespace-check-cleanliness ()
    (not (whitespace-test-region (point-min) (point-max))))
  (add-function :after-while whitespace-enable-predicate

> If maintainers are interested in adding this feature, I'd be happy to
> take guidance on how to modify my code into a patch (currently it just
> sits in my .emacs).

You can start with the patch below, and refactor the
whitespace-report-region so as to provide whitespace-test-region.
Your .emacs can then be reduced to the above 4 lines, and if you add the
whitespace-check-cleanliness function to whitespace.el that gets reduced
to just 2 lines.


=== modified file 'lisp/whitespace.el'
--- lisp/whitespace.el  2013-01-11 23:08:55 +0000
+++ lisp/whitespace.el  2013-02-28 16:19:01 +0000
@@ -1145,29 +1145,31 @@
        (unless whitespace-mode
-(defun whitespace-turn-on-if-enabled ()
-  (when (cond
+(defvar whitespace-enable-predicate
+  (lambda ()
+    (and (cond
         ((eq whitespace-global-modes t))
         ((listp whitespace-global-modes)
          (if (eq (car-safe whitespace-global-modes) 'not)
              (not (memq major-mode (cdr whitespace-global-modes)))
            (memq major-mode whitespace-global-modes)))
         (t nil))
-    (let (inhibit-quit)
-      ;; Don't turn on whitespace mode if...
-      (or
-       ;; ...we don't have a display (we're running a batch job)
-       noninteractive
-       ;; ...or if the buffer is invisible (name starts with a space)
-       (eq (aref (buffer-name) 0) ?\ )
-       ;; ...or if the buffer is temporary (name starts with *)
-       (and (eq (aref (buffer-name) 0) ?*)
+         ;; ...we have a display (we're running a batch job)
+         (not noninteractive)
+         ;; ...the buffer is not internal (name starts with a space)
+         (not (eq (aref (buffer-name) 0) ?\ ))
+         ;; ...the buffer is not special (name starts with *)
+         (or (not (eq (aref (buffer-name) 0) ?*))
            ;; except the scratch buffer.
-           (not (string= (buffer-name) "*scratch*")))
-       ;; Otherwise, turn on whitespace mode.
-       (whitespace-turn-on)))))
+             (string= (buffer-name) "*scratch*"))))
+  "Predicate to decide which buffers obey `global-whitespace-mode'.
+This function is called with no argument and should return non-nil
+if the current buffer should obey `global-whitespace-mode'.
+This variable is normally modified via `add-function'.")
+(defun whitespace-turn-on-if-enabled ()
+  (when (funcall whitespace-enable-predicate)
+    (whitespace-turn-on)))
 (define-minor-mode global-whitespace-newline-mode

reply via email to

[Prev in Thread] Current Thread [Next in Thread]