bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#62795: 29.0.90; eglot: gdscript default port is 6005


From: João Távora
Subject: bug#62795: 29.0.90; eglot: gdscript default port is 6005
Date: Sun, 16 Apr 2023 12:08:50 +0100
User-agent: Gnus/5.13 (Gnus v5.13)

Ruijie Yu <ruijie@netyu.xyz> writes:

> TLDR: I think the Melpa package "gdscript-mode" needs to define a
> function `gdscript-mode-find-lsp', and eglot needs decide how to use
> this function to get the port number.  Elaborations below.
>
> xiliuya via "Bug reports for GNU Emacs, the Swiss army knife of text editors" 
> <bug-gnu-emacs@gnu.org> writes:
>
>> João Távora <joaotavora@gmail.com> writes:
>>
>>> I see.  So it's not an inferior process to Emacs. Then
>>> maybe a function can be crafted in Elisp -- and housed
>>> in gdscript-mode -- that somehow discovers if the Godot
>>> Engine is running and finds the correct port.  Then
>>> gdscript-mode can add that function to eglot-server-programs.
>>
>> I wrote this function to add gdscript-mode:
>> -----
>> (defun eglot-add-gdscript-lsp ()
>>   (let* ((lsp-port (string-to-number
>>                     (shell-command-to-string
>>                      "awk -F'=' '/network\\/language_server\\/remote_port/ 
>> {print $2;}' $HOME/.config/godot/editor_settings-4.tres")))
>>          (lsp-list (cons 'gdscript-mode  (list "localhost" lsp-port
>>                                                ))))
>>     (push  lsp-list
>>            eglot-server-programs)))
>> -----

We're getting closer, but this is not what I meant at all.  It's much
simpler.

  (defun gdscript-eglot-contact (&optional _interactive)
    "Produce a suitable value for LSP contact in `eglot-server-programs'."
    (list "localhost"
          (string-to-number
           (shell-command-to-string
            "awk -F'=' '/network\\/language_server\\/remote_port/ {print $2;}' 
$HOME/.config/godot/editor_settings-4.tres"))))

In your configuration, or in gdscript-mode.el directly

  (add-to-list 'eglot-server-programs
               '(gdscript-mode . gdscript-eglot-contact))

Do you follow the idea?  You can add a function object to
eglot-server-programs _instead_ of the host/port list.  The docstring of
eglot-server-programs should be clear on the matter.

     [...]

     CONTACT can be:
    
     [...]
    
     * A list (HOST PORT [TCP-ARGS...]) where HOST is a string and
       PORT is a positive integer for connecting to a server via TCP.
    
     [...]
    
     * A function of a single argument producing any of the above
       values for CONTACT.  The argument's value is non-nil if the
       connection was requested interactively (e.g. from the `eglot'
       command), and nil if it wasn't (e.g. from `eglot-ensure').  If
       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.   [...]


If it's not clear, let us know.

Another detail: I think the use of `awk` can probably be be optimized
away Elisp code for processing text.  Same for the shell use of $HOME
which is also has an Elisp abstraction (see docstring of
`expand-file-name`).  In theory, you don't need shell-command-to-string
at all.

If the function is made simple enough and portable across operating
systems where the Godot engine runs, then a lambda version of it can be
added to eglot.el IMO.  But it's really better to add it to
gdscript-mode.el, wherever it is maintained.

João







reply via email to

[Prev in Thread] Current Thread [Next in Thread]