Use define-derived-mode (and derived-mode-p)
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 11 Sep 2013 14:54:27 +0000 (14:54 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Wed, 11 Sep 2013 14:54:27 +0000 (14:54 +0000)
lisp/ChangeLog
lisp/gnus-art.el
lisp/gnus-bookmark.el
lisp/gnus-cus.el
lisp/gnus-group.el
lisp/gnus-kill.el
lisp/gnus-srvr.el
lisp/score-mode.el

index dfb4d54..3c17104 100644 (file)
@@ -1,3 +1,27 @@
+2013-09-11  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * score-mode.el (gnus-score-mode-map): Move initialization
+       into declaration.
+       (gnus-score-mode): Use define-derived-mode.
+       * gnus-srvr.el (gnus-browse-mode): Use define-derived-mode.
+       * gnus-kill.el (gnus-kill-file-mode-map): Move initialization
+       into declaration.
+       (gnus-kill-file-mode): Use define-derived-mode.
+       (gnus-kill-file-edit-file, gnus-kill-file-enter-kill, gnus-kill):
+       Use derived-mode-p.
+       * gnus-group.el (gnus-group-mode): Use define-derived-mode.
+       (gnus-group-setup-buffer, gnus-group-name-at-point)
+       (gnus-group-make-web-group, gnus-group-enter-directory)
+       (gnus-group-suspend): Use derived-mode-p.
+       * gnus-cus.el (gnus-custom-mode): Use define-derived-mode.
+       * gnus-bookmark.el (gnus-bookmark-bmenu-mode): Use define-derived-mode.
+       * gnus-art.el (gnus-article-mode): Use define-derived-mode.
+       (gnus-article-setup-buffer, gnus-article-prepare)
+       (gnus-article-prepare-display, gnus-sticky-article)
+       (gnus-kill-sticky-article-buffer, gnus-kill-sticky-article-buffers)
+       (gnus-bind-safe-url-regexp, gnus-article-check-buffer)
+       (gnus-article-read-summary-keys): Use derived-mode-p.
+
 2013-08-28  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * mm-decode.el (mm-temp-files-delete): Fix file deletion logic.
index 2fa8fdf..bc164ca 100644 (file)
@@ -3684,7 +3684,7 @@ function and want to see what the date was before converting."
        (walk-windows
         (lambda (w)
           (set-buffer (window-buffer w))
-          (when (eq major-mode 'gnus-article-mode)
+          (when (derived-mode-p 'gnus-article-mode)
             (let ((old-line (count-lines (point-min) (point)))
                   (old-column (- (point) (line-beginning-position)))
                   (window-start (window-start w))
@@ -4456,7 +4456,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
 (defvar bookmark-make-record-function)
 (defvar shr-put-image-function)
 
-(defun gnus-article-mode ()
+(define-derived-mode gnus-article-mode fundamental-mode "Article"
   "Major mode for displaying an article.
 
 All normal editing commands are switched off.
@@ -4471,13 +4471,8 @@ commands:
 \\[gnus-article-mail]\t Send a reply to the address near point
 \\[gnus-article-describe-briefly]\t Describe the current mode briefly
 \\[gnus-info-find-node]\t Go to the Gnus info node"
-  (interactive)
-  (kill-all-local-variables)
   (gnus-simplify-mode-line)
-  (setq mode-name "Article")
-  (setq major-mode 'gnus-article-mode)
   (make-local-variable 'minor-mode-alist)
-  (use-local-map gnus-article-mode-map)
   (when (gnus-visual-p 'article-menu 'menu)
     (gnus-article-make-menu-bar)
     (when gnus-summary-tool-bar-map
@@ -4505,9 +4500,7 @@ commands:
   (buffer-disable-undo)
   (setq buffer-read-only t
        show-trailing-whitespace nil)
-  (set-syntax-table gnus-article-mode-syntax-table)
-  (mm-enable-multibyte)
-  (gnus-run-mode-hooks 'gnus-article-mode-hook))
+  (mm-enable-multibyte))
 
 (defun gnus-article-setup-buffer ()
   "Initialize the article buffer."
@@ -4555,7 +4548,7 @@ commands:
          (setq gnus-article-mime-handle-alist nil)
          (buffer-disable-undo)
          (setq buffer-read-only t)
-         (unless (eq major-mode 'gnus-article-mode)
+         (unless (derived-mode-p 'gnus-article-mode)
            (gnus-article-mode))
          (setq truncate-lines gnus-article-truncate-lines)
          (current-buffer))
@@ -4604,7 +4597,7 @@ If ARTICLE is an id, HEADER should be the article headers.
 If ALL-HEADERS is non-nil, no headers are hidden."
   (save-excursion
     ;; Make sure we start in a summary buffer.
-    (unless (eq major-mode 'gnus-summary-mode)
+    (unless (derived-mode-p 'gnus-summary-mode)
       (set-buffer gnus-summary-buffer))
     (setq gnus-summary-buffer (current-buffer))
     (let* ((gnus-article (if header (mail-header-number header) article))
@@ -4715,7 +4708,7 @@ If ALL-HEADERS is non-nil, no headers are hidden."
   (let ((gnus-article-buffer (current-buffer))
        buffer-read-only
        (inhibit-read-only t))
-    (unless (eq major-mode 'gnus-article-mode)
+    (unless (derived-mode-p 'gnus-article-mode)
       (gnus-article-mode))
     (setq buffer-read-only nil
          gnus-article-wash-types nil
@@ -4777,7 +4770,7 @@ If a prefix ARG is given, ask for a name for this sticky article buffer."
             "*"))
       (if (and (gnus-buffer-live-p new-art-buf-name)
               (with-current-buffer new-art-buf-name
-                (eq major-mode 'gnus-sticky-article-mode)))
+                (derived-mode-p 'gnus-sticky-article-mode)))
          (switch-to-buffer new-art-buf-name)
        (setq new-art-buf-name (rename-buffer new-art-buf-name t)))
       (gnus-sticky-article-mode))
@@ -4793,7 +4786,7 @@ If none is given, assume the current buffer and kill it if it has
   (unless buffer
     (setq buffer (current-buffer)))
   (with-current-buffer buffer
-    (when (eq major-mode 'gnus-sticky-article-mode)
+    (when (derived-mode-p 'gnus-sticky-article-mode)
       (gnus-kill-buffer buffer))))
 
 (defun gnus-kill-sticky-article-buffers (arg)
@@ -4802,11 +4795,11 @@ If a prefix ARG is given, ask for confirmation."
   (interactive "P")
   (dolist (buf (gnus-buffers))
     (with-current-buffer buf
-      (when (eq major-mode 'gnus-sticky-article-mode)
-       (if (not arg)
-           (gnus-kill-buffer buf)
-         (when (yes-or-no-p (concat "Kill buffer " (buffer-name buf) "? "))
-           (gnus-kill-buffer buf)))))))
+      (when (derived-mode-p 'gnus-sticky-article-mode)
+       (if (not arg)
+           (gnus-kill-buffer buf)
+         (when (yes-or-no-p (concat "Kill buffer " (buffer-name buf) "? "))
+           (gnus-kill-buffer buf)))))))
 
 ;;;
 ;;; Gnus MIME viewing functions
@@ -4894,7 +4887,7 @@ General format specifiers can also be used.  See Info node
 (defmacro gnus-bind-safe-url-regexp (&rest body)
   "Bind `mm-w3m-safe-url-regexp' according to `gnus-safe-html-newsgroups'."
   `(let ((mm-w3m-safe-url-regexp
-         (let ((group (if (and (eq major-mode 'gnus-article-mode)
+         (let ((group (if (and (derived-mode-p 'gnus-article-mode)
                                (gnus-buffer-live-p
                                 gnus-article-current-summary))
                           (with-current-buffer gnus-article-current-summary
@@ -6478,7 +6471,7 @@ not have a face in `gnus-article-boring-faces'."
 
 (defun gnus-article-check-buffer ()
   "Beep if not in an article buffer."
-  (unless (equal major-mode 'gnus-article-mode)
+  (unless (derived-mode-p 'gnus-article-mode)
     (error "Command invoked outside of a Gnus article buffer")))
 
 (defun gnus-article-read-summary-keys (&optional arg key not-restore-window)
@@ -6593,7 +6586,7 @@ not have a face in `gnus-article-boring-faces'."
                           new-sum-point
                           (window-live-p win)
                           (with-current-buffer (window-buffer win)
-                            (eq major-mode 'gnus-summary-mode)))
+                            (derived-mode-p 'gnus-summary-mode)))
                  (set-window-point win new-sum-point)
                  (set-window-start win new-sum-start)
                  (set-window-hscroll win new-sum-hscroll))))
index 7a3d273..c31cb1a 100644 (file)
@@ -190,7 +190,7 @@ So the cdr of each bookmark is an alist too.")
   "Set a bookmark for this article."
   (interactive)
   (gnus-bookmark-maybe-load-default-file)
-  (if (or (not (eq major-mode 'gnus-summary-mode))
+  (if (or (not (derived-mode-p 'gnus-summary-mode))
          (not gnus-article-current))
       (error "Please select an article in the Gnus summary buffer")
     (let* ((group (car gnus-article-current))
@@ -473,7 +473,7 @@ That is, all information but the name."
 ;; Been to lazy to use gnus-bookmark-save...
 (defalias 'gnus-bookmark-bmenu-save 'gnus-bookmark-write-file)
 
-(defun gnus-bookmark-bmenu-mode ()
+(define-derived-mode gnus-bookmark-bmenu-mode fundamental-mode "Bookmark Menu"
   "Major mode for editing a list of Gnus bookmarks.
 Each line describes one of the bookmarks in Gnus.
 Letters do not insert themselves; instead, they are commands.
@@ -497,13 +497,8 @@ Gnus bookmarks names preceded by a \"*\" have annotations.
   in another buffer.
 \\[gnus-bookmark-bmenu-show-all-annotations] -- show the annotations of all bookmarks in another buffer.
 \\[gnus-bookmark-bmenu-edit-annotation] -- edit the annotation for the current bookmark."
-  (kill-all-local-variables)
-  (use-local-map gnus-bookmark-bmenu-mode-map)
   (setq truncate-lines t)
-  (setq buffer-read-only t)
-  (setq major-mode 'gnus-bookmark-bmenu-mode)
-  (setq mode-name "Bookmark Menu")
-  (gnus-run-mode-hooks 'gnus-bookmark-bmenu-mode-hook))
+  (setq buffer-read-only t))
 
 ;; avoid compilation warnings
 (defvar gnus-bookmark-bmenu-toggle-infos nil)
index c8fb5b5..247c081 100644 (file)
@@ -33,7 +33,7 @@
 
 ;;; Widgets:
 
-(defun gnus-custom-mode ()
+(define-derived-mode gnus-custom-mode fundamental-mode "Gnus Customize"
   "Major mode for editing Gnus customization buffers.
 
 The following commands are available:
@@ -45,9 +45,6 @@ The following commands are available:
 
 Entry to this mode calls the value of `gnus-custom-mode-hook'
 if that value is non-nil."
-  (kill-all-local-variables)
-  (setq major-mode 'gnus-custom-mode
-       mode-name "Gnus Customize")
   (use-local-map widget-keymap)
   ;; Emacs stuff:
   (when (and (facep 'custom-button-face)
@@ -63,8 +60,7 @@ if that value is non-nil."
     (set (make-local-variable 'widget-push-button-prefix) "")
     (set (make-local-variable 'widget-push-button-suffix) "")
     (set (make-local-variable 'widget-link-prefix) "")
-    (set (make-local-variable 'widget-link-suffix) ""))
-  (gnus-run-mode-hooks 'gnus-custom-mode-hook))
+    (set (make-local-variable 'widget-link-suffix) "")))
 
 ;;; Group Customization:
 
index 9533f58..c8945e5 100644 (file)
@@ -1105,7 +1105,7 @@ When FORCE, rebuild the tool bar."
          (set (make-local-variable 'tool-bar-map) map))))
   gnus-group-tool-bar-map)
 
-(defun gnus-group-mode ()
+(define-derived-mode gnus-group-mode fundamental-mode "Group"
   "Major mode for reading news.
 
 All normal editing commands are switched off.
@@ -1122,17 +1122,12 @@ For more in-depth information on this mode, read the manual (`\\[gnus-info-find-
 The following commands are available:
 
 \\{gnus-group-mode-map}"
-  (interactive)
-  (kill-all-local-variables)
   (when (gnus-visual-p 'group-menu 'menu)
     (gnus-group-make-menu-bar)
     (gnus-group-make-tool-bar))
   (gnus-simplify-mode-line)
-  (setq major-mode 'gnus-group-mode)
-  (setq mode-name "Group")
   (gnus-group-set-mode-line)
   (setq mode-line-process nil)
-  (use-local-map gnus-group-mode-map)
   (buffer-disable-undo)
   (setq truncate-lines t)
   (setq buffer-read-only t
@@ -1143,8 +1138,7 @@ The following commands are available:
   (when gnus-use-undo
     (gnus-undo-mode 1))
   (when gnus-slave
-    (gnus-slave-mode))
-  (gnus-run-mode-hooks 'gnus-group-mode-hook))
+    (gnus-slave-mode)))
 
 (defun gnus-update-group-mark-positions ()
   (save-excursion
@@ -1193,7 +1187,7 @@ The following commands are available:
 
 (defun gnus-group-setup-buffer ()
   (set-buffer (gnus-get-buffer-create gnus-group-buffer))
-  (unless (eq major-mode 'gnus-group-mode)
+  (unless (derived-mode-p 'gnus-group-mode)
     (gnus-group-mode)))
 
 (defun gnus-group-name-charset (method group)
@@ -2147,7 +2141,7 @@ be permanent."
 
 (defun gnus-group-name-at-point ()
   "Return a group name from around point if it exists, or nil."
-  (if (eq major-mode 'gnus-group-mode)
+  (if (derived-mode-p 'gnus-group-mode)
       (let ((group (gnus-group-group-name)))
        (when group
          (gnus-group-decoded-name group)))
@@ -3114,7 +3108,7 @@ If SOLID (the prefix), create a solid group."
       (gnus-group-read-ephemeral-group
        group method t
        (cons (current-buffer)
-            (if (eq major-mode 'gnus-summary-mode) 'summary 'group))))))
+            (if (derived-mode-p 'gnus-summary-mode) 'summary 'group))))))
 
 (defvar nnrss-group-alist)
 (eval-when-compile
@@ -3229,7 +3223,7 @@ mail messages or news articles in files that have numeric names."
     (unless (gnus-group-read-ephemeral-group
             name method t
             (cons (current-buffer)
-                  (if (eq major-mode 'gnus-summary-mode)
+                  (if (derived-mode-p 'gnus-summary-mode)
                       'summary 'group)))
       (error "Couldn't enter %s" dir))))
 
@@ -4319,7 +4313,7 @@ The hook `gnus-suspend-gnus-hook' is called before actually suspending."
       (unless (or (eq buf group-buf)
                  (eq buf gnus-dribble-buffer)
                  (with-current-buffer buf
-                   (eq major-mode 'message-mode)))
+                   (derived-mode-p 'message-mode)))
        (gnus-kill-buffer buf)))
     (setq gnus-backlog-articles nil)
     (gnus-kill-gnus-frames)
index b3f06de..011288e 100644 (file)
@@ -75,20 +75,20 @@ of time."
 ;;; Gnus Kill File Mode
 ;;;
 
-(defvar gnus-kill-file-mode-map nil)
-
-(unless gnus-kill-file-mode-map
-  (gnus-define-keymap (setq gnus-kill-file-mode-map
-                           (copy-keymap emacs-lisp-mode-map))
-    "\C-c\C-k\C-s" gnus-kill-file-kill-by-subject
-    "\C-c\C-k\C-a" gnus-kill-file-kill-by-author
-    "\C-c\C-k\C-t" gnus-kill-file-kill-by-thread
-    "\C-c\C-k\C-x" gnus-kill-file-kill-by-xref
-    "\C-c\C-a" gnus-kill-file-apply-buffer
-    "\C-c\C-e" gnus-kill-file-apply-last-sexp
-    "\C-c\C-c" gnus-kill-file-exit))
-
-(defun gnus-kill-file-mode ()
+(defvar gnus-kill-file-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map emacs-lisp-mode-map)
+    (gnus-define-keymap map
+      "\C-c\C-k\C-s" gnus-kill-file-kill-by-subject
+      "\C-c\C-k\C-a" gnus-kill-file-kill-by-author
+      "\C-c\C-k\C-t" gnus-kill-file-kill-by-thread
+      "\C-c\C-k\C-x" gnus-kill-file-kill-by-xref
+      "\C-c\C-a" gnus-kill-file-apply-buffer
+      "\C-c\C-e" gnus-kill-file-apply-last-sexp
+      "\C-c\C-c" gnus-kill-file-exit)
+    map))
+
+(define-derived-mode gnus-kill-file-mode emacs-lisp-mode "Kill"
   "Major mode for editing kill files.
 
 If you are using this mode - you probably shouldn't.  Kill files
@@ -151,15 +151,7 @@ which are marked as read in the previous Gnus sessions.  Marks other
 than `D' should be used for articles which should really be deleted.
 
 Entry to this mode calls emacs-lisp-mode-hook and
-gnus-kill-file-mode-hook with no arguments, if that value is non-nil."
-  (interactive)
-  (kill-all-local-variables)
-  (use-local-map gnus-kill-file-mode-map)
-  (set-syntax-table emacs-lisp-mode-syntax-table)
-  (setq major-mode 'gnus-kill-file-mode)
-  (setq mode-name "Kill")
-  (lisp-mode-variables nil)
-  (gnus-run-mode-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook))
+gnus-kill-file-mode-hook with no arguments, if that value is non-nil.")
 
 (defun gnus-kill-file-edit-file (newsgroup)
   "Begin editing a kill file for NEWSGROUP.
@@ -175,10 +167,10 @@ If NEWSGROUP is nil, the global kill file is selected."
     (let ((buffer (find-file-noselect file)))
       (cond ((get-buffer-window buffer)
             (pop-to-buffer buffer))
-           ((eq major-mode 'gnus-group-mode)
+           ((derived-mode-p 'gnus-group-mode)
             (gnus-configure-windows 'group) ;Take all windows.
             (pop-to-buffer buffer))
-           ((eq major-mode 'gnus-summary-mode)
+           ((derived-mode-p 'gnus-summary-mode)
             (gnus-configure-windows 'article)
             (pop-to-buffer gnus-article-buffer)
             (bury-buffer gnus-article-buffer)
@@ -201,7 +193,7 @@ If NEWSGROUP is nil, the global kill file is selected."
   ;; REGEXP: The string to kill.
   (save-excursion
     (let (string)
-      (unless (eq major-mode 'gnus-kill-file-mode)
+      (unless (derived-mode-p 'gnus-kill-file-mode)
        (gnus-kill-set-kill-buffer))
       (unless dont-move
        (goto-char (point-max)))
@@ -520,7 +512,7 @@ COMMAND must be a Lisp expression or a string representing a key sequence."
                  (setq kill-list (cdr kill-list))))
            (gnus-execute field kill-list command nil (not all))))))
     (switch-to-buffer old-buffer)
-    (when (and (eq major-mode 'gnus-kill-file-mode) regexp (not silent))
+    (when (and (derived-mode-p 'gnus-kill-file-mode) regexp (not silent))
       (gnus-pp-gnus-kill
        (nconc (list 'gnus-kill field
                    (if (consp regexp) (list 'quote regexp) regexp))
index 6977458..2f151e5 100644 (file)
@@ -244,6 +244,7 @@ For more in-depth information on this mode, read the manual
 The following commands are available:
 
 \\{gnus-server-mode-map}"
+  ;; FIXME: Use define-derived-mode.
   (interactive)
   (when (gnus-visual-p 'server-menu 'menu)
     (gnus-server-make-menu-bar))
@@ -869,7 +870,7 @@ claim them."
       (gnus-message 5 "Connecting to %s...done" (nth 1 method))
       t))))
 
-(defun gnus-browse-mode ()
+(define-derived-mode gnus-browse-mode fundamental-mode "Browse Server"
   "Major mode for browsing a foreign server.
 
 All normal editing commands are switched off.
@@ -884,20 +885,14 @@ buffer.
 2) `\\[gnus-browse-read-group]' to read a group ephemerally.
 
 3) `\\[gnus-browse-exit]' to return to the group buffer."
-  (interactive)
-  (kill-all-local-variables)
   (when (gnus-visual-p 'browse-menu 'menu)
     (gnus-browse-make-menu-bar))
   (gnus-simplify-mode-line)
-  (setq major-mode 'gnus-browse-mode)
-  (setq mode-name "Browse Server")
   (setq mode-line-process nil)
-  (use-local-map gnus-browse-mode-map)
   (buffer-disable-undo)
   (setq truncate-lines t)
   (gnus-set-default-directory)
-  (setq buffer-read-only t)
-  (gnus-run-mode-hooks 'gnus-browse-mode-hook))
+  (setq buffer-read-only t))
 
 (defun gnus-browse-read-group (&optional no-article number)
   "Enter the group at the current line.
@@ -1022,7 +1017,7 @@ doing the deletion."
 (defun gnus-browse-exit ()
   "Quit browsing and return to the group buffer."
   (interactive)
-  (when (eq major-mode 'gnus-browse-mode)
+  (when (derived-mode-p 'gnus-browse-mode)
     (gnus-kill-buffer (current-buffer)))
   ;; Insert the newly subscribed groups in the group buffer.
   (with-current-buffer gnus-group-buffer
index ec24f1f..58767cf 100644 (file)
 (defvar gnus-score-edit-exit-function nil
   "Function run on exit from the score buffer.")
 
-(defvar gnus-score-mode-map nil)
-(unless gnus-score-mode-map
-  (setq gnus-score-mode-map (make-sparse-keymap))
-  (set-keymap-parent gnus-score-mode-map emacs-lisp-mode-map)
-  (define-key gnus-score-mode-map "\C-c\C-c" 'gnus-score-edit-exit)
-  (define-key gnus-score-mode-map "\C-c\C-d" 'gnus-score-edit-insert-date)
-  (define-key gnus-score-mode-map "\C-c\C-p" 'gnus-score-pretty-print))
+(defvar gnus-score-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map emacs-lisp-mode-map)
+    (define-key map "\C-c\C-c" 'gnus-score-edit-exit)
+    (define-key map "\C-c\C-d" 'gnus-score-edit-insert-date)
+    (define-key map "\C-c\C-p" 'gnus-score-pretty-print)
+    map))
 
 (defvar score-mode-syntax-table
   (let ((table (copy-syntax-table lisp-mode-syntax-table)))
 (defvar score-mode-coding-system mm-universal-coding-system)
 
 ;;;###autoload
-(defun gnus-score-mode ()
+(define-derived-mode gnus-score-mode emacs-lisp-mode "Score"
   "Mode for editing Gnus score files.
 This mode is an extended emacs-lisp mode.
 
 \\{gnus-score-mode-map}"
-  (interactive)
-  (kill-all-local-variables)
-  (use-local-map gnus-score-mode-map)
   (gnus-score-make-menu-bar)
-  (set-syntax-table score-mode-syntax-table)
-  (setq major-mode 'gnus-score-mode)
-  (setq mode-name "Score")
-  (lisp-mode-variables nil)
-  (make-local-variable 'gnus-score-edit-exit-function)
-  (gnus-run-mode-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook))
+  (make-local-variable 'gnus-score-edit-exit-function))
 
 (defun gnus-score-make-menu-bar ()
   (unless (boundp 'gnus-score-menu)