diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 502effd098d..728227f0e9a 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -1322,22 +1322,28 @@ in `eglot-server-programs' (which see). CONTACT-PROXY is the value of the corresponding `eglot-server-programs' entry." (cl-loop + with lang-from-sym = (lambda (sym &optional language-id) + (cons sym + (or language-id + (or (get sym 'eglot-language-id) + (replace-regexp-in-string + "\\(?:-ts\\)?-mode$" "" + (symbol-name sym)))))) for (modes . contact) in eglot-server-programs for llists = (mapcar #'eglot--ensure-list - (if (or (symbolp modes) (keywordp (cadr modes))) - (list modes) modes)) + (if (or (symbolp modes) (keywordp (cadr modes))) + (list modes) modes)) for normalized = (mapcar (jsonrpc-lambda (sym &key language-id &allow-other-keys) - (cons sym - (or language-id - (or (get sym 'eglot-language-id) - (replace-regexp-in-string - "\\(?:-ts\\)?-mode$" "" - (symbol-name sym)))))) + (funcall lang-from-sym sym language-id)) llists) when (cl-some (lambda (cell) (provided-mode-derived-p mode (car cell))) normalized) - return (cons normalized contact))) + return (cons normalized contact) + ;; If lookup fails at least return some suitable LANGUAGES. + finally (cl-return + (cons (list (funcall lang-from-sym major-mode)) + nil)))) (defun eglot--guess-contact (&optional interactive) "Helper for `eglot'.