Must be a function of one arg, a name, returning a process
object.")
+(eglot--define-process-var eglot--buffer-open-count (make-hash-table)
+ "Keeps track of didOpen/didClose notifs for each buffer.")
+
(defun eglot-make-local-process (name command)
"Make a local LSP process from COMMAND.
NAME is a name to give the inferior process or connection.
(setq eglot--recent-before-changes nil
eglot--recent-after-changes nil))
-(defvar-local eglot--buffer-open-count 0)
(defun eglot--signal-textDocument/didOpen ()
"Send textDocument/didOpen to server."
- (cl-incf eglot--buffer-open-count)
- (when (> eglot--buffer-open-count 1)
- (error "Too many textDocument/didOpen notifs for %s" (current-buffer)))
- (eglot--notify (eglot--current-process-or-lose)
- :textDocument/didOpen
- (eglot--obj :textDocument
- (eglot--current-buffer-TextDocumentItem))))
+ (let* ((proc (eglot--current-process-or-lose))
+ (count (1+ (or (gethash (current-buffer)
+ (eglot--buffer-open-count proc))
+ 0))))
+ (when (> count 1)
+ (eglot--error "Too many textDocument/didOpen notifs for %s" (current-buffer)))
+ (setf (gethash (current-buffer) (eglot--buffer-open-count proc))
+ count)
+ (eglot--notify proc
+ :textDocument/didOpen
+ (eglot--obj :textDocument
+ (eglot--current-buffer-TextDocumentItem)))))
(defun eglot--signal-textDocument/didClose ()
"Send textDocument/didClose to server."
- (cl-decf eglot--buffer-open-count)
- (when (< eglot--buffer-open-count 0)
- (error "Too many textDocument/didClose notifs for %s" (current-buffer)))
- (eglot--notify (eglot--current-process-or-lose)
- :textDocument/didClose
- (eglot--obj :textDocument
- (eglot--current-buffer-TextDocumentItem))))
+ (let* ((proc (eglot--current-process-or-lose))
+ (count (1- (or (gethash (current-buffer)
+ (eglot--buffer-open-count proc))
+ 0))))
+ (when (< count 0)
+ (eglot--error "Too many textDocument/didClose notifs for %s" (current-buffer)))
+ (setf (gethash (current-buffer) (eglot--buffer-open-count proc))
+ count)
+ (eglot--notify proc
+ :textDocument/didClose
+ (eglot--obj :textDocument
+ (eglot--current-buffer-TextDocumentItem)))))
(defun eglot--signal-textDocument/willSave ()
"Send textDocument/willSave to server."