diff options
| author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-11-15 03:59:47 +0100 | 
|---|---|---|
| committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-11-15 03:59:47 +0100 | 
| commit | 9bf7ade943a755881837a28d77c4e9eb30ad8137 (patch) | |
| tree | fa072150f41dfd55f8681ace43c05ae1335e462f | |
| parent | 557fce4325f5dcdce89a925553edf0a22f3910b6 (diff) | |
| download | geiser-9bf7ade943a755881837a28d77c4e9eb30ad8137.tar.gz geiser-9bf7ade943a755881837a28d77c4e9eb30ad8137.tar.bz2 | |
REPL: sexpy history file (fix for #30269)
The trick consists on using a comint-input-ring-separator that is
*not* a newline, both for reading and writing the history file.
| -rw-r--r-- | elisp/geiser-impl.el | 4 | ||||
| -rw-r--r-- | elisp/geiser-repl.el | 35 | 
2 files changed, 29 insertions, 10 deletions
| diff --git a/elisp/geiser-impl.el b/elisp/geiser-impl.el index 4266cbc..4a5ce17 100644 --- a/elisp/geiser-impl.el +++ b/elisp/geiser-impl.el @@ -200,7 +200,9 @@ Here's how a typical call to this macro looks like:      (display-help)      (check-buffer geiser-guile--guess)      (keywords geiser-guile--keywords)) -" + +This macro also defines a runner function (run-NAME) and a +switcher (switch-to-NAME), and provides geiser-NAME."    (let ((name (if (listp name) (car name) name))          (parent (and (listp name) (cadr name))))      (unless (symbolp name) diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el index 4ca5b2c..7acaa23 100644 --- a/elisp/geiser-repl.el +++ b/elisp/geiser-repl.el @@ -255,6 +255,7 @@ module command as a string")        (error "Sorry, I don't know how to start a REPL for %s" impl))      (geiser-repl--save-remote-data address)      (geiser-repl--start-scheme impl address prompt) +    (geiser-repl--quit-setup)      (geiser-repl--history-setup)      (add-to-list 'geiser-repl--repls (current-buffer))      (geiser-repl--set-this-buffer-repl (current-buffer)) @@ -330,13 +331,33 @@ module command as a string")    (comint-redirect-results-list cmd ".+" 0)) -;;; REPL history and clean-up: +;;; REPL history + +(defconst geiser-repl--history-separator "\n\0\n")  (defsubst geiser-repl--history-file ()    (format "%s.%s" geiser-repl-history-filename geiser-impl--implementation)) +(defun geiser-repl--read-input-ring () +  (let ((comint-input-ring-file-name (geiser-repl--history-file)) +        (comint-input-ring-separator geiser-repl--history-separator)) +    (comint-read-input-ring t))) + +(defun geiser-repl--write-input-ring () +  (let ((comint-input-ring-file-name (geiser-repl--history-file)) +        (comint-input-ring-separator geiser-repl--history-separator)) +    (comint-write-input-ring))) + +(defun geiser-repl--history-setup () +  (set (make-local-variable 'comint-input-ring-size) geiser-repl-history-size) +  (set (make-local-variable 'comint-input-filter) 'geiser-repl--input-filter) +  (geiser-repl--read-input-ring)) + + +;;; Cleaning up on quit +  (defun geiser-repl--on-quit () -  (comint-write-input-ring) +  (geiser-repl--write-input-ring)    (let ((cb (current-buffer))          (impl geiser-impl--implementation)          (comint-prompt-read-only nil)) @@ -355,7 +376,8 @@ module command as a string")      (when (buffer-live-p pb)        (with-current-buffer pb          (let ((comint-prompt-read-only nil) -              (comint-input-ring-file-name (geiser-repl--history-file))) +              (comint-input-ring-file-name (geiser-repl--history-file)) +              (comint-input-ring-separator geiser-repl--history-separator))            (geiser-repl--on-quit)            (push pb geiser-repl--closed-repls)            (goto-char (point-max)) @@ -379,14 +401,9 @@ module command as a string")        (backward-sexp)        (buffer-substring (point) end)))) -(defun geiser-repl--history-setup () -  (set (make-local-variable 'comint-input-ring-file-name) -       (geiser-repl--history-file)) -  (set (make-local-variable 'comint-input-ring-size) geiser-repl-history-size) -  (set (make-local-variable 'comint-input-filter) 'geiser-repl--input-filter) +(defun geiser-repl--quit-setup ()    (set (make-local-variable 'comint-get-old-input) 'geiser-repl--old-input)    (add-hook 'kill-buffer-hook 'geiser-repl--on-kill nil t) -  (comint-read-input-ring t)    (set-process-sentinel (get-buffer-process (current-buffer))                          'geiser-repl--sentinel)) | 
