1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-29 07:58:28 +00:00

Substitute command keys in button help-echo values

* lisp/button.el (button--help-echo): Pass resulting string through
substitute-command-keys for consistency with show-help-function.
* test/lisp/button-tests.el (button-tests--map): New test keymap.
(button--help-echo-string, button--help-echo-form)
(button--help-echo-function): Use it to test command key
substitution in help-echo strings (bug#43070).
This commit is contained in:
Basil L. Contovounesios 2020-10-16 09:32:48 +02:00 committed by Lars Ingebrigtsen
parent 1e89dfc6c8
commit a950a6e6cf
2 changed files with 33 additions and 19 deletions

View File

@ -493,12 +493,17 @@ butting, use the `button-describe' command."
t))))
(defun button--help-echo (button)
"Evaluate BUTTON's `help-echo' property and return its value."
(let ((help (button-get button 'help-echo)))
(if (functionp help)
(let ((obj (if (overlayp button) button (current-buffer))))
(funcall help (selected-window) obj (button-start button)))
(eval help lexical-binding))))
"Evaluate BUTTON's `help-echo' property and return its value.
If the result is non-nil, pass it through `substitute-command-keys'
before returning it, as is done for `show-help-function'."
(let* ((help (button-get button 'help-echo))
(help (if (functionp help)
(funcall help
(selected-window)
(if (overlayp button) button (current-buffer))
(button-start button))
(eval help lexical-binding))))
(and help (substitute-command-keys help))))
(defun forward-button (n &optional wrap display-message no-error)
"Move to the Nth next button, or Nth previous button if N is negative.

View File

@ -21,6 +21,12 @@
(require 'ert)
(defvar button-tests--map
(let ((map (make-sparse-keymap)))
(define-key map "x" #'ignore)
map)
"Keymap for testing command substitution.")
(ert-deftest button-at ()
"Test `button-at' behavior."
(with-temp-buffer
@ -41,11 +47,13 @@
"Test `button--help-echo' with strings."
(with-temp-buffer
;; Text property buttons.
(let ((button (insert-text-button "text" 'help-echo "text help")))
(should (equal (button--help-echo button) "text help")))
(let ((button (insert-text-button
"text" 'help-echo "text: \\<button-tests--map>\\[ignore]")))
(should (equal (button--help-echo button) "text: x")))
;; Overlay buttons.
(let ((button (insert-button "overlay" 'help-echo "overlay help")))
(should (equal (button--help-echo button) "overlay help")))))
(let ((button (insert-button "overlay" 'help-echo
"overlay: \\<button-tests--map>\\[ignore]")))
(should (equal (button--help-echo button) "overlay: x")))))
(ert-deftest button--help-echo-form ()
"Test `button--help-echo' with forms."
@ -55,16 +63,17 @@
(form `(funcall (let ((,help "lexical form"))
(lambda () ,help))))
(button (insert-text-button "text" 'help-echo form)))
(set help "dynamic form")
(should (equal (button--help-echo button) "dynamic form")))
(set help "dynamic: \\<button-tests--map>\\[ignore]")
(should (equal (button--help-echo button) "dynamic: x")))
;; Test overlay buttons with lexical scoping.
(setq lexical-binding t)
(let* ((help (make-symbol "help"))
(form `(funcall (let ((,help "lexical form"))
(lambda () ,help))))
(form `(funcall
(let ((,help "lexical: \\<button-tests--map>\\[ignore]"))
(lambda () ,help))))
(button (insert-button "overlay" 'help-echo form)))
(set help "dynamic form")
(should (equal (button--help-echo button) "lexical form")))))
(should (equal (button--help-echo button) "lexical: x")))))
(ert-deftest button--help-echo-function ()
"Test `button--help-echo' with functions."
@ -77,9 +86,9 @@
(should (eq win owin))
(should (eq obj obuf))
(should (= pos opos))
"text function"))
"text: \\<button-tests--map>\\[ignore]"))
(button (insert-text-button "text" 'help-echo help)))
(should (equal (button--help-echo button) "text function"))
(should (equal (button--help-echo button) "text: x"))
;; Overlay buttons.
(setq help (lambda (win obj pos)
(should (eq win owin))
@ -88,9 +97,9 @@
(should (eq (overlay-buffer obj) obuf))
(should (= (overlay-start obj) opos))
(should (= pos opos))
"overlay function"))
"overlay: \\<button-tests--map>\\[ignore]"))
(setq opos (point))
(setq button (insert-button "overlay" 'help-echo help))
(should (equal (button--help-echo button) "overlay function")))))
(should (equal (button--help-echo button) "overlay: x")))))
;;; button-tests.el ends here