summaryrefslogtreecommitdiff
path: root/README.org
blob: 304ceac44d0ad7be11755f21be3a9120484b58eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
* Overview

  Geiser is a generic Emacs/Scheme interaction mode, featuring an
  enhanced REPL and a set of minor modes improving Emacs' basic scheme
  major mode. The main functionalities provided are:

    - Evaluation of forms in the namespace of the current module.
    - Macro expansion.
    - File/module loading.
    - Namespace-aware identifier completion (including local bindings,
      names visible in the current module, and module names).
    - Autodoc: the echo area shows information about the signature of
      the procedure/macro around point automatically.
    - Jump to definition of identifier at point.
    - Access to documentation (including docstrings when the
      implementation provides it).
    - Listings of identifiers exported by a given module.
    - Listings of callers/callees of procedures.
    - Rudimentary support for debugging (list of
      evaluation/compilation error in an Emacs' compilation-mode
      buffer).

   NOTE: if you're not in a hurry, [[http://www.nongnu.org/geiser/][Geiser's website]] contains a nicer
   manual, also included in Geiser tarballs as a texinfo file
   (doc/geiser.info).

* Supported scheme implementations

    - Guile 2.0 (not released yet: use the latest git master branch).
    - PLT Racket 5.0.1 or better.

* Installation
  Geiser can be used either directly from its uninstalled source tree
  or byte-compiled and installed after perfoming the standard
  configure/make/make install dance.

*** In place
    - Extract the tarball or clone the git repository anywhere in your
      file system. Let's call that place <path-to-geiser>.
    - In your .emacs:

      #+BEGIN_SRC emacs-lisp
      (load-file "<path-to-geiser>/elisp/geiser.el")
      #+END_SRC

