unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name
@ 2024-01-20  5:15 Phil Sainty
  2024-01-20  7:40 ` Eli Zaretskii
  0 siblings, 1 reply; 6+ messages in thread
From: Phil Sainty @ 2024-01-20  5:15 UTC (permalink / raw)
  To: 68600

If we define a major mode with mode-line constructs in its mode-name
(in this example using a copy of the constructs from `emacs-lisp-mode'):

  ;; Force hook docstring re-generation:
  (put 'example-lisp-mode-hook 'variable-documentation nil)

  (define-derived-mode example-lisp-mode lisp-data-mode
    `("Example"
      (lexical-binding (:propertize "/l"
                        help-echo "Using lexical-binding mode")
                       (:propertize "/d"
                        help-echo "Using old dynamic scoping mode\n\
  mouse-1: Enable lexical-binding mode"
                face warning
                mouse-face mode-line-highlight
                        local-map ,elisp--dynlex-modeline-map)))
    "Example mode.")

Then, unles we have previously defined the mode hook variable with a
custom docstring (which seems to be the workaround in the meantime),
C-h v example-lisp-mode-hook says:

Hook run after entering `(Example (lexical-binding (:propertize /l 
help-echo Using lexical-binding mode) (:propertize /d help-echo Using 
old dynamic scoping mode
mouse-1: Enable lexical-binding mode face warning mouse-face 
mode-line-highlight local-map ,elisp--dynlex-modeline-map))) mode.

Instead of: "Hook run after entering Example mode."

I figure `format-mode-line' needs to be called on the `mode-name' when
generating the docstring for the mode hook (which possibly means making
these docstrings dynamic?)


-Phil



In GNU Emacs 30.0.50 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo
  version 1.16.0, Xaw scroll bars) of 2024-01-09 built on phil-lp
Repository revision: 774c8ec74c98d69d56b2511a613145f2b69fb2eb
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 
11.0.12101004
System Description: Ubuntu 22.04.3 LTS

Configured using:
  'configure --prefix=/home/phil/emacs/trunk/usr/local
  --without-native-compilation --with-x-toolkit=lucid --without-sound
  '--program-transform-name=s/^ctags$/ctags_emacs/''

Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON
LCMS2 LIBSELINUX LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP
SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE XIM
XPM LUCID ZLIB

Important settings:
   value of $LC_MONETARY: en_NZ.UTF-8
   value of $LC_NUMERIC: en_NZ.UTF-8
   value of $LC_TIME: en_NZ.UTF-8
   value of $LANG: en_GB.UTF-8
   value of $XMODIFIERS: @im=ibus
   locale-coding-system: utf-8

Major mode: Lisp Interaction

Minor modes in effect:
   hi-lock-mode: t
   elisp-slime-nav-mode: t
   hl-sexp-mode: t
   lexbind-mode: t
   idle-highlight-mode: t
   minibuffer-line-mode: t
   global-edit-server-edit-mode: t
   savehist-mode: t
   magit-wip-initial-backup-mode: t
   magit-wip-before-change-mode: t
   magit-wip-after-apply-mode: t
   magit-wip-after-save-mode: t
   magit-wip-mode: t
   global-git-commit-mode: t
   magit-auto-revert-mode: t
   server-mode: t
   my-contextual-help-mode: t
   global-so-long-mode: t
   display-battery-mode: t
   my-visible-bell-mode: t
   cua-mode: t
   global-display-fill-column-indicator-mode: t
   display-fill-column-indicator-mode: t
   minibuffer-depth-indicate-mode: t
   which-key-mode: t
   windmove-mode: t
   winner-mode: t
   global-subword-mode: t
   subword-mode: t
   global-hl-line-mode: t
   hl-line-mode: t
   display-time-mode: t
   keep-buffers-mode: t
   fic-mode: t
   my-keys-local-minor-mode: t
   auto-compile-on-load-mode: t
   auto-compile-on-save-mode: t
   url-handler-mode: t
   tooltip-mode: t
   global-eldoc-mode: t
   eldoc-mode: t
   show-paren-mode: t
   electric-indent-mode: t
   mouse-wheel-mode: t
   menu-bar-mode: t
   file-name-shadow-mode: t
   global-font-lock-mode: t
   font-lock-mode: t
   minibuffer-regexp-mode: t
   line-number-mode: t
   transient-mark-mode: t
   auto-composition-mode: t
   auto-encryption-mode: t
   auto-compression-mode: t

