diff options
Diffstat (limited to 'elisp')
-rw-r--r-- | elisp/geiser-connection.el | 49 | ||||
-rw-r--r-- | elisp/geiser-guile.el | 20 | ||||
-rw-r--r-- | elisp/geiser-racket.el | 14 | ||||
-rw-r--r-- | elisp/geiser-repl.el | 29 |
4 files changed, 65 insertions, 47 deletions
diff --git a/elisp/geiser-connection.el b/elisp/geiser-connection.el index 76ba24a..0225964 100644 --- a/elisp/geiser-connection.el +++ b/elisp/geiser-connection.el @@ -74,37 +74,48 @@ (format "\\(%s%s\\)" prompt (if debug (format "\\|%s" debug) ""))) (defun geiser-con--connection-eot-re (prompt debug) - (geiser-con--combined-prompt (format "\0\n%s" prompt) + (geiser-con--combined-prompt (format "\n%s" prompt) (and debug (format "\n%s" debug)))) (defun geiser-con--make-connection (proc prompt debug-prompt) - (list :geiser-connection + (list t + (cons :filter (process-filter proc)) (cons :tq (tq-create proc)) + (cons :tq-filter (process-filter proc)) (cons :eot (geiser-con--connection-eot-re prompt debug-prompt)) (cons :prompt prompt) (cons :debug-prompt debug-prompt) (cons :count 0) (cons :completed (make-hash-table :weakness 'value)))) -(defun geiser-con--connection-swap-proc (con proc) - (let* ((this-proc (geiser-con--connection-process con)) - (this-filter (process-filter this-proc)) - (filter (process-filter proc)) - (buffer (process-buffer proc)) - (tq (geiser-con--connection-tq con))) - (set-process-filter this-proc filter) - (set-process-buffer this-proc buffer) - (set-process-filter proc this-filter) - (set-process-buffer proc nil) - (setcdr tq (cons proc (tq-buffer tq))) - this-proc)) - -(defsubst geiser-con--connection-p (c) - (and (listp c) (eq (car c) :geiser-connection))) +(defun geiser-con--connection-deactivate (c) + (when (car c) + (let* ((tq (geiser-con--connection-tq c)) + (proc (geiser-con--connection-process c)) + (proc-filter (geiser-con--connection-filter c))) + (while (not (tq-queue-empty tq)) + (accept-process-output proc 0.1)) + (set-process-filter proc proc-filter) + (setcar c nil)))) + +(defun geiser-con--connection-activate (c) + (when (not (car c)) + (let* ((tq (geiser-con--connection-tq c)) + (proc (geiser-con--connection-process c)) + (tq-filter (geiser-con--connection-tq-filter c))) + (while (accept-process-output proc 0.01)) + (set-process-filter proc tq-filter) + (setcar c t)))) (defsubst geiser-con--connection-process (c) (tq-process (cdr (assoc :tq c)))) +(defsubst geiser-con--connection-filter (c) + (cdr (assoc :filter c))) + +(defsubst geiser-con--connection-tq-filter (c) + (cdr (assoc :tq-filter c))) + (defsubst geiser-con--connection-tq (c) (cdr (assoc :tq c))) @@ -164,7 +175,8 @@ `((error (key . geiser-debugger)) (output . ,answer)) (condition-case err - (car (read-from-string answer)) + (let ((form (car (read-from-string answer)))) + (and (listp form) form)) (error `((error (key . geiser-con-error)) (output . ,(format "%s\n(%s)" answer @@ -192,6 +204,7 @@ (geiser-log--info "REQUEST: <%s>: %s" (geiser-con--request-id r) (geiser-con--request-string r)) + (geiser-con--connection-activate c) (tq-enqueue (geiser-con--connection-tq c) (concat (geiser-con--request-string r) "\n") (geiser-con--connection-eot c) diff --git a/elisp/geiser-guile.el b/elisp/geiser-guile.el index 3d42d24..687bf34 100644 --- a/elisp/geiser-guile.el +++ b/elisp/geiser-guile.el @@ -174,13 +174,11 @@ This function uses `geiser-guile-init-file' if it exists." ;;; Error display (defun geiser-guile--enter-debugger () - (let ((bt-cmd (format ",%s\n" + (let ((bt-cmd (format ",geiser-newline\n,error-message\n,%s\n" (if geiser-guile-debug-show-bt-p "bt" "fr")))) (compilation-forget-errors) (goto-char (point-max)) - (geiser-repl--swap) - (comint-send-string nil ",geiser-newline\n") - (comint-send-string nil ",error-message\n") + (geiser-repl--prepare-send) (comint-send-string nil bt-cmd) (when geiser-guile-show-debug-help-p (message "Debug REPL. Enter ,q to quit, ,h for help.")) @@ -266,10 +264,16 @@ it spawn a server thread." (when remote (geiser-repl--send-silent (geiser-guile--load-path-string)) (geiser-repl--send-silent ",use (geiser emacs)")) - (geiser-guile-update-warning-level)) - -(defconst geiser-guile--init-server-command - ",use (geiser emacs)\n,geiser-start-server") + (geiser-guile-update-warning-level) + ) + +(defun geiser-guile--init-server-command () + (comint-kill-region (point-min) (point-max)) + (setq comint-prompt-regexp "inferior-guile> ") + (comint-send-string nil ",option prompt \"inferior-guile> \"\n") + (comint-send-string nil ",use (geiser emacs)\n") + (geiser-inf--wait-for-prompt 10000) + ",geiser-start-server") ;;; Implementation definition: diff --git a/elisp/geiser-racket.el b/elisp/geiser-racket.el index f3aa7e5..3ab181b 100644 --- a/elisp/geiser-racket.el +++ b/elisp/geiser-racket.el @@ -82,7 +82,7 @@ This function uses `geiser-racket-init-file' if it exists." ,@(and init-file (file-readable-p init-file) (list "-f" init-file)) "-f" ,(expand-file-name "racket/geiser.rkt" geiser-scheme-dir)))) -(defconst geiser-racket--prompt-regexp "^=?\\(mzscheme\\|racket\\)@[^ ]*?> ") +(defconst geiser-racket--prompt-regexp "\\(mzscheme\\|racket\\)@[^ ]*?> ") (defconst geiser-racket--init-server-command ",start-geiser") @@ -97,6 +97,12 @@ This function uses `geiser-racket-init-file' if it exists." (car (geiser-syntax--read-from-string (match-string-no-properties 1))) "#f"))) +(defun geiser-racket--enter-command (module) + (when (stringp module) + (cond ((zerop (length module)) ",enter #f") + ((file-name-absolute-p module) (format ",enter (file %S)" module)) + (t (format ",enter %s" module))))) + (defun geiser-racket--geiser-procedure (proc &rest args) (case proc ((eval compile) @@ -140,12 +146,6 @@ This function uses `geiser-racket-init-file' if it exists." (defun geiser-racket--symbol-begin (module) (save-excursion (skip-syntax-backward "^-()>") (point))) -(defun geiser-racket--enter-command (module) - (when (stringp module) - (cond ((zerop (length module)) ",enter #f") - ((file-name-absolute-p module) (format ",enter (file %S)" module)) - (t (format ",enter %s" module))))) - (defun geiser-racket--import-command (module) (and (stringp module) (not (zerop (length module))) diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el index f73bd90..e6f01d4 100644 --- a/elisp/geiser-repl.el +++ b/elisp/geiser-repl.el @@ -228,6 +228,10 @@ module command as a string") nil nil defhost)) (or port (read-number "Port: " defport))))) +(defun geiser-repl--autodoc-mode (n) + (when (or geiser-repl-autodoc-p (< n 0)) + (geiser--save-msg (geiser-autodoc-mode n)))) + (defun geiser-repl--save-remote-data (address remote) (setq geiser-repl--address address) (setq geiser-repl--remote-p remote) @@ -240,6 +244,7 @@ module command as a string") (message "Starting Geiser REPL for %s ..." impl) (geiser-repl--to-repl-buffer impl) (goto-char (point-max)) + (geiser-repl--autodoc-mode -1) (let ((address (geiser-repl--get-address host port)) (prompt-rx (geiser-repl--prompt-regexp impl)) (deb-prompt-rx (geiser-repl--debugger-prompt-regexp impl)) @@ -249,11 +254,6 @@ module command as a string") (geiser-repl--save-remote-data address remote) (condition-case err (progn - (setq geiser-repl--connection - (geiser-con--open-connection (car address) - (cdr address) - prompt-rx - deb-prompt-rx)) (set (make-local-variable 'comint-prompt-regexp) (geiser-con--combined-prompt prompt-rx deb-prompt-rx)) (apply 'make-comint-in-buffer `(,cname ,(current-buffer) ,address))) @@ -264,7 +264,12 @@ module command as a string") (geiser-repl--history-setup) (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--startup impl remote) + (geiser-repl--autodoc-mode 1) (message "%s up and running!" (geiser-repl--repl-name impl)))) (defun geiser-repl--connection () @@ -276,16 +281,12 @@ module command as a string") (setq geiser-eval--default-connection-function 'geiser-repl--connection) -(defun geiser-repl--swap () - (let ((p (get-buffer-process (current-buffer)))) - (when (and p geiser-repl--connection) - (let ((p (geiser-con--connection-swap-proc geiser-repl--connection - p))) - (goto-char (point-max)) - (set-marker (process-mark p) (point)))))) +(defun geiser-repl--prepare-send () + (geiser-con--connection-deactivate geiser-repl--connection)) (defun geiser-repl--send (cmd) (when (and cmd (eq major-mode 'geiser-repl-mode)) + (geiser-repl--prepare-send) (goto-char (point-max)) (comint-kill-input) (insert cmd) @@ -293,6 +294,7 @@ module command as a string") (comint-send-input nil t)))) (defun geiser-repl--send-silent (cmd) + (geiser-repl--prepare-send) (comint-redirect-results-list cmd ".+" 0)) @@ -415,6 +417,7 @@ module command as a string") ;;; (not (geiser-con--is-debugging))) ) (compilation-forget-errors)) + (geiser-repl--prepare-send) (comint-send-input) (when (string-match "^\\s-*$" intxt) (comint-send-string proc (geiser-eval--scheme-str '(:ge no-values))) @@ -459,8 +462,6 @@ buffer." (set (make-local-variable 'comint-input-ignoredups) geiser-repl-history-no-dups-p) (setq geiser-eval--get-module-function 'geiser-repl--module-function) - (when geiser-repl-autodoc-p - (geiser--save-msg (geiser-autodoc-mode 1))) (geiser-company--setup geiser-repl-company-p) ;; enabling compilation-shell-minor-mode without the annoying highlighter (compilation-setup t)) |