summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.org173
-rw-r--r--tests/live-test.el102
2 files changed, 97 insertions, 178 deletions
diff --git a/README.org b/README.org
index 1ad8792..2e797f2 100644
--- a/README.org
+++ b/README.org
@@ -47,82 +47,103 @@ state, a popup with switches, sub-menus, inapt entries, dynamic
descriptions, and prefix argument support.
#+begin_src emacs-lisp
-(defvar-local kp-test--name nil)
-
-(defun kp-test--render ()
- "Redraw the *kp-test* buffer from buffer-local state."
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert (propertize "keymap-popup live test\n" 'face 'bold)
- (make-string 40 ?-) "\n\n"
- (format " Name: %s\n" (or kp-test--name "(not set)"))
- "\n"
- (propertize "Press h for popup, q to quit.\n" 'face 'shadow))))
-
-(defun kp-test--refresh ()
- (interactive)
- (kp-test--render)
- (message "Refreshed"))
-
-(defun kp-test--greet ()
- "Greet using buffer-local state."
- (interactive)
- (let ((name (or kp-test--name "world"))
- (loud current-prefix-arg))
- (message (if loud
- (format "%s!!!" (upcase name))
- (format "Hello, %s." name)))
- (kp-test--render)))
-
-(defun kp-test--sub-action ()
- (interactive)
- (message "Sub-menu action! prefix=%s" current-prefix-arg))
-
-(keymap-popup-define kp-test--sub-map
- :group "Sub-menu"
- "s" ("Sub action" kp-test--sub-action)
- "x" ("Greet from sub" kp-test--greet))
-
-(keymap-popup-define kp-test--map
- "Test popup"
- :description "keymap-popup live test"
- :group "Actions"
- "a" ("Greet" kp-test--greet :c-u "SHOUT (C-u)")
- "g" ("Refresh" kp-test--refresh :stay-open t)
- :group "Infixes"
- "v" ("Verbose" :switch kp-test--verbose)
- "n" ((lambda () (concat "Name ="
- (if (and kp-test--name (not (string-empty-p kp-test--name)))
- (propertize kp-test--name 'face 'success)
- (propertize "?" 'face 'warning))))
- (lambda () (interactive)
- (setq-local kp-test--name (read-string "Your name: ")))
- :stay-open t)
- :group "Navigate"
- "s" ("Sub-menu" :keymap kp-test--sub-map)
- "q" ("Quit" quit-window)
- :row
- :group "Inapt (entry-level)"
- "m" ("Merge (always blocked)" kp-test--greet :inapt-if (lambda () t))
- "d" ("Dynamic inapt" kp-test--greet
- :inapt-if (lambda () (not kp-test--verbose)))
- :group ("Group inapt (when verbose off)"
- :inapt-if (lambda () (not kp-test--verbose)))
- "x" ("Group-blocked cmd" kp-test--greet)
- :group ("Toggle (visible when verbose)"
- :if (lambda () kp-test--verbose))
- "t" ("Verbose-only action" kp-test--greet))
-
-(defun kp-test ()
- "Open the *kp-test* buffer and activate the popup."
- (interactive)
- (let ((buf (get-buffer-create "*kp-test*")))
- (with-current-buffer buf
- (setq-local buffer-read-only t)
- (kp-test--render)
- (use-local-map kp-test--map))
- (pop-to-buffer-same-window buf)
- (keymap-popup kp-test--map)))
+ (require 'keymap-popup)
+
+ ;; Force fresh keymaps on re-eval (defvar won't re-set bound variables)
+ (mapc #'makunbound
+ (cl-remove-if-not #'boundp '(kp-test--map kp-test--sub-map)))
+
+ ;;; Buffer rendering
+
+ (defvar-local kp-test--name nil)
+
+
+ (defun kp-test--render ()
+ "Redraw the *kp-test* buffer from buffer-local state."
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (insert (propertize "keymap-popup live test\n" 'face 'bold)
+ (make-string 40 ?-) "\n\n"
+ (format " Name: %s\n" (or kp-test--name "(not set)"))
+ "\n"
+ (propertize "Press h for popup, H for post-frame, q to quit.\n" 'face 'shadow))))
+
+ (defun kp-test--refresh ()
+ "Refresh the display (stay-open)."
+ (interactive)
+ (kp-test--render)
+ (message "Refreshed"))
+
+ ;;; Commands
+
+ (defun kp-test--greet ()
+ "Greet using buffer-local state."
+ (interactive)
+ (let ((name (or kp-test--name "world"))
+ (loud current-prefix-arg))
+ (message (if loud
+ (format "%s!!!" (upcase name))
+ (format "Hello, %s." name)))
+ (kp-test--render)))
+
+ (defun kp-test--sub-action ()
+ (interactive)
+ (message "Sub-menu action! prefix=%s" current-prefix-arg))
+
+ ;;; Sub-menu keymap
+
+ (keymap-popup-define kp-test--sub-map
+ :group "Sub-menu"
+ "s" ("Sub action" kp-test--sub-action)
+ "x" ("Greet from sub" kp-test--greet))
+
+ ;;; Root keymap
+
+ (keymap-popup-define kp-test--map
+ "Test popup"
+ :description "keymap-popup live test"
+ :group "Actions"
+ "a" ("Greet" kp-test--greet :c-u "SHOUT (C-u)")
+ "g" ("Refresh" kp-test--refresh :stay-open t)
+ :group "Infixes"
+ "v" ("Verbose" :switch kp-test--verbose)
+ "n" ((lambda () (concat "Name ="
+ (if (and kp-test--name (not (string-empty-p kp-test--name)))
+ (propertize kp-test--name 'face 'success)
+ (propertize "?" 'face 'warning))))
+ (lambda () (interactive)
+ (setq-local kp-test--name (read-string "Your name: ")))
+ :stay-open t)
+ :group "Navigate"
+ "s" ("Sub-menu" :keymap kp-test--sub-map)
+ "q" ("Quit" quit-window)
+ "H" ("Popup (child-frame)" (lambda () (interactive)
+ (let ((keymap-popup-backend 'child-frame))
+ (keymap-popup kp-test--map))))
+ :row
+ :group "Inapt (entry-level)"
+ "m" ("Merge (always blocked)" kp-test--greet :inapt-if (lambda () t))
+ "d" ("Dynamic inapt" kp-test--greet
+ :inapt-if (lambda () (not kp-test--verbose)))
+ :group ("Group inapt (when verbose off)" :inapt-if (lambda () (not kp-test--verbose)))
+ "x" ("Group-blocked cmd" kp-test--greet)
+ :group ("Toggle (visible when verbose)" :if (lambda () kp-test--verbose))
+ "t" ("Verbose-only action" kp-test--greet))
+
+ ;;; Entry point
+
+ (defun kp-test ()
+ "Open the *kp-test* buffer and activate the popup.
+ h opens side-window popup, H opens child-frame popup."
+ (interactive)
+ (let ((buf (get-buffer-create "*kp-test*")))
+ (with-current-buffer buf
+ (setq-local buffer-read-only t)
+ (kp-test--render)
+ (use-local-map kp-test--map))
+ (pop-to-buffer-same-window buf)
+ (keymap-popup kp-test--map)))
+
#+end_src
** Annotating existing keymaps
diff --git a/tests/live-test.el b/tests/live-test.el
deleted file mode 100644
index 97efeda..0000000
--- a/tests/live-test.el
+++ /dev/null
@@ -1,102 +0,0 @@
-;;; live-test.el --- Interactive test harness -*- lexical-binding: t; -*-
-
-;; Eval this buffer to test keymap-popup interactively.
-;; Then run: M-x kp-test
-
-(load (expand-file-name
- "../keymap-popup.el"
- (file-name-directory (or load-file-name buffer-file-name))))
-
-;; Force fresh keymaps on re-eval (defvar won't re-set bound variables)
-(mapc #'makunbound
- (cl-remove-if-not #'boundp '(kp-test--map kp-test--sub-map)))
-
-;;; Buffer rendering
-
-(defvar-local kp-test--name nil)
-
-
-(defun kp-test--render ()
- "Redraw the *kp-test* buffer from buffer-local state."
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert (propertize "keymap-popup live test\n" 'face 'bold)
- (make-string 40 ?-) "\n\n"
- (format " Name: %s\n" (or kp-test--name "(not set)"))
- "\n"
- (propertize "Press h for popup, q to quit.\n" 'face 'shadow))))
-
-(defun kp-test--refresh ()
- "Refresh the display (stay-open)."
- (interactive)
- (kp-test--render)
- (message "Refreshed"))
-
-;;; Commands
-
-(defun kp-test--greet ()
- "Greet using buffer-local state."
- (interactive)
- (let ((name (or kp-test--name "world"))
- (loud current-prefix-arg))
- (message (if loud
- (format "%s!!!" (upcase name))
- (format "Hello, %s." name)))
- (kp-test--render)))
-
-(defun kp-test--sub-action ()
- (interactive)
- (message "Sub-menu action! prefix=%s" current-prefix-arg))
-
-;;; Sub-menu keymap
-
-(keymap-popup-define kp-test--sub-map
- :group "Sub-menu"
- "s" ("Sub action" kp-test--sub-action)
- "x" ("Greet from sub" kp-test--greet))
-
-;;; Root keymap
-
-(keymap-popup-define kp-test--map
- "Test popup"
- :description "keymap-popup live test"
- :group "Actions"
- "a" ("Greet" kp-test--greet :c-u "SHOUT (C-u)")
- "g" ("Refresh" kp-test--refresh :stay-open t)
- :group "Infixes"
- "v" ("Verbose" :switch kp-test--verbose)
- "n" ((lambda () (concat "Name ="
- (if (and kp-test--name (not (string-empty-p kp-test--name)))
- (propertize kp-test--name 'face 'success)
- (propertize "?" 'face 'warning))))
- (lambda () (interactive)
- (setq-local kp-test--name (read-string "Your name: ")))
- :stay-open t)
- :group "Navigate"
- "s" ("Sub-menu" :keymap kp-test--sub-map)
- "q" ("Quit" quit-window)
- :row
- :group "Inapt (entry-level)"
- "m" ("Merge (always blocked)" kp-test--greet :inapt-if (lambda () t))
- "d" ("Dynamic inapt" kp-test--greet
- :inapt-if (lambda () (not kp-test--verbose)))
- :group ("Group inapt (when verbose off)" :inapt-if (lambda () (not kp-test--verbose)))
- "x" ("Group-blocked cmd" kp-test--greet)
- :group ("Toggle (visible when verbose)" :if (lambda () kp-test--verbose))
- "t" ("Verbose-only action" kp-test--greet))
-
-;;; Entry point
-
-(defun kp-test ()
- "Open the *kp-test* buffer and activate the popup."
- (interactive)
- (let ((buf (get-buffer-create "*kp-test*")))
- (with-current-buffer buf
- (setq-local buffer-read-only t)
- (kp-test--render)
- (use-local-map kp-test--map))
- (pop-to-buffer-same-window buf)
- (keymap-popup kp-test--map)))
-
-(provide 'live-test)
-;;; live-test.el ends here