Load-path shadows:
/home/phil/.emacs.d.sandboxes/trunk/HOME/.emacs.d/el-get/scratch/el-get 
hides 
/home/phil/.emacs.d.sandboxes/trunk/HOME/.emacs.d/el-get/el-get/el-get
/home/phil/.emacs.d.sandboxes/trunk/HOME/.emacs.d/el-get/delight/delight 
hides 
/home/phil/.emacs.d.sandboxes/trunk/HOME/.emacs.d/elpa/delight-1.7/delight
/home/phil/.emacs.d.sandboxes/trunk/HOME/.emacs.d/lisp/python hides 
/home/phil/emacs/trunk/usr/local/share/emacs/30.0.50/lisp/progmodes/python

Features:
(shadow sort ecomplete mail-extr emacsbug whitespace debug backtrace
ibuf-ext face-remap ibuffer ibuffer-loaddefs hippie-exp misearch
multi-isearch shortdoc comp-common autoinsert goto-addr find-func
cl-print help-fns hi-lock elisp-slime-nav etags fileloop generator xref
project hl-sexp lexbind-mode idle-highlight-mode tramp-sh warnings
docker-tramp tramp-cache time-stamp tramp trampver tramp-integration
files-x tramp-message tramp-compat xdg parse-time iso8601 tramp-loaddefs
tabify minibuffer-line edit-server my-org my-projects my-session
savehist desktop frameset my-theme zenburn-theme my-mail pcase autoloads
my-libraries sudo my-version-control magit-wip magit-log which-func
imenu magit-diff smerge-mode diff git-commit rx log-edit message
sendmail yank-media puny rfc822 mml mml-sec epa epg rfc6068 epg-config
gnus-util text-property-search time-date mm-decode mm-bodies mm-encode
mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr
mailabbrev mail-utils gmm-utils mailheader pcvs-util add-log magit-core
magit-autorevert autorevert filenotify magit-margin magit-transient
magit-process with-editor shell pcomplete comint ansi-osc server
ansi-color magit-mode transient edmacro kmacro format-spec magit-git
magit-section magit-utils crm dash my-text my-programming my-python
so-long my-whitespace ws-trim my-rectangles my-utilities
browse-kill-ring my-configuration cus-edit pp cus-load wid-edit
dired-details dired-x highlight-parentheses battery delight delsel
cua-base ffap display-fill-column-indicator mb-depth which-key framemove
windmove winner ring cap-words superword subword hl-line time
my-externals .loaddefs windcycle transpose-frame simple-wiki derived
sdcv-mode noutline outline icons sauron rainbow-mode notify dbus xml
multiple-cursors mc-separate-operations rectangular-region-mode
mc-mark-pop mc-mark-more thingatpt mc-cycle-cursors mc-edit-lines
multiple-cursors-core rect mo-git-blame keep-buffers iedit fic-mode
dtrt-indent browse-at-remote vc-git diff-mode easy-mmode vc-dispatcher s
el-get cl-extra help-mode autoload loaddefs-gen radix-tree lisp-mnt cl
dired dired-loaddefs jka-compr my-local my-keybindings auto-compile
packed compat-autoloads etags-select-autoloads info
project-local-variables-autoloads advice wtf-autoloads package
browse-url url url-proxy url-privacy url-expand url-methods url-history
url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs password-cache
json subr-x map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs
cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win
term/common-win x-dnd touch-screen 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 inotify lcms2 dynamic-setting system-font-setting
font-render-setting cairo x-toolkit x multi-tty move-toolbar
make-network-process emacs)

Memory information:
((conses 16 452119 295599) (symbols 48 24552 0)
  (strings 32 84489 6031) (string-bytes 1 3339539) (vectors 16 46546)
  (vector-slots 8 1200262 242797) (floats 8 268 207)
  (intervals 56 47487 619) (buffers 984 21))






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

* bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name
  2024-01-20  5:15 bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name Phil Sainty
@ 2024-01-20  7:40 ` Eli Zaretskii
  2024-01-20 15:47   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2024-01-20  7:40 UTC (permalink / raw)
  To: Phil Sainty, Stefan Monnier; +Cc: 68600

> Date: Sat, 20 Jan 2024 18:15:51 +1300
> From: Phil Sainty <psainty@orcon.net.nz>
> 
> If we define a major mode with mode-line constructs in its mode-name
> (in this example using a copy of the constructs from `emacs-lisp-mode'):
> 
>   ;; Force hook docstring re-generation:
>   (put 'example-lisp-mode-hook 'variable-documentation nil)
> 
>   (define-derived-mode example-lisp-mode lisp-data-mode
>     `("Example"
>       (lexical-binding (:propertize "/l"
>                         help-echo "Using lexical-binding mode")
>                        (:propertize "/d"
>                         help-echo "Using old dynamic scoping mode\n\
>   mouse-1: Enable lexical-binding mode"
>                 face warning
>                 mouse-face mode-line-highlight
>                         local-map ,elisp--dynlex-modeline-map)))
>     "Example mode.")
> 
> Then, unles we have previously defined the mode hook variable with a
> custom docstring (which seems to be the workaround in the meantime),
> C-h v example-lisp-mode-hook says:
> 
> Hook run after entering `(Example (lexical-binding (:propertize /l 
> help-echo Using lexical-binding mode) (:propertize /d help-echo Using 
> old dynamic scoping mode
> mouse-1: Enable lexical-binding mode face warning mouse-face 
> mode-line-highlight local-map ,elisp--dynlex-modeline-map))) mode.
> 
> Instead of: "Hook run after entering Example mode."
> 
> I figure `format-mode-line' needs to be called on the `mode-name' when
> generating the docstring for the mode hook (which possibly means making
> these docstrings dynamic?)

I'd very much prefer not to call format-mode-line in these cases.
It's a very blunt instrument, and its results are sometimes
unexpected, especially when there are arbitrary advanced elements in
mode-line-format.

If we cannot find a better way to solve this, I'd prefer documenting
the current workaround, and otherwise leaving the code unchanged.

Adding Stefan, in case he has some comments or ideas to suggest.

Thanks.





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

* bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name
  2024-01-20  7:40 ` Eli Zaretskii
@ 2024-01-20 15:47   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-01-21  2:51     ` Phil Sainty
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-01-20 15:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Phil Sainty, 68600

>> If we define a major mode with mode-line constructs in its mode-name
>> (in this example using a copy of the constructs from `emacs-lisp-mode'):
>> 
>>   ;; Force hook docstring re-generation:
>>   (put 'example-lisp-mode-hook 'variable-documentation nil)
>> 
>>   (define-derived-mode example-lisp-mode lisp-data-mode
>>     `("Example"
>>       (lexical-binding (:propertize "/l"
>>                         help-echo "Using lexical-binding mode")
>>                        (:propertize "/d"
>>                         help-echo "Using old dynamic scoping mode\n\
>>   mouse-1: Enable lexical-binding mode"
>>                 face warning
>>                 mouse-face mode-line-highlight
>>                         local-map ,elisp--dynlex-modeline-map)))
>>     "Example mode.")
>> 
>> Then, unles we have previously defined the mode hook variable with a
>> custom docstring (which seems to be the workaround in the meantime),
>> C-h v example-lisp-mode-hook says:
>> 
>> Hook run after entering `(Example (lexical-binding (:propertize /l 
>> help-echo Using lexical-binding mode) (:propertize /d help-echo Using 
>> old dynamic scoping mode
>> mouse-1: Enable lexical-binding mode face warning mouse-face 
>> mode-line-highlight local-map ,elisp--dynlex-modeline-map))) mode.
>> 
>> Instead of: "Hook run after entering Example mode."

Duh, indeed.

>> I figure `format-mode-line' needs to be called on the `mode-name' when
>> generating the docstring for the mode hook (which possibly means making
>> these docstrings dynamic?)

I don't think we want to make it dynamic, no.
But indeed with `format-mode-line` the docstring would say "Exemple/l" or
"Exemple/d" whereas we'd probably prefer it to say just "Exemple".
The patch below solves the problem in a different way.

> I'd very much prefer not to call format-mode-line in these cases.
> It's a very blunt instrument, and its results are sometimes
> unexpected, especially when there are arbitrary advanced elements in
> mode-line-format.

I don't think we need to avoid `format-mode-line` like the plague, but
indeed it will tend to give subpar results here (being too specific
while the docstring should say what the var does in general).


        Stefan


diff --git a/lisp/emacs-lisp/derived.el b/lisp/emacs-lisp/derived.el
index 5c224362708..f48774f7ad8 100644
--- a/lisp/emacs-lisp/derived.el
+++ b/lisp/emacs-lisp/derived.el
@@ -211,10 +211,10 @@ define-derived-mode
        (defvar ,hook nil)
        (unless (get ',hook 'variable-documentation)
          (put ',hook 'variable-documentation
-              ,(format "Hook run after entering %s mode.
+              ,(format "Hook run after entering `%S'.
 No problems result if this variable is not bound.
 `add-hook' automatically binds it.  (This is true for all hook variables.)"
-                       name)))
+                       child)))
        (unless (boundp ',map)
 	 (put ',map 'definition-name ',child))
        (with-no-warnings (defvar ,map (make-sparse-keymap)))






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

* bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name
  2024-01-20 15:47   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-01-21  2:51     ` Phil Sainty
  2024-01-21  3:20       ` Phil Sainty
  0 siblings, 1 reply; 6+ messages in thread
From: Phil Sainty @ 2024-01-21  2:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, 68600

On 2024-01-21 04:47, Stefan Monnier wrote:
> The patch below solves the problem in a different way.

For my example, it gives us a cross-linked
"Hook run after entering ‘example-lisp-mode’."

I think that's a good solution.


-Phil






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

* bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name
  2024-01-21  2:51     ` Phil Sainty
@ 2024-01-21  3:20       ` Phil Sainty
  2024-01-21  4:11         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 6+ messages in thread
From: Phil Sainty @ 2024-01-21  3:20 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, 68600

> "Hook run after entering ‘example-lisp-mode’."

This is also consistent with the minor mode hook docstring code,
which is doing this:

          (put ',hook 'variable-documentation
               ,(format "Hook run after entering or leaving `%s'.
No problems result if this variable is not bound.
`add-hook' automatically binds it.  (This is true for all hook 
variables.)"
                        modefun))


The sole difference being %S vs %s -- I figure that should be
consistent one way or the other?







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

* bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name
  2024-01-21  3:20       ` Phil Sainty
@ 2024-01-21  4:11         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 6+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-01-21  4:11 UTC (permalink / raw)
  To: Phil Sainty; +Cc: 68600-done, Eli Zaretskii

>> "Hook run after entering ‘example-lisp-mode’."
> This is also consistent with the minor mode hook docstring code,

Thanks, pushed, closing.

> The sole difference being %S vs %s -- I figure that should be
> consistent one way or the other?

%s is for use to include the contents of a string.  In the current case
we're including a symbol.  For symbols %s and %S behave identically,
tho, so it doesn't matter very much.  I do think %S is the better option
(e.g. it will make it clear if/when the arg is a string rather than
a symbol, for example, since it will put "..." around the contents), but
it's not important enough to go and change the `easy-mmode.el` code.


        Stefan






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

end of thread, other threads:[~2024-01-21  4:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-20  5:15 bug#68600: 30.0.50; Bad mode hook docstring when mode-line constructs are present in the mode-name Phil Sainty
2024-01-20  7:40 ` Eli Zaretskii
2024-01-20 15:47   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-21  2:51     ` Phil Sainty
2024-01-21  3:20       ` Phil Sainty
2024-01-21  4:11         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors

Code repositories for project(s) associated with this public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).