*** Byte-compiled
    - Create a build directory, `build', say:
      #+BEGIN_SRC shell
      $ cd <path-to-geiser>
      $ mkdir build; cd build
      #+END_SRC
    - Configure and make:
      #+BEGIN_SRC shell
      $ ../configure && make
      #+END_SRC

    Now, you can use the byte-compiled Geiser in place by adding to
    your .emacs:

    #+BEGIN_SRC emacs-lisp
    (load "<path-to-geiser>/build/elisp/geiser-load")
    #+END_SRC

    or, alternatively, install it with:

    #+BEGIN_SRC shell
    $ make install
    #+END_SRC

    (you might need to get root access, depending on your installation
    directory) and, instead of the above load forms, require
    'geiser-install (not 'geiser, mind you) in your emacs
    initialization file:

    #+BEGIN_SRC emacs-lisp
    (require 'geiser-install)
    #+END_SRC

    You're ready to go!

* Basic configuration
  The loading invocations above install all supported Scheme
  implementations. You can list explicitly the ones that you want by
  setting the variable `geiser-impl-installed-implementations' *before*
  loading geiser.el. For instance:

    #+BEGIN_SRC emacs-lisp
    (setq geiser-impl-installed-implementations '(racket guile))
    #+END_SRC

   On opening a scheme file, Geiser will try to guess its Scheme,
   defaulting to the first in the list. Use `C-c C-s' to select the
   implementation by hand (on a per file basis).

  Check the geiser customization group for some options with:

      M-x customize-group RET geiser RET

  In particular, customize `geiser-<impl>-binary', which should point
  to an executable in your path.

  To start a REPL, M-x geiser.

*** Completion with company-mode
    Geiser offers identifier and module name completion, bound to
    M-TAB and M-` respectively. Only names visible in the current
    module are offered.

    While that is cool and all, things are even better: if you have
    [[http://nschum.de/src/emacs/company-mode/][company-mode]] installed, Geiser's completion will use it. Just
    require company-mode and, from then on, any new scheme buffer or
    REPL will use it. If you didn't know about Nikolaj Schumacher's
    awesome mode, check [[http://www.screentoaster.com/watch/stU0lSRERIR1pYRFVdXVlRVFFV/company_mode_for_gnu_emacs][this screencast]].

* Quick key reference

*** In Scheme buffers:

    |---------------------+-------------------------------------------------|
    | C-c C-z             | Switch to REPL                                  |
    |---------------------+-------------------------------------------------|
    | C-u C-c C-z         | Switch to REPL and current module               |
    |---------------------+-------------------------------------------------|
    | C-c C-s             | Specify Scheme implementation for buffer        |
    |---------------------+-------------------------------------------------|
    | M-.                 | Go to definition of identifier at point         |
    |---------------------+-------------------------------------------------|
    | M-,                 | Go back to where M-. was last invoked           |
    |---------------------+-------------------------------------------------|
    | C-c C-e m           | Ask for a module and open its file              |
    |---------------------+-------------------------------------------------|
    | C-M-x               | Eval definition around point                    |
    |---------------------+-------------------------------------------------|
    | C-c M-e             | Eval definition around point and switch to REPL |
    |---------------------+-------------------------------------------------|
    | C-x C-e             | Eval sexp before point                          |
    |---------------------+-------------------------------------------------|
    | C-c C-r             | Eval region                                     |
    |---------------------+-------------------------------------------------|
    | C-c M-r             | Eval region and switch to REPL                  |
    |---------------------+-------------------------------------------------|
    | C-c C-m x           | Macro-expand definition around point            |
    |---------------------+-------------------------------------------------|
    | C-c C-m e           | Macro-expand sexp before point                  |
    |---------------------+-------------------------------------------------|
    | C-c C-m r           | Marcro-expand region                            |
    |---------------------+-------------------------------------------------|
    | C-u C-c C-m [x,e,r] | (With prefix, macro expansions are recursive)   |
    |---------------------+-------------------------------------------------|
    | C-c C-k             | Compile and load current file                   |
    |---------------------+-------------------------------------------------|
    | C-c C-l             | Load current file                               |
    |---------------------+-------------------------------------------------|
    | C-c C-d d           | See documentation for identifier at point       |
    |---------------------+-------------------------------------------------|
    | C-c C-d m           | See a list of a module's exported identifiers   |
    |---------------------+-------------------------------------------------|
    | C-c C-d a           | Toggle autodoc mode                             |
    |---------------------+-------------------------------------------------|
    | C-c<                | Show callers of procedure at point              |
    |---------------------+-------------------------------------------------|
    | C-c>                | Show callees of procedure at point              |
    |---------------------+-------------------------------------------------|
    | C-c C-x f           | See a generic's methods signatures              |
    |---------------------+-------------------------------------------------|
    | M-TAB               | Complete identifier at point                    |
    |---------------------+-------------------------------------------------|
    | M-`, C-.            | Complete module name at point                   |
    |---------------------+-------------------------------------------------|
    | TAB                 | Complete identifier at point or indent          |
    |                     | (If `geiser-mode-smart-tab-p' is t)             |
    |---------------------+-------------------------------------------------|

*** In the REPL

    |-------------+----------------------------------------------------|
    | C-c C-z     | Start Scheme REPL, or jump to previous buffer      |
    |-------------+----------------------------------------------------|
    | C-c C-q     | Kill Scheme process                                |
    |-------------+----------------------------------------------------|
    | M-.         | Edit identifier at point                           |
    |-------------+----------------------------------------------------|
    | TAB, M-TAB  | Complete identifier at point                       |
    |-------------+----------------------------------------------------|
    | M-`, C-.    | Complete module name at point                      |
    |-------------+----------------------------------------------------|
    | M-p, M-n    | Prompt history, matching current prefix            |
    |-------------+----------------------------------------------------|
    | C-c C-k     | Nuke REPL: use it if the REPL becomes unresponsive |
    |-------------+----------------------------------------------------|
    | C-c C-m     | Set current module                                 |
    |-------------+----------------------------------------------------|
    | C-c C-i     | Import module into current namespace               |
    |-------------+----------------------------------------------------|
    | C-c C-l     | Load scheme file                                   |
    |-------------+----------------------------------------------------|
    | C-c C-d C-d | See documentation for symbol at point              |
    |-------------+----------------------------------------------------|
    | C-c C-d C-m | See documentation for module                       |
    |-------------+----------------------------------------------------|
    | C-c C-d C-a | Toggle autodoc mode                                |
    |-------------+----------------------------------------------------|

*** In the documentation browser:

    |------------+----------------------------------------------|
    | n, f       | Next page                                    |
    |------------+----------------------------------------------|
    | p, b       | Previous page                                |
    |------------+----------------------------------------------|
    | TAB, S-TAB | Next/previous link                           |
    |------------+----------------------------------------------|
    | k          | Kill current page and go to previous or next |
    |------------+----------------------------------------------|
    | g, r       | Refresh page                                 |
    |------------+----------------------------------------------|
    | c          | Clear browsing history                       |
    |------------+----------------------------------------------|
    | ., M-.     | Edit identifier at point                     |
    |------------+----------------------------------------------|
    | z          | Switch to REPL                               |
    |------------+----------------------------------------------|
    | q          | Bury buffer                                  |
    |------------+----------------------------------------------|

*** In backtrace (evaluation/compile result) buffers:

    - TAB, M-TAB for error navigation.
    - q to bury buffer.