all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: "João Távora" <joaotavora@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: scratch/backend-completion c807121fbd 1/2: Add lisp/backend-completion.el
Date: Tue, 29 Nov 2022 16:18:57 -0500	[thread overview]
Message-ID: <jwvv8mxpjrd.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <878rjzuhgv.fsf@gmail.com> ("João Távora"'s message of "Fri, 25 Nov 2022 16:28:00 +0000")

>> Maybe a good way to do that is to provide a (backend-completion-table
>> FUNC CATEGORY &optional METADATA) where FUN is a function which handles
>> the tryc and allc cases (maybe the `tryc` handling could even be
>> optional, depending on how the `tryc` case is usually handled (do
>> backends often provide something usable for `tryc`?)).  That function
>> would then return an appropriate completion-table (function), and would
>> make sure along the way that CATEGORY is mapped to `completion-backend`
>> in the `completion-category-defaults`.
>
> I get the idea, I think.  I thought about this, but I'm not sure this
> can be made generic enough to service the three examples I know of:
> Eglot, SLY and the eel.el thing I've been using lately.

I can't see why it wouldn't be just as general as what we have now.

    (defun backend-completion-table ( tryc-function allc-function
                                      category &optional metadata)
      (unless (assq category completion-category-defaults)
        (push `(,category (styles completion-backend))
              `completion-category-defaults))
      (lambda (string pred action)
        (pcase action
          (`metadata
           `(metadata (category . ,category) . ,metadata))
          (`(backend-completion-tryc . ,point)
           ;; FIXME: Obey `pred`?  Pass it to `tryc`?
           `(backend-completion-tryc . ,(funcall tryc string point)))
          (`(backend-completion-allc . ,point)
           (let ((all (funcall allc string point)))
             `(backend-completion-allc . ,(seq-filter pred all))))
          (`(boundaries . ,_) nil)
          (t
           (let ((all (funcall allc string (length string))))
             (complete-with-action action all string pred))))))

>> That `backend-completion-table` would also have the benefit that it
>> could make sure the completion-table it returns also behaves sanely
>> with other styles (i.e. also handle the "normal" completion table
>> requests), whereas otherwise the temptation would be very high for users
>> of this package to use "completion table functions" which only handle
>> the `backend-completion-tryc/allc` requests and fail pathetically when
>> another style is used.  Similarly `backend-completion-table` could also
>> make sure PRED is obeyed.
>
> Alright.  But please, follow up with some code.  You're probably right,
> but this whole thing is too complicated for me to understand.

See above.

>>>  (add-to-list 'completion-category-overrides
>>> -             '(eglot-indirection-joy (styles . (eglot--lsp-backend-style))))
>>> +             '(eglot-indirection-joy (styles . (backend-completion-backend-style))))

Wow!  I didn't pay attention at first, but I now see you're modifying
`completion-category-overrides` which is the user-facing variable.
You should modify `completion-category-defaults` instead!

>> Any reason not to call that completion category just `eglot`?
>
> Yes, 'eglot' is already a different completion category, for
> completion-at-point, with a different structure.
> `eglot-indirection-joy' is just a product of my usual confusion with
> this whole jungle of concepts: I just vaguely understand it's an
> indirection so I called it accordingly for mental reference.  But feel
> free to suggest a better name.

I'm not very familiar with Eglot's code but based on a cursory check, it
seems this is used specifically when completing an identifier for things
like `xref`, so maybe `eglot-identifier` (and maybe `eglot` should be
renamed to `eglot-code` since it's used to complete the actual code in
the buffer)?


        Stefan




  reply	other threads:[~2022-11-29 21:18 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <166938157708.15020.14294469350904271113@vcs2.savannah.gnu.org>
     [not found] ` <20221125130621.A3C14C0E4C1@vcs2.savannah.gnu.org>
2022-11-25 15:50   ` scratch/backend-completion c807121fbd 1/2: Add lisp/backend-completion.el Stefan Monnier
2022-11-25 16:28     ` João Távora
2022-11-29 21:18       ` Stefan Monnier [this message]
2022-11-29 22:59         ` João Távora
2022-11-29 23:44           ` Stefan Monnier
2022-12-03 13:21             ` João Távora
2022-12-03 14:04               ` Stefan Monnier
2022-12-03 23:22                 ` João Távora

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

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

  git send-email \
    --in-reply-to=jwvv8mxpjrd.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=emacs-devel@gnu.org \
    --cc=joaotavora@gmail.com \
    /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 external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.