unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Lars Ingebrigtsen <larsi@gnus.org>
Subject: Re: master 49e06183f5 1/3: Allow REQUIRE-MATCH to be a function
Date: Fri, 10 Jun 2022 10:15:50 -0400	[thread overview]
Message-ID: <jwvk09ohdom.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <20220610082240.A7222C01683@vcs2.savannah.gnu.org> (Lars Ingebrigtsen's message of "Fri, 10 Jun 2022 04:22:40 -0400 (EDT)")

Hi Lars,

>     Allow REQUIRE-MATCH to be a function
>     
>     * doc/lispref/minibuf.texi (Minibuffer Completion): Document it.
>     
>     * lisp/minibuffer.el (completion--complete-and-exit): Allow
>     REQUIRE-MATCH to be a function.
>     (read-file-name): Mention it.

I see the motivation is for things like `read-file-name` where we
can't specify a completion table (otherwise we could also get the same
result with an appropriate completion table whose `test-completion` is
adjusted accordingly).

But besides the `test-completion` part of the completion table, this new
feature also overlaps with the `predicate` argument.  I think it would
be good to write down somewhere how those three compare.

I wonder if that can also be used to solve the problem of completing
file names that "end in .pdf": previously using `test-completion` (via
the completion table or via `predicate`) had the problem that such
a test either ruled out completions to "foo/bar/" (which can be
indispensable on the way to the final "foo/bar/baz.pdf") or spuriously
allow hitting RET on "foo/bar/" even tho it doesn't end in `.pdf`.

> +   ;; The CONFIRM argument is a predicate.
> +   ((and (functionp minibuffer-completion-confirm)
> +         (funcall minibuffer-completion-confirm
> +                  (buffer-substring beg end)))
> +    (funcall exit-function))
> +   ;; See if we have a completion from the table.
> +   ((test-completion (buffer-substring beg end)
> +                     minibuffer-completion-table
> +                     minibuffer-completion-predicate)
> +    ;; FIXME: completion-ignore-case has various slightly
> +    ;; incompatible meanings.  E.g. it can reflect whether the user
> +    ;; wants completion to pay attention to case, or whether the
> +    ;; string will be used in a context where case is significant.
> +    ;; E.g. usually try-completion should obey the first, whereas
> +    ;; test-completion should obey the second.
> +    (when completion-ignore-case
> +      ;; Fixup case of the field, if necessary.
> +      (let* ((string (buffer-substring beg end))
> +             (compl (try-completion
> +                     string
> +                     minibuffer-completion-table
> +                     minibuffer-completion-predicate)))
> +        (when (and (stringp compl) (not (equal string compl))
> +                   ;; If it weren't for this piece of paranoia, I'd replace
> +                   ;; the whole thing with a call to do-completion.
> +                   ;; This is important, e.g. when the current minibuffer's
> +                   ;; content is a directory which only contains a single
> +                   ;; file, so `try-completion' actually completes to
> +                   ;; that file.
> +                   (= (length string) (length compl)))
> +          (completion--replace beg end compl))))
> +    (funcall exit-function))
> +   ;; The user is permitted to exit with an input that's rejected
> +   ;; by test-completion, after confirming her choice.
> +   ((memq minibuffer-completion-confirm '(confirm confirm-after-completion))
> +    (if (or (eq last-command this-command)
> +            ;; For `confirm-after-completion' we only ask for confirmation
> +            ;; if trying to exit immediately after typing TAB (this
> +            ;; catches most minibuffer typos).
> +            (and (eq minibuffer-completion-confirm 'confirm-after-completion)
> +                 (not (memq last-command minibuffer-confirm-exit-commands))))
>          (funcall exit-function)
> -        (minibuffer-message "Confirm")
> -        nil))
> +      (minibuffer-message "Confirm")
> +      nil))

I see that the `minibuffer-completion-confirm` function completely
replaces the usual handling of require-match (i.e. the attempt to fix
the case and the prompting for confirmation).

Maybe this should be better documented, and also AFAICT currently
a `minibuffer-completion-confirm` function cannot reliably reproduce this
behavior by hand because it doesn't have access to `beg` and `end`.
I think we should make this "default behavior" more easily accessible
(e.g. put it into its own function and document it as something that can
be called from `minibuffer-completion-confirm`?).


        Stefan




       reply	other threads:[~2022-06-10 14:15 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <165484935985.12525.14065631018362412932@vcs2.savannah.gnu.org>
     [not found] ` <20220610082240.A7222C01683@vcs2.savannah.gnu.org>
2022-06-10 14:15   ` Stefan Monnier [this message]
2022-06-11 10:57     ` master 49e06183f5 1/3: Allow REQUIRE-MATCH to be a function Lars Ingebrigtsen
2022-06-11 15:03       ` Stefan Monnier
2022-06-11 16:11         ` Lars Ingebrigtsen
2022-06-11 16:29           ` Stefan Monnier
2022-06-12  9:59             ` Lars Ingebrigtsen
2022-06-12 13:18               ` Stefan Monnier
2022-06-13 12:12                 ` Lars Ingebrigtsen
2022-06-13 16:37                   ` Stefan Monnier
2022-06-14 12:02                     ` Lars Ingebrigtsen
2022-06-14 12:44                       ` Stefan Monnier
2022-06-16 12:50                         ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwvk09ohdom.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=larsi@gnus.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).