racket/collects/readline/doc.txt
Eli Barzilay 737d3d5782 warning
svn: r5254
2007-01-08 02:10:37 +00:00

134 lines
4.5 KiB
Plaintext

The _readline_ collection (not to be confused with MzScheme's
`read-line' procedure) provides glue for using GNU's readline library
with the MzScheme read-eval-print-loop.
Normal use of readline
----------------------
The _rep.ss_ library installs a readline-based input port, and hooks
the prompt-and-read part of MzScheme's read-eval-print loop to
interact with it.
You can start MzScheme with
mzscheme -L rep.ss readline
or you can put the following in your ~/.mzschemerc so that MzScheme
starts with readline support when appropriate:
(when (and (regexp-match? #rx"xterm" (getenv "TERM"))
(terminal-port? (current-input-port)))
(dynamic-require '(lib "rep.ss" "readline") #f))
(The first condition rules out running in dumb terminals, eg, inside
Emacs, and the second condition avoids using it when input is
redirected.)
The readline history is stored across invocations in MzScheme's
preferences file, assuming MzScheme exits normally.
Interacting with the readline-enabled input port
------------------------------------------------
The _pread.ss_ library provides customization, and support for
prompt-reading after "rep.ss" installs the new input port.
The reading facility that the new input port provides can be
customized with these parameters:
> currnet-prompt
The prompt that is used, as a byte string. Defaults to #"> ".
> show-all-prompts
If #f, no prompt is shown until you write input that is completely
readable. For example, when you type
(foo bar) (+ 1
2)
you will see a single prompt in the beginning.
The problem is that the first expression can be `(read-line)' which
normally consumes the rest of the text on the *same* line. The
default value of this parameter is therefore #t, making it mimic
plain I/O interactions.
> max-history
The number of history entries to save. Defaults to 100.
> keep-duplicates
If this is #f (the default), then lines that are equal to the
previous one are not added as new history items.
> keep-blanks
If #f (the default), blank input lines are not kept in history.
The new input port that you get when you require "rep.ss" is a custom
port that uses readline for all inputs. The problem is when you want
to display a prompt and then read some input: readline will get
confused if it's not used when the cursor is at the beginning of the
line, which is why it has a `prompt' argument. To use this prompt:
(parameterize ([readline-prompt some-byte-string])
...code-that-reads...)
This will make the first call to readline use the prompt, and
subsequent calls will use an all-spaces prompt of the same length
(this can happen if you're reading an s-expression). The normal value
of `readline-prompt' is #f for an empty prompt (and 'spaces after the
prompt is used, which is why you should use `parameterize' to restore
it to #f).
(A proper solution would be to install a custom output port too which
will keep track of text that is displayed without a trailing newline.)
Warning
-------
The readline library uses the output port directly. You should not
use it when `current-input-port' has been modified, or when it was not
a terminal port when MzScheme was started (eg, when reading input from
a pipe). Expect problems if you ignore this warning (not too bad,
mostly problems with detecting an EOF).
Direct bindings for readline hackers
------------------------------------
The _readline.ss_ library provides two functions:
> (readline prompt-string)
prints the given prompt string and reads a line
> (readline-bytes prompt-bytes)
same as above, but using raw byte-strings for the prompt and
returning a byte string
> (add-history s)
adds the given string to the readline history, which is accessible
to the user via the up-arrow key
> (add-history-bytes s)
adds the given byte string to the readline history, which is
accessible to the user via the up-arrow key
> (set-completion-function! proc [type])
sets readline's `rl_completion_entry_function' function according to
proc, which is expected to be a `string -> (list-of string)'
procedure; the `type' argument defaults to `_string' but you can use
it with `_bytes' instead
License Issues
--------------
GNU's readline library is covered by the GPL, and that applies to code
that links with it. PLT Scheme is LGPL, so this code is not used by
default -- you should explicitly enable it if you want to. Also, be
aware that if you write code that uses this library, it will make your
code link to the readline library when invoked -- with the usual GPL
implications.