help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: result of completing-read contradicting require-match


From: Jean Louis
Subject: Re: result of completing-read contradicting require-match
Date: Sat, 2 Jul 2022 22:20:29 +0300
User-agent: Mutt/+ () (2022-05-21)

* carlmarcos--- via Users list for the GNU Emacs text editor 
<help-gnu-emacs@gnu.org> [2022-07-02 21:59]:
> I am using completing-read that uses require-match, without initial-input and 
> withoutdef.
> 
> If I press return so that the input is neither "name" or "name-mode", it 
> seems that an empty
> string is returned.  The result seems to contradict require-match being `t'.
> 

(let* ((cseq '("name" "name-mode"))
       (csel (completing-read "Type: " cseq nil t nil)))
  csel) ⇒ then after pressing ENTER I get: ""


REQUIRE-MATCH can take the following values:
- t means that the user is not allowed to exit unless the input is (or
  completes to) an element of COLLECTION or is null.
- nil means that the user can exit with any input.
- ‘confirm’ means that the user can exit with any input, but she needs
  to confirm her choice if the input is not an element of COLLECTION.
- ‘confirm-after-completion’ means that the user can exit with any
  input, but she needs to confirm her choice if she called
  ‘minibuffer-complete’ right before ‘minibuffer-complete-and-exit’
  and the input is not an element of COLLECTION.
- a function, which will be called with the input as the parameter.
  If it returns a non-nil value, the minibuffer is exited with that value.
- anything else behaves like t except that typing RET does not exit if it
  does non-null completion.

I guess that simple pressing of ENTER means "null" in this case.
But if anything is chosen, then it must be an element of the
collection.

If you then add default, then it would get the first value:
 
(let* ((cseq '("name" "name-mode"))
       (csel (completing-read "Type: " cseq nil t nil nil (car cseq))))
  csel) ⇒ then after pressing ENTER I get: "name"

other way to persist asking until you get the true result is here:
 
(defun rcd-repeat-until-not-empty-string (function &rest args)
  "Repeat FUNCTION with optional ARGS until result is not empty string."
  (let ((result))
    (while (string-empty-p (setq result (apply function args))))
      result))

(defun my-fun ()
  (let* ((cseq '("name" "name-mode"))
         (csel (completing-read "Type: " cseq nil t nil nil nil)))
    csel))

In this case it will keep asking you until you enter something.

(rcd-repeat-until-not-empty-string 'my-fun) ⇒ "name-mode"


-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]