unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
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





  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).