From: Daniel Mendler <mail@daniel-mendler.de>
To: Juri Linkov <juri@linkov.net>
Cc: Stefan Monnier <monnier@iro.umontreal.ca>, 56613@debbugs.gnu.org
Subject: bug#56613: 29; minibuffer-complete-history throws an error for minibuffer-history-variable=t
Date: Mon, 18 Jul 2022 09:41:09 +0200 [thread overview]
Message-ID: <1a0674ad-8201-e707-5992-ddfaca9ab558@daniel-mendler.de> (raw)
In-Reply-To: <86wncayjaw.fsf@mail.linkov.net>
On 7/18/22 09:24, Juri Linkov wrote:
>> In order to disable sorting from the side of the completion table, it is
>> better to use the completion metadata. This way the sort function will
>> also be picked up by all the alternative completion UIs.
>>
>> (completion-in-region
>> (minibuffer--completion-prompt-end) (point-max)
>> (lambda (str pred action)
>> (if (eq action 'metadata)
>> '(metadata (display-sort-function . identity)
>> (cycle-sort-function . identity))
>> (complete-with-action action completions str pred))))
>
> Thanks for the suggestion, now fixed as well.
Thanks! Since you added this function twice (for history and defaults
completion) you could also introduce a helper function. I use such
helpers in my projects. Maybe such a function would be useful at other
places in the Emacs code base? I haven't grepped but I think this
pattern appears often.
(defun completion-table-presorted (table &rest metadata)
"Disable sorting in the completion UI for TABLE which is already sorted."
(lambda (string pred action)
(if (eq action 'metadata)
`(metadata (display-sort-function . identity)
(cycle-sort-function . identity)
,@metadata)
(complete-with-action action table string pred))))
Or maybe the more general function would be useful too?
(defun completion-table-with-metadata (table &rest metadata)
"Return completion TABLE with METADATA."
(lambda (string pred action)
(if (eq action 'metadata)
`(metadata ,@metadata)
(complete-with-action action table string pred))))
> Stefan added this comment in minibuffer-complete-history:
>
> ;; FIXME: Can we make it work for CRM?
>
> But I can't find a function that would return the
> current completion boundaries to use instead of hard-coding
> minibuffer--completion-prompt-end and point-max. Then
> completing-read-multiple should set locally such a function
> that will use crm-separator and return a cons (BEG . END).
Doesn't it work if you retrieve the boundaries first with
`completion-boundaries` from `minibuffer-completion-table`? In my
Vertico package I use the following code and it works without issues
with CRM. The API requires a little bit of a ceremony.
(let* ((content (minibuffer-contents-no-properties))
(pt (max 0 (- (point) (minibuffer-prompt-end))))
(before (substring content 0 pt))
(after (substring content pt))
(bounds (completion-boundaries
before minibuffer-completion-table
minibuffer-completion-predicate after)))
...)
Daniel
next prev parent reply other threads:[~2022-07-18 7:41 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-17 11:41 bug#56613: 29; minibuffer-complete-history throws an error for minibuffer-history-variable=t Daniel Mendler
2022-07-17 14:43 ` Drew Adams
2022-07-17 14:53 ` Daniel Mendler
2022-07-17 15:32 ` Drew Adams
2022-07-17 18:07 ` Juri Linkov
2022-07-17 20:10 ` Daniel Mendler
2022-07-18 7:24 ` Juri Linkov
2022-07-18 7:41 ` Daniel Mendler [this message]
2022-07-18 15:04 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-18 15:21 ` Daniel Mendler
2022-07-18 15:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-18 15:39 ` Daniel Mendler
2022-07-18 16:19 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-18 17:27 ` Daniel Mendler
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=1a0674ad-8201-e707-5992-ddfaca9ab558@daniel-mendler.de \
--to=mail@daniel-mendler.de \
--cc=56613@debbugs.gnu.org \
--cc=juri@linkov.net \
--cc=monnier@iro.umontreal.ca \
/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).