branch: master commit 200a44441905f9a60b8bc7faaf793981f8363f20 Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
hydra.el (hydra--hint): Revert return "" for :hint nil * hydra.el (hydra--format): When body's :hint is nil /and/ the docstring starts with a newline, set the output of `hydra--hint' to "". This is necessary for the ?x? syntax. * hydra-test.el (hydra-format-8): Add test. Fixes #190 --- hydra-test.el | 10 +++++ hydra.el | 115 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/hydra-test.el b/hydra-test.el index a40a0ca..03c20d4 100644 --- a/hydra-test.el +++ b/hydra-test.el @@ -1137,6 +1137,16 @@ _f_ auto-fill-mode: %`auto-fill-function 0 2 (face hydra-face-red))) "")))) +(ert-deftest hydra-format-8 () + (should + (equal + (hydra--format nil '(nil nil :hint nil) "test" + '(("f" forward-char nil :exit nil) + ("b" backward-char "back" :exit nil))) + '(format + #("test: [b]: back." + 7 8 (face hydra-face-red)))))) + (ert-deftest hydra-format-with-sexp-1 () (should (equal (let ((hydra-fontify-head-function diff --git a/hydra.el b/hydra.el index e1dedd2..5626a4f 100644 --- a/hydra.el +++ b/hydra.el @@ -470,62 +470,60 @@ Return DEFAULT if PROP is not in H." (defun hydra--hint (body heads) "Generate a hint for the echo area. BODY, and HEADS are parameters to `defhydra'." - (if (null (hydra-plist-get-default (cddr body) :hint 1)) - "" - (let (alist) - (dolist (h heads) - (let ((val (assoc (cadr h) alist)) - (pstr (hydra-fontify-head h body))) - (unless (null (cl-caddr h)) - (if val - (setf (cadr val) - (concat (cadr val) " " pstr)) - (push - (cons (cadr h) - (cons pstr (cl-caddr h))) - alist))))) - (let ((keys (nreverse (mapcar #'cdr alist))) - (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))))) + (let (alist) + (dolist (h heads) + (let ((val (assoc (cadr h) alist)) + (pstr (hydra-fontify-head h body))) + (unless (null (cl-caddr h)) + (if val + (setf (cadr val) + (concat (cadr val) " " pstr)) + (push + (cons (cadr h) + (cons pstr (cl-caddr h))) + alist))))) + (let ((keys (nreverse (mapcar #'cdr alist))) + (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'.") @@ -606,7 +604,10 @@ _NAME, BODY, DOCSTRING and HEADS are parameters of `defhydra'. The expressions can be auto-expanded according to NAME." (setq docstring (hydra--strip-align-markers docstring)) (setq docstring (replace-regexp-in-string "___" "_β_" docstring)) - (let ((rest (hydra--hint body heads)) + (let ((rest (if (and (null (hydra-plist-get-default (cddr body) :hint 1)) + (string-match "\\`\n" docstring)) + "" + (hydra--hint body heads))) (start 0) varlist offset)