* Making `eglot-server-programs' a custom variable? @ 2022-11-09 20:25 Arash Esbati 2022-11-09 20:49 ` Philip Kaludercic ` (2 more replies) 0 siblings, 3 replies; 78+ messages in thread From: Arash Esbati @ 2022-11-09 20:25 UTC (permalink / raw) To: emacs-devel Hi all, I tried eglot only once and I had to add a lsp-server to `eglot-server-programs'. From this experience, is there a plan to make this a custom variable? If not, I suggest to change the example in eglot manual from (add-to-list 'eglot-server-programs '(foo-mode . ("fools" "--stdio"))) to (with-eval-after-load 'eglot (add-to-list 'eglot-server-programs '(foo-mode . ("fools" "--stdio")))) for those who will copy&paste this into their init files and then wonder why it throws an error. Best, Arash ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-09 20:25 Making `eglot-server-programs' a custom variable? Arash Esbati @ 2022-11-09 20:49 ` Philip Kaludercic 2022-11-09 22:07 ` Arash Esbati 2022-11-10 6:36 ` Eli Zaretskii 2022-11-10 10:15 ` João Távora 2 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-09 20:49 UTC (permalink / raw) To: Arash Esbati; +Cc: emacs-devel, João Távora Arash Esbati <arash@gnu.org> writes: > Hi all, > > I tried eglot only once and I had to add a lsp-server to > `eglot-server-programs'. From this experience, is there a plan to make > this a custom variable? If not, I suggest to change the example in > eglot manual from > > (add-to-list 'eglot-server-programs > '(foo-mode . ("fools" "--stdio"))) > > to > > (with-eval-after-load 'eglot > (add-to-list 'eglot-server-programs > '(foo-mode . ("fools" "--stdio")))) > > for those who will copy&paste this into their init files and then wonder > why it throws an error. How would making `eglot-server-programs' help in that respect? If the `defvar' were just to be replaced by a `defcustom', the result would still just be a variable, that couldn't be `add-to-list'ed before it is loaded. From what I see `add-to-list' has no special handling of user options. > Best, Arash I've CC'ed João. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-09 20:49 ` Philip Kaludercic @ 2022-11-09 22:07 ` Arash Esbati 2022-11-10 17:47 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Arash Esbati @ 2022-11-09 22:07 UTC (permalink / raw) To: Philip Kaludercic; +Cc: emacs-devel, João Távora Philip Kaludercic <philipk@posteo.net> writes: > How would making `eglot-server-programs' help in that respect? If it's meant to be extended by users, then one could use the custom interface for it, not add-to-list then. > If the `defvar' were just to be replaced by a `defcustom', the result > would still just be a variable, that couldn't be `add-to-list'ed > before it is loaded. This will depend on the implementation. Say the current content of `eglot-server-programs' is in `eglot-server-programs-builtin' and `eglot-server-programs' is a custom variable, and you have a function like this in eglot.el: (defun eglot-server-programs () (append eglot-server-programs eglot-server-programs-builtin)) then a user can just setq the custom eglot-server-programs without being worry about the rest. Best, Arash ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-09 22:07 ` Arash Esbati @ 2022-11-10 17:47 ` Philip Kaludercic 2022-11-10 17:56 ` Stefan Monnier 2022-11-12 3:47 ` Jim Porter 0 siblings, 2 replies; 78+ messages in thread From: Philip Kaludercic @ 2022-11-10 17:47 UTC (permalink / raw) To: Arash Esbati; +Cc: emacs-devel, João Távora Arash Esbati <arash@gnu.org> writes: > Philip Kaludercic <philipk@posteo.net> writes: > >> How would making `eglot-server-programs' help in that respect? > > If it's meant to be extended by users, then one could use the custom > interface for it, not add-to-list then. > >> If the `defvar' were just to be replaced by a `defcustom', the result >> would still just be a variable, that couldn't be `add-to-list'ed >> before it is loaded. > > This will depend on the implementation. Say the current content of > `eglot-server-programs' is in `eglot-server-programs-builtin' and > `eglot-server-programs' is a custom variable, and you have a function > like this in eglot.el: > > (defun eglot-server-programs () > (append eglot-server-programs > eglot-server-programs-builtin)) > > then a user can just setq the custom eglot-server-programs without being > worry about the rest. Honestly, I think that there should be a command like `add-to-option' that can handle these things automatically and defer loading if possible. There are plenty of cases where you would either do something like this, or have a ...-user-list that is appended together with some build-in list, and even though the actual problem is shared among all user options. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 17:47 ` Philip Kaludercic @ 2022-11-10 17:56 ` Stefan Monnier 2022-11-10 18:10 ` Philip Kaludercic 2022-11-12 3:47 ` Jim Porter 1 sibling, 1 reply; 78+ messages in thread From: Stefan Monnier @ 2022-11-10 17:56 UTC (permalink / raw) To: Philip Kaludercic; +Cc: Arash Esbati, emacs-devel, João Távora Philip Kaludercic [2022-11-10 17:47:36] wrote: > Honestly, I think that there should be a command like `add-to-option' > that can handle these things automatically and defer loading if > possible. Might be a good choice. We could even change `add-to-list` to do that. I suspect it would not be able to use `with-eval-after-load` because it wouldn't know which file holds/defines that var. But we could make it work for Custom vars, OTOH. Stefan ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 17:56 ` Stefan Monnier @ 2022-11-10 18:10 ` Philip Kaludercic 2022-11-10 18:29 ` Stefan Monnier 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-10 18:10 UTC (permalink / raw) To: Stefan Monnier; +Cc: Arash Esbati, emacs-devel, João Távora Stefan Monnier <monnier@iro.umontreal.ca> writes: > Philip Kaludercic [2022-11-10 17:47:36] wrote: >> Honestly, I think that there should be a command like `add-to-option' >> that can handle these things automatically and defer loading if >> possible. > > Might be a good choice. We could even change `add-to-list` to do that. > > I suspect it would not be able to use `with-eval-after-load` because it > wouldn't know which file holds/defines that var. But we could make it > work for Custom vars, OTOH. I have the hunch that modifying `add-to-list' along these lines could break a lot of subtle programs, especially when they use `add-to-list' in place of `push'. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 18:10 ` Philip Kaludercic @ 2022-11-10 18:29 ` Stefan Monnier 2022-11-10 19:36 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Stefan Monnier @ 2022-11-10 18:29 UTC (permalink / raw) To: Philip Kaludercic; +Cc: Arash Esbati, emacs-devel, João Távora >> I suspect it would not be able to use `with-eval-after-load` because it >> wouldn't know which file holds/defines that var. But we could make it >> work for Custom vars, OTOH. > > I have the hunch that modifying `add-to-list' along these lines could > break a lot of subtle programs, I'd imagine the change would only affect the case where the var is unbound, i.e. where we currently signal an error. For that reason, it seems safe enough. > especially when they use `add-to-list' in place of `push'. It should be safe enough even for such bad-style cases. Stefan ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 18:29 ` Stefan Monnier @ 2022-11-10 19:36 ` Philip Kaludercic 0 siblings, 0 replies; 78+ messages in thread From: Philip Kaludercic @ 2022-11-10 19:36 UTC (permalink / raw) To: Stefan Monnier; +Cc: Arash Esbati, emacs-devel, João Távora Stefan Monnier <monnier@iro.umontreal.ca> writes: >>> I suspect it would not be able to use `with-eval-after-load` because it >>> wouldn't know which file holds/defines that var. But we could make it >>> work for Custom vars, OTOH. >> >> I have the hunch that modifying `add-to-list' along these lines could >> break a lot of subtle programs, > > I'd imagine the change would only affect the case where the var is > unbound, i.e. where we currently signal an error. For that reason, it > seems safe enough. If that is all the function does, I think it should be safe. Other questions are if an error should be raised when there is a type-mismatch or if the custom setter/getter ought to be used. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 17:47 ` Philip Kaludercic 2022-11-10 17:56 ` Stefan Monnier @ 2022-11-12 3:47 ` Jim Porter 2022-11-12 5:16 ` chad ` (2 more replies) 1 sibling, 3 replies; 78+ messages in thread From: Jim Porter @ 2022-11-12 3:47 UTC (permalink / raw) To: Philip Kaludercic, Arash Esbati; +Cc: emacs-devel, João Távora On 11/10/2022 9:47 AM, Philip Kaludercic wrote: > Honestly, I think that there should be a command like `add-to-option' > that can handle these things automatically and defer loading if > possible. There are plenty of cases where you would either do something > like this, or have a ...-user-list that is appended together with some > build-in list, and even though the actual problem is shared among all > user options. Assuming I understand what you mean, I agree that this would be very useful. I think it would be super-helpful for there to be a way in the Customize interface to indicate that you want to add A, B, C to a defcustom list, and/or remove X, Y, Z. For another example where this would be helpful, see bug#54977. (For people who build their Emacs configs by writing Elisp, this probably isn't too big a deal, since they probably know enough to do the right thing, but it couldn't hurt to make this easier in Elisp too. Although use-package already makes this about as easy as can be, since you can do all this in a ':config' block, and it Just Works.) ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 3:47 ` Jim Porter @ 2022-11-12 5:16 ` chad 2022-11-12 7:26 ` Philip Kaludercic 2022-11-12 7:34 ` Philip Kaludercic 2022-11-12 7:58 ` Eli Zaretskii 2 siblings, 1 reply; 78+ messages in thread From: chad @ 2022-11-12 5:16 UTC (permalink / raw) To: Jim Porter Cc: Philip Kaludercic, Arash Esbati, emacs-devel, João Távora [-- Attachment #1: Type: text/plain, Size: 553 bytes --] On Fri, Nov 11, 2022 at 10:48 PM Jim Porter <jporterbugs@gmail.com> wrote: > Although use-package already makes this about as easy as can be, since > you can do all this in a ':config' block, and it Just Works. > This sort of behavior is one of the reasons I asked earlier about the possibility of getting use-package included for 29; there's a lot of cargo-cult configuration going on out there in places like reddit and Planet Emacs, and much of it is enabled by use-package, so it would be good (imho) to make that prerequisite step easier. ~Chad [-- Attachment #2: Type: text/html, Size: 920 bytes --] ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 5:16 ` chad @ 2022-11-12 7:26 ` Philip Kaludercic 0 siblings, 0 replies; 78+ messages in thread From: Philip Kaludercic @ 2022-11-12 7:26 UTC (permalink / raw) To: chad; +Cc: Jim Porter, Arash Esbati, emacs-devel, João Távora chad <yandros@gmail.com> writes: > On Fri, Nov 11, 2022 at 10:48 PM Jim Porter <jporterbugs@gmail.com> wrote: > >> Although use-package already makes this about as easy as can be, since >> you can do all this in a ':config' block, and it Just Works. > > This sort of behavior is one of the reasons I asked earlier about the > possibility of getting use-package included for 29; there's a lot of > cargo-cult configuration going on out there in places like reddit and > Planet Emacs, and much of it is enabled by use-package, so it would be good > (imho) to make that prerequisite step easier. See <87iljk1voy.fsf@posteo.net>. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 3:47 ` Jim Porter 2022-11-12 5:16 ` chad @ 2022-11-12 7:34 ` Philip Kaludercic 2022-11-12 7:58 ` Eli Zaretskii 2 siblings, 0 replies; 78+ messages in thread From: Philip Kaludercic @ 2022-11-12 7:34 UTC (permalink / raw) To: Jim Porter; +Cc: Arash Esbati, emacs-devel, João Távora Jim Porter <jporterbugs@gmail.com> writes: > On 11/10/2022 9:47 AM, Philip Kaludercic wrote: >> Honestly, I think that there should be a command like `add-to-option' >> that can handle these things automatically and defer loading if >> possible. There are plenty of cases where you would either do something >> like this, or have a ...-user-list that is appended together with some >> build-in list, and even though the actual problem is shared among all >> user options. > > Assuming I understand what you mean, I agree that this would be very > useful. I think it would be super-helpful for there to be a way in the > Customize interface to indicate that you want to add A, B, C to a > defcustom list, and/or remove X, Y, Z. For another example where this > would be helpful, see bug#54977. > > (For people who build their Emacs configs by writing Elisp, this > probably isn't too big a deal, since they probably know enough to do > the right thing, but it couldn't hurt to make this easier in Elisp > too. Although use-package already makes this about as easy as can be, > since you can do all this in a ':config' block, and it Just Works.) Just for the sake of completeness, I'd like to mention what setup.el also provides. The `:option' macro (which is comparable to `:custom' in use-package) can take a complex option name. The default is something like (:option c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "k&r"))) but you could also use (:option (prepend c-default-style) '(other . "k&r")) to load the variable and then prepend a value to a list. In retrospect, I don't like the syntax that much, and the fact that `:option' calls `custom-load-symbol' unconditionally can really slow down a configuration. This last thing is something that an `add-to-option` -- be it a standalone function or an extension of `add-to-list' must avoid IMO. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 3:47 ` Jim Porter 2022-11-12 5:16 ` chad 2022-11-12 7:34 ` Philip Kaludercic @ 2022-11-12 7:58 ` Eli Zaretskii 2022-11-12 8:03 ` Philip Kaludercic 2 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-12 7:58 UTC (permalink / raw) To: Jim Porter; +Cc: philipk, arash, emacs-devel, joaotavora > Date: Fri, 11 Nov 2022 19:47:52 -0800 > Cc: emacs-devel <emacs-devel@gnu.org>, João Távora > <joaotavora@gmail.com> > From: Jim Porter <jporterbugs@gmail.com> > > I think it would be super-helpful for there to be a way in the > Customize interface to indicate that you want to add A, B, C to a > defcustom list, and/or remove X, Y, Z. We already have that, AFAIU what you mean: see, for example M-x customize-variable RET image-load-path RET ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 7:58 ` Eli Zaretskii @ 2022-11-12 8:03 ` Philip Kaludercic 2022-11-12 8:25 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-12 8:03 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Jim Porter, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> Date: Fri, 11 Nov 2022 19:47:52 -0800 >> Cc: emacs-devel <emacs-devel@gnu.org>, João Távora >> <joaotavora@gmail.com> >> From: Jim Porter <jporterbugs@gmail.com> >> >> I think it would be super-helpful for there to be a way in the >> Customize interface to indicate that you want to add A, B, C to a >> defcustom list, and/or remove X, Y, Z. > > We already have that, AFAIU what you mean: see, for example > > M-x customize-variable RET image-load-path RET My issue here is that while you can modify the list, when saved you will store the entire modified list, and no the modifications you made on the base variable. E.g. considering `eglot-server-programs', just because I want to an additional server entry, I don't want to fix the list of servers in a `custom-set-variables' block and ignore any future updates that have nothing to do with the additional entry. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 8:03 ` Philip Kaludercic @ 2022-11-12 8:25 ` Eli Zaretskii 2022-11-12 8:45 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-12 8:25 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: Jim Porter <jporterbugs@gmail.com>, arash@gnu.org, > emacs-devel@gnu.org, joaotavora@gmail.com > Date: Sat, 12 Nov 2022 08:03:51 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> Date: Fri, 11 Nov 2022 19:47:52 -0800 > >> Cc: emacs-devel <emacs-devel@gnu.org>, João Távora > >> <joaotavora@gmail.com> > >> From: Jim Porter <jporterbugs@gmail.com> > >> > >> I think it would be super-helpful for there to be a way in the > >> Customize interface to indicate that you want to add A, B, C to a > >> defcustom list, and/or remove X, Y, Z. > > > > We already have that, AFAIU what you mean: see, for example > > > > M-x customize-variable RET image-load-path RET > > My issue here is that while you can modify the list, when saved you will > store the entire modified list, and no the modifications you made on the > base variable. The way to do this is to have a basic value as a defvar, and store the corrections to that in a defcustom. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 8:25 ` Eli Zaretskii @ 2022-11-12 8:45 ` Philip Kaludercic 2022-11-12 9:01 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-12 8:45 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: Jim Porter <jporterbugs@gmail.com>, arash@gnu.org, >> emacs-devel@gnu.org, joaotavora@gmail.com >> Date: Sat, 12 Nov 2022 08:03:51 +0000 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> >> Date: Fri, 11 Nov 2022 19:47:52 -0800 >> >> Cc: emacs-devel <emacs-devel@gnu.org>, João Távora >> >> <joaotavora@gmail.com> >> >> From: Jim Porter <jporterbugs@gmail.com> >> >> >> >> I think it would be super-helpful for there to be a way in the >> >> Customize interface to indicate that you want to add A, B, C to a >> >> defcustom list, and/or remove X, Y, Z. >> > >> > We already have that, AFAIU what you mean: see, for example >> > >> > M-x customize-variable RET image-load-path RET >> >> My issue here is that while you can modify the list, when saved you will >> store the entire modified list, and no the modifications you made on the >> base variable. > > The way to do this is to have a basic value as a defvar, and store the > corrections to that in a defcustom. But in that case you need to load the library to get the default value, in which case you might as well store the default value in the defcustom. Also, I don't think this helps people who use the Customize interface? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 8:45 ` Philip Kaludercic @ 2022-11-12 9:01 ` Eli Zaretskii 2022-11-12 9:40 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-12 9:01 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Sat, 12 Nov 2022 08:45:38 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> My issue here is that while you can modify the list, when saved you will > >> store the entire modified list, and no the modifications you made on the > >> base variable. > > > > The way to do this is to have a basic value as a defvar, and store the > > corrections to that in a defcustom. > > But in that case you need to load the library to get the default value, I don't see why. And even if it's so, why is it a problem to load the library? > in which case you might as well store the default value in the > defcustom. But you already explained why storing in a defcustom doesn't solve the problem? So why are you suggesting to do that anyway? > Also, I don't think this helps people who use the Customize > interface? Why doesn't it help? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 9:01 ` Eli Zaretskii @ 2022-11-12 9:40 ` Philip Kaludercic 2022-11-12 10:02 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-12 9:40 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Sat, 12 Nov 2022 08:45:38 +0000 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> >> My issue here is that while you can modify the list, when saved you will >> >> store the entire modified list, and no the modifications you made on the >> >> base variable. >> > >> > The way to do this is to have a basic value as a defvar, and store the >> > corrections to that in a defcustom. >> >> But in that case you need to load the library to get the default value, > > I don't see why. And even if it's so, why is it a problem to load the > library? (I'm not just talking about Eglot right now) If the default value is defined in an non-autoloaded variable, you have to load the library to access the value -- otherwise it simply wasn't loaded. The "issue" here is just that loading everything you want to modify during initialisation can get slow. >> in which case you might as well store the default value in the >> defcustom. > > But you already explained why storing in a defcustom doesn't solve the > problem? So why are you suggesting to do that anyway? ^^ I am not sure I explained that? If you have to load the library to get the default, writing (setopt foo (cons 'bar foo)) or (setopt foo (cons 'bar foo-default)) doesn't make much of a difference to me. >> Also, I don't think this helps people who use the Customize >> interface? > > Why doesn't it help? Maybe I have missed something, if a user option has a `repeat' or `alist' type, you can't just say "append this and that value to the end of some other value". All you get to modify is the entire list, and all you get to store is the entire list. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 9:40 ` Philip Kaludercic @ 2022-11-12 10:02 ` Eli Zaretskii 2022-11-12 13:46 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-12 10:02 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Sat, 12 Nov 2022 09:40:23 +0000 > > >> > The way to do this is to have a basic value as a defvar, and store the > >> > corrections to that in a defcustom. > >> > >> But in that case you need to load the library to get the default value, > > > > I don't see why. And even if it's so, why is it a problem to load the > > library? > > (I'm not just talking about Eglot right now) If the default value is > defined in an non-autoloaded variable, you have to load the library to > access the value -- otherwise it simply wasn't loaded. > > The "issue" here is just that loading everything you want to modify > during initialisation can get slow. Whether or not it is necessary to load the library depends on how the :set function of the defcustom is implemented. I can see several ways of implementing it that won't require loading the library right away, and I'm sure you can see those ways as well. > >> in which case you might as well store the default value in the > >> defcustom. > > > > But you already explained why storing in a defcustom doesn't solve the > > problem? So why are you suggesting to do that anyway? > > ^^ I am not sure I explained that? You said: > > M-x customize-variable RET image-load-path RET > > My issue here is that while you can modify the list, when saved you will > store the entire modified list, and no the modifications you made on the > base variable. To me, this says that storing the value in a defcustom hits that "issue" to which you were alluding, and for which I proposed a solution of having the defcustom be an add-on to the baseline value. > If you have to load the library to > get the default, writing > > (setopt foo (cons 'bar foo)) > > or > > (setopt foo (cons 'bar foo-default)) > > doesn't make much of a difference to me. Sorry, I don't see the relevance of setopt to what I was trying to suggest. > >> Also, I don't think this helps people who use the Customize > >> interface? > > > > Why doesn't it help? > > Maybe I have missed something, if a user option has a `repeat' or > `alist' type, you can't just say "append this and that value to the end > of some other value". All you get to modify is the entire list, and all > you get to store is the entire list. That's a job for the :set function of the defcustom. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 10:02 ` Eli Zaretskii @ 2022-11-12 13:46 ` Philip Kaludercic 2022-11-12 14:30 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-12 13:46 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Sat, 12 Nov 2022 09:40:23 +0000 >> >> >> > The way to do this is to have a basic value as a defvar, and store the >> >> > corrections to that in a defcustom. >> >> >> >> But in that case you need to load the library to get the default value, >> > >> > I don't see why. And even if it's so, why is it a problem to load the >> > library? >> >> (I'm not just talking about Eglot right now) If the default value is >> defined in an non-autoloaded variable, you have to load the library to >> access the value -- otherwise it simply wasn't loaded. >> >> The "issue" here is just that loading everything you want to modify >> during initialisation can get slow. > > Whether or not it is necessary to load the library depends on how the > :set function of the defcustom is implemented. I can see several ways > of implementing it that won't require loading the library right away, > and I'm sure you can see those ways as well. Actually no, I am not sure I do. >> >> in which case you might as well store the default value in the >> >> defcustom. >> > >> > But you already explained why storing in a defcustom doesn't solve the >> > problem? So why are you suggesting to do that anyway? >> >> ^^ I am not sure I explained that? > > You said: > >> > M-x customize-variable RET image-load-path RET >> >> My issue here is that while you can modify the list, when saved you will >> store the entire modified list, and no the modifications you made on the >> base variable. > > To me, this says that storing the value in a defcustom hits that > "issue" to which you were alluding, and for which I proposed a > solution of having the defcustom be an add-on to the baseline value. I see. The issue is that if I just set the user option directly, say even before loading the library I overwrite the default value. But if I load the library, I will have access to the default value before modifying it and setting the user option. >> If you have to load the library to >> get the default, writing >> >> (setopt foo (cons 'bar foo)) >> >> or >> >> (setopt foo (cons 'bar foo-default)) >> >> doesn't make much of a difference to me. > > Sorry, I don't see the relevance of setopt to what I was trying to > suggest. There are two fundamental ways to work with user options, right? Using the Customise interface and programmatically, e.g. using `setopt'. The discussion began with finding a programmatic way of modifying the default value of a user option that contains some repetitive type (repeat, alist, plist), which we were calling `add-to- >> >> Also, I don't think this helps people who use the Customize >> >> interface? >> > >> > Why doesn't it help? >> >> Maybe I have missed something, if a user option has a `repeat' or >> `alist' type, you can't just say "append this and that value to the end >> of some other value". All you get to modify is the entire list, and all >> you get to store is the entire list. > > That's a job for the :set function of the defcustom. I am not sure I know what you are thinking of, but wouldn't this mean all user options that have already been marked as having a `repeat' or `alist' type, that these would now require an additional :set function? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 13:46 ` Philip Kaludercic @ 2022-11-12 14:30 ` Eli Zaretskii 2022-11-13 0:20 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-12 14:30 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Sat, 12 Nov 2022 13:46:40 +0000 > > >> (I'm not just talking about Eglot right now) If the default value is > >> defined in an non-autoloaded variable, you have to load the library to > >> access the value -- otherwise it simply wasn't loaded. > >> > >> The "issue" here is just that loading everything you want to modify > >> during initialisation can get slow. > > > > Whether or not it is necessary to load the library depends on how the > > :set function of the defcustom is implemented. I can see several ways > > of implementing it that won't require loading the library right away, > > and I'm sure you can see those ways as well. > > Actually no, I am not sure I do. Any way that stored the changes of the variable's value in a data structure whose execution is deferred to when the library is first loaded. This includes ` backquoted forms, eval-after-load, mode hooks, etc. > > To me, this says that storing the value in a defcustom hits that > > "issue" to which you were alluding, and for which I proposed a > > solution of having the defcustom be an add-on to the baseline value. > > I see. The issue is that if I just set the user option directly, say > even before loading the library I overwrite the default value. Once again, I'm talking about the user option being used to _augment_ the default value of a variable. Such a user option should by default have a nil value, so setting the value of the option doesn't overwrite the baseline value of the variable which the option will augment. I feel there's a misunderstanding here, because I don't see why these obvious aspects need to be explained. So let me provide an example as a possible clarification. Under my proposal, the variable eglot-server-programs remains a defvar, and contains the baseline list of the servers. To customize the list, users change the value of a separate user option, say, eglot-user-server-programs. This user option's value is nil by default, and it allows users to specify both additions of servers to the baseline value of eglot-server-programs and removal of servers from that value. The :set function of eglot-user-server-programs then takes care of doing whatever is needed to make sure that the value of eglot-server-programs is modified according to eglot-user-server-programs's value when Eglot is started. > >> Maybe I have missed something, if a user option has a `repeat' or > >> `alist' type, you can't just say "append this and that value to the end > >> of some other value". All you get to modify is the entire list, and all > >> you get to store is the entire list. > > > > That's a job for the :set function of the defcustom. > > I am not sure I know what you are thinking of, but wouldn't this mean > all user options that have already been marked as having a `repeat' or > `alist' type, that these would now require an additional :set function? No, of course not. I didn't mean any changes to the infrastructure that we use for Customize and user options in general. See above, I hope I now explained what I had in mind. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 14:30 ` Eli Zaretskii @ 2022-11-13 0:20 ` Philip Kaludercic 2022-11-13 6:39 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-13 0:20 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Sat, 12 Nov 2022 13:46:40 +0000 >> >> >> (I'm not just talking about Eglot right now) If the default value is >> >> defined in an non-autoloaded variable, you have to load the library to >> >> access the value -- otherwise it simply wasn't loaded. >> >> >> >> The "issue" here is just that loading everything you want to modify >> >> during initialisation can get slow. >> > >> > Whether or not it is necessary to load the library depends on how the >> > :set function of the defcustom is implemented. I can see several ways >> > of implementing it that won't require loading the library right away, >> > and I'm sure you can see those ways as well. >> >> Actually no, I am not sure I do. > > Any way that stored the changes of the variable's value in a data > structure whose execution is deferred to when the library is first > loaded. This includes ` backquoted forms, eval-after-load, mode > hooks, etc. > >> > To me, this says that storing the value in a defcustom hits that >> > "issue" to which you were alluding, and for which I proposed a >> > solution of having the defcustom be an add-on to the baseline value. >> >> I see. The issue is that if I just set the user option directly, say >> even before loading the library I overwrite the default value. > > Once again, I'm talking about the user option being used to _augment_ > the default value of a variable. Such a user option should by default > have a nil value, so setting the value of the option doesn't overwrite > the baseline value of the variable which the option will augment. Ok. > I feel there's a misunderstanding here, because I don't see why these > obvious aspects need to be explained. So let me provide an example as > a possible clarification. That might very well be possible. > Under my proposal, the variable eglot-server-programs remains a > defvar, and contains the baseline list of the servers. To customize > the list, users change the value of a separate user option, say, > eglot-user-server-programs. This user option's value is nil by > default, and it allows users to specify both additions of servers to > the baseline value of eglot-server-programs and removal of servers > from that value. How would this look like? > The :set function of eglot-user-server-programs then > takes care of doing whatever is needed to make sure that the value of > eglot-server-programs is modified according to > eglot-user-server-programs's value when Eglot is started. This I understand, but I don't see how this is preferable to a general solution that doesn't require explicit support for any user option. >> >> Maybe I have missed something, if a user option has a `repeat' or >> >> `alist' type, you can't just say "append this and that value to the end >> >> of some other value". All you get to modify is the entire list, and all >> >> you get to store is the entire list. >> > >> > That's a job for the :set function of the defcustom. >> >> I am not sure I know what you are thinking of, but wouldn't this mean >> all user options that have already been marked as having a `repeat' or >> `alist' type, that these would now require an additional :set function? > > No, of course not. I didn't mean any changes to the infrastructure > that we use for Customize and user options in general. See above, I > hope I now explained what I had in mind. I suppose it does. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-13 0:20 ` Philip Kaludercic @ 2022-11-13 6:39 ` Eli Zaretskii 2022-11-13 7:11 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-13 6:39 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Sun, 13 Nov 2022 00:20:35 +0000 > > > Under my proposal, the variable eglot-server-programs remains a > > defvar, and contains the baseline list of the servers. To customize > > the list, users change the value of a separate user option, say, > > eglot-user-server-programs. This user option's value is nil by > > default, and it allows users to specify both additions of servers to > > the baseline value of eglot-server-programs and removal of servers > > from that value. > > How would this look like? I don't understand what you are asking here. How what will look like? > > The :set function of eglot-user-server-programs then > > takes care of doing whatever is needed to make sure that the value of > > eglot-server-programs is modified according to > > eglot-user-server-programs's value when Eglot is started. > > This I understand, but I don't see how this is preferable to a general > solution that doesn't require explicit support for any user option. What is the general solution you have in mind? And what problems does that general solution solve? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-13 6:39 ` Eli Zaretskii @ 2022-11-13 7:11 ` Philip Kaludercic 2022-11-13 7:43 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-13 7:11 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Sun, 13 Nov 2022 00:20:35 +0000 >> >> > Under my proposal, the variable eglot-server-programs remains a >> > defvar, and contains the baseline list of the servers. To customize >> > the list, users change the value of a separate user option, say, >> > eglot-user-server-programs. This user option's value is nil by >> > default, and it allows users to specify both additions of servers to >> > the baseline value of eglot-server-programs and removal of servers >> > from that value. >> >> How would this look like? > > I don't understand what you are asking here. How what will look like? Err, the question doesn't make sense in retrospect, I should have removed it before sending out my message. >> > The :set function of eglot-user-server-programs then >> > takes care of doing whatever is needed to make sure that the value of >> > eglot-server-programs is modified according to >> > eglot-user-server-programs's value when Eglot is started. >> >> This I understand, but I don't see how this is preferable to a general >> solution that doesn't require explicit support for any user option. > > What is the general solution you have in mind? And what problems does > that general solution solve? That all user options containing lists can be modified, without each user option containing lists explicitly accommodating the fact using some other variable. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-13 7:11 ` Philip Kaludercic @ 2022-11-13 7:43 ` Eli Zaretskii 2022-11-15 17:50 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-13 7:43 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Sun, 13 Nov 2022 07:11:33 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> > The :set function of eglot-user-server-programs then > >> > takes care of doing whatever is needed to make sure that the value of > >> > eglot-server-programs is modified according to > >> > eglot-user-server-programs's value when Eglot is started. > >> > >> This I understand, but I don't see how this is preferable to a general > >> solution that doesn't require explicit support for any user option. > > > > What is the general solution you have in mind? And what problems does > > that general solution solve? > > That all user options containing lists can be modified, without each > user option containing lists explicitly accommodating the fact using > some other variable. The problem is only with user options that have complex structures. Letting users edit such data structures directly is wrought with unnecessary risks, and requires users to understand very well the semantics of the data structure and the effect of every change in it. Alternatively, it requires adding infrastructure to Custom to make these aspects safer and more easily understandable (something I'm not even sure is feasible). My proposal is free from all those disadvantages, because it leaves the complexity to the :set function, which can do whatever it takes without bothering users. In general, I consider user options whose values are complex data structure to be a Bad Thing, due to the difficulties they cause in customizing them. If we limit such options to just the absolute minimum, the "each user option containing lists" problem you envision should not exist. We should strive to present to users a simpler customization interface, in the form of simple variables whose effects are easily documented and understood, and make their :set functions change the complex data structures as needed under the hood. The proliferation of user options with complex values we have currently in Emacs is a bad tendency that is at least in part due to the fact that the developers have no problems dealing with such data structures. IMNSHO, we don't think enough about our users when we introduce such options. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-13 7:43 ` Eli Zaretskii @ 2022-11-15 17:50 ` Philip Kaludercic 2022-11-15 18:15 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-15 17:50 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Sun, 13 Nov 2022 07:11:33 +0000 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> >> > The :set function of eglot-user-server-programs then >> >> > takes care of doing whatever is needed to make sure that the value of >> >> > eglot-server-programs is modified according to >> >> > eglot-user-server-programs's value when Eglot is started. >> >> >> >> This I understand, but I don't see how this is preferable to a general >> >> solution that doesn't require explicit support for any user option. >> > >> > What is the general solution you have in mind? And what problems does >> > that general solution solve? >> >> That all user options containing lists can be modified, without each >> user option containing lists explicitly accommodating the fact using >> some other variable. > > The problem is only with user options that have complex structures. > Letting users edit such data structures directly is wrought with > unnecessary risks, and requires users to understand very well the > semantics of the data structure and the effect of every change in it. Where do you draw the line to what is "complex" and what isn't? `eglot-server-programs' is complex in the trivial sense that it is made up of multiple parts, but each entry is relatively independent, and pretending an element to the beginning of the list shouldn't involve any unexpected surprises. > Alternatively, it requires adding infrastructure to Custom to make > these aspects safer and more easily understandable (something I'm not > even sure is feasible). Like `setopt' does with primitive type checking? ;; Check that the type is correct. (when-let ((type (get variable 'custom-type))) (unless (widget-apply (widget-convert type) :match value) (user-error "Value `%S' does not match type %s" value type))) > My proposal is free from all those disadvantages, because it leaves > the complexity to the :set function, which can do whatever it takes > without bothering users. > > In general, I consider user options whose values are complex data > structure to be a Bad Thing, due to the difficulties they cause in > customizing them. If we limit such options to just the absolute > minimum, the "each user option containing lists" problem you envision > should not exist. We should strive to present to users a simpler > customization interface, in the form of simple variables whose effects > are easily documented and understood, and make their :set functions > change the complex data structures as needed under the hood. FWIW I agree that user options shouldn't be too complicated, but knowing how to simplify a user option is an art in itself. > The proliferation of user options with complex values we have > currently in Emacs is a bad tendency that is at least in part due to > the fact that the developers have no problems dealing with such data > structures. IMNSHO, we don't think enough about our users when we > introduce such options. Again, I am uncertain what you mean by complex. Is `auto-mode-alist' complex? Or `display-buffer-alist'? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-15 17:50 ` Philip Kaludercic @ 2022-11-15 18:15 ` Eli Zaretskii 2022-11-16 13:05 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-15 18:15 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Tue, 15 Nov 2022 17:50:25 +0000 > > > The problem is only with user options that have complex structures. > > Letting users edit such data structures directly is wrought with > > unnecessary risks, and requires users to understand very well the > > semantics of the data structure and the effect of every change in it. > > Where do you draw the line to what is "complex" and what isn't? Basically, anything that is not an atom is "complex" for this purpose, in my book. > `eglot-server-programs' is complex in the trivial sense that it is made > up of multiple parts, but each entry is relatively independent, and > pretending an element to the beginning of the list shouldn't involve any > unexpected surprises. Let's look at this from the user's POV, okay? (defvar eglot-server-programs `((rust-mode . ,(eglot-alternatives '("rust-analyzer" "rls"))) (cmake-mode . ("cmake-language-server")) (vimrc-mode . ("vim-language-server" "--stdio")) (python-mode . ,(eglot-alternatives '("pylsp" "pyls" ("pyright-langserver" "--stdio") "jedi-language-server"))) ((js-json-mode json-mode) . ,(eglot-alternatives '(("vscode-json-language-server" "--stdio") ("json-languageserver" "--stdio")))) Here we have: . a multi-level list . elements that are alists . a "backquote construct" with evaluated parts in How much Lisp do we require a user to know? Imagine a user who just wants to add one more server, either for an existing mode or for a new mode not in the list. Do we really expect him or her to understand all that? > > Alternatively, it requires adding infrastructure to Custom to make > > these aspects safer and more easily understandable (something I'm not > > even sure is feasible). > > Like `setopt' does with primitive type checking? Yes, but much more complex. Essentially, display the above list in a form that is easy to understand, and allow updating it in that form. > FWIW I agree that user options shouldn't be too complicated, but knowing > how to simplify a user option is an art in itself. Yes, but IMO we should bite that bullet every time. > > The proliferation of user options with complex values we have > > currently in Emacs is a bad tendency that is at least in part due to > > the fact that the developers have no problems dealing with such data > > structures. IMNSHO, we don't think enough about our users when we > > introduce such options. > > Again, I am uncertain what you mean by complex. Is `auto-mode-alist' > complex? To some extent, yes. > Or `display-buffer-alist'? Definitely! ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-15 18:15 ` Eli Zaretskii @ 2022-11-16 13:05 ` Philip Kaludercic 2022-11-16 13:44 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-16 13:05 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Tue, 15 Nov 2022 17:50:25 +0000 >> >> > The problem is only with user options that have complex structures. >> > Letting users edit such data structures directly is wrought with >> > unnecessary risks, and requires users to understand very well the >> > semantics of the data structure and the effect of every change in it. >> >> Where do you draw the line to what is "complex" and what isn't? > > Basically, anything that is not an atom is "complex" for this purpose, > in my book. Ok. >> `eglot-server-programs' is complex in the trivial sense that it is made >> up of multiple parts, but each entry is relatively independent, and >> pretending an element to the beginning of the list shouldn't involve any >> unexpected surprises. > > Let's look at this from the user's POV, okay? > > (defvar eglot-server-programs `((rust-mode . ,(eglot-alternatives '("rust-analyzer" "rls"))) > (cmake-mode . ("cmake-language-server")) > (vimrc-mode . ("vim-language-server" "--stdio")) > (python-mode > . ,(eglot-alternatives > '("pylsp" "pyls" ("pyright-langserver" "--stdio") "jedi-language-server"))) > ((js-json-mode json-mode) . ,(eglot-alternatives '(("vscode-json-language-server" "--stdio") ("json-languageserver" "--stdio")))) > > Here we have: > > . a multi-level list > . elements that are alists > . a "backquote construct" with evaluated parts in > > How much Lisp do we require a user to know? Imagine a user who just > wants to add one more server, either for an existing mode or for a new > mode not in the list. Do we really expect him or her to understand > all that? For a simple modification, it appears that (add-to-list 'eglot-server-programs '(foo-mode "foo-lsp" "--stdio")) is enough. >> > Alternatively, it requires adding infrastructure to Custom to make >> > these aspects safer and more easily understandable (something I'm not >> > even sure is feasible). >> >> Like `setopt' does with primitive type checking? > > Yes, but much more complex. Essentially, display the above list in a > form that is easy to understand, and allow updating it in that form. I agree that that would be a good thing to have, but that appears to be something that would require reworking the widget framework, right? >> FWIW I agree that user options shouldn't be too complicated, but knowing >> how to simplify a user option is an art in itself. > > Yes, but IMO we should bite that bullet every time. Do you mean "we" as in the Emacs core developers? Then yes, but there are plenty of packages on ELPA that don't scrutinise themselves to the same degree. The reality of this complexity shouldn't just be ignored. >> > The proliferation of user options with complex values we have >> > currently in Emacs is a bad tendency that is at least in part due to >> > the fact that the developers have no problems dealing with such data >> > structures. IMNSHO, we don't think enough about our users when we >> > introduce such options. >> >> Again, I am uncertain what you mean by complex. Is `auto-mode-alist' >> complex? > > To some extent, yes. > >> Or `display-buffer-alist'? > > Definitely! ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-16 13:05 ` Philip Kaludercic @ 2022-11-16 13:44 ` Eli Zaretskii 2022-11-16 14:12 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-16 13:44 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Wed, 16 Nov 2022 13:05:46 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > > (defvar eglot-server-programs `((rust-mode . ,(eglot-alternatives '("rust-analyzer" "rls"))) > > (cmake-mode . ("cmake-language-server")) > > (vimrc-mode . ("vim-language-server" "--stdio")) > > (python-mode > > . ,(eglot-alternatives > > '("pylsp" "pyls" ("pyright-langserver" "--stdio") "jedi-language-server"))) > > ((js-json-mode json-mode) . ,(eglot-alternatives '(("vscode-json-language-server" "--stdio") ("json-languageserver" "--stdio")))) > > > > Here we have: > > > > . a multi-level list > > . elements that are alists > > . a "backquote construct" with evaluated parts in > > > > How much Lisp do we require a user to know? Imagine a user who just > > wants to add one more server, either for an existing mode or for a new > > mode not in the list. Do we really expect him or her to understand > > all that? > > For a simple modification, it appears that > > (add-to-list 'eglot-server-programs '(foo-mode "foo-lsp" "--stdio")) > > is enough. And we expect a random user to know this how? > >> > Alternatively, it requires adding infrastructure to Custom to make > >> > these aspects safer and more easily understandable (something I'm not > >> > even sure is feasible). > >> > >> Like `setopt' does with primitive type checking? > > > > Yes, but much more complex. Essentially, display the above list in a > > form that is easy to understand, and allow updating it in that form. > > I agree that that would be a good thing to have, but that appears to be > something that would require reworking the widget framework, right? Probably. Which is why I think my original proposal, not to ask users to customize such variables directly, is much easier to implement. > >> FWIW I agree that user options shouldn't be too complicated, but knowing > >> how to simplify a user option is an art in itself. > > > > Yes, but IMO we should bite that bullet every time. > > Do you mean "we" as in the Emacs core developers? Yes. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-16 13:44 ` Eli Zaretskii @ 2022-11-16 14:12 ` Philip Kaludercic 2022-11-16 14:51 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Philip Kaludercic @ 2022-11-16 14:12 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Wed, 16 Nov 2022 13:05:46 +0000 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> > (defvar eglot-server-programs `((rust-mode . ,(eglot-alternatives '("rust-analyzer" "rls"))) >> > (cmake-mode . ("cmake-language-server")) >> > (vimrc-mode . ("vim-language-server" "--stdio")) >> > (python-mode >> > . ,(eglot-alternatives >> > '("pylsp" "pyls" ("pyright-langserver" "--stdio") "jedi-language-server"))) >> > ((js-json-mode json-mode) . ,(eglot-alternatives '(("vscode-json-language-server" "--stdio") ("json-languageserver" "--stdio")))) >> > >> > Here we have: >> > >> > . a multi-level list >> > . elements that are alists >> > . a "backquote construct" with evaluated parts in >> > >> > How much Lisp do we require a user to know? Imagine a user who just >> > wants to add one more server, either for an existing mode or for a new >> > mode not in the list. Do we really expect him or her to understand >> > all that? >> >> For a simple modification, it appears that >> >> (add-to-list 'eglot-server-programs '(foo-mode "foo-lsp" "--stdio")) >> >> is enough. > > And we expect a random user to know this how? I believe it to be no more or less reasonable to know than how to manipulate `auto-mode-alist', and that involves Elisp regular expressions. If something like this is mentioned in the manual, I think that should suffice for a "learning-by-template" approach, which is my impression of how most people use Emacs. >> >> > Alternatively, it requires adding infrastructure to Custom to make >> >> > these aspects safer and more easily understandable (something I'm not >> >> > even sure is feasible). >> >> >> >> Like `setopt' does with primitive type checking? >> > >> > Yes, but much more complex. Essentially, display the above list in a >> > form that is easy to understand, and allow updating it in that form. >> >> I agree that that would be a good thing to have, but that appears to be >> something that would require reworking the widget framework, right? > > Probably. Which is why I think my original proposal, not to ask users > to customize such variables directly, is much easier to implement. I don't think that either or differs too much in difficulty, this is more a question of approach. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-16 14:12 ` Philip Kaludercic @ 2022-11-16 14:51 ` Eli Zaretskii 2022-11-16 17:05 ` Philip Kaludercic 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-16 14:51 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jporterbugs, arash, emacs-devel, joaotavora > From: Philip Kaludercic <philipk@posteo.net> > Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, > joaotavora@gmail.com > Date: Wed, 16 Nov 2022 14:12:39 +0000 > > >> > . a multi-level list > >> > . elements that are alists > >> > . a "backquote construct" with evaluated parts in > >> > > >> > How much Lisp do we require a user to know? Imagine a user who just > >> > wants to add one more server, either for an existing mode or for a new > >> > mode not in the list. Do we really expect him or her to understand > >> > all that? > >> > >> For a simple modification, it appears that > >> > >> (add-to-list 'eglot-server-programs '(foo-mode "foo-lsp" "--stdio")) > >> > >> is enough. > > > > And we expect a random user to know this how? > > I believe it to be no more or less reasonable to know than how to > manipulate `auto-mode-alist', and that involves Elisp regular > expressions. I think this variable is way harder to grasp that auto-mode-alist. > > Probably. Which is why I think my original proposal, not to ask users > > to customize such variables directly, is much easier to implement. > > I don't think that either or differs too much in difficulty, this is > more a question of approach. I think adding infrastructure to Custom widgets is much harder than writing a :set function which adds an element to the likes of eglot-server-programs. But extensions of Custom in this direction will be most welcome, of course. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-16 14:51 ` Eli Zaretskii @ 2022-11-16 17:05 ` Philip Kaludercic 0 siblings, 0 replies; 78+ messages in thread From: Philip Kaludercic @ 2022-11-16 17:05 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jporterbugs, arash, emacs-devel, joaotavora Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jporterbugs@gmail.com, arash@gnu.org, emacs-devel@gnu.org, >> joaotavora@gmail.com >> Date: Wed, 16 Nov 2022 14:12:39 +0000 >> >> >> > . a multi-level list >> >> > . elements that are alists >> >> > . a "backquote construct" with evaluated parts in >> >> > >> >> > How much Lisp do we require a user to know? Imagine a user who just >> >> > wants to add one more server, either for an existing mode or for a new >> >> > mode not in the list. Do we really expect him or her to understand >> >> > all that? >> >> >> >> For a simple modification, it appears that >> >> >> >> (add-to-list 'eglot-server-programs '(foo-mode "foo-lsp" "--stdio")) >> >> >> >> is enough. >> > >> > And we expect a random user to know this how? >> >> I believe it to be no more or less reasonable to know than how to >> manipulate `auto-mode-alist', and that involves Elisp regular >> expressions. > > I think this variable is way harder to grasp that auto-mode-alist. This might just be familiarity speaking, (regexp . major-mode) vs (major-mode . command-list) -- in the simple case, the case that most users are interested in -- doesn't seem that big of a difference. >> > Probably. Which is why I think my original proposal, not to ask users >> > to customize such variables directly, is much easier to implement. >> >> I don't think that either or differs too much in difficulty, this is >> more a question of approach. > > I think adding infrastructure to Custom widgets is much harder than > writing a :set function which adds an element to the likes of > eglot-server-programs. But extensions of Custom in this direction > will be most welcome, of course. To clarify, my proposal wasn't to add additional infrastructure to custom widgets, but to either extend add-to-list or add a similar command that would defer itself until the package is loaded, to avoid overriding a variable that has a default value. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-09 20:25 Making `eglot-server-programs' a custom variable? Arash Esbati 2022-11-09 20:49 ` Philip Kaludercic @ 2022-11-10 6:36 ` Eli Zaretskii 2022-11-10 7:56 ` Tim Cross 2022-11-10 9:18 ` Arash Esbati 2022-11-10 10:15 ` João Távora 2 siblings, 2 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 6:36 UTC (permalink / raw) To: Arash Esbati; +Cc: emacs-devel > From: Arash Esbati <arash@gnu.org> > Date: Wed, 09 Nov 2022 21:25:53 +0100 > > I tried eglot only once and I had to add a lsp-server to > `eglot-server-programs'. From this experience, is there a plan to make > this a custom variable? If not, I suggest to change the example in > eglot manual from > > (add-to-list 'eglot-server-programs > '(foo-mode . ("fools" "--stdio"))) > > to > > (with-eval-after-load 'eglot > (add-to-list 'eglot-server-programs > '(foo-mode . ("fools" "--stdio")))) > > for those who will copy&paste this into their init files and then wonder > why it throws an error. The intent is for this variable to include enough servers to make it unnecessary to add to the list. With that in mind, I wouldn't complicate the manual by making sure this is copy/paste-able. Is the LSP server you needed to add still missing from the database currently on master? If so, please suggest the addition(s). ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 6:36 ` Eli Zaretskii @ 2022-11-10 7:56 ` Tim Cross 2022-11-10 8:24 ` Eli Zaretskii 2022-11-10 9:18 ` Arash Esbati 1 sibling, 1 reply; 78+ messages in thread From: Tim Cross @ 2022-11-10 7:56 UTC (permalink / raw) To: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: Arash Esbati <arash@gnu.org> >> Date: Wed, 09 Nov 2022 21:25:53 +0100 >> >> I tried eglot only once and I had to add a lsp-server to >> `eglot-server-programs'. From this experience, is there a plan to make >> this a custom variable? If not, I suggest to change the example in >> eglot manual from >> >> (add-to-list 'eglot-server-programs >> '(foo-mode . ("fools" "--stdio"))) >> >> to >> >> (with-eval-after-load 'eglot >> (add-to-list 'eglot-server-programs >> '(foo-mode . ("fools" "--stdio")))) >> >> for those who will copy&paste this into their init files and then wonder >> why it throws an error. > > The intent is for this variable to include enough servers to make it > unnecessary to add to the list. With that in mind, I wouldn't > complicate the manual by making sure this is copy/paste-able. > > Is the LSP server you needed to add still missing from the database > currently on master? If so, please suggest the addition(s). I'm not sure that intent will hold. It has the underlying assumption there is a definitive language server for each language. There are multiple servers for many languages and individual preferences/requirements can differ. The first thing I had to do in order to use eglot was modify this variable to add my preferred Javascript server. From an end user perspective, this was harder to do than making the same change with lsp-mode. For reference, here is what I ended up doing to get it working (defclass eglot-deno (eglot-lsp-server) () :documentation "A custom class for deno lsp.") (cl-defmethod eglot-initialization-options ((server eglot-deno)) "Passes through required deno initialization options" (list :enable t :lint t)) (add-to-list 'eglot-server-programs '((js-mode typescript-mode) . (eglot-deno "deno" "lsp"))) ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 7:56 ` Tim Cross @ 2022-11-10 8:24 ` Eli Zaretskii 2022-11-10 9:34 ` Tim Cross 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 8:24 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-devel > From: Tim Cross <theophilusx@gmail.com> > Date: Thu, 10 Nov 2022 18:56:01 +1100 > > > Is the LSP server you needed to add still missing from the database > > currently on master? If so, please suggest the addition(s). > > I'm not sure that intent will hold. It has the underlying assumption > there is a definitive language server for each language. No, it doesn't. Please see the current value of the variable and its documentation in the manual. > There are multiple servers for many languages and individual > preferences/requirements can differ. Yes, and the variable already supports that. > The first thing I had to do in order to use eglot was modify this > variable to add my preferred Javascript server. Which one? Can it be added to the variable if it's still missing? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 8:24 ` Eli Zaretskii @ 2022-11-10 9:34 ` Tim Cross 2022-11-10 11:16 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Tim Cross @ 2022-11-10 9:34 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: Tim Cross <theophilusx@gmail.com> >> Date: Thu, 10 Nov 2022 18:56:01 +1100 >> >> > Is the LSP server you needed to add still missing from the database >> > currently on master? If so, please suggest the addition(s). >> >> I'm not sure that intent will hold. It has the underlying assumption >> there is a definitive language server for each language. > > No, it doesn't. Please see the current value of the variable and its > documentation in the manual. > I guess you will have to explain as I've looked at the documentation again and still don't see how you can have two different language servers for the same language. While you can have multiple entries for the same language modes, only the first one in the list take effect. >> There are multiple servers for many languages and individual >> preferences/requirements can differ. > > Yes, and the variable already supports that. > How? Please show as it isn't clear to me from the documentation and there isn't a single entry which shows support for multiple language servers for the same language (where only one is active at a time of course). . >> The first thing I had to do in order to use eglot was modify this >> variable to add my preferred Javascript server. > > Which one? Can it be added to the variable if it's still missing? I included it at the end of my post and you deleted it. You can certainly add it, but it will only take effect if it comes before the existing entry for javascript and of course, if you do that, it will be irritating for those who want the original value. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 9:34 ` Tim Cross @ 2022-11-10 11:16 ` Eli Zaretskii 2022-11-10 13:59 ` Tim Cross 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 11:16 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-devel > From: Tim Cross <theophilusx@gmail.com> > Cc: emacs-devel@gnu.org > Date: Thu, 10 Nov 2022 20:34:49 +1100 > > >> I'm not sure that intent will hold. It has the underlying assumption > >> there is a definitive language server for each language. > > > > No, it doesn't. Please see the current value of the variable and its > > documentation in the manual. > > I guess you will have to explain as I've looked at the documentation > again and still don't see how you can have two different language > servers for the same language. While you can have multiple entries for > the same language modes, only the first one in the list take effect. That's not my understanding. > >> There are multiple servers for many languages and individual > >> preferences/requirements can differ. > > > > Yes, and the variable already supports that. > > > > How? Via eglot-alternatives. There are entries in the value which already use that. And the change you suggested used that as well. So I wonder what kind of misunderstanding are we having here. > Please show as it isn't clear to me from the documentation and > there isn't a single entry which shows support for multiple language > servers for the same language (where only one is active at a time of course). . You mean, there's a difference between several servers for the same mode and several servers for the same language? What is the difference? Or is that also part of the misunderstanding? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 11:16 ` Eli Zaretskii @ 2022-11-10 13:59 ` Tim Cross 0 siblings, 0 replies; 78+ messages in thread From: Tim Cross @ 2022-11-10 13:59 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: Tim Cross <theophilusx@gmail.com> >> Cc: emacs-devel@gnu.org >> Date: Thu, 10 Nov 2022 20:34:49 +1100 >> >> >> I'm not sure that intent will hold. It has the underlying assumption >> >> there is a definitive language server for each language. >> > >> > No, it doesn't. Please see the current value of the variable and its >> > documentation in the manual. >> >> I guess you will have to explain as I've looked at the documentation >> again and still don't see how you can have two different language >> servers for the same language. While you can have multiple entries for >> the same language modes, only the first one in the list take effect. > > That's not my understanding. > >> >> There are multiple servers for many languages and individual >> >> preferences/requirements can differ. >> > >> > Yes, and the variable already supports that. >> > >> >> How? > > Via eglot-alternatives. There are entries in the value which already > use that. And the change you suggested used that as well. So I > wonder what kind of misunderstanding are we having here. > That function is not mentioned or referenced in the documentation for eglot-server-programs. I did see that function when I was configuring eglot, but it wasn't at all clear to me how it fitted into the picture. I cold not find any reference to eglot-alternatives in the eglot manual and it isn't listed in the index, so after you mentioning it, while I *think* I understand what it does, I still don't see how it is relevant in this situation (unless you use it in conjunction with other elisp to implement a new command for selecting which server to use?). Not sure how you feel it was part of the change I suggested given I've not suggested any change - all I did was copy and paste the configuration I had to add in order to get eglot to work with my preferred language server for javascript. I really added it to show that adding a new/different server isn't always straight-forward and that it requires editing that eglot-server-programs variable. >> Please show as it isn't clear to me from the documentation and >> there isn't a single entry which shows support for multiple language >> servers for the same language (where only one is active at a time of course). . > > You mean, there's a difference between several servers for the same > mode and several servers for the same language? What is the > difference? Or is that also part of the misunderstanding? I don't think 'mode' adds much here. It is really just an emacs specific notion which langauge servers know nothing about and used to identify the source language. For example, we have js-mode and typescript-mode, both modes for editing/developing javascript. However, there is more than one language server mode for javascript. The 'default' is typescript-language-server, my preference is deno. Both are language servers for javascript and typescript. Different language servers for the same language can offer different features or different strategies in supporting a feature. One server might have different snippets, different lint rules, different formatting rules or use a different strategy for implementing things like code completion or simply have a different performance profile. As it stands now, you have an alist with keys that are emacs mode names and values which are the language server to run (along with command line arguments etc) when you use eglot in one of the modes used as the key. I cannot see how you can have two separate entries for (js-mode typescript-mode) or if you do, how the user indicates which entry to use. In my case, my configuration of deno works because it appears in the list before the default entry which uses typescript-language-server. Your suggestion was that if there is a server not in the list, it should just be added to the list. I still don't see how this would work in the general case. If there are two entries in the list with the same key, how does the user identify which entry they want to be used? It was this which made be suggest that your suggestion that this variable would typically not need to be modified by end users may not hold. I think it will be something which users will often need to do - especially as this space is still evolving and the status of servers for many languages are still somewhat in flux. Note that I may not agree 100% with the OPs position that the manual should be updated. When adding code to your init.el file, cut and paste examples frequently get people into more trouble than help. I think that if your going to add calls to add-to-list in your init.el file, you relaly should understand what that means and why you cannot add to a list which doesn't yet exist etc. However, I disagree with the suggestion this variable is some internal variable which won't need to be modified by users. I also wanted to highlight that in this specific case of adding deno as a server, it was much easier and more straight-forward to do so with lsp-mode than it was in eglot. This is not a suggestion that lsp-mode is better - for many reasons, I very much prefer the architecture and design goals of eglot over lsp-mode. It was mentioned as just a data point from someone who has used both. Note also that I did initially try adding deno useing the simple/naive approach as outlined in the manual, but could not get that to work. In the end, I got it working after some help from IRC. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 6:36 ` Eli Zaretskii 2022-11-10 7:56 ` Tim Cross @ 2022-11-10 9:18 ` Arash Esbati 2022-11-10 9:34 ` Eli Zaretskii 2022-11-10 21:28 ` Augusto Stoffel 1 sibling, 2 replies; 78+ messages in thread From: Arash Esbati @ 2022-11-10 9:18 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: > The intent is for this variable to include enough servers to make it > unnecessary to add to the list. Ok, that's a different story. Would it then make sense to add a comment to the manual about each server and if they work on the platforms Emacs runs? Currently, "digestif" doesn't run on Windows, "texlab" (see below) does. I know, this is work and possibly out of Eglot's scope, but it could give users some direction. > Is the LSP server you needed to add still missing from the database > currently on master? If so, please suggest the addition(s). The addition would look like this: --8<---------------cut here---------------start------------->8--- diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 2eaa396386..f69d392b46 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -217,7 +217,7 @@ eglot-server-programs (scala-mode . ("metals-emacs")) (racket-mode . ("racket" "-l" "racket-langserver")) ((tex-mode context-mode texinfo-mode bibtex-mode) - . ("digestif")) + . ,(eglot-alternatives '("digestif" "texlab"))) (erlang-mode . ("erlang_ls" "--transport" "stdio")) (yaml-mode . ("yaml-language-server" "--stdio")) (nix-mode . ,(eglot-alternatives '("nil" "rnix-lsp"))) --8<---------------cut here---------------end--------------->8--- Best, Arash ^ permalink raw reply related [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 9:18 ` Arash Esbati @ 2022-11-10 9:34 ` Eli Zaretskii 2022-11-10 10:25 ` João Távora 2022-11-10 21:28 ` Augusto Stoffel 1 sibling, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 9:34 UTC (permalink / raw) To: Arash Esbati; +Cc: emacs-devel > From: Arash Esbati <arash@gnu.org> > Cc: emacs-devel@gnu.org > Date: Thu, 10 Nov 2022 10:18:43 +0100 > > Eli Zaretskii <eliz@gnu.org> writes: > > > The intent is for this variable to include enough servers to make it > > unnecessary to add to the list. > > Ok, that's a different story. Would it then make sense to add a comment > to the manual about each server and if they work on the platforms Emacs > runs? IMO, that'd be too much stuff that is not really related to Emacs. > Currently, "digestif" doesn't run on Windows, "texlab" (see > below) does. I know, this is work and possibly out of Eglot's scope, > but it could give users some direction. Users need to read the documentation of the servers they want to install anyway. We cannot provide that in Emacs, in the same way we don't provide this information about other programs Emacs uses. > > Is the LSP server you needed to add still missing from the database > > currently on master? If so, please suggest the addition(s). > > The addition would look like this: Thanks, I'll let João comment on this. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 9:34 ` Eli Zaretskii @ 2022-11-10 10:25 ` João Távora 2022-11-10 17:04 ` Eli Zaretskii 2022-11-10 17:10 ` Eli Zaretskii 0 siblings, 2 replies; 78+ messages in thread From: João Távora @ 2022-11-10 10:25 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Arash Esbati, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1451 bytes --] On Thu, Nov 10, 2022 at 9:35 AM Eli Zaretskii <eliz@gnu.org> wrote: > Users need to read the documentation of the servers they want to > install anyway. We cannot provide that in Emacs, in the same way we > don't provide this information about other programs Emacs uses. Yes, I agree. We won't mention details like server's operating systems in the manual, at least not in that section. The only mentions to servers so far are in the example of eglot-workspace-configurations, because they its a fairly representative example, and no better one has been submitted. And we also mention, in the troubleshooting section, that clangd and pylsp are good servers to try to reproduce a bug report, because they're fairly easy to install. > > The addition would look like this: > [...] > Thanks, I'll let João comment on this. The addition is fine. But I disagree that we should endeavor to be exhaustive in that list and think that tweaking the variable is a rare event. Servers come and go for many languages, it's a very volatile landscape. And eglot-server-programs is just a starter database of simple server invocations that are more or less known to work out of the box. It is designed to be tweaked, passing command line arguments to servers, putting in absolute paths for experiments, etc. Maybe the variable could be autoloaded, but that probably has some pitfalls I'm not seeing at the moment. João [-- Attachment #2: Type: text/html, Size: 1685 bytes --] ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 10:25 ` João Távora @ 2022-11-10 17:04 ` Eli Zaretskii 2022-11-10 17:10 ` Eli Zaretskii 1 sibling, 0 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 17:04 UTC (permalink / raw) To: João Távora; +Cc: arash, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Thu, 10 Nov 2022 10:25:11 +0000 > Cc: Arash Esbati <arash@gnu.org>, emacs-devel@gnu.org > > > > The addition would look like this: > > [...] > > Thanks, I'll let João comment on this. > > The addition is fine. I installed that, thanks. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 10:25 ` João Távora 2022-11-10 17:04 ` Eli Zaretskii @ 2022-11-10 17:10 ` Eli Zaretskii 2022-11-10 21:45 ` João Távora 2022-11-12 14:44 ` Arash Esbati 1 sibling, 2 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 17:10 UTC (permalink / raw) To: João Távora; +Cc: emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Thu, 10 Nov 2022 10:25:11 +0000 > Cc: Arash Esbati <arash@gnu.org>, emacs-devel@gnu.org > > But I disagree that we should endeavor to be exhaustive in that list > and think that tweaking the variable is a rare event. This is a project-level goal of the Emacs project, and as such is up to the maintainers to set and pursue. Even if the maintainers are wrong, in your opinion. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 17:10 ` Eli Zaretskii @ 2022-11-10 21:45 ` João Távora 2022-11-11 6:12 ` Yuri Khan 2022-11-11 7:04 ` Eli Zaretskii 2022-11-12 14:44 ` Arash Esbati 1 sibling, 2 replies; 78+ messages in thread From: João Távora @ 2022-11-10 21:45 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: João Távora <joaotavora@gmail.com> >> Date: Thu, 10 Nov 2022 10:25:11 +0000 >> Cc: Arash Esbati <arash@gnu.org>, emacs-devel@gnu.org >> >> But I disagree that we should endeavor to be exhaustive in that list >> and think that tweaking the variable is a rare event. > > This is a project-level goal of the Emacs project, and as such is up > to the maintainers to set and pursue. Even if the maintainers are > wrong, in your opinion. eglot-server-programs grew formidably over the last 4 years, and I have no objections to keep growing it. Being exhaustive is going to be reasonably hard, because so many servers will continue to appear. Even faster than programming languages. And some servers are just abandoned, which is another annoyance. And we should not assume the user won't want to tweak to add flags or servers we don't know about. That would contradicts my lengthy experience with the uses of this variable. Anyway, I prefer to focus my limited time on other aspects of Eglot, but you're certainly not "wrong" if you make adding new servers a priority. João ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 21:45 ` João Távora @ 2022-11-11 6:12 ` Yuri Khan 2022-11-11 9:09 ` João Távora 2022-11-12 2:34 ` Brian Cully via Emacs development discussions. 2022-11-11 7:04 ` Eli Zaretskii 1 sibling, 2 replies; 78+ messages in thread From: Yuri Khan @ 2022-11-11 6:12 UTC (permalink / raw) To: João Távora; +Cc: Eli Zaretskii, emacs-devel On Fri, 11 Nov 2022 at 04:45, João Távora <joaotavora@gmail.com> wrote: > eglot-server-programs grew formidably over the last 4 years, and I have > no objections to keep growing it. Being exhaustive is going to be > reasonably hard, because so many servers will continue to appear. Even > faster than programming languages. And some servers are just abandoned, > which is another annoyance. And we should not assume the user won't > want to tweak to add flags or servers we don't know about. That would > contradicts my lengthy experience with the uses of this variable. I might be using Eglot unconventionally, but this is how I do it: There are multiple projects, with their specific compiler versions and library dependencies. If I installed all of that directly on my machine, I’d have version hell. Therefore, for each project, I build a docker image with all the external dependencies packed in. I mount my source tree into a container and invoke the build in it. Emacs, on the other hand, runs on the host machine. Thus, my compile-command is defined in .dir-locals.el and starts with “docker run --rm”. Similarly, I put the language server(s) into the same container image. This way, it has access to external library sources. So, my eglot-server-programs is overridden in each project to run a script that starts e.g. clangd in a container spun up from the project-specific development tools image. I do not bother writing out a copy of the full default value of eglot-server-programs with my dockerized server substituted or prepended. The expectation is that each project only uses one or no more than a handful of language servers. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 6:12 ` Yuri Khan @ 2022-11-11 9:09 ` João Távora 2022-11-12 2:34 ` Brian Cully via Emacs development discussions. 1 sibling, 0 replies; 78+ messages in thread From: João Távora @ 2022-11-11 9:09 UTC (permalink / raw) To: Yuri Khan; +Cc: Eli Zaretskii, emacs-devel Yuri Khan <yuri.v.khan@gmail.com> writes: > On Fri, 11 Nov 2022 at 04:45, João Távora <joaotavora@gmail.com> wrote: > >> eglot-server-programs grew formidably over the last 4 years, and I have >> no objections to keep growing it. Being exhaustive is going to be >> reasonably hard, because so many servers will continue to appear. Even >> faster than programming languages. And some servers are just abandoned, >> which is another annoyance. And we should not assume the user won't >> want to tweak to add flags or servers we don't know about. That would >> contradicts my lengthy experience with the uses of this variable. > > I might be using Eglot unconventionally, but this is how I do it: Dir-local eglot-server-programs sounds fine, as long as the project files you intend for Eglot to manage are contained entirely inside one directory, which they usually are. João ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 6:12 ` Yuri Khan 2022-11-11 9:09 ` João Távora @ 2022-11-12 2:34 ` Brian Cully via Emacs development discussions. 2022-11-12 16:22 ` Michael Albinus 1 sibling, 1 reply; 78+ messages in thread From: Brian Cully via Emacs development discussions. @ 2022-11-12 2:34 UTC (permalink / raw) To: Yuri Khan, João Távora; +Cc: Eli Zaretskii, emacs-devel Yuri Khan <yuri.v.khan@gmail.com> writes: > I might be using Eglot unconventionally, but this is how I do it: > > There are multiple projects, with their specific compiler versions and > library dependencies. If I installed all of that directly on my > machine, I’d have version hell. Therefore, for each project, I build a > docker image with all the external dependencies packed in. I mount my > source tree into a container and invoke the build in it. Emacs, on the > other hand, runs on the host machine. Thus, my compile-command is > defined in .dir-locals.el and starts with “docker run --rm”. This is also how I use eglot. I only do my coding inside of explicitly versioned and reproducible containers. FWIW, eglot natively supports Tramp, meaning it will spawn the LSP on the remote, as long as you are also accessing those files remotely. There's no need to change the value of ‘eglot-server-programs’ in this case. -bjc ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 2:34 ` Brian Cully via Emacs development discussions. @ 2022-11-12 16:22 ` Michael Albinus 0 siblings, 0 replies; 78+ messages in thread From: Michael Albinus @ 2022-11-12 16:22 UTC (permalink / raw) To: Brian Cully via Emacs development discussions. Cc: Yuri Khan, João Távora, Brian Cully, Eli Zaretskii Brian Cully via "Emacs development discussions." <emacs-devel@gnu.org> writes: Hi, > FWIW, eglot natively supports Tramp, meaning it will spawn the LSP on > the remote, as long as you are also accessing those files > remotely. There's no need to change the value of ‘eglot-server-programs’ > in this case. If the program is different on your local host and on the remote hosts, it might be useful to have different values for eglot-server-programs, depending on where you are. > -bjc Best regards, Michael. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 21:45 ` João Távora 2022-11-11 6:12 ` Yuri Khan @ 2022-11-11 7:04 ` Eli Zaretskii 2022-11-11 9:12 ` João Távora 1 sibling, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-11 7:04 UTC (permalink / raw) To: João Távora; +Cc: emacs-devel > From: João Távora <joaotavora@gmail.com> > Cc: emacs-devel@gnu.org > Date: Thu, 10 Nov 2022 21:45:59 +0000 > > > This is a project-level goal of the Emacs project, and as such is up > > to the maintainers to set and pursue. Even if the maintainers are > > wrong, in your opinion. > > eglot-server-programs grew formidably over the last 4 years, and I have > no objections to keep growing it. Being exhaustive is going to be > reasonably hard, because so many servers will continue to appear. Even > faster than programming languages. And some servers are just abandoned, > which is another annoyance. And we should not assume the user won't > want to tweak to add flags or servers we don't know about. That would > contradicts my lengthy experience with the uses of this variable. > > Anyway, I prefer to focus my limited time on other aspects of Eglot, but > you're certainly not "wrong" if you make adding new servers a priority. As long as you don't start objecting to adding more servers, there's no contradiction between our goals. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 7:04 ` Eli Zaretskii @ 2022-11-11 9:12 ` João Távora 2022-11-11 11:53 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: João Távora @ 2022-11-11 9:12 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: João Távora <joaotavora@gmail.com> >> Cc: emacs-devel@gnu.org >> Date: Thu, 10 Nov 2022 21:45:59 +0000 >> >> > This is a project-level goal of the Emacs project, and as such is up >> > to the maintainers to set and pursue. Even if the maintainers are >> > wrong, in your opinion. >> >> eglot-server-programs grew formidably over the last 4 years, and I have >> no objections to keep growing it. Being exhaustive is going to be >> reasonably hard, because so many servers will continue to appear. Even >> faster than programming languages. And some servers are just abandoned, >> which is another annoyance. And we should not assume the user won't >> want to tweak to add flags or servers we don't know about. That would >> contradicts my lengthy experience with the uses of this variable. >> >> Anyway, I prefer to focus my limited time on other aspects of Eglot, but >> you're certainly not "wrong" if you make adding new servers a priority. > > As long as you don't start objecting to adding more servers, there's > no contradiction between our goals. I don't think I ever objected to it, and I don't plan on starting. Personally, I use a tiny fraction of that list, and it's been gleefully and carefully curated by many of Eglot's smaller contributors, to which I am very thankful. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 9:12 ` João Távora @ 2022-11-11 11:53 ` Eli Zaretskii 0 siblings, 0 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-11 11:53 UTC (permalink / raw) To: João Távora; +Cc: emacs-devel > From: João Távora <joaotavora@gmail.com> > Cc: emacs-devel@gnu.org > Date: Fri, 11 Nov 2022 09:12:17 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> From: João Távora <joaotavora@gmail.com> > >> Cc: emacs-devel@gnu.org > >> Date: Thu, 10 Nov 2022 21:45:59 +0000 > >> > >> > This is a project-level goal of the Emacs project, and as such is up > >> > to the maintainers to set and pursue. Even if the maintainers are > >> > wrong, in your opinion. > >> > >> eglot-server-programs grew formidably over the last 4 years, and I have > >> no objections to keep growing it. Being exhaustive is going to be > >> reasonably hard, because so many servers will continue to appear. Even > >> faster than programming languages. And some servers are just abandoned, > >> which is another annoyance. And we should not assume the user won't > >> want to tweak to add flags or servers we don't know about. That would > >> contradicts my lengthy experience with the uses of this variable. > >> > >> Anyway, I prefer to focus my limited time on other aspects of Eglot, but > >> you're certainly not "wrong" if you make adding new servers a priority. > > > > As long as you don't start objecting to adding more servers, there's > > no contradiction between our goals. > > I don't think I ever objected to it And I don't think I ever said you did. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 17:10 ` Eli Zaretskii 2022-11-10 21:45 ` João Távora @ 2022-11-12 14:44 ` Arash Esbati 2022-11-12 14:49 ` Eli Zaretskii 1 sibling, 1 reply; 78+ messages in thread From: Arash Esbati @ 2022-11-12 14:44 UTC (permalink / raw) To: Eli Zaretskii; +Cc: João Távora, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: > This is a project-level goal of the Emacs project, and as such is up > to the maintainers to set and pursue. I'm not sure if this point is already addressed: With the goal above to have a large number of server names built-in, maybe it should also be mentioned if the license of the servers is relevant for their addition. The one I added is released under GPL v3.0. Best, Arash ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 14:44 ` Arash Esbati @ 2022-11-12 14:49 ` Eli Zaretskii 2022-11-12 14:58 ` Arash Esbati 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-12 14:49 UTC (permalink / raw) To: Arash Esbati; +Cc: joaotavora, emacs-devel > From: Arash Esbati <arash@gnu.org> > Cc: João Távora <joaotavora@gmail.com>, > emacs-devel@gnu.org > Date: Sat, 12 Nov 2022 15:44:12 +0100 > > Eli Zaretskii <eliz@gnu.org> writes: > > > This is a project-level goal of the Emacs project, and as such is up > > to the maintainers to set and pursue. > > I'm not sure if this point is already addressed: With the goal above to > have a large number of server names built-in, maybe it should also be > mentioned if the license of the servers is relevant for their addition. > The one I added is released under GPL v3.0. I hope we are only adding servers which are Free Software. If that is so, why does it matter under which free license they are distributed? People who care can easily look that up, but most users will not care, I think. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-12 14:49 ` Eli Zaretskii @ 2022-11-12 14:58 ` Arash Esbati 0 siblings, 0 replies; 78+ messages in thread From: Arash Esbati @ 2022-11-12 14:58 UTC (permalink / raw) To: Eli Zaretskii; +Cc: joaotavora, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: > I hope we are only adding servers which are Free Software. If that is > so, why does it matter under which free license they are distributed? Personally, I agree with the above. I think this should be spelled out once and people know what they can suggest for future additions. Best, Arash ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 9:18 ` Arash Esbati 2022-11-10 9:34 ` Eli Zaretskii @ 2022-11-10 21:28 ` Augusto Stoffel 2022-11-11 10:05 ` Arash Esbati 1 sibling, 1 reply; 78+ messages in thread From: Augusto Stoffel @ 2022-11-10 21:28 UTC (permalink / raw) To: Arash Esbati; +Cc: Eli Zaretskii, emacs-devel On Thu, 10 Nov 2022 at 10:18, Arash Esbati wrote: > Currently, "digestif" doesn't run on Windows FWIW, this should be easy to fix by a volunteer with access to a Windows machine. I might also be able to fix things if a detailed bug report is provided. (In fact, I wouldn't be surprised if it just works by now.) ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 21:28 ` Augusto Stoffel @ 2022-11-11 10:05 ` Arash Esbati 2022-11-11 12:05 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Arash Esbati @ 2022-11-11 10:05 UTC (permalink / raw) To: Augusto Stoffel; +Cc: emacs-devel Augusto Stoffel <arstoffel@gmail.com> writes: > On Thu, 10 Nov 2022 at 10:18, Arash Esbati wrote: > >> Currently, "digestif" doesn't run on Windows > > FWIW, this should be easy to fix by a volunteer with access to a Windows > machine. I might also be able to fix things if a detailed bug report is > provided. (In fact, I wouldn't be surprised if it just works by now.) It still doesn't work. I ran the installation script with this change in order to use lua (v5.4.4) and not texlua: # Name of the Lua interpreter to use LUA=lua This is what I get in a ming64 shell: --8<---------------cut here---------------start------------->8--- Digestif not found in /z/myhome/.digestif, fetching it now Cloning into '/z/myhome/.digestif'... remote: Enumerating objects: 70, done. remote: Counting objects: 100% (70/70), done. remote: Compressing objects: 100% (68/68), done. remote: Total 70 (delta 2), reused 20 (delta 0), pack-reused 0 Receiving objects: 100% (70/70), 644.32 KiB | 3.95 MiB/s, done. Resolving deltas: 100% (2/2), done. Done! If you are running this interactively, press Control-C to quit. The system cannot find the specified path. The system cannot find the specified path. Content-Length: 175 [It hangs here and now I hit C-c and the rest follows:] {"error":{"message":"z:/myhome/.digestif/digestif\\util.lua:569: bad argument #2 to 'match' (string expected, got nil)","code":-32700},"jsonrpc":"2.0","id":null,"result":false}C:\pathto\mingw64\bin\lua.exe: z:/myhome/.digestif/digestif\langserver.lua:388: interrupted! stack traceback: [C]: in function 'io.write' z:/myhome/.digestif/digestif\langserver.lua:388: in upvalue 'write_msg' z:/myhome/.digestif/digestif\langserver.lua:405: in upvalue 'rpc_send' z:/myhome/.digestif/digestif\langserver.lua:418: in upvalue 'rpc_receive' z:/myhome/.digestif/digestif\langserver.lua:430: in upvalue 'process_request' z:/myhome/.digestif/digestif\langserver.lua:538: in function 'digestif.langserver.main' z:/myhome/.digestif/bin/digestif:2: in main chunk [C]: in ? --8<---------------cut here---------------end--------------->8--- Please feel free to contact me directly if I can provide more input since this is off-topic on emacs-devel. Best, Arash ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 10:05 ` Arash Esbati @ 2022-11-11 12:05 ` Eli Zaretskii 2022-11-11 12:22 ` Arash Esbati 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-11 12:05 UTC (permalink / raw) To: Arash Esbati; +Cc: arstoffel, emacs-devel > From: Arash Esbati <arash@gnu.org> > Cc: emacs-devel@gnu.org > Date: Fri, 11 Nov 2022 11:05:19 +0100 > > This is what I get in a ming64 shell: > > --8<---------------cut here---------------start------------->8--- > Digestif not found in /z/myhome/.digestif, fetching it now > Cloning into '/z/myhome/.digestif'... This sounds like some MSYS2 executable is involved, which might get you in trouble due to different file-name syntax and other incompatibilities between MSYS2 and native Windows programs. > remote: Enumerating objects: 70, done. > remote: Counting objects: 100% (70/70), done. > remote: Compressing objects: 100% (68/68), done. > remote: Total 70 (delta 2), reused 20 (delta 0), pack-reused 0 > Receiving objects: 100% (70/70), 644.32 KiB | 3.95 MiB/s, done. > Resolving deltas: 100% (2/2), done. > Done! If you are running this interactively, press Control-C to quit. > The system cannot find the specified path. > The system cannot find the specified path. Which program this tries to invoke and with what command-line arguments? ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 12:05 ` Eli Zaretskii @ 2022-11-11 12:22 ` Arash Esbati 2022-11-11 12:33 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Arash Esbati @ 2022-11-11 12:22 UTC (permalink / raw) To: Eli Zaretskii; +Cc: arstoffel, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: Arash Esbati <arash@gnu.org> >> Cc: emacs-devel@gnu.org >> Date: Fri, 11 Nov 2022 11:05:19 +0100 >> >> This is what I get in a ming64 shell: >> >> --8<---------------cut here---------------start------------->8--- >> Digestif not found in /z/myhome/.digestif, fetching it now >> Cloning into '/z/myhome/.digestif'... > > This sounds like some MSYS2 executable is involved, which might get > you in trouble due to different file-name syntax and other > incompatibilities between MSYS2 and native Windows programs. This part comes from git which is indeed a MSYS2 executable and actually succeeds (see below) and the repo is cloned to my HD. >> remote: Enumerating objects: 70, done. >> remote: Counting objects: 100% (70/70), done. >> remote: Compressing objects: 100% (68/68), done. >> remote: Total 70 (delta 2), reused 20 (delta 0), pack-reused 0 >> Receiving objects: 100% (70/70), 644.32 KiB | 3.95 MiB/s, done. >> Resolving deltas: 100% (2/2), done. >> Done! If you are running this interactively, press Control-C to quit. >> The system cannot find the specified path. >> The system cannot find the specified path. > > Which program this tries to invoke and with what command-line > arguments? This is lua.exe which is installed as mingw-w64-x86_64-lua: -> which lua /mingw64/bin/lua The installation script is here: https://raw.githubusercontent.com/astoff/digestif/master/scripts/digestif The problematic part can be condensed to this I think: DIGESTIF_HOME="$HOME/.digestif" LUA=lua export LUA_PATH="$DIGESTIF_HOME/?.lua" export DIGESTIF_PRERELEASE="$(git -C "$DIGESTIF_HOME" rev-parse --short HEAD)" "$LUA" "$DIGESTIF_HOME/bin/digestif" "$@" Best, Arash ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 12:22 ` Arash Esbati @ 2022-11-11 12:33 ` Eli Zaretskii 2022-11-11 13:26 ` Augusto Stoffel 2022-11-11 13:48 ` Arash Esbati 0 siblings, 2 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-11 12:33 UTC (permalink / raw) To: Arash Esbati; +Cc: arstoffel, emacs-devel > From: Arash Esbati <arash@gnu.org> > Cc: arstoffel@gmail.com, emacs-devel@gnu.org > Date: Fri, 11 Nov 2022 13:22:53 +0100 > > >> Cloning into '/z/myhome/.digestif'... > > > > This sounds like some MSYS2 executable is involved, which might get > > you in trouble due to different file-name syntax and other > > incompatibilities between MSYS2 and native Windows programs. > > This part comes from git which is indeed a MSYS2 executable and > actually succeeds (see below) and the repo is cloned to my HD. Why are using an MSYS2 build of Git, when a native Windows build exists and is fully functional? > >> The system cannot find the specified path. > >> The system cannot find the specified path. > > > > Which program this tries to invoke and with what command-line > > arguments? > > This is lua.exe which is installed as mingw-w64-x86_64-lua: > > -> which lua > /mingw64/bin/lua > > The installation script is here: > https://raw.githubusercontent.com/astoff/digestif/master/scripts/digestif > > The problematic part can be condensed to this I think: > > DIGESTIF_HOME="$HOME/.digestif" > LUA=lua > > export LUA_PATH="$DIGESTIF_HOME/?.lua" > export DIGESTIF_PRERELEASE="$(git -C "$DIGESTIF_HOME" rev-parse --short HEAD)" > > "$LUA" "$DIGESTIF_HOME/bin/digestif" "$@" So which of the files/directories involved is the one that "the system cannot find"? That message comes from cmd.exe, AFAIK. Maybe it's LUA_PATH, because Windows doesn't allow question marks in file names. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 12:33 ` Eli Zaretskii @ 2022-11-11 13:26 ` Augusto Stoffel 2022-11-11 13:48 ` Arash Esbati 1 sibling, 0 replies; 78+ messages in thread From: Augusto Stoffel @ 2022-11-11 13:26 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Arash Esbati, emacs-devel On Fri, 11 Nov 2022 at 14:33, Eli Zaretskii wrote: >> export LUA_PATH="$DIGESTIF_HOME/?.lua" >> export DIGESTIF_PRERELEASE="$(git -C "$DIGESTIF_HOME" rev-parse --short HEAD)" >> >> "$LUA" "$DIGESTIF_HOME/bin/digestif" "$@" > > So which of the files/directories involved is the one that "the system > cannot find"? That message comes from cmd.exe, AFAIK. > > Maybe it's LUA_PATH, because Windows doesn't allow question marks in > file names. The LUA_PATH is (probably) fine; the question mark is interpreted by Lua and means that package x.y.z is to be found at "$DIGESTIF_HOME/x/y/z.lua". ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 12:33 ` Eli Zaretskii 2022-11-11 13:26 ` Augusto Stoffel @ 2022-11-11 13:48 ` Arash Esbati 2022-11-11 13:54 ` Eli Zaretskii 1 sibling, 1 reply; 78+ messages in thread From: Arash Esbati @ 2022-11-11 13:48 UTC (permalink / raw) To: Eli Zaretskii; +Cc: arstoffel, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: > Why are using an MSYS2 build of Git, when a native Windows build > exists and is fully functional? I just took the one which was available through pacman, and I saw only msys/git There is no mingw64/mingw-w64-x86_64-git AFAICT. Or are you thinking about 'Git for Windows' releases? And until now, I had no problems with MSYS2 git. > So which of the files/directories involved is the one that "the system > cannot find"? I can't tell where that comes from. > That message comes from cmd.exe, AFAIK. Yes, I get the same result when doing the excercise within cmd.exe. Best, Arash ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-11 13:48 ` Arash Esbati @ 2022-11-11 13:54 ` Eli Zaretskii 0 siblings, 0 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-11 13:54 UTC (permalink / raw) To: Arash Esbati; +Cc: arstoffel, emacs-devel > From: Arash Esbati <arash@gnu.org> > Cc: arstoffel@gmail.com, emacs-devel@gnu.org > Date: Fri, 11 Nov 2022 14:48:30 +0100 > > Eli Zaretskii <eliz@gnu.org> writes: > > > Why are using an MSYS2 build of Git, when a native Windows build > > exists and is fully functional? > > I just took the one which was available through pacman, and I saw only > > msys/git > > There is no > > mingw64/mingw-w64-x86_64-git > > AFAICT. Or are you thinking about 'Git for Windows' releases? Yes. > And until now, I had no problems with MSYS2 git. That's just sheer luck, IME. > > So which of the files/directories involved is the one that "the system > > cannot find"? > > I can't tell where that comes from. Understanding that will probably allow fixing the problem, so I'd try very hard if I were you or Augusto. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-09 20:25 Making `eglot-server-programs' a custom variable? Arash Esbati 2022-11-09 20:49 ` Philip Kaludercic 2022-11-10 6:36 ` Eli Zaretskii @ 2022-11-10 10:15 ` João Távora 2022-11-10 11:23 ` Eli Zaretskii 2022-11-10 13:57 ` Stefan Monnier 2 siblings, 2 replies; 78+ messages in thread From: João Távora @ 2022-11-10 10:15 UTC (permalink / raw) To: Arash Esbati, Eli Zaretskii, Tim Cross; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1587 bytes --] Arash, I think your suggestion of recommending `with-eval-after-load` is pertinent and should be added to the manual. Eli, even though we provide a healthy dose of built-in server invocations in that variable, we can't and shouldn't aim at being exhaustive. Eglot's manual is meant to be a go-to guide for knowing how to resolve simple problems such as this one, which is very common. The problems solved by eglot-workspace-configuration and other variables are also very common. The manual should be reasonably self sufficient, not too terse or relying on the user's knowledge. The "Quick Start" section that Eli added is a great example of that pragmatism, but other parts need to follow suit. So we really do need a copy-paste recipe for things like this. I'll be committing Arash's trivial and effective suggestion today or tomorrow unless someone seriously objects. That said, I have no objection to converting eglot-server-programs into a defcustom, if someone will commit to translating and maintaining all the complex combination of options into "widget" form. I don't have the time or inclination for this task, but maybe someone has. Tim, I'm on board with making sure the documentation can demonstrate to users how to perform complex customizations of this variable, like the one you suggest. But here, I think I tend to prefer documenting such complex things in one place only, and I see no problem in teaching the user to C-h f to the variable's docstring, which is the canonical source of truth to that interface. Thanks, João [-- Attachment #2: Type: text/html, Size: 2069 bytes --] ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 10:15 ` João Távora @ 2022-11-10 11:23 ` Eli Zaretskii 2022-11-10 12:07 ` João Távora 2022-11-10 13:57 ` Stefan Monnier 1 sibling, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 11:23 UTC (permalink / raw) To: João Távora; +Cc: arash, theophilusx, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Thu, 10 Nov 2022 10:15:41 +0000 > Cc: emacs-devel <emacs-devel@gnu.org> > > Arash, I think your suggestion of recommending `with-eval-after-load` > is pertinent and should be added to the manual. How about adding a command to add servers to the list instead? See below. > Eli, even though we provide a healthy dose of built-in server invocations > in that variable, we can't and shouldn't aim at being exhaustive. > > Eglot's manual is meant to be a go-to guide for knowing how to resolve > simple problems such as this one, which is very common. The problems > solved by eglot-workspace-configuration and other variables are also > very common. The manual should be reasonably self sufficient, not too > terse or relying on the user's knowledge. IMNSHO, it is not the mission of the Eglot manual to teach people with-eval-after-load and in general how to update lists that aren't autoloaded or preloaded. This is a slippery slope. > That said, I have no objection to converting eglot-server-programs into > a defcustom, if someone will commit to translating and maintaining all > the complex combination of options into "widget" form. I don't have the > time or inclination for this task, but maybe someone has. It is not a good idea to have a defcustom whose value should be such a complex data structure. If we think users will have to augment the value, it is better to add a command to do that, and in that command hide all the complexity and subtleties of the value. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 11:23 ` Eli Zaretskii @ 2022-11-10 12:07 ` João Távora 2022-11-10 15:19 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: João Távora @ 2022-11-10 12:07 UTC (permalink / raw) To: Eli Zaretskii; +Cc: arash, theophilusx, emacs-devel [-- Attachment #1: Type: text/plain, Size: 2466 bytes --] On Thu, Nov 10, 2022 at 11:23 AM Eli Zaretskii <eliz@gnu.org> wrote: > > From: João Távora <joaotavora@gmail.com> > > Date: Thu, 10 Nov 2022 10:15:41 +0000 > > Cc: emacs-devel <emacs-devel@gnu.org> > > > > Arash, I think your suggestion of recommending `with-eval-after-load` > > is pertinent and should be added to the manual. > > How about adding a command to add servers to the list instead? See > below. > > > Eli, even though we provide a healthy dose of built-in server invocations > > in that variable, we can't and shouldn't aim at being exhaustive. > > > > Eglot's manual is meant to be a go-to guide for knowing how to resolve > > simple problems such as this one, which is very common. The problems > > solved by eglot-workspace-configuration and other variables are also > > very common. The manual should be reasonably self sufficient, not too > > terse or relying on the user's knowledge. > > IMNSHO, it is not the mission of the Eglot manual to teach people > with-eval-after-load and in general how to update lists that aren't > autoloaded or preloaded. This is a slippery slope. > I understand your opinion, and I share it mostly. But this is not that slippery. We also have short mentions in passing of directory-local variables because they are essential to setting up eglot-workspace-configuration. Short mentions of Emacs's facilities and links to other documentation deepening those concepts is the best strategy. I've used it in the README.md and MANUAL.md that preceded this manual and I can attest that it worked well. If making the variable autoloaded can make use skip the with-eval-after-load, and has no other pitfalls, then I'm OK with that too. Whatever works and makes the manual self-sufficient in this very simple and common task. > That said, I have no objection to converting eglot-server-programs into > > a defcustom, if someone will commit to translating and maintaining all > > the complex combination of options into "widget" form. I don't have the > > time or inclination for this task, but maybe someone has. > > It is not a good idea to have a defcustom whose value should be such a > complex data structure. I agree, but a command is a not a solution IMO: this belongs in the user's configuration file. A good docstring (can it be improved?) containing good descriptions and some ready-made recipes is the current and best approach to these things. [-- Attachment #2: Type: text/html, Size: 3387 bytes --] ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 12:07 ` João Távora @ 2022-11-10 15:19 ` Eli Zaretskii 2022-11-10 15:35 ` Dmitry Gutov 2022-11-10 15:38 ` João Távora 0 siblings, 2 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 15:19 UTC (permalink / raw) To: João Távora; +Cc: arash, theophilusx, emacs-devel > From: João Távora <joaotavora@gmail.com> > Date: Thu, 10 Nov 2022 12:07:30 +0000 > Cc: arash@gnu.org, theophilusx@gmail.com, emacs-devel@gnu.org > > > That said, I have no objection to converting eglot-server-programs into > > a defcustom, if someone will commit to translating and maintaining all > > the complex combination of options into "widget" form. I don't have the > > time or inclination for this task, but maybe someone has. > > It is not a good idea to have a defcustom whose value should be such a > complex data structure. > > I agree, but a command is a not a solution IMO: this belongs in the > user's configuration file. ??? The user init file can call the command, cannot it? And adding a command is not a replacement for having a variable: people who know enough Lisp can do what they want with the variable. The command is proposed as a replacement for a defcustom, because interactively customizing such a complex variable with a very long value is problematic at best. > A good docstring (can it be improved?) containing good descriptions > and some ready-made recipes is the current and best approach to these > things. Sorry, but I disagree. No doc string can reasonably teach users advanced Lisp. That's a non-starter. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 15:19 ` Eli Zaretskii @ 2022-11-10 15:35 ` Dmitry Gutov 2022-11-10 16:50 ` Eli Zaretskii 2022-11-10 15:38 ` João Távora 1 sibling, 1 reply; 78+ messages in thread From: Dmitry Gutov @ 2022-11-10 15:35 UTC (permalink / raw) To: Eli Zaretskii, João Távora; +Cc: arash, theophilusx, emacs-devel On 10.11.2022 17:19, Eli Zaretskii wrote: >> From: João Távora <joaotavora@gmail.com> >> Date: Thu, 10 Nov 2022 12:07:30 +0000 >> Cc: arash@gnu.org, theophilusx@gmail.com, emacs-devel@gnu.org >> >> > That said, I have no objection to converting eglot-server-programs into >> > a defcustom, if someone will commit to translating and maintaining all >> > the complex combination of options into "widget" form. I don't have the >> > time or inclination for this task, but maybe someone has. >> >> It is not a good idea to have a defcustom whose value should be such a >> complex data structure. >> >> I agree, but a command is a not a solution IMO: this belongs in the >> user's configuration file. > > ??? The user init file can call the command, cannot it? > > And adding a command is not a replacement for having a variable: > people who know enough Lisp can do what they want with the variable. > The command is proposed as a replacement for a defcustom, because > interactively customizing such a complex variable with a very long > value is problematic at best. If you just have a command (to be used interactively, right?), it will only affect the value in the current session. defcustom provides a facility to persist the changes between sessions. I suppose we could have both a defcustom, and a command or two to modify the value. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 15:35 ` Dmitry Gutov @ 2022-11-10 16:50 ` Eli Zaretskii 2022-11-10 18:22 ` Dmitry Gutov 0 siblings, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 16:50 UTC (permalink / raw) To: Dmitry Gutov; +Cc: joaotavora, arash, theophilusx, emacs-devel > Date: Thu, 10 Nov 2022 17:35:55 +0200 > Cc: arash@gnu.org, theophilusx@gmail.com, emacs-devel@gnu.org > From: Dmitry Gutov <dgutov@yandex.ru> > > If you just have a command (to be used interactively, right?), it will > only affect the value in the current session. The command could do whatever we want it to do, including writing to the user's init file, if the user wants that. And if the command is invoked from the init file, it will affect the current session, in every session. > defcustom provides a facility to persist the changes between sessions. So do commands. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 16:50 ` Eli Zaretskii @ 2022-11-10 18:22 ` Dmitry Gutov 2022-11-10 18:31 ` Eli Zaretskii 0 siblings, 1 reply; 78+ messages in thread From: Dmitry Gutov @ 2022-11-10 18:22 UTC (permalink / raw) To: Eli Zaretskii; +Cc: joaotavora, arash, theophilusx, emacs-devel On 10.11.2022 18:50, Eli Zaretskii wrote: >> Date: Thu, 10 Nov 2022 17:35:55 +0200 >> Cc:arash@gnu.org,theophilusx@gmail.com,emacs-devel@gnu.org >> From: Dmitry Gutov<dgutov@yandex.ru> >> >> If you just have a command (to be used interactively, right?), it will >> only affect the value in the current session. > The command could do whatever we want it to do, including writing to > the user's init file, if the user wants that. And if the command is > invoked from the init file, it will affect the current session, in > every session. The user can normally choose where the customizations are stored (inside the init file, or in some file alongside it). If you're suggesting the proposed command reimplements that logic (and honors the value of custom-file? ignores it?), that seems like a poor choice in my POV. No opinion on the rest of this discussion. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 18:22 ` Dmitry Gutov @ 2022-11-10 18:31 ` Eli Zaretskii 0 siblings, 0 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 18:31 UTC (permalink / raw) To: Dmitry Gutov; +Cc: joaotavora, arash, theophilusx, emacs-devel > Date: Thu, 10 Nov 2022 20:22:00 +0200 > Cc: joaotavora@gmail.com, arash@gnu.org, theophilusx@gmail.com, > emacs-devel@gnu.org > From: Dmitry Gutov <dgutov@yandex.ru> > > On 10.11.2022 18:50, Eli Zaretskii wrote: > >> Date: Thu, 10 Nov 2022 17:35:55 +0200 > >> Cc:arash@gnu.org,theophilusx@gmail.com,emacs-devel@gnu.org > >> From: Dmitry Gutov<dgutov@yandex.ru> > >> > >> If you just have a command (to be used interactively, right?), it will > >> only affect the value in the current session. > > The command could do whatever we want it to do, including writing to > > the user's init file, if the user wants that. And if the command is > > invoked from the init file, it will affect the current session, in > > every session. > > The user can normally choose where the customizations are stored (inside > the init file, or in some file alongside it). When they use defcustoms? only globally, for all the defcustoms, not individually for each defcustom. > If you're suggesting the proposed command reimplements that logic (and > honors the value of custom-file? ignores it?), that seems like a poor > choice in my POV. There's no need to reimplement anything, because we can use the same APIs that Custom uses. For example Options->Save options from the menu bar already does that. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 15:19 ` Eli Zaretskii 2022-11-10 15:35 ` Dmitry Gutov @ 2022-11-10 15:38 ` João Távora 2022-11-10 16:52 ` Eli Zaretskii 2022-11-10 17:08 ` Eli Zaretskii 1 sibling, 2 replies; 78+ messages in thread From: João Távora @ 2022-11-10 15:38 UTC (permalink / raw) To: Eli Zaretskii; +Cc: arash, theophilusx, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: João Távora <joaotavora@gmail.com> >> Date: Thu, 10 Nov 2022 12:07:30 +0000 >> Cc: arash@gnu.org, theophilusx@gmail.com, emacs-devel@gnu.org >> >> > That said, I have no objection to converting eglot-server-programs into >> > a defcustom, if someone will commit to translating and maintaining all >> > the complex combination of options into "widget" form. I don't have the >> > time or inclination for this task, but maybe someone has. >> >> It is not a good idea to have a defcustom whose value should be such a >> complex data structure. >> >> I agree, but a command is a not a solution IMO: this belongs in the >> user's configuration file. > > ??? The user init file can call the command, cannot it? Yeah, but then why make it a command, i.e. an interactive function? If whatever you're proposing is going to be called interactively, it won't persist through sessions. So if you're proposing a simple function, I think there's no need to for a function that simply calls add-to-list. > And adding a command is not a replacement for having a variable: > people who know enough Lisp can do what they want with the variable. > The command is proposed as a replacement for a defcustom, because > interactively customizing such a complex variable with a very long > value is problematic at best. Again I cannot see the point of a interactive command. If you mean a simple non-interactive function to be called from the user's init file, I can't see much advantage of using that over using add-to-list, other than auto-loading. And auto-loading isn't necessarily an advantage: I break out many Emacs sessions where I don't M-x eglot at all. with-eval-after-load is the tool for the job here. >> A good docstring (can it be improved?) containing good descriptions >> and some ready-made recipes is the current and best approach to these >> things. > > Sorry, but I disagree. No doc string can reasonably teach users > advanced Lisp. That's a non-starter. Funny, that's how I learned all my Elisp until I learned of the Elisp manual a few years ago. And this is not "advanced" stuff at all. This is all that's needed: diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 204121045a0..a6df8371425 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -298,7 +298,10 @@ eglot-server-programs the call is interactive, the function can ask the user for hints on finding the required programs, etc. Otherwise, it should not ask the user for any input, and return nil or signal - an error if it can't produce a valid CONTACT.") + an error if it can't produce a valid CONTACT. This option can + be combined with the helper function + `eglot-alternatives' (which see) to define more than one + alternative server for a given MAJOR-MODE.") (defface eglot-highlight-symbol-face '((t (:inherit bold))) Throwing in an example 3-line snippet in the manual for eglot-alternatives is also fine: (with-eval-after-load 'eglot (add-to-list 'eglot-server-programs `(foo-mode . ,(eglot-alternatives '("fools" ("bazls" "--foo")))))) ^ permalink raw reply related [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 15:38 ` João Távora @ 2022-11-10 16:52 ` Eli Zaretskii 2022-11-10 17:08 ` Eli Zaretskii 1 sibling, 0 replies; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 16:52 UTC (permalink / raw) To: João Távora; +Cc: arash, theophilusx, emacs-devel > From: João Távora <joaotavora@gmail.com> > Cc: arash@gnu.org, theophilusx@gmail.com, emacs-devel@gnu.org > Date: Thu, 10 Nov 2022 15:38:32 +0000 > > >> I agree, but a command is a not a solution IMO: this belongs in the > >> user's configuration file. > > > > ??? The user init file can call the command, cannot it? > > Yeah, but then why make it a command, i.e. an interactive function? For the same reason a defcustom doesn't force the user to make the changes permanent. > If > whatever you're proposing is going to be called interactively, it won't > persist through sessions. It could, but I don't see why it must. There's nothing magic in saving a customization. And the same command could be put in the user's init file, in which case no need for it to write anything. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 15:38 ` João Távora 2022-11-10 16:52 ` Eli Zaretskii @ 2022-11-10 17:08 ` Eli Zaretskii 2022-11-10 21:13 ` João Távora 1 sibling, 1 reply; 78+ messages in thread From: Eli Zaretskii @ 2022-11-10 17:08 UTC (permalink / raw) To: João Távora; +Cc: arash, theophilusx, emacs-devel > From: João Távora <joaotavora@gmail.com> > Cc: arash@gnu.org, theophilusx@gmail.com, emacs-devel@gnu.org > Date: Thu, 10 Nov 2022 15:38:32 +0000 > > >> A good docstring (can it be improved?) containing good descriptions > >> and some ready-made recipes is the current and best approach to these > >> things. > > > > Sorry, but I disagree. No doc string can reasonably teach users > > advanced Lisp. That's a non-starter. > > Funny, that's how I learned all my Elisp until I learned of the Elisp > manual a few years ago. And this is not "advanced" stuff at all. This > is all that's needed: We are miscommunicating: I thought you were suggesting to explain the structure of eglot-server-programs's data structure and the methods of augmenting it in the doc string. (You could have guessed that I didn't mean such a simple addition to a doc string, the moment you wrote the "funny" and the "advanced" parts of your reply. You know me well enough for that.) ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 17:08 ` Eli Zaretskii @ 2022-11-10 21:13 ` João Távora 0 siblings, 0 replies; 78+ messages in thread From: João Távora @ 2022-11-10 21:13 UTC (permalink / raw) To: Eli Zaretskii; +Cc: arash, theophilusx, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: > (You could have guessed that I didn't mean such a simple addition to a > doc string, the moment you wrote the "funny" and the "advanced" parts > of your reply. You know me well enough for that.) Sorry, I just found the idea that I was proposing to teach advanced Elisp in docstrings both an exaggeration and oddly familiar. Because it really speaks to how I learned Elisp with Emacs's excellent docstrings. This is why I wrote "funny": as in "curious", not as in "ridiculous". But, pragmatically, I mean only this: * A reference to eglot-alternatives in eglot-server-programs, just like the one I proposed. * A good docstring for eglot-alternatives. I think the current one is fine (but suggestion are welcome). * An additional simple eglot-alternatives example in the Eglot manual. I've done pushed these ideas to master. João ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 10:15 ` João Távora 2022-11-10 11:23 ` Eli Zaretskii @ 2022-11-10 13:57 ` Stefan Monnier 2022-11-10 15:21 ` João Távora 1 sibling, 1 reply; 78+ messages in thread From: Stefan Monnier @ 2022-11-10 13:57 UTC (permalink / raw) To: João Távora; +Cc: Arash Esbati, Eli Zaretskii, Tim Cross, emacs-devel > Arash, I think your suggestion of recommending `with-eval-after-load` > is pertinent and should be added to the manual. I don't have an objection to that but I consider uses of `with-eval-after-load` as hints that maybe we should do things differently. IOW we should try and change the way this customization is done such that it does not need `with-eval-after-load` any more. The suggestion to split the var in two (one plain var and a custom var that defaults to nil) is such a possible solution. > Eli, even though we provide a healthy dose of built-in server invocations > in that variable, we can't and shouldn't aim at being exhaustive. Seeing the wild number of LSP servers available for some languages, I'd agree, sadly. Maybe to reduce the problem we should allow multiple entries per major mode and use the first that works, without needing to go through `eglot-alternatives`? > That said, I have no objection to converting eglot-server-programs into > a defcustom, if someone will commit to translating and maintaining all > the complex combination of options into "widget" form. I don't have the > time or inclination for this task, but maybe someone has. That variable's type is arguably too complex for a `defcustom`. Maybe the corresponding info should be split into several variables to make it more accessible to users, but I don't have any good idea how to do that. [ I'll note in passing that it's common to use strings for TCP port numbers, especially once they are standardized enough to appear in /etc/services, so maybe the syntax for that TCP connection should replace (HOST PORT ...) with something like (:tcp HOST PORT ...). ] Stefan ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 13:57 ` Stefan Monnier @ 2022-11-10 15:21 ` João Távora 2022-11-10 17:43 ` Stefan Monnier 0 siblings, 1 reply; 78+ messages in thread From: João Távora @ 2022-11-10 15:21 UTC (permalink / raw) To: Stefan Monnier; +Cc: Arash Esbati, Eli Zaretskii, Tim Cross, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> Arash, I think your suggestion of recommending `with-eval-after-load` >> is pertinent and should be added to the manual. > I don't have an objection to that but I consider uses of > `with-eval-after-load` as hints that maybe we should do things > differently. Why? This is in a user's init file. I can more or less see that argument for inter-library dependencies. But here, w-e-a-load is exactly what's needed. I use it all the time in my config. The reason people probably didn't need this earlier is because they were using Eglot from a package and were simply adding (require 'eglot) (add-to-list ...) Or they were doing that use-package magic, which probably does the same something similar to the require or the w-e-a-load strategy. > The suggestion to split the var in two (one plain var and a custom var > that defaults to nil) is such a possible solution. That would just break user's configurations and complicate things for no reason. add-to-list is the way to go, and with-eval-after-load (or use-package if you must) is just there for that. Composing existing pieces that do one job well is better than inventing and maintaining new pieces. >> Eli, even though we provide a healthy dose of built-in server invocations >> in that variable, we can't and shouldn't aim at being exhaustive. > Seeing the wild number of LSP servers available for some languages, I'd > agree, sadly. I don't think this is sad :-) > Maybe to reduce the problem we should allow multiple entries per > major mode and use the first that works, without needing to go through > `eglot-alternatives`? Again, why? Why add more semantics to an already complicated variable when the functional eglot-alternatives plugin works fine? Furthermore, I'd like to this particular configuration for a future multiple-simultaneous-server-in-one-mode idea. > [ I'll note in passing that it's common to use strings for TCP port > numbers, especially once they are standardized enough to appear in > /etc/services, so maybe the syntax for that TCP connection should > replace (HOST PORT ...) with something like (:tcp HOST PORT ...). ] If you can make that change without breaking backward compatibility, I have no objections. ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 15:21 ` João Távora @ 2022-11-10 17:43 ` Stefan Monnier 2022-11-10 22:10 ` João Távora 0 siblings, 1 reply; 78+ messages in thread From: Stefan Monnier @ 2022-11-10 17:43 UTC (permalink / raw) To: João Távora; +Cc: Arash Esbati, Eli Zaretskii, Tim Cross, emacs-devel João Távora [2022-11-10 15:21:46] wrote: > Stefan Monnier <monnier@iro.umontreal.ca> writes: >>> Arash, I think your suggestion of recommending `with-eval-after-load` >>> is pertinent and should be added to the manual. >> I don't have an objection to that but I consider uses of >> `with-eval-after-load` as hints that maybe we should do things >> differently. > Why? This is in a user's init file. I can more or less see that > argument for inter-library dependencies. But here, w-e-a-load is > exactly what's needed. I use it all the time in my config. I have 4 uses of it in my ~75kB init file. It's a great tool, but still one where I consider that imposing it on the user is a sign of a deficiency (a bit like advice, tho much less severely so). That doesn't mean we have to find a way to avoid its use, just that it would be nice to find such a way. >>> Eli, even though we provide a healthy dose of built-in server invocations >>> in that variable, we can't and shouldn't aim at being exhaustive. >> Seeing the wild number of LSP servers available for some languages, I'd >> agree, sadly. > I don't think this is sad :-) In my experience it's usually a reflection of the fact the LSP protocol leaves a bit too much control to the server, which should focus on providing "impartial info" about the language, leaving more of the choices of how to use that info somewhere in the hands of the end user. "Choose an LSP server" seems to me like a very poor way to customize the behavior of the server. IOW the design of the LSP protocol is not "Emacs-y" enough :-) >> Maybe to reduce the problem we should allow multiple entries per >> major mode and use the first that works, without needing to go through >> `eglot-alternatives`? > > Again, why? Why add more semantics to an already complicated variable > when the functional eglot-alternatives plugin works fine? Furthermore, > I'd like to this particular configuration for a future > multiple-simultaneous-server-in-one-mode idea. I'm just suggesting directions. I don't claim they're the right answer. My impression is that this variable is currently both "too complex" and "not flexible enough". Don't get me wrong, it's good enough for now. But no, I don't have a good replacement to suggest. My gut just tells me that there is a better arrangement. >> [ I'll note in passing that it's common to use strings for TCP port >> numbers, especially once they are standardized enough to appear in >> /etc/services, so maybe the syntax for that TCP connection should >> replace (HOST PORT ...) with something like (:tcp HOST PORT ...). ] > If you can make that change without breaking backward compatibility, I > have no objections. I think currently an entry cannot start with a keyword, so te syntax I propose wouldn't break compatibility. But it would be different in style from what's there currently, making it more complex for the user. So I think it would only make sense if/when we make other changes at the same time. Stefan ^ permalink raw reply [flat|nested] 78+ messages in thread
* Re: Making `eglot-server-programs' a custom variable? 2022-11-10 17:43 ` Stefan Monnier @ 2022-11-10 22:10 ` João Távora 0 siblings, 0 replies; 78+ messages in thread From: João Távora @ 2022-11-10 22:10 UTC (permalink / raw) To: Stefan Monnier; +Cc: Arash Esbati, Eli Zaretskii, Tim Cross, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> Why? This is in a user's init file. I can more or less see that >> argument for inter-library dependencies. But here, w-e-a-load is >> exactly what's needed. I use it all the time in my config. > > I have 4 uses of it in my ~75kB init file. Heh, I have it in almost every one of my ~75-750 small elisp files, each one more or less dedicated to configuring a package that I may or may not use for 7500 years. > That doesn't mean we have to find a way to avoid its use, just that it > would be nice to find such a way. I think with-eval-after-load sits nicely at the intersection of lazy autoloads and user Elisp snippets. Is there another tool that does this? use-package, maybe? But won't that use the same thing underneath? Anyway I tend to prefer things that do one thing well and don't make me learn new DSLs. with-eval-after-load hasn't let me down. > "Choose an LSP server" seems to me like a very poor way to customize the > behavior of the server. > > IOW the design of the LSP protocol is not "Emacs-y" enough :-) Ah. Yes. You're probably right about that, how could you not be ;-) ? I also think it's more about these servers using different backend strategies themselves. Last I looked at the C++ server landscape, all of them provided more or less the same, but consuming different amount resources. There's also lots of forking going on. I think this is good. >>> Maybe to reduce the problem we should allow multiple entries per >>> major mode and use the first that works, without needing to go through >>> `eglot-alternatives`? >> >> Again, why? Why add more semantics to an already complicated variable >> when the functional eglot-alternatives plugin works fine? Furthermore, >> I'd like to this particular configuration for a future >> multiple-simultaneous-server-in-one-mode idea. > > I'm just suggesting directions. I don't claim they're the right answer. > My impression is that this variable is currently both "too complex" and > "not flexible enough". Don't get me wrong, it's good enough for now. > > But no, I don't have a good replacement to suggest. My gut just tells > me that there is a better arrangement. It's not a very pretty variable, I admit, but it's good enough for now and could be a lot worse :-) I once thought it would be a good idea to have a buffer-local variable eglot-server-program (singular) that major-modes could set as a stronger suggestion of what to use. So a future smc++-mode could be based entirely on tree-sitter for syntax-highlighting and some good C++ server for everything else, including some LSP-backed smc++-frob-kittens command that isn't in eglot.el. The "good C++ server" would be set in eglot-server-program, called from smc++-mode. Maybe that "good server" would even be bundled with the smc++-mode package so that M-x smc++-mode would probably start Eglot by default. Can you ask your gut if this is an acceptable arrangement? João ^ permalink raw reply [flat|nested] 78+ messages in thread
end of thread, other threads:[~2022-11-16 17:05 UTC | newest] Thread overview: 78+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-11-09 20:25 Making `eglot-server-programs' a custom variable? Arash Esbati 2022-11-09 20:49 ` Philip Kaludercic 2022-11-09 22:07 ` Arash Esbati 2022-11-10 17:47 ` Philip Kaludercic 2022-11-10 17:56 ` Stefan Monnier 2022-11-10 18:10 ` Philip Kaludercic 2022-11-10 18:29 ` Stefan Monnier 2022-11-10 19:36 ` Philip Kaludercic 2022-11-12 3:47 ` Jim Porter 2022-11-12 5:16 ` chad 2022-11-12 7:26 ` Philip Kaludercic 2022-11-12 7:34 ` Philip Kaludercic 2022-11-12 7:58 ` Eli Zaretskii 2022-11-12 8:03 ` Philip Kaludercic 2022-11-12 8:25 ` Eli Zaretskii 2022-11-12 8:45 ` Philip Kaludercic 2022-11-12 9:01 ` Eli Zaretskii 2022-11-12 9:40 ` Philip Kaludercic 2022-11-12 10:02 ` Eli Zaretskii 2022-11-12 13:46 ` Philip Kaludercic 2022-11-12 14:30 ` Eli Zaretskii 2022-11-13 0:20 ` Philip Kaludercic 2022-11-13 6:39 ` Eli Zaretskii 2022-11-13 7:11 ` Philip Kaludercic 2022-11-13 7:43 ` Eli Zaretskii 2022-11-15 17:50 ` Philip Kaludercic 2022-11-15 18:15 ` Eli Zaretskii 2022-11-16 13:05 ` Philip Kaludercic 2022-11-16 13:44 ` Eli Zaretskii 2022-11-16 14:12 ` Philip Kaludercic 2022-11-16 14:51 ` Eli Zaretskii 2022-11-16 17:05 ` Philip Kaludercic 2022-11-10 6:36 ` Eli Zaretskii 2022-11-10 7:56 ` Tim Cross 2022-11-10 8:24 ` Eli Zaretskii 2022-11-10 9:34 ` Tim Cross 2022-11-10 11:16 ` Eli Zaretskii 2022-11-10 13:59 ` Tim Cross 2022-11-10 9:18 ` Arash Esbati 2022-11-10 9:34 ` Eli Zaretskii 2022-11-10 10:25 ` João Távora 2022-11-10 17:04 ` Eli Zaretskii 2022-11-10 17:10 ` Eli Zaretskii 2022-11-10 21:45 ` João Távora 2022-11-11 6:12 ` Yuri Khan 2022-11-11 9:09 ` João Távora 2022-11-12 2:34 ` Brian Cully via Emacs development discussions. 2022-11-12 16:22 ` Michael Albinus 2022-11-11 7:04 ` Eli Zaretskii 2022-11-11 9:12 ` João Távora 2022-11-11 11:53 ` Eli Zaretskii 2022-11-12 14:44 ` Arash Esbati 2022-11-12 14:49 ` Eli Zaretskii 2022-11-12 14:58 ` Arash Esbati 2022-11-10 21:28 ` Augusto Stoffel 2022-11-11 10:05 ` Arash Esbati 2022-11-11 12:05 ` Eli Zaretskii 2022-11-11 12:22 ` Arash Esbati 2022-11-11 12:33 ` Eli Zaretskii 2022-11-11 13:26 ` Augusto Stoffel 2022-11-11 13:48 ` Arash Esbati 2022-11-11 13:54 ` Eli Zaretskii 2022-11-10 10:15 ` João Távora 2022-11-10 11:23 ` Eli Zaretskii 2022-11-10 12:07 ` João Távora 2022-11-10 15:19 ` Eli Zaretskii 2022-11-10 15:35 ` Dmitry Gutov 2022-11-10 16:50 ` Eli Zaretskii 2022-11-10 18:22 ` Dmitry Gutov 2022-11-10 18:31 ` Eli Zaretskii 2022-11-10 15:38 ` João Távora 2022-11-10 16:52 ` Eli Zaretskii 2022-11-10 17:08 ` Eli Zaretskii 2022-11-10 21:13 ` João Távora 2022-11-10 13:57 ` Stefan Monnier 2022-11-10 15:21 ` João Távora 2022-11-10 17:43 ` Stefan Monnier 2022-11-10 22:10 ` João Távora
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).