X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/3cf835a4bea2df30c4cc381934848f621df35bd9..a0561bff0dfcf267ee1796924f5aad904c377ee9:/packages/hydra/hydra.el diff --git a/packages/hydra/hydra.el b/packages/hydra/hydra.el index 37a0871a6..a7a71acc7 100644 --- a/packages/hydra/hydra.el +++ b/packages/hydra/hydra.el @@ -5,7 +5,7 @@ ;; Author: Oleh Krehel ;; Maintainer: Oleh Krehel ;; URL: https://github.com/abo-abo/hydra -;; Version: 0.13.3 +;; Version: 0.13.4 ;; Keywords: bindings ;; Package-Requires: ((cl-lib "0.5")) @@ -149,12 +149,12 @@ warn: keep KEYMAP and issue a warning instead of running the command." (dolist (frame (frame-list)) (with-selected-frame frame (when overriding-terminal-local-map - (internal-pop-keymap hydra-curr-map 'overriding-terminal-local-map) - (unless hydra--ignore - (when hydra-curr-on-exit - (let ((on-exit hydra-curr-on-exit)) - (setq hydra-curr-on-exit nil) - (funcall on-exit)))))))) + (internal-pop-keymap hydra-curr-map 'overriding-terminal-local-map)))) + (unless hydra--ignore + (when hydra-curr-on-exit + (let ((on-exit hydra-curr-on-exit)) + (setq hydra-curr-on-exit nil) + (funcall on-exit))))) (unless (fboundp 'internal-push-keymap) (defun internal-push-keymap (keymap symbol) @@ -452,6 +452,11 @@ Return DEFAULT if PROP is not in H." (format (format "%%%ds: %%%ds" key-width (- -1 doc-width)) key doc)) +(defun hydra--to-string (x) + (if (stringp x) + x + (eval x))) + (defun hydra--hint (body heads) "Generate a hint for the echo area. BODY, and HEADS are parameters to `defhydra'." @@ -467,41 +472,48 @@ BODY, and HEADS are parameters to `defhydra'." (cons (cadr h) (cons pstr (cl-caddr h))) alist))))) - (let ((keys (nreverse (mapcar #'cdr alist))) - (n-cols (plist-get (cddr body) :columns))) - (if n-cols - (let ((n-rows (1+ (/ (length keys) n-cols))) - (max-key-len (apply #'max (mapcar (lambda (x) (length (car x))) keys))) - (max-doc-len (apply #'max (mapcar (lambda (x) (length (cdr x))) keys)))) - (concat - "\n" - (mapconcat #'identity - (mapcar - (lambda (x) - (mapconcat - (lambda (y) - (and y - (funcall hydra-key-doc-function - (car y) - max-key-len - (cdr y) - max-doc-len))) x "")) - (hydra--matrix keys n-cols n-rows)) - "\n"))) - - - (concat - (mapconcat - (lambda (x) - (format - (if (> (length (cdr x)) 0) - (concat hydra-head-format (cdr x)) - "%s") - (car x))) - keys - ", ") - (if keys "." "")))))) + (n-cols (plist-get (cddr body) :columns)) + res) + (setq res + (if n-cols + (let ((n-rows (1+ (/ (length keys) n-cols))) + (max-key-len (apply #'max (mapcar (lambda (x) (length (car x))) keys))) + (max-doc-len (apply #'max (mapcar (lambda (x) + (length (hydra--to-string (cdr x)))) keys)))) + `(concat + "\n" + (mapconcat #'identity + (mapcar + (lambda (x) + (mapconcat + (lambda (y) + (and y + (funcall hydra-key-doc-function + (car y) + ,max-key-len + (hydra--to-string (cdr y)) + ,max-doc-len))) x "")) + ',(hydra--matrix keys n-cols n-rows)) + "\n"))) + + + `(concat + (mapconcat + (lambda (x) + (let ((str (hydra--to-string (cdr x)))) + (format + (if (> (length str) 0) + (concat hydra-head-format str) + "%s") + (car x)))) + ',keys + ", ") + ,(if keys "." "")))) + (if (cl-every #'stringp + (mapcar 'cddr alist)) + (eval res) + res)))) (defvar hydra-fontify-head-function nil "Possible replacement for `hydra-fontify-head-default'.") @@ -612,11 +624,14 @@ The expressions can be auto-expanded according to NAME." (if (eq ?\n (aref docstring 0)) `(concat (format ,(substring docstring 1) ,@(nreverse varlist)) ,rest) - `(format ,(replace-regexp-in-string + (let ((r `(replace-regexp-in-string " +$" "" - (concat docstring ": " + (concat ,docstring ": " (replace-regexp-in-string - "\\(%\\)" "\\1\\1" rest))))))) + "\\(%\\)" "\\1\\1" ,rest))))) + (if (stringp rest) + `(format ,(eval r)) + `(format ,r)))))) (defun hydra--complain (format-string &rest args) "Forward to (`message' FORMAT-STRING ARGS) unless `hydra-verbose' is nil." @@ -964,7 +979,8 @@ result of `defhydra'." (t (let ((hint (cl-caddr h))) (unless (or (null hint) - (stringp hint)) + (stringp hint) + (stringp (eval hint))) (setcdr (cdr h) (cons (hydra-plist-get-default body-plist :hint "") (cddr h)))))