diff options
| author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-11-13 02:07:19 +0100 | 
|---|---|---|
| committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-11-13 02:07:19 +0100 | 
| commit | 33d9ce47c90674acfe8b60afdb4dfc9657c4e2be (patch) | |
| tree | 1478effd3ac940c4c9de057d1059f8bb6e19e779 | |
| parent | 31e4a41aa1ddca185f1e20ac6262e540329ea90b (diff) | |
| download | geiser-33d9ce47c90674acfe8b60afdb4dfc9657c4e2be.tar.gz geiser-33d9ce47c90674acfe8b60afdb4dfc9657c4e2be.tar.bz2 | |
Superior schemes
Inferior schemes weren't really a good idea, were they? With remote
connections one can launch an external scheme to debug Geiser anyway.
And everything is (ahem, will be) simpler when we add new
implementations.
| -rw-r--r-- | elisp/Makefile.am | 1 | ||||
| -rw-r--r-- | elisp/geiser-inf.el | 89 | ||||
| -rw-r--r-- | elisp/geiser-repl.el | 129 | 
3 files changed, 73 insertions, 146 deletions
| diff --git a/elisp/Makefile.am b/elisp/Makefile.am index d98751b..1f1ca76 100644 --- a/elisp/Makefile.am +++ b/elisp/Makefile.am @@ -15,7 +15,6 @@ dist_lisp_LISP = \     geiser-eval.el \     geiser-guile.el \     geiser-impl.el \ -   geiser-inf.el \     geiser-log.el \     geiser-menu.el \     geiser-mode.el \ diff --git a/elisp/geiser-inf.el b/elisp/geiser-inf.el deleted file mode 100644 index 329beea..0000000 --- a/elisp/geiser-inf.el +++ /dev/null @@ -1,89 +0,0 @@ -;;; geiser-inf.el -- inferior scheme processes - -;; Copyright (c) 2010 Jose Antonio Ortega Ruiz - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the Modified BSD License. You should -;; have received a copy of the license along with this program. If -;; not, see <http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5>. - -;; Start date: Thu Nov 11, 2010 01:04 - - -(require 'geiser-impl) -(require 'geiser-base) - -(require 'cmuscheme) - - -;; Implementation-dependent parameters - -(geiser-impl--define-caller geiser-inf--binary binary () -  "A variable or function returning the path to the scheme binary -for this implementation.") - -(geiser-impl--define-caller geiser-inf--arglist arglist () -  "A function taking no arguments and returning a list of -arguments to be used when invoking the scheme binary.") - -(geiser-impl--define-caller geiser-inf--prompt-re inferior-prompt-regexp () -  "A variable (or thunk returning a value) giving the regular -expression for this implementation's inferior scheme prompt. By default, -cmuscheme's prompt regexp will be used.") - -(geiser-impl--define-caller geiser-inf--init-server-cmd init-server-command () -  "A variable (or thunk returning a value) giving the REPL server -initialization command for local processes. The command must return a -list of the form (server PORT).") - - -;; Auxiliary functions - -(defun geiser-inf--wait-for-prompt (timeout) -  (let ((p (point)) (seen) (buffer (current-buffer))) -    (while (and (not seen) -                (> timeout 0) -                (get-buffer-process buffer)) -      (sleep-for 0.1) -      (setq timeout (- timeout 100)) -      (goto-char p) -      (setq seen (re-search-forward comint-prompt-regexp nil t))) -    (goto-char (point-max)) -    (unless seen (error "%s" "No prompt found!")))) - -(defun geiser-inf--make-buffer (impl) -  (with-current-buffer (generate-new-buffer (format " * inferior %s *" impl)) -    (inferior-scheme-mode) -    (current-buffer))) - -(defun geiser-inf--sentinel (proc evnt) -  (let ((buff (process-buffer proc))) -    (when (buffer-live-p buff) (kill-buffer buff)))) - - -;; Starting an inferior REPL - -(defun geiser-inf--run-scheme (impl) -  (let ((bin (geiser-inf--binary impl)) -        (args (geiser-inf--arglist impl)) -        (prompt-rx (geiser-inf--prompt-re impl))) -    (unless (and bin args) -      (error "Sorry, I don't know how to start %s" impl)) -    (with-current-buffer (geiser-inf--make-buffer impl) -      (when prompt-rx comint-prompt-regexp prompt-rx) -      (condition-case err -          (apply 'make-comint-in-buffer -             `(,(buffer-name) ,(current-buffer) ,bin nil ,@args)) -        (error (error "Error starting inferior %s REPL: %s" -                      impl (error-message-string err)))) -      (geiser-inf--wait-for-prompt 10000) -      (set-process-sentinel (get-buffer-process (current-buffer)) -                            'geiser-inf--sentinel) -      (cons (current-buffer) -            (comint-redirect-results-list (geiser-inf--init-server-cmd impl) -                                          "(port \\([0-9]+\\))" -                                          1))))) - - -(provide 'geiser-inf) - diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el index e6f01d4..fd1da7f 100644 --- a/elisp/geiser-repl.el +++ b/elisp/geiser-repl.el @@ -13,7 +13,6 @@  (require 'geiser-autodoc)  (require 'geiser-edit)  (require 'geiser-completion) -(require 'geiser-inf)  (require 'geiser-impl)  (require 'geiser-eval)  (require 'geiser-connection) @@ -109,6 +108,14 @@ expression, if any."  ;;; Implementation-dependent parameters +(geiser-impl--define-caller geiser-repl--binary binary () +  "A variable or function returning the path to the scheme binary +for this implementation.") + +(geiser-impl--define-caller geiser-repl--arglist arglist () +  "A function taking no arguments and returning a list of +arguments to be used when invoking the scheme binary.") +  (geiser-impl--define-caller geiser-repl--prompt-regexp prompt-regexp ()    "A variable (or thunk returning a value) giving the regular  expression for this implementation's geiser scheme prompt.") @@ -211,16 +218,12 @@ module command as a string")  (make-variable-buffer-local   (defvar geiser-repl--connection nil)) -(make-variable-buffer-local - (defvar geiser-repl--remote-p nil)) - -(make-variable-buffer-local - (defvar geiser-repl--inferior-buffer nil)) +(defun geiser-repl--remote-p () geiser-repl--address)  (defsubst geiser-repl--host () (car geiser-repl--address))  (defsubst geiser-repl--port () (cdr geiser-repl--address)) -(defun geiser-repl--get-address (&optional host port) +(defun geiser-repl--read-address (&optional host port)    (let ((defhost (or (geiser-repl--host) geiser-repl-default-host))          (defport (or (geiser-repl--port) geiser-repl-default-port)))      (cons (or host @@ -232,35 +235,26 @@ module command as a string")    (when (or geiser-repl-autodoc-p (< n 0))      (geiser--save-msg (geiser-autodoc-mode n)))) -(defun geiser-repl--save-remote-data (address remote) +(defun geiser-repl--save-remote-data (address)    (setq geiser-repl--address address) -  (setq geiser-repl--remote-p remote) -  (setq header-line-format (and remote +  (setq header-line-format (and address                                  (format "Host: %s   Port: %s"                                          (geiser-repl--host)                                          (geiser-repl--port))))) -(defun geiser-repl--start-repl (impl host port remote) +(defun geiser-repl--start-repl (impl address)    (message "Starting Geiser REPL for %s ..." impl)    (geiser-repl--to-repl-buffer impl) +  (sit-for 0)    (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)) -        (cname (geiser-repl--repl-name impl))) +  (let* ((prompt-rx (geiser-repl--prompt-regexp impl)) +         (deb-prompt-rx (geiser-repl--debugger-prompt-regexp impl)) +         (prompt (geiser-con--combined-prompt prompt-rx deb-prompt-rx)))      (unless prompt-rx        (error "Sorry, I don't know how to start a REPL for %s" impl)) -    (geiser-repl--save-remote-data address remote) -    (condition-case err -        (progn -          (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))) -      (error (insert "Unable to start REPL:\n\n" -                     (error-message-string err) "\n") -             (error "Couldn't start Geiser"))) -    (geiser-inf--wait-for-prompt 10000) +    (geiser-repl--save-remote-data address) +    (geiser-repl--start-scheme impl address prompt)      (geiser-repl--history-setup)      (add-to-list 'geiser-repl--repls (current-buffer))      (geiser-repl--set-this-buffer-repl (current-buffer)) @@ -268,10 +262,49 @@ module command as a string")            (geiser-con--make-connection (get-buffer-process (current-buffer))                                         prompt-rx                                         deb-prompt-rx)) -    (geiser-repl--startup impl remote) +    (geiser-repl--startup impl address)      (geiser-repl--autodoc-mode 1)      (message "%s up and running!" (geiser-repl--repl-name impl)))) +(defun geiser-repl--start-scheme (impl address prompt) +  (setq comint-prompt-regexp prompt) +  (let* ((name (geiser-repl--repl-name impl)) +         (buff (current-buffer)) +         (args (if address (list address) +                 `(,(geiser-repl--binary impl) +                   nil +                   ,@(geiser-repl--arglist impl))))) +    (condition-case err +        (apply 'make-comint-in-buffer `(,name ,buff ,@args)) +      (error (insert "Unable to start REPL:\n" +                     (error-message-string err) +                     "\n") +             (error "Couldn't start Geiser"))) +    (geiser-repl--wait-for-prompt 10000))) + +(defun geiser-repl--wait-for-prompt (timeout) +  (let ((p (point)) (seen) (buffer (current-buffer))) +    (while (and (not seen) +                (> timeout 0) +                (get-buffer-process buffer)) +      (sleep-for 0.1) +      (setq timeout (- timeout 100)) +      (goto-char p) +      (setq seen (re-search-forward comint-prompt-regexp nil t))) +    (goto-char (point-max)) + +    (unless seen (error "%s" "No prompt found!")))) + +(defun geiser-repl--is-debugging () +  (let ((dp (geiser-con--connection-debug-prompt geiser-repl--connection))) +    (and dp +         comint-last-prompt-overlay +         (save-excursion +           (goto-char (overlay-start comint-last-prompt-overlay)) +           (re-search-forward dp +                              (overlay-end comint-last-prompt-overlay) +                              t))))) +  (defun geiser-repl--connection ()    (let ((buffer (geiser-repl--set-up-repl geiser-impl--implementation)))      (or (and (buffer-live-p buffer) @@ -303,19 +336,13 @@ module command as a string")  (defsubst geiser-repl--history-file ()    (format "%s.%s" geiser-repl-history-filename geiser-impl--implementation)) -(defun geiser-repl--quit-inf () -  (when (buffer-live-p geiser-repl--inferior-buffer) -    (with-current-buffer geiser-repl--inferior-buffer -      (let ((geiser-repl-query-on-exit-p nil)) -        (geiser-repl-exit))))) -  (defun geiser-repl--on-quit ()    (comint-write-input-ring)    (let ((cb (current-buffer))          (impl geiser-impl--implementation)          (comint-prompt-read-only nil)) -    (ignore-errors (geiser-con--connection-close geiser-repl--connection)) -    (geiser-repl--quit-inf) +    (geiser-con--connection-deactivate geiser-repl--connection) +    (geiser-con--connection-close geiser-repl--connection)      (setq geiser-repl--repls (remove cb geiser-repl--repls))      (dolist (buffer (buffer-list))        (when (buffer-live-p buffer) @@ -343,7 +370,7 @@ module command as a string")          (remove (current-buffer) geiser-repl--closed-repls)))  (defun geiser-repl--input-filter (str) -  (not (or ;; (geiser-con--is-debugging) +  (not (or (geiser-repl--is-debugging)             (string-match "^\\s *$" str)             (string-match "^,quit *$" str)))) @@ -413,10 +440,9 @@ module command as a string")           (pmark (and proc (process-mark proc)))           (intxt (and pmark (buffer-substring pmark (point)))))      (when intxt -      (when (and geiser-repl-forget-old-errors-p -;;;                 (not (geiser-con--is-debugging))) -                 ) -        (compilation-forget-errors)) +      (and geiser-repl-forget-old-errors-p +           (not (geiser-repl--is-debugging)) +           (compilation-forget-errors))        (geiser-repl--prepare-send)        (comint-send-input)        (when (string-match "^\\s-*$" intxt) @@ -516,16 +542,7 @@ buffer."    "Start a new Geiser REPL."    (interactive     (list (geiser-repl--get-impl "Start Geiser for scheme implementation: "))) -  (message "Starting Scheme process...") -  (let* ((b/p (geiser-inf--run-scheme impl)) -         (inf-buff (car b/p)) -         (port (cadr b/p))) -    (unless port -      (when (bufferp inf-buff) (pop-to-buffer inf-buff)) -      (error "%s" "Couldn't connect to inferior scheme process")) -    (geiser-repl--start-repl impl "localhost" port nil) -    (setq geiser-repl--inferior-buffer inf-buff) -    (with-current-buffer inf-buff (setq geiser-impl--implementation impl)))) +  (geiser-repl--start-repl impl nil))  (defalias 'geiser 'run-geiser) @@ -533,7 +550,8 @@ buffer."    "Start a new Geiser REPL connected to a remote Scheme process."    (interactive     (list (geiser-repl--get-impl "Connect to Scheme implementation: "))) -  (geiser-repl--start-repl impl host port t)) +  (geiser-repl--start-repl impl +                           (geiser-repl--read-address host port)))  (make-variable-buffer-local   (defvar geiser-repl--last-scm-buffer nil)) @@ -560,7 +578,7 @@ If no REPL is running, execute `run-geiser' to start a fresh one."             (when (buffer-live-p geiser-repl--last-scm-buffer)               (pop-to-buffer geiser-repl--last-scm-buffer)))            (repl (pop-to-buffer repl)) -          (geiser-repl--remote-p (geiser-connect impl)) +          ((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)))) @@ -610,16 +628,15 @@ With a prefix argument, force exit by killing the scheme process."        (when (buffer-live-p repl)          (with-current-buffer repl            (push (cons geiser-impl--implementation -                      (when geiser-repl--remote-p -                        (list (geiser-repl--host) (geiser-repl--port)))) +                      geiser-repl--address)                  lst))))))  (defun geiser-repl--restore (impls)    (dolist (impl impls)      (when impl -      (if (cdr impl) -          (geiser-connect (car impl) (cadr impl) (caddr impl)) -        (run-geiser (car impl)))))) +      (condition-case err +          (geiser-repl--start-repl (car impl) (cdr impl)) +        (error (message (error-message-string err)))))))  (defun geiser-repl-unload-function ()    (dolist (repl geiser-repl--repls) | 
