all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type
@ 2024-03-22  1:22 Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-03-22  7:25 ` Eli Zaretskii
  2024-03-22 15:39 ` Andrea Corallo
  0 siblings, 2 replies; 5+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-03-22  1:22 UTC (permalink / raw)
  To: 69935

[-- Attachment #1: Type: text/plain, Size: 1530 bytes --]

Tags: patch

The patch below changes the first line of `C-h f` from something like:

    car is a built-in function in ‘C source code’.

to

    car is a primitive-function in ‘C source code’.

i.e. print the actual type rather than an English description.
The type is buttonized so users can click on it to see a description of
the type (and its super/subtypes).

Beside exposing those types (and their related information), another
advantage is that it simplifies the code since we don't need to
enumerate all the different kinds of functions we may have (well, we
still do for those "function-like objects" which don't have a dedicated
type such as macros, keymaps, aliases, keyboard macros, yadda yadda, but
a single case covers all of special forms, primitive functions,
byte-code functions, module functions, and native-compiled functions).

Any comment/objection?


        Stefan

 In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
 3.24.38, cairo version 1.16.0) of 2024-02-23 built on pastel
Repository revision: 831e094a09f70a15e4b4b83c5158dbeb8d9daede
Repository branch: work
Windowing system distributor 'The X.Org Foundation', version 11.0.12101007
System Description: Debian GNU/Linux 12 (bookworm)

Configured using:
 'configure -C --enable-checking --enable-check-lisp-object-type --with-modules --with-cairo --with-tiff=ifavailable
 'CFLAGS=-Wall -g3 -Og -Wno-pointer-sign' --without-native-compilation
 PKG_CONFIG_PATH=/home/monnier/lib/pkgconfig'


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-help-fns-function-description-header-Print-functions.patch --]
[-- Type: text/patch, Size: 5941 bytes --]

From 8169ad959bfca252fa4ef824f7ee10005f922431 Mon Sep 17 00:00:00 2001
From: Stefan Monnier <monnier@iro.umontreal.ca>
Date: Thu, 21 Mar 2024 21:08:58 -0400
Subject: [PATCH] (help-fns-function-description-header): Print functions' type

Instead of choosing English words to describe the kind of function,
use the actual type of the function object (from `cl-type-of`)
directly, and make it a button to display info about that type.

* lisp/help-fns.el (help-fns-function-description-header): Use the
function's type name in the description instead of "prose".
Use `insert` instead of `princ`, so as to preserve the text-properties
of the button.

* lisp/emacs-lisp/cl-extra.el (cl-help-type): Move to `help-mode.el`
and rename to `help-type`.
(cl--describe-class): Adjust accordingly.

* lisp/help-mode.el (help-type): New type, moved and renamed from
`cl-extra.el`.
---
 lisp/emacs-lisp/cl-extra.el | 11 +++--------
 lisp/help-fns.el            | 31 ++++++++++++++-----------------
 lisp/help-mode.el           |  5 +++++
 3 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el
