From: Manuel Giraud via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 74111@debbugs.gnu.org
Subject: bug#74111: [PATCH] New `tmm-menubar' shortcut display style
Date: Fri, 01 Nov 2024 10:31:20 +0100 [thread overview]
Message-ID: <8734kbz4ev.fsf@ledu-giraud.fr> (raw)
In-Reply-To: <86r07v1l1l.fsf@gnu.org> (Eli Zaretskii's message of "Fri, 01 Nov 2024 09:16:06 +0200")
[-- Attachment #1: Type: text/plain, Size: 163 bytes --]
Hi,
I think I have address all the left issues with this patch. I've also
updated the log: tell me what you think and feel free to reword it if
needed. Thanks.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-New-tmm-menubar-shortcut-display-style.patch --]
[-- Type: text/x-patch, Size: 7487 bytes --]
From 28102a18a9edbdcc85ffd5254a8968611a25615d Mon Sep 17 00:00:00 2001
From: Manuel Giraud <manuel@ledu-giraud.fr>
Date: Wed, 30 Oct 2024 17:24:24 +0100
Subject: [PATCH] New `tmm-menubar' shortcut display style
Bug#74111
* lisp/tmm.el (tmm-shortcut-inside-entry): New user option to
control if the shortcut character is highlighted inside the menu
entry's string.
(tmm-add-one-shortcut): Compute the new shortcut style.
(tmm-add-prompt, tmm-completion-prompt): Adapt the completion
prompt according to the shortcut display style.
(tmm-prompt): Adapt the prompt regexp.
(tmm-shortcut): Simplify default case and make it work with this
change.
* etc/NEWS: Announce the option.
---
etc/NEWS | 5 ++++
lisp/tmm.el | 73 ++++++++++++++++++++++++++++++++++++++---------------
2 files changed, 58 insertions(+), 20 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index d1c7303f976..db13a1dd971 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -584,6 +584,11 @@ instead.
*** A new shortcut to navigate to previous menu.
The hardcoded '^' shortcut gets you back to the previous menu.
+---
+*** New user option 'tmm-shortcut-inside-entry'.
+When non-nil, highlight the character shortcut in the menu entry's
+string instead of preprending it and `tmm-mid-prompt' to said entry.
+
** Foldout
---
diff --git a/lisp/tmm.el b/lisp/tmm.el
index 252c1e45afa..80991b246b6 100644
--- a/lisp/tmm.el
+++ b/lisp/tmm.el
@@ -83,11 +83,11 @@ tmm-mid-prompt
string))
(defcustom tmm-completion-prompt
- "Press PageUp key to reach this buffer from the minibuffer.
-Alternatively, you can use Up/Down keys (or your History keys) to change
+ "Press M-v/PageUp key to reach this buffer from the minibuffer.
+Alternatively, You can use Up/Down keys (or your History keys) to change
the item in the minibuffer, and press RET when you are done, or press
-the marked letters to pick up your choice. Type ^ to go to the parent
-menu. Type C-g or ESC ESC ESC to cancel.
+the %s to pick up your choice.
+Type ^ to go to the parent menu. Type C-g or ESC ESC ESC to cancel.
"
"Help text to insert on the top of the completion buffer.
To save space, you can set this to nil,
@@ -108,6 +108,13 @@ tmm-shortcut-words
specify nil for this variable."
:type '(choice integer (const nil)))
+(defcustom tmm-shortcut-inside-entry nil
+ "Highlight the shortcut character in the menu entry's string.
+When non-nil, the first menu-entry's character that acts as a shortcut
+will be highlighted with the `highlight' face to help identifying it.
+The `tmm-mid-prompt' string is not used then."
+ :type 'boolean)
+
(defface tmm-inactive
'((t :inherit shadow))
"Face used for inactive menu items.")
@@ -198,7 +205,8 @@ tmm-prompt
(setq tail (cdr tail)))))
(let ((prompt
(concat "^"
- (if (stringp tmm-mid-prompt)
+ (if (and (stringp tmm-mid-prompt)
+ (not tmm-shortcut-inside-entry))
(concat "."
(regexp-quote tmm-mid-prompt))))))
(setq tmm--history
@@ -283,7 +291,7 @@ tmm-add-one-shortcut
(t
(let* ((str (car elt))
(paren (string-search "(" str))
- (pos 0) (word 0) char)
+ (word 0) pos char)
(catch 'done ; ??? is this slow?
(while (and (or (not tmm-shortcut-words) ; no limit on words
(< word tmm-shortcut-words)) ; try n words
@@ -299,17 +307,34 @@ tmm-add-one-shortcut
(if (not (memq char tmm-short-cuts)) (throw 'done char))))
(setq word (1+ word))
(setq pos (match-end 0)))
+ ;; A nil value for pos means that the shortcut is not inside the
+ ;; string of the menu entry.
+ (setq pos nil)
(while (<= tmm-next-shortcut-digit ?9) ; no letter shortcut, pick a digit
(setq char tmm-next-shortcut-digit)
(setq tmm-next-shortcut-digit (1+ tmm-next-shortcut-digit))
(if (not (memq char tmm-short-cuts)) (throw 'done char)))
(setq char nil))
(if char (setq tmm-short-cuts (cons char tmm-short-cuts)))
- (cons (concat (if char (concat (char-to-string char) tmm-mid-prompt)
- ;; keep them lined up in columns
- (make-string (1+ (length tmm-mid-prompt)) ?\s))
- str)
- (cdr elt))))))
+ (cons
+ (if tmm-shortcut-inside-entry
+ (if char
+ (if pos
+ ;; A character inside the menu entry.
+ (let ((res (copy-sequence str)))
+ (aset res pos char)
+ (add-text-properties pos (1+ pos) '(face highlight) res)
+ res)
+ ;; A fallback digit character: place it in front of the
+ ;; menu entry.
+ (concat (propertize (char-to-string char) 'face 'highlight)
+ " " str))
+ (make-string 2 ?\s))
+ (concat (if char (concat (char-to-string char) tmm-mid-prompt)
+ ;; Keep them lined up in columns.
+ (make-string (1+ (length tmm-mid-prompt)) ?\s))
+ str))
+ (cdr elt))))))
;; This returns the old map.
(defun tmm-define-keys (minibuffer)
@@ -328,7 +353,7 @@ tmm-define-keys
(define-key map "\ev" 'tmm-goto-completions)
(define-key map "\C-n" 'next-history-element)
(define-key map "\C-p" 'previous-history-element)
- ;; Previous menu shortcut (see `tmm-prompt')
+ ;; Previous menu shortcut (see `tmm-prompt').
(define-key map "^" 'self-insert-and-exit))
(prog1 (current-local-map)
(use-local-map (append map (current-local-map))))))
@@ -384,7 +409,12 @@ tmm-add-prompt
(let ((inhibit-read-only t)
(window (get-buffer-window "*Completions*")))
(goto-char (point-min))
- (insert tmm-completion-prompt)
+ (insert
+ (if tmm-shortcut-inside-entry
+ (format tmm-completion-prompt
+ (concat (propertize "highlighted" 'face 'highlight) " character"))
+ (format tmm-completion-prompt
+ (concat "character right before '" tmm-mid-prompt "' "))))
(when window
;; Try to show everything just inserted and preserve height of
;; *Completions* window. This should fix a behavior described
@@ -406,13 +436,16 @@ tmm-shortcut
(choose-completion))
;; In minibuffer
(delete-region (minibuffer-prompt-end) (point-max))
- (dolist (elt tmm-km-list)
- (if (string=
- (substring (car elt) 0
- (min (1+ (length tmm-mid-prompt))
- (length (car elt))))
- (concat (char-to-string c) tmm-mid-prompt))
- (setq s (car elt))))
+ (dolist (elt tmm-km-list)
+ (let ((str (car elt))
+ (index 0))
+ (when tmm-shortcut-inside-entry
+ (if (get-char-property 0 'face str)
+ (setq index 0)
+ (let ((next (next-single-char-property-change 0 'face str)))
+ (setq index (if (= (length str) next) 0 next)))))
+ (if (= (aref str index) c)
+ (setq s str))))
(insert s)
(exit-minibuffer)))))
--
2.47.0
[-- Attachment #3: Type: text/plain, Size: 18 bytes --]
--
Manuel Giraud
next prev parent reply other threads:[~2024-11-01 9:31 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-30 16:35 bug#74111: [PATCH] New `tmm-menubar' shortcut display style Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-31 9:46 ` Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-31 10:04 ` Eli Zaretskii
2024-10-31 10:28 ` Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-31 10:50 ` Eli Zaretskii
2024-10-31 11:48 ` Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-31 14:25 ` Eli Zaretskii
2024-10-31 16:04 ` Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-31 16:57 ` Eli Zaretskii
2024-10-31 22:07 ` Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-01 7:16 ` Eli Zaretskii
2024-11-01 9:31 ` Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2024-11-01 12:11 ` Eli Zaretskii
2024-11-01 14:25 ` Howard Melman
2024-11-01 17:34 ` Manuel Giraud via Bug reports for GNU Emacs, the Swiss army knife of text editors
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8734kbz4ev.fsf@ledu-giraud.fr \
--to=bug-gnu-emacs@gnu.org \
--cc=74111@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=manuel@ledu-giraud.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).