mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-29 19:30:36 +02:00
* NEWS: * doc/ref/api-control.texi: * doc/ref/api-data.texi: * doc/ref/api-debug.texi: * doc/ref/api-deprecated.texi: * doc/ref/api-evaluation.texi: * doc/ref/api-foreign.texi: * doc/ref/api-i18n.texi: * doc/ref/api-io.texi: * doc/ref/api-languages.texi: * doc/ref/api-macros.texi: * doc/ref/api-memory.texi: * doc/ref/api-modules.texi: * doc/ref/api-options.texi: * doc/ref/api-peg.texi: * doc/ref/api-procedures.texi: * doc/ref/api-scheduling.texi: * doc/ref/api-undocumented.texi: * doc/ref/api-utility.texi: * doc/ref/expect.texi: * doc/ref/goops.texi: * doc/ref/misc-modules.texi: * doc/ref/posix.texi: * doc/ref/repl-modules.texi: * doc/ref/scheme-ideas.texi: * doc/ref/scheme-scripts.texi: * doc/ref/srfi-modules.texi: * gc-benchmarks/larceny/dynamic.sch: * gc-benchmarks/larceny/twobit-input-long.sch: * gc-benchmarks/larceny/twobit.sch: * libguile/gc.h: * libguile/ioext.c: * libguile/list.c: * libguile/options.c: * libguile/posix.c: * libguile/threads.c: * module/ice-9/boot-9.scm: * module/ice-9/optargs.scm: * module/ice-9/ports.scm: * module/ice-9/pretty-print.scm: * module/ice-9/psyntax.scm: * module/language/elisp/parser.scm: * module/language/tree-il/compile-bytecode.scm: * module/srfi/srfi-37.scm: * module/srfi/srfi-43.scm: * module/statprof.scm: * module/texinfo/reflection.scm: * test-suite/tests/eval.test: * test-suite/tests/fluids.test: Fix typos. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
256 lines
9.3 KiB
Text
256 lines
9.3 KiB
Text
@c -*-texinfo-*-
|
|
@c This is part of the GNU Guile Reference Manual.
|
|
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2010, 2011
|
|
@c Free Software Foundation, Inc.
|
|
@c See the file guile.texi for copying conditions.
|
|
|
|
@node Readline Support
|
|
@section Readline Support
|
|
|
|
@c FIXME::martin: Review me!
|
|
|
|
@cindex readline
|
|
@cindex command line history
|
|
Guile comes with an interface module to the readline library
|
|
(@pxref{Top,,, readline, GNU Readline Library}). This
|
|
makes interactive use much more convenient, because of the command-line
|
|
editing features of readline. Using @code{(ice-9 readline)}, you can
|
|
navigate through the current input line with the cursor keys, retrieve
|
|
older command lines from the input history and even search through the
|
|
history entries.
|
|
|
|
@menu
|
|
* Loading Readline Support:: How to load readline support into Guile.
|
|
* Readline Options:: How to modify readline's behavior.
|
|
* Readline Functions:: Programming with readline.
|
|
@end menu
|
|
|
|
|
|
@node Loading Readline Support
|
|
@subsection Loading Readline Support
|
|
|
|
The module is not loaded by default and so has to be loaded and
|
|
activated explicitly. This is done with two simple lines of code:
|
|
|
|
@lisp
|
|
(use-modules (ice-9 readline))
|
|
(activate-readline)
|
|
@end lisp
|
|
|
|
@c FIXME::martin: Review me!
|
|
|
|
The first line will load the necessary code, and the second will
|
|
activate readline's features for the REPL. If you plan to use this
|
|
module often, you should save these to lines to your @file{.guile}
|
|
personal startup file.
|
|
|
|
You will notice that the REPL's behavior changes a bit when you have
|
|
loaded the readline module. For example, when you press Enter before
|
|
typing in the closing parentheses of a list, you will see the
|
|
@dfn{continuation} prompt, three dots: @code{...} This gives you a nice
|
|
visual feedback when trying to match parentheses. To make this even
|
|
easier, @dfn{bouncing parentheses} are implemented. That means that
|
|
when you type in a closing parentheses, the cursor will jump to the
|
|
corresponding opening parenthesis for a short time, making it trivial to make
|
|
them match.
|
|
|
|
Once the readline module is activated, all lines entered interactively
|
|
will be stored in a history and can be recalled later using the
|
|
cursor-up and -down keys. Readline also understands the Emacs keys for
|
|
navigating through the command line and history.
|
|
|
|
@cindex @file{.guile_history}
|
|
When you quit your Guile session by evaluating @code{(quit)} or pressing
|
|
Ctrl-D, the history will be saved to the file @file{.guile_history} and
|
|
read in when you start Guile for the next time. Thus you can start a
|
|
new Guile session and still have the (probably long-winded) definition
|
|
expressions available.
|
|
|
|
@cindex @env{GUILE_HISTORY}
|
|
@cindex @file{.inputrc}
|
|
You can specify a different history file by setting the environment
|
|
variable @env{GUILE_HISTORY}. And you can make Guile specific
|
|
customizations to your @file{.inputrc} by testing for application
|
|
@samp{Guile} (@pxref{Conditional Init Constructs,,, readline, GNU
|
|
Readline Library}). For instance to define a key inserting a matched
|
|
pair of parentheses,
|
|
|
|
@example
|
|
$if Guile
|
|
"\C-o": "()\C-b"
|
|
$endif
|
|
@end example
|
|
|
|
@node Readline Options
|
|
@subsection Readline Options
|
|
|
|
@cindex readline options
|
|
The readline interface module can be tweaked in a few ways to better
|
|
suit the user's needs. Configuration is done via the readline module's
|
|
options interface, in a similar way to the evaluator and debugging
|
|
options (@pxref{Runtime Options}).
|
|
|
|
@deffn {Scheme Procedure} readline-options
|
|
@deffnx {Scheme Procedure} readline-enable option-name
|
|
@deffnx {Scheme Procedure} readline-disable option-name
|
|
@deffnx {Scheme Syntax} readline-set! option-name value
|
|
Accessors for the readline options. Note that unlike the enable/disable
|
|
procedures, @code{readline-set!} is syntax, which expects an unquoted
|
|
option name.
|
|
@end deffn
|
|
|
|
Here is the list of readline options generated by typing
|
|
@code{(readline-options 'help)} in Guile. You can also see the
|
|
default values.
|
|
|
|
@smalllisp
|
|
history-file yes Use history file.
|
|
history-length 200 History length.
|
|
bounce-parens 500 Time (ms) to show matching opening parenthesis
|
|
(0 = off).
|
|
bracketed-paste yes Disable interpretation of control characters
|
|
in pastes.
|
|
@end smalllisp
|
|
|
|
The readline options interface can only be used @emph{after} loading
|
|
the readline module, because it is defined in that module.
|
|
|
|
@node Readline Functions
|
|
@subsection Readline Functions
|
|
|
|
The following functions are provided by
|
|
|
|
@example
|
|
(use-modules (ice-9 readline))
|
|
@end example
|
|
|
|
There are two ways to use readline from Scheme code, either make calls
|
|
to @code{readline} directly to get line by line input, or use the
|
|
readline port below with all the usual reading functions.
|
|
|
|
@defun readline [prompt]
|
|
Read a line of input from the user and return it as a string (without
|
|
a newline at the end). @var{prompt} is the prompt to show, or the
|
|
default is the string set in @code{set-readline-prompt!} below.
|
|
|
|
@example
|
|
(readline "Type something: ") @result{} "hello"
|
|
@end example
|
|
@end defun
|
|
|
|
@defun set-readline-input-port! port
|
|
@defunx set-readline-output-port! port
|
|
Set the input and output port the readline function should read from
|
|
and write to. @var{port} must be a file port (@pxref{File Ports}),
|
|
and should usually be a terminal.
|
|
|
|
The default is the @code{current-input-port} and
|
|
@code{current-output-port} (@pxref{Default Ports}) when @code{(ice-9
|
|
readline)} loads, which in an interactive user session means the Unix
|
|
``standard input'' and ``standard output''.
|
|
@end defun
|
|
|
|
@subsubsection Readline Port
|
|
|
|
@defun readline-port
|
|
Return a buffered input port (@pxref{Buffered Input}) which calls the
|
|
@code{readline} function above to get input. This port can be used
|
|
with all the usual reading functions (@code{read}, @code{read-char},
|
|
etc), and the user gets the interactive editing features of readline.
|
|
|
|
There's only a single readline port created. @code{readline-port}
|
|
creates it when first called, and on subsequent calls just returns
|
|
what it previously made.
|
|
@end defun
|
|
|
|
@defun activate-readline
|
|
If the @code{current-input-port} is a terminal (@pxref{Terminals and
|
|
Ptys,, @code{isatty?}}) then enable readline for all reading from
|
|
@code{current-input-port} (@pxref{Default Ports}) and enable readline
|
|
features in the interactive REPL (@pxref{The REPL}).
|
|
|
|
@example
|
|
(activate-readline)
|
|
(read-char)
|
|
@end example
|
|
|
|
@code{activate-readline} enables readline on @code{current-input-port}
|
|
simply by a @code{set-current-input-port} to the @code{readline-port}
|
|
above. An application can do that directly if the extra REPL features
|
|
that @code{activate-readline} adds are not wanted.
|
|
@end defun
|
|
|
|
@defun set-readline-prompt! prompt1 [prompt2]
|
|
Set the prompt string to print when reading input. This is used when
|
|
reading through @code{readline-port}, and is also the default prompt
|
|
for the @code{readline} function above.
|
|
|
|
@var{prompt1} is the initial prompt shown. If a user might enter an
|
|
expression across multiple lines, then @var{prompt2} is a different
|
|
prompt to show further input required. In the Guile REPL for instance
|
|
this is an ellipsis (@samp{...}).
|
|
|
|
See @code{set-buffered-input-continuation?!} (@pxref{Buffered Input})
|
|
for an application to indicate the boundaries of logical expressions
|
|
(assuming of course an application has such a notion).
|
|
@end defun
|
|
|
|
@subsubsection Completion
|
|
|
|
@defun with-readline-completion-function completer thunk
|
|
Call @code{(@var{thunk})} with @var{completer} as the readline tab
|
|
completion function to be used in any readline calls within that
|
|
@var{thunk}. @var{completer} can be @code{#f} for no completion.
|
|
|
|
@var{completer} will be called as @code{(@var{completer} text state)},
|
|
as described in (@pxref{How Completing Works,,, readline, GNU Readline
|
|
Library}). @var{text} is a partial word to be completed, and each
|
|
@var{completer} call should return a possible completion string or
|
|
@code{#f} when no more. @var{state} is @code{#f} for the first call
|
|
asking about a new @var{text} then @code{#t} while getting further
|
|
completions of that @var{text}.
|
|
|
|
Here's an example @var{completer} for user login names from the
|
|
password file (@pxref{User Information}), much like readline's own
|
|
@code{rl_username_completion_function},
|
|
|
|
@example
|
|
(define (username-completer-function text state)
|
|
(if (not state)
|
|
(setpwent)) ;; new, go to start of database
|
|
(let more ((pw (getpwent)))
|
|
(if pw
|
|
(if (string-prefix? text (passwd:name pw))
|
|
(passwd:name pw) ;; this name matches, return it
|
|
(more (getpwent))) ;; doesn't match, look at next
|
|
(begin
|
|
;; end of database, close it and return #f
|
|
(endpwent)
|
|
#f))))
|
|
@end example
|
|
@end defun
|
|
|
|
@defun apropos-completion-function text state
|
|
A completion function offering completions for Guile functions and
|
|
variables (all @code{define}s). This is the default completion
|
|
function.
|
|
@c
|
|
@c FIXME: Cross reference the ``apropos'' stuff when it's documented.
|
|
@c
|
|
@end defun
|
|
|
|
@defun filename-completion-function text state
|
|
A completion function offering filename completions. This is
|
|
readline's @code{rl_filename_completion_function} (@pxref{Completion
|
|
Functions,,, readline, GNU Readline Library}).
|
|
@end defun
|
|
|
|
@defun make-completion-function string-list
|
|
Return a completion function which offers completions from the
|
|
possibilities in @var{string-list}. Matching is case-sensitive.
|
|
@end defun
|
|
|
|
|
|
@c Local Variables:
|
|
@c TeX-master: "guile.texi"
|
|
@c End:
|