version 0.76_01
[sepia.git] / sepia.texi
blobef4f764047fa7c003da860ca28071fa5bed0d66a
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename sepia.info
4 @settitle Simple Emacs Perl Integration
5 @dircategory Emacs
6 @direntry
7 * Sepia: (sepia).    Simple Emacs Perl Integration.
8 @end direntry
9 @c %**end of header
11 @titlepage
12 @title Sepia: Simple Emacs Perl Integration
13 @author Sean O'Rourke
14 @end titlepage
16 @macro kbinding{key,cmd}
17 @item \key\ `\cmd\'
18 @kindex \key\
19 @end macro
21 @macro fitem{name}
22 @item \name\
23 @findex \name\
24 @end macro
26 @macro xxx{stuff}
27 @b{XXX: \stuff\}
28 @end macro
30 @node Top, Introduction, (dir), (dir)
32 @ifinfo
33 @top SEPIA
34 @end ifinfo
36 Sepia is a set of Perl development tools for Emacs supporting code
37 navigation and interactive evaluation.
39 @menu
40 * Introduction::                
41 * Editing::                     
42 * Interactive Perl::            
43 * Customization::               
44 * Internals::                   
45 * Credits::                     
46 * Function Index::              
47 @end menu
49 @c ============================================================
50 @node Introduction, Editing, Top, Top
51 @chapter Introduction
53 Sepia is a set of tools for Perl development in Emacs.  Its goal is to
54 extend CPerl mode with two contributions: fast code navigation and
55 interactive development.  It is inspired by Emacs' current support for a
56 number of other languages, including Lisp, Python, and Emacs Lisp.
58 @menu
59 * Getting Started::             
60 * Philosophy::                  
61 @end menu
63 @node Getting Started, Philosophy, Introduction, Introduction
64 @section Getting Started
66 To install Sepia, its Emacs Lisp files must be in Emacs'
67 @code{load-path}, and the @file{lib} directory must be in Perl's
68 @code{@@INC}.  Assuming that Sepia has been unpacked in
69 @file{~/sepia}, it can be installed by adding the following lines to
70 @file{~/.emacs}:
72 @example
73 (add-to-list 'load-path "~/sepia")
74 (setq sepia-perl5lib (expand-file-name "~/sepia/lib"))
75 (defalias 'perl-mode 'sepia-mode)
76 @end example
78 Then to bring up the interactive Perl prompt, type @kbd{M-x sepia-repl}.
80 @node Philosophy,  , Getting Started, Introduction
81 @section Philosophy
83 A development environment should support three activities: code
84 spelunking, interaction, and customization.  Emacs as an environment for
85 developing Emacs Lisp thoroughly supports all of them: It has commands
86 to visit individual functions' code and documentation, commands to
87 evaluate or step through expressions, and an architecture that
88 encourages customization in Emacs Lisp.  As an environment for Perl,
89 however, it is lacking: there is limited interactivity with the Perl
90 debugger, and reasonable documentation browsing, but no support for
91 navigating, editing, and re-evaluating code.  Sepia attempts to remedy
92 the situation.
94 Modern IDEs also support these three activities, but do so awkwardly.
95 Rather than having functions to visit definitions (@kbd{find-function})
96 and search for functions (@kbd{apropos}), they clutter the screen with
97 class and file trees.  Rather than supporting interactive evaluation of
98 small pieces of code, they perform background semantic checking on whole
99 projects and highlight errors.  Rather than allowing minor
100 customizations to grow organically into features, they support limited
101 configuration files and baroque plug-in APIs.  Sepia tries to adhere to
102 the apparent Emacs philosophy that rich semantic information should be
103 unobtrusive, and that the best way to build working code is to start
104 by experimenting with small pieces.
106 Language support packages for Emacs vary widely in the degree to which
107 they make use of or replace existing Emacs features.  Minimal modes
108 provide keyword-based syntax highlighting and an unadorned comint buffer
109 as an interpreter.  Others provide their own specialized equivalents of
110 comint, eldoc, completion, and other Emacs features.  Sepia takes a
111 third approach by trying to do as much as possible with existing Emacs
112 features, even when they are not optimal for Perl.  It uses comint to
113 communicate with the subprocess, eldoc to display documentation, and
114 grep to list source locations.
116 This approach has three advantages: First, it maximizes the number of
117 features that can be supported with limited development time.  Second,
118 it respects users' settings.  A seasoned Emacs user may have changed
119 hundreds of settings, so a mode that reimplements features will have to
120 support equivalent settings, and will force the user to re-specify them.
121 Finally, this approach respects decades of development spent, as Neal
122 Stephenson put it, ``focused with maniacal intensity on the deceptively
123 simple-seeming problem of editing text.''  Many non-obvious choices go
124 into making a polished interface, and while a reimplementation gets rid
125 of accumulated cruft, it must rediscover these hidden trade-offs.
127 Anyways, I hope you enjoy using Sepia.  Its development style is strange
128 for someone used Perl's typical mix of one-liners and edit-save-run, but
129 once you are accustomed to it, you may find it very effective.
131 @c ============================================================
132 @node Editing, Interactive Perl, Introduction, Top
133 @chapter Editing
135 Sepia's first contribution is a set of commands to explore a Perl
136 codebase.  These include commands to browse and display documentation,
137 to find function definitions, and to query a cross-reference database of
138 function and variable uses.  Sepia also provides intelligent symbol
139 completion.
141 @menu
142 * Completion::                  
143 * Navigation::                  
144 * Documentation::               
145 @end menu
147 @node Completion, Navigation, Editing, Editing
148 @section Completion
150 Sepia implements fairly sophisticated partial-word completion in
151 collaboration with the inferior Perl process.  For example,
152 @samp{%S:X:v_u} completes to @samp{%Sepia::Xref::var_use} when Sepia is
153 loaded.  This completion only operates on functions and global variables
154 known to the Perl interpreter, so it works best when code and
155 interpreter are in sync.
157 More precisely, completion examines the text before point and tries each
158 of the following in turn, using the first successful approach:
160 @enumerate
161 @item
162 If the text looks like a method call (e.g. @samp{$object->f} or
163 @samp{Class->f}), complete on methods.
165 @item
166 If it looks like a variable, complete on variables; otherwise, complete
167 on modules and functions.
169 @item
170 Otherwise, try to complete a Perl built-in operator.
171 @end enumerate
173 For each of the first two, completions candidates are first generated by
174 splitting the text on characters @code{[:_]} and matching the resulting
175 word parts.  For example, @samp{X:a_b} will complete to all symbols
176 matching @samp{^X[^:]*:a[^:_]*_b} such as @samp{Xref::a_bug} and
177 @samp{X::always_bites_me}.  If no matches result, the text is treated as
178 an acronym.  For example, @samp{dry} will complete to
179 @samp{dont_repeat_yourself}.
181 @table @kbd
182 @item M-x sepia-complete-symbol
183 @findex sepia-complete-symbol
184 Complete the symbol before point as either a module, function, methd, or
185 global variable.  Note that this does not consider lexical scope, and is
186 always case-sensitive, independent of @code{completion-ignore-case}.
188 @item TAB
189 @itemx M-x sepia-indent-or-complete
190 @findex sepia-indent-or-complete
191 First try to indent the current line.  If the indentation does not
192 change, then try to expand an abbrev at point (unless
193 @code{sepia-indent-expand-abbrev} is @code{NIL}).  If no abbrev is
194 expanded, then call @code{sepia-complete-symbol}.
196 @end table
198 @node Navigation, Documentation, Completion, Editing
199 @section Navigation
201 Sepia provides several commands for navigating program source.  All of
202 them rely on information from the inferior Perl process, so it is
203 important both that it be running, and that its internal representation
204 of the program matches the program on disk.  The commands marked (Xref)
205 below also rely on a cross-reference database, which must be explicitly
206 rebuilt by calling @code{xref-rebuild} when the program changes.
208 There are two basic kinds of navigation commands.  The first kind jump
209 directly to the first matching location when possible, prompting only if
210 no such location is found.  These commands find only a single location,
211 and do not put their results on the found-location ring.
213 @c direct-jump commands
214 @table @kbd
216 @item M-. M-.
217 @itemx M-x sepia-dwim
218 @findex sepia-dwim
219 Guess what kind of identifier is at point, and try to do the right
220 thing: for a function, find its definition(s); for a variable, find its
221 uses; for a module, view its documentation; otherwise, prompt for the
222 name of a function to visit.  @code{sepia-dwim} automatically goes to
223 the first function definition or variable use found.
225 @item M-. l
226 @itemx M-x sepia-location
227 @findex sepia-location
228 Jump directly to the definition of the function at point, prompting if
229 point is not on a symbol.  If multiple definitions are found, choose one
230 arbitrarily.  This function is similar to @code{sepia-defs}, and the two
231 should probably be merged.
233 @item M-. j
234 @itemx M-x sepia-jump-to-symbol
235 @findex sepia-jump-to-symbol
236 Navigate to a function using ``ido'' interactive completion.  Within
237 interactive completion, press @key{:} to descend into a package,
238 @key{DEL} to ascend to a parent package, and @key{RET} to go to the
239 currently-selected function.
241 @end table
243 The second kind of navigation commands always prompt the user -- though
244 usually with a sensible default value -- and find multiple locations.
245 When called with a prefix argument, these commands present their results
246 in a @code{grep-mode} buffer.  When called @emph{without} a prefix
247 argument, these commands place all results on the found-location ring
248 and jump directly to the first.  The remaining locations can be cycled
249 through by calls to @code{sepia-next}.
251 @c prompt-and-go commands
252 @table @kbd
253 @item M-. f @var{name} @key{RET}
254 @itemx M-x sepia-defs
255 @findex sepia-defs
256 Find definition(s) of function @var{name}.
258 @item M-. m
259 @itemx M-x sepia-module-find @var{name} @key{RET}
260 @findex sepia-module-find
261 Find the source of module @var{name}.
263 @item M-. a @var{regexp} @key{RET}
264 @itemx M-x sepia-apropos @var{regexp} @key{RET}
265 @findex sepia-apropos
266 Find definitions of all functions whose names match @var{regexp}.
268 @item M-. c @var{name} @key{RET}
269 @itemx M-x sepia-callers @var{name} @key{RET}
270 @findex sepia-callers
271 (Xref) Find calls to function @var{name}.
273 @item M-. C @var{name} @key{RET}
274 @itemx M-x sepia-callees @var{name} @key{RET}
275 @findex sepia-callees
276 (Xref) Find the definitions of functions called by @var{name}.
278 @item M-. v @var{name} @key{RET}
279 @itemx M-x sepia-var-uses @var{name} @key{RET}
280 @findex sepia-var-uses
281 (Xref) Find uses of the global variable @var{name}.
283 @item M-. V @var{name} @key{RET}
284 @itemx M-x sepia-var-defs @var{name} @key{RET}
285 @findex sepia-var-defs
286 (Xref) Find definitions of global variable @var{name}.  Since Perl's
287 global variables are not declared, this is rarely useful
289 @c XXX: broken, so don't mention it.
290 @c @item M-. A @var{regexp} @key{RET}
291 @c @itemx M-x sepia-var-apropos
292 @c @findex sepia-var-apropos
293 @c Find definitions of all variables whose names match @var{regexp}.  Since
294 @c this function does not handle lexical variables, and since Perl's global
295 @c variables are not declared, this is rarely useful.
297 @end table
299 Finally, there are several other navigation-related commands that do not
300 fit into either of the above categories.
302 @c other commands
303 @table @kbd
304 @item M-. n
305 @itemx M-x sepia-next
306 @findex sepia-next
307 Cycle through the definitions found by the previous @key{M-.} search.
309 @item M-. r
310 @itemx M-x sepia-rebuild
311 @findex sepia-rebuild
312 Rebuild the cross-reference database by walking the op-tree and
313 stashes.
315 @item M-. t
316 @itemx M-x find-tag
317 Execute the @code{find-tag} command typically bound to @key{M-.}.
319 @end table
321 @node Documentation,  , Navigation, Editing
322 @section Documentation
324 Sepia can be used to browse installed modules' documentation, to format
325 and display the current buffer's POD, and to browse the list of modules
326 installed on the system.
328 @table @kbd
329 @item M-. d @var{name} @key{RET}
330 @itemx M-x sepia-perldoc-this
331 @findex sepia-perldoc-this
332 View documentation for module @var{name} or Perl manual page @var{name}.
334 @item C-c C-d
335 @itemx M-x sepia-view-pod
336 @findex sepia-view-pod
337 Format and view the current buffer's documentation.
339 @item sepia-package-list
340 @findex sepia-package-list
341 Browse a tree of installed packages.  This lists only the top-level
342 packages from installed distributions, so if package @code{My::Stuff}
343 also provides @code{My::Stuff::Details}, it will not be displayed.  When
344 Emacs-w3m is available, each module is linked to its documentation.
346 @item sepia-module-list
347 @findex sepia-module-list
348 Browse a tree of both top-level and internal packages, like
349 @code{sepia-package-list}.
351 @end table
353 @findex sepia-install-eldoc
354 Sepia also integrates with eldoc (at least in GNU Emacs >= 22).  To
355 toggle eldoc support, type @kbd{M-x sepia-install-eldoc}.  Documentation
356 for Perl operators and control structures is taken from CPerl mode.
357 Sepia can also display documentation for user-defined functions if their
358 POD is formatted in the standard way, with functions described in a
359 ``=head2'' or ``=item'' entry.  To load user documentation, visit the
360 relevant file and type @kbd{M-x sepia-doc-update}.
362 If @code{Module::CoreList} is available Sepia's eldoc function will also
363 display the first version of Perl in which a module was shipped by
364 default.  This is intended to give the programmer a sense of when he is
365 creating external dependencies.
367 @c ============================================================
368 @node Interactive Perl, Customization, Editing, Top
369 @chapter Interactive Perl
371 Sepia's second main contribution is an interactive interface (REPL) to
372 an inferior Perl process in comint mode.  The interface is based on
373 comint-mode, and inherits many of its bindings; this chapter discusses
374 only the Sepia extensions.  In addition to the standard interactive
375 REPL, Sepia provides a number of other ways to evaluate pieces of code
376 in Perl, and commands to process buffer regions with Perl.
378 @findex sepia-repl
379 To start or switch to the repl, type @kbd{M-x sepia-repl}.  As
380 sepia-mode, @key{TAB} in the REPL performs partial-word completion with
381 @code{sepia-complete-symbol}.  However, it also supports filename
382 completion like standard comint mode.
384 @menu
385 * Shortcuts::                   
386 * Debugger::                    
387 * Evaluation::                  
388 * Mutilation::                  
389 * Scratchpad::                  
390 @end menu
392 @node Shortcuts, Debugger, Interactive Perl, Interactive Perl
393 @section Shortcuts
395 ``Shortcuts'' are commands handled specially by the REPL rather than
396 being evaluated as perl code.  They either communicate with the REPL
397 function, or provide a convenient interface to variables in the Sepia
398 package.  Shortcuts are prefixed by a comma (@key{,}), and may be
399 abbreviated to the shortest unique prefix.
401 @table @kbd
402 @item cd @var{dir}
403 Change perl's current directory to @var{dir}.
405 @item format @var{type}
406 Set the output format to @var{type}, either ``dumper'' (using
407 @code{Data::Dumper}), ``dump'' (@code{Data::Dump}), ``yaml''
408 (@code{YAML}), or ``plain'' (stringification).  Default: ``dumper''.
410 @item help
411 Display a list of shortcuts.
413 @item methods @var{name} [@var{regexp}]
414 Display a list of functions defined in package @var{name} and its
415 @code{ISA}-ancestors matching optional pattern @var{regexp}.
417 @item package @var{name}
418 Set the default evaluation package to @var{name}.
420 @item quit
421 Exit the inferior Perl process.
423 @item reload
424 Reload @file{Sepia.pm} and recursively invoke the REPL.  This command is
425 mostly of interest when working on Sepia itself.
427 @item strict [@var{val}]
428 Set evaluation strictness to @var{val}, or toggle it if @var{val} is not
429 given.  Note that turning strictness off and on clears the REPL's
430 lexical environment.
432 @item wantarray [@var{val}]
433 Set the evaluation context to @var{val}, or toggle between scalar and
434 array context.
436 @item who [@var{name} [@var{regexp}]]
437 List identifiers in package @var{name} (main by default) matching
438 optional pattern @var{regexp}.
440 @end table
442 @node Debugger, Evaluation, Shortcuts, Interactive Perl
443 @section Debugger
445 Unfortunately Sepia does @emph{not} use Perl's debugger hooks, so it
446 does not support a true debugger with breakpoints, single-stepping, etc.
447 However, the REPL overrides the @code{die()} and @code{warn()}
448 operators, allowing it to intercept failures while their context is
449 still available.  This makes it possible to produce a backtrace, inspect
450 and modify global variables, and continue execution.  If the PadWalker
451 module is available, Sepia also provides functions to inspect and modify
452 lexical variables.
454 The debugger has its own set of shortcuts, also prefixed by a comma.
456 @table @kbd
457 @item backtrace
458 Show a backtrace with @code{Carp::cluck}.
460 @item inspect @var{n}
461 Inspect lexicals in frame @var{n}, counting upward (requires PadWalker).
463 @item eval @var{n} @var{expr}
464 Evaluate @var{expr} in the lexical environment of frame @var{n}
465 (requires PadWalker).  @var{expr} should not transfer control out of
466 this environment, but is free to modify its lexicals.
468 @item return @var{expr}
469 Continue execution as if @code{die()} or @code{warn()} had returned the
470 value of @var{expr}, which is evaluated in the global environment.
472 @item die
473 @itemx warn
474 Continue dying or warning as the program would have done without
475 debugger intervention.
477 @end table
479 @node Evaluation, Mutilation, Debugger, Interactive Perl
480 @section Evaluation
482 When interactive Perl is running, Sepia can evaluate regions of code in
483 the inferior Perl process.  The following commands assume that this
484 process has already been started by calling @code{sepia-repl}.
486 @table @kbd
487 @item C-M-x
488 @itemx M-x sepia-eval-defun
489 @findex sepia-eval-defun
490 Evaluate the function around point in the inferior Perl process.
492 @item C-c C-l
493 @itemx M-x sepia-load-file
494 @findex sepia-load-file
495 Save the current buffer, then reload its file and if warnings or errors
496 occur, display an error buffer.  With a prefix argument, also rebuild
497 the cross-reference index.
499 @item C-c e
500 @itemx M-x sepia-eval-expression @key{RET} @var{expr} @key{RET}
501 @findex sepia-eval-expression
502 Evaluate @var{expr} in scalar context and echo the result.  With a
503 prefix argument, evaluate in list context.
505 @item sepia-set-cwd
507 @end table
509 @node Mutilation, Scratchpad, Evaluation, Interactive Perl
510 @section Mutilation
512 Sepia contains several functions to operate on regions of text using the
513 interactive Perl process.  These functions can be used like standard
514 one-liners (e.g. @samp{perl -pe ...}), with the advantage that all of
515 the functions and variables in the interactive session are available.
517 @table @kbd
518 @item M-x sepia-perl-pe-region @key{RET} @var{code} @key{RET}
519 @findex sepia-perl-pe-region
520 Evaluate @var{code} on each line in the region with @code{$_} bound to
521 the line text, collecting the resulting values of @code{$_}.  With a
522 prefix argument, replace the region with the result.
524 @item M-x sepia-perl-ne-region @key{RET} @var{code} @key{RET}
525 @findex sepia-perl-ne-region
526 Evaluate @var{code} as above, but collect the @emph{results} of code.
528 @item M-x sepia-perlize-region @key{RET} @var{code} @key{RET}
529 @findex sepia-perlize-region
530 Evaluate @var{code} once with @code{$_} bound to the entire region,
531 collecting the final value of @code{$_}.  With a prefix argument,
532 replace the region.
534 @end table
536 @node Scratchpad,  , Mutilation, Interactive Perl
537 @section Scratchpad
539 @findex sepia-scratch
540 Sepia also supports a scratchpad, another form of interaction inspired
541 by Emacs' @code{*scratch*} buffer.  To create or switch to the
542 scratchpad, type @kbd{M-x sepia-scratch}.  Scratchpad mode is exactly
543 like Sepia mode, except @key{C-j} evaluates the current line and prints
544 the result on the next line.
546 @c ============================================================
547 @node Customization, Internals, Interactive Perl, Top
548 @chapter Customization
550 While Sepia can be customized in both the Perl and Emacs Lisp, most of
551 the user-accessible configuration is in the latter.  The two variables
552 most likely to need customization are @kbd{sepia-program-name} and
553 @kbd{sepia-perl5lib}.  Since Sepia tries where possible to reuse
554 existing Emacs functionality, its behavior should already be covered by
555 existing customizations.
557 @menu
558 * Emacs Variables::             
559 * Perl Variables::              
560 @end menu
562 @node Emacs Variables, Perl Variables, Customization, Customization
563 @section Emacs Variables
565 @table @kbd
567 @item sepia-complete-methods
568 If non-@code{NIL}, @code{sepia-complete-symbol} will complete
569 simple method calls of the form @code{$x->} or @code{Module->}.  Since
570 the former requires evaluation of @code{$x}, this can be disabled.
571 Default: @code{T}.
573 @item sepia-eval-defun-include-decls
574 If non-@code{NIL}, attempt to generate a declaration list for
575 @code{sepia-eval-defun}.  This is necessary when evaluating some code,
576 such as that calling functions without parentheses, because the presence
577 of declarations affects the parsing of barewords.  Default: @code{T}.
579 @item sepia-indent-expand-abbrev
580 If non-@code{NIL}, @code{sepia-indent-or-complete} will, if
581 reindentation does not change the current line, expand an abbreviation
582 before point rather than performing completion.  Only if no abbreviation
583 is found will it perform completion.  Default: @code{T}.
585 @item sepia-module-list-function
586 The function to view a tree of installed modules.  Default:
587 @code{w3m-find-file} if Emacs-w3m is installed, or
588 @code{browse-url-of-buffer} otherwise.
590 @item sepia-perldoc-function
591 The function called to view installed modules' documentation.  Default:
592 @code{w3m-perldoc} if Emacs-w3m is installed, or @code{cperl-perldoc}
593 otherwise.
595 @item sepia-perl5lib
596 A list of directories to include in @code{PERL5LIB} when starting
597 interactive Perl.  Default: @code{NIL}.
599 @item sepia-prefix-key
600 The prefix to use for for functions in @code{sepia-keymap}.  Default:
601 @key{M-.}.
603 @item sepia-program-name
604 The Perl program name for interactive Perl.  Default: ``perl''.
606 @item sepia-use-completion
607 If non-@code{NIL}, various Sepia functions will generate completion
608 candidates from interactive Perl when called interactively.  This may be
609 slow or undesirable in some situations.  Default: @code{T}.
611 @item sepia-view-pod-function
612 The function called to view the current buffer's documentation.
613 Default: @code{sepia-w3m-view-pod} if Emacs-w3m is available, or
614 @code{sepia-perldoc-buffer} otherwise.
616 @end table
618 @node Perl Variables,  , Emacs Variables, Customization
619 @section Perl Variables
621 The following variables in the Sepia package control various aspects of
622 interactive evaluation.
624 @table @code
626 @item $PACKAGE
627 The package in which user input is evaluated, determined automatically
628 when code is evaluated from a buffer.  Default: @code{main}.
630 @item $PRINTER
631 The function called to format interactive output, normally set with the
632 @code{printer} shortcut.
634 @item $PRINT_PRETTY
635 If true, format some values nicely independent of the value of
636 @code{$PRINTER}.  Currently, this means columnating lists of simple
637 scalars.  Default: true.
639 @item $PS1
640 The trailing end of the prompt string, which should end with ``> ''.
641 Default: @code{"> "}.
643 @item $STOPDIE
644 If true, calls to @code{die} from interactive code will invoke the Sepia
645 debugger.  Default: true.
647 @item $STOPWARN
648 If true, calls to @code{warn} from interactive code will invoke the
649 Sepia debugger.  Default: false.
651 @item $WANTARRAY
652 If true, evaluate interactive expressions in list context.  Default: true.
654 @end table
656 @c ============================================================
657 @node Internals, Credits, Customization, Top
658 @chapter Internals
660 Many things remain unexplained except by the code itself, and some
661 details mentioned above should probably be given less prominence.  For
662 developer documentation, please see the POD for @code{Sepia} and
663 @code{Sepia::Xref}, and the doc-strings in @file{sepia.el}.
665 @node Credits, Function Index, Internals, Top
666 @unnumbered Credits
668 I would like to thank Hilko Bengen for finding and motivating me to fix
669 a bunch of bugs, and for doing the Debian packaging.
671 I would also like to thank the authors of Emacs-w3m, SLIME, ido, and
672 B::Xref for the code I stole.
674 @c ============================================================
675 @node Function Index,  , Credits, Top
676 @unnumbered Function Index
677 @printindex fn
679 @bye