Subject: bug#33263: closed (Re: bug#33263: 27.0.50; Tidying up Gnus modes)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 23 Nov 2018 17:46:02 +0000

Your bug report

#33263: 27.0.50; Tidying up Gnus modes

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
33263: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=33263
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#33263: 27.0.50; Tidying up Gnus modes
From: Eric Abrahamsen <[email-masked]>
To: [email-masked]
Date: Fri, 23 Nov 2018 09:45:24 -0800
List-Id: <debbugs-submit.debbugs.gnu.org>

Okay, I've been running this for more than a week and it seems fine so
far. I'll push it, and watch for repercussions.

Subject: 27.0.50; Tidying up Gnus modes
From: Eric Abrahamsen <[email-masked]>
To: [email-masked]
Date: Sun, 04 Nov 2018 18:53:41 -0800
List-Id: <debbugs-submit.debbugs.gnu.org>

The attached patch does a couple of things to clean up Gnus's various
major modes:

- Creates a do-nothing `gnus-mode', derived from `special-mode', to
  serve as parent mode for all the other major modes. This isn't so
  important, but sometimes it would be nice to do (derived-mode-p
  'gnus-mode).
- Derives everything from `gnus-mode', and turns a couple of modes from
  functions that manually set up modes into proper calls to
  `define-derived-mode'.
- Removes code like "(setq buffer-read-only t)", as that's automatically
  done by `special-mode'.
- Where appropriate, deletes custom definitions for gnus-*-mode-hook, as
  these hooks are already automatically created by the define-mode
  calls. (Maybe this removal isn't worth doing?)

This patch probably needs more testing, but I'm floating it first for
any comments.

Eric

In GNU Emacs 27.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.1)
 of 2018-10-31 built on slip
>From 395babb983e466d21928433c18faddedf3d88e8f Mon Sep 17 00:00:00 2001
From: Eric Abrahamsen <[email-masked]>
Date: Mon, 25 Jun 2018 17:40:19 -0700
Subject: [PATCH] Provide new gnus-mode, derive all gnus major modes from this

* lisp/gnus/gnus.el (gnus-mode): New do-nothing major mode, derived
  from special mode.
* lisp/gnus/gnus-sum.el (gnus-summary-mode): Change from a function to
  a major mode, derive from gnus-mode.
  (gnus-summary-setup-buffer): Change call a bit -- can no longer pass
  an argument to the mode function.
* lisp/gnus/gnus-srvr.el (gnus-browse-mode): Derive from gnus-mode.
  (gnus-server-setup-buffer): Remove unnecessary function.
  (gnus-enter-server-buffer): Call gnus-server-mode here, and call it
  whether the server buffer already existed or not.
  (gnus-server-mode): Change from a function to a major mode.
  (gnus-server-mode-hook): Delete custom option, this is automatically
  created.
* lisp/gnus/gnus-salt.el (gnus-tree-mode): Derive from gnus-mode.
  (gnus-tree-mode-hook): Delete custom option, this is automatically
  created.
* lisp/gnus/gnus-kill.el (gnus-kill-file-mode-hook): Delete custom
  option.
* lisp/gnus/gnus-group.el (gnus-group-mode):
* lisp/gnus/gnus-art.el (gnus-article-mode):
* lisp/gnus/gnus-agent.el (gnus-category-mode): Derive from gnus-mode.
  (gnus-category-mode-hook): Delete custom option.
---
 lisp/gnus/gnus-agent.el | 10 ++-------
 lisp/gnus/gnus-art.el   |  8 ++-----
 lisp/gnus/gnus-group.el |  8 ++-----
 lisp/gnus/gnus-kill.el  |  5 -----
 lisp/gnus/gnus-salt.el  |  9 +-------
 lisp/gnus/gnus-srvr.el  | 46 +++++++++--------------------------------
 lisp/gnus/gnus-sum.el   | 20 ++++--------------
 lisp/gnus/gnus.el       |  6 ++++++
 8 files changed, 27 insertions(+), 85 deletions(-)

diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el
index 18e6174fa0..93a675584f 100644
--- a/lisp/gnus/gnus-agent.el
+++ b/lisp/gnus/gnus-agent.el
@@ -2575,9 +2575,6 @@ gnus-agent-fetch-group-1
 ;;; Agent Category Mode
 ;;;
 
-(defvar gnus-category-mode-hook nil
-  "Hook run in `gnus-category-mode' buffers.")
-
 (defvar gnus-category-line-format "     %(%20c%): %g\n"
   "Format of category lines.
 
@@ -2613,7 +2610,6 @@ gnus-category-line-format-spec
 (defvar gnus-category-mode-line-format-spec nil)
 
 (defvar gnus-category-mode-map nil)
-(put 'gnus-category-mode 'mode-class 'special)
 
 (unless gnus-category-mode-map
   (setq gnus-category-mode-map (make-sparse-keymap))
@@ -2655,9 +2651,8 @@ gnus-category-make-menu-bar
 
     (gnus-run-hooks 'gnus-category-menu-hook)))
 
-(define-derived-mode gnus-category-mode fundamental-mode "Category"
+(define-derived-mode gnus-category-mode gnus-mode "Category"
   "Major mode for listing and editing agent categories.
-
 All normal editing commands are switched off.
 \\<gnus-category-mode-map>
 For more in-depth information on this mode, read the manual
@@ -2672,8 +2667,7 @@ gnus-category-mode
   (gnus-set-default-directory)
   (setq mode-line-process nil)
   (buffer-disable-undo)
-  (setq truncate-lines t)
-  (setq buffer-read-only t))
+  (setq truncate-lines t))
 
 (defalias 'gnus-category-position-point 'gnus-goto-colon)
 
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index f28e6db3c7..c78bb3325f 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -4388,8 +4388,6 @@ article-verify-cancel-lock
 ;;; Gnus article mode
 ;;;
 
-(put 'gnus-article-mode 'mode-class 'special)
-
 (set-keymap-parent gnus-article-mode-map widget-keymap)
 
 (gnus-define-keys gnus-article-mode-map
@@ -4467,9 +4465,8 @@ gnus-article-make-menu-bar
 (defvar bookmark-make-record-function)
 (defvar shr-put-image-function)
 
-(define-derived-mode gnus-article-mode fundamental-mode "Article"
+(define-derived-mode gnus-article-mode gnus-mode "Article"
   "Major mode for displaying an article.
-
 All normal editing commands are switched off.
 
 The following commands are available in addition to all summary mode
@@ -4510,8 +4507,7 @@ gnus-article-mode
     (setq cursor-in-non-selected-windows nil))
   (gnus-set-default-directory)
   (buffer-disable-undo)
-  (setq buffer-read-only t
-	show-trailing-whitespace nil)
+  (setq show-trailing-whitespace nil)
   (mm-enable-multibyte))
 
 (defun gnus-article-setup-buffer ()
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 6af27afbfa..d526894b3a 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -567,8 +567,6 @@ gnus-group-list-option
 ;;; Gnus group mode
 ;;;
 
-(put 'gnus-group-mode 'mode-class 'special)
-
 (gnus-define-keys gnus-group-mode-map
   " " gnus-group-read-group
   "=" gnus-group-select-group
@@ -1106,9 +1104,8 @@ gnus-group-make-tool-bar
 	  (set (make-local-variable 'tool-bar-map) map))))
   gnus-group-tool-bar-map)
 
-(define-derived-mode gnus-group-mode fundamental-mode "Group"
+(define-derived-mode gnus-group-mode gnus-mode "Group"
   "Major mode for reading news.
-
 All normal editing commands are switched off.
 \\<gnus-group-mode-map>
 The group buffer lists (some of) the groups available.  For instance,
@@ -1131,8 +1128,7 @@ gnus-group-mode
   (setq mode-line-process nil)
   (buffer-disable-undo)
   (setq truncate-lines t)
-  (setq buffer-read-only t
-	show-trailing-whitespace nil)
+  (setq show-trailing-whitespace nil)
   (gnus-set-default-directory)
   (gnus-update-format-specifications nil 'group 'group-mode)
   (gnus-update-group-mark-positions)
diff --git a/lisp/gnus/gnus-kill.el b/lisp/gnus/gnus-kill.el
index 60732c11d5..e65ff51ce7 100644
--- a/lisp/gnus/gnus-kill.el
+++ b/lisp/gnus/gnus-kill.el
@@ -29,11 +29,6 @@
 (require 'gnus-art)
 (require 'gnus-range)
 
-(defcustom gnus-kill-file-mode-hook nil
-  "Hook for Gnus kill file mode."
-  :group 'gnus-score-kill
-  :type 'hook)
-
 (defcustom gnus-kill-expiry-days 7
   "Number of days before expiring unused kill file entries."
   :group 'gnus-score-kill
diff --git a/lisp/gnus/gnus-salt.el b/lisp/gnus/gnus-salt.el
index aff841760a..0504465de3 100644
--- a/lisp/gnus/gnus-salt.el
+++ b/lisp/gnus/gnus-salt.el
@@ -396,11 +396,6 @@ gnus-generate-tree-function
 		(function :tag "Other" nil))
   :group 'gnus-summary-tree)
 
-(defcustom gnus-tree-mode-hook nil
-  "Hook run in tree mode buffers."
-  :type 'hook
-  :group 'gnus-summary-tree)
-
 ;;; Internal variables.
 
 (defvar gnus-tmp-name)
@@ -445,8 +440,6 @@ gnus-tree-mode-map
      'undefined 'gnus-tree-read-summary-keys map)
     map))
 
-(put 'gnus-tree-mode 'mode-class 'special)
-
 (defun gnus-tree-make-menu-bar ()
   (unless (boundp 'gnus-tree-menu)
     (easy-menu-define
@@ -454,7 +447,7 @@ gnus-tree-make-menu-bar
       '("Tree"
 	["Select article" gnus-tree-select-article t]))))
 
-(define-derived-mode gnus-tree-mode fundamental-mode "Tree"
+(define-derived-mode gnus-tree-mode gnus-mode "Tree"
   "Major mode for displaying thread trees."
   (gnus-set-format 'tree-mode)
   (gnus-set-format 'tree t)
diff --git a/lisp/gnus/gnus-srvr.el b/lisp/gnus/gnus-srvr.el
index dfca5e9d2c..03718fd104 100644
--- a/lisp/gnus/gnus-srvr.el
+++ b/lisp/gnus/gnus-srvr.el
@@ -36,11 +36,6 @@
 
 (autoload 'gnus-group-make-nnir-group "nnir")
 
-(defcustom gnus-server-mode-hook nil
-  "Hook run in `gnus-server-mode' buffers."
-  :group 'gnus-server
-  :type 'hook)
-
 (defcustom gnus-server-exit-hook nil
   "Hook run when exiting the server buffer."
   :group 'gnus-server
@@ -108,7 +103,7 @@ gnus-server-line-format-spec
 (defvar gnus-server-mode-line-format-spec nil)
 (defvar gnus-server-killed-servers nil)
 
-(defvar gnus-server-mode-map)
+(defvar gnus-server-mode-map nil)
 
 (defcustom gnus-server-menu-hook nil
   "Hook run after the creation of the server mode menu."
@@ -150,11 +145,8 @@ gnus-server-make-menu-bar
 
     (gnus-run-hooks 'gnus-server-menu-hook)))
 
-(defvar gnus-server-mode-map nil)
-(put 'gnus-server-mode 'mode-class 'special)
-
 (unless gnus-server-mode-map
-  (setq gnus-server-mode-map (make-sparse-keymap))
+  (setq gnus-server-mode-map (make-keymap))
   (suppress-keymap gnus-server-mode-map)
 
   (gnus-define-keys gnus-server-mode-map
@@ -253,9 +245,8 @@ gnus-server-font-lock-keywords
     ("(\\(offline\\))" 1 'gnus-server-offline)
     ("(\\(denied\\))" 1 'gnus-server-denied)))
 
-(defun gnus-server-mode ()
+(define-derived-mode gnus-server-mode gnus-mode "Server"
   "Major mode for listing and editing servers.
-
 All normal editing commands are switched off.
 \\<gnus-server-mode-map>
 For more in-depth information on this mode, read the manual
@@ -264,23 +255,16 @@ gnus-server-mode
 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))
-  (kill-all-local-variables)
   (gnus-simplify-mode-line)
-  (setq major-mode 'gnus-server-mode)
-  (setq mode-name "Server")
   (gnus-set-default-directory)
   (setq mode-line-process nil)
-  (use-local-map gnus-server-mode-map)
   (buffer-disable-undo)
   (setq truncate-lines t)
-  (setq buffer-read-only t)
   (set (make-local-variable 'font-lock-defaults)
-       '(gnus-server-font-lock-keywords t))
-  (gnus-run-mode-hooks 'gnus-server-mode-hook))
+       '(gnus-server-font-lock-keywords t)))
+
 
 (defun gnus-server-insert-server-line (name method)
   (let* ((gnus-tmp-name name)
@@ -320,21 +304,15 @@ gnus-server-insert-server-line
 
 (defun gnus-enter-server-buffer ()
   "Set up the server buffer."
-  (gnus-server-setup-buffer)
   (gnus-configure-windows 'server)
   ;; Usually `gnus-configure-windows' will finish with the
   ;; `gnus-server-buffer' selected as the current buffer, but not always (I
   ;; bumped into it when starting from a dedicated *Group* frame, and
   ;; gnus-configure-windows opened *Server* into its own dedicated frame).
   (with-current-buffer (get-buffer gnus-server-buffer)
+    (gnus-server-mode)
     (gnus-server-prepare)))
 
-(defun gnus-server-setup-buffer ()
-  "Initialize the server buffer."
-  (unless (get-buffer gnus-server-buffer)
-    (with-current-buffer (gnus-get-buffer-create gnus-server-buffer)
-      (gnus-server-mode))))
-
 (defun gnus-server-prepare ()
   (gnus-set-format 'server-mode)
   (gnus-set-format 'server t)
@@ -717,12 +695,10 @@ gnus-browse-subscribe-newsgroup-method
 		function
 		(repeat function)))
 
-(defvar gnus-browse-mode-hook nil)
-(defvar gnus-browse-mode-map nil)
-(put 'gnus-browse-mode 'mode-class 'special)
+(defvar gnus-browse-mode-map (make-keymap))
 
 (unless gnus-browse-mode-map
-  (setq gnus-browse-mode-map (make-keymap))
+  (defvar gnus-browse-mode-map (make-keymap))
   (suppress-keymap gnus-browse-mode-map)
 
   (gnus-define-keys
@@ -897,9 +873,8 @@ gnus-browse-foreign-server
       (gnus-message 5 "Connecting to %s...done" (nth 1 method))
       t))))
 
-(define-derived-mode gnus-browse-mode fundamental-mode "Browse Server"
+(define-derived-mode gnus-browse-mode gnus-mode "Browse Server"
   "Major mode for browsing a foreign server.
-
 All normal editing commands are switched off.
 
 \\<gnus-browse-mode-map>
@@ -918,8 +893,7 @@ gnus-browse-mode
   (setq mode-line-process nil)
   (buffer-disable-undo)
   (setq truncate-lines t)
-  (gnus-set-default-directory)
-  (setq buffer-read-only t))
+  (gnus-set-default-directory))
 
 (defun gnus-browse-read-group (&optional no-article number)
   "Enter the group at the current line.
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index f9fae3792b..67abf6d640 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -1842,8 +1842,6 @@ gnus-summary-bubble-group
 ;;; Gnus summary mode
 ;;;
 
-(put 'gnus-summary-mode 'mode-class 'special)
-
 (defvar gnus-article-commands-menu)
 
 ;; Non-orthogonal keys
@@ -3052,10 +3050,8 @@ bookmark-make-record-function
 
 (defvar bidi-paragraph-direction)
 
-(defun gnus-summary-mode (&optional group)
+(define-derived-mode gnus-summary-mode gnus-mode "Summary"
   "Major mode for reading articles.
-
-All normal editing commands are switched off.
 \\<gnus-summary-mode-map>
 Each line in this buffer represents one article.  To read an
 article, you can, for instance, type `\\[gnus-summary-next-page]'.  To move forwards
@@ -3072,24 +3068,16 @@ gnus-summary-mode
 The following commands are available:
 
 \\{gnus-summary-mode-map}"
-  ;; FIXME: Use define-derived-mode.
-  (interactive)
-  (kill-all-local-variables)
   (let ((gnus-summary-local-variables gnus-newsgroup-variables))
     (gnus-summary-make-local-variables))
   (gnus-summary-make-local-variables)
-  (setq gnus-newsgroup-name group)
   (when (gnus-visual-p 'summary-menu 'menu)
     (gnus-summary-make-menu-bar)
     (gnus-summary-make-tool-bar))
   (gnus-make-thread-indent-array)
   (gnus-simplify-mode-line)
-  (setq major-mode 'gnus-summary-mode)
-  (setq mode-name "Summary")
-  (use-local-map gnus-summary-mode-map)
   (buffer-disable-undo)
-  (setq buffer-read-only t
-	show-trailing-whitespace nil
+  (setq show-trailing-whitespace nil
 	truncate-lines t
 	bidi-paragraph-direction 'left-to-right)
   (add-to-invisibility-spec '(gnus-sum . t))
@@ -3101,7 +3089,6 @@ gnus-summary-mode
   (make-local-variable 'gnus-summary-dummy-line-format-spec)
   (make-local-variable 'gnus-summary-mark-positions)
   (add-hook 'pre-command-hook 'gnus-set-global-variables nil t)
-  (gnus-run-mode-hooks 'gnus-summary-mode-hook)
   (turn-on-gnus-mailing-list-mode)
   (mm-enable-multibyte)
   (set (make-local-variable 'bookmark-make-record-function)
@@ -3493,7 +3480,8 @@ gnus-summary-setup-buffer
 	  (not gnus-newsgroup-prepared))
       (set-buffer (gnus-get-buffer-create buffer))
       (setq gnus-summary-buffer (current-buffer))
-      (gnus-summary-mode group)
+      (setq gnus-newsgroup-name group)
+      (gnus-summary-mode)
       (when (gnus-group-quit-config group)
 	(set (make-local-variable 'gnus-single-article-buffer) nil))
       (make-local-variable 'gnus-article-buffer)
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index 2786323f67..6c59b13574 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -637,6 +637,12 @@ gnus-summary-low-read
   "Face used for low interest read articles."
   :group 'gnus-summary)
 
+;;; Base gnus-mode
+
+(define-derived-mode gnus-mode special-mode nil
+  "Base mode from which all other gnus modes derive.
+This does nothing but derive from `special-mode', and should not
+be used directly.")
 
 ;;;
 ;;; Gnus buffers
-- 
2.19.1