Subject: bug#10760: 24.0.93; [patch] Convert artist-mode to use define-minor-mode

From: William Stevenson <[email-masked]>
Date: Thu, 09 Feb 2012 04:15:15 +0000

Stefan Monnier <[email-masked]> writes:

>> - (defvar artist-mode-map
>
> The keymap does not have to be defined within the call to
> define-minor-mode (actually I recommend you don't do that in general),
> so you can leave the (defvar artist-mode-map ...) untouched.

I did :keymap artist-mode-map.

>> ! (defun artist-mode-init ()
> [...]
>> ! (defun artist-mode-exit ()
>
> You can also keep these functions.  This will significantly reduce the
> size of your patch and will make it much easier to figure out what is
> really changed (and hence, whether or not the change is safe).

Done.

>> !   :init-value nil   :group 'artist :lighter " Artist"
>
> You should use artist-mode-name here.

Done.

>
>         Stefan "who actually prefers `diff -u' format"

Me too, serves me right for reading the manual :B

In summary:
Updated artist-mode to use define-minor-mode.
As a consequence, artist-mode-init-hook and artist-mode-exit-hook were
removed from artist-mode-init and artist-mode-exit, because d-m-m creates
artist-mode-hook, and runs it when the mode is turned on or off.
Documentation was updated to reflect this.

=== modified file 'lisp/textmodes/artist.el'
--- lisp/textmodes/artist.el	2012-01-19 07:21:25 +0000
+++ lisp/textmodes/artist.el	2012-02-09 03:00:37 +0000
@@ -1196,9 +1196,9 @@
 ;;; ---------------------------------
 
 ;;;###autoload
-(defun artist-mode (&optional state)
+(define-minor-mode artist-mode
   "Toggle Artist mode.
-With argument STATE, turn Artist mode on if STATE is positive.
+With argument ARG, turn Artist mode on if ARG is positive.
 Artist lets you draw lines, squares, rectangles and poly-lines,
 ellipses and circles with your mouse and/or keyboard.
 
@@ -1387,36 +1387,24 @@
 
 Hooks
 
- When entering artist-mode, the hook `artist-mode-init-hook' is called.
- When quitting artist-mode, the hook `artist-mode-exit-hook' is called.
+ Turning the mode on or off runs `artist-mode-hook'.

 Keymap summary
 
 \\{artist-mode-map}"
-  (interactive)
-  (if (setq artist-mode
-	    (if (null state) (not artist-mode)
-	      (> (prefix-numeric-value state) 0)))
-      (artist-mode-init)
-    (artist-mode-exit)))
-
-;; insert our minor mode string
-(or (assq 'artist-mode minor-mode-alist)
-    (setq minor-mode-alist
-	  (cons '(artist-mode artist-mode-name)
-		minor-mode-alist)))
-
-;; insert our minor mode keymap
-(or (assq 'artist-mode minor-mode-map-alist)
-    (setq minor-mode-map-alist
-	  (cons (cons 'artist-mode artist-mode-map)
-		minor-mode-map-alist)))
-
+  :init-value nil :group 'artist :lighter artist-mode-name
+  :keymap artist-mode-map
+  (cond ((null artist-mode)
+	 ;; Turn mode off
+	 (artist-mode-exit))
+	(t
+	 ;; Turn mode on
+	 (artist-mode-init))))
 
 ;; Init and exit
 (defun artist-mode-init ()
-  "Init Artist mode.  This will call the hook `artist-mode-init-hook'."
+  "Init Artist mode.  This will call the hook `artist-mode-hook'."
   ;; Set up a conversion table for mapping tabs and new-lines to spaces.
   ;; the last case, 0, is for the last position in buffer/region, where
   ;; the `following-char' function returns 0.
@@ -1458,15 +1446,13 @@
       (progn
 	(picture-mode)
 	(message "")))
-  (run-hooks 'artist-mode-init-hook)
   (artist-mode-line-show-curr-operation artist-key-is-drawing))
 
 (defun artist-mode-exit ()
-  "Exit Artist mode.  This will call the hook `artist-mode-exit-hook'."
+  "Exit Artist mode.  This will call the hook `artist-mode-hook'."
   (if (and artist-picture-compatibility (eq major-mode 'picture-mode))
       (picture-mode-exit))
-  (kill-local-variable 'next-line-add-newlines)
-  (run-hooks 'artist-mode-exit-hook))
+  (kill-local-variable 'next-line-add-newlines))
 
 (defun artist-mode-off ()
   "Turn Artist mode off."