summaryrefslogtreecommitdiff
path: root/doc/parens.texi
diff options
context:
space:
mode:
Diffstat (limited to 'doc/parens.texi')
-rw-r--r--doc/parens.texi488
1 files changed, 488 insertions, 0 deletions
diff --git a/doc/parens.texi b/doc/parens.texi
new file mode 100644
index 0000000..7ae5420
--- /dev/null
+++ b/doc/parens.texi
@@ -0,0 +1,488 @@
+@node Between the parens, Cheat sheet, The REPL, Top
+@chapter Between the parens
+
+A good REPL is a must, but just about half the story of a good Scheme
+hacking environment. Well, perhaps a bit more than a half; but, at any
+rate, one surely needs also a pleasant way of editing source code. Don't
+pay attention to naysayers: Emacs comes with an excellent editor
+included for about any language on Earth, and just the best one when
+that language is sexpy (specially if you use @ref{paredit,,Paredit}).
+Geiser's support for writing Scheme code adds to Emacs'
+@code{scheme-mode}, rather than supplanting it; and it does so by means
+of a minor mode (unimaginatively dubbed @code{geiser-mode}) that defines
+a bunch of new commands to try and, with the help of the same Scheme
+process giving you the REPL, make those Scheme buffers come to life.
+
+@menu
+* Activating Geiser::
+* The source and the REPL::
+* Documentation helpers::
+* To eval or not to eval::
+* To err perchance to debug::
+* Jumping around::
+* Geiser writes for you::
+@end menu
+
+@node Activating Geiser, The source and the REPL, Between the parens, Between the parens
+@section Activating Geiser
+
+@cindex geiser-mode
+@img{geiser-mode, right} With Geiser installed following any of the
+procedures described in @ref{Setting it up}, Emacs will automatically
+activate @i{geiser-mode} when opening a Scheme buffer. Geiser also
+instructs Emacs to consider files with the extension @file{rkt} part of
+the family, so that, in principle, there's nothing you need to do to
+ensure that Geiser's extensions will be available, out of the box, when
+you start editing Scheme code.
+
+Indications that everything is working according to plan include the
+'Geiser' minor mode indicator in your mode-line and the appearance of a
+new entry for Geiser in the menu bar. If, moreover, the mode-line
+indicator is the name of a Scheme implementation, you're indeed in a
+perfect world; otherwise, don't despair and keep on reading: i'll tell
+you how to fix that in a moment.
+
+@cindex geiser-mode commands
+The menu provides a good synopsis of everthing Geiser brings to the
+party, including those keyboard shortcuts we Emacsers love. If you're
+seeing the name of your favourite Scheme implementation in the
+mode-line, have a running REPL and are comfortable with Emacs, you
+can stop reading now and, instead, discover Geiser's joys by yourself.
+I've tried to make Geiser as self-documenting as any self-respecting
+Emacs package should be. If you follow this route, make sure to take a
+look at Geiser's customization buffers (@kbd{M-x customize-group
+@key{RET} geiser}): there's lot of fine tunning available there. You
+might also want to take a glance at the @ref{Cheat sheet}.
+
+Since @i{geiser-mode} is a minor mode, you can toggle it with
+@kbd{M-x geiser-mode}, and control its activation in hooks with the
+functions @code{turn-on-geiser-mode} and @code{turn-off-geiser-mode}.
+If, for some reason i cannot fathom, you prefer @i{geiser-mode} not
+to be active by default, the following elisp incantation will do the
+trick:
+@example
+(eval-after-load "geiser-mode"
+ (remove-hook 'scheme-mode-hook 'turn-on-geiser-mode))
+@end example
+@cindex scheme file extensions
+And if you happen to use a funky extension for your Scheme files that is
+not recognised as such by Emacs, just tell her about it with:
+@example
+(add-to-list 'auto-mode-alist '("\\.funky-extension\\'" . scheme-mode))
+@end example
+
+@cindex useless wretch
+Now, @i{geiser-mode} is just a useless wretch unless there's a running
+Scheme process backing it up. Meaning that virtually all the commands it
+provides require a REPL up and running, preferably corresponding to
+the correct Scheme implementation. In the following section, we'll see
+how to make sure that that's actually the case.
+
+@node The source and the REPL, Documentation helpers, Activating Geiser, Between the parens
+@section The source and the REPL
+
+As i've already mentioned a couple of times, @i{geiser-mode} needs a
+running REPL to be operative. Thus, a common usage pattern will be
+for you to first call @code{run-geiser} (or one of its variants, see
+them described @ref{choosing-impl,,here}), and then open Scheme files;
+but there's nothing wrong in first opening a couple Scheme buffers and
+then starting the REPL (you can even find it more convenient, since
+pressing @kbd{C-c C-z} in a Scheme buffer will start the REPL for
+you). Since Geiser supports more than one Scheme implementation, though,
+there's the problem of knowing which of them is to be associated with
+each Scheme source file. Serviceable as it is, @i{geiser-mode} will try
+to guess the correct implementation for you, according to the algorithm
+described below. If you find that Geiser is already guessing right the
+Scheme implementation, feel free to skip to the
+@ref{switching-repl-buff,,next subsection}.
+
+@subsubheading How Geiser associates a REPL to your Scheme buffer
+@cindex scheme implementation, choosing
+To determine what Scheme implementation corresponds to a given source
+file, Geiser uses the following algorithm:
+@enumerate
+@item
+If the file-local variable @code{geiser-scheme-implementation} is
+defined, its value is used. A common way of setting buffer-local
+variables is to put them in a comment near the beginning of the file,
+surrounded by @code{-*-} marks, as in:
+@example
+;; -*- geiser-scheme-implementation: guile -*-
+@end example
+@item
+If you've customized @code{geiser-active-implementations} so that it's a
+single-element list (as explained @ref{choosing-impl,,here}), that
+element is used as the chosen implementation.
+@item
+The contents of the file is scanned for hints on its associated
+implementation. For instance, files that contain a @code{#lang}
+directive will be considered Racket source code, while those with a
+@code{define-module} form in them will be assigned to a Guile REPL.
+@item
+The current buffer's file name is checked against the rules given in
+@code{geiser-implementations-alist}, and the first match is applied. You
+can provide your own rules by customizing this variable, as explained
+below.
+@item
+If we haven't been lucky this far and you have customized
+@code{geiser-default-implementation} to the name of a supported
+implementation, we'll follow your lead.
+@item
+See? That's the problem of being a smart alec: one's always outsmarted
+by people around. At this point, @i{geiser-mode} will humbly give up and
+ask you to explicitly choose the Scheme implementation.
+@end enumerate
+As you can see in the list above, there are several ways to influence
+Geiser's guessing by mean customizable variables. The most direct (and
+most impoverishing) is probably limiting the active implementations to a
+single one, while customizing @code{geiser-implementations-alist} is the
+most flexible (and, unsurprisingly, also the most complex). Here's the
+default value for the latter variable:
+@example
+(((regexp "\\.scm$") guile)
+ ((regexp "\\.ss$") racket)
+ ((regexp "\\.rkt$") racket))
+@end example
+which describes the simple heuristic that files with @file{.scm} as
+extension are by default associated to a Guile REPL while those
+ending in @file{.ss} or @file{.rkt} correspond to Racket's
+implementation (with the caveat that these rules are applied only if the
+previous heuristics have failed to detect the correct implementation,
+and that they'll match only if the corresponding implementation is
+active). You can add rules to @code{geiser-implementations-alist} (or
+replace all of them) by customizing it. Besides regular expressions, you
+can also use a directory name; for instance, the following snippet:
+@example
+(eval-after-load "geiser-impl"
+ '(add-to-list 'geiser-implementations-alist
+ '((dir "/home/jao/prj/frob") guile)))
+@end example
+will add a new rule that says that any file inside my
+@file{/home/jao/prj/frob} directory (or, recursively, any of its
+children) is to be assigned to Guile. Since rules are first matched,
+first served, this new rule will take precedence over the default ones.
+
+@subsubheading Switching between source files and the REPL
+@cindex switching to REPL
+@cindex switching to source
+@anchor{switching-repl-buff} Once you have a working @i{geiser-mode},
+you can switch from Scheme source buffers to the REPL or @kbd{C-c
+C-z}. Those shortcuts map to the interactive command
+@code{switch-to-geiser}.
+
+@cindex switching to module
+If you use a numeric prefix, as in @kbd{C-u C-c C-z}, besides being
+teleported to the REPL, the latter will switch to the namespace of
+the Scheme source file (as if you had used @kbd{C-c C-m} in the REPL,
+with the source file's module as argument; cf. @ref{Switching context}).
+This command is also bound to @kbd{C-c C-Z}, with a capital zed.
+
+Once you're in the REPL, the same @kbd{C-c C-z} shortcut will bring
+you back to the buffer you jumped from, provided you don't kill the
+Scheme process in between. This is why the command is called
+@i{switch-to-geiser} instead of @i{switch-to-repl}, and what makes it
+really handy, if you ask me.
+
+@cindex switching schemes
+If for some reason you're not happy with the Scheme implementation that
+Geiser has assigned to your file, you can change it with @kbd{C-c C-s},
+and probably take a look at @ref{switching-repl-buff,,the previous
+subsection} to make sure that Geiser doesn't get confused again.
+
+@subsubheading A note about context
+As explained before (@pxref{Modus operandi}), all Geiser activities take
+place in the context of the @i{current namespace}, which, for Scheme
+buffers, corresponds to the module that the Scheme implementation
+associates to the source file at hand (for instance, in Racket, there's
+a one to one correspondence between paths and modules, while Guile
+relies on explicit @code{define-module} forms in the source file).
+
+Now that we have @code{geiser-mode} happily alive in our Scheme buffers
+and communicating with the right REPL instance, let us see what it
+can do for us, besides jumping to and fro.
+
+@node Documentation helpers, To eval or not to eval, The source and the REPL, Between the parens
+@section Documentation helpers
+
+@subsubheading Autodoc redux
+
+@cindex autodoc, in scheme buffers
+The first thing you will notice by moving around Scheme source is that,
+every now and then, the echo area lightens up with the same autodoc
+messages we know and love from our REPL forays. This happens every
+time the Scheme process is able to recognise an identifier in the
+buffer, and provide information either on its value (for variables) or
+on its arity and the name of its formal arguments (for procedures and
+macros). That information will only be available if the module the
+identifier belongs to has been loaded in the running Scheme image. So it
+can be the case that, at first, no autodoc is shown for identifiers
+defined in the file you're editing. But as soon as you evaluate them
+(either individually or collectively using any of the devices described
+in @ref{To eval or not to eval}) their signatures will start appearing
+in the echo area.
+
+@cindex disabling autodoc
+Autodoc activation is controlled by a minor mode, @code{geiser-autodoc},
+which you can toggle with @kbd{M-x geiser-autodoc}, or its associated
+keyboard shortcut, @kbd{C-c C-d a}. That @t{/A} indicator in the
+mode-line is telling you that autodoc is active. If you prefer, for some
+obscure reason, that it be inactive by default, just set
+@code{geiser-mode-autodoc-p} to @code{nil} in your customization files.
+
+@cindex autodoc explained
+@img{autodoc-req, right} The way autodoc displays information deserves
+some explanation. It will first show the name of the module where the
+identifier at hand is defined, followed by a colon and the identifier
+itself. If the latter corresponds to a procedure or macro, it will be
+followed by a list of argument names, starting with the ones that are
+required. Then there comes a square-bracketed list of optional argument
+names, if any. When an optional argument has a default value (or a form
+defining its default value), instead of a plain name, autodoc will
+display a list with the name followed by its initialisation form. When
+the optional arguments are keywords, their names are prefixed with a
+colon. An ellipsis (@dots{}) servers as a marker of an indeterminated
+number of parameters, as is the case with @i{rest} arguments or when
+autodoc cannot fathom the exact number of arguments (this is often the
+case with macros defined using @code{syntax-case}). Another way in which
+autodoc displays its ignorance is by using and underscore to display
+parameters whose name is beyond its powers.
+
+@img{autodoc-multi, right} It can also be the case that a function or
+macro has more than one signature (e.g., functions defined using
+@code{case-lambda}, or some @code{syntax-rules} macros, for which Geiser
+has often the black magic necessary to retrieve their actual arities).
+In those cases, autodoc shows all known signatures (using the above
+rules for each one) separated by a vertical bar (|). As you have already
+noticed, the whole thing is enclosed in parenthesis. After all, we're
+talking about Scheme here.
+
+@cindex autodoc for variables
+@img{autodoc-var, right} Finally, life is much easier when your cursor
+is on a symbol corresponding to a plain variable: you'll see in the echo
+area its name, preceded by the module where it's defined, and followed
+by its value, with an intervening arrow for greater effect. This time,
+there are no enclosing parenthesis (i hope you see the logic in my
+madness).
+
+@cindex autodoc customized
+You can change the way Geiser displays the module/identifier combo by
+customizing @code{geiser-autodoc-identifier-format}. For example, if you
+wanted a tilde surrounded by spaces instead of a colon as a separator,
+you would write something like
+@example
+(setq geiser-autodoc-identifier-format "%s ~ %s")
+@end example
+in your Emacs initialization files. There's also a face
+(@code{geiser-font-lock-autodoc-identifier}) that you can customize (for
+instance, with @kbd{M-x customize-face}) to change the appearance of the
+text. And another one (@code{geiser-font-lock-autodoc-current-arg}) that
+controls how the current argument position is highlighted.
+
+@subsubheading Other documentation commands
+
+Sometimes, autodoc won't provide enough information for you to
+understand what a function does. In those cases, you can ask Geiser to
+ask the running Scheme for further information on a given identifier or
+module.
+
+@cindex documentation for symbol
+@cindex docstrings, maybe
+For symbols, the incantation is @kbd{M-x geiser-doc-symbol-at-point}, or
+@kbd{C-c C-d C-d} for short. If the associated scheme supports
+docstrings (as, for instance, Guile does), you'll be teleported to a new
+Emacs buffer displaying Geiser's documentation browser, filled with
+information about the identifier, including its docstring (if any;
+unfortunately, that an implementation supports docstrings doesn't mean
+that they're used everywhere).
+
+@imgc{docstring}
+
+Pressing @kbd{q} in the documentation buffer will bring you back,
+enlightened, to where you were. There's also a handful of other
+navigation commands available in that buffer, which you can discover by
+means of its menu or via the good old @kbd{C-h m} command.
+
+For Racket, which does not support docstrings out of the box, this
+command will invoke Racket's @code{help} procedure, thereby opening your
+configured web browser with the corresponding manual page for you to
+peruse.
+
+You can also ask Geiser to display information about a module, in the
+form of a list of its exported identifiers, using @kbd{C-c C-d C-m},
+exactly as you would do @ref{repl-mod,,in the REPL}. This commands works
+with all supported Schemes, no strings attached.
+
+@node To eval or not to eval, To err perchance to debug, Documentation helpers, Between the parens
+@section To eval or not to eval
+
+@cindex philosophy
+@cindex incremental development
+One of Geiser's main goals is to facilitate incremental development. You
+might have noticed that i've made a big fuss of Geiser's ability to
+recognize context, by being aware of the namespace where its operations
+happen.
+
+That awareness is specially important when evaluating code in your
+scheme buffers, using the commands described below. They allow you to
+send code to the running Scheme with a granularity ranging from whole
+files to single s-expressions. That code will be evaluated in the module
+associated with the file you're editing, allowing you to redefine values
+and procedures to your heart's (and other modules') content.
+
+@cindex incremental development, evil
+Macros are, of course, another kettle of fish: one needs to re-evaluate
+uses of a macro after redefining it. That's not a limitation imposed by
+Geiser, but a consequence of how macros work in Scheme (and other
+Lisps). There's also the risk that you lose track of what's actually
+defined and what's not during a given session. But,
+@uref{http://programming-musings.org/2009/03/29/from-my-cold-prying-hands/,in
+my opinion}, those are limitations we lispers are aware of, and they
+don't force us to throw the baby with the bathwater and ditch
+incremental evaluation. Some people disagree; if you happen to find
+@uref{http://blog.racket-lang.org/2009/03/drscheme-repl-isnt-lisp.html,
+their arguments} convincing, you don't have to throw away Geiser
+together with the baby: @kbd{M-x geiser-restart-repl} will let you
+restart the REPL as many times as you see fit.
+
+@cindex evaluation
+@cindex incremental development, not evil
+For all of you bearded old lispers still with me, here are some of the
+commands performing incremental evaluation in Geiser.
+
+@code{geiser-eval-last-sexp}, bound to @kbd{C-x C-e}, will eval the
+s-expression just before point.
+
+@code{geiser-eval-definition}, bound to @kbd{C-M-x}, finds the topmost
+definition containing point and sends it for evaluation. The variant
+@code{geiser-eval-definition-and-go} (@kbd{C-c M-e}) works in the same
+way, but it also teleports you to REPL after the evaluation.
+
+@code{geiser-eval-region}, bound to @kbd{C-c C-r}, evals the current
+region. Again, there's an @i{and go} version available,
+@code{geiser-eval-region-and-go}, bound to @kbd{C-c M-r}.
+
+For all the commands above, the result of the evaluation is displayed in
+the minibuffer, unless it causes a (scheme-side) error (@pxref{To err
+perchance to debug}).
+
+At the risk of repeating myself, i'll remember you that all these
+evaluations will take place in the namespace of the module corresponding
+to the Scheme file from which you're sending your code, which, in
+general, will be different from the REPL's current module. And, if
+all goes according to plan, (re)defined variables and procedures should
+be immediately visible inside and, if exported, outside their module.
+
+Besides evaluating expressions, definitions and regions, you can also
+macro-expand them. The corresponding keybindings start with the prefix
+@kbd{C-c C-m} and end, respectively, with @kbd{C-e}, @kbd{C-x} and
+@kbd{C-r}. The result of the macro expansion always appears in a pop up
+buffer.
+
+@node To err perchance to debug, Jumping around, To eval or not to eval, Between the parens
+@section To err: perchance to debug
+
+@cindex to err is schemey
+@cindex backtraces
+When an error occurs during evaluation, it will be reported according to
+the capabilities of the underlying Scheme REPL.
+
+@cindex error buffer
+In Racket, you'll be presented with a backtrace, in a new buffer where
+file paths locating the origin of the error are clickable (you can
+navigate them using the @key{TAB} key, and use @key{RET} or the mouse to
+jump to the offending spot; or invoke Emacs' stock commands
+@code{next-error} and @code{previous-error}, bound to @kbd{M-g n} and
+@kbd{M-g p} by default).
+
+@imgc{eval-error}
+
+The Racket backtrace also highlights the exception type, making it
+clickable. Following the link will open the documentation corresponding
+to said exception type. Both the error and exception link faces are
+customizable (@code{geiser-font-lock-error-link} and
+@code{geiser-font-lock-doc-link}).
+
+On the other hand, Guile's reaction to evaluation errors is different:
+it enters the debugger in its REPL. Accordingly, the REPL buffer will
+pop up if your evaluation fails in a Guile file, and the error message
+and backtrace will be displayed in there, again clickable and all. But
+there you have the debugger at your disposal, with the REPL's current
+module set to that of the offender, and a host of special debugging
+commands that are described in Guile's fine documentation.
+
+@imgc{guile-eval-error}
+
+In addition, Guile will sometimes report warnings for otherwise
+successful evaluations. In those cases, it won't enter the debugger, and
+Geiser will report the warnings in a debug buffer, as it does for
+Racket. You can control how picky Guile is reporting warnings by
+customizing the variable @code{geiser-guile-warning-level}, whose
+detailed docstring (which see, using, e.g. @kbd{C-h v}) allows me to
+offer no further explanation here. The customization group
+@i{geiser-guile} is also worth a glance, for a couple of options to fine
+tune how Geiser interacts with Guile's debugger (and more). Same thing
+for racketeers and @i{geiser-racket}.
+
+@node Jumping around, Geiser writes for you, To err perchance to debug, Between the parens
+@section Jumping around
+
+@cindex jumping in scheme buffers
+This one feature is as sweet as easy to explain: @kbd{M-.}
+(@code{geiser-edit-symbol-at-point}) will open the file where the
+identifier around point is defined and land your point on its
+definition. To return to where you were, press @kbd{M-,}
+(@code{geiser-pop-symbol-stack}). This command works also for module
+names: Geiser first tries to locate a definition for the identifier at
+point and, if that fails, a module with that name; if the latter
+succeeds, the file where the module is defined will pop up.
+
+Sometimes, the underlying Scheme will tell Geiser only the file where
+the symbol is defined, but Geiser will use some heuristics (read,
+regular expressions) to locate the exact line and bring you there. Thus,
+if you find Geiser systematically missing your definitions, send a
+message to the mailing list and we'll try to make the algorithm smarter.
+
+@cindex jumping customized
+You can control how the destination buffer pops up by setting
+@code{geiser-edit-symbol-method} to either @code{nil} (to open the file
+in the current window), @code{'window} (other window in the same frame)
+or @code{'frame} (in a new frame).
+
+@node Geiser writes for you, , Jumping around, Between the parens
+@section Geiser writes for you
+
+@cindex completion in scheme buffers
+No self-respecting programming mode would be complete without
+completion. In geiser-mode, identifier completion is bound to
+@kbd{M-@key{TAB}}, and will offer all visible identifiers starting with
+the prefix before point. Visible here means all symbols imported or
+defined in the current namespace plus locally bound ones. E.g., if
+you're at the end of the following partial expression:
+
+@example
+(let ((default 42))
+ (frob def
+@end example
+
+and press @kbd{M-@key{TAB}}, one of the possible completions will be
+@code{default}.
+
+@cindex smart tabs
+If you find the @kbd{M} modifier annoying, you always have the option to
+activate @code{geiser-smart-tab-mode}, which will make the @key{TAB} key
+double duty as the regular Emacs indentation command (when the cursor is
+not near a symbol) and Geiser's completion function. If you want this
+smarty pants mode always on in Scheme buffers, customize
+@code{geiser-mode-smart-tab-p} to @code{t}.
+
+@cindex completion for module names
+Geiser also knows how to complete module names: if no completion for the
+prefix at point is found among the currently visible bindings, it will
+try to find a module name that matches it. You can also request
+explicitly completion only over module names using @kbd{M-`} (that's a
+backtick).
+
+@c Local Variables:
+@c mode: texinfo
+@c TeX-master: "geiser"
+@c End: