1 ;;; hydra-test.el --- Tests for Hydra
3 ;; Copyright (C) 2015 Free Software Foundation, Inc.
7 ;; This file is part of GNU Emacs.
9 ;; GNU Emacs is free software: you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation, either version 3 of the License, or
12 ;; (at your option) any later version.
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
29 (ert-deftest hydra-red-error ()
33 '(defhydra hydra-error (global-map "M-g")
35 ("h" first-error "first")
36 ("j" next-error "next")
37 ("k" previous-error "prev")))
39 (defun hydra-error/first-error nil "Create a hydra with a \"M-g\" body and the heads:
43 \"k\": `previous-error'
45 The body can be accessed via `hydra-error/body'.
47 Call the head: `first-error'."
50 (catch (quote hydra-disable)
51 (condition-case err (prog1 t (call-interactively (function first-error)))
56 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
57 20 21 (face hydra-face-red)
58 31 32 (face hydra-face-red))))
60 (hydra-set-transient-map
62 (quote (keymap (107 . hydra-error/previous-error)
63 (106 . hydra-error/next-error)
64 (104 . hydra-error/first-error)
65 (kp-subtract . hydra--negative-argument)
66 (kp-9 . hydra--digit-argument)
67 (kp-8 . hydra--digit-argument)
68 (kp-7 . hydra--digit-argument)
69 (kp-6 . hydra--digit-argument)
70 (kp-5 . hydra--digit-argument)
71 (kp-4 . hydra--digit-argument)
72 (kp-3 . hydra--digit-argument)
73 (kp-2 . hydra--digit-argument)
74 (kp-1 . hydra--digit-argument)
75 (kp-0 . hydra--digit-argument)
76 (57 . hydra--digit-argument)
77 (56 . hydra--digit-argument)
78 (55 . hydra--digit-argument)
79 (54 . hydra--digit-argument)
80 (53 . hydra--digit-argument)
81 (52 . hydra--digit-argument)
82 (51 . hydra--digit-argument)
83 (50 . hydra--digit-argument)
84 (49 . hydra--digit-argument)
85 (48 . hydra--digit-argument)
86 (45 . hydra--negative-argument)
87 (21 . hydra--universal-argument))))
89 (defun hydra-error/next-error nil "Create a hydra with a \"M-g\" body and the heads:
93 \"k\": `previous-error'
95 The body can be accessed via `hydra-error/body'.
97 Call the head: `next-error'."
100 (catch (quote hydra-disable)
101 (condition-case err (prog1 t (call-interactively (function next-error)))
106 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
107 20 21 (face hydra-face-red)
108 31 32 (face hydra-face-red))))
110 (hydra-set-transient-map
112 (quote (keymap (107 . hydra-error/previous-error)
113 (106 . hydra-error/next-error)
114 (104 . hydra-error/first-error)
115 (kp-subtract . hydra--negative-argument)
116 (kp-9 . hydra--digit-argument)
117 (kp-8 . hydra--digit-argument)
118 (kp-7 . hydra--digit-argument)
119 (kp-6 . hydra--digit-argument)
120 (kp-5 . hydra--digit-argument)
121 (kp-4 . hydra--digit-argument)
122 (kp-3 . hydra--digit-argument)
123 (kp-2 . hydra--digit-argument)
124 (kp-1 . hydra--digit-argument)
125 (kp-0 . hydra--digit-argument)
126 (57 . hydra--digit-argument)
127 (56 . hydra--digit-argument)
128 (55 . hydra--digit-argument)
129 (54 . hydra--digit-argument)
130 (53 . hydra--digit-argument)
131 (52 . hydra--digit-argument)
132 (51 . hydra--digit-argument)
133 (50 . hydra--digit-argument)
134 (49 . hydra--digit-argument)
135 (48 . hydra--digit-argument)
136 (45 . hydra--negative-argument)
137 (21 . hydra--universal-argument))))
139 (defun hydra-error/previous-error nil "Create a hydra with a \"M-g\" body and the heads:
141 \"h\": `first-error',
143 \"k\": `previous-error'
145 The body can be accessed via `hydra-error/body'.
147 Call the head: `previous-error'."
150 (catch (quote hydra-disable)
151 (condition-case err (prog1 t (call-interactively (function previous-error)))
156 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
157 20 21 (face hydra-face-red)
158 31 32 (face hydra-face-red))))
160 (hydra-set-transient-map
162 (quote (keymap (107 . hydra-error/previous-error)
163 (106 . hydra-error/next-error)
164 (104 . hydra-error/first-error)
165 (kp-subtract . hydra--negative-argument)
166 (kp-9 . hydra--digit-argument)
167 (kp-8 . hydra--digit-argument)
168 (kp-7 . hydra--digit-argument)
169 (kp-6 . hydra--digit-argument)
170 (kp-5 . hydra--digit-argument)
171 (kp-4 . hydra--digit-argument)
172 (kp-3 . hydra--digit-argument)
173 (kp-2 . hydra--digit-argument)
174 (kp-1 . hydra--digit-argument)
175 (kp-0 . hydra--digit-argument)
176 (57 . hydra--digit-argument)
177 (56 . hydra--digit-argument)
178 (55 . hydra--digit-argument)
179 (54 . hydra--digit-argument)
180 (53 . hydra--digit-argument)
181 (52 . hydra--digit-argument)
182 (51 . hydra--digit-argument)
183 (50 . hydra--digit-argument)
184 (49 . hydra--digit-argument)
185 (48 . hydra--digit-argument)
186 (45 . hydra--negative-argument)
187 (21 . hydra--universal-argument))))
189 (unless (keymapp (lookup-key global-map (kbd "M-g")))
190 (define-key global-map (kbd "M-g")
192 (define-key global-map [134217831 104]
193 (function hydra-error/first-error))
194 (define-key global-map [134217831 106]
195 (function hydra-error/next-error))
196 (define-key global-map [134217831 107]
197 (function hydra-error/previous-error))
198 (defun hydra-error/body nil "Create a hydra with a \"M-g\" body and the heads:
200 \"h\": `first-error',
202 \"k\": `previous-error'
204 The body can be accessed via `hydra-error/body'."
207 (catch (quote hydra-disable)
208 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
209 20 21 (face hydra-face-red)
210 31 32 (face hydra-face-red))))
212 (hydra-set-transient-map
214 (quote (keymap (107 . hydra-error/previous-error)
215 (106 . hydra-error/next-error)
216 (104 . hydra-error/first-error)
217 (kp-subtract . hydra--negative-argument)
218 (kp-9 . hydra--digit-argument)
219 (kp-8 . hydra--digit-argument)
220 (kp-7 . hydra--digit-argument)
221 (kp-6 . hydra--digit-argument)
222 (kp-5 . hydra--digit-argument)
223 (kp-4 . hydra--digit-argument)
224 (kp-3 . hydra--digit-argument)
225 (kp-2 . hydra--digit-argument)
226 (kp-1 . hydra--digit-argument)
227 (kp-0 . hydra--digit-argument)
228 (57 . hydra--digit-argument)
229 (56 . hydra--digit-argument)
230 (55 . hydra--digit-argument)
231 (54 . hydra--digit-argument)
232 (53 . hydra--digit-argument)
233 (52 . hydra--digit-argument)
234 (51 . hydra--digit-argument)
235 (50 . hydra--digit-argument)
236 (49 . hydra--digit-argument)
237 (48 . hydra--digit-argument)
238 (45 . hydra--negative-argument)
239 (21 . hydra--universal-argument))))
241 (setq prefix-arg current-prefix-arg)))))))
243 (ert-deftest hydra-blue-toggle ()
247 '(defhydra toggle (:color blue)
249 ("t" toggle-truncate-lines "truncate")
250 ("f" auto-fill-mode "fill")
251 ("a" abbrev-mode "abbrev")
254 (defun toggle/toggle-truncate-lines nil "Create a hydra with no body and the heads:
256 \"t\": `toggle-truncate-lines',
257 \"f\": `auto-fill-mode',
258 \"a\": `abbrev-mode',
261 The body can be accessed via `toggle/body'.
263 Call the head: `toggle-truncate-lines'."
266 (catch (quote hydra-disable)
267 (call-interactively (function toggle-truncate-lines))))
268 (defun toggle/auto-fill-mode nil "Create a hydra with no body and the heads:
270 \"t\": `toggle-truncate-lines',
271 \"f\": `auto-fill-mode',
272 \"a\": `abbrev-mode',
275 The body can be accessed via `toggle/body'.
277 Call the head: `auto-fill-mode'."
280 (catch (quote hydra-disable)
281 (call-interactively (function auto-fill-mode))))
282 (defun toggle/abbrev-mode nil "Create a hydra with no body and the heads:
284 \"t\": `toggle-truncate-lines',
285 \"f\": `auto-fill-mode',
286 \"a\": `abbrev-mode',
289 The body can be accessed via `toggle/body'.
291 Call the head: `abbrev-mode'."
294 (catch (quote hydra-disable)
295 (call-interactively (function abbrev-mode))))
296 (defun toggle/nil nil "Create a hydra with no body and the heads:
298 \"t\": `toggle-truncate-lines',
299 \"f\": `auto-fill-mode',
300 \"a\": `abbrev-mode',
303 The body can be accessed via `toggle/body'.
305 Call the head: `nil'."
308 (catch (quote hydra-disable)))
309 (defun toggle/body nil "Create a hydra with no body and the heads:
311 \"t\": `toggle-truncate-lines',
312 \"f\": `auto-fill-mode',
313 \"a\": `abbrev-mode',
316 The body can be accessed via `toggle/body'."
319 (catch (quote hydra-disable)
320 (when hydra-is-helpful (message #("toggle: [t]: truncate, [f]: fill, [a]: abbrev, [q]: cancel." 9 10 (face hydra-face-blue)
321 24 25 (face hydra-face-blue)
322 35 36 (face hydra-face-blue)
323 48 49 (face hydra-face-blue))))
325 (hydra-set-transient-map
327 (quote (keymap (113 . toggle/nil)
328 (97 . toggle/abbrev-mode)
329 (102 . toggle/auto-fill-mode)
330 (116 . toggle/toggle-truncate-lines)
331 (kp-subtract . hydra--negative-argument)
332 (kp-9 . hydra--digit-argument)
333 (kp-8 . hydra--digit-argument)
334 (kp-7 . hydra--digit-argument)
335 (kp-6 . hydra--digit-argument)
336 (kp-5 . hydra--digit-argument)
337 (kp-4 . hydra--digit-argument)
338 (kp-3 . hydra--digit-argument)
339 (kp-2 . hydra--digit-argument)
340 (kp-1 . hydra--digit-argument)
341 (kp-0 . hydra--digit-argument)
342 (57 . hydra--digit-argument)
343 (56 . hydra--digit-argument)
344 (55 . hydra--digit-argument)
345 (54 . hydra--digit-argument)
346 (53 . hydra--digit-argument)
347 (52 . hydra--digit-argument)
348 (51 . hydra--digit-argument)
349 (50 . hydra--digit-argument)
350 (49 . hydra--digit-argument)
351 (48 . hydra--digit-argument)
352 (45 . hydra--negative-argument)
353 (21 . hydra--universal-argument))))
355 (setq prefix-arg current-prefix-arg)))))))
357 (ert-deftest hydra-amaranth-vi ()
358 (unless (version< emacs-version "24.4")
364 (set-cursor-color "#e52b50")
366 (set-cursor-color "#ffffff")
373 (defun hydra-vi/next-line nil "Create a hydra with no body and the heads:
376 \"k\": `previous-line',
379 The body can be accessed via `hydra-vi/body'.
381 Call the head: `next-line'."
383 (set-cursor-color "#e52b50")
385 (catch (quote hydra-disable)
386 (condition-case err (prog1 t (call-interactively (function next-line)))
391 (when hydra-is-helpful (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
392 7 8 (face hydra-face-amaranth)
393 11 12 (face hydra-face-blue))))
395 (hydra-set-transient-map
397 (quote (keymap (7 lambda nil (interactive)
399 (set-cursor-color "#ffffff"))
400 (t lambda nil (interactive)
401 (message "An amaranth Hydra can only exit through a blue head")
402 (hydra-set-transient-map hydra-curr-map t)
403 (when hydra-is-helpful (sit-for 0.8)
404 (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
405 7 8 (face hydra-face-amaranth)
406 11 12 (face hydra-face-blue)))))
408 (107 . hydra-vi/previous-line)
409 (106 . hydra-vi/next-line)
410 (kp-subtract . hydra--negative-argument)
411 (kp-9 . hydra--digit-argument)
412 (kp-8 . hydra--digit-argument)
413 (kp-7 . hydra--digit-argument)
414 (kp-6 . hydra--digit-argument)
415 (kp-5 . hydra--digit-argument)
416 (kp-4 . hydra--digit-argument)
417 (kp-3 . hydra--digit-argument)
418 (kp-2 . hydra--digit-argument)
419 (kp-1 . hydra--digit-argument)
420 (kp-0 . hydra--digit-argument)
421 (57 . hydra--digit-argument)
422 (56 . hydra--digit-argument)
423 (55 . hydra--digit-argument)
424 (54 . hydra--digit-argument)
425 (53 . hydra--digit-argument)
426 (52 . hydra--digit-argument)
427 (51 . hydra--digit-argument)
428 (50 . hydra--digit-argument)
429 (49 . hydra--digit-argument)
430 (48 . hydra--digit-argument)
431 (45 . hydra--negative-argument)
432 (21 . hydra--universal-argument))))
434 (defun hydra-vi/previous-line nil "Create a hydra with no body and the heads:
437 \"k\": `previous-line',
440 The body can be accessed via `hydra-vi/body'.
442 Call the head: `previous-line'."
444 (set-cursor-color "#e52b50")
446 (catch (quote hydra-disable)
447 (condition-case err (prog1 t (call-interactively (function previous-line)))
452 (when hydra-is-helpful (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
453 7 8 (face hydra-face-amaranth)
454 11 12 (face hydra-face-blue))))
456 (hydra-set-transient-map
458 (quote (keymap (7 lambda nil (interactive)
460 (set-cursor-color "#ffffff"))
461 (t lambda nil (interactive)
462 (message "An amaranth Hydra can only exit through a blue head")
463 (hydra-set-transient-map hydra-curr-map t)
464 (when hydra-is-helpful (sit-for 0.8)
465 (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
466 7 8 (face hydra-face-amaranth)
467 11 12 (face hydra-face-blue)))))
469 (107 . hydra-vi/previous-line)
470 (106 . hydra-vi/next-line)
471 (kp-subtract . hydra--negative-argument)
472 (kp-9 . hydra--digit-argument)
473 (kp-8 . hydra--digit-argument)
474 (kp-7 . hydra--digit-argument)
475 (kp-6 . hydra--digit-argument)
476 (kp-5 . hydra--digit-argument)
477 (kp-4 . hydra--digit-argument)
478 (kp-3 . hydra--digit-argument)
479 (kp-2 . hydra--digit-argument)
480 (kp-1 . hydra--digit-argument)
481 (kp-0 . hydra--digit-argument)
482 (57 . hydra--digit-argument)
483 (56 . hydra--digit-argument)
484 (55 . hydra--digit-argument)
485 (54 . hydra--digit-argument)
486 (53 . hydra--digit-argument)
487 (52 . hydra--digit-argument)
488 (51 . hydra--digit-argument)
489 (50 . hydra--digit-argument)
490 (49 . hydra--digit-argument)
491 (48 . hydra--digit-argument)
492 (45 . hydra--negative-argument)
493 (21 . hydra--universal-argument))))
495 (defun hydra-vi/nil nil "Create a hydra with no body and the heads:
498 \"k\": `previous-line',
501 The body can be accessed via `hydra-vi/body'.
503 Call the head: `nil'."
505 (set-cursor-color "#e52b50")
507 (catch (quote hydra-disable)
508 (set-cursor-color "#ffffff")))
509 (defun hydra-vi/body nil "Create a hydra with no body and the heads:
512 \"k\": `previous-line',
515 The body can be accessed via `hydra-vi/body'."
517 (set-cursor-color "#e52b50")
519 (catch (quote hydra-disable)
520 (when hydra-is-helpful (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
521 7 8 (face hydra-face-amaranth)
522 11 12 (face hydra-face-blue))))
524 (hydra-set-transient-map
526 (quote (keymap (7 lambda nil (interactive)
528 (set-cursor-color "#ffffff"))
529 (t lambda nil (interactive)
530 (message "An amaranth Hydra can only exit through a blue head")
531 (hydra-set-transient-map hydra-curr-map t)
532 (when hydra-is-helpful (sit-for 0.8)
533 (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
534 7 8 (face hydra-face-amaranth)
535 11 12 (face hydra-face-blue)))))
537 (107 . hydra-vi/previous-line)
538 (106 . hydra-vi/next-line)
539 (kp-subtract . hydra--negative-argument)
540 (kp-9 . hydra--digit-argument)
541 (kp-8 . hydra--digit-argument)
542 (kp-7 . hydra--digit-argument)
543 (kp-6 . hydra--digit-argument)
544 (kp-5 . hydra--digit-argument)
545 (kp-4 . hydra--digit-argument)
546 (kp-3 . hydra--digit-argument)
547 (kp-2 . hydra--digit-argument)
548 (kp-1 . hydra--digit-argument)
549 (kp-0 . hydra--digit-argument)
550 (57 . hydra--digit-argument)
551 (56 . hydra--digit-argument)
552 (55 . hydra--digit-argument)
553 (54 . hydra--digit-argument)
554 (53 . hydra--digit-argument)
555 (52 . hydra--digit-argument)
556 (51 . hydra--digit-argument)
557 (50 . hydra--digit-argument)
558 (49 . hydra--digit-argument)
559 (48 . hydra--digit-argument)
560 (45 . hydra--negative-argument)
561 (21 . hydra--universal-argument))))
563 (setq prefix-arg current-prefix-arg))))))))
565 (provide 'hydra-test)
567 ;;; hydra-test.el ends here