Variable: eglot-server-programs
eglot-server-programs is a variable defined in eglot.el.gz.
Value
Large value
(((rust-ts-mode rust-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[("rust-analyzer" "rls")
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
((cmake-mode cmake-ts-mode)
"cmake-language-server")
(vimrc-mode "vim-language-server" "--stdio")
((python-mode python-ts-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[("pylsp" "pyls"
("pyright-langserver" "--stdio")
"jedi-language-server" "ruff-lsp")
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
((js-json-mode json-mode json-ts-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[(("vscode-json-language-server" "--stdio")
("vscode-json-languageserver" "--stdio")
("json-languageserver" "--stdio"))
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(((js-mode :language-id "javascript")
(js-ts-mode :language-id "javascript")
(tsx-ts-mode :language-id "typescriptreact")
(typescript-ts-mode :language-id "typescript")
(typescript-mode :language-id "typescript"))
"typescript-language-server" "--stdio")
((bash-ts-mode sh-mode)
"bash-language-server" "start")
((php-mode phps-mode php-ts-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[(("phpactor" "language-server")
("php" "vendor/felixfbecker/language-server/bin/php-language-server.php"))
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
((c-mode c-ts-mode c++-mode c++-ts-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[("clangd" "ccls")
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(((caml-mode :language-id "ocaml")
(tuareg-mode :language-id "ocaml")
reason-mode)
"ocamllsp")
((ruby-mode ruby-ts-mode)
"solargraph" "socket" "--port" :autoport)
(haskell-mode "haskell-language-server-wrapper" "--lsp")
(elm-mode "elm-language-server")
(mint-mode "mint" "ls")
((kotlin-mode kotlin-ts-mode)
"kotlin-language-server")
((go-mode go-dot-mod-mode go-dot-work-mode go-ts-mode go-mod-ts-mode)
"gopls")
((R-mode ess-r-mode)
"R" "--slave" "-e" "languageserver::run()")
((java-mode java-ts-mode)
"jdtls")
((dart-mode dart-ts-mode)
"dart" "language-server" "--client-id" "emacs.eglot-dart")
(elixir-mode "language_server.sh")
(ada-mode "ada_language_server")
(scala-mode .
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[("metals" "metals-emacs")
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(racket-mode "racket" "-l" "racket-langserver")
((tex-mode context-mode texinfo-mode bibtex-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[("digestif" "texlab")
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(erlang-mode "erlang_ls" "--transport" "stdio")
((yaml-ts-mode yaml-mode)
"yaml-language-server" "--stdio")
(nix-mode .
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[("nil" "rnix-lsp" "nixd")
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
((nushell-mode nushell-ts-mode)
"nu" "--lsp")
(gdscript-mode "localhost" 6008)
((fortran-mode f90-mode)
"fortls")
(futhark-mode "futhark" "lsp")
(lua-mode .
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[("lua-language-server" "lua-lsp")
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(zig-mode "zls")
((css-mode css-ts-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[(("vscode-css-language-server" "--stdio")
("css-languageserver" "--stdio"))
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(html-mode .
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[(("vscode-html-language-server" "--stdio")
("html-languageserver" "--stdio"))
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
((dockerfile-mode dockerfile-ts-mode)
"docker-langserver" "--stdio")
((clojure-mode clojurescript-mode clojurec-mode)
"clojure-lsp")
((csharp-mode csharp-ts-mode)
.
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[(("omnisharp" "-lsp")
("csharp-ls"))
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(purescript-mode "purescript-language-server" "--stdio")
((perl-mode cperl-mode)
"perl" "-MPerl::LanguageServer" "-e" "Perl::LanguageServer::run")
(markdown-mode .
#[256 "\300\301\211:\203\"@\262<\203\202CB\262A\262\202\211\237\266\203\302\203V\303\304\"\305\301\"\211A\203N\306\307\310\303\311\"\301\312\301\211@@&\313#A\207\211@A\206U\301\207\301\211\211\312\301\211:\203\226@\262\211A\262\242\262\314\312\"\262\203\207B\262\301\211\262\202\210\312\203\226A\262\301\262\202]\203\243 !\266\301\207\207"
[(("marksman" "server")
("vscode-markdown-language-server" "--stdio"))
nil
#[257 "\300\301\302\303\304#\"\207"
[error "None of '%s' are valid executables" mapconcat car ", "]
7 "\n\n(fn LISTIFIED)"]
mapcar
#[257 "\300@\301\"\211\205@ABB\207"
[eglot--executable-find t]
5 "\n\n(fn A)"]
remove assoc completing-read "[eglot] More than one server executable available: " car t equal eglot--executable-find]
14 "\n\n(fn &optional INTERACTIVE)"])
(graphviz-dot-mode "dot-language-server" "--stdio")
(terraform-mode "terraform-ls" "serve")
((uiua-ts-mode uiua-mode)
"uiua" "lsp"))
Documentation
How the command eglot guesses the server to start.
An association list of (MAJOR-MODE . CONTACT) pairs. MAJOR-MODE identifies the buffers that are to be managed by a specific language server. The associated CONTACT specifies how to connect to a server for those buffers.
MAJOR-MODE can be:
* In the most common case, a symbol such as c-mode;
* A list (MAJOR-MODE-SYMBOL :LANGUAGE-ID ID) where
MAJOR-MODE-SYMBOL is the aforementioned symbol and ID is a
string identifying the language to the server;
* A list combining the previous two alternatives, meaning
multiple major modes will be associated with a single server
program. This association is such that the same resulting
server process will manage buffers of different major modes.
CONTACT can be:
* In the most common case, a list of strings (PROGRAM [ARGS...]).
PROGRAM is called with ARGS and is expected to serve LSP requests
over the standard input/output channels.
* A list (PROGRAM [ARGS...] :initializationOptions OPTIONS),
whereupon PROGRAM is called with ARGS as in the first option,
and the LSP "initializationOptions" JSON object is
constructed from OPTIONS. If OPTIONS is a unary function, it
is called with the server instance and should return a JSON
object.
* A list (HOST PORT [TCP-ARGS...]) where HOST is a string and
PORT is a positive integer for connecting to a server via TCP.
Remaining ARGS are passed to open-network-stream for
upgrading the connection with encryption or other capabilities.
* A list (PROGRAM [ARGS...] :autoport [MOREARGS...]), whereupon a
combination of previous options is used. First, an attempt is
made to find an available server port, then PROGRAM is launched
with ARGS; the :autoport keyword substituted for that number;
and MOREARGS. Eglot then attempts to establish a TCP
connection to that port number on the localhost.
* A cons (CLASS-NAME . INITARGS) where CLASS-NAME is a symbol
designating a subclass of eglot-lsp-server(var)/eglot-lsp-server(fun), for representing
experimental LSP servers. INITARGS is a keyword-value plist
used to initialize the object of CLASS-NAME, or a plain list
interpreted as the previous descriptions of CONTACT. In the
latter case that plain list is used to produce a plist with a
suitable :PROCESS initarg to CLASS-NAME. The class
eglot-lsp-server(var)/eglot-lsp-server(fun) descends from jsonrpc-process-connection(var)/jsonrpc-process-connection(fun),
which you should see for the semantics of the mandatory
:PROCESS argument.
* 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. The helper
function eglot-alternatives (which see) can be used to
produce a function that offers more than one server for a given
MAJOR-MODE.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/eglot.el.gz
(defvar eglot-server-programs `(((rust-ts-mode rust-mode) . ,(eglot-alternatives '("rust-analyzer" "rls")))
((cmake-mode cmake-ts-mode) . ("cmake-language-server"))
(vimrc-mode . ("vim-language-server" "--stdio"))
((python-mode python-ts-mode)
. ,(eglot-alternatives
'("pylsp" "pyls" ("pyright-langserver" "--stdio") "jedi-language-server" "ruff-lsp")))
((js-json-mode json-mode json-ts-mode)
. ,(eglot-alternatives '(("vscode-json-language-server" "--stdio")
("vscode-json-languageserver" "--stdio")
("json-languageserver" "--stdio"))))
(((js-mode :language-id "javascript")
(js-ts-mode :language-id "javascript")
(tsx-ts-mode :language-id "typescriptreact")
(typescript-ts-mode :language-id "typescript")
(typescript-mode :language-id "typescript"))
. ("typescript-language-server" "--stdio"))
((bash-ts-mode sh-mode) . ("bash-language-server" "start"))
((php-mode phps-mode php-ts-mode)
. ,(eglot-alternatives
'(("phpactor" "language-server")
("php" "vendor/felixfbecker/language-server/bin/php-language-server.php"))))
((c-mode c-ts-mode c++-mode c++-ts-mode)
. ,(eglot-alternatives
'("clangd" "ccls")))
(((caml-mode :language-id "ocaml")
(tuareg-mode :language-id "ocaml") reason-mode)
. ("ocamllsp"))
((ruby-mode ruby-ts-mode)
. ("solargraph" "socket" "--port" :autoport))
(haskell-mode
. ("haskell-language-server-wrapper" "--lsp"))
(elm-mode . ("elm-language-server"))
(mint-mode . ("mint" "ls"))
((kotlin-mode kotlin-ts-mode) . ("kotlin-language-server"))
((go-mode go-dot-mod-mode go-dot-work-mode go-ts-mode go-mod-ts-mode)
. ("gopls"))
((R-mode ess-r-mode) . ("R" "--slave" "-e"
"languageserver::run()"))
((java-mode java-ts-mode) . ("jdtls"))
((dart-mode dart-ts-mode)
. ("dart" "language-server"
"--client-id" "emacs.eglot-dart"))
(elixir-mode . ("language_server.sh"))
(ada-mode . ("ada_language_server"))
(scala-mode . ,(eglot-alternatives
'("metals" "metals-emacs")))
(racket-mode . ("racket" "-l" "racket-langserver"))
((tex-mode context-mode texinfo-mode bibtex-mode)
. ,(eglot-alternatives '("digestif" "texlab")))
(erlang-mode . ("erlang_ls" "--transport" "stdio"))
((yaml-ts-mode yaml-mode) . ("yaml-language-server" "--stdio"))
(nix-mode . ,(eglot-alternatives '("nil" "rnix-lsp" "nixd")))
((nushell-mode nushell-ts-mode) . ("nu" "--lsp"))
(gdscript-mode . ("localhost" 6008))
((fortran-mode f90-mode) . ("fortls"))
(futhark-mode . ("futhark" "lsp"))
(lua-mode . ,(eglot-alternatives
'("lua-language-server" "lua-lsp")))
(zig-mode . ("zls"))
((css-mode css-ts-mode)
. ,(eglot-alternatives '(("vscode-css-language-server" "--stdio")
("css-languageserver" "--stdio"))))
(html-mode . ,(eglot-alternatives '(("vscode-html-language-server" "--stdio") ("html-languageserver" "--stdio"))))
((dockerfile-mode dockerfile-ts-mode) . ("docker-langserver" "--stdio"))
((clojure-mode clojurescript-mode clojurec-mode)
. ("clojure-lsp"))
((csharp-mode csharp-ts-mode)
. ,(eglot-alternatives
'(("omnisharp" "-lsp")
("csharp-ls"))))
(purescript-mode . ("purescript-language-server" "--stdio"))
((perl-mode cperl-mode) . ("perl" "-MPerl::LanguageServer" "-e" "Perl::LanguageServer::run"))
(markdown-mode
. ,(eglot-alternatives
'(("marksman" "server")
("vscode-markdown-language-server" "--stdio"))))
(graphviz-dot-mode . ("dot-language-server" "--stdio"))
(terraform-mode . ("terraform-ls" "serve"))
((uiua-ts-mode uiua-mode) . ("uiua" "lsp")))
"How the command `eglot' guesses the server to start.
An association list of (MAJOR-MODE . CONTACT) pairs. MAJOR-MODE
identifies the buffers that are to be managed by a specific
language server. The associated CONTACT specifies how to connect
to a server for those buffers.
MAJOR-MODE can be:
* In the most common case, a symbol such as `c-mode';
* A list (MAJOR-MODE-SYMBOL :LANGUAGE-ID ID) where
MAJOR-MODE-SYMBOL is the aforementioned symbol and ID is a
string identifying the language to the server;
* A list combining the previous two alternatives, meaning
multiple major modes will be associated with a single server
program. This association is such that the same resulting
server process will manage buffers of different major modes.
CONTACT can be:
* In the most common case, a list of strings (PROGRAM [ARGS...]).
PROGRAM is called with ARGS and is expected to serve LSP requests
over the standard input/output channels.
* A list (PROGRAM [ARGS...] :initializationOptions OPTIONS),
whereupon PROGRAM is called with ARGS as in the first option,
and the LSP \"initializationOptions\" JSON object is
constructed from OPTIONS. If OPTIONS is a unary function, it
is called with the server instance and should return a JSON
object.
* A list (HOST PORT [TCP-ARGS...]) where HOST is a string and
PORT is a positive integer for connecting to a server via TCP.
Remaining ARGS are passed to `open-network-stream' for
upgrading the connection with encryption or other capabilities.
* A list (PROGRAM [ARGS...] :autoport [MOREARGS...]), whereupon a
combination of previous options is used. First, an attempt is
made to find an available server port, then PROGRAM is launched
with ARGS; the `:autoport' keyword substituted for that number;
and MOREARGS. Eglot then attempts to establish a TCP
connection to that port number on the localhost.
* A cons (CLASS-NAME . INITARGS) where CLASS-NAME is a symbol
designating a subclass of `eglot-lsp-server', for representing
experimental LSP servers. INITARGS is a keyword-value plist
used to initialize the object of CLASS-NAME, or a plain list
interpreted as the previous descriptions of CONTACT. In the
latter case that plain list is used to produce a plist with a
suitable :PROCESS initarg to CLASS-NAME. The class
`eglot-lsp-server' descends from `jsonrpc-process-connection',
which you should see for the semantics of the mandatory
:PROCESS argument.
* 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. The helper
function `eglot-alternatives' (which see) can be used to
produce a function that offers more than one server for a given
MAJOR-MODE.")