fix(tramp): direct-async + lsp-mode/eglot interop

Neither lsp-mode nor eglot work over tramp with direct-async on, but I
don't want to disable direct-async globally just for lsp-mode/eglot
users, so I try to disable it solely for their stdio processes.

More testing is needed to weed out edge cases that may result from this.

Ref: emacs-lsp/lsp-mode#4573
Fix: #8510
This commit is contained in:
Henrik Lissner
2025-09-17 13:32:20 -04:00
parent b2c9faf345
commit 0fb377c057

View File

@@ -32,6 +32,26 @@
'remote-direct-async-process)) 'remote-direct-async-process))
;;;###package lsp-mode
;; HACK: lsp-mode over TRAMP doesn't work with direct async, so force it off for
;; LSP stdio connections.
(defadvice! +tramp--disable-direct-async-for-lsp-stdio-a (plist)
:filter-return #'lsp-stdio-connection
(let ((connect-fn (plist-get plist :connect)))
(plist-put plist :connect
(lambda (&rest args)
(letf! ((#'tramp-direct-async-process-p #'ignore))
(apply connect-fn args))))))
;;;###package eglot
;; HACK: Same deal with eglot.
(defadvice! +tramp--disable-direct-async-for-eglot-a (fn &rest args)
:around #'eglot--connect
(letf! ((#'tramp-direct-async-process-p #'ignore))
(apply fn args)))
;; See magit/magit#5220 ;; See magit/magit#5220
(after! magit (after! magit
(setq magit-tramp-pipe-stty-settings 'pty)) (setq magit-tramp-pipe-stty-settings 'pty))