emacs-diffs
[Top][All Lists]
Advanced

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

scratch/command a48477f 2/2: Convert Gnus and eww to interactive ... mod


From: Lars Ingebrigtsen
Subject: scratch/command a48477f 2/2: Convert Gnus and eww to interactive ... modes
Date: Sat, 13 Feb 2021 09:12:27 -0500 (EST)

branch: scratch/command
commit a48477f33e49c2f7689c2b7dcf16b0e1b96752ee
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Convert Gnus and eww to interactive ... modes
---
 lisp/gnus/deuglify.el       |  10 +-
 lisp/gnus/gnus-art.el       | 287 ++++++++++-----------
 lisp/gnus/gnus-bookmark.el  |  24 +-
 lisp/gnus/gnus-cache.el     |   8 +-
 lisp/gnus/gnus-cite.el      |  13 +-
 lisp/gnus/gnus-cus.el       |   9 +-
 lisp/gnus/gnus-delay.el     |   8 +-
 lisp/gnus/gnus-diary.el     |   4 +-
 lisp/gnus/gnus-dired.el     |  22 +-
 lisp/gnus/gnus-draft.el     |   6 +-
 lisp/gnus/gnus-eform.el     |   4 +-
 lisp/gnus/gnus-gravatar.el  |   4 +-
 lisp/gnus/gnus-group.el     | 316 +++++++++++------------
 lisp/gnus/gnus-icalendar.el |  14 +-
 lisp/gnus/gnus-int.el       |   2 +-
 lisp/gnus/gnus-mh.el        |   2 +-
 lisp/gnus/gnus-msg.el       | 103 ++++----
 lisp/gnus/gnus-picon.el     |   8 +-
 lisp/gnus/gnus-registry.el  |  14 +-
 lisp/gnus/gnus-salt.el      |   8 +-
 lisp/gnus/gnus-score.el     |  78 +++---
 lisp/gnus/gnus-sieve.el     |   2 +-
 lisp/gnus/gnus-srvr.el      |  74 +++---
 lisp/gnus/gnus-start.el     |   4 +-
 lisp/gnus/gnus-sum.el       | 596 +++++++++++++++++++++++---------------------
 lisp/gnus/gnus-topic.el     | 123 ++++-----
 lisp/gnus/gnus-uu.el        | 126 +++++-----
 lisp/gnus/gnus-vm.el        |   4 +-
 lisp/net/eww.el             |  74 +++---
 29 files changed, 1007 insertions(+), 940 deletions(-)

diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el
index 130a9fe..e6c4630 100644
--- a/lisp/gnus/deuglify.el
+++ b/lisp/gnus/deuglify.el
@@ -310,7 +310,7 @@ You can control what lines will be unwrapped by frobbing
 `gnus-outlook-deuglify-unwrap-min' and `gnus-outlook-deuglify-unwrap-max',
 indicating the minimum and maximum length of an unwrapped citation line.  If
 NODISPLAY is non-nil, don't redisplay the article buffer."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (let ((case-fold-search nil)
        (inhibit-read-only t)
        (cite-marks gnus-outlook-deuglify-cite-marks)
