]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow define-minor-mode to take an :interactive keyword
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 14 Feb 2021 13:06:16 +0000 (14:06 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 14 Feb 2021 13:06:16 +0000 (14:06 +0100)
* lisp/emacs-lisp/easy-mmode.el (define-minor-mode): Allow
specifying the :interactive state and the modes.

etc/NEWS
lisp/emacs-lisp/easy-mmode.el

index 9c3396d33afebb666dd273ba4949f9e824c1ff37..22c320bfa31a941e8f55b2ae9469e105d0335ec8 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2294,7 +2294,13 @@ This permanently buffer-local variable holds a list of currently
 enabled minor modes in the current buffer (as a list of symbols).
 
 +++
-** 'defined-derived-mode' now takes an :interactive argument.
+** 'define-minor-mode'  now takes an :interactive argument.
+This can be used for specifying which modes this minor mode is meant
+for, or to make the new minor mode non-interactive.  The default value
+is t.
+
++++
+** 'define-derived-mode' now takes an :interactive argument.
 This can be used to control whether the defined mode is a command
 or not, and is useful when defining commands that aren't meant to be
 used by users directly.
index bfffbe4bf2020b52e683a2a70d5875d27cc5c9d8..08ac8186949ad56266805ebdb4020867555d2154 100644 (file)
@@ -172,6 +172,10 @@ BODY contains code to execute each time the mode is enabled or disabled.
 :lighter SPEC  Same as the LIGHTER argument.
 :keymap MAP    Same as the KEYMAP argument.
 :require SYM   Same as in `defcustom'.
+:interactive VAL  Whether this mode should be a command or not.  The default
+                is to make it one; use nil to avoid that.  If VAL is a list,
+                it's interpreted as a list of major modes this minor mode
+                is useful in.
 :variable PLACE        The location to use instead of the variable MODE to store
                the state of the mode.  This can be simply a different
                named variable, or a generalized variable.
@@ -226,6 +230,7 @@ For example, you could write
         (hook (intern (concat mode-name "-hook")))
         (hook-on (intern (concat mode-name "-on-hook")))
         (hook-off (intern (concat mode-name "-off-hook")))
+         (interactive t)
         keyw keymap-sym tmp)
 
     ;; Check keys.
@@ -245,6 +250,7 @@ For example, you could write
        (:type (setq type (list :type (pop body))))
        (:require (setq require (pop body)))
        (:keymap (setq keymap (pop body)))
+       (:interactive (setq interactive (pop body)))
         (:variable (setq variable (pop body))
                    (if (not (and (setq tmp (cdr-safe variable))
                                  (or (symbolp tmp)
@@ -303,11 +309,17 @@ or call the function `%s'."))))
        ;; The actual function.
        (defun ,modefun (&optional arg ,@extra-args)
          ,(easy-mmode--mode-docstring doc pretty-name keymap-sym)
-        ;; Use `toggle' rather than (if ,mode 0 1) so that using
-        ;; repeat-command still does the toggling correctly.
-        (interactive (list (if current-prefix-arg
-                                (prefix-numeric-value current-prefix-arg)
-                              'toggle)))
+         ,(when interactive
+           ;; Use `toggle' rather than (if ,mode 0 1) so that using
+           ;; repeat-command still does the toggling correctly.
+            (if (consp interactive)
+                `(command ,interactive
+                          (list (if current-prefix-arg
+                                    (prefix-numeric-value current-prefix-arg)
+                                  'toggle)))
+             '(interactive (list (if current-prefix-arg
+                                     (prefix-numeric-value current-prefix-arg)
+                                   'toggle)))))
         (let ((,last-message (current-message)))
            (,@setter
             (cond ((eq arg 'toggle)