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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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�\202�CB\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\207�B\262\301\211\262\202\210�\312\203\226�A\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.")