index d43c21d3eb9..437dea2d6a9 100644
--- a/lisp/emacs-lisp/cl-extra.el
+++ b/lisp/emacs-lisp/cl-extra.el
@@ -720,11 +720,6 @@ cl--typedef-regexp
   (add-to-list 'find-function-regexp-alist
                '(define-type . cl--typedef-regexp)))
 
-(define-button-type 'cl-help-type
-  :supertype 'help-function-def
-  'help-function #'cl-describe-type
-  'help-echo (purecopy "mouse-2, RET: describe this type"))
-
 (define-button-type 'cl-type-definition
   :supertype 'help-function-def
   'help-echo (purecopy "mouse-2, RET: find type definition"))
@@ -777,7 +772,7 @@ cl--describe-class
     (insert (symbol-name type)
             (substitute-command-keys " is a type (of kind `"))
     (help-insert-xref-button (symbol-name metatype)
-                             'cl-help-type metatype)
+                             'help-type metatype)
     (insert (substitute-command-keys "')"))
     (when location
       (insert (substitute-command-keys " in `"))
@@ -796,7 +791,7 @@ cl--describe-class
           (setq cur (cl--class-name cur))
           (insert (substitute-quotes "`"))
           (help-insert-xref-button (symbol-name cur)
-                                   'cl-help-type cur)
+                                   'help-type cur)
           (insert (substitute-command-keys (if pl "', " "'"))))
         (insert ".\n")))
 
@@ -808,7 +803,7 @@ cl--describe-class
         (while (setq cur (pop ch))
           (insert (substitute-quotes "`"))
           (help-insert-xref-button (symbol-name cur)
-                                   'cl-help-type cur)
+                                   'help-type cur)
           (insert (substitute-command-keys (if ch "', " "'"))))
         (insert ".\n")))
 
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index 422f6e9dddf..79a39c3d639 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -1061,10 +1061,10 @@ help-fns-function-description-header
                         (concat
                          "an autoloaded " (if (commandp def)
                                               "interactive "))
-                      (if (commandp def) "an interactive " "a "))))
-
-    ;; Print what kind of function-like object FUNCTION is.
-    (princ (cond ((or (stringp def) (vectorp def))
+                      (if (commandp def) "an interactive " "a ")))
+               ;; Print what kind of function-like object FUNCTION is.
+               (description
+		(cond ((or (stringp def) (vectorp def))
 		  "a keyboard macro")
 		 ((and (symbolp function)
                        (get function 'reader-construct))
@@ -1073,12 +1073,6 @@ help-fns-function-description-header
 		 ;; aliases before functions.
 		 (aliased
 		  (format-message "an alias for `%s'" real-def))
-                 ((subr-native-elisp-p def)
-                  (concat beg "native-compiled Lisp function"))
-		 ((subrp def)
-		  (concat beg (if (eq 'unevalled (cdr (subr-arity def)))
-		                  "special form"
-                                "built-in function")))
 		 ((autoloadp def)
 		  (format "an autoloaded %s"
                           (cond
@@ -1092,12 +1086,13 @@ help-fns-function-description-header
 		      ;; need to check macros before functions.
 		      (macrop function))
 		  (concat beg "Lisp macro"))
-		 ((byte-code-function-p def)
-		  (concat beg "byte-compiled Lisp function"))
-                 ((module-function-p def)
-                  (concat beg "module function"))
-		 ((memq (car-safe def) '(lambda closure))
-		  (concat beg "Lisp function"))
+		 ((atom def)
+		  (let ((type (or (oclosure-type def) (cl-type-of def))))
+		    (concat beg (format "%s"
+		                        (make-text-button
+		                         (symbol-name type) nil
+		                         'type 'help-type
+		                         'help-args (list type))))))
 		 ((keymapp def)
 		  (let ((is-full nil)
 			(elts (cdr-safe def)))
@@ -1107,7 +1102,9 @@ help-fns-function-description-header
 				elts nil))
 		      (setq elts (cdr-safe elts)))
 		    (concat beg (if is-full "keymap" "sparse keymap"))))
-		 (t "")))
+		 (t ""))))
+    (with-current-buffer standard-output
+      (insert description))
 
     (if (and aliased (not (fboundp real-def)))
 	(princ ",\nwhich is not defined.")
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index dd78342ace7..48433d899ab 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -177,6 +177,11 @@ 'help-variable
   'help-function 'describe-variable
   'help-echo (purecopy "mouse-2, RET: describe this variable"))
 
+(define-button-type 'help-type
+  :supertype 'help-xref
+  'help-function #'cl-describe-type
+  'help-echo (purecopy "mouse-2, RET: describe this type"))
+
 (define-button-type 'help-face
   :supertype 'help-xref
   'help-function 'describe-face
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type
  2024-03-22  1:22 bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-03-22  7:25 ` Eli Zaretskii
  2024-03-22 21:14   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-03-22 15:39 ` Andrea Corallo
  1 sibling, 1 reply; 5+ messages in thread
From: Eli Zaretskii @ 2024-03-22  7:25 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 69935

> Date: Thu, 21 Mar 2024 21:22:39 -0400
> From:  Stefan Monnier via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
> 
> The patch below changes the first line of `C-h f` from something like:
> 
>     car is a built-in function in ‘C source code’.
> 
> to
> 
>     car is a primitive-function in ‘C source code’.
> 
> i.e. print the actual type rather than an English description.
> The type is buttonized so users can click on it to see a description of
> the type (and its super/subtypes).
> 
> Beside exposing those types (and their related information), another
> advantage is that it simplifies the code since we don't need to
> enumerate all the different kinds of functions we may have (well, we
> still do for those "function-like objects" which don't have a dedicated
> type such as macros, keymaps, aliases, keyboard macros, yadda yadda, but
> a single case covers all of special forms, primitive functions,
> byte-code functions, module functions, and native-compiled functions).
> 
> Any comment/objection?

No objections, but IMO this should be in NEWS, and the button and
its purpose should be described in the user manual (where we document
"C-h f").

Thanks.





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type
  2024-03-22  1:22 bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-03-22  7:25 ` Eli Zaretskii
@ 2024-03-22 15:39 ` Andrea Corallo
  1 sibling, 0 replies; 5+ messages in thread
From: Andrea Corallo @ 2024-03-22 15:39 UTC (permalink / raw)
  To: 69935; +Cc: Stefan Monnier

Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of
text editors" <bug-gnu-emacs@gnu.org> writes:

> Tags: patch
>
> The patch below changes the first line of `C-h f` from something like:
>
>     car is a built-in function in ‘C source code’.
>
> to
>
>     car is a primitive-function in ‘C source code’.
>
> i.e. print the actual type rather than an English description.
> The type is buttonized so users can click on it to see a description of
> the type (and its super/subtypes).
>
> Beside exposing those types (and their related information), another
> advantage is that it simplifies the code since we don't need to
> enumerate all the different kinds of functions we may have (well, we
> still do for those "function-like objects" which don't have a dedicated
> type such as macros, keymaps, aliases, keyboard macros, yadda yadda, but
> a single case covers all of special forms, primitive functions,
> byte-code functions, module functions, and native-compiled functions).
>
> Any comment/objection?

Hi Stefan,

I like it thanks!  I think we might want to highlight the
inferred/declared argument/ret types as well WDYT?

I might implement something along this line once your patch is.

Thanks

  Andrea





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type
  2024-03-22  7:25 ` Eli Zaretskii
@ 2024-03-22 21:14   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-03-23  6:44     ` Eli Zaretskii
  0 siblings, 1 reply; 5+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-03-22 21:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 69935

> No objections, but IMO this should be in NEWS,

Good point, just added, thanks.

> and the button and its purpose should be described in the user manual
> (where we document "C-h f").

Hmm.. not sure where/how to add it there.  The current text doesn't
discuss/mention the other buttons (like the button to jump to the
source) and auxiliary information, so I'm not sure what you
were expecting.  My proposal would be something like the text below.
Is that the kind of thing you were thinking about?

[ Side note: I already pushed my proposed patch (without doc changes,
  obviously) accidentally when I pushed another change.
  Sorry 'bout that.  ]


        Stefan


diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 05457a3f34f..a6136ad6554 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -310,6 +310,12 @@ Name Help
 @kbd{C-h f} command if you don't really want to view the
 documentation.
 
+  The function's documentation displayed by @code{describe-function}
+includes more than just the documentation string and the signature of
+the function.  It also shows auxiliary information such as its type,
+the file where it was defined, whether it has been declared obsolete,
+etc...
+
 @vindex help-enable-symbol-autoload
   If you request help for an autoloaded function whose @code{autoload}
 form (@pxref{Autoload,,, elisp, The Emacs Lisp Reference Manual})






^ permalink raw reply related	[flat|nested] 5+ messages in thread

* bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type
  2024-03-22 21:14   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-03-23  6:44     ` Eli Zaretskii
  0 siblings, 0 replies; 5+ messages in thread
From: Eli Zaretskii @ 2024-03-23  6:44 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 69935

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: 69935@debbugs.gnu.org
> Date: Fri, 22 Mar 2024 17:14:40 -0400
> 
> > and the button and its purpose should be described in the user manual
> > (where we document "C-h f").
> 
> Hmm.. not sure where/how to add it there.  The current text doesn't
> discuss/mention the other buttons (like the button to jump to the
> source) and auxiliary information, so I'm not sure what you
> were expecting.  My proposal would be something like the text below.
> Is that the kind of thing you were thinking about?

Yes, except that I would suggest to mention that some of the auxiliary
information is reachable by clicking or typing RET on hyperlink-style
emphasized parts of the text displayed in the *Help* buffer.





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-03-23  6:44 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-22  1:22 bug#69935: [PATCH] (help-fns-function-description-header): Print functions' type Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-22  7:25 ` Eli Zaretskii
2024-03-22 21:14   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-23  6:44     ` Eli Zaretskii
2024-03-22 15:39 ` Andrea Corallo

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.