emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/geiser d857699 1/8: initial support for connection-address


From: ELPA Syncer
Subject: [nongnu] elpa/geiser d857699 1/8: initial support for connection-address
Date: Sun, 19 Dec 2021 18:57:39 -0500 (EST)

branch: elpa/geiser
commit d857699d8cf2a4cdddf1dde58cb3f433d285d97e
Author: jao <jao@gnu.org>
Commit: jao <jao@gnu.org>

    initial support for connection-address
---
 elisp/geiser-repl.el | 63 +++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 45 insertions(+), 18 deletions(-)

diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el
index eefbd81..e86691e 100644
--- a/elisp/geiser-repl.el
+++ b/elisp/geiser-repl.el
@@ -255,6 +255,12 @@ module command as a string")
 (geiser-impl--define-caller geiser-repl--min-version minimum-version ()
   "A variable providing the minimum required scheme version, as a string.")
 
+(geiser-impl--define-caller geiser-repl--connection-address connection-address 
()
+  "If this implementation supports a parallel connection, return its address.
+The implementation is responsible of setting up the listening REPL on
+startup.  When this function returns a non-nil address, a connection
+will be set up using `geiser-connect-local' when a REPL is started.")
+
 
 ;;; Geiser REPL buffers and processes:
 
@@ -511,6 +517,8 @@ module command as a string")
                         geiser-repl-add-project-paths)))
         (geiser-add-to-load-path (expand-file-name p root))))))
 
+(defvar-local geiser-repl--repl-buffer nil)
+
 (defun geiser-repl--start-repl (impl address)
   (message "Starting Geiser REPL ...")
   (when (not address) (geiser-repl--check-version impl))
@@ -536,9 +544,7 @@ module command as a string")
     (add-to-list 'geiser-repl--repls (current-buffer))
     (geiser-repl--set-this-buffer-repl (current-buffer))
     (setq geiser-repl--connection
-          (geiser-con--make-connection (get-buffer-process (current-buffer))
-                                       prompt-rx
-                                       deb-prompt-rx))
+          (geiser-repl--connection-setup impl address prompt-rx deb-prompt-rx))
     (geiser-repl--startup impl address)
     (geiser-repl--autodoc-mode 1)
     (geiser-company--setup geiser-repl-company-p)
@@ -551,6 +557,36 @@ module command as a string")
                                     geiser-repl-query-on-kill-p)
     (message "%s up and running!" (geiser-repl--repl-name impl))))
 
+(defvar-local geiser-repl--connection-buffer nil)
+
+(defun geiser-repl--connection-buffer (addr)
+  (when addr (get-buffer-create (format " %s  <%s>" (buffer-name) addr))))
+
+(defun geiser-repl--connection-setup (impl address prompt-rx deb-prompt-rx)
+  (let* ((addr (unless address (geiser-repl--connection-address impl)))
+         (buff (or (geiser-repl--connection-buffer addr) (current-buffer))))
+    (when addr
+      (setq geiser-repl--connection-buffer buff)
+      (geiser-repl--comint-local-connect buff addr))
+    (geiser-con--make-connection (get-buffer-process buff)
+                                 prompt-rx
+                                 deb-prompt-rx)))
+
+(defun geiser-repl--comint-local-connect (buff address)
+  "Connect over a Unix-domain socket."
+  (with-current-buffer buff
+    (let ((proc (make-network-process :name (buffer-name buff)
+                                      :buffer buff
+                                      :family 'local
+                                      :remote address)))
+      ;; brittleness warning: this is stuff
+      ;; make-comint-in-buffer sets up, via comint-exec, when
+      ;; it creates its own process, something we're doing
+      ;; here by ourselves.
+      (set-process-filter proc 'comint-output-filter)
+      (goto-char (point-max))
+      (set-marker (process-mark proc) (point)))))
+
 (defun geiser-repl--start-scheme (impl address prompt)
   (setq comint-prompt-regexp prompt)
   (let* ((name (geiser-repl--repl-name impl))
@@ -562,22 +598,9 @@ module command as a string")
                           ,@(geiser-repl--get-arglist impl))))))
     (condition-case err
         (if (and address (stringp address))
-            ;; Connect over a Unix-domain socket.
-            (let ((proc (make-network-process :name (buffer-name buff)
-                                              :buffer buff
-                                              :family 'local
-                                              :remote address)))
-              ;; brittleness warning: this is stuff
-              ;; make-comint-in-buffer sets up, via comint-exec, when
-              ;; it creates its own process, something we're doing
-              ;; here by ourselves.
-              (set-process-filter proc 'comint-output-filter)
-              (goto-char (point-max))
-              (set-marker (process-mark proc) (point)))
+            (geiser-repl--comint-local-connect buff address)
           (apply 'make-comint-in-buffer `(,name ,buff ,@args)))
-      (error (insert "Unable to start REPL:\n"
-                     (error-message-string err)
-                     "\n")
+      (error (insert "Unable to start REPL:\n" (error-message-string err) "\n")
              (error "Couldn't start Geiser: %s" err)))
     (geiser-repl--wait-for-prompt geiser-repl-startup-time)))
 
@@ -671,6 +694,10 @@ If SAVE-HISTORY is non-nil, save CMD in the REPL history."
     (geiser-con--connection-deactivate geiser-repl--connection t)
     (geiser-con--connection-close geiser-repl--connection)
     (setq geiser-repl--repls (remove cb geiser-repl--repls))
+    (unless (eq cb geiser-repl--connection-buffer)
+      (when (buffer-live-p geiser-repl--connection-buffer)
+        (setq geiser-repl--connection-buffer nil)
+        (kill-buffer geiser-repl--connection-buffer)))
     (dolist (buffer (buffer-list))
       (when (buffer-live-p buffer)
         (with-current-buffer buffer



reply via email to

[Prev in Thread] Current Thread [Next in Thread]