branch: elpa/llama
commit 65b5d9f4469469e99b8b5aab2b671f09c7450d49
Author: Jonas Bernoulli <jo...@bernoul.li>
Commit: Jonas Bernoulli <jo...@bernoul.li>

    Hide the empty symbol from completing-read
    
    Re https://github.com/minad/vertico/discussions/481.
---
 llama.el | 46 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 41 insertions(+), 5 deletions(-)

diff --git a/llama.el b/llama.el
index 1c63a39b60..4f5fdafa8d 100644
--- a/llama.el
+++ b/llama.el
@@ -82,8 +82,8 @@
 ;;; Code:
 
 ;;;###autoload
-(defmacro ## (fn &rest body)
-    "Expand to a `lambda' expression that wraps around FN and BODY.
+(defmacro llama (fn &rest body)
+  "Expand to a `lambda' expression that wraps around FN and BODY.
 
 This `lambda' expression calls the function FN with arguments
 BODY and returns its value.  Its own arguments are derived from
@@ -128,9 +128,10 @@ Note how `_%3' and `_&6' are removed from the body, 
because their
 names begin with an underscore.  Also note that `_&4' is optional,
 unlike the explicitly specified `_%3'.
 
-The name `##' was chosen because that allows (optionally)
-omitting the whitespace between it and the following symbol.
-It also looks a bit like #\\='function."
+The name `##' was chosen because that allows (optionally) omitting
+the whitespace between it and the following symbol.  If you dislike
+this trickery, you can alternatively use this macro under the name
+`llama'."
   (unless (symbolp fn)
     (signal 'wrong-type-argument (list 'symbolp fn)))
   (let* ((args (make-vector 10 nil))
@@ -168,6 +169,8 @@ It also looks a bit like #\\='function."
         ,@(and rest (list '&rest rest)))
        (,fn ,@body))))
 
+(defalias '## 'llama)
+
 (defconst llama--unused-argument (make-symbol "llama--unused-argument"))
 
 (defun llama--collect (expr args)
@@ -260,6 +263,39 @@ It also looks a bit like #\\='function."
   (advice-add 'elisp-mode-syntax-propertize :override
               'llama--elisp-mode-syntax-propertize))
 
+(defun llama--suspend-empty-symbol-from-collection (fn &rest args)
+  "Unintern the symbol with the empty name during completion.
+
+`##' is the notation for the symbol whose name is the empty string.
+  (intern \"\") => ##
+  (symbol-name \\='##) => \"\"
+
+The `llama' package uses `##' as the name of a macro, which allows
+it to be used akin to syntax, without actually being new syntax.
+(`describe-function' won't let you select `##', but because that is an
+alias for `llama', you can access the documentation under that name.)
+
+This advice prevents the empty string from being offered as a completion
+candidate when `obarray' (or a completion table that internally uses
+that) is used as COLLECTION, by `unintern'ing that symbol temporarily."
+  (let ((plist (symbol-plist '##))
+        (value nil)
+        (bound nil))
+    (with-no-warnings
+      (when (boundp '##)
+        (setq bound t)
+        (setq value ##)))
+    (unwind-protect
+        (progn (unintern "" obarray)
+               (apply fn args))
+      (defalias (intern "") 'llama)
+      (setplist (intern "") plist)
+      (when bound
+        (set (intern "") value)))))
+
+(advice-add 'completing-read :around
+            #'llama--suspend-empty-symbol-from-collection)
+
 ;;; Fontification
 
 (defgroup llama ()

Reply via email to