summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThanos Apollo <public@thanosapollo.org>2026-04-30 06:26:46 +0300
committerThanos Apollo <public@thanosapollo.org>2026-04-30 06:26:46 +0300
commitab61c25601691c290253784ee4e3494d1fde0e87 (patch)
tree14d9db78245cd1f9f7ff2fbdc824880f97f6671d
parent5d6a2fb5bd44d298b39303256ea83f5538c06fe8 (diff)
readme: annotate example with dynamic descriptions and submenus
-rw-r--r--README.org98
1 files changed, 91 insertions, 7 deletions
diff --git a/README.org b/README.org
index f5cc096..48b9536 100644
--- a/README.org
+++ b/README.org
@@ -149,14 +149,98 @@ descriptions, and prefix argument support.
** Annotating existing keymaps
#+begin_src emacs-lisp
-(keymap-popup-annotate dired-mode-map
- :group "Navigate"
- dired-next-line "Next"
- dired-previous-line "Previous"
- :group "Mark"
- dired-mark "Mark"
- dired-unmark "Unmark")
+ (keymap-popup-annotate dired-mode-map
+ :popup-key "h"
+ :group "Navigate"
+ dired-next-line "Next"
+ dired-previous-line "Previous"
+ :group "Mark"
+ dired-mark "Mark"
+ dired-unmark "Unmark")
#+end_src
Keys are resolved dynamically via =where-is-internal=, so the popup
always reflects the user's current bindings.
+
+*** Full example
+#+begin_src emacs-lisp
+ (require 'dired)
+ (require 'dired-x)
+
+ ;;; Helpers
+
+ (defun keymap-popup-live-test--marked-p ()
+ "Non-nil when at least one file is marked."
+ (dired-get-marked-files nil nil nil t))
+
+ (defun keymap-popup-live-test--marked-count ()
+ "Return count of marked files as a string."
+ (let ((files (dired-get-marked-files nil nil nil t)))
+ (if (and files (not (eq (car files) t)))
+ (format " [%d marked]" (length files))
+ "")))
+
+ ;;; Sub-menu: mark operations
+
+ (keymap-popup-define keymap-popup-live-test-mark-map
+ :description "Mark operations"
+ :group "Mark"
+ "m" ("Mark" dired-mark :stay-open t)
+ "u" ("Unmark" dired-unmark :stay-open t)
+ "U" ("Unmark All" dired-unmark-all-marks)
+ "t" ("Toggle" dired-toggle-marks :stay-open t)
+ :group ("Regexp" :inapt-if (lambda () (not (keymap-popup-live-test--marked-p))))
+ "r" ("Rename" dired-do-rename-regexp)
+ "c" ("Copy" dired-do-copy-regexp)
+ :group "Flag"
+ "#" ("Auto-save files" dired-flag-auto-save-files :stay-open t)
+ "~" ("Backups" dired-flag-backup-files :stay-open t)
+ "x" ("Delete Flagged" dired-do-flagged-delete))
+
+ ;;; Main annotated popup for dired-mode-map
+
+ (keymap-popup-annotate dired-mode-map
+ :popup-key "?"
+ :exit-key "x"
+ :description (lambda ()
+ (format "Dired: %s%s"
+ (abbreviate-file-name default-directory)
+ (keymap-popup-live-test--marked-count)))
+ :group "File"
+ dired-find-file-other-window "Open other"
+ dired-view-file "View"
+ dired-do-copy "Copy"
+ dired-do-rename "Rename"
+ dired-do-delete "Delete"
+ dired-do-shell-command "Shell cmd"
+ dired-do-async-shell-command "Shell cmd &"
+ :group "Navigate"
+ dired-up-directory (lambda ()
+ (format "Up to %s"
+ (abbreviate-file-name
+ (file-name-directory
+ (directory-file-name default-directory)))))
+ dired-previous-line "Prev"
+ dired-next-line "Next"
+ dired-goto-file "Goto file"
+ :group "Directory"
+ revert-buffer "Revert"
+ wdired-change-to-wdired-mode "Edit (wdired)"
+ dired-hide-details-mode (lambda ()
+ (if (bound-and-true-p dired-hide-details-mode)
+ "Show details" "Hide details"))
+ dired-omit-mode (lambda ()
+ (if (bound-and-true-p dired-omit-mode)
+ "Show omitted" "Omit files"))
+ dired-create-directory "New directory"
+ ;; Sub-menu via string key + :keymap
+ "M" ("Mark" :keymap keymap-popup-live-test-mark-map)
+ :group ("Bulk" :inapt-if (lambda () (not (keymap-popup-live-test--marked-p))))
+ dired-do-chmod "Chmod"
+ dired-do-chown "Chown"
+ dired-do-compress "Compress")
+
+ (dired default-directory)
+ (message "Press ? in the dired buffer to open the popup")
+
+#+end_src