Function: eglot--guess-contact
eglot--guess-contact is a byte-compiled function defined in
eglot.el.gz.
Signature
(eglot--guess-contact &optional INTERACTIVE)
Documentation
Helper for eglot.
Return (MANAGED-MODES PROJECT CLASS CONTACT LANG-IDS). If INTERACTIVE is non-nil, maybe prompt user, else error as soon as something can't be guessed.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/eglot.el.gz
(defun eglot--guess-contact (&optional interactive)
"Helper for `eglot'.
Return (MANAGED-MODES PROJECT CLASS CONTACT LANG-IDS). If INTERACTIVE is
non-nil, maybe prompt user, else error as soon as something can't
be guessed."
(let* ((project (eglot--current-project))
(guessed-mode (if buffer-file-name major-mode))
(guessed-mode-name (and guessed-mode (symbol-name guessed-mode)))
(main-mode
(cond
((and interactive
(or (>= (prefix-numeric-value current-prefix-arg) 16)
(not guessed-mode)))
(intern
(completing-read
"[eglot] Start a server to manage buffers of what major mode? "
(mapcar #'symbol-name (eglot--all-major-modes)) nil t
guessed-mode-name nil guessed-mode-name nil)))
((not guessed-mode)
(eglot--error "Can't guess mode to manage for `%s'" (current-buffer)))
(t guessed-mode)))
(languages-and-contact (eglot--lookup-mode main-mode))
(managed-modes (mapcar #'car (car languages-and-contact)))
(language-ids (mapcar #'cdr (car languages-and-contact)))
(guess (cdr languages-and-contact))
(guess (if (functionp guess)
(pcase (cdr (func-arity guess))
(1 (funcall guess interactive))
(_ (funcall guess interactive project)))
guess))
(class (or (and (consp guess) (symbolp (car guess))
(prog1 (unless current-prefix-arg (car guess))
(setq guess (cdr guess))))
'eglot-lsp-server))
(program (and (listp guess)
(stringp (car guess))
;; A second element might be the port of a (host, port)
;; pair, but in that case it is not a string.
(or (null (cdr guess)) (stringp (cadr guess)))
(car guess)))
(base-prompt
(and interactive
"Enter program to execute (or <host>:<port>): "))
(full-program-invocation
(and program
(cl-every #'stringp guess)
(combine-and-quote-strings guess)))
(prompt
(and base-prompt
(cond (current-prefix-arg base-prompt)
((null guess)
(eglot--format
"[eglot] Couldn't guess LSP server for `%s'\n%s"
main-mode base-prompt))
((and program
(not (file-name-absolute-p program))
(not (eglot--executable-find program t)))
(if full-program-invocation
(concat (eglot--format
"[eglot] I guess you want to run `%s'"
full-program-invocation)
(eglot--format
", but I can't find `%s' in PATH!"
program)
"\n" base-prompt)
(eglot--error
(concat "`%s' not found in PATH, but can't form"
" an interactive prompt for help you fix"
" this.")
program guess))))))
(input (and prompt (read-shell-command prompt
full-program-invocation
'eglot-command-history)))
(contact
(if input
(if (string-match
"^[\s\t]*\\(.*\\):\\([[:digit:]]+\\)[\s\t]*$" input)
;; <host>:<port> special case (bug#67682)
(list (match-string 1 input)
(string-to-number (match-string 2 input)))
(split-string-and-unquote input))
guess)))
(list managed-modes project class contact language-ids)))