summaryrefslogtreecommitdiff
path: root/lisp/jsonrpc.el
diff options
context:
space:
mode:
authorJoão Távora <joaotavora@gmail.com>2020-06-03 20:53:35 +0100
committerJoão Távora <joaotavora@gmail.com>2020-06-03 20:54:39 +0100
commitbd20af2d41f24c9e59acb867a1a4485284cb2a65 (patch)
tree263aaf231a7e0c859f32ab4b66967e909d162656 /lisp/jsonrpc.el
parent7e8c1a671872ef8e45057f25912594cf548639ab (diff)
downloademacs-bd20af2d41f24c9e59acb867a1a4485284cb2a65.tar.gz
Ensure Jsonrpc processes are created in correct buffer
Report and original implementation by Steve Purcell <steve@sanityinc.com>. See also See https://github.com/joaotavora/eglot/pull/493 for details * lisp/jsonrpc.el (initialize-instance): Make process in original buffer. (Version): Bump to 1.0.12
Diffstat (limited to 'lisp/jsonrpc.el')
-rw-r--r--lisp/jsonrpc.el74
1 files changed, 39 insertions, 35 deletions
diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el
index 42e7701af18..ff8f250a22e 100644
--- a/lisp/jsonrpc.el
+++ b/lisp/jsonrpc.el
@@ -4,7 +4,7 @@
;; Author: João Távora <joaotavora@gmail.com>
;; Keywords: processes, languages, extensions
-;; Version: 1.0.11
+;; Version: 1.0.12
;; Package-Requires: ((emacs "25.2"))
;; This is a GNU ELPA :core package. Avoid functionality that is not
@@ -364,40 +364,44 @@ connection object, called when the process dies .")
(cl-defmethod initialize-instance ((conn jsonrpc-process-connection) slots)
(cl-call-next-method)
(cl-destructuring-bind (&key ((:process proc)) name &allow-other-keys) slots
- ;; FIXME: notice the undocumented bad coupling in the buffer name.
- ;; The client making the process _must_ use a buffer named exactly
- ;; like this property when calling `make-process'. If there were
- ;; a `set-process-stderr' like there is `set-process-buffer' we
- ;; wouldn't need this and could use a pipe with a process filter
- ;; instead of `after-change-functions'. Alternatively, we need a
- ;; new initarg (but maybe not a slot).
- (with-current-buffer (get-buffer-create (format "*%s stderr*" name))
- (let ((inhibit-read-only t)
- (hidden-name (concat " " (buffer-name))))
- (erase-buffer)
- (buffer-disable-undo)
- (add-hook
- 'after-change-functions
- (lambda (beg _end _pre-change-len)
- (cl-loop initially (goto-char beg)
- do (forward-line)
- when (bolp)
- for line = (buffer-substring
- (line-beginning-position 0)
- (line-end-position 0))
- do (with-current-buffer (jsonrpc-events-buffer conn)
- (goto-char (point-max))
- (let ((inhibit-read-only t))
- (insert (format "[stderr] %s\n" line))))
- until (eobp)))
- nil t)
- ;; If we are correctly coupled to the client, it should pick up
- ;; the current buffer immediately.
- (setq proc (if (functionp proc) (funcall proc) proc))
- (ignore-errors (kill-buffer hidden-name))
- (rename-buffer hidden-name)
- (process-put proc 'jsonrpc-stderr (current-buffer))
- (read-only-mode t)))
+ ;; FIXME: notice the undocumented bad coupling in the stderr
+ ;; buffer name, it must be named exactly like this we expect when
+ ;; calling `make-process'. If there were a `set-process-stderr'
+ ;; like there is `set-process-buffer' we wouldn't need this and
+ ;; could use a pipe with a process filter instead of
+ ;; `after-change-functions'. Alternatively, we need a new initarg
+ ;; (but maybe not a slot).
+ (let ((calling-buffer (current-buffer)))
+ (with-current-buffer (get-buffer-create (format "*%s stderr*" name))
+ (let ((inhibit-read-only t)
+ (hidden-name (concat " " (buffer-name))))
+ (erase-buffer)
+ (buffer-disable-undo)
+ (add-hook
+ 'after-change-functions
+ (lambda (beg _end _pre-change-len)
+ (cl-loop initially (goto-char beg)
+ do (forward-line)
+ when (bolp)
+ for line = (buffer-substring
+ (line-beginning-position 0)
+ (line-end-position 0))
+ do (with-current-buffer (jsonrpc-events-buffer conn)
+ (goto-char (point-max))
+ (let ((inhibit-read-only t))
+ (insert (format "[stderr] %s\n" line))))
+ until (eobp)))
+ nil t)
+ ;; If we are correctly coupled to the client, the process
+ ;; now created should pick up the current stderr buffer,
+ ;; which we immediately rename
+ (setq proc (if (functionp proc)
+ (with-current-buffer calling-buffer (funcall proc))
+ proc))
+ (ignore-errors (kill-buffer hidden-name))
+ (rename-buffer hidden-name)
+ (process-put proc 'jsonrpc-stderr (current-buffer))
+ (read-only-mode t))))
(setf (jsonrpc--process conn) proc)
(set-process-buffer proc (get-buffer-create (format " *%s output*" name)))
(set-process-filter proc #'jsonrpc--process-filter)