Subject: 30.0.50; Interactive forms that fail to provide required arguments

From: Eshel Yaron <[email-masked]>
Date: Sat, 15 Apr 2023 19:34:58 +0300

Hi,

I've noticed that dictionary.el defines some functions with an
`interactive' form that doesn't provide their required arguments.

For example, `dictionary-new-search' must be called with at least one
argument, but when called interactively it gets called with no
arguments.  The other two such cases in dictionary.el are
`dictionary-definition' and `dictionary-switch-tooltip-mode'.

IIUC, these "commands" are never actually called interactively, and it
should be safe to simply drop the `interactive' form so they don't show
up in `M-x dictionary- TAB'.

A quick scan of the lisp/ directory of emacs.git reveals a similar issue
with the following function definitions:

calc/calc-misc.el: calc-info-goto-node
calc/calc-prog.el: calc-edit-macro-finish-edit
emacs-lisp/backtrace.el: backtrace-expand-ellipsis
emulation/edt-mapper.el: edt-map-key
gnus/gnus-kill.el: gnus-kill-file-apply-string
international/isearch-x.el: isearch-exit-recursive-edit
net/dictionary.el: dictionary-new-search
net/dictionary.el: dictionary-definition
net/dictionary.el: dictionary-switch-tooltip-mode
net/eudcb-bbdb.el: eudc-bbdb-set-server
net/eudcb-ldap.el: eudc-ldap-get-field-list
net/eudcb-mab.el: eudc-mab-set-server
net/eudcb-macos-contacts.el: eudc-macos-contacts-set-server
net/newst-backend.el: newsticker-save-item
net/newst-plainview.el: newsticker-set-auto-narrow-to-feed
net/newst-plainview.el: newsticker-set-auto-narrow-to-item
net/newst-reader.el: newsticker-browse-url-item
net/ntlm.el: ntlm-build-auth-request
net/socks.el: socks-open-connection
obsolete/eudcb-ph.el: eudc-ph-get-field-list
obsolete/html2text.el: html2text-remove-tags
obsolete/iswitchb.el: iswitchb-window-buffer-p
obsolete/landmark.el: landmark-print-distance-int
obsolete/landmark.el: landmark-print-moves
obsolete/tpu-mapper.el: tpu-map-key
org/org-colview.el: org-columns-compute
org/org-ctags.el: org-ctags-visit-buffer-or-file
org/org-keys.el: org-speed-move-safe
org/org-plot.el: org-plot/gnuplot-to-grid-data
org/org-src.el: org-src-associate-babel-session
org/org.el: org-agenda-prepare-buffers
org/org.el: org--math-always-on
progmodes/dcl-mode.el: dcl-indent-to
progmodes/ebrowse.el: ebrowse-redraw-marks
progmodes/ebrowse.el: ebrowse-view-file-other-frame
progmodes/gud.el: gud-basic-call
progmodes/idlwave.el: idlwave-display-user-catalog-widget
progmodes/opascal.el: opascal-debug-tokenize-region
progmodes/prolog.el: prolog-goto-predicate-info
progmodes/verilog-mode.el: verilog-backward-case-item
progmodes/verilog-mode.el: verilog-just-one-space
progmodes/verilog-mode.el: verilog-indent-declaration
progmodes/vhdl-mode.el: vhdl-template-array
progmodes/vhdl-mode.el: vhdl-template-if-then-use
progmodes/vhdl-mode.el: vhdl-template-record
progmodes/vhdl-mode.el: vhdl-doc-variable
textmodes/reftex-index.el: reftex-index-analyze-entry
calculator.el: calculator-saved-move
dframe.el: dframe-get-focus
filesets.el: filesets-convert-patterns
speedbar.el: speedbar-toggle-etags
treesit.el: treesit--explorer-jump
woman.el: woman-reset-emulation

Here's the code I used to perform the scan, note it assumes emacs.git is
at ~/checkouts/emacs:

(defun required-argument-p (arg)
  (not (member arg '(&optional &rest))))

(defun find-bad-interactive-declarations ()
  (interactive)
  (dolist (file (directory-files-recursively "~/checkouts/emacs/lisp"
                                             (rx ".el" eos)))
    (with-current-buffer (find-file-noselect file t t)
      (goto-char (point-min))
      (ignore-errors
        (while-let ((sexp (condition-case _
                              (read (current-buffer))
                            (end-of-file nil))))
          (pcase sexp
            (`(defun ,fun ,`(,(pred required-argument-p) . ,_)
                .
                ,(or `(,_ (interactive) . ,_)
                     `((interactive) . ,_)))
             (message "%s: %s"
                      (file-relative-name file "~/checkouts/emacs/lisp")
                      fun))))))))

Best,
Eshel

In GNU Emacs 30.0.50 (build 6, x86_64-apple-darwin22.4.0, NS
 appkit-2299.50 Version 13.3.1 (Build 22E261)) of 2023-04-15 built on
 esmac
Repository revision: 234be3d670cf04503a81f74617239f62364457ae
Repository branch: master
Windowing system distributor 'Apple', version 10.3.2299
System Description:  macOS 13.3.1

Configured using:
 'configure CFLAGS=-O3 --with-native-compilation --with-json
 --with-tree-sitter'

Configured features:
ACL DBUS GIF GLIB GMP GNUTLS JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM ZLIB

Important settings:
  value of $LC_CTYPE: UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message mailcap yank-media puny dired
dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg rfc6068
epg-config gnus-util text-property-search time-date mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs
comp comp-cstr warnings icons subr-x rx cl-seq cl-macs gv cl-extra
help-mode bytecomp byte-compile cl-lib sendmail rfc2047 rfc2045
ietf-drums mm-util mail-prsvr mail-utils rmc iso-transl tooltip cconv
eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
elisp-mode mwheel term/ns-win ns-win ucs-normalize mule-util
term/common-win tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode lisp-mode prog-mode register
page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind kqueue cocoa ns lcms2 multi-tty make-network-process
native-compile emacs)

Memory information:
((conses 16 77774 10775)
 (symbols 48 7102 0)
 (strings 32 19402 1802)
 (string-bytes 1 593314)
 (vectors 16 15917)
 (vector-slots 8 280865 12269)
 (floats 8 27 24)
 (intervals 56 223 0)
 (buffers 984 11))