123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- @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 behaviour.
- * 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 behaviour 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:
|