@@ -430,7 +430,7 @@ NODISPLAY is non-nil, don't redisplay the article buffer."
 (defun gnus-article-outlook-repair-attribution (&optional nodisplay)
   "Repair a broken attribution line.
 If NODISPLAY is non-nil, don't redisplay the article buffer."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (let ((attrib-start
         (or
          (gnus-outlook-repair-attribution-other)
@@ -442,7 +442,7 @@ If NODISPLAY is non-nil, don't redisplay the article 
buffer."
 (defun gnus-article-outlook-rearrange-citation (&optional nodisplay)
   "Repair broken citations.
 If NODISPLAY is non-nil, don't redisplay the article buffer."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (let ((attrib-start (gnus-article-outlook-repair-attribution 'nodisplay)))
     ;; rearrange citations if an attribution line has been recognized
     (if attrib-start
@@ -455,7 +455,7 @@ If NODISPLAY is non-nil, don't redisplay the article 
buffer."
 Treat \"smartquotes\", unwrap lines, repair attribution and
 rearrange citation.  If NODISPLAY is non-nil, don't redisplay the
 article buffer."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   ;; apply treatment of dumb quotes
   (gnus-article-treat-smartquotes)
   ;; repair wrapped cited lines
@@ -467,7 +467,7 @@ article buffer."
 ;;;###autoload
 (defun gnus-article-outlook-deuglify-article ()
   "Deuglify broken Outlook (Express) articles and redisplay."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-outlook-deuglify-article nil))
 
 (provide 'deuglify)
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index b4d854d..435ccab 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -1823,7 +1823,7 @@ Initialized from `text-mode-syntax-table'.")
 
 (defun article-hide-headers (&optional _arg _delete)
   "Hide unwanted headers and possibly sort them as well."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   ;; This function might be inhibited.
   (unless gnus-inhibit-hiding
     (let ((inhibit-read-only t)
@@ -1891,7 +1891,7 @@ Initialized from `text-mode-syntax-table'.")
   "Toggle hiding of headers that aren't very interesting.
 If given a negative prefix, always show; if given a positive prefix,
 always hide."
-  (command gnus-article-mode (gnus-article-hidden-arg))
+  (interactive (gnus-article-hidden-arg) gnus-article-mode)
   (when (and (not (gnus-article-check-hidden-text 'boring-headers arg))
             (not gnus-show-all-headers))
     (save-excursion
@@ -2050,7 +2050,7 @@ always hide."
 
 (defun article-normalize-headers ()
   "Make all header lines 40 characters long."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((inhibit-read-only t)
        column)
     (save-excursion
@@ -2086,7 +2086,7 @@ iso-8859-1 character map in an attempt to provide more 
quoting
 characters.  If you see something like \\222 or \\264 where
 you're expecting some kind of apostrophe or quotation mark, then
 try this wash."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (article-translate-strings gnus-article-smartquotes-map))
 (define-obsolete-function-alias 'article-treat-dumbquotes
   #'article-treat-smartquotes "27.1")
@@ -2095,7 +2095,7 @@ try this wash."
 
 (defun article-treat-non-ascii ()
   "Translate many Unicode characters into their ASCII equivalents."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (require 'org-entities)
   (let ((table (make-char-table nil)))
     (dolist (elem org-entities)
@@ -2138,7 +2138,7 @@ MAP is an alist where the elements are on the form 
(\"from\" \"to\")."
 
 (defun article-treat-overstrike ()
   "Translate overstrikes into bold text."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (when (article-goto-body)
       (let ((inhibit-read-only t))
@@ -2166,7 +2166,7 @@ MAP is an alist where the elements are on the form 
(\"from\" \"to\")."
 
 (defun article-treat-ansi-sequences ()
   "Translate ANSI SGR control sequences into overlays or extents."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (when (article-goto-body)
       (require 'ansi-color)
@@ -2178,7 +2178,7 @@ MAP is an alist where the elements are on the form 
(\"from\" \"to\")."
   "Unfold folded message headers.
 Only the headers that fit into the current window width will be
 unfolded."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-headers
     (let (length)
       (while (not (eobp))
@@ -2204,7 +2204,7 @@ unfolded."
 
 (defun gnus-article-treat-fold-headers ()
   "Fold message headers."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-headers
     (while (not (eobp))
       (save-restriction
@@ -2214,7 +2214,7 @@ unfolded."
 
 (defun gnus-treat-smiley ()
   "Toggle display of textual emoticons (\"smileys\") as small graphical icons."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (if (memq 'smiley gnus-article-wash-types)
        (gnus-delete-images 'smiley)
@@ -2227,7 +2227,7 @@ unfolded."
 
 (defun gnus-article-remove-images ()
   "Remove all images from the article buffer."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (save-restriction
       (widen)
@@ -2239,7 +2239,7 @@ unfolded."
 (defun gnus-article-show-images ()
   "Show any images that are in the HTML-rendered article buffer.
 This only works if the article in question is HTML."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (save-restriction
       (widen)
@@ -2255,7 +2255,7 @@ This only works if the article in question is HTML."
 
 (defun gnus-article-treat-fold-newsgroups ()
   "Fold the Newsgroups and Followup-To message headers."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-headers
     (while (gnus-article-goto-header "newsgroups\\|followup-to")
       (save-restriction
@@ -2279,7 +2279,7 @@ predicate.  See Info node `(gnus)Customizing Articles'."
 If ARG is non-nil and not a number, toggle
 `gnus-article-truncate-lines' too.  If ARG is a number, truncate
 long lines if and only if arg is positive."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (cond
    ((and (numberp arg) (> arg 0))
     (setq gnus-article-truncate-lines t))
@@ -2298,7 +2298,7 @@ long lines if and only if arg is positive."
 
 (defun gnus-article-treat-body-boundary ()
   "Place a boundary line at the end of the headers."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (when (and gnus-body-boundary-delimiter
             (> (length gnus-body-boundary-delimiter) 0))
     (gnus-with-article-headers
@@ -2317,7 +2317,7 @@ long lines if and only if arg is positive."
   "Fill lines that are wider than the window width or `fill-column'.
 If WIDTH (interactively, the numeric prefix), use that as the
 fill width."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (save-excursion
     (let* ((inhibit-read-only t)
           (window-width (window-width (get-buffer-window (current-buffer))))
@@ -2341,7 +2341,7 @@ fill width."
 
 (defun article-capitalize-sentences ()
   "Capitalize the first word in each sentence."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-read-only t)
          (paragraph-start "^[\n\^L]"))
@@ -2352,7 +2352,7 @@ fill width."
 
 (defun article-remove-cr ()
   "Remove trailing CRs and then translate remaining CRs into LFs."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-read-only t))
       (goto-char (point-min))
@@ -2364,7 +2364,7 @@ fill width."
 
 (defun article-remove-trailing-blank-lines ()
   "Remove all trailing blank lines from the article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-read-only t))
       (goto-char (point-max))
@@ -2383,7 +2383,7 @@ fill width."
 
 (defun article-display-face (&optional force)
   "Display any Face headers in the header."
-  (command (gnus-article-mode gnus-summary-mode) (list 'force))
+  (interactive (list 'force) gnus-article-mode gnus-summary-mode)
   (let ((wash-face-p buffer-read-only))
     (gnus-with-article-headers
       ;; When displaying parts, this function can be called several times on
@@ -2431,7 +2431,7 @@ fill width."
 
 (defun article-display-x-face (&optional force)
   "Look for an X-Face header and display it if present."
-  (command (gnus-article-mode gnus-summary-mode) (list 'force))
+  (interactive (list 'force) gnus-article-mode gnus-summary-mode)
   (let ((wash-face-p buffer-read-only))        ;; When type `W f'
     (gnus-with-article-headers
       ;; Delete the old process, if any.
@@ -2493,7 +2493,7 @@ fill width."
 
 (defun article-decode-mime-words ()
   "Decode all MIME-encoded words in the article."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (let ((inhibit-point-motion-hooks t)
          (mail-parse-charset gnus-newsgroup-charset)
@@ -2505,7 +2505,7 @@ fill width."
 (defun article-decode-charset (&optional prompt)
   "Decode charset-encoded text in the article.
 If PROMPT (the prefix), prompt for a coding system to use."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (let ((inhibit-point-motion-hooks t) (case-fold-search t)
        (inhibit-read-only t)
        (mail-parse-charset gnus-newsgroup-charset)
@@ -2627,7 +2627,7 @@ Mail-Reply-To: and Mail-Followup-To:."
 If FORCE, decode the article whether it is marked as quoted-printable
 or not.
 If READ-CHARSET, ask for a coding system."
-  (command gnus-article-mode (list 'force current-prefix-arg))
+  (interactive (list 'force current-prefix-arg) gnus-article-mode)
   (save-excursion
     (let ((inhibit-read-only t) type charset)
       (if (gnus-buffer-live-p gnus-original-article-buffer)
@@ -2655,7 +2655,7 @@ If READ-CHARSET, ask for a coding system."
   "Translate a base64 article.
 If FORCE, decode the article whether it is marked as base64 not.
 If READ-CHARSET, ask for a coding system."
-  (command gnus-article-mode (list 'force current-prefix-arg))
+  (interactive (list 'force current-prefix-arg) gnus-article-mode)
   (save-excursion
     (let ((inhibit-read-only t) type charset)
       (if (gnus-buffer-live-p gnus-original-article-buffer)
@@ -2687,7 +2687,7 @@ If READ-CHARSET, ask for a coding system."
 
 (defun article-decode-HZ ()
   "Translate a HZ-encoded article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (require 'rfc1843)
   (save-excursion
     (let ((inhibit-read-only t))
@@ -2695,7 +2695,7 @@ If READ-CHARSET, ask for a coding system."
 
 (defun article-unsplit-urls ()
   "Remove the newlines that some other mailers insert into URLs."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-read-only t))
       (goto-char (point-min))
@@ -2707,7 +2707,7 @@ If READ-CHARSET, ask for a coding system."
 
 (defun article-wash-html ()
   "Format an HTML article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((handles nil)
        (inhibit-read-only t))
     (when (gnus-buffer-live-p gnus-original-article-buffer)
@@ -3041,7 +3041,7 @@ This command creates temporary files to pass HTML 
contents including
 images if any to the browser, and deletes them when exiting the group
 \(if you want)."
   ;; Cf. `mm-w3m-safe-url-regexp'
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (if arg
       (gnus-summary-show-article)
     (let ((gnus-visible-headers
@@ -3078,7 +3078,7 @@ images if any to the browser, and deletes them when 
exiting the group
 (defun article-hide-list-identifiers ()
   "Remove list identifiers from the Subject header.
 The `gnus-list-identifiers' variable specifies what to do."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((inhibit-point-motion-hooks t)
         (regexp (gnus-group-get-list-identifiers gnus-newsgroup-name))
         (inhibit-read-only t))
@@ -3100,7 +3100,7 @@ The `gnus-list-identifiers' variable specifies what to 
do."
   "Toggle hiding of any PEM headers and signatures in the current article.
 If given a negative prefix, always show; if given a positive prefix,
 always hide."
-  (command gnus-article-mode (gnus-article-hidden-arg))
+  (interactive (gnus-article-hidden-arg) gnus-article-mode)
   (unless (gnus-article-check-hidden-text 'pem arg)
     (save-excursion
       (let ((inhibit-read-only t) end)
@@ -3126,7 +3126,7 @@ always hide."
 (defun article-strip-banner ()
   "Strip the banners specified by the `banner' group parameter and by
 `gnus-article-address-banner-alist'."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (save-restriction
       (let ((inhibit-point-motion-hooks t))
@@ -3175,7 +3175,7 @@ always hide."
 
 (defun article-babel ()
   "Translate article using an online translation service."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (require 'babel)
   (gnus-with-article-buffer
     (when (article-goto-body)
@@ -3192,7 +3192,7 @@ always hide."
   "Hide the signature in the current article.
 If given a negative prefix, always show; if given a positive prefix,
 always hide."
-  (command gnus-article-mode (gnus-article-hidden-arg))
+  (interactive (gnus-article-hidden-arg) gnus-article-mode)
   (unless (gnus-article-check-hidden-text 'signature arg)
     (save-excursion
       (save-restriction
@@ -3204,7 +3204,7 @@ always hide."
 
 (defun article-strip-headers-in-body ()
   "Strip offensive headers from bodies."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (article-goto-body)
     (let ((case-fold-search t))
@@ -3213,7 +3213,7 @@ always hide."
 
 (defun article-strip-leading-blank-lines ()
   "Remove all blank lines from the beginning of the article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-point-motion-hooks t)
          (inhibit-read-only t))
@@ -3255,7 +3255,7 @@ Point is left at the beginning of the narrowed-to region."
 
 (defun article-strip-multiple-blank-lines ()
   "Replace consecutive blank lines with one empty line."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-point-motion-hooks t)
          (inhibit-read-only t))
@@ -3274,7 +3274,7 @@ Point is left at the beginning of the narrowed-to region."
 
 (defun article-strip-leading-space ()
   "Remove all white space from the beginning of the lines in the article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-point-motion-hooks t)
          (inhibit-read-only t))
@@ -3284,7 +3284,7 @@ Point is left at the beginning of the narrowed-to region."
 
 (defun article-strip-trailing-space ()
   "Remove all white space from the end of the lines in the article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-point-motion-hooks t)
          (inhibit-read-only t))
@@ -3294,14 +3294,14 @@ Point is left at the beginning of the narrowed-to 
region."
 
 (defun article-strip-blank-lines ()
   "Strip leading, trailing and multiple blank lines."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (article-strip-leading-blank-lines)
   (article-remove-trailing-blank-lines)
   (article-strip-multiple-blank-lines))
 
 (defun article-strip-all-blank-lines ()
   "Strip all blank lines."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (let ((inhibit-point-motion-hooks t)
          (inhibit-read-only t))
@@ -3433,7 +3433,7 @@ lines forward."
   "Convert DATE date to TYPE in the current article.
 The default type is `ut'.  See `gnus-article-date-headers' for
 possible values."
-  (command gnus-article-mode (list 'ut t))
+  (interactive (list 'ut t) gnus-article-mode)
   (let* ((case-fold-search t)
         (inhibit-read-only t)
         (inhibit-point-motion-hooks t)
@@ -3677,29 +3677,29 @@ possible values."
 
 (defun article-date-local (&optional highlight)
   "Convert the current article date to the local timezone."
-  (command gnus-article-mode (list t))
+  (interactive (list t) gnus-article-mode)
   (article-date-ut 'local highlight))
 
 (defun article-date-english (&optional highlight)
   "Convert the current article date to something that is proper English."
-  (command gnus-article-mode (list t))
+  (interactive (list t) gnus-article-mode)
   (article-date-ut 'english highlight))
 
 (defun article-date-original (&optional highlight)
   "Convert the current article date to what it was originally.
 This is only useful if you have used some other date conversion
 function and want to see what the date was before converting."
-  (command gnus-article-mode (list t))
+  (interactive (list t) gnus-article-mode)
   (article-date-ut 'original highlight))
 
 (defun article-date-lapsed (&optional highlight)
   "Convert the current article date to time lapsed since it was sent."
-  (command gnus-article-mode (list t))
+  (interactive (list t) gnus-article-mode)
   (article-date-ut 'lapsed highlight))
 
 (defun article-date-combined-lapsed (&optional highlight)
   "Convert the current article date to time lapsed since it was sent."
-  (command gnus-article-mode (list t))
+  (interactive (list t) gnus-article-mode)
   (article-date-ut 'combined-lapsed highlight))
 
 (defun article-update-date-lapsed ()
@@ -3748,7 +3748,7 @@ function and want to see what the date was before 
converting."
   "Start a timer to update the Date headers in the article buffers.
 The numerical prefix says how frequently (in seconds) the function
 is to run."
-  (command gnus-article-mode "p")
+  (interactive "p" gnus-article-mode)
   (unless n
     (setq n 1))
   (gnus-stop-date-timer)
@@ -3757,7 +3757,7 @@ is to run."
 
 (defun gnus-stop-date-timer ()
   "Stop the Date timer."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (when article-lapsed-timer
     (cancel-timer article-lapsed-timer)
     (setq article-lapsed-timer nil)))
@@ -3765,12 +3765,12 @@ is to run."
 (defun article-date-user (&optional highlight)
   "Convert the current article date to the user-defined format.
 This format is defined by the `gnus-article-time-format' variable."
-  (command gnus-article-mode (list t))
+  (interactive (list t) gnus-article-mode)
   (article-date-ut 'user-defined highlight))
 
 (defun article-date-iso8601 (&optional highlight)
   "Convert the current article date to ISO8601."
-  (command gnus-article-mode (list t))
+  (interactive (list t) gnus-article-mode)
   (article-date-ut 'iso8601 highlight))
 
 (defmacro gnus-article-save-original-date (&rest forms)
@@ -3803,7 +3803,7 @@ This format is defined by the `gnus-article-time-format' 
variable."
 
 (defun article-remove-leading-whitespace ()
   "Remove excessive whitespace from all headers."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (save-restriction
       (let ((inhibit-read-only t))
@@ -3814,7 +3814,7 @@ This format is defined by the `gnus-article-time-format' 
variable."
 
 (defun article-emphasize (&optional arg)
   "Emphasize text according to `gnus-emphasis-alist'."
-  (command gnus-article-mode (gnus-article-hidden-arg))
+  (interactive (gnus-article-hidden-arg) gnus-article-mode)
   (unless (gnus-article-check-hidden-text 'emphasis arg)
     (save-excursion
       (let ((alist (or
@@ -4247,7 +4247,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
 (defun article-verify-x-pgp-sig ()
   "Verify X-PGP-Sig."
   ;; <https://ftp.isc.org/pub/pgpcontrol/FORMAT>
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (if (gnus-buffer-live-p gnus-original-article-buffer)
       (let ((sig (with-current-buffer gnus-original-article-buffer
                   (gnus-fetch-field "X-PGP-Sig")))
@@ -4321,7 +4321,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
 
 (defun article-verify-cancel-lock ()
   "Verify Cancel-Lock header."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (if (gnus-buffer-live-p gnus-original-article-buffer)
       (canlock-verify gnus-original-article-buffer)))
 
@@ -4330,7 +4330,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
            `(defun ,(intern (format "gnus-%s" func))
                 (&optional interactive &rest args)
               ,(format "Run `%s' in the article buffer." func)
-              (command (gnus-article-mode gnus-summary-mode) (list t))
+              (interactive (list t) gnus-article-mode gnus-summary-mode)
               (with-current-buffer gnus-article-buffer
                 (if interactive
                     (call-interactively #',func)
@@ -4752,7 +4752,7 @@ If ALL-HEADERS is non-nil, no headers are hidden."
 (defun gnus-sticky-article (arg)
   "Make the current article sticky.
 If a prefix ARG is given, ask for a name for this sticky article buffer."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (gnus-summary-show-thread)
   (gnus-summary-select-article nil nil 'pseudo)
   (let (new-art-buf-name)
@@ -4796,7 +4796,7 @@ If a prefix ARG is given, ask for a name for this sticky 
article buffer."
   "Kill the given sticky article BUFFER.
 If none is given, assume the current buffer and kill it if it has
 `gnus-sticky-article-mode'."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (unless buffer
     (setq buffer (current-buffer)))
   (with-current-buffer buffer
@@ -4806,7 +4806,7 @@ If none is given, assume the current buffer and kill it 
if it has
 (defun gnus-kill-sticky-article-buffers (arg)
   "Kill all sticky article buffers.
 If a prefix ARG is given, ask for confirmation."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (dolist (buf (gnus-buffers))
     (with-current-buffer buf
       (and (derived-mode-p 'gnus-sticky-article-mode)
@@ -4948,7 +4948,7 @@ General format specifiers can also be used.  See Info node
 
 (defun gnus-mime-view-all-parts (&optional handles)
   "View all the MIME parts."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (with-current-buffer gnus-article-buffer
     (let ((handles (or handles gnus-article-mime-handles))
          (mail-parse-charset gnus-newsgroup-charset)
@@ -4965,7 +4965,7 @@ General format specifiers can also be used.  See Info node
 
 (defun gnus-article-jump-to-part (n)
   "Jump to MIME part N."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (let ((parts (with-current-buffer gnus-article-buffer
                 (length gnus-article-mime-handle-alist))))
     (when (zerop parts)
@@ -5061,11 +5061,11 @@ and `gnus-mime-delete-part', and not provided at 
run-time normally."
 (defun gnus-mime-replace-part (file)
   "Replace MIME part under point with an external body."
   ;; Useful if file has already been saved to disk
-  (command gnus-article-mode
-   (list
-    (read-file-name "Replace MIME part with file: "
-                    (or mm-default-directory default-directory)
-                    nil t)))
+  (interactive (list
+               (read-file-name "Replace MIME part with file: "
+                               (or mm-default-directory default-directory)
+                               nil t))
+              gnus-article-mode)
   (unless (file-regular-p (file-truename file))
     (error "Can't replace part with %s, which isn't a regular file"
           file))
@@ -5074,7 +5074,7 @@ and `gnus-mime-delete-part', and not provided at run-time 
normally."
 (defun gnus-mime-save-part-and-strip (&optional file event)
   "Save the MIME part under point then replace it with an external body.
 If FILE is given, use it for the external part."
-  (command gnus-article-mode (list nil last-nonmenu-event))
+  (interactive (list nil last-nonmenu-event) gnus-article-mode)
   (save-excursion
     (mouse-set-point event)
     (gnus-article-check-buffer)
@@ -5116,7 +5116,7 @@ The current article has a complicated MIME structure, 
giving up..."))
 (defun gnus-mime-delete-part (&optional event)
   "Delete the MIME part under point.
 Replace it with some information about the removed part."
-  (command gnus-article-mode (list last-nonmenu-event))
+  (interactive (list last-nonmenu-event) gnus-article-mode)
   (mouse-set-point event)
   (gnus-article-check-buffer)
   (when (gnus-group-read-only-p)
@@ -5165,7 +5165,7 @@ Deleting parts may malfunction or destroy the article; 
continue? "))
 
 (defun gnus-mime-save-part (&optional event)
   "Save the MIME part under point."
-  (command gnus-article-mode (list last-nonmenu-event))
+  (interactive (list last-nonmenu-event) gnus-article-mode)
   (mouse-set-point event)
   (gnus-article-check-buffer)
   (let ((data (get-text-property (point) 'gnus-data)))
@@ -5175,7 +5175,7 @@ Deleting parts may malfunction or destroy the article; 
continue? "))
 (defun gnus-mime-pipe-part (&optional cmd event)
   "Pipe the MIME part under point to a process.
 Use CMD as the process."
-  (command gnus-article-mode (list nil last-nonmenu-event))
+  (interactive (list nil last-nonmenu-event) gnus-article-mode)
   (mouse-set-point event)
   (gnus-article-check-buffer)
   (let ((data (get-text-property (point) 'gnus-data)))
@@ -5184,7 +5184,7 @@ Use CMD as the process."
 
 (defun gnus-mime-view-part (&optional event)
   "Interactively choose a viewing method for the MIME part under point."
-  (command gnus-article-mode (list last-nonmenu-event))
+  (interactive (list last-nonmenu-event) gnus-article-mode)
   (save-excursion
     (mouse-set-point event)
     (gnus-article-check-buffer)
@@ -5214,7 +5214,7 @@ Use CMD as the process."
   "Choose a MIME media type, and view the part as such.
 If non-nil, PRED is a predicate to use during completion to limit the
 available media-types."
-  (command gnus-article-mode (list nil nil last-nonmenu-event))
+  (interactive (list nil nil last-nonmenu-event) gnus-article-mode)
   (save-excursion
     (if event (mouse-set-point event))
     (unless mime-type
@@ -5253,7 +5253,8 @@ available media-types."
   "Put the MIME part under point into a new buffer.
 If `auto-compression-mode' is enabled, compressed files like .gz and .bz2
 are decompressed."
-  (command gnus-article-mode (list nil current-prefix-arg last-nonmenu-event))
+  (interactive (list nil current-prefix-arg last-nonmenu-event)
+              gnus-article-mode)
   (mouse-set-point event)
   (gnus-article-check-buffer)
   (unless handle
@@ -5308,8 +5309,9 @@ are decompressed."
 
 (defun gnus-mime-print-part (&optional handle filename event)
   "Print the MIME part under point."
-  (command gnus-article-mode
-   (list nil (ps-print-preprint current-prefix-arg) last-nonmenu-event))
+  (interactive
+   (list nil (ps-print-preprint current-prefix-arg) last-nonmenu-event)
+   gnus-article-mode)
   (save-excursion
     (mouse-set-point event)
     (gnus-article-check-buffer)
@@ -5337,7 +5339,8 @@ are decompressed."
 (defun gnus-mime-inline-part (&optional handle arg event)
   "Insert the MIME part under point into the current buffer.
 Compressed files like .gz and .bz2 are decompressed."
-  (command gnus-article-mode (list nil current-prefix-arg last-nonmenu-event))
+  (interactive (list nil current-prefix-arg last-nonmenu-event)
+              gnus-article-mode)
   (if event (mouse-set-point event))
   (gnus-article-check-buffer)
   (let* ((inhibit-read-only t)
@@ -5435,7 +5438,8 @@ CHARSET may either be a string or a symbol."
 (defun gnus-mime-view-part-as-charset (&optional handle arg event)
   "Insert the MIME part under point into the current buffer using the
 specified charset."
-  (command gnus-article-mode (list nil current-prefix-arg last-nonmenu-event))
+  (interactive (list nil current-prefix-arg last-nonmenu-event)
+              gnus-article-mode)
   (save-excursion
     (mouse-set-point event)
     (gnus-article-check-buffer)
@@ -5475,7 +5479,7 @@ specified charset."
 
 (defun gnus-mime-view-part-externally (&optional handle event)
   "View the MIME part under point with an external viewer."
-  (command gnus-article-mode (list nil last-nonmenu-event))
+  (interactive (list nil last-nonmenu-event) gnus-article-mode)
   (save-excursion
     (mouse-set-point event)
     (gnus-article-check-buffer)
@@ -5497,7 +5501,7 @@ specified charset."
 (defun gnus-mime-view-part-internally (&optional handle event)
   "View the MIME part under point with an internal viewer.
 If no internal viewer is available, use an external viewer."
-  (command gnus-article-mode (list nil last-nonmenu-event))
+  (interactive (list nil last-nonmenu-event) gnus-article-mode)
   (save-excursion
     (mouse-set-point event)
     (gnus-article-check-buffer)
@@ -5517,8 +5521,10 @@ If no internal viewer is available, use an external 
viewer."
 
 (defun gnus-mime-action-on-part (&optional action)
   "Do something with the MIME attachment at (point)."
-  (command gnus-article-mode
-   (list (gnus-completing-read "Action" (mapcar #'car gnus-mime-action-alist) 
t)))
+  (interactive
+   (list (gnus-completing-read
+         "Action" (mapcar #'car gnus-mime-action-alist) t))
+   gnus-article-mode)
   (gnus-article-check-buffer)
   (let ((action-pair (assoc action gnus-mime-action-alist)))
     (if action-pair
@@ -5611,62 +5617,62 @@ If INTERACTIVE, call FUNCTION interactively."
 
 (defun gnus-article-pipe-part (n)
   "Pipe MIME part N, which is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'mm-pipe-part))
 
 (defun gnus-article-save-part (n)
   "Save MIME part N, which is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'mm-save-part))
 
 (defun gnus-article-interactively-view-part (n)
   "View MIME part N interactively, which is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'mm-interactively-view-part))
 
 (defun gnus-article-copy-part (n)
   "Copy MIME part N, which is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-copy-part))
 
 (defun gnus-article-view-part-as-charset (n)
   "View MIME part N using a specified charset.
 N is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-view-part-as-charset))
 
 (defun gnus-article-view-part-externally (n)
   "View MIME part N externally, which is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-view-part-externally))
 
 (defun gnus-article-inline-part (n)
   "Inline MIME part N, which is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-inline-part))
 
 (defun gnus-article-save-part-and-strip (n)
   "Save MIME part N and replace it with an external body.
 N is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-save-part-and-strip t))
 
 (defun gnus-article-replace-part (n)
   "Replace MIME part N with an external body.
 N is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-replace-part t t))
 
 (defun gnus-article-delete-part (n)
   "Delete MIME part N and add some information about the removed part.
 N is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-delete-part t))
 
 (defun gnus-article-view-part-as-type (n)
   "Choose a MIME media type, and view part N as such.
 N is the numerical prefix."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-part-wrapper n 'gnus-mime-view-part-as-type t))
 
 (defun gnus-article-mime-match-handle-first (condition)
@@ -5693,7 +5699,7 @@ N is the numerical prefix."
   "View MIME part N, which is the numerical prefix.
 If the part is already shown, hide the part.  If N is nil, view
 all parts."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (or (numberp n) (setq n (gnus-article-mime-match-handle-first
                             gnus-article-mime-match-handle-function)))
@@ -6383,7 +6389,7 @@ Provided for backwards compatibility."
 This function toggles the display when called interactively.  Note that
 buttons to be added to the header are only the ones that aren't inlined
 in the body.  Use `gnus-header-face-alist' to highlight buttons."
-  (command (gnus-article-mode gnus-summary-mode) (list t))
+  (interactive (list t) gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (let ((case-fold-search t) buttons st)
       (save-excursion
@@ -6488,7 +6494,7 @@ the coding cookie."
 (defun gnus-narrow-to-page (&optional arg)
   "Narrow the article buffer to a page.
 If given a numerical ARG, move forward ARG pages."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (setq arg (if arg (prefix-numeric-value arg) 0))
   (with-current-buffer gnus-article-buffer
     (widen)
@@ -6541,7 +6547,7 @@ If given a numerical ARG, move forward ARG pages."
 
 (defun gnus-article-goto-next-page ()
   "Show the next page of the article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (when (gnus-article-next-page)
     (goto-char (point-min))
     (gnus-article-read-summary-keys nil ?n)))
@@ -6549,7 +6555,7 @@ If given a numerical ARG, move forward ARG pages."
 
 (defun gnus-article-goto-prev-page ()
   "Show the previous page of the article."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (if (save-restriction (widen) (bobp)) ;; Real beginning-of-buffer?
       (gnus-article-read-summary-keys nil ?p)
     (gnus-article-prev-page nil)))
@@ -6572,7 +6578,7 @@ If given a numerical ARG, move forward ARG pages."
   "Show the next page of the current article.
 If end of article, return non-nil.  Otherwise return nil.
 Argument LINES specifies lines to be scrolled up."
-  (command gnus-article-mode "p")
+  (interactive "p" gnus-article-mode)
   (move-to-window-line (- -1 scroll-margin))
   (if (and (not (and gnus-article-over-scroll
                     (> (count-lines (window-start) (point-max))
@@ -6628,7 +6634,7 @@ specifies."
 (defun gnus-article-prev-page (&optional lines)
   "Show previous page of current article.
 Argument LINES specifies lines to be scrolled down."
-  (command gnus-article-mode "p")
+  (interactive "p" gnus-article-mode)
   (move-to-window-line 0)
   (if (and gnus-page-broken
           (bobp)
@@ -6669,7 +6675,7 @@ not have a face in `gnus-article-boring-faces'."
 
 (defun gnus-article-refer-article ()
   "Read article specified by message-id around point."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (re-search-backward "[ \t]\\|^" (point-at-bol) t)
     (re-search-forward "<?news:<?\\|<" (point-at-eol) t)
@@ -6681,7 +6687,7 @@ not have a face in `gnus-article-boring-faces'."
 
 (defun gnus-article-show-summary ()
   "Reconfigure windows to show summary buffer."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (if (not (gnus-buffer-live-p gnus-summary-buffer))
       (error "There is no summary buffer for this article buffer")
     (gnus-article-set-globals)
@@ -6691,7 +6697,7 @@ not have a face in `gnus-article-boring-faces'."
 
 (defun gnus-article-describe-briefly ()
   "Describe article mode commands briefly."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (gnus-message 6 "%s" (substitute-command-keys 
"\\<gnus-article-mode-map>\\[gnus-article-goto-next-page]:Next page     
\\[gnus-article-goto-prev-page]:Prev page  \\[gnus-article-show-summary]:Show 
summary  \\[gnus-info-find-node]:Run Info  
\\[gnus-article-describe-briefly]:This help")))
 
 (defun gnus-article-check-buffer ()
@@ -6703,7 +6709,7 @@ not have a face in `gnus-article-boring-faces'."
 
 (defun gnus-article-read-summary-keys (&optional _arg key not-restore-window)
   "Read a summary buffer key sequence and execute it from the article buffer."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (gnus-article-check-buffer)
   (let ((nosaves
         '("q" "Q" "r" "m"  "a" "f" "WDD" "WDW"
@@ -6814,15 +6820,16 @@ not have a face in `gnus-article-boring-faces'."
            (ding))))))))
 
 (defun gnus-article-read-summary-send-keys ()
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((unread-command-events (list ?S)))
     (gnus-article-read-summary-keys)))
 
 (defun gnus-article-describe-key (key)
   "Display documentation of the function invoked by KEY.
 KEY is a string or a vector."
-  (command gnus-article-mode (list (let ((cursor-in-echo-area t))
-                      (read-key-sequence "Describe key: "))))
+  (interactive (list (let ((cursor-in-echo-area t))
+                      (read-key-sequence "Describe key: ")))
+              gnus-article-mode)
   (gnus-article-check-buffer)
   (if (memq (key-binding key t) '(gnus-article-read-summary-keys
                                  gnus-article-read-summary-send-keys))
@@ -6842,9 +6849,10 @@ KEY is a string or a vector."
 (defun gnus-article-describe-key-briefly (key &optional insert)
   "Display documentation of the function invoked by KEY.
 KEY is a string or a vector."
-  (command gnus-article-mode (list (let ((cursor-in-echo-area t))
+  (interactive (list (let ((cursor-in-echo-area t))
                       (read-key-sequence "Describe key: "))
-                    current-prefix-arg))
+                    current-prefix-arg)
+              gnus-article-mode)
   (gnus-article-check-buffer)
   (if (memq (key-binding key t) '(gnus-article-read-summary-keys
                                  gnus-article-read-summary-send-keys))
@@ -6871,7 +6879,7 @@ KEY is a string or a vector."
   "Show a list of all defined keys, and their definitions.
 The optional argument PREFIX, if non-nil, should be a key sequence;
 then we display only bindings that start with that prefix."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (gnus-article-check-buffer)
   (let ((keymap (copy-keymap gnus-article-mode-map))
        (map (copy-keymap gnus-article-send-map))
@@ -6930,7 +6938,7 @@ then we display only bindings that start with that 
prefix."
   "Start composing a reply mail to the current message.
 The text in the region will be yanked.  If the region isn't active,
 the entire article will be yanked."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((article (cdr gnus-article-current))
        contents)
     (if (not (and transient-mark-mode mark-active))
@@ -6948,14 +6956,14 @@ the entire article will be yanked."
   "Start composing a wide reply mail to the current message.
 The text in the region will be yanked.  If the region isn't active,
 the entire article will be yanked."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (gnus-article-reply-with-original t))
 
 (defun gnus-article-followup-with-original ()
   "Compose a followup to the current article.
 The text in the region will be yanked.  If the region isn't active,
 the entire article will be yanked."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((article (cdr gnus-article-current))
        contents)
       (if (not (and transient-mark-mode mark-active))
@@ -6974,8 +6982,8 @@ the entire article will be yanked."
 This means that signatures, cited text and (some) headers will be
 hidden.
 If given a prefix, show the hidden text instead."
-  (command (gnus-article-mode gnus-summary-mode)
-          (append (gnus-article-hidden-arg) (list 'force)))
+  (interactive (append (gnus-article-hidden-arg) (list 'force))
+              gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (article-hide-headers arg)
     (article-hide-list-identifiers)
@@ -7270,7 +7278,7 @@ This is an extended text-mode.
 This will have permanent effect only in mail groups.
 If FORCE is non-nil, allow editing of articles even in read-only
 groups."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (when (and (not force)
             (gnus-group-read-only-p))
     (error "The current newsgroup does not support article editing"))
@@ -7303,7 +7311,7 @@ groups."
 
 (defun gnus-article-edit-done (&optional arg)
   "Update the article edits and exit."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (let ((func gnus-article-edit-done-function)
        (buf (current-buffer))
        (start (window-start))
@@ -7337,7 +7345,7 @@ groups."
 
 (defun gnus-article-edit-exit ()
   "Exit the article editing without updating."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (when (or (not (buffer-modified-p))
            (yes-or-no-p "Article modified; kill anyway? "))
     (let ((curbuf (current-buffer))
@@ -7358,7 +7366,7 @@ groups."
 
 (defun gnus-article-edit-full-stops ()
   "Interactively repair spacing at end of sentences."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (save-excursion
     (goto-char (point-min))
     (search-forward-regexp "^$" nil t)
@@ -7876,7 +7884,7 @@ HEADER is a regexp to match a header.  For a fuller 
explanation, see
   "Check text under the mouse pointer for a callback function.
 If the text under the mouse pointer has a `gnus-callback' property,
 call it with the value of the `gnus-data' text property."
-  (command gnus-article-mode "e")
+  (interactive "e" gnus-article-mode)
   (set-buffer (window-buffer (posn-window (event-start event))))
   (let* ((pos (posn-point (event-start event)))
         (data (get-text-property pos 'gnus-data))
@@ -7889,7 +7897,7 @@ call it with the value of the `gnus-data' text property."
   "Check text at point for a callback function.
 If the text at point has a `gnus-callback' property,
 call it with the value of the `gnus-data' text property."
-  (command gnus-article-mode (list last-nonmenu-event))
+  (interactive (list last-nonmenu-event) gnus-article-mode)
   (save-excursion
     (when event
       (mouse-set-point event))
@@ -7903,7 +7911,7 @@ This function calls `gnus-article-highlight-headers',
 `gnus-article-highlight-citation',
 `gnus-article-highlight-signature', and `gnus-article-add-buttons' to
 do the highlighting.  See the documentation for those functions."
-  (command gnus-article-mode (list 'force))
+  (interactive (list 'force) gnus-article-mode)
   (gnus-article-highlight-headers)
   (gnus-article-highlight-citation force)
   (gnus-article-highlight-signature)
@@ -7915,14 +7923,14 @@ do the highlighting.  See the documentation for those 
functions."
 This function calls `gnus-article-highlight-headers',
 `gnus-article-highlight-signature', and `gnus-article-add-buttons' to
 do the highlighting.  See the documentation for those functions."
-  (command gnus-article-mode (list 'force))
+  (interactive (list 'force) gnus-article-mode)
   (gnus-article-highlight-headers)
   (gnus-article-highlight-signature)
   (gnus-article-add-buttons))
 
 (defun gnus-article-highlight-headers ()
   "Highlight article headers as specified by `gnus-header-face-alist'."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-headers
     (let (regexp header-face field-face from hpoints fpoints)
       (dolist (entry gnus-header-face-alist)
@@ -7956,7 +7964,7 @@ do the highlighting.  See the documentation for those 
functions."
   "Highlight the signature in an article.
 It does this by highlighting everything after
 `gnus-signature-separator' using the face `gnus-signature'."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (let ((inhibit-point-motion-hooks t))
       (save-restriction
@@ -7979,7 +7987,7 @@ It does this by highlighting everything after
   "Find external references in the article and make buttons of them.
 \"External references\" are things like Message-IDs and URLs, as
 specified by `gnus-button-alist'."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (let ((inhibit-point-motion-hooks t)
          (case-fold-search t)
@@ -8073,7 +8081,7 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 ;; Add buttons to the head of an article.
 (defun gnus-article-add-buttons-to-head ()
   "Add buttons to the head of the article."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-headers
     (let (beg end)
       (dolist (entry gnus-header-button-alist)
@@ -8121,7 +8129,7 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 
 (defun gnus-article-copy-string ()
   "Copy the string in the button to the kill ring."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (gnus-article-check-buffer)
   (let ((data (get-text-property (point) 'gnus-string)))
     (when data
@@ -8237,7 +8245,7 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 
 (defun gnus-button-patch (library line)
   "Visit an Emacs Lisp library LIBRARY on line LINE."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((file (locate-library (file-name-nondirectory library))))
     (unless file
       (error "Couldn't find library %s" library))
@@ -8429,7 +8437,7 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 
 (defun gnus-button-next-page (&optional _args _more-args)
   "Go to the next page."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((win (selected-window)))
     (select-window (gnus-get-buffer-window gnus-article-buffer t))
     (gnus-article-next-page)
@@ -8437,7 +8445,7 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 
 (defun gnus-button-prev-page (&optional _args _more-args)
   "Go to the prev page."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (let ((win (selected-window)))
     (select-window (gnus-get-buffer-window gnus-article-buffer t))
     (gnus-article-prev-page)
@@ -8461,7 +8469,7 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 
 (defun gnus-article-button-next-page (_arg)
   "Go to the next page."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (let ((win (selected-window)))
     (select-window (gnus-get-buffer-window gnus-article-buffer t))
     (gnus-article-next-page)
@@ -8469,7 +8477,7 @@ url is put as the `gnus-button-url' overlay property on 
the button."
 
 (defun gnus-article-button-prev-page (_arg)
   "Go to the prev page."
-  (command gnus-article-mode "P")
+  (interactive "P" gnus-article-mode)
   (let ((win (selected-window)))
     (select-window (gnus-get-buffer-window gnus-article-buffer t))
     (gnus-article-prev-page)
@@ -8599,13 +8607,14 @@ For example:
 
 (defun gnus-article-encrypt-body (protocol &optional n)
   "Encrypt the article body."
-  (command gnus-article-mode
+  (interactive
    (list
     (or gnus-article-encrypt-protocol
        (gnus-completing-read "Encrypt protocol"
-                              (mapcar #'car 
gnus-article-encrypt-protocol-alist)
-                              t))
-    current-prefix-arg))
+                             (mapcar #'car gnus-article-encrypt-protocol-alist)
+                             t))
+    current-prefix-arg)
+   gnus-article-mode)
   ;; User might hit `K E' instead of `K e', so prompt once.
   (when (and gnus-article-encrypt-protocol
             gnus-novice-user)
@@ -8729,7 +8738,7 @@ For example:
 
 (defun gnus-mime-security-button-menu (event prefix)
   "Construct a context-sensitive menu of security commands."
-  (command gnus-article-mode "e\nP")
+  (interactive "e\nP" gnus-article-mode)
   (save-window-excursion
     (let ((pos (event-start event)))
       (select-window (posn-window pos))
@@ -8886,12 +8895,12 @@ For example:
 
 (defun gnus-mime-security-save-part ()
   "Save the security part under point."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (gnus-mime-security-run-function 'mm-save-part))
 
 (defun gnus-mime-security-pipe-part ()
   "Pipe the security part under point to a process."
-  (command gnus-article-mode)
+  (interactive nil gnus-article-mode)
   (gnus-mime-security-run-function 'mm-pipe-part))
 
 (provide 'gnus-art)
diff --git a/lisp/gnus/gnus-bookmark.el b/lisp/gnus/gnus-bookmark.el
index be7fb34..8c2a928 100644
--- a/lisp/gnus/gnus-bookmark.el
+++ b/lisp/gnus/gnus-bookmark.el
@@ -168,7 +168,7 @@ So the cdr of each bookmark is an alist too.")
 ;;;###autoload
 (defun gnus-bookmark-set ()
   "Set a bookmark for this article."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-bookmark-maybe-load-default-file)
   (if (or (not (derived-mode-p 'gnus-summary-mode))
          (not gnus-article-current))
@@ -483,7 +483,7 @@ Gnus bookmarks names preceded by a \"*\" have annotations.
 (defun gnus-bookmark-bmenu-toggle-infos (&optional show)
   "Toggle whether details are shown in the Gnus bookmark list.
 Optional argument SHOW means show them unconditionally."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (cond
    (show
     (setq gnus-bookmark-bmenu-toggle-infos nil)
@@ -649,14 +649,14 @@ reposition and try again, else return nil."
 
 (defun gnus-bookmark-bmenu-show-details ()
   "Show the annotation for the current bookmark in another window."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (let ((bookmark (gnus-bookmark-bmenu-bookmark)))
     (if (gnus-bookmark-bmenu-check-position)
        (gnus-bookmark-show-details bookmark))))
 
 (defun gnus-bookmark-bmenu-mark ()
   "Mark bookmark on this line to be displayed by 
\\<gnus-bookmark-bmenu-mode-map>\\[gnus-bookmark-bmenu-select]."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (beginning-of-line)
   (if (gnus-bookmark-bmenu-check-position)
       (let ((inhibit-read-only t))
@@ -668,7 +668,7 @@ reposition and try again, else return nil."
 (defun gnus-bookmark-bmenu-unmark (&optional backup)
   "Cancel all requested operations on bookmark on this line and move down.
 Optional BACKUP means move up."
-  (command gnus-bookmark-bmenu-mode "P")
+  (interactive "P" gnus-bookmark-bmenu-mode)
   (beginning-of-line)
   (if (gnus-bookmark-bmenu-check-position)
       (progn
@@ -683,7 +683,7 @@ Optional BACKUP means move up."
 
 (defun gnus-bookmark-bmenu-backup-unmark ()
   "Move up and cancel all requested operations on bookmark on line above."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (forward-line -1)
   (if (gnus-bookmark-bmenu-check-position)
       (progn
@@ -695,7 +695,7 @@ Optional BACKUP means move up."
   "Mark Gnus bookmark on this line to be deleted.
 To carry out the deletions that you've marked, use
 \\<gnus-bookmark-bmenu-mode-map>\\[gnus-bookmark-bmenu-execute-deletions]."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (beginning-of-line)
   (if (gnus-bookmark-bmenu-check-position)
       (let ((inhibit-read-only t))
@@ -708,7 +708,7 @@ To carry out the deletions that you've marked, use
   "Mark bookmark on this line to be deleted, then move up one line.
 To carry out the deletions that you've marked, use
 \\<gnus-bookmark-bmenu-mode-map>\\[gnus-bookmark-bmenu-execute-deletions]."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (gnus-bookmark-bmenu-delete)
   (forward-line -2)
   (if (gnus-bookmark-bmenu-check-position)
@@ -720,7 +720,7 @@ To carry out the deletions that you've marked, use
 You can mark bookmarks with the
 \\<gnus-bookmark-bmenu-mode-map>\\[gnus-bookmark-bmenu-mark]
 command."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (if (gnus-bookmark-bmenu-check-position)
       (let ((bmrk (gnus-bookmark-bmenu-bookmark))
             (menu (current-buffer)))
@@ -730,13 +730,13 @@ command."
         (bury-buffer menu))))
 
 (defun gnus-bookmark-bmenu-select-by-mouse (event)
-  (command gnus-bookmark-bmenu-mode "e")
+  (interactive "e" gnus-bookmark-bmenu-mode)
   (mouse-set-point event)
   (gnus-bookmark-bmenu-select))
 
 (defun gnus-bookmark-bmenu-load ()
   "Load the Gnus bookmark file and rebuild the bookmark menu-buffer."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (if (gnus-bookmark-bmenu-check-position)
       (save-excursion
         (save-window-excursion
@@ -745,7 +745,7 @@ command."
 
 (defun gnus-bookmark-bmenu-execute-deletions ()
   "Delete Gnus bookmarks marked with 
\\<Buffer-menu-mode-map>\\[Buffer-menu-delete] commands."
-  (command gnus-bookmark-bmenu-mode)
+  (interactive nil gnus-bookmark-bmenu-mode)
   (message "Deleting Gnus bookmarks...")
   (let ((hide-em gnus-bookmark-bmenu-toggle-infos)
         (o-point  (point))
diff --git a/lisp/gnus/gnus-cache.el b/lisp/gnus/gnus-cache.el
index 0e87c84..34dba54 100644
--- a/lisp/gnus/gnus-cache.el
+++ b/lisp/gnus/gnus-cache.el
@@ -342,7 +342,7 @@ it's not cached."
   "Enter the next N articles into the cache.
 If not given a prefix, use the process marked articles instead.
 Returns the list of articles entered."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let (out)
     (dolist (article (gnus-summary-work-articles n))
       (gnus-summary-remove-process-mark article)
@@ -363,7 +363,7 @@ Returns the list of articles entered."
   "Remove the next N articles from the cache.
 If not given a prefix, use the process marked articles instead.
 Returns the list of articles removed."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-cache-change-buffer gnus-newsgroup-name)
   (let (out)
     (dolist (article (gnus-summary-work-articles n))
@@ -388,7 +388,7 @@ Returns the list of articles removed."
 
 (defun gnus-summary-insert-cached-articles ()
   "Insert all the articles cached for this group into the current buffer."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((gnus-verbose (max 6 gnus-verbose)))
     (cond
      ((not gnus-newsgroup-cached)
@@ -401,7 +401,7 @@ Returns the list of articles removed."
 
 (defun gnus-summary-limit-include-cached ()
   "Limit the summary buffer to articles that are cached."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((gnus-verbose (max 6 gnus-verbose)))
     (if gnus-newsgroup-cached
        (progn
diff --git a/lisp/gnus/gnus-cite.el b/lisp/gnus/gnus-cite.el
index c163c04..1f564f1 100644
--- a/lisp/gnus/gnus-cite.el
+++ b/lisp/gnus/gnus-cite.el
@@ -335,7 +335,7 @@ lines matches `message-cite-prefix-regexp' with the same 
prefix.
 
 Lines matching `gnus-cite-attribution-suffix' and perhaps
 `gnus-cite-attribution-prefix' are considered attribution lines."
-  (command (gnus-article-mode gnus-summary-mode) (list 'force))
+  (interactive (list 'force) gnus-article-mode gnus-summary-mode)
   (with-current-buffer (if same-buffer (current-buffer) gnus-article-buffer)
     (gnus-cite-parse-maybe force)
     (let ((buffer-read-only nil)
@@ -459,7 +459,7 @@ frame width.
 
 Sections that are heuristically interpreted as not being
 text (i.e., computer code and the like) will not be folded."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (let ((buffer-read-only nil)
          (inhibit-point-motion-hooks t)
@@ -529,8 +529,8 @@ text (i.e., computer code and the like) will not be folded."
 See the documentation for `gnus-article-highlight-citation'.
 If given a negative prefix, always show; if given a positive prefix,
 always hide."
-  (command (gnus-article-mode gnus-summary-mode)
-          (append (gnus-article-hidden-arg) (list 'force)))
+  (interactive (append (gnus-article-hidden-arg) (list 'force))
+              gnus-article-mode gnus-summary-mode)
   (gnus-set-format 'cited-opened-text-button t)
   (gnus-set-format 'cited-closed-text-button t)
   (with-current-buffer gnus-article-buffer
@@ -662,7 +662,8 @@ percent and at least `gnus-cite-hide-absolute' lines of the 
body is
 cited text with attributions.  When called interactively, these two
 variables are ignored.
 See also the documentation for `gnus-article-highlight-citation'."
-  (command (gnus-article-mode gnus-summary-mode) (append 
(gnus-article-hidden-arg) '(force)))
+  (interactive (append (gnus-article-hidden-arg) '(force))
+              gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (gnus-delete-wash-type 'cite)
     (unless (gnus-article-check-hidden-text 'cite arg)
@@ -690,7 +691,7 @@ See also the documentation for 
`gnus-article-highlight-citation'."
 
 (defun gnus-article-hide-citation-in-followups ()
   "Hide cited text in non-root articles."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (let ((article (cdr gnus-article-current)))
       (unless (with-current-buffer gnus-summary-buffer
diff --git a/lisp/gnus/gnus-cus.el b/lisp/gnus/gnus-cus.el
index fa9e86f..0852f8e 100644
--- a/lisp/gnus/gnus-cus.el
+++ b/lisp/gnus/gnus-cus.el
@@ -337,7 +337,8 @@ category."))
 
 (defun gnus-group-customize (group &optional topic)
   "Edit the group or topic on the current line."
-  (command gnus-group-mode (list (gnus-group-group-name) 
(gnus-group-topic-name)))
+  (interactive (list (gnus-group-group-name) (gnus-group-topic-name))
+              gnus-group-mode)
   (let (info
        (types (mapcar (lambda (entry)
                         `(cons :format "%v%h\n"
@@ -485,7 +486,7 @@ form, but who cares?"
 
 (defun gnus-group-customize-done (&rest _ignore)
   "Apply changes and bury the buffer."
-  (command gnus-custom-mode)
+  (interactive nil gnus-custom-mode)
   (let ((params (widget-value gnus-custom-params)))
     (if gnus-custom-topic
        (gnus-topic-set-parameters gnus-custom-topic params)
@@ -829,7 +830,7 @@ eh?")))
   "Customize score file FILE.
 When called interactively, FILE defaults to the current score file.
 This can be changed using the `\\[gnus-score-change-score-file]' command."
-  (command gnus-summary-mode (list gnus-current-score-file))
+  (interactive (list gnus-current-score-file) gnus-summary-mode)
   (unless file
     (error "No score file for %s" gnus-newsgroup-name))
   (let ((scores (gnus-score-load file))
@@ -1000,7 +1001,7 @@ articles in the thread.
 
 (defun gnus-agent-customize-category (category)
   "Edit the CATEGORY."
-  (command gnus-custom-mode (list (gnus-category-name)))
+  (interactive (list (gnus-category-name)) gnus-custom-mode)
   (let ((info (assq category gnus-category-alist))
         (defaults (list nil '(agent-predicate . false)
                         (cons 'agent-enable-expiration
diff --git a/lisp/gnus/gnus-delay.el b/lisp/gnus/gnus-delay.el
index cbd3425..944fd97 100644
--- a/lisp/gnus/gnus-delay.el
+++ b/lisp/gnus/gnus-delay.el
@@ -76,10 +76,10 @@ DELAY is a string, giving the length of the time.  Possible 
values are:
 The value of `message-draft-headers' determines which headers are
 generated when the article is delayed.  Remaining headers are
 generated when the article is sent."
-  (command message-mode
-          (list (read-string
-                 "Target date (YYYY-MM-DD), time (hh:mm), or length of delay 
(units in [mhdwMY]): "
-                 gnus-delay-default-delay)))
+  (interactive (list (read-string
+                     "Target date (YYYY-MM-DD), time (hh:mm), or length of 
delay (units in [mhdwMY]): "
+                     gnus-delay-default-delay))
+              message-mode)
   ;; Allow spell checking etc.
   (run-hooks 'message-send-hook)
   (let (num unit year month day hour minute deadline) ;; days
diff --git a/lisp/gnus/gnus-diary.el b/lisp/gnus/gnus-diary.el
index 8e250ba..64eb639 100644
--- a/lisp/gnus/gnus-diary.el
+++ b/lisp/gnus/gnus-diary.el
@@ -214,7 +214,7 @@ There are currently two built-in format functions:
 (defun gnus-summary-sort-by-schedule (&optional reverse)
   "Sort nndiary summary buffers by schedule of appointments.
 Optional prefix (or REVERSE argument) means sort in reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'schedule reverse))
 
 (defvar gnus-summary-misc-menu) ;; Avoid byte compiler warning.
@@ -322,7 +322,7 @@ This function checks that all NNDiary required headers are 
present and
 valid, and prompts for values / correction otherwise.
 
 If ARG (or prefix) is non-nil, force prompting for all fields."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (save-excursion
     (mapcar
      (lambda (head)
diff --git a/lisp/gnus/gnus-dired.el b/lisp/gnus/gnus-dired.el
index b6a6f89..af0b782 100644
--- a/lisp/gnus/gnus-dired.el
+++ b/lisp/gnus/gnus-dired.el
@@ -118,14 +118,14 @@ See `mail-user-agent' for more information."
   "Attach dired's marked files to a gnus message composition.
 If called non-interactively, FILES-TO-ATTACH should be a list of
 filenames."
-  (command
-   dired-mode
+  (interactive
    (list
     (delq nil
          (mapcar
           ;; don't attach directories
           (lambda (f) (if (file-directory-p f) nil f))
-          (nreverse (dired-map-over-marks (dired-get-filename) nil))))))
+          (nreverse (dired-map-over-marks (dired-get-filename) nil)))))
+   dired-mode)
   (let ((destination nil)
        (files-str nil)
        (bufs nil))
@@ -177,10 +177,10 @@ filenames."
 (defun gnus-dired-find-file-mailcap (&optional file-name arg)
   "In dired, visit FILE-NAME according to the mailcap file.
 If ARG is non-nil, open it in a new buffer."
-  (command dired-mode
-          (list
-           (file-name-sans-versions (dired-get-filename) t)
-           current-prefix-arg))
+  (interactive (list
+               (file-name-sans-versions (dired-get-filename) t)
+               current-prefix-arg)
+              dired-mode)
   (mailcap-parse-mailcaps)
   (if (file-exists-p file-name)
       (let (mime-type method)
@@ -216,10 +216,10 @@ optional argument PRINT-TO is nil, send the image to the 
printer.
 If PRINT-TO is a string, save the PostScript image in a file with
 that name.  If PRINT-TO is a number, prompt the user for the name
 of the file to save in."
-  (command dired-mode
-          (list
-           (file-name-sans-versions (dired-get-filename) t)
-           (ps-print-preprint current-prefix-arg)))
+  (interactive (list
+               (file-name-sans-versions (dired-get-filename) t)
+               (ps-print-preprint current-prefix-arg))
+              dired-mode)
   (mailcap-parse-mailcaps)
   (cond
    ((file-directory-p file-name)
diff --git a/lisp/gnus/gnus-draft.el b/lisp/gnus/gnus-draft.el
index 3835ef6..9a0f213 100644
--- a/lisp/gnus/gnus-draft.el
+++ b/lisp/gnus/gnus-draft.el
@@ -71,7 +71,7 @@
 
 (defun gnus-draft-toggle-sending (article)
   "Toggle whether to send an article or not."
-  (command gnus-summary-mode (list (gnus-summary-article-number)))
+  (interactive (list (gnus-summary-article-number)) gnus-summary-mode)
   (if (gnus-draft-article-sendable-p article)
       (progn
        (push article gnus-newsgroup-unsendable)
@@ -83,7 +83,7 @@
 
 (defun gnus-draft-edit-message ()
   "Enter a mail/post buffer to edit and send the draft."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((article (gnus-summary-article-number))
        (group gnus-newsgroup-name))
     (gnus-draft-check-draft-articles (list article))
@@ -109,7 +109,7 @@
 (defun gnus-draft-send-message (&optional n)
   "Send the current draft(s).
 Obeys the standard process/prefix convention."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let* ((articles (gnus-summary-work-articles n))
         (total (length articles))
         article)
diff --git a/lisp/gnus/gnus-eform.el b/lisp/gnus/gnus-eform.el
index 4c68ff6..3fd8bf5 100644
--- a/lisp/gnus/gnus-eform.el
+++ b/lisp/gnus/gnus-eform.el
@@ -104,7 +104,7 @@ The optional LAYOUT overrides the `edit-form' window 
layout."
 
 (defun gnus-edit-form-done ()
   "Update changes and kill the current buffer."
-  (command gnus-edit-form-mode)
+  (interactive nil gnus-edit-form-mode)
   (goto-char (point-min))
   (let ((form (condition-case nil
                  (read (current-buffer))
@@ -115,7 +115,7 @@ The optional LAYOUT overrides the `edit-form' window 
layout."
 
 (defun gnus-edit-form-exit ()
   "Kill the current buffer."
-  (command gnus-edit-form-mode)
+  (interactive nil gnus-edit-form-mode)
   (let ((winconf gnus-prev-winconf))
     (kill-buffer (current-buffer))
     (set-window-configuration winconf)))
diff --git a/lisp/gnus/gnus-gravatar.el b/lisp/gnus/gnus-gravatar.el
index d41276d..be57774 100644
--- a/lisp/gnus/gnus-gravatar.el
+++ b/lisp/gnus/gnus-gravatar.el
@@ -125,7 +125,7 @@ callback for `gravatar-retrieve'."
 (defun gnus-treat-from-gravatar (&optional force)
   "Display gravatar in the From header.
 If gravatar is already displayed, remove it."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (if (memq 'from-gravatar gnus-article-wash-types)
        (gnus-delete-images 'from-gravatar)
@@ -135,7 +135,7 @@ If gravatar is already displayed, remove it."
 (defun gnus-treat-mail-gravatar (&optional force)
   "Display gravatars in the Cc and To headers.
 If gravatars are already displayed, remove them."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (gnus-with-article-buffer
     (if (memq 'mail-gravatar gnus-article-wash-types)
         (gnus-delete-images 'mail-gravatar)
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 2ee1cc2..909391b 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -1160,7 +1160,7 @@ The following commands are available:
 
 (defun gnus-mouse-pick-group (e)
   "Enter the group under the mouse pointer."
-  (command gnus-group-mode "e")
+  (interactive "e" gnus-group-mode)
   (mouse-set-point e)
   (gnus-group-read-group nil))
 
@@ -1235,13 +1235,14 @@ If argument UNREAD is non-nil, groups with no unread 
articles are also
 listed.
 
 Also see the `gnus-group-use-permanent-levels' variable."
-  (command gnus-group-mode
+  (interactive
    (list (if current-prefix-arg
             (prefix-numeric-value current-prefix-arg)
           (or
            (gnus-group-default-level nil t)
            (gnus-group-default-list-level)
-           gnus-level-subscribed))))
+           gnus-level-subscribed)))
+   gnus-group-mode)
   (unless level
     (setq level (car gnus-group-list-mode)
          unread (cdr gnus-group-list-mode)))
@@ -1292,7 +1293,7 @@ Also see the `gnus-group-use-permanent-levels' variable."
 (defun gnus-group-list-level (level &optional all)
   "List groups on LEVEL.
 If ALL (the prefix), also list groups that have no unread articles."
-  (command gnus-group-mode "nList groups on level: \nP")
+  (interactive "nList groups on level: \nP" gnus-group-mode)
   (gnus-group-list-groups level all level))
 
 (defun gnus-group-prepare-logic (group test)
@@ -1866,7 +1867,7 @@ If FIRST-TOO, the current line is also eligible as a 
target."
 
 (defun gnus-group-mark-group (n &optional unmark no-advance)
   "Mark the current group."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (let ((buffer-read-only nil)
        group)
     (while (and (> n 0)
@@ -1891,13 +1892,13 @@ If FIRST-TOO, the current line is also eligible as a 
target."
 
 (defun gnus-group-unmark-group (n)
   "Remove the mark from the current group."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (gnus-group-mark-group n 'unmark)
   (gnus-group-position-point))
 
 (defun gnus-group-unmark-all-groups ()
   "Unmark all groups."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (save-excursion
     (mapc #'gnus-group-remove-mark gnus-group-marked))
   (gnus-group-position-point))
@@ -1905,7 +1906,7 @@ If FIRST-TOO, the current line is also eligible as a 
target."
 (defun gnus-group-mark-region (unmark beg end)
   "Mark all groups between point and mark.
 If UNMARK, remove the mark instead."
-  (command gnus-group-mode "P\nr")
+  (interactive "P\nr" gnus-group-mode)
   (let ((num (count-lines beg end)))
     (save-excursion
       (goto-char beg)
@@ -1914,12 +1915,12 @@ If UNMARK, remove the mark instead."
 (defun gnus-group-mark-buffer (&optional unmark)
   "Mark all groups in the buffer.
 If UNMARK, remove the mark instead."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-mark-region unmark (point-min) (point-max)))
 
 (defun gnus-group-mark-regexp (regexp)
   "Mark all groups that match some regexp."
-  (command gnus-group-mode "sMark (regexp): ")
+  (interactive "sMark (regexp): " gnus-group-mode)
   (let ((alist (cdr gnus-newsrc-alist))
        group)
     (save-excursion
@@ -2028,7 +2029,7 @@ number of the earliest articles in the group.
 If the optional argument NO-ARTICLE is non-nil, no article will
 be auto-selected upon group entry.  If GROUP is non-nil, fetch
 that group."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((no-display (eq all 0))
        (group (or group (gnus-group-group-name)))
        number active marked entry)
@@ -2062,7 +2063,7 @@ If ALL is a positive number, fetch this number of the 
latest
 articles in the group.
 If ALL is a negative number, fetch this number of the earliest
 articles in the group."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when (and (eobp) (not (gnus-group-group-name)))
     (forward-line -1))
   (gnus-group-read-group all t))
@@ -2081,7 +2082,7 @@ buffer.  If GROUP is nil, use current group.
 
 This might be useful if you want to toggle threading
 before entering the group."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (require 'gnus-score)
   (let (gnus-visual
        gnus-score-find-score-files-function
@@ -2092,7 +2093,7 @@ before entering the group."
 
 (defun gnus-group-visible-select-group (&optional all)
   "Select the current group without hiding any articles."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((gnus-inhibit-limiting t))
     (gnus-group-read-group all t)))
 
@@ -2101,7 +2102,7 @@ before entering the group."
 You will actually be entered into a group that's a copy of
 the current group; no changes you make while in this group will
 be permanent."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (require 'gnus-score)
   (let* (gnus-visual
         gnus-score-find-score-files-function gnus-apply-kill-hook
@@ -2329,11 +2330,12 @@ START is the first article.  RANGE specifies how many 
articles
 are fetched.  The articles are downloaded via HTTP using the URL
 specified by `gnus-gmane-group-download-format'."
   ;; See <http://gmane.org/export.php> for more information.
-  (command gnus-group-mode
+  (interactive
    (list
     (gnus-group-completing-read "Gmane group")
     (read-number "Start article number: ")
-    (read-number "How many articles: ")))
+    (read-number "How many articles: "))
+   gnus-group-mode)
   (unless range (setq range 500))
   (when (< range 1)
     (error "Invalid range: %s" range))
@@ -2367,8 +2369,7 @@ Valid input formats include:
   ;; - The URLs should be added to `gnus-button-alist'.  Probably we should
   ;;   prompt the user to decide: "View via `browse-url' or in Gnus? "
   ;;   (`gnus-read-ephemeral-gmane-group-url')
-  (command gnus-group-mode
-   (list (gnus-group-completing-read "Gmane URL")))
+  (interactive (list (gnus-group-completing-read "Gmane URL")) gnus-group-mode)
   (let (group start range)
     (cond
      ;; URLs providing `group', `start' and `range':
@@ -2535,7 +2536,7 @@ The arguments have the same meaning as those of
 
 If PROMPT (the prefix) is a number, use the prompt specified in
 `gnus-group-jump-to-group-prompt'."
-  (command gnus-group-mode
+  (interactive
    (list (gnus-group-completing-read
           nil nil nil
           (if current-prefix-arg
@@ -2543,7 +2544,8 @@ If PROMPT (the prefix) is a number, use the prompt 
specified in
             (or (and (stringp gnus-group-jump-to-group-prompt)
                      gnus-group-jump-to-group-prompt)
                 (let ((p (cdr (assq 0 gnus-group-jump-to-group-prompt))))
-                  (and (stringp p) p)))))))
+                  (and (stringp p) p))))))
+   gnus-group-mode)
 
   (when (equal group "")
     (error "Empty group name"))
@@ -2612,7 +2614,7 @@ Return nil if GROUP is not found."
 If N is negative, search backward instead.
 Returns the difference between N and the number of skips actually
 done."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (gnus-group-next-unread-group n t nil silent))
 
 (defun gnus-group-next-unread-group (n &optional all level silent)
@@ -2624,7 +2626,7 @@ such group can be found, the next group with a level 
higher than
 LEVEL.
 Returns the difference between N and the number of skips actually
 made."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (let ((backward (< n 0))
        (n (abs n)))
     (while (and (> n 0)
@@ -2641,14 +2643,14 @@ made."
   "Go to previous N'th newsgroup.
 Returns the difference between N and the number of skips actually
 done."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (gnus-group-next-unread-group (- n) t))
 
 (defun gnus-group-prev-unread-group (n)
   "Go to previous N'th unread newsgroup.
 Returns the difference between N and the number of skips actually
 done."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (gnus-group-next-unread-group (- n)))
 
 (defun gnus-group-next-unread-group-same-level (n)
@@ -2656,7 +2658,7 @@ done."
 If N is negative, search backward instead.
 Returns the difference between N and the number of skips actually
 done."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (gnus-group-next-unread-group n t (gnus-group-group-level))
   (gnus-group-position-point))
 
@@ -2664,14 +2666,14 @@ done."
   "Go to next N'th unread newsgroup on the same level.
 Returns the difference between N and the number of skips actually
 done."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (gnus-group-next-unread-group (- n) t (gnus-group-group-level))
   (gnus-group-position-point))
 
 (defun gnus-group-best-unread-group (&optional exclude-group)
   "Go to the group with the highest level.
 If EXCLUDE-GROUP, do not go to that group."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (goto-char (point-min))
   (let ((best 100000)
        unread best-point)
@@ -2711,7 +2713,7 @@ If EXCLUDE-GROUP, do not go to that group."
 
 (defun gnus-group-first-unread-group ()
   "Go to the first group with unread articles."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (prog1
       (let ((opoint (point))
            unread)
@@ -2727,13 +2729,13 @@ If EXCLUDE-GROUP, do not go to that group."
 
 (defun gnus-group-enter-server-mode ()
   "Jump to the server buffer."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (gnus-enter-server-buffer))
 
 (defun gnus-group-make-group-simple (&optional group)
   "Add a new newsgroup.
 The user will be prompted for GROUP."
-  (command gnus-group-mode (list (gnus-group-completing-read)))
+  (interactive (list (gnus-group-completing-read)) gnus-group-mode)
   (gnus-group-make-group (gnus-group-real-name group)
                         (gnus-group-server group)
                         nil nil))
@@ -2746,10 +2748,11 @@ even if it contains non-ASCII characters).
 
 If the backend supports it, the group will also be created on the
 server."
-  (command gnus-group-mode
+  (interactive
    (list
     (gnus-read-group "Group name: ")
-    (gnus-read-method "Select method for new group (use tab for completion)")))
+    (gnus-read-method "Select method for new group (use tab for completion)"))
+   gnus-group-mode)
 
   (when (stringp method)
     (setq method (or (gnus-server-to-method method) method)))
@@ -2794,7 +2797,7 @@ server."
 
 (defun gnus-group-delete-groups (&optional arg)
   "Delete the current group.  Only meaningful with editable groups."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((n (length (gnus-group-process-prefix arg))))
     (when (gnus-yes-or-no-p
           (if (= n 1)
@@ -2809,8 +2812,8 @@ server."
 If OLDP (the prefix), only delete articles that are \"old\",
 according to the expiry settings.  Note that this will delete old
 not-expirable articles, too."
-  (command gnus-group-mode (list (gnus-group-group-name)
-                                current-prefix-arg))
+  (interactive (list (gnus-group-group-name) current-prefix-arg)
+              gnus-group-mode)
   (let ((articles (gnus-uncompress-range (gnus-active group))))
     (when (gnus-yes-or-no-p
           (format "Do you really want to delete these %d articles forever? "
@@ -2829,9 +2832,8 @@ doing the deletion.
 
 Note that you also have to specify FORCE if you want the group to
 be removed from the server, even when it's empty."
-  (command gnus-group-mode
-          (list (gnus-group-group-name)
-                current-prefix-arg))
+  (interactive (list (gnus-group-group-name) current-prefix-arg)
+              gnus-group-mode)
   (unless group
     (error "No group to delete"))
   (unless (gnus-check-backend-function 'request-delete-group group)
@@ -2856,16 +2858,17 @@ be removed from the server, even when it's empty."
   "Rename group from GROUP to NEW-NAME.
 When used interactively, GROUP is the group under point
 and NEW-NAME will be prompted for."
-  (command gnus-group-mode
-          (let ((group (gnus-group-group-name))
-                method new-name)
-            (unless (gnus-check-backend-function 'request-rename-group group)
-              (error "This back end does not support renaming groups"))
-            (setq new-name (gnus-read-group
-                            "Rename group to: "
-                            (gnus-group-real-name group))
-                  method (gnus-info-method (gnus-get-info group)))
-            (list group (gnus-group-prefixed-name new-name method))))
+  (interactive
+   (let ((group (gnus-group-group-name))
+        method new-name)
+     (unless (gnus-check-backend-function 'request-rename-group group)
+       (error "This back end does not support renaming groups"))
+     (setq new-name (gnus-read-group
+                    "Rename group to: "
+                    (gnus-group-real-name group))
+          method (gnus-info-method (gnus-get-info group)))
+     (list group (gnus-group-prefixed-name new-name method)))
+   gnus-group-mode)
 
   (unless (gnus-check-backend-function 'request-rename-group group)
     (error "This back end does not support renaming groups"))
@@ -2911,7 +2914,7 @@ and NEW-NAME will be prompted for."
 
 (defun gnus-group-edit-group (group &optional part)
   "Edit the group on the current line."
-  (command gnus-group-mode (list (gnus-group-group-name)))
+  (interactive (list (gnus-group-group-name)) gnus-group-mode)
   (let ((part (or part 'info))
        info)
     (unless group
@@ -2950,12 +2953,12 @@ and NEW-NAME will be prompted for."
 
 (defun gnus-group-edit-group-method (group)
   "Edit the select method of GROUP."
-  (command gnus-group-mode (list (gnus-group-group-name)))
+  (interactive (list (gnus-group-group-name)) gnus-group-mode)
   (gnus-group-edit-group group 'method))
 
 (defun gnus-group-edit-group-parameters (group)
   "Edit the group parameters of GROUP."
-  (command gnus-group-mode (list (gnus-group-group-name)))
+  (interactive (list (gnus-group-group-name)) gnus-group-mode)
   (gnus-group-edit-group group 'params))
 
 (defun gnus-group-edit-group-done (part group form)
@@ -2992,16 +2995,17 @@ and NEW-NAME will be prompted for."
 
 (defun gnus-group-make-useful-group (group method)
   "Create one of the groups described in `gnus-useful-groups'."
-  (command gnus-group-mode
-          (let ((entry (assoc (gnus-completing-read
-                               "Create group"
-                               (mapcar #'car gnus-useful-groups)
-                               t)
-                              gnus-useful-groups)))
-            (list (cadr entry)
-                  ;; Don't use `caddr' here since macros within the
-                  ;; `interactive' form won't be expanded.
-                  (car (cddr entry)))))
+  (interactive
+   (let ((entry (assoc (gnus-completing-read
+                       "Create group"
+                       (mapcar #'car gnus-useful-groups)
+                       t)
+                      gnus-useful-groups)))
+     (list (cadr entry)
+          ;; Don't use `caddr' here since macros within the
+          ;; `interactive' form won't be expanded.
+          (car (cddr entry))))
+   gnus-group-mode)
   (setq method (copy-tree method))
   (let (entry)
     (while (setq entry (memq (assq 'eval method) method))
@@ -3015,7 +3019,7 @@ group already exists:
 - if not given, and error is signaled,
 - if t, stay silent,
 - if anything else, just print a message."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (let ((name (gnus-group-prefixed-name "gnus-help" '(nndoc "gnus-help")))
        (file (nnheader-find-etc-directory "gnus-tut.txt" t)))
     (if (gnus-group-entry name)
@@ -3041,9 +3045,9 @@ group already exists:
   "Create a group that uses a single file as the source.
 
 If called with a prefix argument, ask for the file type."
-  (command gnus-group-mode
-          (list (read-file-name "File name: ")
-                (and current-prefix-arg 'ask)))
+  (interactive (list (read-file-name "File name: ")
+                    (and current-prefix-arg 'ask))
+              gnus-group-mode)
   (when (eq type 'ask)
     (let ((err "")
          char found)
@@ -3078,7 +3082,7 @@ If called with a prefix argument, ask for the file type."
 (defun gnus-group-make-web-group (&optional solid)
   "Create an ephemeral nnweb group.
 If SOLID (the prefix), create a solid group."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (require 'nnweb)
   (let* ((group
          (if solid (gnus-read-group "Group name: ")
@@ -3118,7 +3122,7 @@ If SOLID (the prefix), create a solid group."
 (defun gnus-group-make-rss-group (&optional url)
   "Given a URL, discover if there is an RSS feed.
 If there is, use Gnus to create an nnrss group"
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (require 'nnrss)
   (if (not url)
       (setq url (read-from-minibuffer "URL to Search for RSS: ")))
@@ -3159,8 +3163,8 @@ If there is, use Gnus to create an nnrss group"
 The user will be prompted for a directory.  The contents of this
 directory will be used as a newsgroup.  The directory should contain
 mail messages or news articles in files that have numeric names."
-  (command gnus-group-mode
-          (list (read-directory-name "Create group from directory: ")))
+  (interactive (list (read-directory-name "Create group from directory: "))
+              gnus-group-mode)
   (unless (file-exists-p dir)
     (error "No such directory"))
   (unless (file-directory-p dir)
@@ -3193,7 +3197,7 @@ prefix arg NO-PARSE means that Gnus should not parse the 
search
 query before passing it to the underlying search engine.  A
 non-nil SPECS arg must be an alist with `search-query-spec' and
 `search-group-spec' keys, and skips all prompting."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((name (gnus-read-group "Group name: ")))
     (with-current-buffer gnus-group-buffer
       (let* ((group-spec
@@ -3247,7 +3251,7 @@ prefix arg NO-PARSE means that Gnus should not parse the 
search
 query before passing it to the underlying search engine.  A
 non-nil SPECS arg must be an alist with `search-query-spec' and
 `search-group-spec' keys, and skips all prompting."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let* ((group-spec
          (or (cdr (assq 'search-group-spec specs))
              (cdr (assq 'nnir-group-spec specs))
@@ -3287,10 +3291,10 @@ non-nil SPECS arg must be an alist with 
`search-query-spec' and
 
 (defun gnus-group-add-to-virtual (n vgroup)
   "Add the current group to a virtual group."
-  (command gnus-group-mode
-          (list current-prefix-arg
-                (gnus-group-completing-read "Add to virtual group"
-                                            nil t "nnvirtual:")))
+  (interactive (list current-prefix-arg
+                    (gnus-group-completing-read "Add to virtual group"
+                                                nil t "nnvirtual:"))
+              gnus-group-mode)
   (unless (eq (car (gnus-find-method-for-group vgroup)) 'nnvirtual)
     (error "%s is not an nnvirtual group" vgroup))
   (gnus-close-group vgroup)
@@ -3308,7 +3312,7 @@ non-nil SPECS arg must be an alist with 
`search-query-spec' and
 
 (defun gnus-group-make-empty-virtual (group)
   "Create a new, fresh, empty virtual group."
-  (command gnus-group-mode "sCreate new, empty virtual group: ")
+  (interactive "sCreate new, empty virtual group: " gnus-group-mode)
   (let* ((method (list 'nnvirtual "^$"))
         (pgroup (gnus-group-prefixed-name group method)))
     ;; Check whether it exists already.
@@ -3322,7 +3326,7 @@ non-nil SPECS arg must be an alist with 
`search-query-spec' and
 
 (defun gnus-group-enter-directory (dir)
   "Enter an ephemeral nneething group."
-  (command gnus-group-mode "DDirectory to read: ")
+  (interactive "DDirectory to read: " gnus-group-mode)
   (let* ((method (list 'nneething dir '(nneething-read-only t)))
         (leaf (gnus-group-prefixed-name
                (file-name-nondirectory (directory-file-name dir))
@@ -3337,7 +3341,7 @@ non-nil SPECS arg must be an alist with 
`search-query-spec' and
 
 (defun gnus-group-expunge-group (group)
   "Expunge deleted articles in current nnimap GROUP."
-  (command gnus-group-mode (list (gnus-group-group-name)))
+  (interactive (list (gnus-group-group-name)) gnus-group-mode)
   (let ((method (gnus-find-method-for-group group)))
     (if (not (gnus-check-backend-function
              'request-expunge-group (car method)))
@@ -3349,7 +3353,7 @@ non-nil SPECS arg must be an alist with 
`search-query-spec' and
 
 (defun gnus-group-nnimap-edit-acl (group)
   "Edit the Access Control List of current nnimap GROUP."
-  (command gnus-group-mode (list (gnus-group-group-name)))
+  (interactive (list (gnus-group-group-name)) gnus-group-mode)
   (let ((mailbox (gnus-group-real-name group)) method acl)
     (unless group
       (error "No group on current line"))
@@ -3396,7 +3400,8 @@ Editing the access control list for `%s'.
 When used interactively, the sorting function used will be
 determined by the `gnus-group-sort-function' variable.
 If REVERSE (the prefix), reverse the sorting order."
-  (command gnus-group-mode (list gnus-group-sort-function current-prefix-arg))
+  (interactive (list gnus-group-sort-function current-prefix-arg)
+              gnus-group-mode)
   (funcall gnus-group-sort-alist-function
           (gnus-make-sort-function func) reverse)
   (gnus-group-unmark-all-groups)
@@ -3429,56 +3434,57 @@ value is disregarded."
 (defun gnus-group-sort-groups-by-alphabet (&optional reverse)
   "Sort the group buffer alphabetically by group name.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-alphabet reverse))
 
 (defun gnus-group-sort-groups-by-real-name (&optional reverse)
   "Sort the group buffer alphabetically by real (unprefixed) group name.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-real-name reverse))
 
 (defun gnus-group-sort-groups-by-unread (&optional reverse)
   "Sort the group buffer by number of unread articles.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-unread reverse))
 
 (defun gnus-group-sort-groups-by-level (&optional reverse)
   "Sort the group buffer by group level.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-level reverse))
 
 (defun gnus-group-sort-groups-by-score (&optional reverse)
   "Sort the group buffer by group score.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-score reverse))
 
 (defun gnus-group-sort-groups-by-rank (&optional reverse)
   "Sort the group buffer by group rank.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-rank reverse))
 
 (defun gnus-group-sort-groups-by-method (&optional reverse)
   "Sort the group buffer alphabetically by back end name.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-method reverse))
 
 (defun gnus-group-sort-groups-by-server (&optional reverse)
   "Sort the group buffer alphabetically by server name.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-sort-groups 'gnus-group-sort-by-server reverse))
 
 ;;; Selected group sorting.
 
 (defun gnus-group-sort-selected-groups (n func &optional reverse)
   "Sort the process/prefixed groups."
-  (command gnus-group-mode (list current-prefix-arg gnus-group-sort-function))
+  (interactive (list current-prefix-arg gnus-group-sort-function)
+              gnus-group-mode)
   (let ((groups (gnus-group-process-prefix n)))
     (funcall gnus-group-sort-selected-function
             groups (gnus-make-sort-function func) reverse)
@@ -3510,49 +3516,49 @@ If REVERSE is non-nil, reverse the sorting."
   "Sort the group buffer alphabetically by group name.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
 sort in reverse order."
-  (command gnus-group-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-group-mode)
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-alphabet reverse))
 
 (defun gnus-group-sort-selected-groups-by-real-name (&optional n reverse)
   "Sort the group buffer alphabetically by real group name.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
 sort in reverse order."
-  (command gnus-group-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-group-mode)
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-real-name reverse))
 
 (defun gnus-group-sort-selected-groups-by-unread (&optional n reverse)
   "Sort the group buffer by number of unread articles.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
 sort in reverse order."
-  (command gnus-group-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-group-mode)
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-unread reverse))
 
 (defun gnus-group-sort-selected-groups-by-level (&optional n reverse)
   "Sort the group buffer by group level.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
 sort in reverse order."
-  (command gnus-group-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-group-mode)
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-level reverse))
 
 (defun gnus-group-sort-selected-groups-by-score (&optional n reverse)
   "Sort the group buffer by group score.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
 sort in reverse order."
-  (command gnus-group-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-group-mode)
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-score reverse))
 
 (defun gnus-group-sort-selected-groups-by-rank (&optional n reverse)
   "Sort the group buffer by group rank.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
 sort in reverse order."
-  (command gnus-group-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-group-mode)
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-rank reverse))
 
 (defun gnus-group-sort-selected-groups-by-method (&optional n reverse)
   "Sort the group buffer alphabetically by back end name.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
 sort in reverse order."
-  (command gnus-group-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-group-mode)
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-method reverse))
 
 ;;; Sorting predicates.
@@ -3610,7 +3616,7 @@ sort in reverse order."
 (defun gnus-group-clear-data (&optional arg)
   "Clear all marks and read ranges from the current group.
 Obeys the process/prefix convention."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when (gnus-y-or-n-p "Really clear data? ")
     (gnus-group-iterate arg
       (lambda (group)
@@ -3622,7 +3628,7 @@ Obeys the process/prefix convention."
 
 (defun gnus-group-clear-data-on-native-groups ()
   "Clear all marks and read ranges from all native groups."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (when (gnus-yes-or-no-p "Really clear all data from almost all groups? ")
     (let ((alist (cdr gnus-newsrc-alist))
          info)
@@ -3666,7 +3672,7 @@ caught up.  If ALL is non-nil, marked articles will also 
be marked as
 read.  Cross references (Xref: header) of articles are ignored.
 The number of newsgroups that this function was unable to catch
 up is returned."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((groups (gnus-group-process-prefix n))
        (ret 0)
        group)
@@ -3705,7 +3711,7 @@ up is returned."
 (defun gnus-group-catchup-current-all (&optional n)
   "Mark all articles in current newsgroup as read.
 Cross references (Xref: header) of articles are ignored."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-catchup-current n 'all))
 
 (declare-function gnus-sequence-of-unread-articles "gnus-sum" (group))
@@ -3752,7 +3758,7 @@ or nil if no action could be taken."
 (defun gnus-group-expire-articles (&optional n)
   "Expire all expirable articles in the current newsgroup.
 Uses the process/prefix convention."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((groups (gnus-group-process-prefix n))
        group)
     (unless groups
@@ -3798,7 +3804,7 @@ Uses the process/prefix convention."
 
 (defun gnus-group-expire-all-groups ()
   "Expire all expirable articles in all newsgroups."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (save-excursion
     (gnus-message 5 "Expiring...")
     (let ((gnus-group-marked (mapcar (lambda (info) (gnus-info-group info))
@@ -3809,7 +3815,7 @@ Uses the process/prefix convention."
 
 (defun gnus-group-set-current-level (n level)
   "Set the level of the next N groups to LEVEL."
-  (command gnus-group-mode
+  (interactive
    (list
     current-prefix-arg
     (progn
@@ -3822,7 +3828,8 @@ Uses the process/prefix convention."
         (if (string-match "^\\s-*$" s)
             (int-to-string (or (gnus-group-group-level)
                                gnus-level-default-subscribed))
-          s))))))
+          s)))))
+   gnus-group-mode)
   (unless (and (>= level 1) (<= level gnus-level-killed))
     (error "Invalid level: %d" level))
   (dolist (group (gnus-group-process-prefix n))
@@ -3838,18 +3845,18 @@ Uses the process/prefix convention."
 
 (defun gnus-group-unsubscribe (&optional n)
   "Unsubscribe the current group."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-unsubscribe-current-group n 'unsubscribe))
 
 (defun gnus-group-subscribe (&optional n)
   "Subscribe the current group."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-unsubscribe-current-group n 'subscribe))
 
 (defun gnus-group-unsubscribe-current-group (&optional n do-sub)
   "Toggle subscription of the current group.
 If given numerical prefix, toggle the N next groups."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (dolist (group (gnus-group-process-prefix n))
     (gnus-group-remove-mark group)
     (gnus-group-unsubscribe-group
@@ -3871,8 +3878,9 @@ If given numerical prefix, toggle the N next groups."
   "Toggle subscription to GROUP.
 Killed newsgroups are subscribed.  If SILENT, don't try to update the
 group line."
-  (command gnus-group-mode (list (gnus-group-completing-read
-                                 nil nil (gnus-read-active-file-p))))
+  (interactive (list (gnus-group-completing-read
+                     nil nil (gnus-read-active-file-p)))
+              gnus-group-mode)
   (let ((newsrc (gnus-group-entry group)))
     (cond
      ((string-match "\\`[ \t]*\\'" group)
@@ -3906,7 +3914,7 @@ group line."
   "Move the current newsgroup up N places.
 If given a negative prefix, move down instead.  The difference between
 N and the number of steps taken is returned."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (unless (gnus-group-group-name)
     (error "No group on current line"))
   (gnus-group-kill-group 1)
@@ -3918,8 +3926,8 @@ N and the number of steps taken is returned."
 (defun gnus-group-kill-all-zombies (&optional dummy)
   "Kill all zombie newsgroups.
 The optional DUMMY should always be nil."
-  (command gnus-group-mode
-          (list (not (gnus-yes-or-no-p "Really kill all zombies? "))))
+  (interactive (list (not (gnus-yes-or-no-p "Really kill all zombies? ")))
+              gnus-group-mode)
   (unless dummy
     (setq gnus-killed-list (nconc gnus-zombie-list gnus-killed-list))
     (setq gnus-zombie-list nil)
@@ -3929,7 +3937,7 @@ The optional DUMMY should always be nil."
 (defun gnus-group-kill-region (begin end)
   "Kill newsgroups in current region (excluding current point).
 The killed newsgroups can be yanked by using \\[gnus-group-yank-group]."
-  (command gnus-group-mode "r")
+  (interactive "r" gnus-group-mode)
   (let ((lines
         ;; Count lines.
         (save-excursion
@@ -3951,7 +3959,7 @@ However, only groups that were alive can be yanked; 
already killed
 groups or zombie groups can't be yanked.
 The return value is the name of the group that was killed, or a list
 of groups killed."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((buffer-read-only nil)
        (groups (gnus-group-process-prefix n))
        group entry level out)
@@ -4011,7 +4019,7 @@ of groups killed."
 The numeric ARG specifies how many newsgroups are to be yanked.  The
 name of the newsgroup yanked is returned, or (if several groups are
 yanked) a list of yanked groups is returned."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (setq arg (or arg 1))
   (let (info group prev out)
     (while (>= (cl-decf arg) 0)
@@ -4036,7 +4044,7 @@ yanked) a list of yanked groups is returned."
 
 (defun gnus-group-kill-level (level)
   "Kill all groups that is on a certain LEVEL."
-  (command gnus-group-mode "nKill all groups on level: ")
+  (interactive "nKill all groups on level: " gnus-group-mode)
   (cond
    ((= level gnus-level-zombie)
     (setq gnus-killed-list
@@ -4067,7 +4075,7 @@ yanked) a list of yanked groups is returned."
   "List all newsgroups with level ARG or lower.
 Default is `gnus-level-unsubscribed', which lists all subscribed and most
 unsubscribed groups."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-group-list-groups (or arg gnus-level-unsubscribed) t))
 
 ;; Redefine this to list ALL killed groups if prefix arg used.
@@ -4076,7 +4084,7 @@ unsubscribed groups."
   "List all killed newsgroups in the group buffer.
 If ARG is non-nil, list ALL killed groups known to Gnus.  This may
 entail asking the server for the groups."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   ;; Find all possible killed newsgroups if arg.
   (when arg
     (gnus-get-killed-groups))
@@ -4090,7 +4098,7 @@ entail asking the server for the groups."
 
 (defun gnus-group-list-zombies ()
   "List all zombie newsgroups in the group buffer."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (if (not gnus-zombie-list)
       (gnus-message 6 "No zombie groups")
     (let (gnus-group-list-mode)
@@ -4101,7 +4109,7 @@ entail asking the server for the groups."
 
 (defun gnus-group-list-active ()
   "List all groups that are available from the server(s)."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   ;; First we make sure that we have really read the active file.
   (unless (gnus-read-active-file-p)
     (let ((gnus-read-active-file t)
@@ -4123,7 +4131,7 @@ entail asking the server for the groups."
 
 (defun gnus-activate-all-groups (level)
   "Activate absolutely all groups."
-  (command gnus-group-mode (list gnus-level-unsubscribed))
+  (interactive (list gnus-level-unsubscribed) gnus-group-mode)
   (let ((gnus-activate-level level)
        (gnus-activate-foreign-newsgroups level))
     (gnus-group-get-new-news)))
@@ -4135,7 +4143,7 @@ re-scanning.  If ARG is non-nil and not a number, this 
will force
 \"hard\" re-reading of the active files from all servers.
 If ONE-LEVEL is not nil, then re-scan only the specified level,
 otherwise all levels below ARG will be scanned too."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (require 'nnmail)
   (let ((gnus-inhibit-demon t)
        ;; Binding this variable will inhibit multiple fetchings
@@ -4165,7 +4173,7 @@ otherwise all levels below ARG will be scanned too."
 The difference between N and the number of newsgroup checked is returned.
 If N is negative, this group and the N-1 previous groups will be checked.
 If DONT-SCAN is non-nil, scan non-activated groups as well."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let* ((groups (gnus-group-process-prefix n))
         (ret (if (numberp n) (- n (length groups)) 0))
         (beg (unless n
@@ -4210,7 +4218,8 @@ If DONT-SCAN is non-nil, scan non-activated groups as 
well."
 
 (defun gnus-group-describe-group (force &optional group)
   "Display a description of the current newsgroup."
-  (command gnus-group-mode (list current-prefix-arg (gnus-group-group-name)))
+  (interactive (list current-prefix-arg (gnus-group-group-name))
+              gnus-group-mode)
   (let* ((method (gnus-find-method-for-group group))
         (mname (gnus-group-prefixed-name "" method))
         desc)
@@ -4232,7 +4241,7 @@ If DONT-SCAN is non-nil, scan non-activated groups as 
well."
 ;; Suggested by Per Abrahamsen <amanda@iesd.auc.dk>.
 (defun gnus-group-describe-all-groups (&optional force)
   "Pop up a buffer with descriptions of all newsgroups."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when force
     (setq gnus-description-hashtb nil))
   (when (not (or gnus-description-hashtb
@@ -4257,7 +4266,7 @@ If DONT-SCAN is non-nil, scan non-activated groups as 
well."
 ;; Suggested by Daniel Quinlan <quinlan@best.com>.
 (defun gnus-group-apropos (regexp &optional search-description)
   "List all newsgroups that have names that match a regexp."
-  (command gnus-group-mode "sGnus apropos (regexp): ")
+  (interactive "sGnus apropos (regexp): " gnus-group-mode)
   (let ((prev "")
        (obuf (current-buffer))
        groups des)
@@ -4296,7 +4305,7 @@ If DONT-SCAN is non-nil, scan non-activated groups as 
well."
 
 (defun gnus-group-description-apropos (regexp)
   "List all newsgroups that have names or descriptions that match REGEXP."
-  (command gnus-group-mode "sGnus description apropos (regexp): ")
+  (interactive "sGnus description apropos (regexp): " gnus-group-mode)
   (when (not (or gnus-description-hashtb
                 (gnus-read-all-descriptions-files)))
     (error "Couldn't request descriptions file"))
@@ -4311,7 +4320,7 @@ If ALL, also list groups with no unread articles.
 If LOWEST, don't list groups with level lower than LOWEST.
 
 This command may read the active file."
-  (command gnus-group-mode "P\nsList newsgroups matching: ")
+  (interactive "P\nsList newsgroups matching: " gnus-group-mode)
   ;; First make sure active file has been read.
   (when (and level
             (> (prefix-numeric-value level) gnus-level-killed))
@@ -4326,7 +4335,7 @@ This command may read the active file."
 If the prefix LEVEL is non-nil, it should be a number that says which
 level to cut off listing groups.
 If LOWEST, don't list groups with level lower than LOWEST."
-  (command gnus-group-mode "P\nsList newsgroups matching: ")
+  (interactive "P\nsList newsgroups matching: " gnus-group-mode)
   (when level
     (setq level (prefix-numeric-value level)))
   (gnus-group-list-matching (or level gnus-level-killed) regexp t lowest))
@@ -4335,12 +4344,12 @@ If LOWEST, don't list groups with level lower than 
LOWEST."
 (defun gnus-group-save-newsrc (&optional force)
   "Save the Gnus startup files.
 If FORCE, force saving whether it is necessary or not."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-save-newsrc-file force))
 
 (defun gnus-group-restart (&optional _arg)
   "Force Gnus to read the .newsrc file."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (when (gnus-yes-or-no-p
         (format "Are you sure you want to restart Gnus? "))
     (gnus-save-newsrc-file)
@@ -4349,7 +4358,7 @@ If FORCE, force saving whether it is necessary or not."
 
 (defun gnus-group-read-init-file ()
   "Read the Gnus elisp init file."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (gnus-read-init-file)
   (gnus-message 5 "Read %s" gnus-init-file))
 
@@ -4357,7 +4366,7 @@ If FORCE, force saving whether it is necessary or not."
   "Check bogus newsgroups.
 If given a prefix, don't ask for confirmation before removing a bogus
 group."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-check-bogus-newsgroups (and (not silent) (not gnus-expert-user)))
   (gnus-group-list-groups))
 
@@ -4368,7 +4377,7 @@ With 1 C-u, use the `ask-server' method to query the 
server for new
 groups.
 With 2 C-u's, use most complete method possible to query the server
 for new groups, and subscribe the new groups as zombies."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (let ((new-groups (gnus-find-new-newsgroups (or arg 1)))
        current-group)
     (gnus-group-list-groups)
@@ -4381,7 +4390,7 @@ for new groups, and subscribe the new groups as zombies."
 (defun gnus-group-edit-global-kill (&optional article group)
   "Edit the global kill file.
 If GROUP, edit that local kill file instead."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (setq gnus-current-kill-article article)
   (gnus-kill-file-edit-file group)
   (gnus-message 6 "Editing a %s kill file (Type %s to exit)"
@@ -4390,12 +4399,12 @@ If GROUP, edit that local kill file instead."
 
 (defun gnus-group-edit-local-kill (article group)
   "Edit a local kill file."
-  (command gnus-group-mode (list nil (gnus-group-group-name)))
+  (interactive (list nil (gnus-group-group-name)) gnus-group-mode)
   (gnus-group-edit-global-kill article group))
 
 (defun gnus-group-force-update ()
   "Update `.newsrc' file."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (gnus-save-newsrc-file))
 
 (defvar gnus-backlog-articles)
@@ -4404,7 +4413,7 @@ If GROUP, edit that local kill file instead."
   "Suspend the current Gnus session.
 In fact, cleanup buffers except for group mode buffer.
 The hook `gnus-suspend-gnus-hook' is called before actually suspending."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (gnus-run-hooks 'gnus-suspend-gnus-hook)
   (gnus-offer-save-summaries)
   ;; Kill Gnus buffers except for group mode buffer.
@@ -4427,14 +4436,14 @@ The hook `gnus-suspend-gnus-hook' is called before 
actually suspending."
 
 (defun gnus-group-clear-dribble ()
   "Clear all information from the dribble buffer."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (gnus-dribble-clear)
   (gnus-message 7 "Cleared dribble buffer"))
 
 (defun gnus-group-exit ()
   "Quit reading news after updating .newsrc.eld and .newsrc.
 The hook `gnus-exit-gnus-hook' is called before actually exiting."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (when
       (or noninteractive               ;For gnus-batch-kill
          (not gnus-interactive-exit)   ;Without confirmation
@@ -4468,7 +4477,7 @@ The hook `gnus-exit-gnus-hook' is called before actually 
exiting."
 (defun gnus-group-quit ()
   "Quit reading news without updating .newsrc.eld or .newsrc.
 The hook `gnus-exit-gnus-hook' is called before actually exiting."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (when (or noninteractive             ;For gnus-batch-kill
            (zerop (buffer-size))
            (not (gnus-server-opened gnus-select-method))
@@ -4493,7 +4502,7 @@ The hook `gnus-exit-gnus-hook' is called before actually 
exiting."
 
 (defun gnus-group-describe-briefly ()
   "Give a one line description of the group mode commands."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (gnus-message 7 "%s" (substitute-command-keys 
"\\<gnus-group-mode-map>\\[gnus-group-read-group]:Select  
\\[gnus-group-next-unread-group]:Forward  
\\[gnus-group-prev-unread-group]:Backward  \\[gnus-group-exit]:Exit  
\\[gnus-info-find-node]:Run Info  \\[gnus-group-describe-briefly]:This help")))
 
 (defun gnus-group-browse-foreign-server (method)
@@ -4502,11 +4511,11 @@ If called interactively, this function will ask for a 
select method
  (nntp, nnspool, etc.) and a server address (e.g., nntp.some.where).
 If not, METHOD should be a list where the first element is the method
 and the second element is the address."
-  (command gnus-group-mode
+  (interactive
    (list (let ((how (gnus-completing-read
                     "Which back end"
                     (mapcar #'car (append gnus-valid-select-methods
-                                         gnus-server-alist))
+                                          gnus-server-alist))
                     t (cons "nntp" 0) 'gnus-method-history)))
           ;; We either got a back end name or a virtual server name.
           ;; If the first, we also need an address.
@@ -4522,7 +4531,8 @@ and the second element is the address."
                          gnus-secondary-servers
                        (cdr gnus-select-method))))
             ;; We got a server name.
-            how))))
+            how)))
+   gnus-group-mode)
   (gnus-browse-foreign-server method))
 
 (defun gnus-group-set-info (info &optional method-only-group part)
@@ -4680,7 +4690,7 @@ level to cut off listing groups.
 If LOWEST, don't list groups with level lower than LOWEST.
 
 This command may read the active file."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when level
     (setq level (prefix-numeric-value level)))
   (when (or (not level) (>= level gnus-level-zombie))
@@ -4711,7 +4721,7 @@ level to cut off listing groups.
 If LOWEST, don't list groups with level lower than LOWEST.
 
 This command may read the active file."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when level
     (setq level (prefix-numeric-value level)))
   (when (or (not level) (>= level gnus-level-zombie))
@@ -4733,7 +4743,7 @@ level to cut off listing groups.
 If LOWEST, don't list groups with level lower than LOWEST.
 
 This command may read the active file."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when level
     (setq level (prefix-numeric-value level)))
   (when (or (not level) (>= level gnus-level-zombie))
@@ -4761,7 +4771,7 @@ This command may read the active file."
 
 (defun gnus-group-list-plus (&optional _args)
   "List groups plus the current selection."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (let ((gnus-group-listed-groups (gnus-group-listed-groups))
        (gnus-group-list-mode gnus-group-list-mode) ;; Save it.
        func)
@@ -4777,7 +4787,7 @@ This command may read the active file."
 
 (defun gnus-group-list-flush (&optional args)
   "Flush groups from the current selection."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((gnus-group-list-option 'flush))
     (gnus-group-list-plus args)))
 
@@ -4788,7 +4798,7 @@ with this command.  If you've first limited to groups with
 dormant articles with `A ?', you can then further limit with
 `A / c', which will then limit to groups with cached articles, giving
 you the groups that have both dormant articles and cached articles."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((gnus-group-list-option 'limit))
     (gnus-group-list-plus args)))
 
@@ -4841,7 +4851,7 @@ operation is only meaningful for back ends using one file 
per article
 \(e.g. nnml).
 
 Note: currently only implemented in nnml."
-  (command gnus-group-mode (list (gnus-group-group-name)))
+  (interactive (list (gnus-group-group-name)) gnus-group-mode)
   (unless group
     (error "No group to compact"))
   (unless (gnus-check-backend-function 'request-compact-group group)
diff --git a/lisp/gnus/gnus-icalendar.el b/lisp/gnus/gnus-icalendar.el
index fb661dd..1b2743c 100644
--- a/lisp/gnus/gnus-icalendar.el
+++ b/lisp/gnus/gnus-icalendar.el
@@ -970,7 +970,7 @@ These will be used to retrieve the RSVP information from 
ical events."
 
 (defun gnus-icalendar-save-event ()
   "Save the Calendar event in the text/calendar part under point."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-article-check-buffer)
   (let ((data (get-text-property (point) 'gnus-data)))
     (when data
@@ -978,28 +978,28 @@ These will be used to retrieve the RSVP information from 
ical events."
 
 (defun gnus-icalendar-reply-accept ()
   "Accept invitation in the current article."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (gnus-icalendar-reply (list gnus-icalendar-handle 'accepted 
gnus-icalendar-event))
     (setq-local gnus-icalendar-reply-status 'accepted)))
 
 (defun gnus-icalendar-reply-tentative ()
   "Send tentative response to invitation in the current article."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (gnus-icalendar-reply (list gnus-icalendar-handle 'tentative 
gnus-icalendar-event))
     (setq-local gnus-icalendar-reply-status 'tentative)))
 
 (defun gnus-icalendar-reply-decline ()
   "Decline invitation in the current article."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (gnus-icalendar-reply (list gnus-icalendar-handle 'declined 
gnus-icalendar-event))
     (setq-local gnus-icalendar-reply-status 'declined)))
 
 (defun gnus-icalendar-event-export ()
   "Export calendar event to `org-mode', or update existing agenda entry."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (with-current-buffer gnus-article-buffer
     (gnus-icalendar-sync-event-to-org gnus-icalendar-event))
   ;; refresh article buffer in case the reply had been sent before initial org
@@ -1009,14 +1009,14 @@ These will be used to retrieve the RSVP information 
from ical events."
 
 (defun gnus-icalendar-event-show ()
   "Display `org-mode' agenda entry related to the calendar event."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-icalendar--show-org-event
    (with-current-buffer gnus-article-buffer
      gnus-icalendar-event)))
 
 (defun gnus-icalendar-event-check-agenda ()
   "Display `org-mode' agenda for days between event start and end dates."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-icalendar-show-org-agenda
    (with-current-buffer gnus-article-buffer gnus-icalendar-event)))
 
diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el
index 66a3b42..0105379 100644
--- a/lisp/gnus/gnus-int.el
+++ b/lisp/gnus/gnus-int.el
@@ -662,7 +662,7 @@ This is the string that Gnus uses to identify the group."
   "Look up the current article in the group where it originated.
 This command only makes sense for groups shows articles gathered
 from other groups -- for instance, search results and the like."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((gnus-command-method
          (gnus-find-method-for-group gnus-newsgroup-name)))
     (or
diff --git a/lisp/gnus/gnus-mh.el b/lisp/gnus/gnus-mh.el
index 3d4a43c..df076c1 100644
--- a/lisp/gnus/gnus-mh.el
+++ b/lisp/gnus/gnus-mh.el
@@ -53,7 +53,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-in-folder))
     (gnus-summary-save-article arg)))
diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el
index 997d915..6f3911b 100644
--- a/lisp/gnus/gnus-msg.el
+++ b/lisp/gnus/gnus-msg.el
@@ -657,7 +657,7 @@ network.  The corresponding back end must have a 
`request-post' method."
 If ARG, post to group under point.  If ARG is 1, prompt for group name.
 Depending on the selected group, the message might be either a mail or
 a news."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   ;; Bind this variable here to make message mode hooks work ok.
   (let ((gnus-newsgroup-name
         (if arg
@@ -676,7 +676,7 @@ a news."
 Use the posting of the current group by default.
 If ARG, don't do that.  If ARG is 1, prompt for group name to find the
 posting style."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   ;; We can't `let' gnus-newsgroup-name here, since that leads
   ;; to local variables leaking.
   (let* (;;(group gnus-newsgroup-name)
@@ -701,7 +701,7 @@ If ARG, don't do that.  If ARG is 1, prompt for group name 
to post to.
 This function prepares a news even when using mail groups.  This is useful
 for posting messages to mail groups without actually sending them over the
 network.  The corresponding back end must have a `request-post' method."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   ;; We can't `let' gnus-newsgroup-name here, since that leads
   ;; to local variables leaking.
   (let* (;;(group gnus-newsgroup-name)
@@ -730,7 +730,7 @@ network.  The corresponding back end must have a 
`request-post' method."
 If ARG, don't do that.  If ARG is 1, prompt for a group name to post to.
 Depending on the selected group, the message might be either a mail or
 a news."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   ;; Bind this variable here to make message mode hooks work ok.
   (let ((gnus-newsgroup-name
         (if arg
@@ -750,9 +750,9 @@ If prefix argument YANK is non-nil, the original article is 
yanked
 automatically.
 YANK is a list of elements, where the car of each element is the
 article number, and the cdr is the string to be yanked."
-  (command gnus-summary-mode
-          (list (and current-prefix-arg
-                     (gnus-summary-work-articles 1))))
+  (interactive (list (and current-prefix-arg
+                         (gnus-summary-work-articles 1)))
+              gnus-summary-mode)
   (when yank
     (gnus-summary-goto-subject
      (if (listp (car yank))
@@ -772,19 +772,19 @@ article number, and the cdr is the string to be yanked."
   "Compose a followup to an article and include the original article.
 The text in the region will be yanked.  If the region isn't
 active, the entire article will be yanked."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-followup (gnus-summary-work-articles n) force-news))
 
 (defun gnus-summary-followup-to-mail (&optional arg)
   "Followup to the current mail message via news."
-  (command gnus-summary-mode
-          (list (and current-prefix-arg
-                     (gnus-summary-work-articles 1))))
+  (interactive (list (and current-prefix-arg
+                         (gnus-summary-work-articles 1)))
+              gnus-summary-mode)
   (gnus-summary-followup arg t))
 
 (defun gnus-summary-followup-to-mail-with-original (&optional arg)
   "Followup to the current mail message via news."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-followup (gnus-summary-work-articles arg) t))
 
 (defun gnus-inews-yank-articles (articles)
@@ -819,7 +819,7 @@ active, the entire article will be yanked."
 Uses the process-prefix convention.  If given the symbolic
 prefix `a', cancel using the standard posting method; if not
 post using the current select method."
-  (command gnus-summary-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-summary-mode)
   (let ((message-post-method
         (let ((gn gnus-newsgroup-name))
           (lambda (_arg) (gnus-post-method (eq symp 'a) gn))))
@@ -849,7 +849,7 @@ post using the current select method."
   "Compose an article that will supersede a previous article.
 This is done simply by taking the old article and adding a Supersedes
 header line with the old Message-ID."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((article (gnus-summary-article-number))
        (mail-parse-charset gnus-newsgroup-charset))
     (gnus-setup-message 'reply-yank
@@ -1116,9 +1116,9 @@ If prefix argument YANK is non-nil, the original article 
is yanked
 automatically.
 If WIDE, make a wide reply.
 If VERY-WIDE, make a very wide reply."
-  (command gnus-summary-mode
-          (list (and current-prefix-arg
-                     (gnus-summary-work-articles 1))))
+  (interactive (list (and current-prefix-arg
+                         (gnus-summary-work-articles 1)))
+              gnus-summary-mode)
   ;; Allow user to require confirmation before replying by mail to the
   ;; author of a news article (or mail message).
   (when (or (not (or (gnus-news-group-p gnus-newsgroup-name)
@@ -1186,14 +1186,14 @@ If VERY-WIDE, make a very wide reply."
 (defun gnus-summary-reply-with-original (n &optional wide)
   "Start composing a reply mail to the current message.
 The original article will be yanked."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-reply (gnus-summary-work-articles n) wide))
 
 (defun gnus-summary-reply-to-list-with-original (n &optional wide)
   "Start composing a reply mail to the current message.
 The reply goes only to the mailing list.
 The original article will be yanked."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((message-reply-to-function
         (lambda nil
           `((To . ,(gnus-mailing-list-followup-to))))))
@@ -1205,32 +1205,32 @@ If prefix argument YANK is non-nil, the original 
article is yanked
 automatically.
 If WIDE, make a wide reply.
 If VERY-WIDE, make a very wide reply."
-  (command gnus-summary-mode
-          (list (and current-prefix-arg
-                     (gnus-summary-work-articles 1))))
+  (interactive (list (and current-prefix-arg
+                         (gnus-summary-work-articles 1)))
+              gnus-summary-mode)
   (let ((gnus-msg-force-broken-reply-to t))
     (gnus-summary-reply yank wide very-wide)))
 
 (defun gnus-summary-reply-broken-reply-to-with-original (n &optional wide)
   "Like `gnus-summary-reply-with-original' except removing reply-to field.
 The original article will be yanked."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-reply-broken-reply-to (gnus-summary-work-articles n) wide))
 
 (defun gnus-summary-wide-reply (&optional yank)
   "Start composing a wide reply mail to the current message.
 If prefix argument YANK is non-nil, the original article is yanked
 automatically."
-  (command gnus-summary-mode
-          (list (and current-prefix-arg
-                     (gnus-summary-work-articles 1))))
+  (interactive (list (and current-prefix-arg
+                         (gnus-summary-work-articles 1)))
+              gnus-summary-mode)
   (gnus-summary-reply yank t))
 
 (defun gnus-summary-wide-reply-with-original (n)
   "Start composing a wide reply mail to the current message.
 The original article(s) will be yanked.
 Uses the process/prefix convention."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-reply-with-original n t))
 
 (defun gnus-summary-very-wide-reply (&optional yank)
@@ -1243,9 +1243,9 @@ messages as the To/Cc headers.
 
 If prefix argument YANK is non-nil, the original article(s) will
 be yanked automatically."
-  (command gnus-summary-mode
-          (list (and current-prefix-arg
-                     (gnus-summary-work-articles 1))))
+  (interactive (list (and current-prefix-arg
+                         (gnus-summary-work-articles 1)))
+              gnus-summary-mode)
   (gnus-summary-reply yank t (gnus-summary-work-articles yank)))
 
 (defun gnus-summary-very-wide-reply-with-original (n)
@@ -1257,7 +1257,7 @@ The reply will include all From/Cc headers from the 
original
 messages as the To/Cc headers.
 
 The original article(s) will be yanked."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-reply
    (gnus-summary-work-articles n) t (gnus-summary-work-articles n)))
 
@@ -1273,7 +1273,7 @@ otherwise, use flipped `message-forward-as-mime'.
 If POST, post instead of mail.
 For the \"inline\" alternatives, also see the variable
 `message-forward-ignored-headers'."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (if (cdr (gnus-summary-work-articles nil))
       ;; Process marks are given.
       (gnus-uu-digest-mail-forward nil post)
@@ -1352,17 +1352,18 @@ For the \"inline\" alternatives, also see the variable
   "Resend the current article to ADDRESS.
 Uses the process/prefix convention.  If NO-SELECT, don't display
 the message before resending."
-  (command gnus-summary-mode
-          (list (message-read-from-minibuffer
-                 "Resend message(s) to: "
-                 (when (and gnus-summary-resend-default-address
-                            (gnus-buffer-live-p gnus-original-article-buffer))
-                   ;; If some other article is currently selected, the
-                   ;; initial-contents is wrong. Whatever, it is just the
-                   ;; initial-contents.
-                   (with-current-buffer gnus-original-article-buffer
-                     (nnmail-fetch-field "to"))))
-                current-prefix-arg))
+  (interactive
+   (list (message-read-from-minibuffer
+         "Resend message(s) to: "
+         (when (and gnus-summary-resend-default-address
+                    (gnus-buffer-live-p gnus-original-article-buffer))
+           ;; If some other article is currently selected, the
+           ;; initial-contents is wrong. Whatever, it is just the
+           ;; initial-contents.
+           (with-current-buffer gnus-original-article-buffer
+             (nnmail-fetch-field "to"))))
+        current-prefix-arg)
+   gnus-summary-mode)
   (let ((message-header-setup-hook (copy-sequence message-header-setup-hook))
        (message-sent-hook (copy-sequence message-sent-hook))
        ;; Honor posting-style for `name' and `address' in Resent-From header.
@@ -1415,7 +1416,7 @@ the message before resending."
 A new buffer will be created to allow the user to modify body and
 contents of the message, and then, everything will happen as when
 composing a new message."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((mail-parse-charset gnus-newsgroup-charset))
     (gnus-setup-message 'reply-yank
       (gnus-summary-select-article t)
@@ -1443,12 +1444,12 @@ composing a new message."
 (defun gnus-summary-post-forward (&optional arg)
   "Forward the current article to a newsgroup.
 See `gnus-summary-mail-forward' for ARG."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-mail-forward arg t))
 
 (defun gnus-summary-mail-crosspost-complaint (n)
   "Send a complaint about crossposting to the current article(s)."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (dolist (article (gnus-summary-work-articles n))
     (set-buffer gnus-summary-buffer)
     (gnus-summary-goto-subject article)
@@ -1516,9 +1517,9 @@ Already submitted bugs can be found in the Emacs bug 
tracker:
 
 (defun gnus-summary-yank-message (buffer n)
   "Yank the current article into a composed message."
-  (command gnus-summary-mode
-          (list (gnus-completing-read "Buffer" (message-buffers) t)
-                current-prefix-arg))
+  (interactive (list (gnus-completing-read "Buffer" (message-buffers) t)
+                    current-prefix-arg)
+              gnus-summary-mode)
   (gnus-summary-iterate n
     (let ((gnus-inhibit-treatment t))
       (gnus-summary-select-article))
@@ -1535,7 +1536,7 @@ contains some mail you have written which has been 
bounced back to
 you.
 If FETCH, try to fetch the article that this is a reply to, if indeed
 this is a reply."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-select-article t)
   (let (summary-buffer parent)
     (if fetch
@@ -1970,7 +1971,7 @@ created.
 
 This command uses the process/prefix convention, so if you
 process-mark several articles, they will all be attached."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((buffers (message-buffers))
        destination)
     ;; Set up the destination mail composition buffer.
diff --git a/lisp/gnus/gnus-picon.el b/lisp/gnus/gnus-picon.el
index a11b75e..fd4d3b8 100644
--- a/lisp/gnus/gnus-picon.el
+++ b/lisp/gnus/gnus-picon.el
@@ -244,7 +244,7 @@ replacement is added."
                     (gnus-picon-insert-glyph (pop spec) category))))))))))
 
 (defun gnus-picon-transform-newsgroups (header)
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-with-article-headers
    (gnus-article-goto-header header)
    (mail-header-narrow-to-field)
@@ -283,7 +283,7 @@ replacement is added."
 (defun gnus-treat-from-picon ()
   "Display picons in the From header.
 If picons are already displayed, remove them."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((wash-picon-p buffer-read-only))
     (gnus-with-article-buffer
      (if (and wash-picon-p (memq 'from-picon gnus-article-wash-types))
@@ -294,7 +294,7 @@ If picons are already displayed, remove them."
 (defun gnus-treat-mail-picon ()
   "Display picons in the Cc and To headers.
 If picons are already displayed, remove them."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((wash-picon-p buffer-read-only))
     (gnus-with-article-buffer
      (if (and wash-picon-p (memq 'mail-picon gnus-article-wash-types))
@@ -306,7 +306,7 @@ If picons are already displayed, remove them."
 (defun gnus-treat-newsgroups-picon ()
   "Display picons in the Newsgroups and Followup-To headers.
 If picons are already displayed, remove them."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((wash-picon-p buffer-read-only))
     (gnus-with-article-buffer
      (if (and wash-picon-p (memq 'newsgroups-picon gnus-article-wash-types))
diff --git a/lisp/gnus/gnus-registry.el b/lisp/gnus/gnus-registry.el
index 797a2c0..9a22256 100644
--- a/lisp/gnus/gnus-registry.el
+++ b/lisp/gnus/gnus-registry.el
@@ -813,7 +813,7 @@ Consults `gnus-registry-ignored-groups' and
 (defun gnus-registry-wash-for-keywords (&optional force)
   "Get the keywords of the current article.
 Overrides existing keywords with FORCE set non-nil."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((id (gnus-registry-fetch-message-id-fast gnus-current-article))
         word words)
     (if (or (not (gnus-registry-get-id-key id 'keyword))
@@ -1039,15 +1039,15 @@ Uses `gnus-registry-marks' to find what shortcuts to 
install."
 
 (defun gnus-registry-set-article-mark (&rest articles)
   "Apply a mark to process-marked ARTICLES."
-  (command (gnus-article-mode gnus-summary-mode)
-          (gnus-summary-work-articles current-prefix-arg))
+  (interactive (gnus-summary-work-articles current-prefix-arg)
+              gnus-article-mode gnus-summary-mode)
   (gnus-registry-set-article-mark-internal (gnus-registry-read-mark)
                                            articles nil t))
 
 (defun gnus-registry-remove-article-mark (&rest articles)
   "Remove a mark from process-marked ARTICLES."
-  (command (gnus-article-mode gnus-summary-mode)
-          (gnus-summary-work-articles current-prefix-arg))
+  (interactive (gnus-summary-work-articles current-prefix-arg)
+              gnus-article-mode gnus-summary-mode)
   (gnus-registry-set-article-mark-internal (gnus-registry-read-mark)
                                            articles t t))
 
@@ -1071,8 +1071,8 @@ Uses `gnus-registry-marks' to find what shortcuts to 
install."
   "Get the Gnus registry marks for ARTICLES and show them if interactive.
 Uses process/prefix conventions.  For multiple articles,
 only the last one's marks are returned."
-  (command (gnus-article-mode gnus-summary-mode)
-          (gnus-summary-work-articles 1))
+  (interactive (gnus-summary-work-articles 1)
+              gnus-article-mode gnus-summary-mode)
   (let* ((article (last articles))
          (id (gnus-registry-fetch-message-id-fast article))
          (marks (when id (gnus-registry-get-id-key id 'mark))))
diff --git a/lisp/gnus/gnus-salt.el b/lisp/gnus/gnus-salt.el
index 97ea7b3..5b746a8 100644
--- a/lisp/gnus/gnus-salt.el
+++ b/lisp/gnus/gnus-salt.el
@@ -464,7 +464,7 @@ Two predefined functions are available:
 
 (defun gnus-tree-read-summary-keys (&optional arg)
   "Read a summary buffer key sequence and execute it."
-  (command gnus-tree-mode "P")
+  (interactive "P" gnus-tree-mode)
   (unless gnus-tree-inhibit
     (let ((buf (current-buffer))
          (gnus-tree-inhibit t)
@@ -479,7 +479,7 @@ Two predefined functions are available:
 
 (defun gnus-tree-show-summary ()
   "Reconfigure windows to show summary buffer."
-  (command gnus-tree-mode)
+  (interactive nil gnus-tree-mode)
   (if (not (gnus-buffer-live-p gnus-summary-buffer))
       (error "There is no summary buffer for this tree buffer")
     (gnus-configure-windows 'article)
@@ -487,7 +487,7 @@ Two predefined functions are available:
 
 (defun gnus-tree-select-article (article)
   "Select the article under point, if any."
-  (command gnus-tree-mode (list (gnus-tree-article-number)))
+  (interactive (list (gnus-tree-article-number)) gnus-tree-mode)
   (let ((buf (current-buffer)))
     (when article
       (with-current-buffer gnus-summary-buffer
@@ -496,7 +496,7 @@ Two predefined functions are available:
 
 (defun gnus-tree-pick-article (e)
   "Select the article under the mouse pointer."
-  (command gnus-tree-mode "e")
+  (interactive "e" gnus-tree-mode)
   (mouse-set-point e)
   (gnus-tree-select-article (gnus-tree-article-number)))
 
diff --git a/lisp/gnus/gnus-score.el b/lisp/gnus/gnus-score.el
index fac4c09..ce64dce 100644
--- a/lisp/gnus/gnus-score.el
+++ b/lisp/gnus/gnus-score.el
@@ -528,8 +528,8 @@ permanence, and the string to be used.  The numerical 
prefix will
 be used as SCORE.  A symbolic prefix of `a' (the SYMP parameter)
 says to use the `all.SCORE' file for the command instead of the
 current score file."
-  (command (gnus-article-mode gnus-summary-mode)
-          (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny")
+              gnus-article-mode gnus-summary-mode)
   (gnus-summary-increase-score (- (gnus-score-delta-default score)) symp))
 
 (defun gnus-score-kill-help-buffer ()
@@ -545,8 +545,8 @@ permanence, and the string to be used.  The numerical 
prefix will
 be used as SCORE.  A symbolic prefix of `a' (the SYMP parameter)
 says to use the `all.SCORE' file for the command instead of the
 current score file."
-  (command (gnus-article-mode gnus-summary-mode)
-          (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny")
+              gnus-article-mode gnus-summary-mode)
   (let* ((nscore (gnus-score-delta-default score))
         (prefix (if (< nscore 0) ?L ?I))
         (increase (> nscore 0))
@@ -932,17 +932,17 @@ MATCH is the string we are looking for.
 TYPE is the score type.
 SCORE is the score to add.
 EXTRA is the possible non-standard header."
-  (command (gnus-article-mode gnus-summary-mode)
-          (list (gnus-completing-read "Header"
-                                       (mapcar
-                                        #'car
-                                        (seq-filter
-                                         (lambda (x) (fboundp (nth 2 x)))
-                                         gnus-header-index))
-                                       t)
-                (read-string "Match: ")
-                (if (y-or-n-p "Use regexp match? ") 'r 's)
-                (string-to-number (read-string "Score: "))))
+  (interactive (list (gnus-completing-read "Header"
+                                          (mapcar
+                                            #'car
+                                            (seq-filter
+                                             (lambda (x) (fboundp (nth 2 x)))
+                                             gnus-header-index))
+                                          t)
+                    (read-string "Match: ")
+                    (if (y-or-n-p "Use regexp match? ") 'r 's)
+                    (string-to-number (read-string "Score: ")))
+              gnus-article-mode gnus-summary-mode)
   (save-excursion
     (unless (and (stringp match) (> (length match) 0))
       (error "No match"))
@@ -975,10 +975,10 @@ EXTRA is the possible non-standard header."
 
 (defun gnus-score-set-mark-below (score)
   "Automatically mark articles with score below SCORE as read."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg))
-            (string-to-number (read-string "Mark below: ")))))
+            (string-to-number (read-string "Mark below: "))))
+   gnus-article-mode gnus-summary-mode)
   (setq score (or score gnus-summary-default-score 0))
   (gnus-score-set 'mark (list score))
   (gnus-score-set 'touched '(t))
@@ -1010,17 +1010,17 @@ EXTRA is the possible non-standard header."
 
 (defun gnus-score-set-expunge-below (score)
   "Automatically expunge articles with score below SCORE."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg))
-            (string-to-number (read-string "Set expunge below: ")))))
+            (string-to-number (read-string "Set expunge below: "))))
+   gnus-article-mode gnus-summary-mode)
   (setq score (or score gnus-summary-default-score 0))
   (gnus-score-set 'expunge (list score))
   (gnus-score-set 'touched '(t)))
 
 (defun gnus-score-followup-article (&optional score)
   "Add SCORE to all followups to the article in the current buffer."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (setq score (gnus-score-delta-default score))
   (when (gnus-buffer-live-p gnus-summary-buffer)
     (save-excursion
@@ -1035,7 +1035,7 @@ EXTRA is the possible non-standard header."
 
 (defun gnus-score-followup-thread (&optional score)
   "Add SCORE to all later articles in the thread the current buffer is part 
of."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (setq score (gnus-score-delta-default score))
   (when (gnus-buffer-live-p gnus-summary-buffer)
     (save-excursion
@@ -1069,13 +1069,13 @@ EXTRA is the possible non-standard header."
 
 (defun gnus-summary-raise-score (n)
   "Raise the score of the current article by N."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (gnus-summary-set-score (+ (gnus-summary-article-score)
                             (or n gnus-score-interactive-default-score ))))
 
 (defun gnus-summary-set-score (n)
   "Set the score of the current article to N."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (save-excursion
     (gnus-summary-show-thread)
     (let ((buffer-read-only nil))
@@ -1094,7 +1094,7 @@ EXTRA is the possible non-standard header."
 (defun gnus-summary-current-score (arg)
   "Return the score of the current article.
   With prefix ARG, return the total score of the current (sub)thread."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (message "%s" (if arg
                    (gnus-thread-total-score
                     (gnus-id-to-thread
@@ -1103,17 +1103,17 @@ EXTRA is the possible non-standard header."
 
 (defun gnus-score-change-score-file (file)
   "Change current score alist."
-  (command
-   (gnus-article-mode gnus-summary-mode)
-   (list (read-file-name "Change to score file: " gnus-kill-files-directory)))
+  (interactive
+   (list (read-file-name "Change to score file: " gnus-kill-files-directory))
+   gnus-article-mode gnus-summary-mode)
   (gnus-score-load-file file)
   (gnus-set-mode-line 'summary))
 
 (defvar gnus-score-edit-exit-function)
 (defun gnus-score-edit-current-scores (file)
   "Edit the current score alist."
-  (command (gnus-article-mode gnus-summary-mode)
-          (list gnus-current-score-file))
+  (interactive (list gnus-current-score-file)
+              gnus-article-mode gnus-summary-mode)
   (if (not gnus-current-score-file)
       (error "No current score file")
     (let ((winconf (current-window-configuration)))
@@ -2503,7 +2503,7 @@ score in `gnus-newsgroup-scored' by SCORE."
 
 (defun gnus-score-find-trace ()
   "Find all score rules that applies to the current article."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((old-scored gnus-newsgroup-scored))
     (let ((gnus-newsgroup-headers
           (list (gnus-summary-article-header)))
@@ -2618,7 +2618,7 @@ the score file and its full name, including the 
directory.")
 
 (defun gnus-summary-rescore ()
   "Redo the entire scoring process in the current summary."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-score-save)
   (setq gnus-score-cache nil)
   (setq gnus-newsgroup-scored nil)
@@ -2649,7 +2649,7 @@ the score file and its full name, including the 
directory.")
 
 (defun gnus-summary-raise-same-subject-and-select (score)
   "Raise articles which has the same subject with SCORE and select the next."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (let ((subject (gnus-summary-article-subject)))
     (gnus-summary-raise-score score)
     (while (gnus-summary-find-subject subject)
@@ -2658,7 +2658,7 @@ the score file and its full name, including the 
directory.")
 
 (defun gnus-summary-raise-same-subject (score)
   "Raise articles which has the same subject with SCORE."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (let ((subject (gnus-summary-article-subject)))
     (gnus-summary-raise-score score)
     (while (gnus-summary-find-subject subject)
@@ -2671,7 +2671,7 @@ the score file and its full name, including the 
directory.")
 
 (defun gnus-summary-raise-thread (&optional score)
   "Raise the score of the articles in the current thread with SCORE."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (setq score (gnus-score-delta-default score))
   (let (e)
     (save-excursion
@@ -2690,17 +2690,17 @@ the score file and its full name, including the 
directory.")
 
 (defun gnus-summary-lower-same-subject-and-select (score)
   "Raise articles which has the same subject with SCORE and select the next."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (gnus-summary-raise-same-subject-and-select (- score)))
 
 (defun gnus-summary-lower-same-subject (score)
   "Raise articles which has the same subject with SCORE."
-  (command (gnus-article-mode gnus-summary-mode) "p")
+  (interactive "p" gnus-article-mode gnus-summary-mode)
   (gnus-summary-raise-same-subject (- score)))
 
 (defun gnus-summary-lower-thread (&optional score)
   "Lower score of articles in the current thread with SCORE."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (gnus-summary-raise-thread (- (gnus-score-delta-default score))))
 
 ;;; Finding score files.
diff --git a/lisp/gnus/gnus-sieve.el b/lisp/gnus/gnus-sieve.el
index fa2538f..eeedf7f 100644
--- a/lisp/gnus/gnus-sieve.el
+++ b/lisp/gnus/gnus-sieve.el
@@ -113,7 +113,7 @@ Return nil if no rule could be guessed."
 
 ;;;###autoload
 (defun gnus-sieve-article-add-rule ()
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-summary-select-article nil 'force)
   (with-current-buffer gnus-original-article-buffer
     (let ((rule (gnus-sieve-guess-rule-for-article))
diff --git a/lisp/gnus/gnus-srvr.el b/lisp/gnus/gnus-srvr.el
index f865724..f66f842 100644
--- a/lisp/gnus/gnus-srvr.el
+++ b/lisp/gnus/gnus-srvr.el
@@ -409,7 +409,7 @@ The following commands are available:
 
 (defun gnus-server-kill-server (server)
   "Kill the server on the current line."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (unless (gnus-server-goto-server server)
     (if server (error "No such server: %s" server)
       (error "No server on the current line")))
@@ -438,7 +438,7 @@ The following commands are available:
 
 (defun gnus-server-yank-server ()
   "Yank the previously killed server."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (unless gnus-server-killed-servers
     (error "No killed servers to be yanked"))
   (let ((alist gnus-server-alist)
@@ -460,14 +460,14 @@ The following commands are available:
 
 (defun gnus-server-exit ()
   "Return to the group buffer."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (gnus-run-hooks 'gnus-server-exit-hook)
   (gnus-kill-buffer (current-buffer))
   (gnus-configure-windows 'group t))
 
 (defun gnus-server-list-servers ()
   "List all available servers."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (let ((cur (gnus-server-server-name)))
     (gnus-server-prepare)
     (if cur (gnus-server-goto-server cur)
@@ -489,7 +489,7 @@ The following commands are available:
 
 (defun gnus-server-open-server (server)
   "Force an open of SERVER."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (let ((method (gnus-server-to-method server)))
     (unless method
       (error "No such server: %s" server))
@@ -501,13 +501,13 @@ The following commands are available:
 
 (defun gnus-server-open-all-servers ()
   "Open all servers."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (dolist (server gnus-inserted-opened-servers)
     (gnus-server-open-server (car server))))
 
 (defun gnus-server-close-server (server)
   "Close SERVER."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (let ((method (gnus-server-to-method server)))
     (unless method
       (error "No such server: %s" server))
@@ -519,7 +519,7 @@ The following commands are available:
 
 (defun gnus-server-offline-server (server)
   "Set SERVER to offline."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (let ((method (gnus-server-to-method server)))
     (unless method
       (error "No such server: %s" server))
@@ -531,7 +531,7 @@ The following commands are available:
 
 (defun gnus-server-close-all-servers ()
   "Close all servers."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (dolist (server gnus-inserted-opened-servers)
     (gnus-server-close-server (car server)))
   (dolist (server gnus-server-alist)
@@ -539,7 +539,7 @@ The following commands are available:
 
 (defun gnus-server-deny-server (server)
   "Make sure SERVER will never be attempted opened."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (let ((method (gnus-server-to-method server)))
     (unless method
       (error "No such server: %s" server))
@@ -550,7 +550,7 @@ The following commands are available:
 
 (defun gnus-server-remove-denials ()
   "Make all denied servers into closed servers."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (dolist (server gnus-opened-servers)
     (when (eq (nth 1 server) 'denied)
       (setcar (nthcdr 1 server) 'closed)))
@@ -558,11 +558,11 @@ The following commands are available:
 
 (defun gnus-server-copy-server (from to)
   "Copy a server definition to a new name."
-  (command gnus-server-mode
-   (list
-    (or (gnus-server-server-name)
-       (error "No server on the current line"))
-    (read-string "Copy to: ")))
+  (interactive (list
+               (or (gnus-server-server-name)
+                   (error "No server on the current line"))
+               (read-string "Copy to: "))
+              gnus-server-mode)
   (unless from
     (error "No server on current line"))
   (unless (and to (not (string= to "")))
@@ -579,12 +579,12 @@ The following commands are available:
     (gnus-server-yank-server)))
 
 (defun gnus-server-add-server (how where)
-  (command
-   gnus-server-mode
+  (interactive
    (list (intern (gnus-completing-read "Server method"
                                        (mapcar #'car gnus-valid-select-methods)
                                        t))
-        (read-string "Server name: ")))
+        (read-string "Server name: "))
+   gnus-server-mode)
   (when (assq where gnus-server-alist)
     (error "Server with that name already defined"))
   (push (list where how where) gnus-server-killed-servers)
@@ -592,10 +592,10 @@ The following commands are available:
 
 (defun gnus-server-goto-server (server)
   "Jump to a server line."
-  (command
-   gnus-server-mode
+  (interactive
    (list (gnus-completing-read "Goto server"
-                               (mapcar #'car gnus-server-alist) t)))
+                               (mapcar #'car gnus-server-alist) t))
+   gnus-server-mode)
   (let ((to (text-property-any (point-min) (point-max)
                               'gnus-server (intern server))))
     (when to
@@ -604,7 +604,7 @@ The following commands are available:
 
 (defun gnus-server-edit-server (server)
   "Edit the server on the current line."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (unless server
     (error "No server on current line"))
   (unless (assoc server gnus-server-alist)
@@ -622,7 +622,7 @@ The following commands are available:
 
 (defun gnus-server-show-server (server)
   "Show the definition of the server on the current line."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (unless server
     (error "No server on current line"))
   (let ((info (gnus-server-to-method server)))
@@ -634,7 +634,7 @@ The following commands are available:
 
 (defun gnus-server-scan-server (server)
   "Request a scan from the current server."
-  (command gnus-server-mode (list (gnus-server-server-name)))
+  (interactive (list (gnus-server-server-name)) gnus-server-mode)
   (let ((method (gnus-server-to-method server)))
     (if (not (gnus-get-function method 'request-scan))
        (error "Server %s can't scan" (car method))
@@ -899,7 +899,7 @@ buffer.
 (defun gnus-browse-read-group (&optional no-article number)
   "Enter the group at the current line.
 If NUMBER, fetch this number of articles."
-  (command gnus-browse-mode "P")
+  (interactive "P" gnus-browse-mode)
   (let* ((full-name (gnus-browse-group-name))
         (group (if (gnus-native-method-p
                     (gnus-find-method-for-group full-name))
@@ -918,26 +918,26 @@ If NUMBER, fetch this number of articles."
 (defun gnus-browse-select-group (&optional number)
   "Select the current group.
 If NUMBER, fetch this number of articles."
-  (command gnus-browse-mode "P")
+  (interactive "P" gnus-browse-mode)
   (gnus-browse-read-group 'no number))
 
 (defun gnus-browse-next-group (n)
   "Go to the next group."
-  (command gnus-browse-mode "p")
+  (interactive "p" gnus-browse-mode)
   (prog1
       (forward-line n)
     (gnus-group-position-point)))
 
 (defun gnus-browse-prev-group (n)
   "Go to the next group."
-  (command gnus-browse-mode "p")
+  (interactive "p" gnus-browse-mode)
   (gnus-browse-next-group (- n)))
 
 (defun gnus-browse-unsubscribe-current-group (arg)
   "(Un)subscribe to the next ARG groups.
 The variable `gnus-browse-subscribe-newsgroup-method' determines
 how new groups will be entered into the group buffer."
-  (command gnus-browse-mode "p")
+  (interactive "p" gnus-browse-mode)
   (when (eobp)
     (error "No group at current line"))
   (let ((ward (if (< arg 0) -1 1))
@@ -963,7 +963,7 @@ how new groups will be entered into the group buffer."
 
 (defun gnus-browse-describe-group (group)
   "Describe the current group."
-  (command gnus-browse-mode (list (gnus-browse-group-name)))
+  (interactive (list (gnus-browse-group-name)) gnus-browse-mode)
   (gnus-group-describe-group nil group))
 
 (defun gnus-browse-delete-group (group force)
@@ -972,8 +972,8 @@ If FORCE (the prefix) is non-nil, all the articles in the 
group will
 be deleted.  This is \"deleted\" as in \"removed forever from the face
 of the Earth\".  There is no undo.  The user will be prompted before
 doing the deletion."
-  (command gnus-browse-mode
-          (list (gnus-browse-group-name) current-prefix-arg))
+  (interactive (list (gnus-browse-group-name) current-prefix-arg)
+              gnus-browse-mode)
   (gnus-group-delete-group group force))
 
 (defun gnus-browse-unsubscribe-group ()
@@ -1022,7 +1022,7 @@ doing the deletion."
 
 (defun gnus-browse-exit ()
   "Quit browsing and return to the group buffer."
-  (command gnus-browse-mode)
+  (interactive nil gnus-browse-mode)
   (when (derived-mode-p 'gnus-browse-mode)
     (gnus-kill-buffer (current-buffer)))
   ;; Insert the newly subscribed groups in the group buffer.
@@ -1034,7 +1034,7 @@ doing the deletion."
 
 (defun gnus-browse-describe-briefly ()
   "Give a one line description of the group mode commands."
-  (command gnus-browse-mode)
+  (interactive nil gnus-browse-mode)
   (gnus-message 6 "%s"
                (substitute-command-keys 
"\\<gnus-browse-mode-map>\\[gnus-group-next-group]:Forward  
\\[gnus-group-prev-group]:Backward  \\[gnus-browse-exit]:Exit  
\\[gnus-info-find-node]:Run Info  \\[gnus-browse-describe-briefly]:This help")))
 
@@ -1091,7 +1091,7 @@ Requesting compaction of %s... (this may take a long 
time)"
 
 (defun gnus-server-toggle-cloud-server ()
   "Toggle whether the server under point is replicated in the Emacs Cloud."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (let ((server (gnus-server-server-name)))
     (unless server
       (error "No server on the current line"))
@@ -1112,7 +1112,7 @@ Requesting compaction of %s... (this may take a long 
time)"
 
 (defun gnus-server-set-cloud-method-server ()
   "Set the server under point to host the Emacs Cloud."
-  (command gnus-server-mode)
+  (interactive nil gnus-server-mode)
   (let ((server (gnus-server-server-name)))
     (unless server
       (error "No server on the current line"))
diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el
index a16a5f8..a3112bd 100644
--- a/lisp/gnus/gnus-start.el
+++ b/lisp/gnus/gnus-start.el
@@ -1070,7 +1070,7 @@ With 1 C-u, use the `ask-server' method to query the 
server for new
 groups.
 With 2 C-u's, use most complete method possible to query the server
 for new groups, and subscribe the new groups as zombies."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (let* ((gnus-subscribe-newsgroup-method
          gnus-subscribe-newsgroup-method)
         (check (cond
@@ -1405,7 +1405,7 @@ newsgroup."
 
 (defun gnus-check-duplicate-killed-groups ()
   "Remove duplicates from the list of killed groups."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (let ((killed gnus-killed-list))
     (while killed
       (gnus-message 9 "%d" (length killed))
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 5c030a4..4065cf0 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -3473,7 +3473,7 @@ marks of articles."
 ;; Various summary mode internalish functions.
 
 (defun gnus-mouse-pick-article (e)
-  (command gnus-summary-mode "e")
+  (interactive "e" gnus-summary-mode)
   (mouse-set-point e)
   (gnus-summary-next-page nil t))
 
@@ -4213,7 +4213,7 @@ If SELECT-ARTICLES, only select those articles from 
GROUP."
 
 (defun gnus-summary-prepare ()
   "Generate the summary buffer."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((inhibit-read-only t))
     (erase-buffer)
     (setq gnus-newsgroup-data nil
@@ -4262,7 +4262,7 @@ If SELECT-ARTICLES, only select those articles from 
GROUP."
 
 (defun gnus-summary-simplify-subject-query ()
   "Query where the respool algorithm would put this article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-select-article)
   (message "%s" (gnus-general-simplify-subject 
(gnus-summary-article-subject))))
 
@@ -6665,19 +6665,19 @@ executed with point over the summary line of the 
articles."
 
 (defun gnus-summary-save-process-mark ()
   "Push the current set of process marked articles on the stack."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (push (copy-sequence gnus-newsgroup-processable)
        gnus-newsgroup-process-stack))
 
 (defun gnus-summary-kill-process-mark ()
   "Push the current set of process marked articles on the stack and unmark."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-save-process-mark)
   (gnus-summary-unmark-all-processable))
 
 (defun gnus-summary-yank-process-mark ()
   "Pop the last process mark state off the stack and restore it."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (unless gnus-newsgroup-process-stack
     (error "Empty mark stack"))
   (gnus-summary-process-mark-set (pop gnus-newsgroup-process-stack)))
@@ -6812,7 +6812,7 @@ articles with that subject.  If BACKWARD, search backward 
instead."
 (defun gnus-recenter (&optional n)
   "Center point in window and redisplay frame.
 Also do horizontal recentering."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (when (and gnus-auto-center-summary
             (not (eq gnus-auto-center-summary 'vertical)))
     (gnus-horizontal-recenter))
@@ -6846,7 +6846,7 @@ If `gnus-auto-center-summary' is nil, or the article 
buffer isn't
 displayed, no centering will be performed."
   ;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle).
   ;; Recenter only when requested.  Suggested by popovich@park.cs.columbia.edu.
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   ;; The user has to want it.
   (when gnus-auto-center-summary
     (let* ((top (cond ((< (window-height) 4) 0)
@@ -7023,7 +7023,7 @@ displayed, no centering will be performed."
   "Reconfigure windows to show the article buffer.
 If `gnus-widen-article-window' is set, show only the article
 buffer."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (if (not (gnus-buffer-live-p gnus-article-buffer))
       (error "There is no article buffer for this summary buffer")
     (or (get-buffer-window gnus-article-buffer)
@@ -7046,7 +7046,7 @@ buffer."
 
 (defun gnus-summary-universal-argument (arg)
   "Perform any operation on all articles that are process/prefixed."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((articles (gnus-summary-work-articles arg))
        func article)
     (if (eq
@@ -7089,7 +7089,7 @@ insertion from another group.  If there's no such then 
return a dummy 0."
 (defun gnus-summary-reselect-current-group (&optional all rescan)
   "Exit and then reselect the current newsgroup.
 The prefix argument ALL means to select all articles."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (when (gnus-ephemeral-group-p gnus-newsgroup-name)
     (error "Ephemeral groups can't be reselected"))
   (let ((current-subject (gnus-summary-find-for-reselect))
@@ -7107,7 +7107,7 @@ The prefix argument ALL means to select all articles."
 
 (defun gnus-summary-rescan-group (&optional all)
   "Exit the newsgroup, ask for new articles, and select the newsgroup."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((config gnus-current-window-configuration))
     (gnus-summary-reselect-current-group all t)
     (gnus-configure-windows config)
@@ -7162,7 +7162,7 @@ The prefix argument ALL means to select all articles."
 
 (defun gnus-summary-make-group-from-search ()
   "Make a persistent group from the current ephemeral search group."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (if (not (gnus-nnselect-group-p gnus-newsgroup-name))
       (gnus-message 3 "%s is not a search group" gnus-newsgroup-name)
     (let ((name (gnus-read-group "Group name: ")))
@@ -7179,7 +7179,7 @@ The prefix argument ALL means to select all articles."
   "Save the current number of read/marked articles in the dribble buffer.
 The dribble buffer will then be saved.
 If FORCE (the prefix), also save the .newsrc file(s)."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-update-info t)
   (if force
       (gnus-save-newsrc-file)
@@ -7191,7 +7191,7 @@ If FORCE (the prefix), also save the .newsrc file(s)."
 (defun gnus-summary-exit (&optional temporary leave-hidden)
   "Exit reading current newsgroup, and then return to group selection mode.
 `gnus-exit-group-hook' is called with no arguments if that value is non-nil."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-set-global-variables)
   (when (gnus-buffer-live-p gnus-article-buffer)
     (with-current-buffer gnus-article-buffer
@@ -7297,7 +7297,7 @@ If FORCE (the prefix), also save the .newsrc file(s)."
 (defalias 'gnus-summary-quit 'gnus-summary-exit-no-update)
 (defun gnus-summary-exit-no-update (&optional no-questions)
   "Quit reading current newsgroup without updating read article info."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let* ((group gnus-newsgroup-name)
         (gnus-group-is-exiting-p t)
         (gnus-group-is-exiting-without-update-p t)
@@ -7451,7 +7451,7 @@ The state which existed when entering the ephemeral is 
reset."
 
 (defun gnus-summary-wake-up-the-dead (&rest _)
   "Wake up the dead summary buffer."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-dead-summary-mode -1)
   (let ((name (buffer-name)))
     (when (string-match "Dead " name)
@@ -7464,12 +7464,12 @@ The state which existed when entering the ephemeral is 
reset."
 ;; Suggested by Per Abrahamsen <amanda@iesd.auc.dk>.
 (defun gnus-summary-describe-group (&optional force)
   "Describe the current newsgroup."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-group-describe-group force gnus-newsgroup-name))
 
 (defun gnus-summary-describe-briefly ()
   "Describe summary mode commands briefly."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-message 6 "%s" (substitute-command-keys 
"\\<gnus-summary-mode-map>\\[gnus-summary-next-page]:Select  
\\[gnus-summary-next-unread-article]:Forward  
\\[gnus-summary-prev-unread-article]:Backward  \\[gnus-summary-exit]:Exit  
\\[gnus-info-find-node]:Run Info  \\[gnus-summary-describe-briefly]:This 
help")))
 
 ;; Walking around group mode buffer from summary mode.
@@ -7479,7 +7479,7 @@ The state which existed when entering the ephemeral is 
reset."
 If prefix argument NO-ARTICLE is non-nil, no article is selected
 initially.  If TARGET-GROUP, go to this group.  If BACKWARD, go to
 previous group instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   ;; Stop pre-fetching.
   (gnus-async-halt-prefetch)
   (let ((current-group gnus-newsgroup-name)
@@ -7525,7 +7525,7 @@ previous group instead."
 (defun gnus-summary-prev-group (&optional no-article)
   "Exit current newsgroup and then select previous unread newsgroup.
 If prefix argument NO-ARTICLE is non-nil, no article is selected initially."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-next-group no-article nil t))
 
 ;; Walking around summary lines.
@@ -7536,7 +7536,7 @@ If UNREAD is non-nil, the article should be unread.
 If UNDOWNLOADED is non-nil, the article should be undownloaded.
 If UNSEEN is non-nil, the article should be unseen as well as unread.
 Returns the article selected or nil if there are no matching articles."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (cond
    ;; Empty summary.
    ((null gnus-newsgroup-data)
@@ -7588,7 +7588,7 @@ If N is negative, go to the previous N'th subject line.
 If UNREAD is non-nil, only unread articles are selected.
 The difference between N and the actual number of steps taken is
 returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (let ((backward (< n 0))
        (n (abs n)))
     (while (and (> n 0)
@@ -7607,18 +7607,18 @@ returned."
 
 (defun gnus-summary-next-unread-subject (n)
   "Go to next N'th unread summary line."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-next-subject n t))
 
 (defun gnus-summary-prev-subject (n &optional unread)
   "Go to previous N'th summary line.
 If optional argument UNREAD is non-nil, only unread article is selected."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-next-subject (- n) unread))
 
 (defun gnus-summary-prev-unread-subject (n)
   "Go to previous N'th unread summary line."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-next-subject (- n) t))
 
 (defun gnus-summary-goto-subjects (articles)
@@ -7632,7 +7632,7 @@ If optional argument UNREAD is non-nil, only unread 
article is selected."
 (defun gnus-summary-goto-subject (article &optional force silent)
   "Go to the subject line of ARTICLE.
 If FORCE, also allow jumping to articles not currently shown."
-  (command gnus-summary-mode "nArticle number: ")
+  (interactive "nArticle number: " gnus-summary-mode)
   (unless (numberp article)
     (error "Article %s is not a number" article))
   (let ((b (point))
@@ -7662,7 +7662,7 @@ If FORCE, also allow jumping to articles not currently 
shown."
 (defun gnus-summary-expand-window (&optional arg)
   "Make the summary buffer take up the entire Emacs frame.
 Given a prefix, will force an `article' buffer configuration."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (if arg
       (gnus-configure-windows 'article 'force)
     (gnus-configure-windows 'summary 'force)))
@@ -7745,7 +7745,7 @@ be displayed."
 
 (defun gnus-summary-force-verify-and-decrypt ()
   "Display buttons for signed/encrypted parts and verify/decrypt them."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((mm-verify-option 'known)
        (mm-decrypt-option 'known)
        (gnus-article-emulate-mime t)
@@ -7759,7 +7759,7 @@ be displayed."
 If UNREAD, only unread articles are selected.
 If SUBJECT, only articles with SUBJECT are selected.
 If BACKWARD, the previous article is selected instead of the next."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   ;; Make sure we are in the summary buffer.
   (unless (derived-mode-p 'gnus-summary-mode)
     (set-buffer gnus-summary-buffer))
@@ -7871,7 +7871,7 @@ If BACKWARD, the previous article is selected instead of 
the next."
 
 (defun gnus-summary-next-unread-article ()
   "Select unread article after current one."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-next-article
    (or (not (eq gnus-summary-goto-unread 'never))
        (gnus-summary-last-article-p (gnus-summary-article-number)))
@@ -7881,12 +7881,12 @@ If BACKWARD, the previous article is selected instead 
of the next."
 (defun gnus-summary-prev-article (&optional unread subject)
   "Select the article before the current one.
 If UNREAD is non-nil, only unread articles are selected."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-next-article unread subject t))
 
 (defun gnus-summary-prev-unread-article ()
   "Select unread article before current one."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-prev-article
    (or (not (eq gnus-summary-goto-unread 'never))
        (gnus-summary-first-article-p (gnus-summary-article-number)))
@@ -7907,7 +7907,7 @@ article.
 If STOP is non-nil, just stop when reaching the end of the message.
 
 Also see the variable `gnus-article-skip-boring'."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-set-global-variables)
   (let ((article (gnus-summary-article-number))
        (article-window (get-buffer-window gnus-article-buffer t))
@@ -7952,7 +7952,7 @@ Also see the variable `gnus-article-skip-boring'."
 Argument LINES specifies lines to be scrolled down.
 If MOVE, move to the previous unread article if point is at
 the beginning of the buffer."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((article (gnus-summary-article-number))
        (article-window (get-buffer-window gnus-article-buffer t))
        endp)
@@ -7982,14 +7982,14 @@ the beginning of the buffer."
   "Show previous page of selected article.
 Argument LINES specifies lines to be scrolled down.
 If at the beginning of the article, go to the next article."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-prev-page lines t))
 
 (defun gnus-summary-scroll-up (lines)
   "Scroll up (or down) one line current article.
 Argument LINES specifies lines to be scrolled up (or down if negative).
 If no article is selected, then the current article will be selected first."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-configure-windows 'article)
   (gnus-summary-show-thread)
   (when (eq (gnus-summary-select-article nil nil 'pseudo) 'old)
@@ -8006,33 +8006,33 @@ If no article is selected, then the current article 
will be selected first."
   "Scroll down (or up) one line current article.
 Argument LINES specifies lines to be scrolled down (or up if negative).
 If no article is selected, then the current article will be selected first."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-scroll-up (- lines)))
 
 (defun gnus-summary-next-same-subject ()
   "Select next article which has the same subject as current one."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-next-article nil (gnus-summary-article-subject)))
 
 (defun gnus-summary-prev-same-subject ()
   "Select previous article which has the same subject as current one."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-prev-article nil (gnus-summary-article-subject)))
 
 (defun gnus-summary-next-unread-same-subject ()
   "Select next unread article which has the same subject as current one."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-next-article t (gnus-summary-article-subject)))
 
 (defun gnus-summary-prev-unread-same-subject ()
   "Select previous unread article which has the same subject as current one."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-prev-article t (gnus-summary-article-subject)))
 
 (defun gnus-summary-first-unread-article ()
   "Select the first unread article.
 Return nil if there are no unread articles."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (when (gnus-summary-first-subject t)
        (gnus-summary-show-thread)
@@ -8043,7 +8043,7 @@ Return nil if there are no unread articles."
 (defun gnus-summary-first-unread-subject ()
   "Place the point on the subject line of the first unread article.
 Return nil if there are no unread articles."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (when (gnus-summary-first-subject t)
        (gnus-summary-show-thread)
@@ -8052,7 +8052,7 @@ Return nil if there are no unread articles."
 
 (defun gnus-summary-next-unseen-article (&optional backward)
   "Select the next unseen article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let* ((article (gnus-summary-article-number))
         (articles (gnus-data-find-list article (gnus-data-list backward))))
     (when (or (not gnus-summary-check-current)
@@ -8073,13 +8073,13 @@ Return nil if there are no unread articles."
 
 (defun gnus-summary-prev-unseen-article ()
   "Select the previous unseen article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-next-unseen-article t))
 
 (defun gnus-summary-first-unseen-subject ()
   "Place the point on the subject line of the first unseen article.
 Return nil if there are no unseen articles."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (when (gnus-summary-first-subject nil nil t)
        (gnus-summary-show-thread)
@@ -8090,7 +8090,7 @@ Return nil if there are no unseen articles."
   "Place the point on the subject line of the first unseen and unread article.
 If all article have been seen, on the subject line of the first unread
 article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (unless (when (gnus-summary-first-subject nil nil t)
                (gnus-summary-show-thread)
@@ -8103,7 +8103,7 @@ article."
 (defun gnus-summary-first-article ()
   "Select the first article.
 Return nil if there are no articles."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (when (gnus-summary-first-subject)
        (gnus-summary-show-thread)
@@ -8115,7 +8115,7 @@ Return nil if there are no articles."
   "Select the unread article with the highest score.
 If given a prefix argument, select the next unread article that has a
 score higher than the default score."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((article (if arg
                     (gnus-summary-better-unread-subject)
                   (gnus-summary-best-unread-subject))))
@@ -8125,7 +8125,7 @@ score higher than the default score."
 
 (defun gnus-summary-best-unread-subject ()
   "Select the unread subject with the highest score."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((best -1000000)
        (data gnus-newsgroup-data)
        article score)
@@ -8144,7 +8144,7 @@ score higher than the default score."
 
 (defun gnus-summary-better-unread-subject ()
   "Select the first unread subject that has a score over the default score."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((data gnus-newsgroup-data)
        article)
     (while (and (setq article (gnus-data-number (car data)))
@@ -8168,13 +8168,12 @@ score higher than the default score."
 If ALL-HEADERS is non-nil, no header lines are hidden.
 If FORCE, go to the article even if it isn't displayed.  If FORCE
 is a number, it is the line the article is to be displayed on."
-  (command gnus-summary-mode
+  (interactive
    (list
-    (gnus-completing-read
-     "Article number or Message-ID"
-     (mapcar #'int-to-string gnus-newsgroup-limit))
-    current-prefix-arg
-    t))
+    (gnus-completing-read "Article number or Message-ID"
+                         (mapcar #'int-to-string gnus-newsgroup-limit))
+    current-prefix-arg t)
+   gnus-summary-mode)
   (prog1
       (if (and (stringp article)
               (string-match "@\\|%40" article))
@@ -8188,7 +8187,7 @@ is a number, it is the line the article is to be 
displayed on."
 
 (defun gnus-summary-goto-last-article ()
   "Go to the previously read article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (when gnus-last-article
        (gnus-summary-goto-article gnus-last-article nil t))
@@ -8197,7 +8196,7 @@ is a number, it is the line the article is to be 
displayed on."
 (defun gnus-summary-pop-article (number)
   "Pop one article off the history and go to the previous.
 NUMBER articles will be popped off."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (let (to)
     (setq gnus-newsgroup-history
          (cdr (setq to (nthcdr number gnus-newsgroup-history))))
@@ -8211,7 +8210,7 @@ NUMBER articles will be popped off."
 (defun gnus-summary-limit-to-articles (n)
   "Limit the summary buffer to the next N articles.
 If not given a prefix, use the process marked articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (prog1
       (let ((articles (gnus-summary-work-articles n)))
        (setq gnus-newsgroup-processable nil)
@@ -8221,7 +8220,7 @@ If not given a prefix, use the process marked articles 
instead."
 (defun gnus-summary-pop-limit (&optional total)
   "Restore the previous limit.
 If given a prefix, remove all limits."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (when total
     (setq gnus-newsgroup-limits
          (list (mapcar #'mail-header-number gnus-newsgroup-headers))))
@@ -8234,11 +8233,12 @@ If given a prefix, remove all limits."
 (defun gnus-summary-limit-to-subject (subject &optional header not-matching)
   "Limit the summary buffer to articles that have subjects that match a regexp.
 If NOT-MATCHING, excluding articles that have subjects that match a regexp."
-  (command gnus-summary-mode
-   (list (read-string (if current-prefix-arg
-                         "Exclude subject (regexp): "
-                       "Limit to subject (regexp): "))
-        nil current-prefix-arg))
+  (interactive
+   (list
+    (read-string
+     (if current-prefix-arg "Exclude subject (regexp): " "Limit to subject 
(regexp): "))
+    nil current-prefix-arg)
+   gnus-summary-mode)
   (unless header
     (setq header "subject"))
   (when (not (equal "" subject))
@@ -8254,19 +8254,26 @@ If NOT-MATCHING, excluding articles that have subjects 
that match a regexp."
 (defun gnus-summary-limit-to-author (from &optional not-matching)
   "Limit the summary buffer to articles that have authors that match a regexp.
 If NOT-MATCHING, excluding articles that have authors that match a regexp."
-  (command gnus-summary-mode
-   (list (let* ((header (gnus-summary-article-header))
-               (default (and header (car (mail-header-parse-address
-                                          (mail-header-from header))))))
-          (read-string (concat (if current-prefix-arg
-                                   "Exclude author (regexp"
-                                 "Limit to author (regexp")
-                               (if default
-                                   (concat ", default \"" default "\"): ")
-                                 "): "))
-                       nil nil
-                       default))
-        current-prefix-arg))
+  (interactive
+   (list
+    (let*
+       ((header
+         (gnus-summary-article-header))
+        (default
+          (and header
+               (car
+                (mail-header-parse-address
+                 (mail-header-from header))))))
+      (read-string
+       (concat
+       (if current-prefix-arg
+           "Exclude author (regexp" "Limit to author (regexp")
+       (if default
+           (concat ", default \"" default "\"): ")
+         "): "))
+       nil nil default))
+    current-prefix-arg)
+   gnus-summary-mode)
   (gnus-summary-limit-to-subject from "from" not-matching))
 
 (defun gnus-summary-limit-to-recipient (recipient &optional not-matching)
@@ -8277,10 +8284,13 @@ If NOT-MATCHING, exclude RECIPIENT.
 To and Cc headers are checked.  You need to include them in
 `nnmail-extra-headers'."
   ;; Unlike `rmail-summary-by-recipients', doesn't include From.
-  (command gnus-summary-mode
-   (list (read-string (format "%s recipient (regexp): "
-                             (if current-prefix-arg "Exclude" "Limit to")))
-        current-prefix-arg))
+  (interactive
+   (list
+    (read-string
+     (format "%s recipient (regexp): "
+            (if current-prefix-arg "Exclude" "Limit to")))
+    current-prefix-arg)
+   gnus-summary-mode)
   (when (not (equal "" recipient))
     (prog1 (let* ((to
                   (if (memq 'To nnmail-extra-headers)
@@ -8319,10 +8329,13 @@ If NOT-MATCHING, exclude ADDRESS.
 
 To, Cc and From headers are checked.  You need to include `To' and `Cc'
 in `nnmail-extra-headers'."
-  (command gnus-summary-mode
-   (list (read-string (format "%s address (regexp): "
-                             (if current-prefix-arg "Exclude" "Limit to")))
-        current-prefix-arg))
+  (interactive
+   (list
+    (read-string
+     (format "%s address (regexp): "
+            (if current-prefix-arg "Exclude" "Limit to")))
+    current-prefix-arg)
+   gnus-summary-mode)
   (when (not (equal "" address))
     (prog1 (let* ((to
                   (if (memq 'To nnmail-extra-headers)
@@ -8390,7 +8403,7 @@ articles."
   "Limit the summary buffer to articles that are older than (or equal) AGE 
days.
 If YOUNGER-P (the prefix) is non-nil, limit the summary buffer to
 articles that are younger than AGE days."
-  (command gnus-summary-mode
+  (interactive
    (let ((younger current-prefix-arg)
         (days-got nil)
         days)
@@ -8409,7 +8422,8 @@ articles that are younger than AGE days."
               (setq days (* days -1))))
         (message "Please enter a number.")
         (sleep-for 1)))
-     (list days younger)))
+     (list days younger))
+   gnus-summary-mode)
   (prog1
       (let ((data gnus-newsgroup-data)
            (cutoff (days-to-time age))
@@ -8429,21 +8443,22 @@ articles that are younger than AGE days."
 
 (defun gnus-summary-limit-to-extra (header regexp &optional not-matching)
   "Limit the summary buffer to articles that match an `extra' header."
-  (command gnus-summary-mode
+  (interactive
    (let ((header
          (intern
           (gnus-completing-read
-           (if current-prefix-arg
-               "Exclude extra header"
-             "Limit extra header")
+           (if current-prefix-arg "Exclude extra header" "Limit extra header")
            (mapcar #'symbol-name gnus-extra-headers)
            t nil nil
-            (symbol-name (car gnus-extra-headers))))))
+           (symbol-name
+            (car gnus-extra-headers))))))
      (list header
-          (read-string (format "%s header %s (regexp): "
-                               (if current-prefix-arg "Exclude" "Limit to")
-                               header))
-          current-prefix-arg)))
+          (read-string
+           (format "%s header %s (regexp): "
+                   (if current-prefix-arg "Exclude" "Limit to")
+                   header))
+          current-prefix-arg))
+   gnus-summary-mode)
   (when (not (equal "" regexp))
     (prog1
        (let ((articles (gnus-summary-find-matching
@@ -8456,7 +8471,7 @@ articles that are younger than AGE days."
 
 (defun gnus-summary-limit-to-display-predicate ()
   "Limit the summary buffer to the predicated in the `display' group 
parameter."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (unless gnus-newsgroup-display
     (error "There is no `display' group parameter"))
   (let (articles)
@@ -8469,7 +8484,7 @@ articles that are younger than AGE days."
 (defun gnus-summary-limit-to-unread (&optional all)
   "Limit the summary buffer to articles that are not marked as read.
 If ALL is non-nil, limit strictly to unread articles."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (if all
       (gnus-summary-limit-to-marks (char-to-string gnus-unread-mark))
     (gnus-summary-limit-to-marks
@@ -8485,7 +8500,7 @@ If ALL is non-nil, limit strictly to unread articles."
 (defun gnus-summary-limit-to-headers (match &optional reverse)
   "Limit the summary buffer to articles that have headers that match MATCH.
 If REVERSE (the prefix), limit to articles that don't match."
-  (command gnus-summary-mode "sMatch headers (regexp): \nP")
+  (interactive "sMatch headers (regexp): \nP" gnus-summary-mode)
   (gnus-summary-limit-to-bodies match reverse t))
 
 (declare-function article-goto-body "gnus-art" ())
@@ -8493,7 +8508,7 @@ If REVERSE (the prefix), limit to articles that don't 
match."
 (defun gnus-summary-limit-to-bodies (match &optional reverse headersp)
   "Limit the summary buffer to articles that have bodies that match MATCH.
 If REVERSE (the prefix), limit to articles that don't match."
-  (command gnus-summary-mode "sMatch body (regexp): \nP")
+  (interactive "sMatch body (regexp): \nP" gnus-summary-mode)
   (let ((articles nil)
        (gnus-select-article-hook nil)  ;Disable hook.
        (gnus-article-prepare-hook nil)
@@ -8526,7 +8541,7 @@ If REVERSE (the prefix), limit to articles that don't 
match."
 (defun gnus-summary-limit-to-singletons (&optional threadsp)
   "Limit the summary buffer to articles that aren't part on any thread.
 If THREADSP (the prefix), limit to articles that are in threads."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((articles nil)
        thread-articles
        threads)
@@ -8550,7 +8565,7 @@ If THREADSP (the prefix), limit to articles that are in 
threads."
 (defun gnus-summary-limit-to-replied (&optional unreplied)
   "Limit the summary buffer to replied articles.
 If UNREPLIED (the prefix), limit to unreplied articles."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (if unreplied
       (gnus-summary-limit
        (gnus-set-difference gnus-newsgroup-articles
@@ -8563,7 +8578,7 @@ If UNREPLIED (the prefix), limit to unreplied articles."
 If REVERSE, limit the summary buffer to articles that are marked
 with MARKS.  MARKS can either be a string of marks or a list of marks.
 Returns how many articles were removed."
-  (command gnus-summary-mode "sMarks: ")
+  (interactive "sMarks: " gnus-summary-mode)
   (gnus-summary-limit-to-marks marks t))
 
 (defun gnus-summary-limit-to-marks (marks &optional reverse)
@@ -8572,7 +8587,7 @@ If REVERSE (the prefix), limit the summary buffer to 
articles that are
 not marked with MARKS.  MARKS can either be a string of marks or a
 list of marks.
 Returns how many articles were removed."
-  (command gnus-summary-mode "sMarks: \nP")
+  (interactive "sMarks: \nP" gnus-summary-mode)
   (prog1
       (let ((data gnus-newsgroup-data)
            (marks (if (listp marks) marks
@@ -8591,10 +8606,13 @@ Returns how many articles were removed."
 
 With a prefix argument, limit to articles with score at or below
 SCORE."
-  (command gnus-summary-mode (list (string-to-number
-                      (read-string
-                       (format "Limit to articles with score of at %s: "
-                               (if current-prefix-arg "most" "least"))))))
+  (interactive
+   (list
+    (string-to-number
+     (read-string
+      (format "Limit to articles with score of at %s: "
+             (if current-prefix-arg "most" "least")))))
+   gnus-summary-mode)
   (let ((data gnus-newsgroup-data)
         (compare (if (or below current-prefix-arg) #'<= #'>=))
         articles)
@@ -8610,7 +8628,7 @@ SCORE."
 
 (defun gnus-summary-limit-to-unseen ()
   "Limit to unseen articles."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (gnus-summary-limit gnus-newsgroup-unseen)
     (gnus-summary-position-point)))
@@ -8620,8 +8638,12 @@ SCORE."
 When called interactively, ID is the Message-ID of the current
 article.  If thread-only is non-nil limit the summary buffer to
 these articles."
-  (command gnus-summary-mode (list (mail-header-id 
(gnus-summary-article-header))
-                    current-prefix-arg))
+  (interactive
+   (list
+    (mail-header-id
+     (gnus-summary-article-header))
+    current-prefix-arg)
+   gnus-summary-mode)
   (let ((articles (gnus-articles-in-thread
                   (gnus-id-to-thread (gnus-root-id id))))
        ;;we REALLY want the whole thread---this prevents cut-threads
@@ -8647,8 +8669,11 @@ these articles."
 
 (defun gnus-summary-limit-include-matching-articles (header regexp)
   "Display all the hidden articles that have HEADERs that match REGEXP."
-  (command gnus-summary-mode (list (read-string "Match on header: ")
-                    (read-string "Regexp: ")))
+  (interactive
+   (list
+    (read-string "Match on header: ")
+    (read-string "Regexp: "))
+   gnus-summary-mode)
   (let ((articles (gnus-find-matching-articles header regexp)))
     (prog1
        (gnus-summary-limit (nconc articles gnus-newsgroup-limit))
@@ -8656,7 +8681,7 @@ these articles."
 
 (defun gnus-summary-insert-dormant-articles ()
   "Insert all the dormant articles for this group into the current buffer."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((gnus-verbose (max 6 gnus-verbose)))
     (if (not gnus-newsgroup-dormant)
        (gnus-message 3 "No dormant articles for this group")
@@ -8664,7 +8689,7 @@ these articles."
 
 (defun gnus-summary-insert-ticked-articles ()
   "Insert ticked articles for this group into the current buffer."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((gnus-verbose (max 6 gnus-verbose)))
     (if (not gnus-newsgroup-marked)
        (gnus-message 3 "No ticked articles for this group")
@@ -8674,7 +8699,7 @@ these articles."
   "Display all the hidden articles that are marked as dormant.
 Note that this command only works on a subset of the articles currently
 fetched for this group."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (unless gnus-newsgroup-dormant
     (error "There are no dormant articles in this group"))
   (prog1
@@ -8697,14 +8722,14 @@ fetched for this group."
 
 (defun gnus-summary-limit-exclude-dormant ()
   "Hide all dormant articles."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (prog1
       (gnus-summary-limit-to-marks (list gnus-dormant-mark) 'reverse)
     (gnus-summary-position-point)))
 
 (defun gnus-summary-limit-exclude-childless-dormant ()
   "Hide all dormant articles that have no children."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((data (gnus-data-list t))
        articles d children)
     ;; Find all articles that are either not dormant or have
@@ -8729,7 +8754,7 @@ fetched for this group."
 (defun gnus-summary-limit-mark-excluded-as-read (&optional all)
   "Mark all unread excluded articles as read.
 If ALL, mark even excluded ticked and dormants as read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (setq gnus-newsgroup-limit (sort gnus-newsgroup-limit #'<))
   (let ((articles (gnus-sorted-ndifference
                   (sort
@@ -8968,7 +8993,7 @@ fetch-old-headers verbiage, and so on."
   "Refer parent article N times.
 If N is negative, go to ancestor -N instead.
 The difference between N and the number of articles fetched is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (let ((skip 1)
        error header ref)
     (when (not (natnump n))
@@ -9010,7 +9035,7 @@ The difference between N and the number of articles 
fetched is returned."
 (defun gnus-summary-refer-references ()
   "Fetch all articles mentioned in the References header.
 Return the number of articles fetched."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((ref (mail-header-references (gnus-summary-article-header)))
        (current (gnus-summary-article-number))
        (n 0))
@@ -9053,7 +9078,7 @@ has the reverse meaning.  If no backend-specific 
`request-thread'
 function is available fetch LIMIT (the numerical prefix) old
 headers.  If LIMIT is non-numeric or nil fetch the number
 specified by the `gnus-refer-thread-limit' variable."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let* ((header (gnus-summary-article-header))
         (id (mail-header-id header))
         (gnus-inhibit-demon t)
@@ -9108,7 +9133,7 @@ specified by the `gnus-refer-thread-limit' variable."
 
 (defun gnus-summary-open-group-with-article (message-id)
   "Open a group containing the article with the given MESSAGE-ID."
-  (command gnus-summary-mode "sMessage-ID: ")
+  (interactive "sMessage-ID: " gnus-summary-mode)
   (require 'nndoc)
   (with-temp-buffer
     ;; Prepare a dummy article
@@ -9143,7 +9168,7 @@ specified by the `gnus-refer-thread-limit' variable."
 
 (defun gnus-summary-refer-article (message-id)
   "Fetch an article specified by MESSAGE-ID."
-  (command gnus-summary-mode "sMessage-ID: ")
+  (interactive "sMessage-ID: " gnus-summary-mode)
   (when (and (stringp message-id)
             (not (zerop (length message-id))))
     (setq message-id (replace-regexp-in-string " " "" message-id))
@@ -9216,12 +9241,12 @@ specified by the `gnus-refer-thread-limit' variable."
 
 (defun gnus-summary-edit-parameters ()
   "Edit the group parameters of the current group."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-group-edit-group gnus-newsgroup-name 'params))
 
 (defun gnus-summary-customize-parameters ()
   "Customize the group parameters of the current group."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-group-customize gnus-newsgroup-name))
 
 (defun gnus-summary-enter-digest-group (&optional force)
@@ -9231,7 +9256,7 @@ what the document format is.
 
 To control what happens when you exit the group, see the
 `gnus-auto-select-on-ephemeral-exit' variable."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((conf gnus-current-window-configuration))
     (save-window-excursion
       (save-excursion
@@ -9316,7 +9341,7 @@ To control what happens when you exit the group, see the
 This will allow you to read digests and other similar
 documents as newsgroups.
 Obeys the standard process/prefix convention."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let* ((ogroup gnus-newsgroup-name)
         (params (append (gnus-info-params (gnus-get-info ogroup))
                         (list (cons 'to-group ogroup))))
@@ -9365,7 +9390,7 @@ Obeys the standard process/prefix convention."
 (defun gnus-summary-button-forward (arg)
   "Move point to the next field or button in the article.
 With optional ARG, move across that many fields."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-select-article)
   (gnus-configure-windows 'article)
   (let ((win (or (gnus-get-buffer-window gnus-article-buffer t)
@@ -9379,7 +9404,7 @@ With optional ARG, move across that many fields."
 (defun gnus-summary-button-backward (arg)
   "Move point to the previous field or button in the article.
 With optional ARG, move across that many fields."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-select-article)
   (gnus-configure-windows 'article)
   (let ((win (or (gnus-get-buffer-window gnus-article-buffer t)
@@ -9436,7 +9461,7 @@ If only one link is found, browse that directly, 
otherwise use
 completion to select a link.  The first link marked in the
 article text with `gnus-collect-urls-primary-text' is the
 default."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let (urls target)
     (gnus-summary-select-article)
     (gnus-with-article-buffer
@@ -9461,7 +9486,7 @@ default."
 (defun gnus-summary-isearch-article (&optional regexp-p)
   "Do incremental search forward on the current article.
 If REGEXP-P (the prefix) is non-nil, do regexp isearch."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-select-article)
   (gnus-configure-windows 'article)
   (gnus-eval-in-buffer-window gnus-article-buffer
@@ -9471,14 +9496,14 @@ If REGEXP-P (the prefix) is non-nil, do regexp isearch."
 
 (defun gnus-summary-repeat-search-article-forward ()
   "Repeat the previous search forwards."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (unless gnus-last-search-regexp
     (error "No previous search"))
   (gnus-summary-search-article-forward gnus-last-search-regexp))
 
 (defun gnus-summary-repeat-search-article-backward ()
   "Repeat the previous search backwards."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (unless gnus-last-search-regexp
     (error "No previous search"))
   (gnus-summary-search-article-forward gnus-last-search-regexp t))
@@ -9486,14 +9511,16 @@ If REGEXP-P (the prefix) is non-nil, do regexp isearch."
 (defun gnus-summary-search-article-forward (regexp &optional backward)
   "Search for an article containing REGEXP forward.
 If BACKWARD, search backward instead."
-  (command gnus-summary-mode
-   (list (read-string
-         (format "Search article %s (regexp%s): "
-                 (if current-prefix-arg "backward" "forward")
-                 (if gnus-last-search-regexp
-                     (concat ", default " gnus-last-search-regexp)
-                   "")))
-        current-prefix-arg))
+  (interactive
+   (list
+    (read-string
+     (format "Search article %s (regexp%s): "
+            (if current-prefix-arg "backward" "forward")
+            (if gnus-last-search-regexp
+                (concat ", default " gnus-last-search-regexp)
+              "")))
+    current-prefix-arg)
+   gnus-summary-mode)
   (if (string-equal regexp "")
       (setq regexp (or gnus-last-search-regexp ""))
     (setq gnus-last-search-regexp regexp)
@@ -9507,12 +9534,14 @@ If BACKWARD, search backward instead."
 
 (defun gnus-summary-search-article-backward (regexp)
   "Search for an article containing REGEXP backward."
-  (command gnus-summary-mode
-   (list (read-string
-         (format "Search article backward (regexp%s): "
-                 (if gnus-last-search-regexp
-                     (concat ", default " gnus-last-search-regexp)
-                   "")))))
+  (interactive
+   (list
+    (read-string
+     (format "Search article backward (regexp%s): "
+            (if gnus-last-search-regexp
+                (concat ", default " gnus-last-search-regexp)
+              ""))))
+   gnus-summary-mode)
   (gnus-summary-search-article-forward regexp 'backward))
 
 (defun gnus-summary-search-article (regexp &optional backward)
@@ -9646,19 +9675,21 @@ that not match REGEXP on HEADER."
   "Search forward for an article whose HEADER matches REGEXP and execute 
COMMAND.
 If HEADER is an empty string (or nil), the match is done on the entire
 article.  If BACKWARD (the prefix) is non-nil, search backward instead."
-  (command gnus-summary-mode
-   (list (let ((completion-ignore-case t))
-          (gnus-completing-read
-           "Header name"
-           (mapcar #'symbol-name
-                   (append
-                    '(Number Subject From Lines Date
-                      Message-ID Xref References Body)
-                    gnus-extra-headers))
-           'require-match))
-        (read-string "Regexp: ")
-        (read-key-sequence "Command: ")
-        current-prefix-arg))
+  (interactive
+   (list
+    (let ((completion-ignore-case t))
+      (gnus-completing-read
+       "Header name"
+       (mapcar #'symbol-name
+              (append
+               '(Number Subject From Lines Date Message-ID
+                        Xref References Body)
+               gnus-extra-headers))
+       'require-match))
+    (read-string "Regexp: ")
+    (read-key-sequence "Command: ")
+    current-prefix-arg)
+   gnus-summary-mode)
   (when (equal header "Body")
     (setq header ""))
   ;; Hidden thread subtrees must be searched as well.
@@ -9682,7 +9713,7 @@ article.  If BACKWARD (the prefix) is non-nil, search 
backward instead."
 
 (defun gnus-summary-beginning-of-article ()
   "Scroll the article back to the beginning."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-select-article)
   (gnus-configure-windows 'article)
   (gnus-eval-in-buffer-window gnus-article-buffer
@@ -9693,7 +9724,7 @@ article.  If BACKWARD (the prefix) is non-nil, search 
backward instead."
 
 (defun gnus-summary-end-of-article ()
   "Scroll to the end of the article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-select-article)
   (gnus-configure-windows 'article)
   (gnus-eval-in-buffer-window gnus-article-buffer
@@ -9726,7 +9757,9 @@ If the optional first argument FILENAME is nil, send the 
image to the
 printer.  If FILENAME is a string, save the PostScript image in a file with
 that name.  If FILENAME is a number, prompt the user for the name of the file
 to save in."
-  (command gnus-summary-mode (list (ps-print-preprint current-prefix-arg)))
+  (interactive
+   (list (ps-print-preprint current-prefix-arg))
+   gnus-summary-mode)
   (dolist (article (gnus-summary-work-articles n))
     (gnus-summary-select-article nil nil 'pseudo article)
     (gnus-eval-in-buffer-window gnus-article-buffer
@@ -9766,7 +9799,7 @@ to save in."
   "Show a complete version of the current article.
 This is only useful if you're looking at a partial version of the
 article currently."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((gnus-keep-backlog nil)
        (gnus-use-cache nil)
        (gnus-agent nil)
@@ -9793,7 +9826,7 @@ If ARG (the prefix) is non-nil and not a number, show the 
article,
 but without running any of the article treatment functions
 article.  Normally, the keystroke is `C-u g'.  When using `C-u
 C-u g', show the raw article."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (cond
    ((numberp arg)
     (gnus-summary-show-article t)
@@ -9869,14 +9902,14 @@ C-u g', show the raw article."
 
 (defun gnus-summary-show-raw-article ()
   "Show the raw article without any article massaging functions being run."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-show-article t))
 
 (defun gnus-summary-verbose-headers (&optional arg)
   "Toggle permanent full header display.
 If ARG is a positive number, turn header display on.
 If ARG is a negative number, turn header display off."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (setq gnus-show-all-headers
        (cond ((or (not (numberp arg))
                   (zerop arg))
@@ -9895,7 +9928,7 @@ If ARG is a negative number, turn header display off."
   "Show the headers if they are hidden, or hide them if they are shown.
 If ARG is a positive number, show the entire header.
 If ARG is a negative number, hide the unwanted header lines."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((window (and (gnus-buffer-live-p gnus-article-buffer)
                     (get-buffer-window gnus-article-buffer t))))
     (with-current-buffer gnus-article-buffer
@@ -9941,14 +9974,14 @@ If ARG is a negative number, hide the unwanted header 
lines."
 
 (defun gnus-summary-show-all-headers ()
   "Make all header lines visible."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-toggle-header 1))
 
 (defun gnus-summary-caesar-message (&optional arg)
   "Caesar rotate the current article by 13.
 With a non-numerical prefix, also rotate headers.  A numerical
 prefix specifies how many places to rotate each letter forward."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-select-article)
   (let ((mail-header-separator ""))
     (gnus-eval-in-buffer-window gnus-article-buffer
@@ -9971,7 +10004,7 @@ invalid IDNA string (`xn--bar' is invalid).
 
 You must have GNU Libidn (URL `https://www.gnu.org/software/libidn/')
 installed for this command to work."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-select-article)
   (let ((mail-header-separator ""))
     (gnus-eval-in-buffer-window gnus-article-buffer
@@ -9985,7 +10018,7 @@ installed for this command to work."
 
 (defun gnus-summary-morse-message (&optional _arg)
   "Morse decode the current article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-select-article)
   (let ((mail-header-separator ""))
     (gnus-eval-in-buffer-window gnus-article-buffer
@@ -10006,7 +10039,7 @@ installed for this command to work."
 
 (defun gnus-summary-stop-page-breaking ()
   "Stop page breaking in the current article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-select-article)
   (gnus-eval-in-buffer-window gnus-article-buffer
     (widen)
@@ -10036,7 +10069,7 @@ newsgroup that you want to move to have to support the 
`request-move'
 and `request-accept' functions.
 
 ACTION can be either `move' (the default), `crosspost' or `copy'."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (unless action
     (setq action 'move))
   ;; Check whether the source group supports the required functions.
@@ -10342,13 +10375,13 @@ ACTION can be either `move' (the default), 
`crosspost' or `copy'."
 (defun gnus-summary-copy-article (&optional n to-newsgroup select-method)
   "Copy the current article to some other group.
 Arguments have the same meanings as in `gnus-summary-move-article'."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-move-article n to-newsgroup select-method 'copy))
 
 (defun gnus-summary-crosspost-article (&optional n)
   "Crosspost the current article to some other group.
 Arguments have the same meanings as in `gnus-summary-move-article'."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-move-article n nil nil 'crosspost))
 
 (defcustom gnus-summary-respool-default-method nil
@@ -10371,7 +10404,7 @@ Respooling can be done both from mail groups and 
\"real\" newsgroups.
 In the former case, the articles in question will be moved from the
 current group into whatever groups they are destined to.  In the
 latter case, they will be copied into the relevant groups."
-  (command gnus-summary-mode
+  (interactive
    (list current-prefix-arg
         (let* ((methods (mapcar #'car (gnus-methods-using 'respool)))
                (methname
@@ -10392,7 +10425,8 @@ latter case, they will be copied into the relevant 
groups."
            (t
             (let ((ms-alist (mapcar (lambda (m) (cons (cadr m) m)) ms)))
               (cdr (assoc (gnus-completing-read "Server name" ms-alist t)
-                          ms-alist))))))))
+                          ms-alist)))))))
+   gnus-summary-mode)
   (unless method
     (error "No method given for respooling"))
   (if (assoc (symbol-name
@@ -10403,7 +10437,7 @@ latter case, they will be copied into the relevant 
groups."
 
 (defun gnus-summary-import-article (file &optional edit)
   "Import an arbitrary file into a mail newsgroup."
-  (command gnus-summary-mode "fImport file: \nP")
+  (interactive "fImport file: \nP" gnus-summary-mode)
   (let ((group gnus-newsgroup-name)
        atts lines group-art)
     (unless (gnus-check-backend-function 'request-accept-article group)
@@ -10447,7 +10481,7 @@ latter case, they will be copied into the relevant 
groups."
 
 (defun gnus-summary-create-article ()
   "Create an article in a mail newsgroup."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((group gnus-newsgroup-name)
        (now (current-time))
        group-art)
@@ -10471,7 +10505,7 @@ latter case, they will be copied into the relevant 
groups."
 (defun gnus-summary-article-posted-p ()
   "Say whether the current (mail) article is available from news as well.
 This will be the case if the article has both been mailed and posted."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((id (mail-header-references (gnus-summary-article-header)))
        (gnus-override-method (car (gnus-refer-article-methods))))
     (if (gnus-request-head id "")
@@ -10483,7 +10517,7 @@ This will be the case if the article has both been 
mailed and posted."
 
 (defun gnus-summary-expire-articles (&optional now)
   "Expire all articles that are marked as expirable in the current group."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (when (and (not gnus-group-is-exiting-without-update-p)
             (gnus-check-backend-function
              'request-expire-articles gnus-newsgroup-name))
@@ -10552,7 +10586,7 @@ This will be the case if the article has both been 
mailed and posted."
   "Expunge all expirable articles in the current group.
 This means that *all* articles that are marked as expirable will be
 deleted forever, right now."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (or gnus-expert-user
       (gnus-yes-or-no-p
        "Are you really, really sure you want to delete all expirable messages? 
")
@@ -10572,7 +10606,7 @@ delete these instead.
 
 If `gnus-novice-user' is non-nil you will be asked for
 confirmation before the articles are deleted."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (unless (gnus-check-backend-function 'request-expire-articles
                                       gnus-newsgroup-name)
     (error "The current newsgroup does not support article deletion"))
@@ -10622,7 +10656,7 @@ If ARG is 2, edit the raw articles even in read-only 
groups.
 If ARG is 3, edit the articles with the current handles.
 Otherwise, allow editing of articles even in read-only
 groups."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let (force raw current-handles)
     (cond
      ((null arg))
@@ -10702,7 +10736,7 @@ groups."
 (defun gnus-summary-edit-article-done (&optional references read-only buffer
                                                 no-highlight)
   "Make edits to the current article permanent."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (save-excursion
     ;; The buffer restriction contains the entire article if it exists.
     (when (article-goto-body)
@@ -10786,11 +10820,12 @@ groups."
 
 (defun gnus-summary-edit-wash (key)
   "Perform editing command KEY in the article buffer."
-  (command gnus-summary-mode
+  (interactive
    (list
     (progn
       (message "%s" (concat (this-command-keys) "- "))
-      (read-char))))
+      (read-char)))
+   gnus-summary-mode)
   (message "")
   (gnus-summary-edit-article)
   (execute-kbd-macro (concat (this-command-keys) key))
@@ -10803,7 +10838,7 @@ groups."
 
 (defun gnus-summary-respool-query (&optional silent trace)
   "Query where the respool algorithm would put this article."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let (gnus-mark-article-hook)
     (gnus-summary-select-article)
     (with-current-buffer gnus-original-article-buffer
@@ -10833,7 +10868,7 @@ groups."
 (defun gnus-summary-respool-trace ()
   "Trace where the respool algorithm would put this article.
 Display a buffer showing all fancy splitting patterns which matched."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-respool-query nil t))
 
 ;; Summary marking commands.
@@ -10842,7 +10877,7 @@ Display a buffer showing all fancy splitting patterns 
which matched."
   "Mark articles which has the same subject as read, and then select the next.
 If UNMARK is positive, remove any kind of mark.
 If UNMARK is negative, tick articles."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (when unmark
     (setq unmark (prefix-numeric-value unmark)))
   (let ((count
@@ -10860,7 +10895,7 @@ If UNMARK is negative, tick articles."
   "Mark articles which has the same subject as read.
 If UNMARK is positive, remove any kind of mark.
 If UNMARK is negative, tick articles."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (when unmark
     (setq unmark (prefix-numeric-value unmark)))
   (let ((count
@@ -10910,7 +10945,7 @@ If optional argument UNMARK is negative, mark articles 
as unread instead."
 If N is negative, mark backward instead.  If UNMARK is non-nil, remove
 the process mark instead.  The difference between N and the actual
 number of articles marked is returned."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (if (and (null n) (and transient-mark-mode mark-active))
       (gnus-uu-mark-region (region-beginning) (region-end) unmark)
     (setq n (prefix-numeric-value n))
@@ -10934,12 +10969,12 @@ number of articles marked is returned."
   "Remove the process mark from the next N articles.
 If N is negative, unmark backward instead.  The difference between N and
 the actual number of articles unmarked is returned."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-mark-as-processable n t))
 
 (defun gnus-summary-unmark-all-processable ()
   "Remove the process mark from all articles."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (save-excursion
     (while gnus-newsgroup-processable
       (gnus-summary-remove-process-mark (car gnus-newsgroup-processable))))
@@ -10963,20 +10998,21 @@ the actual number of articles unmarked is returned."
   "Mark N articles forward as expirable.
 If N is negative, mark backward instead.  The difference between N and
 the actual number of articles marked is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward n gnus-expirable-mark))
 
 (defun gnus-summary-mark-as-spam (n)
   "Mark N articles forward as spam.
 If N is negative, mark backward instead.  The difference between N and
 the actual number of articles marked is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward n gnus-spam-mark))
 
 (defun gnus-summary-mark-article-as-replied (article)
   "Mark ARTICLE as replied to and update the summary line.
 ARTICLE can also be a list of articles."
-  (command gnus-summary-mode (list (gnus-summary-article-number)))
+  (interactive (list (gnus-summary-article-number))
+              gnus-summary-mode)
   (let ((articles (if (listp article) article (list article))))
     (dolist (article articles)
       (unless (numberp article)
@@ -10998,7 +11034,8 @@ ARTICLE can also be a list of articles."
 
 (defun gnus-summary-set-bookmark (article)
   "Set a bookmark in current article."
-  (command gnus-summary-mode (list (gnus-summary-article-number)))
+  (interactive (list (gnus-summary-article-number))
+              gnus-summary-mode)
   (when (or (not (get-buffer gnus-article-buffer))
            (not gnus-current-article)
            (not gnus-article-current)
@@ -11022,7 +11059,8 @@ ARTICLE can also be a list of articles."
 
 (defun gnus-summary-remove-bookmark (article)
   "Remove the bookmark from the current article."
-  (command gnus-summary-mode (list (gnus-summary-article-number)))
+  (interactive (list (gnus-summary-article-number))
+              gnus-summary-mode)
   ;; Remove old bookmark, if one exists.
   (if (not (assq article gnus-newsgroup-bookmarks))
       (gnus-message 6 "No bookmark in current article.")
@@ -11034,7 +11072,7 @@ ARTICLE can also be a list of articles."
   "Mark N articles forward as dormant.
 If N is negative, mark backward instead.  The difference between N and
 the actual number of articles marked is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward n gnus-dormant-mark))
 
 (defun gnus-summary-set-process-mark (article)
@@ -11069,7 +11107,7 @@ If N is negative, mark backwards instead.  Mark with 
MARK, ?r by default.
 The difference between N and the actual number of articles marked is
 returned.
 If NO-EXPIRE, auto-expiry will be inhibited."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-show-thread)
   (let ((backward (< n 0))
        (gnus-summary-goto-unread
@@ -11333,20 +11371,20 @@ If NO-EXPIRE, auto-expiry will be inhibited."
   "Tick N articles forwards.
 If N is negative, tick backwards instead.
 The difference between N and the number of articles ticked is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward n gnus-ticked-mark))
 
 (defun gnus-summary-tick-article-backward (n)
   "Tick N articles backwards.
 The difference between N and the number of articles ticked is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward (- n) gnus-ticked-mark))
 
 (defun gnus-summary-tick-article (&optional article clear-mark)
   "Mark current article as unread.
 Optional 1st argument ARTICLE specifies article number to be marked as unread.
 Optional 2nd argument CLEAR-MARK remove any kinds of mark."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-mark-article article (if clear-mark gnus-unread-mark
                                       gnus-ticked-mark)))
 
@@ -11355,14 +11393,14 @@ Optional 2nd argument CLEAR-MARK remove any kinds of 
mark."
 If N is negative, mark backwards instead.
 The difference between N and the actual number of articles marked is
 returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward n gnus-del-mark gnus-inhibit-user-auto-expire))
 
 (defun gnus-summary-mark-as-read-backward (n)
   "Mark the N articles as read backwards.
 The difference between N and the actual number of articles marked is
 returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward
    (- n) gnus-del-mark gnus-inhibit-user-auto-expire))
 
@@ -11376,13 +11414,13 @@ MARK specifies a string to be inserted at the 
beginning of the line."
   "Clear marks from N articles forward.
 If N is negative, clear backward instead.
 The difference between N and the number of marks cleared is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward n gnus-unread-mark))
 
 (defun gnus-summary-clear-mark-backward (n)
   "Clear marks from N articles backward.
 The difference between N and the number of marks cleared is returned."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-mark-forward (- n) gnus-unread-mark))
 
 (defun gnus-summary-mark-unread-as-read ()
@@ -11415,7 +11453,7 @@ The difference between N and the number of marks 
cleared is returned."
   "Mark all unread articles between point and mark as read.
 If given a prefix, mark all articles between point and mark as read,
 even ticked and dormant ones."
-  (command gnus-summary-mode "r\nP")
+  (interactive "r\nP" gnus-summary-mode)
   (save-excursion
     (let (article)
       (goto-char point)
@@ -11432,7 +11470,7 @@ even ticked and dormant ones."
 
 (defun gnus-summary-mark-below (score mark)
   "Mark articles with score less than SCORE with MARK."
-  (command gnus-summary-mode "P\ncMark: ")
+  (interactive "P\ncMark: " gnus-summary-mode)
   (setq score (if score
                  (prefix-numeric-value score)
                (or gnus-summary-default-score 0)))
@@ -11446,22 +11484,22 @@ even ticked and dormant ones."
 
 (defun gnus-summary-kill-below (&optional score)
   "Mark articles with score below SCORE as read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-mark-below score gnus-killed-mark))
 
 (defun gnus-summary-clear-above (&optional score)
   "Clear all marks from articles with score above SCORE."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-mark-above score gnus-unread-mark))
 
 (defun gnus-summary-tick-above (&optional score)
   "Tick all articles with score above SCORE."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-mark-above score gnus-ticked-mark))
 
 (defun gnus-summary-mark-above (score mark)
   "Mark articles with score over SCORE with MARK."
-  (command gnus-summary-mode "P\ncMark: ")
+  (interactive "P\ncMark: " gnus-summary-mode)
   (setq score (if score
                  (prefix-numeric-value score)
                (or gnus-summary-default-score 0)))
@@ -11477,7 +11515,7 @@ even ticked and dormant ones."
 (defalias 'gnus-summary-show-all-expunged 'gnus-summary-limit-include-expunged)
 (defun gnus-summary-limit-include-expunged (&optional no-error)
   "Display all the hidden articles that were expunged for low scores."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((inhibit-read-only t))
     (let ((scored gnus-newsgroup-scored)
          headers h)
@@ -11514,7 +11552,7 @@ Note that this function will only catch up the unread 
article
 in the current summary buffer limitation.
 
 The number of articles marked as read is returned."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (prog1
       (save-excursion
        (when (or quietly
@@ -11563,7 +11601,7 @@ The number of articles marked as read is returned."
 (defun gnus-summary-catchup-to-here (&optional all)
   "Mark all unticked articles before the current one as read.
 If ALL is non-nil, also mark ticked and dormant articles as read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (save-excursion
     (gnus-save-hidden-threads
       (let ((beg (point)))
@@ -11575,7 +11613,7 @@ If ALL is non-nil, also mark ticked and dormant 
articles as read."
 (defun gnus-summary-catchup-from-here (&optional all)
   "Mark all unticked articles after (and including) the current one as read.
 If ALL is non-nil, also mark ticked and dormant articles as read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (save-excursion
     (gnus-save-hidden-threads
       (let ((beg (point)))
@@ -11588,14 +11626,14 @@ If ALL is non-nil, also mark ticked and dormant 
articles as read."
   "Mark all articles in this newsgroup as read.
 This command is dangerous.  Normally, you want \\[gnus-summary-catchup]
 instead, which marks only unread articles as read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-catchup t quietly))
 
 (defun gnus-summary-catchup-and-exit (&optional all quietly)
   "Mark all unread articles in this group as read, then exit.
 If prefix argument ALL is non-nil, all articles are marked as read.
 If QUIETLY is non-nil, no questions will be asked."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (when (gnus-summary-catchup all quietly nil 'fast)
     ;; Select next newsgroup or exit.
     (if (and (not (gnus-group-quit-config gnus-newsgroup-name))
@@ -11607,14 +11645,14 @@ If QUIETLY is non-nil, no questions will be asked."
   "Mark all articles in this newsgroup as read, and then exit.
 This command is dangerous.  Normally, you want 
\\[gnus-summary-catchup-and-exit]
 instead, which marks only unread articles as read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-catchup-and-exit t quietly))
 
 (defun gnus-summary-catchup-and-goto-next-group (&optional all)
   "Mark all articles in this group as read and select the next group.
 If given a prefix, mark all articles, unread as well as ticked, as
 read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (save-excursion
     (gnus-summary-catchup all))
   (gnus-summary-next-group))
@@ -11623,7 +11661,7 @@ read."
   "Mark all articles in this group as read and select the previous group.
 If given a prefix, mark all articles, unread as well as ticked, as
 read."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (save-excursion
     (gnus-summary-catchup all))
   (gnus-summary-next-group nil nil t))
@@ -11699,7 +11737,7 @@ with that article."
 
 (defun gnus-summary-rethread-current ()
   "Rethread the thread the current article is part of."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let* ((gnus-show-threads t)
         (article (gnus-summary-article-number))
         (id (mail-header-id (gnus-summary-article-header)))
@@ -11714,7 +11752,7 @@ with that article."
 
 Note that the re-threading will only work if `gnus-thread-ignore-subject'
 is non-nil or the Subject: of both articles are the same."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (unless (not (gnus-group-read-only-p))
     (error "The current newsgroup does not support article editing"))
   (unless (<= (length gnus-newsgroup-processable) 1)
@@ -11733,9 +11771,10 @@ is non-nil or the Subject: of both articles are the 
same."
   "Make PARENT the parent of CHILDREN.
 When called interactively, PARENT is the current article and CHILDREN
 are the process-marked articles."
-  (command gnus-summary-mode
-   (list (gnus-summary-article-number)
-        (gnus-summary-work-articles nil)))
+  (interactive (list
+               (gnus-summary-article-number)
+               (gnus-summary-work-articles nil))
+              gnus-summary-mode)
   (dolist (child children)
     (save-window-excursion
       (let ((gnus-article-buffer " *reparent*"))
@@ -11768,7 +11807,7 @@ are the process-marked articles."
 (defun gnus-summary-toggle-threads (&optional arg)
   "Toggle showing conversation threads.
 If ARG is positive number, turn showing conversation threads on."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (let ((current (or (gnus-summary-article-number) gnus-newsgroup-end)))
     (setq gnus-show-threads
          (if (null arg) (not gnus-show-threads)
@@ -11780,7 +11819,7 @@ If ARG is positive number, turn showing conversation 
threads on."
 
 (defun gnus-summary-show-all-threads ()
   "Show all threads."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (remove-overlays (point-min) (point-max) 'invisible 'gnus-sum)
   (gnus-summary-position-point))
 
@@ -11790,7 +11829,7 @@ If ARG is positive number, turn showing conversation 
threads on."
 (defun gnus-summary-show-thread ()
   "Show thread subtrees.
 Returns nil if no thread was there to be shown."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let* ((orig (point))
         (end (point-at-eol))
          (end (or (gnus-summary--inv end) (gnus-summary--inv (1- end))))
@@ -11831,7 +11870,7 @@ Returns nil if no thread was there to be shown."
   "Hide all thread subtrees.
 If PREDICATE is supplied, threads that satisfy this predicate
 will not be hidden."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (save-excursion
     (goto-char (point-min))
     (let ((end nil)
@@ -11850,7 +11889,7 @@ will not be hidden."
 (defun gnus-summary-hide-thread ()
   "Hide thread subtrees.
 Returns nil if no threads were there to be hidden."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (beginning-of-line)
   (let ((start (point))
        (starteol (line-end-position))
@@ -11902,7 +11941,7 @@ Returns the difference between N and the number of 
skips actually
 done.
 
 If SILENT, don't output messages."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (let ((backward (< n 0))
        (n (abs n)))
     (while (and (> n 0)
@@ -11918,7 +11957,7 @@ If SILENT, don't output messages."
   "Go to the same level previous N'th thread.
 Returns the difference between N and the number of skips actually
 done."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-next-thread (- n)))
 
 (defun gnus-summary-go-down-thread ()
@@ -11938,7 +11977,7 @@ done."
 If N is negative, go up instead.
 Returns the difference between N and how many steps down that were
 taken."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (let ((up (< n 0))
        (n (abs n)))
     (while (and (> n 0)
@@ -11955,18 +11994,18 @@ taken."
 If N is negative, go down instead.
 Returns the difference between N and how many steps down that were
 taken."
-  (command gnus-summary-mode "p")
+  (interactive "p" gnus-summary-mode)
   (gnus-summary-down-thread (- n)))
 
 (defun gnus-summary-top-thread ()
   "Go to the top of the thread."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (while (gnus-summary-go-up-thread))
   (gnus-summary-article-number))
 
 (defun gnus-summary-expire-thread ()
   "Mark articles under current thread as expired."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (gnus-summary-kill-thread 0))
 
 (defun gnus-summary-kill-thread (&optional unmark)
@@ -11974,7 +12013,7 @@ taken."
 If the prefix argument is positive, remove any kinds of marks.
 If the prefix argument is zero, mark thread as expired.
 If the prefix argument is negative, tick articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (when unmark
     (setq unmark (prefix-numeric-value unmark)))
   (let ((articles (gnus-summary-articles-in-thread))
@@ -12009,82 +12048,82 @@ If the prefix argument is negative, tick articles 
instead."
 (defun gnus-summary-sort-by-number (&optional reverse)
   "Sort the summary buffer by article number.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'number reverse))
 
 (defun gnus-summary-sort-by-most-recent-number (&optional reverse)
   "Sort the summary buffer by most recent article number.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'most-recent-number reverse))
 
 (defun gnus-summary-sort-by-random (&optional reverse)
   "Randomize the order in the summary buffer.
 Argument REVERSE means to randomize in reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'random reverse))
 
 (defun gnus-summary-sort-by-author (&optional reverse)
   "Sort the summary buffer by author name alphabetically.
 If `case-fold-search' is non-nil, case of letters is ignored.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'author reverse))
 
 (defun gnus-summary-sort-by-recipient (&optional reverse)
   "Sort the summary buffer by recipient name alphabetically.
 If `case-fold-search' is non-nil, case of letters is ignored.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'recipient reverse))
 
 (defun gnus-summary-sort-by-subject (&optional reverse)
   "Sort the summary buffer by subject alphabetically.  `Re:'s are ignored.
 If `case-fold-search' is non-nil, case of letters is ignored.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'subject reverse))
 
 (defun gnus-summary-sort-by-date (&optional reverse)
   "Sort the summary buffer by date.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'date reverse))
 
 (defun gnus-summary-sort-by-most-recent-date (&optional reverse)
   "Sort the summary buffer by most recent date.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'most-recent-date reverse))
 
 (defun gnus-summary-sort-by-score (&optional reverse)
   "Sort the summary buffer by score.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'score reverse))
 
 (defun gnus-summary-sort-by-lines (&optional reverse)
   "Sort the summary buffer by the number of lines.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'lines reverse))
 
 (defun gnus-summary-sort-by-chars (&optional reverse)
   "Sort the summary buffer by article length.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'chars reverse))
 
 (defun gnus-summary-sort-by-marks (&optional reverse)
   "Sort the summary buffer by article marks.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (gnus-summary-sort 'marks reverse))
 
 (defun gnus-summary-sort-by-original (&optional _reverse)
   "Sort the summary buffer using the default sorting method.
 Argument REVERSE means reverse order."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let* ((inhibit-read-only t)
         (gnus-summary-prepare-hook nil))
     ;; We do the sorting by regenerating the threads.
@@ -12133,7 +12172,7 @@ will not be marked as saved.
 
 The `gnus-prompt-before-saving' variable says how prompting is
 performed."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let* ((articles (gnus-summary-work-articles n))
         (save-buffer (save-excursion
@@ -12202,7 +12241,7 @@ is neither omitted nor the symbol `r', force including 
all headers
 regardless of the `:headers' property.  If it is the symbol `r',
 articles that are not decoded and include all headers will be piped
 no matter what the properties `:decode' and `:headers' are."
-  (command gnus-summary-mode (gnus-interactive "P\ny"))
+  (interactive (gnus-interactive "P\ny") gnus-summary-mode)
   (require 'gnus-art)
   (let* ((articles (gnus-summary-work-articles n))
         (result-buffer shell-command-buffer-name)
@@ -12254,7 +12293,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-in-mail))
     (gnus-summary-save-article arg)))
@@ -12265,7 +12304,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-in-rmail))
     (gnus-summary-save-article arg)))
@@ -12276,7 +12315,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-in-file))
     (gnus-summary-save-article arg)))
@@ -12287,7 +12326,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-write-to-file))
     (gnus-summary-save-article arg)))
@@ -12298,7 +12337,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-body-in-file))
     (gnus-summary-save-article arg)))
@@ -12309,7 +12348,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-write-body-to-file))
     (gnus-summary-save-article arg)))
@@ -12320,14 +12359,14 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-pipe-to-muttprint))
     (gnus-summary-save-article arg t)))
 
 (defun gnus-summary-pipe-message (program)
   "Pipe the current article through PROGRAM."
-  (command gnus-summary-mode "sProgram: ")
+  (interactive "sProgram: " gnus-summary-mode)
   (gnus-summary-select-article)
   (let ((mail-header-separator ""))
     (gnus-eval-in-buffer-window gnus-article-buffer
@@ -12431,7 +12470,7 @@ save those articles instead."
 (defun gnus-summary-save-parts (type dir n &optional reverse)
   "Save parts matching TYPE to DIR.
 If REVERSE, save parts that do not match TYPE."
-  (command gnus-summary-mode
+  (interactive
    (list (completing-read "Save parts of type: "
                          (progn
                            (gnus-summary-select-article nil t)
@@ -12445,7 +12484,8 @@ If REVERSE, save parts that do not match TYPE."
               (read-directory-name "Save to directory: "
                                     gnus-summary-save-parts-last-directory
                                     nil t))
-        current-prefix-arg))
+        current-prefix-arg)
+   gnus-summary-mode)
   (gnus-summary-iterate n
     (let ((gnus-display-mime-function nil)
          gnus-article-prepare-hook
@@ -12584,12 +12624,12 @@ If REVERSE, save parts that do not match TYPE."
 
 (defun gnus-summary-edit-global-kill (article)
   "Edit the \"global\" kill file."
-  (command gnus-summary-mode (list (gnus-summary-article-number)))
+  (interactive (list (gnus-summary-article-number)) gnus-summary-mode)
   (gnus-group-edit-global-kill article))
 
 (defun gnus-summary-edit-local-kill ()
   "Edit a local kill file applied to the current newsgroup."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (setq gnus-current-headers (gnus-summary-article-header))
   (gnus-group-edit-local-kill
    (gnus-summary-article-number) gnus-newsgroup-name))
@@ -12887,7 +12927,7 @@ UNREAD is a sorted list."
   "Display the current article buffer fully MIME-buttonized.
 If SHOW-ALL-PARTS (the prefix) is non-nil, all multipart/* parts are
 treated as multipart/mixed."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-unbuttonized-mime-types nil)
        (gnus-mime-display-multipart-as-mixed show-all-parts))
@@ -12895,7 +12935,7 @@ treated as multipart/mixed."
 
 (defun gnus-summary-repair-multipart (article)
   "Add a Content-Type header to a multipart article without one."
-  (command gnus-summary-mode (list (gnus-summary-article-number)))
+  (interactive (list (gnus-summary-article-number)) gnus-summary-mode)
   (gnus-with-article article
     (message-narrow-to-head)
     (message-remove-header "Mime-Version")
@@ -12915,7 +12955,7 @@ treated as multipart/mixed."
 
 (defun gnus-summary-toggle-display-buttonized ()
   "Toggle the buttonizing of the article buffer."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (require 'gnus-art)
   (if (setq gnus-inhibit-mime-unbuttonizing
            (not gnus-inhibit-mime-unbuttonizing))
@@ -12970,7 +13010,7 @@ If N is negative, move in reverse order.
 The difference between N and the actual number of articles marked is
 returned."
        name (cadr lway))
-     (command gnus-summary-mode "p")
+     (interactive "p" gnus-summary-mode)
      (gnus-summary-generic-mark n ,mark ',(nth 2 lway) ,(nth 3 lway))))
 
 (defun gnus-summary-generic-mark (n mark move unread)
@@ -13053,7 +13093,7 @@ returned."
   "Insert all old articles in this group.
 If ALL is non-nil, already read articles become readable.
 If ALL is a number, fetch this number of articles."
-  (command gnus-summary-mode "P")
+  (interactive "P" gnus-summary-mode)
   (prog1
       (let ((old (sort (mapcar #'gnus-data-number gnus-newsgroup-data) #'<))
            older len)
@@ -13127,7 +13167,7 @@ If ALL is a number, fetch this number of articles."
 
 (defun gnus-summary-insert-new-articles ()
   "Insert all new articles in this group."
-  (command gnus-summary-mode)
+  (interactive nil gnus-summary-mode)
   (let ((old (sort (mapcar #'gnus-data-number gnus-newsgroup-data) #'<))
        (old-high gnus-newsgroup-highest)
        (nnmail-fetched-sources (list t))
diff --git a/lisp/gnus/gnus-topic.el b/lisp/gnus/gnus-topic.el
index 7882087..eee15a5 100644
--- a/lisp/gnus/gnus-topic.el
+++ b/lisp/gnus/gnus-topic.el
@@ -145,9 +145,9 @@ See Info node `(gnus)Formatting Variables'."
 
 (defun gnus-topic-jump-to-topic (topic)
   "Go to TOPIC."
-  (command
-   gnus-group-mode
-   (list (gnus-completing-read "Go to topic" (gnus-topic-list) t)))
+  (interactive
+   (list (gnus-completing-read "Go to topic" (gnus-topic-list) t))
+   gnus-group-mode)
   (let ((inhibit-read-only t))
     (dolist (topic (gnus-current-topics topic))
       (unless (gnus-topic-goto-topic topic)
@@ -236,12 +236,12 @@ If RECURSIVE is t, return groups in its subtopics too."
 
 (defun gnus-topic-goto-previous-topic (n)
   "Go to the N'th previous topic."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (gnus-topic-goto-next-topic (- n)))
 
 (defun gnus-topic-goto-next-topic (n)
   "Go to the N'th next topic."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (let ((backward (< n 0))
        (n (abs n))
        (topic (gnus-current-topic)))
@@ -1173,7 +1173,7 @@ articles in the group.  If ALL is a negative number, 
fetch this
 number of the earliest articles in the group.
 
 If performed over a topic line, toggle folding the topic."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when (and (eobp) (not (gnus-group-group-name)))
     (forward-line -1))
   (if (gnus-group-topic-p)
@@ -1185,13 +1185,13 @@ If performed over a topic line, toggle folding the 
topic."
 
 (defun gnus-mouse-pick-topic (e)
   "Select the group or topic under the mouse pointer."
-  (command gnus-group-mode "e")
+  (interactive "e" gnus-group-mode)
   (mouse-set-point e)
   (gnus-topic-read-group nil))
 
 (defun gnus-topic-expire-articles (topic)
   "Expire articles in this topic or group."
-  (command gnus-group-mode (list (gnus-group-topic-name)))
+  (interactive (list (gnus-group-topic-name)) gnus-group-mode)
   (if (not topic)
       (call-interactively 'gnus-group-expire-articles)
     (save-excursion
@@ -1206,7 +1206,7 @@ If performed over a topic line, toggle folding the topic."
 (defun gnus-topic-catchup-articles (topic)
   "Catchup this topic or group.
 Also see `gnus-group-catchup'."
-  (command gnus-group-mode (list (gnus-group-topic-name)))
+  (interactive (list (gnus-group-topic-name)) gnus-group-mode)
   (if (not topic)
       (call-interactively 'gnus-group-catchup-current)
     (save-excursion
@@ -1233,7 +1233,7 @@ be auto-selected upon group entry.  If GROUP is non-nil, 
fetch
 that group.
 
 If performed over a topic line, toggle folding the topic."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when (and (eobp) (not (gnus-group-group-name)))
     (forward-line -1))
   (if (gnus-group-topic-p)
@@ -1245,11 +1245,11 @@ If performed over a topic line, toggle folding the 
topic."
 (defun gnus-topic-create-topic (topic parent &optional previous full-topic)
   "Create a new TOPIC under PARENT.
 When used interactively, PARENT will be the topic under point."
-  (command
-   gnus-group-mode
+  (interactive
    (list
     (read-string "New topic: ")
-    (gnus-current-topic)))
+    (gnus-current-topic))
+   gnus-group-mode)
   ;; Check whether this topic already exists.
   (when (gnus-topic-find-topology topic)
     (error "Topic already exists"))
@@ -1283,11 +1283,11 @@ When used interactively, PARENT will be the topic under 
point."
 (defun gnus-topic-move-group (n topic &optional copyp)
   "Move the next N groups to TOPIC.
 If COPYP, copy the groups instead."
-  (command
-   gnus-group-mode
+  (interactive
    (list current-prefix-arg
         (gnus-completing-read "Move to topic" (mapcar #'car gnus-topic-alist) t
-                              nil 'gnus-topic-history)))
+                              nil 'gnus-topic-history))
+   gnus-group-mode)
   (let ((use-marked (and (not n) (not (and transient-mark-mode mark-active))
                         gnus-group-marked t))
        (groups (gnus-group-process-prefix n))
@@ -1312,7 +1312,7 @@ If COPYP, copy the groups instead."
 
 (defun gnus-topic-remove-group (&optional n)
   "Remove the current group from the topic."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (let ((use-marked (and (not n) (not (and transient-mark-mode mark-active))
                         gnus-group-marked t))
        (groups (gnus-group-process-prefix n)))
@@ -1331,16 +1331,16 @@ If COPYP, copy the groups instead."
 
 (defun gnus-topic-copy-group (n topic)
   "Copy the current group to a topic."
-  (command
-   gnus-group-mode
+  (interactive
    (list current-prefix-arg
         (gnus-completing-read
-         "Copy to topic" (mapcar #'car gnus-topic-alist) t)))
+         "Copy to topic" (mapcar #'car gnus-topic-alist) t))
+   gnus-group-mode)
   (gnus-topic-move-group n topic t))
 
 (defun gnus-topic-kill-group (&optional n discard)
   "Kill the next N groups."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (if (gnus-group-topic-p)
       (let ((topic (gnus-group-topic-name)))
        (push (cons
@@ -1360,7 +1360,7 @@ If COPYP, copy the groups instead."
 
 (defun gnus-topic-yank-group (&optional arg)
   "Yank the last topic."
-  (command gnus-group-mode "p")
+  (interactive "p" gnus-group-mode)
   (if gnus-topic-killed-topics
       (let* ((previous
              (or (gnus-group-topic-name)
@@ -1409,7 +1409,7 @@ If COPYP, copy the groups instead."
 (defun gnus-topic-hide-topic (&optional permanent)
   "Hide the current topic.
 If PERMANENT, make it stay hidden in subsequent sessions as well."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when (gnus-current-topic)
     (gnus-topic-goto-topic (gnus-current-topic))
     (if permanent
@@ -1422,7 +1422,7 @@ If PERMANENT, make it stay hidden in subsequent sessions 
as well."
 (defun gnus-topic-show-topic (&optional permanent)
   "Show the hidden topic.
 If PERMANENT, make it stay shown in subsequent sessions as well."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when (gnus-group-topic-p)
     (if (not permanent)
        (gnus-topic-remove-topic t nil)
@@ -1437,11 +1437,11 @@ If PERMANENT, make it stay shown in subsequent sessions 
as well."
 (defun gnus-topic-mark-topic (topic &optional unmark non-recursive)
   "Mark all groups in the TOPIC with the process mark.
 If NON-RECURSIVE (which is the prefix) is t, don't mark its subtopics."
-  (command
-   gnus-group-mode
+  (interactive
    (list (gnus-group-topic-name)
         nil
-        (and current-prefix-arg t)))
+        (and current-prefix-arg t))
+   gnus-group-mode)
   (if (not topic)
       (call-interactively 'gnus-group-mark-group)
     (save-excursion
@@ -1454,17 +1454,17 @@ If NON-RECURSIVE (which is the prefix) is t, don't mark 
its subtopics."
 (defun gnus-topic-unmark-topic (topic &optional _dummy non-recursive)
   "Remove the process mark from all groups in the TOPIC.
 If NON-RECURSIVE (which is the prefix) is t, don't unmark its subtopics."
-  (command gnus-group-mode
-          (list (gnus-group-topic-name)
-                nil
-                (and current-prefix-arg t)))
+  (interactive (list (gnus-group-topic-name)
+                    nil
+                    (and current-prefix-arg t))
+              gnus-group-mode)
   (if (not topic)
       (call-interactively 'gnus-group-unmark-group)
     (gnus-topic-mark-topic topic t non-recursive)))
 
 (defun gnus-topic-get-new-news-this-topic (&optional n)
   "Check for new news in the current topic."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (if (not (gnus-group-topic-p))
       (gnus-group-get-new-news-this-group n)
     (let* ((topic (gnus-group-topic-name))
@@ -1476,31 +1476,31 @@ If NON-RECURSIVE (which is the prefix) is t, don't 
unmark its subtopics."
 
 (defun gnus-topic-move-matching (regexp topic &optional copyp)
   "Move all groups that match REGEXP to some topic."
-  (command
-   gnus-group-mode
+  (interactive
    (let (topic)
      (nreverse
       (list
        (setq topic (gnus-completing-read "Move to topic"
                                          (mapcar #'car gnus-topic-alist) t))
-       (read-string (format "Move to %s (regexp): " topic))))))
+       (read-string (format "Move to %s (regexp): " topic)))))
+   gnus-group-mode)
   (gnus-group-mark-regexp regexp)
   (gnus-topic-move-group nil topic copyp))
 
 (defun gnus-topic-copy-matching (regexp topic &optional _copyp)
   "Copy all groups that match REGEXP to some topic."
-  (command
-   gnus-group-mode
+  (interactive
    (let ((topic (gnus-completing-read "Copy to topic"
                                       (mapcar #'car gnus-topic-alist) t)))
      (nreverse
       (list topic
-            (read-string (format "Copy to %s (regexp): " topic))))))
+            (read-string (format "Copy to %s (regexp): " topic)))))
+   gnus-group-mode)
   (gnus-topic-move-matching regexp topic t))
 
 (defun gnus-topic-delete (topic)
   "Delete a topic."
-  (command gnus-group-mode (list (gnus-group-topic-name)))
+  (interactive (list (gnus-group-topic-name)) gnus-group-mode)
   (unless topic
     (error "No topic to be deleted"))
   (let ((entry (assoc topic gnus-topic-alist))
@@ -1518,11 +1518,11 @@ If NON-RECURSIVE (which is the prefix) is t, don't 
unmark its subtopics."
 
 (defun gnus-topic-rename (old-name new-name)
   "Rename a topic."
-  (command
-   gnus-group-mode
+  (interactive
    (let ((topic (gnus-current-topic)))
      (list topic
-          (read-string (format "Rename %s to: " topic) topic))))
+          (read-string (format "Rename %s to: " topic) topic)))
+   gnus-group-mode)
   ;; Check whether the new name exists.
   (when (gnus-topic-find-topology new-name)
     (error "Topic `%s' already exists" new-name))
@@ -1545,7 +1545,7 @@ If NON-RECURSIVE (which is the prefix) is t, don't unmark 
its subtopics."
 (defun gnus-topic-indent (&optional unindent)
   "Indent a topic -- make it a sub-topic of the previous topic.
 If UNINDENT, remove an indentation."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (if unindent
       (gnus-topic-unindent)
     (let* ((topic (gnus-current-topic))
@@ -1565,7 +1565,7 @@ If UNINDENT, remove an indentation."
 
 (defun gnus-topic-unindent ()
   "Unindent a topic."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (let* ((topic (gnus-current-topic))
         (parent (gnus-topic-parent-topic topic))
         (grandparent (gnus-topic-parent-topic parent)))
@@ -1584,7 +1584,7 @@ If UNINDENT, remove an indentation."
 (defun gnus-topic-list-active (&optional force)
   "List all groups that Gnus knows about in a topicsified fashion.
 If FORCE, always re-read the active file."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (when force
     (gnus-get-killed-groups))
   (gnus-topic-grok-active force)
@@ -1595,7 +1595,7 @@ If FORCE, always re-read the active file."
 
 (defun gnus-topic-toggle-display-empty-topics ()
   "Show/hide topics that have no unread articles."
-  (command gnus-group-mode)
+  (interactive nil gnus-group-mode)
   (setq gnus-topic-display-empty-topics
        (not gnus-topic-display-empty-topics))
   (gnus-group-list-groups)
@@ -1608,7 +1608,7 @@ If FORCE, always re-read the active file."
 (defun gnus-topic-edit-parameters (group)
   "Edit the group parameters of GROUP.
 If performed on a topic, edit the topic parameters instead."
-  (command gnus-group-mode (list (gnus-group-group-name)))
+  (interactive (list (gnus-group-group-name)) gnus-group-mode)
   (if group
       (gnus-group-edit-group-parameters group)
     (if (not (gnus-group-topic-p))
@@ -1652,7 +1652,8 @@ If performed on a topic, edit the topic parameters 
instead."
 (defun gnus-topic-sort-groups (func &optional reverse)
   "Sort the current topic according to FUNC.
 If REVERSE, reverse the sorting order."
-  (command gnus-group-mode (list gnus-group-sort-function current-prefix-arg))
+  (interactive (list gnus-group-sort-function current-prefix-arg)
+              gnus-group-mode)
   (let ((topic (assoc (gnus-current-topic) gnus-topic-alist)))
     (gnus-topic-sort-topic
      topic (gnus-make-sort-function func) reverse)
@@ -1661,43 +1662,43 @@ If REVERSE, reverse the sorting order."
 (defun gnus-topic-sort-groups-by-alphabet (&optional reverse)
   "Sort the current topic alphabetically by group name.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-topic-sort-groups 'gnus-group-sort-by-alphabet reverse))
 
 (defun gnus-topic-sort-groups-by-unread (&optional reverse)
   "Sort the current topic by number of unread articles.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-topic-sort-groups 'gnus-group-sort-by-unread reverse))
 
 (defun gnus-topic-sort-groups-by-level (&optional reverse)
   "Sort the current topic by group level.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-topic-sort-groups 'gnus-group-sort-by-level reverse))
 
 (defun gnus-topic-sort-groups-by-score (&optional reverse)
   "Sort the current topic by group score.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-topic-sort-groups 'gnus-group-sort-by-score reverse))
 
 (defun gnus-topic-sort-groups-by-rank (&optional reverse)
   "Sort the current topic by group rank.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-topic-sort-groups 'gnus-group-sort-by-rank reverse))
 
 (defun gnus-topic-sort-groups-by-method (&optional reverse)
   "Sort the current topic alphabetically by backend name.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-topic-sort-groups 'gnus-group-sort-by-method reverse))
 
 (defun gnus-topic-sort-groups-by-server (&optional reverse)
   "Sort the current topic alphabetically by server name.
 If REVERSE, sort in reverse order."
-  (command gnus-group-mode "P")
+  (interactive "P" gnus-group-mode)
   (gnus-topic-sort-groups 'gnus-group-sort-by-server reverse))
 
 (defun gnus-topic-sort-topics-1 (top reverse)
@@ -1714,12 +1715,12 @@ If REVERSE, sort in reverse order."
 (defun gnus-topic-sort-topics (&optional topic reverse)
   "Sort topics in TOPIC alphabetically by topic name.
 If REVERSE, reverse the sorting order."
-  (command
-   gnus-group-mode
+  (interactive
    (list (gnus-completing-read "Sort topics in"
                                (mapcar #'car gnus-topic-alist) t
                                (gnus-current-topic))
-        current-prefix-arg))
+        current-prefix-arg)
+   gnus-group-mode)
   (let ((topic-topology (or (and topic (cdr (gnus-topic-find-topology topic)))
                            gnus-topic-topology)))
     (gnus-topic-sort-topics-1 topic-topology reverse)
@@ -1729,11 +1730,11 @@ If REVERSE, reverse the sorting order."
 
 (defun gnus-topic-move (current to)
   "Move the CURRENT topic to TO."
-  (command
-   gnus-group-mode
+  (interactive
    (list
     (gnus-group-topic-name)
-    (gnus-completing-read "Move to topic" (mapcar #'car gnus-topic-alist) t)))
+    (gnus-completing-read "Move to topic" (mapcar #'car gnus-topic-alist) t))
+   gnus-group-mode)
   (unless (and current to)
     (error "Can't find topic"))
   (let ((current-top (cdr (gnus-topic-find-topology current)))
diff --git a/lisp/gnus/gnus-uu.el b/lisp/gnus/gnus-uu.el
index cf1d90d..bd9a1a3 100644
--- a/lisp/gnus/gnus-uu.el
+++ b/lisp/gnus/gnus-uu.el
@@ -355,58 +355,58 @@ didn't work, and overwrite existing files.  Otherwise, 
ask each time."
 
 (defun gnus-uu-decode-uu (&optional n)
   "Uudecodes the current article."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (gnus-uu-decode-with-method #'gnus-uu-uustrip-article n))
 
 (defun gnus-uu-decode-uu-and-save (n dir)
   "Decodes and saves the resulting file."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (file-name-as-directory
          (read-directory-name "Uudecode and save in dir: "
-                         gnus-uu-default-dir
-                         gnus-uu-default-dir t))))
+                              gnus-uu-default-dir
+                              gnus-uu-default-dir t)))
+   gnus-article-mode gnus-summary-mode)
   (gnus-uu-decode-with-method #'gnus-uu-uustrip-article n dir nil nil t))
 
 (defun gnus-uu-decode-unshar (&optional n)
   "Unshars the current article."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (gnus-uu-decode-with-method #'gnus-uu-unshar-article n nil nil 'scan t))
 
 (defun gnus-uu-decode-unshar-and-save (n dir)
   "Unshars and saves the current article."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (file-name-as-directory
          (read-directory-name "Unshar and save in dir: "
-                         gnus-uu-default-dir
-                         gnus-uu-default-dir t))))
+                              gnus-uu-default-dir
+                              gnus-uu-default-dir t)))
+   gnus-article-mode gnus-summary-mode)
   (gnus-uu-decode-with-method #'gnus-uu-unshar-article n dir nil 'scan t))
 
 (defun gnus-uu-decode-save (n file)
   "Saves the current article."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (if gnus-uu-save-separate-articles
             (read-directory-name
              "Save articles in dir: " gnus-uu-default-dir gnus-uu-default-dir)
           (read-file-name
-           "Save article in file: " gnus-uu-default-dir gnus-uu-default-dir))))
+           "Save article in file: " gnus-uu-default-dir gnus-uu-default-dir)))
+   gnus-article-mode gnus-summary-mode)
   (setq gnus-uu-saved-article-name file)
   (gnus-uu-decode-with-method #'gnus-uu-save-article n nil t))
 
 (defun gnus-uu-decode-binhex (n dir)
   "Unbinhexes the current article."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (file-name-as-directory
          (read-directory-name "Unbinhex and save in dir: "
-                         gnus-uu-default-dir
-                         gnus-uu-default-dir))))
+                              gnus-uu-default-dir
+                              gnus-uu-default-dir)))
+   gnus-article-mode gnus-summary-mode)
   (gnus-uu-initialize)
   (setq gnus-uu-binhex-article-name
        (make-temp-file (expand-file-name "binhex" gnus-uu-work-dir)))
@@ -414,70 +414,70 @@ didn't work, and overwrite existing files.  Otherwise, 
ask each time."
 
 (defun gnus-uu-decode-yenc (n dir)
   "Decode the yEnc-encoded current article."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (file-name-as-directory
          (read-directory-name "yEnc decode and save in dir: "
-                         gnus-uu-default-dir
-                         gnus-uu-default-dir))))
+                              gnus-uu-default-dir
+                              gnus-uu-default-dir)))
+   gnus-article-mode gnus-summary-mode)
   (setq gnus-uu-yenc-article-name nil)
   (gnus-uu-decode-with-method #'gnus-uu-yenc-article n dir nil t))
 
 (defun gnus-uu-decode-uu-view (&optional n)
   "Uudecodes and views the current article."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-uu n)))
 
 (defun gnus-uu-decode-uu-and-save-view (n dir)
   "Decodes, views and saves the resulting file."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (read-file-name "Uudecode, view and save in dir: "
                         gnus-uu-default-dir
-                        gnus-uu-default-dir t)))
+                        gnus-uu-default-dir t))
+   gnus-article-mode gnus-summary-mode)
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-uu-and-save n dir)))
 
 (defun gnus-uu-decode-unshar-view (&optional n)
   "Unshars and views the current article."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-unshar n)))
 
 (defun gnus-uu-decode-unshar-and-save-view (n dir)
   "Unshars and saves the current article."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (read-file-name "Unshar, view and save in dir: "
                         gnus-uu-default-dir
-                        gnus-uu-default-dir t)))
+                        gnus-uu-default-dir t))
+   gnus-article-mode gnus-summary-mode)
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-unshar-and-save n dir)))
 
 (defun gnus-uu-decode-save-view (n file)
   "Saves and views the current article."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (if gnus-uu-save-separate-articles
             (read-directory-name "Save articles in dir: "
                                  gnus-uu-default-dir gnus-uu-default-dir)
           (read-file-name "Save articles in file: "
-                          gnus-uu-default-dir gnus-uu-default-dir))))
+                          gnus-uu-default-dir gnus-uu-default-dir)))
+   gnus-article-mode gnus-summary-mode)
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-save n file)))
 
 (defun gnus-uu-decode-binhex-view (n file)
   "Unbinhexes and views the current article."
-  (command
-   (gnus-article-mode gnus-summary-mode)
+  (interactive
    (list current-prefix-arg
         (read-file-name "Unbinhex, view and save in dir: "
-                        gnus-uu-default-dir gnus-uu-default-dir)))
+                        gnus-uu-default-dir gnus-uu-default-dir))
+   gnus-article-mode gnus-summary-mode)
   (gnus-uu-initialize)
   (setq gnus-uu-binhex-article-name
        (make-temp-file (expand-file-name "binhex" gnus-uu-work-dir)))
@@ -489,7 +489,7 @@ didn't work, and overwrite existing files.  Otherwise, ask 
each time."
 
 (defun gnus-uu-digest-mail-forward (&optional n post)
   "Digests and forwards all articles in this series."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (gnus-uu-initialize)
   (let ((gnus-uu-save-in-digest t)
        (file (make-temp-file (nnheader-concat gnus-uu-work-dir "forward")))
@@ -555,7 +555,7 @@ didn't work, and overwrite existing files.  Otherwise, ask 
each time."
 
 (defun gnus-uu-digest-post-forward (&optional n)
   "Digest and forward to a newsgroup."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (gnus-uu-digest-mail-forward n t))
 
 ;; Process marking.
@@ -585,7 +585,7 @@ didn't work, and overwrite existing files.  Otherwise, ask 
each time."
   "Set the process mark on articles whose subjects match REGEXP.
 When called interactively, prompt for REGEXP.
 Optional UNMARK non-nil means unmark instead of mark."
-  (command (gnus-article-mode gnus-summary-mode) "sMark (regexp): \nP")
+  (interactive "sMark (regexp): \nP" gnus-article-mode gnus-summary-mode)
   (save-excursion
     (let* ((articles (gnus-uu-find-articles-matching regexp))
           (new-marked (gnus-new-processable unmark articles)))
@@ -599,12 +599,12 @@ Optional UNMARK non-nil means unmark instead of mark."
 (defun gnus-uu-unmark-by-regexp (regexp)
   "Remove the process mark from articles whose subjects match REGEXP.
 When called interactively, prompt for REGEXP."
-  (command (gnus-article-mode gnus-summary-mode) "sUnmark (regexp): ")
+  (interactive "sUnmark (regexp): " gnus-article-mode gnus-summary-mode)
   (gnus-uu-mark-by-regexp regexp t))
 
 (defun gnus-uu-mark-series (&optional silent)
   "Mark the current series with the process mark."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let* ((articles (gnus-uu-find-articles-matching))
         (l (length articles)))
     (while articles
@@ -617,7 +617,7 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-mark-region (beg end &optional unmark)
   "Set the process mark on all articles between point and mark."
-  (command (gnus-article-mode gnus-summary-mode) "r")
+  (interactive "r" gnus-article-mode gnus-summary-mode)
   (save-excursion
     (goto-char beg)
     (while (< (point) end)
@@ -629,22 +629,22 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-unmark-region (beg end)
   "Remove the process mark from all articles between point and mark."
-  (command (gnus-article-mode gnus-summary-mode) "r")
+  (interactive "r" gnus-article-mode gnus-summary-mode)
   (gnus-uu-mark-region beg end t))
 
 (defun gnus-uu-mark-buffer ()
   "Set the process mark on all articles in the buffer."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-uu-mark-region (point-min) (point-max)))
 
 (defun gnus-uu-unmark-buffer ()
   "Remove the process mark on all articles in the buffer."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-uu-mark-region (point-min) (point-max) t))
 
 (defun gnus-uu-mark-thread ()
   "Marks all articles downwards in this thread."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (gnus-save-hidden-threads
     (let ((level (gnus-summary-thread-level)))
       (while (and (gnus-summary-set-process-mark (gnus-summary-article-number))
@@ -655,7 +655,7 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-unmark-thread ()
   "Unmarks all articles downwards in this thread."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((level (gnus-summary-thread-level)))
     (while (and (gnus-summary-remove-process-mark
                 (gnus-summary-article-number))
@@ -665,7 +665,7 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-invert-processable ()
   "Invert the list of process-marked articles."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((data gnus-newsgroup-data)
        number)
     (save-excursion
@@ -678,7 +678,7 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-mark-over (&optional score)
   "Mark all articles with a score over SCORE (the prefix)."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (let ((score (or score gnus-summary-default-score 0))
        (data gnus-newsgroup-data))
     (save-excursion
@@ -693,7 +693,7 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-mark-sparse ()
   "Mark all series that have some articles marked."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (let ((marked (nreverse gnus-newsgroup-processable))
        subject articles total headers)
     (unless marked
@@ -717,7 +717,7 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-mark-all ()
   "Mark all articles in \"series\" order."
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (setq gnus-newsgroup-processable nil)
   (save-excursion
     (let ((data gnus-newsgroup-data)
@@ -737,33 +737,33 @@ When called interactively, prompt for REGEXP."
 
 (defun gnus-uu-decode-postscript (&optional n)
   "Gets PostScript of the current article."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (gnus-uu-decode-with-method #'gnus-uu-decode-postscript-article n))
 
 (defun gnus-uu-decode-postscript-view (&optional n)
   "Gets and views the current article."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-postscript n)))
 
 (defun gnus-uu-decode-postscript-and-save (n dir)
   "Extracts PostScript and saves the current article."
-  (command (gnus-article-mode gnus-summary-mode)
-   (list current-prefix-arg
-        (file-name-as-directory
-         (read-directory-name "Save in dir: "
-                         gnus-uu-default-dir
-                         gnus-uu-default-dir t))))
+  (interactive (list current-prefix-arg
+                    (file-name-as-directory
+                     (read-directory-name "Save in dir: "
+                                          gnus-uu-default-dir
+                                          gnus-uu-default-dir t)))
+              gnus-article-mode gnus-summary-mode)
   (gnus-uu-decode-with-method #'gnus-uu-decode-postscript-article
                              n dir nil nil t))
 
 (defun gnus-uu-decode-postscript-and-save-view (n dir)
   "Decodes, views and saves the resulting file."
-  (command (gnus-article-mode gnus-summary-mode)
-   (list current-prefix-arg
-        (read-file-name "Where do you want to save the file(s)? "
-                        gnus-uu-default-dir
-                        gnus-uu-default-dir t)))
+  (interactive (list current-prefix-arg
+                    (read-file-name "Where do you want to save the file(s)? "
+                                    gnus-uu-default-dir
+                                    gnus-uu-default-dir t))
+              gnus-article-mode gnus-summary-mode)
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-postscript-and-save n dir)))
 
diff --git a/lisp/gnus/gnus-vm.el b/lisp/gnus/gnus-vm.el
index 23a879d..ec36011 100644
--- a/lisp/gnus/gnus-vm.el
+++ b/lisp/gnus/gnus-vm.el
@@ -72,7 +72,7 @@ If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 save those articles instead."
-  (command (gnus-article-mode gnus-summary-mode) "P")
+  (interactive "P" gnus-article-mode gnus-summary-mode)
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-in-vm))
     (gnus-summary-save-article arg)))
@@ -80,7 +80,7 @@ save those articles instead."
 (declare-function vm-save-message "ext:vm-save" (folder &optional count))
 
 (defun gnus-summary-save-in-vm (&optional folder)
-  (command (gnus-article-mode gnus-summary-mode))
+  (interactive nil gnus-article-mode gnus-summary-mode)
   (require 'vm)
   (setq folder
        (gnus-read-save-file-name
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index bac1914..c94fa03 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -855,7 +855,7 @@ Currently this means either text/html or 
application/xhtml+xml."
 
 (defun eww-view-source ()
   "View the HTML source code of the current page."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let ((buf (get-buffer-create "*eww-source*"))
         (source (plist-get eww-data :source)))
     (with-current-buffer buf
@@ -881,7 +881,7 @@ Currently this means either text/html or 
application/xhtml+xml."
 
 (defun eww-toggle-paragraph-direction ()
   "Cycle the paragraph direction between left-to-right, right-to-left and 
auto."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (setq bidi-paragraph-direction
         (cond ((eq bidi-paragraph-direction 'left-to-right)
                nil)
@@ -899,7 +899,7 @@ Currently this means either text/html or 
application/xhtml+xml."
 This command uses heuristics to find the parts of the web page that
 contains the main textual portion, leaving out navigation menus and
 the like."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let* ((old-data eww-data)
         (dom (with-temp-buffer
                (insert (plist-get old-data :source))
@@ -1091,7 +1091,7 @@ instead of `browse-url-new-window-flag'."
 
 (defun eww-back-url ()
   "Go to the previously displayed page."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (when (>= eww-history-position (length eww-history))
     (user-error "No previous page"))
   (eww-save-history)
@@ -1100,7 +1100,7 @@ instead of `browse-url-new-window-flag'."
 
 (defun eww-forward-url ()
   "Go to the next displayed page."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (when (zerop eww-history-position)
     (user-error "No next page"))
   (eww-save-history)
@@ -1124,7 +1124,7 @@ instead of `browse-url-new-window-flag'."
   "Go to the page marked `next'.
 A page is marked `next' if rel=\"next\" appears in a <link>
 or <a> tag."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (if (plist-get eww-data :next)
       (eww-browse-url (shr-expand-url (plist-get eww-data :next)
                                      (plist-get eww-data :url)))
@@ -1134,7 +1134,7 @@ or <a> tag."
   "Go to the page marked `previous'.
 A page is marked `previous' if rel=\"previous\" appears in a <link>
 or <a> tag."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (if (plist-get eww-data :previous)
       (eww-browse-url (shr-expand-url (plist-get eww-data :previous)
                                      (plist-get eww-data :url)))
@@ -1144,7 +1144,7 @@ or <a> tag."
   "Go to the page marked `up'.
 A page is marked `up' if rel=\"up\" appears in a <link>
 or <a> tag."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (if (plist-get eww-data :up)
       (eww-browse-url (shr-expand-url (plist-get eww-data :up)
                                      (plist-get eww-data :url)))
@@ -1154,7 +1154,7 @@ or <a> tag."
   "Go to the page marked `top'.
 A page is marked `top' if rel=\"start\", rel=\"home\", or rel=\"contents\"
 appears in a <link> or <a> tag."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let ((best-url (or (plist-get eww-data :start)
                      (plist-get eww-data :contents)
                      (plist-get eww-data :home))))
@@ -1167,7 +1167,7 @@ appears in a <link> or <a> tag."
 If LOCAL is non-nil (interactively, the command was invoked with
 a prefix argument), don't reload the page from the network, but
 just re-display the HTML already fetched."
-  (command eww-mode "P")
+  (interactive "P" eww-mode)
   (let ((url (plist-get eww-data :url)))
     (if local
        (if (null (plist-get eww-data :dom))
@@ -1233,12 +1233,12 @@ just re-display the HTML already fetched."
 
 (defun eww-beginning-of-text ()
   "Move to the start of the input field."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (goto-char (eww-beginning-of-field)))
 
 (defun eww-end-of-text ()
   "Move to the end of the text in the input field."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (goto-char (eww-end-of-field))
   (let ((start (eww-beginning-of-field)))
     (while (and (equal (following-char) ? )
@@ -1330,7 +1330,7 @@ just re-display the HTML already fetched."
 
 (defun eww-select-file ()
   "Change the value of the upload file menu under point."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let*  ((input (get-text-property (point) 'eww-form)))
     (let ((filename
           (let ((insert-default-directory t))
@@ -1538,7 +1538,9 @@ See URL 
`https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input'.")
 
 (defun eww-change-select (event)
   "Change the value of the select drop-down menu under point."
-  (command eww-mode (list last-nonmenu-event))
+  (interactive
+   (list last-nonmenu-event)
+   eww-mode)
   (mouse-set-point event)
   (let ((input (get-text-property (point) 'eww-form)))
     (popup-menu
@@ -1573,7 +1575,7 @@ See URL 
`https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input'.")
 
 (defun eww-toggle-checkbox ()
   "Toggle the value of the checkbox under point."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let* ((input (get-text-property (point) 'eww-form))
         (type (plist-get input :type)))
     (if (equal type "checkbox")
@@ -1643,7 +1645,7 @@ See URL 
`https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input'.")
 
 (defun eww-submit ()
   "Submit the current form."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let* ((this-input (get-text-property (point) 'eww-form))
         (form (plist-get this-input :eww-form))
         values next-submit)
@@ -1730,7 +1732,7 @@ See URL 
`https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input'.")
   "Browse the current URL with an external browser.
 The browser to used is specified by the
 `browse-url-secondary-browser-function' variable."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (funcall browse-url-secondary-browser-function
            (or url (plist-get eww-data :url))))
 
@@ -1740,7 +1742,9 @@ If EXTERNAL is single prefix, browse the URL using
 `browse-url-secondary-browser-function'.
 
 If EXTERNAL is double prefix, browse in new buffer."
-  (command eww-mode (list current-prefix-arg last-nonmenu-event))
+  (interactive
+   (list current-prefix-arg last-nonmenu-event)
+   eww-mode)
   (mouse-set-point mouse-event)
   (let ((url (get-text-property (point) 'shr-url)))
     (cond
@@ -1774,14 +1778,14 @@ Differences in #targets are ignored."
 
 (defun eww-copy-page-url ()
   "Copy the URL of the current page into the kill ring."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (message "%s" (plist-get eww-data :url))
   (kill-new (plist-get eww-data :url)))
 
 (defun eww-download ()
   "Download URL to `eww-download-directory'.
 Use link at point if there is one, else the current page's URL."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let ((dir (if (stringp eww-download-directory)
                  eww-download-directory
                (funcall eww-download-directory))))
@@ -1849,14 +1853,14 @@ Use link at point if there is one, else the current 
page's URL."
 (defun eww-set-character-encoding (charset)
   "Set character encoding to CHARSET.
 If CHARSET is nil then use UTF-8."
-  (command eww-mode "zUse character set (default utf-8): ")
+  (interactive "zUse character set (default utf-8): " eww-mode)
   (if (null charset)
       (eww-reload nil 'utf-8)
     (eww-reload nil charset)))
 
 (defun eww-switch-to-buffer ()
   "Prompt for an EWW buffer to display in the selected window."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (let ((completion-extra-properties
          '(:annotation-function (lambda (buf)
                                   (with-current-buffer buf
@@ -1874,7 +1878,7 @@ If CHARSET is nil then use UTF-8."
 
 (defun eww-toggle-fonts ()
   "Toggle whether to use monospaced or font-enabled layouts."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (setq shr-use-fonts (not shr-use-fonts))
   (eww-reload)
   (message "Proportional fonts are now %s"
@@ -1882,7 +1886,7 @@ If CHARSET is nil then use UTF-8."
 
 (defun eww-toggle-colors ()
   "Toggle whether to use HTML-specified colors or not."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (message "Colors are now %s"
           (if (setq shr-use-colors (not shr-use-colors))
               "on"
@@ -1895,7 +1899,7 @@ If CHARSET is nil then use UTF-8."
 
 (defun eww-add-bookmark ()
   "Bookmark the current page."
-  (command eww-mode)
+  (interactive nil eww-mode)
   (eww-read-bookmarks)
   (dolist (bookmark eww-bookmarks)
     (when (equal (plist-get eww-data :url) (plist-get bookmark :url))
@@ -1959,7 +1963,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-bookmark-kill ()
   "Kill the current bookmark."
-  (command eww-bookmark-mode)
+  (interactive nil eww-bookmark-mode)
   (let* ((start (line-beginning-position))
         (bookmark (get-text-property start 'eww-bookmark))
         (inhibit-read-only t))
@@ -1973,7 +1977,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-bookmark-yank ()
   "Yank a previously killed bookmark to the current line."
-  (command eww-bookmark-mode)
+  (interactive nil eww-bookmark-mode)
   (unless eww-bookmark-kill-ring
     (user-error "No previously killed bookmark"))
   (beginning-of-line)
@@ -1991,7 +1995,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-bookmark-browse ()
   "Browse the bookmark under point in eww."
-  (command eww-bookmark-mode)
+  (interactive nil eww-bookmark-mode)
   (let ((bookmark (get-text-property (line-beginning-position) 'eww-bookmark)))
     (unless bookmark
       (user-error "No bookmark on the current line"))
@@ -2000,7 +2004,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-next-bookmark ()
   "Go to the next bookmark in the list."
-  (command eww-bookmark-mode)
+  (interactive nil eww-bookmark-mode)
   (let ((first nil)
        bookmark)
     (unless (get-buffer "*eww bookmarks*")
@@ -2019,7 +2023,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-previous-bookmark ()
   "Go to the previous bookmark in the list."
-  (command eww-bookmark-mode)
+  (interactive nil eww-bookmark-mode)
   (let ((first nil)
        bookmark)
     (unless (get-buffer "*eww bookmarks*")
@@ -2111,7 +2115,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-history-browse ()
   "Browse the history under point in eww."
-  (command eww-history-mode)
+  (interactive nil eww-history-mode)
   (let ((history (get-text-property (line-beginning-position) 'eww-history)))
     (unless history
       (error "No history on the current line"))
@@ -2194,7 +2198,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-buffer-select ()
   "Switch to eww buffer."
-  (command eww-buffers-mode)
+  (interactive nil eww-buffers-mode)
   (let ((buffer (get-text-property (line-beginning-position)
                                    'eww-buffer)))
     (unless buffer
@@ -2214,7 +2218,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-buffer-show-next ()
   "Move to next eww buffer in the list and display it."
-  (command eww-buffers-mode)
+  (interactive nil eww-buffers-mode)
   (forward-line)
   (when (eobp)
     (goto-char (point-min)))
@@ -2222,7 +2226,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-buffer-show-previous ()
   "Move to previous eww buffer in the list and display it."
-  (command eww-buffers-mode)
+  (interactive nil eww-buffers-mode)
   (beginning-of-line)
   (when (bobp)
     (goto-char (point-max)))
@@ -2231,7 +2235,7 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
 
 (defun eww-buffer-kill ()
   "Kill buffer from eww list."
-  (command eww-buffers-mode)
+  (interactive nil eww-buffers-mode)
   (let* ((start (line-beginning-position))
         (buffer (get-text-property start 'eww-buffer))
         (inhibit-read-only t))



reply via email to

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