[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/mines e127c84 30/43: Add fallback function for read-mul
From: |
Stefan Monnier |
Subject: |
[elpa] externals/mines e127c84 30/43: Add fallback function for read-multiple-choice |
Date: |
Mon, 30 Nov 2020 18:44:18 -0500 (EST) |
branch: externals/mines
commit e127c8487994ca08a3116aee3d5eccf32d404428
Author: Tino Calancha <tino.calancha@gmail.com>
Commit: Tino Calancha <tino.calancha@gmail.com>
Add fallback function for read-multiple-choice
read-multiple-choice appeared in Emacs 26. Add fallback
function for Emacs < 26.
* mines.el (mines--read-multiple-choice): New function.
(mines): Use it.
* mines-test.el (mines-test-read-multiple-choice): Add test.
---
mines-tests.el | 16 ++++++++++++++++
mines.el | 41 +++++++++++++++++++++++++++++++++++------
2 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/mines-tests.el b/mines-tests.el
index 9bdf9ca..c5deca1 100644
--- a/mines-tests.el
+++ b/mines-tests.el
@@ -229,6 +229,22 @@
(should (= numb (mines--near-bombs row col))))))))
(when (buffer-live-p buf) (kill-buffer buf))))
+(ert-deftest mines-test-read-multiple-choice ()
+ (if (> emacs-major-version 25)
+ (dolist (char '(?e ?m ?h ??))
+ (cl-letf* (((symbol-function #'read-char) (lambda () char))
+ (str (cdr (assoc char '((?e . "Easy") (?m . "Medium") (?h .
"Hard") (?? . "Help"))))))
+ (should (equal (list char str)
+ (read-multiple-choice "Choose level "
+ '((?e "Easy") (?m "Medium") (?h
"Hard") (?? "Help")))))))
+ (cl-block :help
+ ;; When char is ? `mines--read-multiple-choice' enter a loop until char
+ ;; is a different character. Exit the loop.
+ (dolist (char '(?e ?m ?h ??))
+ (cl-letf (((symbol-function #'read-char)
+ (lambda (&rest _) (if (eq char ??) (cl-return-from :help
nil) char))))
+ (should (mines--read-multiple-choice)))))))
+
(provide 'mines-tests)
;;; mines-tests.el ends here
diff --git a/mines.el b/mines.el
index 7cb9496..744ce4d 100644
--- a/mines.el
+++ b/mines.el
@@ -509,18 +509,47 @@ If called again then unflag it."
(mines-goto to)
(uncover-fn)))))))))
+;; `read-multiple-choice' requires Emacs > 25.
+(defun mines--read-multiple-choice ()
+ (let (choice)
+ (if (> emacs-major-version 25)
+ (setq choice
+ (read-multiple-choice "Choose difficulty level: "
+ '((?e "Easy" "8 columns x 8 rows and 10
mines")
+ (?m "Medium" "16 columns x 16 rows and
40 mines")
+ (?h "Hard" "30 columns x 16 rows and 99
mines")
+ (?c "Custom" "C columns x R rows and M
mines"))))
+ (let ((help-msg "Choose difficulty level:
+
+e: [e] Easy m: Medium h: [h] Hard c:
[c] Custom
+8 columns x 8 rows 16 columns x 16 rows 30 columns x 16 rows C
columns x R rows
+and 10 mines and 40 mines and 99 mines and
M mines
+")
+ (answer
+ (read-char "Choose difficulty level: ([e] Easy, [m] Medium, [h]
Hard, [c] Custom, [?]): ")))
+ (cl-flet ((show-help ()
+ (when (eq answer ??)
+ (let ((help-buf (get-buffer-create "*Multiple
Choice Help*")))
+ (setq answer nil)
+ (with-current-buffer help-buf
+ (and (zerop (buffer-size)) (insert
help-msg))
+ (display-buffer help-buf))))))
+ (if (eq answer ??) (show-help))
+ (while (not (memq answer '(?e ?m ?h ?c ??)))
+ (setq answer (read-char "Choose difficulty level: ([e] Easy, [m]
Medium, [h] Hard, [c] Custom, [?]): "))
+ (show-help))
+ (cond ((eq answer ?e) (list ?e "Easy" "8 columns x 8 rows and 10
mines"))
+ ((eq answer ?m) (list ?m "Medium" "16 columns x 16 rows and 40
mines"))
+ ((eq answer ?h) (list ?h "Hard" "30 columns x 16 rows and 99
mines"))
+ ((eq answer ?c) (list ?c "Custom" "C columns x R rows and M
mines"))))))))
+
;;;###autoload
(defun mines (&optional arg)
"Play the minesweeper game.
Called with a prefix prompt for the difficulty level."
(interactive
(let* ((prefix current-prefix-arg)
- (choice (and prefix
- (read-multiple-choice "Choose difficulty level: "
- '((?e "Easy" "8 columns x 8 rows
and 10 mines")
- (?m "Medium" "16 columns x 16
rows and 40 mines")
- (?h "Hard" "30 columns x 16
rows and 99 mines")
- (?c "Custom" "C columns x R
rows and M mines"))))))
+ (choice (and prefix (mines--read-multiple-choice))))
(when choice
(mines-init (eq ?e (car choice))
(eq ?m (car choice))
- [elpa] externals/mines 226776a 25/43: * mines: Fix compilation warnings, (continued)
- [elpa] externals/mines 226776a 25/43: * mines: Fix compilation warnings, Stefan Monnier, 2020/11/30
- [elpa] externals/mines abc8c9d 26/43: Move game documentation into `mines-mode' docstring, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 7133550 28/43: * mines/mines.el (mines-mode): Move the docstring to where it belongs., Stefan Monnier, 2020/11/30
- [elpa] externals/mines 2241dcd 36/43: * mines/mines.el: Various minor changes, wave 1, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 3308a99 38/43: * packages/mines/mines.el: Keep flag in mines-state, Stefan Monnier, 2020/11/30
- [elpa] externals/mines e090a90 40/43: * mines.el: Make sure the first move is successful, Stefan Monnier, 2020/11/30
- [elpa] externals/mines bea3ad8 42/43: * packages/mines/mines.el (mines-auto-flag): New custom var, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 97e0a05 43/43: * mines.el: Adjust docs for the @ => SPC change, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 92399df 29/43: * packages/mines/mines.el: Bump version to 1.2, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 868e9b9 35/43: * mines.el: Bump version to v1.6, Stefan Monnier, 2020/11/30
- [elpa] externals/mines e127c84 30/43: Add fallback function for read-multiple-choice,
Stefan Monnier <=
- [elpa] externals/mines bf577b0 31/43: Sort the score file from better to worst results, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 179ed77 32/43: Dont prompt user when updating the score file, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 9b07cb6 33/43: Do not uncover flagged cells if the user dont want that, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 34d088c 34/43: Reimplement mines-end-p, Stefan Monnier, 2020/11/30
- [elpa] externals/mines 5920f2d 37/43: * mines/mines.el (mines-grid): Use `bomb` instead of t, Stefan Monnier, 2020/11/30
- [elpa] externals/mines f11e546 41/43: * mines.el (mines-mode-map): Add mouse bindings, Stefan Monnier, 2020/11/30