summaryrefslogtreecommitdiffstats
path: root/Iedline.scm
diff options
context:
space:
mode:
Diffstat (limited to 'Iedline.scm')
-rw-r--r--Iedline.scm103
1 files changed, 103 insertions, 0 deletions
diff --git a/Iedline.scm b/Iedline.scm
new file mode 100644
index 0000000..cbeb265
--- /dev/null
+++ b/Iedline.scm
@@ -0,0 +1,103 @@
+;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+;;
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this software; see the file COPYING. If not, write to
+;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;;
+;; As a special exception, the Free Software Foundation gives permission
+;; for additional uses of the text contained in its release of GUILE.
+;;
+;; The exception is that, if you link the GUILE library with other files
+;; to produce an executable, this does not by itself cause the
+;; resulting executable to be covered by the GNU General Public License.
+;; Your use of that executable is in no way restricted on account of
+;; linking the GUILE library code into it.
+;;
+;; This exception does not however invalidate any other reasons why
+;; the executable file might be covered by the GNU General Public License.
+;;
+;; This exception applies only to the code released by the
+;; Free Software Foundation under the name GUILE. If you copy
+;; code from other Free Software Foundation releases into a copy of
+;; GUILE, as the General Public License permits, the exception does
+;; not apply to the code that you add in this way. To avoid misleading
+;; anyone as to the status of such modified files, you must delete
+;; this exception notice from them.
+;;
+;; If you write modifications of your own for GUILE, it is your choice
+;; whether to permit this exception to apply to your modifications.
+;; If you do not wish that, delete this exception notice.
+
+;; "Iedline.scm" Scheme interface to readline library
+;; Author: Radey Shouman
+
+;; Change both current-input-port and current-output-port to
+;; allow line editing of input.
+;; All output goes through a soft port in order to detect prompt
+;; lines, i.e. lines unterminated by a newline.
+
+(define (make-edited-line-port)
+ (let ((prompt "")
+ (outp (default-output-port))
+ (inp (default-input-port))
+ (strp (call-with-input-string "" identity)))
+ (make-soft-port
+ (vector (lambda (c)
+ (write-char c outp))
+ (lambda (s)
+ (display s outp)
+ (or (zero? (string-length s))
+ (eq? #\newline (string-ref s (- (string-length s) 1)))
+ (begin
+ (set! prompt (string-append "\r" s))
+ (force-output outp))))
+ (lambda ()
+ (force-output outp))
+ (lambda ()
+ (let tail ((c (read-char strp)))
+ (if (char? c) c
+ (let ((str (read-edited-line prompt)))
+ (if (string? str)
+ (let ((n (string-length str)))
+ (add-history str)
+ (vector-set-length! str (+ 1 n))
+ (string-set! str n #\newline)
+ (set! strp (call-with-input-string
+ str identity))
+ (tail (read-char strp)))
+ str)))))
+ #f)
+ OPEN_BOTH)))
+
+(define line-editing
+ (let ((edit-port #f)
+ (oiport #f)
+ (ooport #f))
+ (lambda arg
+ (define past edit-port)
+ (cond ((null? arg))
+ ((and (car arg) (not edit-port))
+ (set! edit-port (make-edited-line-port))
+ (set! oiport (set-current-input-port edit-port))
+ (set! ooport (set-current-output-port edit-port)))
+ (edit-port
+ (set-current-input-port oiport)
+ (set-current-output-port ooport)
+ (set! edit-port #f)))
+ past)))
+
+(and
+ (if (provided? 'unix) (isatty? (current-input-port)) #t)
+ (eq? (current-input-port) (default-input-port))
+ (not (getenv "EMACS"))
+ (line-editing #t))