branch: externals/crdt commit 6726c7f2d07092b04964bb13b1cf4bb5c8ce29b9 Author: Qiantan Hong <qh...@alum.mit.edu> Commit: Qiantan Hong <qh...@alum.mit.edu>
Add special cases for completions when there are 0 or 1 candidates --- crdt.el | 56 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/crdt.el b/crdt.el index 31bb761cf1..c3aea42877 100644 --- a/crdt.el +++ b/crdt.el @@ -688,26 +688,35 @@ Otherwise, return the list of names for client sessions." (cl-find name crdt--session-list :test 'equal :key #'crdt--session-urlstr)) +(defsubst crdt--completing-read (prompt collection &optional initial-input) + "Like (completing-read PROMPT COLLECTION nil t INITIAL-INPUT). +Do better when there are 0 or 1 candidates." + (if collection + (if (cdr collection) + (completing-read prompt collection nil t initial-input) + (car collection)) + (signal 'quit "No candidates"))) + (defun crdt--read-session (&optional filter) "Prompt for a session name and return the corresponding session. FILTER can be nil, 'server or 'client." (crdt--get-session - (completing-read (format "Choose a%s session: " - (cl-ecase filter - ((server) " server") - ((client) " client") - ((nil) ""))) - (cl-ecase filter - ((server) (crdt--get-session-names t)) - ((client) (crdt--get-session-names nil)) - ((nil) (mapcar #'crdt--session-urlstr crdt--session-list))) - nil t - (when (and crdt--session - (cl-ecase filter - ((server) (crdt--server-p)) - ((client) (not (crdt--server-p))) - ((nil) t))) - (crdt--session-urlstr crdt--session))))) + (crdt--completing-read + (format "Choose a%s session: " + (cl-ecase filter + ((server) " server") + ((client) " client") + ((nil) ""))) + (cl-ecase filter + ((server) (crdt--get-session-names t)) + ((client) (crdt--get-session-names nil)) + ((nil) (mapcar #'crdt--session-urlstr crdt--session-list))) + (when (and crdt--session + (cl-ecase filter + ((server) (crdt--server-p)) + ((client) (not (crdt--server-p))) + ((nil) t))) + (crdt--session-urlstr crdt--session))))) (defun crdt--read-session-maybe (&optional filter) "Prompt for a session name and return the corresponding session. @@ -782,12 +791,12 @@ If DISPLAY-BUFFER is provided, display the output there." (defun crdt--read-buffer (session) "Prompt for a buffer network name in SESSION." - (completing-read "Choose a buffer: " - (hash-table-keys (crdt--session-buffer-table session)) - nil t - (when (and (eq crdt--session session) - crdt--buffer-network-name) - crdt--buffer-network-name))) + (crdt--completing-read + "Choose a buffer: " + (hash-table-keys (crdt--session-buffer-table session)) + (when (and (eq crdt--session session) + crdt--buffer-network-name) + crdt--buffer-network-name))) (defun crdt--read-buffer-maybe (session) "Prompt for a buffer network name in SESSION. @@ -876,8 +885,7 @@ Directly return the buffer network name under point if in the buffer menu." (push (format "%s %s" k (crdt--contact-metadata-name v)) candidates)) (crdt--session-contact-table session)) (let ((name - (completing-read "Choose a user: " - candidates nil t))) + (crdt--completing-read "Choose a user: " candidates))) (string-to-number (car (split-string name)))))) (defun crdt--read-user-maybe (session)