summaryrefslogtreecommitdiff
path: root/elisp
diff options
context:
space:
mode:
Diffstat (limited to 'elisp')
-rw-r--r--elisp/geiser-connection.el118
-rw-r--r--elisp/geiser-repl.el3
2 files changed, 62 insertions, 59 deletions
diff --git a/elisp/geiser-connection.el b/elisp/geiser-connection.el
index 2702f0f..e24511b 100644
--- a/elisp/geiser-connection.el
+++ b/elisp/geiser-connection.el
@@ -35,12 +35,13 @@
;;; Request datatype:
-(defun geiser-con--make-request (str cont &optional sender-buffer)
+(defun geiser-con--make-request (con str cont &optional sender-buffer)
(list :geiser-connection-request
- (cons :id (random))
+ (cons :id (geiser-con--connection-inc-count con))
(cons :string str)
(cons :continuation cont)
- (cons :buffer (or sender-buffer (current-buffer)))))
+ (cons :buffer (or sender-buffer (current-buffer)))
+ (cons :connection con)))
(defsubst geiser-con--request-p (req)
(and (listp req) (eq (car req) :geiser-connection-request)))
@@ -57,6 +58,9 @@
(defsubst geiser-con--request-buffer (req)
(cdr (assoc :buffer req)))
+(defsubst geiser-con--request-connection (req)
+ (cdr (assoc :connection req)))
+
(defsubst geiser-con--request-deactivate (req)
(setcdr (assoc :continuation req) nil))
@@ -70,9 +74,16 @@
(list :geiser-connection
(cons :requests (list))
(cons :current nil)
+ (cons :count 0)
(cons :completed (make-hash-table :weakness 'value))
(cons :buffer buffer)
- (cons :timer nil)))
+ (cons :timer nil)
+ (cons :reply (geiser-con--make-reply-buffer (buffer-name buffer)))))
+
+(defun geiser-con--make-reply-buffer (n)
+ (let ((rb (generate-new-buffer (concat " geiser-con-reply: " n))))
+ (buffer-disable-undo rb)
+ rb))
(defsubst geiser-con--connection-p (c)
(and (listp c) (eq (car c) :geiser-connection)))
@@ -89,6 +100,9 @@
(defsubst geiser-con--connection-current-request (c)
(cdr (assoc :current c)))
+(defsubst geiser-con--connection-reply-buffer (c)
+ (cdr (assoc :reply c)))
+
(defun geiser-con--connection-clean-current-request (c)
(let* ((cell (assoc :current c))
(req (cdr cell)))
@@ -112,14 +126,11 @@
(geiser-con--connection-pop-request c)
(cdr current))))
-(defun geiser-con--connection-start-timer (c)
- (let ((cell (assoc :timer c)))
- (when (cdr cell) (cancel-timer (cdr cell)))
- (setcdr cell (run-at-time t 0.5 'geiser-con--process-next c))))
-
-(defun geiser-con--connection-cancel-timer (c)
- (let ((cell (assoc :timer c)))
- (when (cdr cell) (cancel-timer (cdr cell)))))
+(defun geiser-con--connection-inc-count (c)
+ (let* ((cnt (assoc :count c))
+ (new (1+ (cdr cnt))))
+ (setcdr cnt new)
+ new))
;;; Connection setup:
@@ -142,50 +153,45 @@
(overlay-end
comint-last-prompt-overlay)))))
-(defsubst geiser-con--has-entered-debugger ()
- (and geiser-con--debugging-prompt-regexp
- (re-search-backward geiser-con--debugging-prompt-regexp nil t)
- (or (null geiser-con--debugging-preamble-regexp)
- (save-excursion
- (re-search-backward geiser-con--debugging-preamble-regexp nil t)))))
+(defsubst geiser-con--has-entered-debugger (con)
+ (with-current-buffer (geiser-con--connection-buffer con)
+ (and geiser-con--debugging-prompt-regexp
+ (re-search-backward geiser-con--debugging-prompt-regexp nil t)
+ (or (null geiser-con--debugging-preamble-regexp)
+ (save-excursion
+ (re-search-backward geiser-con--debugging-preamble-regexp
+ nil t))))))
-(defun geiser-con--cleanup-connection (c)
- (geiser-con--connection-cancel-timer c))
+(defun geiser-con--connection-teardown ()
+ (when geiser-con--connection
+ (kill-buffer
+ (geiser-con--connection-reply-buffer geiser-con--connection))))
(defun geiser-con--setup-connection (buffer
prompt-regexp
&optional debug-prompt-regexp
debug-preamble-regexp)
(with-current-buffer buffer
- (when geiser-con--connection
- (geiser-con--cleanup-connection geiser-con--connection))
+ (geiser-con--connection-teardown)
(setq geiser-con--debugging-prompt-regexp debug-prompt-regexp)
(setq geiser-con--debugging-preamble-regexp debug-preamble-regexp)
(setq geiser-con--connection (geiser-con--make-connection buffer))
- (geiser-con--setup-comint prompt-regexp debug-prompt-regexp)
- (geiser-con--connection-start-timer geiser-con--connection)
- (message "Geiser REPL up and running!")))
-
-(defun geiser-con--setup-comint (prompt-regexp debug-prompt-regexp)
- (set (make-local-variable 'comint-redirect-insert-matching-regexp)
- (not (null debug-prompt-regexp)))
- (set (make-local-variable 'comint-redirect-finished-regexp)
- (if debug-prompt-regexp
- (format "\\(%s\\)\\|\\(%s\\)" prompt-regexp debug-prompt-regexp)
- prompt-regexp))
- (setq comint-prompt-regexp comint-redirect-finished-regexp)
- (add-hook 'comint-redirect-hook 'geiser-con--comint-redirect-hook nil t))
+ (set (make-local-variable 'comint-redirect-insert-matching-regexp)
+ (not (null debug-prompt-regexp)))
+ (set (make-local-variable 'comint-redirect-finished-regexp)
+ (if debug-prompt-regexp
+ (format "\\(%s\\)\\|\\(%s\\)" prompt-regexp debug-prompt-regexp)
+ prompt-regexp))
+ (setq comint-prompt-regexp comint-redirect-finished-regexp)
+ (add-hook 'comint-redirect-hook 'geiser-con--comint-redirect-hook nil t)))
;;; Requests handling:
-(defsubst geiser-con--comint-buffer ()
- (get-buffer-create " *geiser connection retort*"))
-
-(defun geiser-con--comint-buffer-form ()
- (with-current-buffer (geiser-con--comint-buffer)
+(defun geiser-con--comint-buffer-form (con)
+ (with-current-buffer (geiser-con--connection-reply-buffer con)
(goto-char (point-max))
- (if (geiser-con--has-entered-debugger)
+ (if (geiser-con--has-entered-debugger con)
`((error (key . geiser-debugger))
(output . ,(buffer-substring (point-min) (point))))
(condition-case nil
@@ -207,32 +213,28 @@
geiser-con--debugging-preamble-regexp))
(req (geiser-con--connection-pop-request con))
(str (and req (geiser-con--request-string req)))
- (cbuf (geiser-con--comint-buffer)))
- (if (not (buffer-live-p buffer))
- (geiser-con--connection-cancel-timer con)
- (when (and buffer req str)
- (with-current-buffer cbuf
- (setq comint-redirect-echo-input nil)
- (setq geiser-con--debugging-prompt-regexp debug-prompt)
- (setq geiser-con--debugging-preamble-regexp debug-preamble)
- (delete-region (point-min) (point-max)))
- (set-buffer buffer)
- (if (geiser-con--is-debugging)
- (geiser-con--request-deactivate req)
- (geiser-log--info "<%s>: %s" (geiser-con--request-id req) str)
- (comint-redirect-send-command (format "%s" str) cbuf nil t)))))))
+ (rbuffer (geiser-con--connection-reply-buffer con)))
+ (when (and buffer (buffer-live-p buffer) req str)
+ (with-current-buffer rbuffer
+ (delete-region (point-min) (point-max)))
+ (set-buffer buffer)
+ (if (geiser-con--is-debugging)
+ (geiser-con--request-deactivate req)
+ (geiser-log--info "<%s>: %s" (geiser-con--request-id req) str)
+ (comint-redirect-send-command (format "%s" str) rbuffer nil t))))))
(defun geiser-con--process-completed-request (req)
(let ((cont (geiser-con--request-continuation req))
(id (geiser-con--request-id req))
(rstr (geiser-con--request-string req))
- (buffer (geiser-con--request-buffer req)))
+ (buffer (geiser-con--request-buffer req))
+ (con (geiser-con--request-connection req)))
(if (not cont)
(geiser-log--warn "<%s> Droping result for request %S (%s)"
id rstr req)
(condition-case cerr
(with-current-buffer (or buffer (current-buffer))
- (funcall cont (geiser-con--comint-buffer-form))
+ (funcall cont (geiser-con--comint-buffer-form con))
(geiser-log--info "<%s>: processed" id))
(error (geiser-log--error
"<%s>: continuation failed %S \n\t%s" id rstr cerr))))))
@@ -263,7 +265,7 @@
(save-current-buffer
(let ((con (geiser-con--get-connection buffer/proc)))
(unless con (error geiser-con--error-message))
- (let ((req (geiser-con--make-request str cont sender-buffer)))
+ (let ((req (geiser-con--make-request con str cont sender-buffer)))
(geiser-con--connection-add-request con req)
(geiser-con--process-next con)
req))))
diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el
index 13b655e..f6fc12b 100644
--- a/elisp/geiser-repl.el
+++ b/elisp/geiser-repl.el
@@ -247,7 +247,8 @@ module command as a string")
deb-preamble-rx)
(add-to-list 'geiser-repl--repls (current-buffer))
(geiser-repl--set-this-buffer-repl (current-buffer))
- (geiser-repl--startup impl)))
+ (geiser-repl--startup impl)
+ (message "Geiser REPL up and running!")))
(defun geiser-repl--process ()
(let ((buffer (geiser-repl--set-up-repl geiser-impl--implementation)))