From 0c9ffe580ce38fad12a70c59e5854be623c64830 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Mon, 11 Oct 2010 02:23:26 +0200 Subject: Remote REPLs: elisp support (geiser-connect) New user command geiser-connect, which will try to connect to a remote server and use it in the REPL. --- elisp/geiser-repl.el | 70 ++++++++++++++++++++++++++++++++++++++++++---------- elisp/geiser.el | 11 +++++---- 2 files changed, 63 insertions(+), 18 deletions(-) (limited to 'elisp') diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el index e28428f..7c9bd56 100644 --- a/elisp/geiser-repl.el +++ b/elisp/geiser-repl.el @@ -94,6 +94,16 @@ expression, if any." :type 'boolean :group 'geiser-repl) +(geiser-custom--defcustom geiser-repl-default-host "localhost" + "Default host when connecting to remote REPLs." + :type 'string + :group 'geiser-repl) + +(geiser-custom--defcustom geiser-repl-default-port 37146 + "Default port for connecting to remote REPLs." + :type 'integer + :group 'geiser-repl) + ;;; Geiser REPL buffers and processes: @@ -113,9 +123,10 @@ expression, if any." (defun geiser-repl--repl/impl (impl &optional repls) (catch 'repl (dolist (repl (or repls geiser-repl--repls)) - (with-current-buffer repl - (when (eq geiser-impl--implementation impl) - (throw 'repl repl)))))) + (when (buffer-live-p repl) + (with-current-buffer repl + (when (eq geiser-impl--implementation impl) + (throw 'repl repl))))))) (defun geiser-repl--set-up-repl (impl) (or (and (not impl) geiser-repl--repl) @@ -186,20 +197,46 @@ module command as a string") (geiser-impl--define-caller geiser-repl--exit-cmd exit-command () "Function returning the REPL exit command as a string") -(defun geiser-repl--start-repl (impl) +(make-variable-buffer-local + (defvar geiser-repl--address nil)) + +(defsubst geiser-repl--host () (car geiser-repl--address)) +(defsubst geiser-repl--port () (cdr geiser-repl--address)) +(defsubst geiser-repl--remote-p () geiser-repl--address) + +(defun geiser-repl--get-address () + (let ((defhost (or (geiser-repl--host) geiser-repl-default-host)) + (defport (or (geiser-repl--port) geiser-repl-default-port))) + (cons (read-string (format "Host (default %s): " defhost) nil nil defhost) + (read-number "Port: " defport)))) + +(defun geiser-repl--save-remote-data (remote address) + (setq geiser-repl--address (and remote address)) + (when remote + (setq header-line-format (format "Host: %s Port: %s" + (geiser-repl--host) + (geiser-repl--port))))) + +(defun geiser-repl--start-repl (impl &optional remote) (message "Starting Geiser REPL for %s ..." impl) (geiser-repl--to-repl-buffer impl) - (let ((binary (geiser-repl--binary impl)) + (let ((program (if remote (geiser-repl--get-address) + (geiser-repl--binary impl))) (args (geiser-repl--arglist impl)) (prompt-rx (geiser-repl--prompt-regexp impl)) (deb-prompt-rx (geiser-repl--debugger-prompt-regexp impl)) (deb-preamble-rx (geiser-repl--debugger-preamble-regexp impl)) (cname (geiser-repl--repl-name impl))) - (unless (and binary prompt-rx) + (unless (and program prompt-rx) (error "Sorry, I don't know how to start a REPL for %s" impl)) (set (make-local-variable 'comint-prompt-regexp) prompt-rx) - (apply 'make-comint-in-buffer - `(,cname ,(current-buffer) ,binary nil ,@args)) + (geiser-repl--save-remote-data remote program) + (condition-case err + (apply 'make-comint-in-buffer + `(,cname ,(current-buffer) ,program nil ,@args)) + (error (insert "Unable to start REPL:\n\n" + (error-message-string err) "\n") + (error "Couldn't start Geiser"))) (geiser-repl--wait-for-prompt 10000) (geiser-repl--history-setup) (geiser-con--setup-connection (current-buffer) @@ -249,6 +286,16 @@ module command as a string") "Start Geiser for scheme implementation: ")))) (geiser-repl--start-repl impl)) +(defun geiser-connect (impl) + "Start a new Geiser REPL connected to a remote Scheme process." + (interactive + (list (or (geiser-repl--only-impl-p) + (and (eq major-mode 'geiser-repl-mode) + geiser-impl--implementation) + (geiser-repl--read-impl + "Scheme implementation: ")))) + (geiser-repl--start-repl impl t)) + (make-variable-buffer-local (defvar geiser-repl--last-scm-buffer nil)) @@ -267,11 +314,8 @@ If no REPL is running, execute `run-geiser' to start a fresh one." (buffer-live-p geiser-repl--last-scm-buffer)) (pop-to-buffer geiser-repl--last-scm-buffer)) (repl (pop-to-buffer repl)) - (t (run-geiser (or impl - (and (not ask) - (geiser-repl--only-impl-p)) - (geiser-repl--read-impl - "Switch to scheme REPL: "))))) + ((geiser-repl--remote-p) (geiser-connect impl)) + (t (run-geiser impl))) (when (and buffer (eq major-mode 'geiser-repl-mode)) (setq geiser-repl--last-scm-buffer buffer)))) diff --git a/elisp/geiser.el b/elisp/geiser.el index b5caa0b..a64a20d 100644 --- a/elisp/geiser.el +++ b/elisp/geiser.el @@ -35,14 +35,15 @@ (autoload 'geiser "geiser-repl" "Start a Geiser REPL, or switch to a running one." t) -(autoload 'run-geiser "geiser-repl" - "Start a Geiser REPL." t) +(autoload 'run-geiser "geiser-repl" "Start a Geiser REPL." t) -(autoload 'switch-to-geiser "geiser-guile" +(autoload 'geiser-connect "geiser-repl" + "Start a Geiser REPL connected to a remote server." t) + +(autoload 'switch-to-geiser "geiser-repl" "Switch to a running one Geiser REPL." t) -(autoload 'run-guile "geiser-guile" - "Start a Geiser Guile REPL, or switch to a running one." t) +(autoload 'run-guile "geiser-guile" "Start a Geiser Guile REPL." t) (autoload 'switch-to-guile "geiser-guile" "Start a Geiser Guile REPL, or switch to a running one." t) -- cgit v1.2.3