|
@@ -1479,94 +1479,6 @@ Use PREFIX as a prefix for the name of the indirect buffer."
|
|
|
(unless (org-kill-is-subtree-p tree)
|
|
|
(error "Template is not a valid Org entry or tree")))
|
|
|
|
|
|
-(defun org-mks (table title &optional prompt specials)
|
|
|
- "Select a member of an alist with multiple keys.
|
|
|
-
|
|
|
-TABLE is the alist which should contain entries where the car is a string.
|
|
|
-There should be two types of entries.
|
|
|
-
|
|
|
-1. prefix descriptions like (\"a\" \"Description\")
|
|
|
- This indicates that `a' is a prefix key for multi-letter selection, and
|
|
|
- that there are entries following with keys like \"ab\", \"ax\"...
|
|
|
-
|
|
|
-2. Select-able members must have more than two elements, with the first
|
|
|
- being the string of keys that lead to selecting it, and the second a
|
|
|
- short description string of the item.
|
|
|
-
|
|
|
-The command will then make a temporary buffer listing all entries
|
|
|
-that can be selected with a single key, and all the single key
|
|
|
-prefixes. When you press the key for a single-letter entry, it is selected.
|
|
|
-When you press a prefix key, the commands (and maybe further prefixes)
|
|
|
-under this key will be shown and offered for selection.
|
|
|
-
|
|
|
-TITLE will be placed over the selection in the temporary buffer,
|
|
|
-PROMPT will be used when prompting for a key. SPECIAL is an
|
|
|
-alist with (\"key\" \"description\") entries. When one of these
|
|
|
-is selected, only the bare key is returned."
|
|
|
- (save-window-excursion
|
|
|
- (let ((inhibit-quit t)
|
|
|
- (buffer (org-switch-to-buffer-other-window "*Org Select*"))
|
|
|
- (prompt (or prompt "Select: "))
|
|
|
- current)
|
|
|
- (unwind-protect
|
|
|
- (catch 'exit
|
|
|
- (while t
|
|
|
- (erase-buffer)
|
|
|
- (insert title "\n\n")
|
|
|
- (let ((des-keys nil)
|
|
|
- (allowed-keys '("\C-g"))
|
|
|
- (cursor-type nil))
|
|
|
- ;; Populate allowed keys and descriptions keys
|
|
|
- ;; available with CURRENT selector.
|
|
|
- (let ((re (format "\\`%s\\(.\\)\\'"
|
|
|
- (if current (regexp-quote current) "")))
|
|
|
- (prefix (if current (concat current " ") "")))
|
|
|
- (dolist (entry table)
|
|
|
- (pcase entry
|
|
|
- ;; Description.
|
|
|
- (`(,(and key (pred (string-match re))) ,desc)
|
|
|
- (let ((k (match-string 1 key)))
|
|
|
- (push k des-keys)
|
|
|
- (push k allowed-keys)
|
|
|
- (insert prefix "[" k "]" "..." " " desc "..." "\n")))
|
|
|
- ;; Usable entry.
|
|
|
- (`(,(and key (pred (string-match re))) ,desc . ,_)
|
|
|
- (let ((k (match-string 1 key)))
|
|
|
- (insert prefix "[" k "]" " " desc "\n")
|
|
|
- (push k allowed-keys)))
|
|
|
- (_ nil))))
|
|
|
- ;; Insert special entries, if any.
|
|
|
- (when specials
|
|
|
- (insert "----------------------------------------------------\
|
|
|
----------------------------\n")
|
|
|
- (pcase-dolist (`(,key ,description) specials)
|
|
|
- (insert (format "[%s] %s\n" key description))
|
|
|
- (push key allowed-keys)))
|
|
|
- ;; Display UI and let user select an entry or
|
|
|
- ;; a sub-level prefix.
|
|
|
- (goto-char (point-min))
|
|
|
- (unless (pos-visible-in-window-p (point-max))
|
|
|
- (org-fit-window-to-buffer))
|
|
|
- (message prompt)
|
|
|
- (let ((pressed (char-to-string (read-char-exclusive))))
|
|
|
- (while (not (member pressed allowed-keys))
|
|
|
- (message "Invalid key `%s'" pressed) (sit-for 1)
|
|
|
- (message prompt)
|
|
|
- (setq pressed (char-to-string (read-char-exclusive))))
|
|
|
- (setq current (concat current pressed))
|
|
|
- (cond
|
|
|
- ((equal pressed "\C-g") (user-error "Abort"))
|
|
|
- ;; Selection is a prefix: open a new menu.
|
|
|
- ((member pressed des-keys))
|
|
|
- ;; Selection matches an association: return it.
|
|
|
- ((let ((entry (assoc current table)))
|
|
|
- (and entry (throw 'exit entry))))
|
|
|
- ;; Selection matches a special entry: return the
|
|
|
- ;; selection prefix.
|
|
|
- ((assoc current specials) (throw 'exit current))
|
|
|
- (t (error "No entry available")))))))
|
|
|
- (when buffer (kill-buffer buffer))))))
|
|
|
-
|
|
|
;;; The template code
|
|
|
(defun org-capture-select-template (&optional keys)
|
|
|
"Select a capture template.
|