Eglot: Demote errors to warnings in eglot-ensure

Github-reference: https://github.com/joaotavora/eglot/discussions/1318

* doc/misc/eglot.texi (Quick Start): Reword.
(Starting Eglot): Reword.

* lisp/progmodes/eglot.el (eglot-ensure): Demote errors to warnings.
This commit is contained in:
João Távora 2023-11-07 09:09:30 -06:00
parent 361f9fe415
commit 3ab99e977d
2 changed files with 33 additions and 11 deletions

View file

@ -139,16 +139,19 @@ To start using Eglot for a project, type @kbd{M-x eglot @key{RET}} in
a buffer visiting any file that belongs to the project. This starts
the language server configured for the programming language of that
buffer, and causes Eglot to start managing all the files of the
project which use the same programming language. The notion of a
``project'' used by Eglot is the same Emacs uses (@pxref{Projects,,,
emacs, GNU Emacs Manual}): in the simplest case, the ``project'' is
the single file you are editing, but it can also be all the files in a
single directory or a directory tree under some version control
system, such as Git.
project which use the same programming language. This includes files
of a given project that are already visited at the time the
@code{eglot} command is invoked as well as files visited after this
invocation.
Alternatively, you can start Eglot automatically from the major-mode
hook of the mode used for the programming language; see @ref{Starting
Eglot}.
The notion of a ``project'' used by Eglot is the same Emacs uses
(@pxref{Projects,,, emacs, GNU Emacs Manual}): in the simplest case,
the ``project'' is the single file you are editing, but it can also be
all the files in a single directory or a directory tree under some
version control system, such as Git.
There are alternate ways of starting Eglot; see @ref{Starting Eglot}
for details.
@item
Use Eglot.
@ -344,6 +347,12 @@ starting an Eglot session is non-interactive, so it should be used
only when you are confident that Eglot can be started reliably for any
file which may be visited with the major-mode in question.
Note that it's often difficult to establish this confidence fully, so
it may be wise to use the interactive command @code{eglot} instead.
You only need to invoke it once per project, as all other files
visited within the same project will automatically be managed with no
further user intervention needed.
When Eglot connects to a language server for the first time in an
Emacs session, it runs the hook @code{eglot-connect-hook}
(@pxref{Eglot Variables}).

View file

@ -1366,7 +1366,18 @@ INTERACTIVE is t if called interactively."
;;;###autoload
(defun eglot-ensure ()
"Start Eglot session for current buffer if there isn't one."
"Start Eglot session for current buffer if there isn't one.
Only use this function (in major mode hooks, etc) if you are
confident that Eglot can be started safely and efficiently for
*every* buffer visited where these hooks may execute.
Since it is difficult to establish this confidence fully, it's
often wise to use the interactive command `eglot' instead. This
command only needs to be invoked once per project, as all other
files of a given major mode visited within the same project will
automatically become managed with no further user intervention
needed."
(let ((buffer (current-buffer)))
(cl-labels
((maybe-connect
@ -1374,7 +1385,9 @@ INTERACTIVE is t if called interactively."
(eglot--when-live-buffer buffer
(remove-hook 'post-command-hook #'maybe-connect t)
(unless eglot--managed-mode
(apply #'eglot--connect (eglot--guess-contact))))))
(condition-case-unless-debug oops
(apply #'eglot--connect (eglot--guess-contact))
(error (eglot--warn (error-message-string oops))))))))
(when buffer-file-name
(add-hook 'post-command-hook #'maybe-connect 'append t)))))