aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/ai-term.el5
-rw-r--r--modules/config-utilities.el5
-rw-r--r--modules/erc-config.el4
-rw-r--r--modules/system-lib.el23
-rw-r--r--modules/ui-theme.el8
5 files changed, 40 insertions, 5 deletions
diff --git a/modules/ai-term.el b/modules/ai-term.el
index 3beabe6b5..03c9a4046 100644
--- a/modules/ai-term.el
+++ b/modules/ai-term.el
@@ -959,6 +959,8 @@ when BUFFER isn't an AI-term buffer."
(let ((kill-buffer-query-functions nil))
(kill-buffer buffer))))
+(require 'system-lib)
+
(defun cj/--ai-term-close-target ()
"Return the AI-term buffer `cj/ai-term-close' should act on, or nil.
@@ -973,7 +975,8 @@ buffers; nil when none are alive."
((null (cdr buffers)) (car buffers))
(t (get-buffer
(completing-read "Close AI terminal: "
- (mapcar #'buffer-name buffers) nil t))))))))
+ (cj/completion-table 'buffer (mapcar #'buffer-name buffers))
+ nil t))))))))
(defun cj/ai-term-close ()
"Gracefully close an AI-term agent: kill its tmux session and buffer.
diff --git a/modules/config-utilities.el b/modules/config-utilities.el
index f448327c1..0c98a896c 100644
--- a/modules/config-utilities.el
+++ b/modules/config-utilities.el
@@ -114,11 +114,14 @@ Signals `user-error' if METHOD-SYMBOL is nil or not fboundp."
(with-timer title
(funcall method-symbol)))
+(require 'system-lib)
+
(defun cj/benchmark-this-method ()
"Prompt for a title and method name, then time the execution of the method."
(interactive)
(let* ((title (read-string "Enter the title for the timing: "))
- (method-name (completing-read "Enter the method name to time: " obarray
+ (method-name (completing-read "Enter the method name to time: "
+ (cj/completion-table 'function obarray)
#'fboundp t))
(method-symbol (intern-soft method-name)))
(condition-case err
diff --git a/modules/erc-config.el b/modules/erc-config.el
index 3e98a66a3..4eac812c4 100644
--- a/modules/erc-config.el
+++ b/modules/erc-config.el
@@ -140,6 +140,8 @@ Change this value to use a different nickname.")
server-buffers))
+(require 'system-lib)
+
(defun cj/erc-switch-to-buffer-with-completion ()
"Switch to an ERC buffer using completion.
If no ERC buffers exist, prompt to connect to a server.
@@ -148,7 +150,7 @@ Buffer names are shown with server context for clarity."
(let* ((erc-buffers (erc-buffer-list))
(buffer-names (mapcar #'buffer-name erc-buffers)))
(if buffer-names
- (let ((selected (completing-read "Switch to ERC buffer: " buffer-names nil t)))
+ (let ((selected (completing-read "Switch to ERC buffer: " (cj/completion-table 'buffer buffer-names) nil t)))
(switch-to-buffer selected))
(message "No ERC buffers found.")
(when (y-or-n-p "Connect to an IRC server? ")
diff --git a/modules/system-lib.el b/modules/system-lib.el
index 49bb6cd1a..8b954c6a9 100644
--- a/modules/system-lib.el
+++ b/modules/system-lib.el
@@ -164,6 +164,29 @@ contributes its own modes regardless of load order."
(setq font-lock-global-modes
(cj/--font-lock-global-modes-excluding font-lock-global-modes mode))))
+(defun cj/completion-table (category collection)
+ "Return a completion table over COLLECTION tagged with completion CATEGORY.
+COLLECTION is anything `completing-read' accepts (list, alist, obarray, hash
+table, or another table). The table reports CATEGORY in its metadata so
+marginalia (and embark, consult, sorting) can recognize and annotate the
+candidates. Use a standard category (file, buffer, function, theme, ...) when
+the candidates match one; marginalia then annotates them with no further work."
+ (lambda (string predicate action)
+ (if (eq action 'metadata)
+ `(metadata (category . ,category))
+ (complete-with-action action collection string predicate))))
+
+(defun cj/completion-table-annotated (category annotate collection)
+ "Like `cj/completion-table' but also attach ANNOTATE as the annotation function.
+ANNOTATE is called with a candidate string and returns its annotation suffix, or
+nil. Use this for a custom CATEGORY that marginalia has no built-in annotator
+for: marginalia falls back to the table's own annotation function."
+ (lambda (string predicate action)
+ (if (eq action 'metadata)
+ `(metadata (category . ,category)
+ (annotation-function . ,annotate))
+ (complete-with-action action collection string predicate))))
+
(defun cj/format-region-with-program (program &rest args)
"Replace the current buffer with PROGRAM ARGS run over its contents, via argv.
Runs PROGRAM (with ARGS) on the whole buffer through `call-process-region'
diff --git a/modules/ui-theme.el b/modules/ui-theme.el
index eb4efd9b5..499e71a49 100644
--- a/modules/ui-theme.el
+++ b/modules/ui-theme.el
@@ -37,13 +37,17 @@
;; ------------------------------- Switch Themes -------------------------------
;; loads themes in completing read, then persists via the functions below
+(require 'system-lib)
+
(defun cj/switch-themes ()
"Function to switch themes and save chosen theme name for persistence.
Unloads any other applied themes before applying the chosen theme."
(interactive)
(let ((chosentheme (completing-read "Load custom theme: "
- (mapcar #'symbol-name
- (custom-available-themes)))))
+ (cj/completion-table
+ 'theme
+ (mapcar #'symbol-name
+ (custom-available-themes))))))
(cj/theme-disable-all)
(cj/theme-load-name chosentheme))
(cj/save-theme-to-file))