(binding (and suggest-key-bindings
(not executing-kbd-macro)
(where-is-internal function overriding-local-map t)))
- (delay-before-suggest 0))
+ (delay-before-suggest 0)
+ (find-shorter nil))
(unless (commandp function)
(error "`%s' is not a valid command name" command-name))
;; Some features, such as novice.el, rely on this-command-keys
(setq real-this-command function)
(let ((prefix-arg prefixarg))
(command-execute function 'record))
- ;; If enabled, show which key runs this command.
-
- ;; If this command displayed something in the echo area;
- ;; then postpone display our suggestion message a bit.
- ;; FIXME: If execute-extended-command--shorter were
- ;; faster, we could compute the result here first too.
+ ;; Ensure that we never have two of the suggest-binding timers in
+ ;; flight.
+ (when execute-extended-command--binding-timer
+ (cancel-timer execute-extended-command--binding-timer))
+ ;; If this command displayed something in the echo area; then
+ ;; postpone display our suggestion message a bit.
(when (and suggest-key-bindings
(or binding
(and extended-command-suggest-shorter typed)))
(cond
((zerop (length (current-message))) 0)
((numberp suggest-key-bindings) suggest-key-bindings)
- (t 2))))
- (unless (or (not extended-command-suggest-shorter)
- binding executing-kbd-macro (not (symbolp function))
- (<= (length (symbol-name function)) 2))
- ;; There's no binding for CMD. Let's try and find the shortest
- ;; string to use in M-x.
- ;; FIXME: Can be slow. Cache it maybe?
- (while-no-input
- (setq binding (execute-extended-command--shorter
- (symbol-name function) typed))))
- ;; Ensure that we never have two of these timers in flight.
- (when execute-extended-command--binding-timer
- (cancel-timer execute-extended-command--binding-timer))
- (when binding
- (setq execute-extended-command--binding-timer
- (run-at-time
- delay-before-suggest nil
- (lambda ()
- ;; If the user has typed any other commands in the
- ;; meantime, then don't display anything.
- (when (eq function real-last-command)
- (with-temp-message
- (format-message "You can run the command `%s' with %s"
- function
- (if (stringp binding)
- (concat "M-x " binding " RET")
- (key-description binding)))
- (sit-for (if (numberp suggest-key-bindings)
- suggest-key-bindings
- 2))))))))))
+ (t 2)))
+ (when (and extended-command-suggest-shorter
+ (not binding)
+ (not executing-kbd-macro)
+ (symbolp function)
+ (> (length (symbol-name function)) 2))
+ ;; There's no binding for CMD. Let's try and find the shortest
+ ;; string to use in M-x.
+ (setq find-shorter t))
+ (when (or binding find-shorter)
+ (setq execute-extended-command--binding-timer
+ (run-at-time
+ delay-before-suggest nil
+ (lambda ()
+ ;; If the user has typed any other commands in the
+ ;; meantime, then don't display anything.
+ (when (eq function real-last-command)
+ ;; Find shorter string.
+ (when find-shorter
+ (while-no-input
+ ;; FIXME: Can be slow. Cache it maybe?
+ (setq binding (execute-extended-command--shorter
+ (symbol-name function) typed))))
+ (when binding
+ (with-temp-message
+ (format-message "You can run the command `%s' with %s"
+ function
+ (if (stringp binding)
+ (concat "M-x " binding " RET")
+ (key-description binding)))
+ (sit-for (if (numberp suggest-key-bindings)
+ suggest-key-bindings
+ 2))))))))))))
(defun execute-extended-command-for-buffer (prefixarg &optional
command-name typed)