~ubuntu-branches/ubuntu/trusty/xemacs21-packages/trusty

« back to all changes in this revision

Viewing changes to .pc/texinfo5-fixes/xemacs-packages/sml-mode/sml-mode.texi

  • Committer: Package Import Robot
  • Author(s): Mark Brown
  • Date: 2013-11-17 14:40:05 UTC
  • mfrom: (1.2.7) (2.1.6 sid)
  • Revision ID: package-import@ubuntu.com-20131117144005-53gvcz47wugzpp33
Tags: 2009.02.17.dfsg.2-1
* New maintainer, reupload to archive.  This is mostly the previous
  packaging with RC bug fixes - a bunch of additional work needs to
  be done to modernise this (closes: #729717).
* Remove yet more non-free docs (closes: #695799, #709501).
* Fix many build failures due to texinfo5.  Some of these fixes are
  far from ideal and will need to be revisited (closes: #712316).
* Convert to v3.0 (quilt).
* Delete some extra generated files in auctex on clean.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
\input texinfo @c -*-texinfo-*-
 
2
 
 
3
@comment "@(#)$Name:  $:$Id: sml-mode.texi,v 1.8 2003/01/12 19:19:24 monnier Exp $"
 
4
 
 
5
@comment Documentation for the GNU Emacs SML mode.
 
6
@comment Copyright (C) 1997-1999 Matthew J.@: Morley
 
7
 
 
8
@comment This file is part of the sml-mode distribution.
 
9
 
 
10
@comment sml-mode is free software; you can redistribute it and/or modify
 
11
@comment it under the terms of the GNU General Public License as published by
 
12
@comment the Free Software Foundation; either version 2 of the License,
 
13
@comment or (at your option) any later version.
 
14
 
 
15
@comment sml-mode is distributed in the hope that it will be useful,
 
16
@comment but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
18
@comment GNU General Public License for more details.
 
19
 
 
20
@comment You should have received a copy of the GNU General Public License
 
21
@comment along with sml-mode; see the file COPYING.  If not, write to
 
22
@comment the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 
23
 
 
24
@setfilename sml-mode.info
 
25
@settitle SML mode - The Emacs SML editing mode
 
26
@dircategory Emacs
 
27
@direntry
 
28
* sml: (sml-mode).      Emacs mode for editing SML
 
29
@end direntry
 
30
@setchapternewpage on
 
31
 
 
32
@titlepage
 
33
@sp 5
 
34
@center @titlefont{Editing and Running Standard ML}
 
35
@center @titlefont{under GNU Emacs}
 
36
@sp 5
 
37
@center {SML mode, Version $Name:  $}
 
38
@center {August 1999}
 
39
@sp 2
 
40
@author Authors: Matthew J.@: Morley and Stefan Monnier
 
41
 
 
42
@page
 
43
@vskip 0pt plus 1filll
 
44
Copyright @copyright{} (Anon) 
 
45
 
 
46
@sp 1
 
47
@noindent
 
48
GNU General Public License as published by the Free Software Foundation;
 
49
either version 2, or (at your option) any later version.
 
50
 
 
51
@sp 1
 
52
@noindent
 
53
SML mode is distributed in the hope that it will be useful, but
 
54
WITHOUT ANY WARRANTY; without even the implied warranty of
 
55
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 
56
Public License for more details.
 
57
 
 
58
@sp 1
 
59
@noindent
 
60
You should have received a copy of the GNU General Public License along
 
61
with GNU Emacs; see the file COPYING. If not, write to the Free Software
 
62
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 
63
 
 
64
@end titlepage
 
65
 
 
66
@setchapternewpage off
 
67
@headings double
 
68
 
 
69
@c ============================================================ TOP NODE
 
70
 
 
71
@node Top, Copying, (dir), (dir)
 
72
 
 
73
@ifinfo
 
74
@chapter SML Mode Info
 
75
 
 
76
@c == Top, Copying, (dir), (dir) =======================================
 
77
 
 
78
@noindent
 
79
You are looking at the top node of the Info tree documenting
 
80
@sc{sml-mode} (Version $Name:  $). Not all functions are documented here, but
 
81
those that aren't you probably won't miss. All commands and settable
 
82
variables have built-in documentation, as per usual Emacs conventions.
 
83
@end ifinfo
 
84
 
 
85
@menu
 
86
* Copying::             You can copy SML mode
 
87
* Introduction::        Setting things up
 
88
* SML Mode::            Editing SML source
 
89
* Interaction Mode::    Running ML processes
 
90
* Configuration::       Menus, highlighting, setting defaults
 
91
 
 
92
Indexes
 
93
* Command Index::       Commands you can invoke
 
94
* Variable Index::      Variables you can set
 
95
* Key Index::           Default keybindings
 
96
 
 
97
Introduction
 
98
* Contributors::        Who did what
 
99
* Getting Started::     What to tell Emacs
 
100
* Getting Help::        How Emacs can help
 
101
 
 
102
SML Mode
 
103
* Basics::              On entering SML mode
 
104
* Indentation::         Prettying SML text
 
105
* Magic Insertion::     Templates and electric keys
 
106
* SML Mode Defaults::   Variables controlling indentation
 
107
 
 
108
Interaction Mode
 
109
* Running ML::          Commands to run the ML compiler in a buffer
 
110
* ML Interaction::      Sending program fragments to the compiler
 
111
* Tracking Errors::     Finding reported syntax errors
 
112
* Process Defaults::    Setting defaults for process interaction
 
113
 
 
114
Configuration
 
115
* Hooks::               Creating hooks
 
116
* Key Bindings::        Binding commands to keys
 
117
* Highlighting::        Syntax colouring
 
118
* Advanced Topics::     You may need to speak Emacs Lisp
 
119
@end menu
 
120
 
 
121
 
 
122
@c ============================================================= COPYING
 
123
 
 
124
@node Copying, Introduction, Top, Top
 
125
 
 
126
@ifinfo
 
127
@chapter Copying
 
128
 
 
129
@c == Copying, Introduction, Top, Top ==================================
 
130
 
 
131
@noindent
 
132
You can freely copy, modify and redistribute SML mode because it's
 
133
made available under the liberal terms of the GNU General Public
 
134
License.
 
135
 
 
136
GNU General Public License as published by the Free Software Foundation;
 
137
either version 2, or (at your option) any later version.
 
138
 
 
139
SML mode is distributed in the hope that it will be useful, but
 
140
WITHOUT ANY WARRANTY; without even the implied warranty of
 
141
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 
142
Public License for more details.
 
143
 
 
144
You should have received a copy of the GNU General Public License along
 
145
with GNU Emacs; see the file COPYING. If not, write to the Free Software
 
146
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 
147
 
 
148
@end ifinfo
 
149
 
 
150
 
 
151
 
 
152
 
 
153
@c ======================================================== INTRODUCTION
 
154
 
 
155
@node Introduction, SML Mode, Copying, Top
 
156
 
 
157
@chapter Introduction
 
158
 
 
159
@c == Introduction, SML Mode, Copying, Top =============================
 
160
 
 
161
 
 
162
@noindent
 
163
SML mode is a major mode for Emacs for editing Standard ML. It has
 
164
some novel bugs, and some nice features:
 
165
 
 
166
@itemize @bullet
 
167
@item
 
168
Automatic indentation of sml code---a number of variables to customise
 
169
the indentation.
 
170
@item
 
171
Easy insertion for commonly used templates like let, local, signature,
 
172
and structure declarations, with minibuffer prompting for types and
 
173
expressions.
 
174
@item
 
175
Magic pipe insertion: @code{|} automatically determines if it is used
 
176
in a case or fun construct, and indents the next line as appropriate, 
 
177
inserting @code{=>} or the name of the function.
 
178
@item
 
179
Inferior shell for running ML. There's no need to leave Emacs, just keep
 
180
on editing while the compiler runs in another window.
 
181
@item
 
182
Automatic ``use file'' in the inferior shell---you can send files,
 
183
buffers, or regions of code to the ML subprocess.
 
184
@item
 
185
Menus, and syntax and keyword highlighting supported for Emacs 19 and
 
186
derivatives.
 
187
@item
 
188
Parsing errors from the inferior shell, and repositioning the
 
189
source with next-error---just like in c-mode.
 
190
@item
 
191
SML mode can be easily configured to work with a number of Standard
 
192
ML compilers, and other SML based tools.
 
193
@end itemize
 
194
 
 
195
@menu
 
196
* Contributors::        Who did what
 
197
* Getting Started::     What to tell Emacs
 
198
* Getting Help::        How Emacs can help
 
199
@end menu
 
200
 
 
201
 
 
202
 
 
203
@c ======================================================== CONTRIBUTORS
 
204
 
 
205
@node Contributors, Getting Started, Introduction, Introduction
 
206
 
 
207
@section Contributors to the SML mode
 
208
@cindex Contributors
 
209
@cindex Authors
 
210
 
 
211
Contributions to the package are welcome.  I have limited time to work
 
212
on this project, but I will gladly add any code that you contribute to
 
213
me to this package.
 
214
 
 
215
Although the history of sml-mode is obscure, it seems that
 
216
the following persons have made contributions to sml-mode:
 
217
 
 
218
@itemize @bullet
 
219
@item
 
220
Lars Bo Nielsen wrote the original version of the code, providing the
 
221
sml editing mode and the inferior-sml support.
 
222
 
 
223
@item
 
224
Olin Shivers (@samp{shivers@@ai.mit.edu}) hacked the inferior-sml support
 
225
to use comint and call the whole thing ml-mode.
 
226
 
 
227
@item
 
228
Steven Gilmore supposedly provided some early attempt at menubar support.
 
229
 
 
230
@item
 
231
Matthew J. Morley (@samp{matthew@@verisity.com}) was maintainer for
 
232
a long time (until version 3.4) and provided many additions and fixes in
 
233
all areas.
 
234
 
 
235
@item
 
236
Frederick Knabe (@samp{knabe@@ecrc.de}) provided the original code for
 
237
font-lock and hilite support as well as for proper handling of nested
 
238
comments and of all the string escape sequences.
 
239
 
 
240
@item
 
241
Matthias Blume (@samp{blume@@kurims.kyoto-u.ac.jp}) provided a sml-make
 
242
which was replaced by sml-compile.
 
243
 
 
244
@item
 
245
Monnier Stefan (@samp{monnier@@cs.yale.edu}) completely reworked the
 
246
indentation engine as well as most of the rest of the code and is
 
247
the current maintainer since after version 3.4.
 
248
 
 
249
@end itemize
 
250
 
 
251
 
 
252
@c ===================================================== GETTING STARTED
 
253
 
 
254
@node Getting Started, Getting Help, Contributors, Introduction
 
255
 
 
256
@section Getting started
 
257
 
 
258
@c == Getting Started, Getting Help, Contributors, Introduction ========
 
259
 
 
260
 
 
261
@noindent
 
262
With luck your system administrator will have installed SML mode
 
263
somewhere convenient, so it will just magically all work---you can
 
264
skip the rest of this getting started section. Otherwise you will need
 
265
to tell Emacs where to find all the SML mode @file{.el} files, and
 
266
when to use them. The where is addressed by locating the Lisp code on
 
267
your Emacs Lisp load path---you may have to create a directory for this,
 
268
say @file{/home/mjm/elisp}, and then insert the following lines in your
 
269
@file{/home/mjm/.emacs} file:
 
270
 
 
271
@lisp
 
272
(add-to-list 'load-path "/home/mjm/elisp")
 
273
(autoload 'sml-mode "sml-mode" "Major mode for editing SML." t)
 
274
(autoload 'run-sml "sml-proc" "Run an inferior SML process." t)
 
275
@end lisp
 
276
 
 
277
@noindent
 
278
The first line adjusts Emacs' internal search path so it can locate the
 
279
Lisp source you have copied to that directory; the second and third
 
280
lines tell Emacs to load the code automatically when it is needed. You
 
281
can then switch any Emacs buffer into SML mode by entering the command
 
282
 
 
283
@example
 
284
M-x sml-mode
 
285
@end example
 
286
 
 
287
@noindent
 
288
It is usually more convenient to have Emacs automatically place the
 
289
buffer in SML mode whenever you visit a file containing ML
 
290
programs. The simplest way of achieving this is to put something like
 
291
 
 
292
@lisp
 
293
(add-to-list 'auto-mode-alist '("\\.\\(sml\\|sig\\)\\'" . sml-mode))
 
294
@end lisp
 
295
 
 
296
@noindent
 
297
also in your @file{.emacs} file. Subsequently (after a restart), any
 
298
files with these extensions will be placed in SML mode buffers when
 
299
you visit them.
 
300
 
 
301
 
 
302
You may want to pre-compile the @file{sml-*.el} files (@kbd{M-x
 
303
byte-compile-file}) for greater speed---byte compiled code loads and
 
304
runs somewhat faster.
 
305
 
 
306
 
 
307
@c ======================================================== GETTING HELP
 
308
 
 
309
@node Getting Help, , Getting Started, Introduction
 
310
 
 
311
@section Help!
 
312
 
 
313
@c == Getting Help, , Getting Started, Introduction ====================
 
314
 
 
315
 
 
316
@noindent
 
317
You're reading it. Apart from the on-line info tree (@kbd{C-h i} is the
 
318
Emacs key to enter the @code{info} system---you should follow the brief
 
319
tutorial if this is unfamiliar), there are further details on specific
 
320
commands in their documentation strings. Only the most useful
 
321
SML mode commands are documented in the info tree: to find out more
 
322
use Emacs' help facilities.
 
323
 
 
324
Briefly, to get help on a specific function use @kbd{C-h f} and enter
 
325
the command name. All (almost all, then) SML mode commands begin
 
326
with @code{sml-}, so if you type this and press @key{TAB} (for
 
327
completion) you will get a list of all commands. Another way is to use
 
328
@kbd{C-h a} and enter the string @code{sml}. This is command apropos; it
 
329
will list all commands with that sub-string in their names, and any key
 
330
binding they may have in the current buffer. Command apropos gives a
 
331
one-line synopsis of what each command does.
 
332
 
 
333
Some commands are also variables---such things are allowed in Lisp, if
 
334
not in ML! @xref{Command Index}, for a list of (info) documented
 
335
functions. @xref{Variable Index}, for a list of user settable variables
 
336
to control the behaviour of SML mode.
 
337
 
 
338
Before accessing this information on-line from within Emacs you may have
 
339
to set the variable @code{sml-mode-info}. Put in your @file{.emacs} file
 
340
something like:
 
341
 
 
342
@vindex sml-mode-info
 
343
@findex sml-mode-info
 
344
@kindex @kbd{C-c C-i}
 
345
@lisp
 
346
(setq sml-mode-info "/home/mjm/info/sml-mode.info")
 
347
@end lisp
 
348
 
 
349
@noindent
 
350
When different from the default this variable should be a string giving
 
351
the absolute name of the @file{.info} file. Then @kbd{C-c C-i} in
 
352
SML mode (i.e., the command @kbd{M-x sml-mode-info}) will bring up
 
353
the manual. This help is also accessible from the menu. (Resetting this
 
354
variable will not be necessary if your site administrator has been kind
 
355
enough to install SML mode and its attendant documentation in the
 
356
Emacs hierarchy.)
 
357
 
 
358
 
 
359
@c ============================================================ SML MODE
 
360
 
 
361
@node SML Mode, Interaction Mode, Introduction, Top
 
362
 
 
363
@chapter Editing with SML Mode
 
364
 
 
365
@c == SML Mode, Interaction Mode, Introduction, Top ====================
 
366
 
 
367
 
 
368
@noindent
 
369
Now SML mode provides just a few additional editing commands. Most of
 
370
the work has gone into implementing the indentation algorithm which, if
 
371
you think about it, has to be complicated for a language like
 
372
ML. @xref{SML Mode Defaults,,Indentation Defaults}, for details on how
 
373
to control some of the behaviour of the indentation algorithm. Principal
 
374
goodies are the `electric pipe' feature, and the ability to insert
 
375
common SML forms (macros or templates).
 
376
 
 
377
@menu
 
378
* Basics::              On entering SML mode
 
379
* Indentation::         Prettying SML text
 
380
* Magic Insertion::     Templates and electric keys
 
381
* SML Mode Defaults::   Variables controlling indentation
 
382
@end menu
 
383
 
 
384
 
 
385
@c ============================================================== BASICS
 
386
 
 
387
@node Basics, Indentation, SML Mode, SML Mode
 
388
 
 
389
@section On entering SML mode
 
390
 
 
391
@c == Basics, Indentation, SML Mode, SML Mode ==========================
 
392
 
 
393
@noindent
 
394
 
 
395
 
 
396
@deffn Command sml-mode
 
397
This switches a buffer into SML mode. This is a @emph{major mode} in
 
398
Emacs. To get out of SML mode the buffer's major mode must be set to
 
399
something else, like @t{text-mode}. @xref{Getting Started}, for details
 
400
on how to set this up automatically when visiting an SML file.
 
401
@end deffn
 
402
 
 
403
Emacs is all hooks of course. A hook is a variable: if the variable is
 
404
non-nil it binds a list of Emacs Lisp functions to be run in some order
 
405
(usually left to right). You can customise SML mode with these
 
406
hooks:
 
407
 
 
408
 
 
409
@defvr Hook sml-mode-hook
 
410
Default: @code{nil}
 
411
 
 
412
This is run every time a new SML mode buffer is created (or if you
 
413
type @kbd{M-x sml-mode}). This is one place to put your preferred key
 
414
bindings. @xref{Configuration}, for some examples.
 
415
@end defvr
 
416
 
 
417
 
 
418
@c ========================================================= INDENTATION
 
419
 
 
420
@node Indentation, Magic Insertion, Basics, SML Mode
 
421
 
 
422
@section Automatic indentation
 
423
 
 
424
@c == Indentation, Magic Insertion, Basics, SML Mode ===================
 
425
 
 
426
 
 
427
@noindent
 
428
ML is a complicated language to parse, let alone compile. The
 
429
indentation algorithm is a little wooden (for some tastes), and the best
 
430
advice is not to fight it! There are several variables that can be
 
431
adjusted to control the indentation algorithm (@pxref{SML Mode
 
432
Defaults,,Customising SML Mode}, below).
 
433
 
 
434
 
 
435
@deffn Command indent-for-tab-command
 
436
Key: @key{TAB}
 
437
@kindex @key{TAB}
 
438
 
 
439
This command indents the current line. If you set the indentation of the
 
440
previous line by hand, @code{indent-for-tab-command} will indent relative to
 
441
this setting.
 
442
@end deffn
 
443
 
 
444
 
 
445
@deffn Command indent-region
 
446
Key: @kbd{C-M-\}
 
447
@kindex @kbd{C-M-\}
 
448
 
 
449
Indent the current region. Be patient if the region is large (like the
 
450
whole buffer).
 
451
@end deffn
 
452
 
 
453
 
 
454
@deffn Command sml-back-to-outer-indent
 
455
Key: @kbd{M-@key{TAB}}
 
456
@kindex @kbd{M-@key{TAB}}
 
457
 
 
458
Unindents the line to the next outer level of indentation.
 
459
@end deffn
 
460
 
 
461
 
 
462
 
 
463
Further indentation commands that Emacs provides (generically, for all
 
464
modes) that you may like to recall:
 
465
 
 
466
@itemize @minus
 
467
@item
 
468
@kbd{M-x newline-and-indent}
 
469
 
 
470
On @key{LFD} by default.
 
471
@kindex @key{LFD}
 
472
Insert a newline, then indent according to the major mode. @xref{Program
 
473
Indent,,Indentation for Programs,emacs,The Emacs Editor Manual}, for
 
474
details.
 
475
 
 
476
@item
 
477
@kbd{M-x indent-rigidly}
 
478
 
 
479
On @kbd{C-x @key{TAB}} by default.
 
480
@kindex @kbd{C-x @key{TAB}}
 
481
Moves all lines in the region right by its argument (left, for negative
 
482
arguments). @xref{Indentation,,,emacs,The Emacs Editor Manual}.
 
483
 
 
484
@item
 
485
@kbd{M-x indent-for-comment} 
 
486
 
 
487
On @kbd{M-;} by default.
 
488
@kindex @kbd{M-;}
 
489
Indent this line's comment to comment column, or insert an empty
 
490
comment. @xref{Comment Commands,,,emacs,The Emacs Editor
 
491
Manual}.
 
492
 
 
493
@item
 
494
@kbd{M-x indent-new-comment-line}
 
495
 
 
496
On @kbd{M-@key{LFD}} by default.
 
497
@kindex @kbd{M-@key{LFD}}
 
498
Break line at point and indent, continuing comment if within one.
 
499
@xref{Multi-Line Comments,,,emacs,The Emacs Editor Manual}.
 
500
@end itemize
 
501
 
 
502
@kindex @kbd{C-x ;}
 
503
As with other language modes, @kbd{M-;} gives you a comment at the end
 
504
of the current line. The column where the comment starts is determined
 
505
by the variable @code{comment-column}---default is 40, but it can be
 
506
changed with @code{set-comment-column} (on @kbd{C-x ;} by default).
 
507
 
 
508
 
 
509
@c ===================================================== MAGIC INSERTION
 
510
 
 
511
@node Magic Insertion, SML Mode Defaults, Indentation, SML Mode
 
512
 
 
513
@section Electric features
 
514
 
 
515
@c == Magic Insertion, SML Mode Defaults, Indentation, SML Mode ========
 
516
 
 
517
 
 
518
@noindent
 
519
Electric keys are generally pretty irritating, so those provided by
 
520
SML mode are fairly muted. The only truly electric key is @kbd{;},
 
521
and this has to be enabled to take effect.
 
522
 
 
523
 
 
524
@deffn Command sml-electric-pipe
 
525
Key: @kbd{M-|}
 
526
@kindex @kbd{M-|}
 
527
 
 
528
When the point is in a `case' statement this opens a new line, indents
 
529
and inserts @code{| =>} leaving point just before the double arrow; if
 
530
the enclosing construct is a `fun' declaration, the newline is indented
 
531
and the function name copied at the appropriate column. Generally, try
 
532
it whenever a @code{|} is wanted---you'll like it!
 
533
@end deffn
 
534
 
 
535
@deffn Command sml-electric-space
 
536
Key: @kbd{M-SPC}
 
537
@kindex @kbd{M-SPC}
 
538
 
 
539
When the point is after a keyword like `let', this inserts the
 
540
corresponding predefined skeleton if one exists.  Else it just inserts a
 
541
space.  Another way to insert those skeletons is to use
 
542
@code{sml-insert-form}, described below.
 
543
@end deffn
 
544
 
 
545
@deffn Command sml-electric-semi
 
546
Key: @kbd{;}
 
547
@kindex @kbd{;}
 
548
 
 
549
Just inserts a semi-colon, usually. The behaviour of this command is
 
550
governed by the variable @code{sml-electric-semi-mode}.
 
551
@end deffn
 
552
 
 
553
 
 
554
@defvr Variable sml-electric-semi-mode
 
555
Default: @code{nil}
 
556
 
 
557
If this variable is @code{nil}, @code{sml-electric-semi} just inserts a
 
558
semi-colon, otherwise it inserts a semi-colon and a newline, and indents
 
559
the newline for SML.
 
560
@end defvr
 
561
 
 
562
 
 
563
@deffn Command sml-insert-form
 
564
Key: @kbd{C-c @key{RET}}
 
565
@kindex @kbd{C-c @key{RET}}
 
566
 
 
567
Interactive short-cut to insert common ML forms (a.k.a.@: macros, or
 
568
templates). Recognised forms are `let', `local', `case', `abstype',
 
569
`datatype', `signature', `structure', and `functor'. Except for `let'
 
570
and `local', these will prompt for appropriate parameters like functor
 
571
name and signature, etc.. This command prompts in the mini-buffer, with
 
572
completion.
 
573
 
 
574
By default @kbd{C-c @key{RET}} will insert at point, with the
 
575
indentation of the current column; if you give a prefix argument (i.e.,
 
576
@kbd{C-u C-c @key{RET}}) the command will insert a newline first,
 
577
indent, and then insert the template.
 
578
@end deffn
 
579
 
 
580
@code{sml-insert-form} is also extensible: see @ref{Configuration} for
 
581
further details.
 
582
 
 
583
 
 
584
 
 
585
@c ======================================================= MODE DEFAULTS
 
586
 
 
587
@node SML Mode Defaults, , Magic Insertion, SML Mode
 
588
 
 
589
@section Indentation defaults
 
590
 
 
591
@c == SML Mode Defaults, , Magic Insertion, SML Mode ===================
 
592
 
 
593
 
 
594
@noindent
 
595
Several variables try to control the indentation algorithm and other
 
596
features of SML mode.  Most of them are still in flux so they are not
 
597
described here yet.
 
598
If the default values are not acceptable you can set these variables
 
599
permanently in your @file{.emacs} file. @xref{Configuration}, for
 
600
details and examples.
 
601
 
 
602
 
 
603
@defvr Variable sml-indent-level
 
604
@findex sml-indent-level
 
605
Default: @code{4}
 
606
 
 
607
This variable controls the block indentation level.
 
608
@end defvr
 
609
 
 
610
@c end vtable
 
611
 
 
612
 
 
613
@c ========================================================= INTERACTION
 
614
 
 
615
@node Interaction Mode, Configuration, SML Mode, Top
 
616
 
 
617
@chapter Running ML under Emacs
 
618
 
 
619
@c == Interaction Mode, Configuration, SML Mode, Top ===================
 
620
 
 
621
 
 
622
@noindent
 
623
The most useful feature of SML mode is that it provides a convenient
 
624
interface to the compiler. How serious users of ML put up with a
 
625
teletype interface to the compiler is beyond me@.@.@. but perhaps there
 
626
are other interfaces to compilers that require one to part with serious
 
627
money. Such remarks can quickly become dated---in this case, let's hope
 
628
so!
 
629
 
 
630
Anyway, SML mode provides an interaction mode,
 
631
@code{inferior-sml-mode}, where the compiler runs in a separate buffer
 
632
in a window or frame of its own. You can use this buffer just like a
 
633
terminal, but it's usually more convenient to mark some text in the
 
634
SML mode buffer and have Emacs communicate with the sub-process. The
 
635
features discussed below are syntax-independent, so they should work
 
636
with a wide range of ML-like tools and compilers. @xref{Process
 
637
Defaults}, for some hints.
 
638
 
 
639
@findex inferior-sml-mode
 
640
@code{inferior-sml-mode} is a specialisation of the @file{comint}
 
641
package that comes with Emacs and XEmacs.
 
642
 
 
643
 
 
644
@menu
 
645
* Running ML::          Commands to run the ML compiler in a buffer
 
646
* ML Interaction::      Sending program fragments to the compiler
 
647
* Tracking Errors::     Finding reported syntax errors
 
648
* Process Defaults::    Setting defaults for process interaction
 
649
@end menu
 
650
 
 
651
 
 
652
 
 
653
@c ========================================================== RUNNING ML
 
654
 
 
655
@node Running ML, ML Interaction, Interaction Mode, Interaction Mode
 
656
 
 
657
@section Starting the compiler
 
658
 
 
659
@c == Running ML, ML Interaction, Interaction Mode, Interaction Mode ==
 
660
 
 
661
@noindent
 
662
Start your favourite ML compiler with the command
 
663
 
 
664
@example
 
665
@kbd{M-x run-sml}
 
666
@end example
 
667
 
 
668
@noindent
 
669
This creates a process interaction buffer that inherits some key
 
670
bindings from SML mode and from @file{comint} (@pxref{Shell Mode, ,
 
671
, emacs, The Emacs Editor Manual}). Starting the ML compiler adds some
 
672
functions to SML mode buffers so that program text can be
 
673
communicated between editor and compiler (@pxref{ML Interaction}).
 
674
 
 
675
The name of the ML compiler is the first thing you should know how to
 
676
specify:
 
677
 
 
678
 
 
679
@defvar sml-program-name
 
680
Default: @code{"sml"}
 
681
 
 
682
The program to run as ML. You might need to specify the full path name
 
683
of the program.
 
684
@end defvar
 
685
 
 
686
 
 
687
@defvar sml-default-arg
 
688
Default: @code{""}
 
689
 
 
690
Useful for Poly/ML users who may supply a database file, or others who
 
691
have wrappers for setting various options around the command to run the
 
692
compiler. Moscow ML people might set this to @code{"-P full"}, etc..
 
693
@end defvar
 
694
 
 
695
The variable @code{sml-program-name} is a string holding the name
 
696
of the program @emph{as you would type it at the shell}. You 
 
697
can always choose a program different to the default by invoking
 
698
 
 
699
@example
 
700
@kbd{C-u M-x run-sml}
 
701
@end example
 
702
 
 
703
@noindent
 
704
With the prefix argument Emacs will prompt for the command name and any
 
705
command line arguments to pass to the compiler. Thereafter Emacs will
 
706
use this new name as the default, but for a permanent change you should
 
707
set this in your @file{.emacs} with, e.g.:
 
708
 
 
709
@lisp
 
710
(setq sml-program-name "nj-sml")
 
711
@end lisp
 
712
 
 
713
 
 
714
@deffn Command run-sml
 
715
Launches ML as an inferior process in another buffer; if an ML process
 
716
already exists, just switch to the process buffer. A prefix argument
 
717
allows you to edit the command line to specify the program, and any
 
718
command line options.
 
719
@end deffn
 
720
 
 
721
 
 
722
@defvr Hook inferior-sml-mode-hook
 
723
Default: @code{nil}
 
724
 
 
725
@kbd{M-x run-sml} runs @code{comint-mode-hook} and
 
726
@code{inferior-sml-mode-hook} hooks in that order, but @emph{after} the
 
727
compiler is started. Use @code{inferior-sml-mode-hook} to set any
 
728
@code{comint} buffer-local configurations for SML mode you like.
 
729
@end defvr
 
730
 
 
731
 
 
732
@deffn Command switch-to-sml
 
733
Key: @kbd{C-c C-s}
 
734
@kindex @kbd{C-c C-s}
 
735
 
 
736
Switch from the SML buffer to the interaction buffer. By default point
 
737
will be placed at the end of the process buffer, but a prefix argument
 
738
will leave point wherever it was before. If you try @kbd{C-c C-s} before
 
739
an ML process has been started, you'll just get an error message to the
 
740
effect that there's no current process buffer.
 
741
@end deffn
 
742
 
 
743
 
 
744
@deffn Command sml-cd
 
745
When started, the ML compiler's default working directory is the
 
746
current buffer's default directory. This command allows the working
 
747
directory to be changed, if the compiler can do this. The variable
 
748
@code{sml-cd-command} specifies the compiler command to invoke
 
749
(@pxref{Process Defaults}).
 
750
@end deffn
 
751
 
 
752
 
 
753
@c ======================================================== SENDING TEXT
 
754
 
 
755
@node ML Interaction, Tracking Errors, Running ML, Interaction Mode
 
756
 
 
757
@section Speaking to the compiler
 
758
 
 
759
@c == ML Interaction, Tracking Errors, Running ML, Interaction Mode ====
 
760
 
 
761
 
 
762
@noindent
 
763
Several commands are defined for sending program fragments to the
 
764
running compiler. Each of the following commands takes a prefix argument
 
765
that will switch the input focus to the process buffer afterwards
 
766
(leaving point at the end of the buffer):
 
767
 
 
768
 
 
769
@deffn Command sml-load-file
 
770
Key: @kbd{C-c C-l}
 
771
@kindex @kbd{C-c C-l}
 
772
 
 
773
Send a `use file' command to the current ML process. The variable
 
774
@code{sml-use-command} is used to define the correct template for the
 
775
command to invoke (@pxref{Process Defaults}). The default file is the
 
776
file associated with the current buffer, or the last file loaded if you
 
777
are in the interaction buffer.
 
778
@end deffn
 
779
 
 
780
 
 
781
 
 
782
@deffn Command sml-send-region
 
783
@findex sml-send-region-and-go
 
784
Key: @kbd{C-c C-r}
 
785
@kindex @kbd{C-c C-r}
 
786
 
 
787
Send the current region of text in the SML buffer.
 
788
@code{sml-send-region-and-go} is a similar command for you to bind in
 
789
SML mode if you wish: it'll send the region and then switch-to-sml.
 
790
@end deffn
 
791
 
 
792
@c @deffn Command sml-send-function
 
793
@c @findex sml-send-function-and-go
 
794
 
 
795
@c Send the enclosing `function' definition. Contrary to the suggestive
 
796
@c name, this command @emph{does not} try to determine the extent of the
 
797
@c function definition because that is too difficult with ML. Instead
 
798
@c this just sends the enclosing @emph{paragraph} (delimited by blank
 
799
@c lines or form-feed characters).
 
800
@c @end deffn
 
801
 
 
802
@deffn Command sml-send-buffer
 
803
Key: @kbd{C-c C-b}
 
804
@kindex @kbd{C-c C-b}
 
805
 
 
806
Send the contents of the current buffer to ML.
 
807
@end deffn
 
808
 
 
809
@c ===================================================== TRACKING ERRORS
 
810
 
 
811
@node Tracking Errors, Process Defaults, ML Interaction, Interaction Mode
 
812
 
 
813
@section Finding errors
 
814
 
 
815
@c == Tracking Errors, Process Defaults, ML Interaction, Interaction Mode
 
816
 
 
817
 
 
818
@noindent
 
819
SML mode provides one customisable function for locating the source
 
820
position of errors reported by the compiler. This should work whether
 
821
you type @code{use "puzzle.sml";} into the interaction buffer, or use
 
822
one of the mechanisms provided for sending programs directly to the
 
823
compiler---@pxref{ML Interaction}.
 
824
 
 
825
 
 
826
@deffn Command next-error
 
827
@findex next-error
 
828
Key: @kbd{C-x`}
 
829
@kindex @kbd{C-x`}
 
830
 
 
831
Jump to the source location of the next error reported by the compiler.
 
832
All the usual error-navigation commands are available, see
 
833
@pxref{Compilation Mode, , , emacs, The Emacs Editor Manual}.
 
834
@end deffn
 
835
 
 
836
 
 
837
@c ==================================================== PROCESS DEFAULTS
 
838
 
 
839
@node Process Defaults, , Tracking Errors, Interaction Mode
 
840
 
 
841
@section Process defaults
 
842
 
 
843
@c == Process Defaults, , Tracking Errors, Interaction Mode ============
 
844
 
 
845
@noindent
 
846
The process interaction code is independent of the compiler used,
 
847
deliberately, so SML mode will work with a variety of ML compilers
 
848
and ML-based tools. There are therefore a number of variables that may
 
849
need to be set correctly before SML mode can speak to the compiler.
 
850
Things are by default set up for Standard ML of New Jersey, but
 
851
switching to a new system is quite easy.
 
852
 
 
853
 
 
854
 
 
855
@defvar sml-use-command
 
856
Default: @code{"use \"%s\""}
 
857
 
 
858
Use file command template. Emacs will replace the @code{%s} with a file
 
859
name. Note that Emacs requires double quote characters inside strings
 
860
to be quoted with a backslash.
 
861
@end defvar
 
862
 
 
863
 
 
864
@defvar sml-cd-command
 
865
Default: @code{"OS.FileSys.chDir \"%s\""}
 
866
 
 
867
Compiler command to change the working directory. Not all ML systems
 
868
support this feature (well, Edinburgh (core) ML didn't), but they
 
869
should.
 
870
@end defvar
 
871
 
 
872
 
 
873
@defvar sml-prompt-regexp
 
874
Default: @code{"^[-=>#] *"}
 
875
 
 
876
Matches the ML compiler's prompt: @file{comint} uses this for various
 
877
purposes.
 
878
@end defvar
 
879
 
 
880
 
 
881
To customise error reportage for different ML compilers you need to set
 
882
two further variables before @code{next-error} can be useful:
 
883
 
 
884
 
 
885
@defvar sml-error-regexp-alist
 
886
 
 
887
Alist that specifies how to match errors in compiler output.
 
888
Each elt has the form (REGEXP FILE-IDX LINE-IDX [COLUMN-IDX FILE-FORMAT...])
 
889
If REGEXP matches, the FILE-IDX'th subexpression gives the file name, and
 
890
the LINE-IDX'th subexpression gives the line number.  If COLUMN-IDX is
 
891
given, the COLUMN-IDX'th subexpression gives the column number on that line.
 
892
If any FILE-FORMAT is given, each is a format string to produce a file name to
 
893
try; %s in the string is replaced by the text matching the FILE-IDX'th
 
894
subexpression.
 
895
@end defvar
 
896
 
 
897
 
 
898
@c A typical way of (re)setting these variables correctly is to put
 
899
@c something in your @file{.emacs} file that resembles
 
900
 
 
901
@c @example
 
902
@c (setq sml-use-command "PolyML.use \"%s\"")
 
903
@c (setq sml-prompt-regexp "^[>#] *")
 
904
@c @end example
 
905
 
 
906
@c ======================================================= CONFIGURATION
 
907
 
 
908
@node Configuration, , Interaction Mode, Top
 
909
 
 
910
@chapter Configuration Summary
 
911
 
 
912
@c @footnote{@url{http://www.ahl.co.uk/}}
 
913
@c @footnote{@url{http://www.dina.kvl.dk/~sestoft/mosml.html}}
 
914
 
 
915
@noindent
 
916
This (sort of pedagogic) section gives more information on how to
 
917
configure SML mode: menus, key bindings, hooks and highlighting are
 
918
discussed, along with a few other random topics.
 
919
 
 
920
@menu
 
921
* Hooks::               Creating them
 
922
* Key Bindings::        Binding commands to keys
 
923
* Highlighting::        Syntax colouring
 
924
* Advanced Topics::     You may need to speak Emacs Lisp
 
925
@end menu
 
926
 
 
927
 
 
928
@c =============================================================== HOOKS
 
929
 
 
930
@node Hooks, Key Bindings, Configuration, Configuration
 
931
 
 
932
@section Hooks
 
933
 
 
934
@c == Hooks, Key Bindings, Configuration, Configuration ================
 
935
 
 
936
 
 
937
@noindent
 
938
One way to set SML mode variables (@pxref{SML Mode
 
939
Defaults,,Indentation Defaults}), and other defaults, is through the
 
940
@code{sml-mode-hook} in your @file{.emacs}. A simple example:
 
941
 
 
942
@lisp
 
943
(defun my-sml-mode-hook () "Local defaults for SML mode"
 
944
  (setq sml-indent-level 2)        ; conserve on horizontal space
 
945
  (setq words-include-escape t)    ; \ loses word break status
 
946
  (setq indent-tabs-mode nil))     ; never ever indent with tabs
 
947
(add-hook 'sml-mode-hook 'my-sml-mode-hook)
 
948
@end lisp
 
949
@noindent
 
950
The body of @code{my-sml-mode-hook} is a sequence of assignments. In this
 
951
case it is not really necessary to set @code{sml-indent-level} in a hook
 
952
because this variable is global (most SML mode variables are). With
 
953
similar effect:
 
954
 
 
955
@lisp
 
956
(setq sml-indent-level 2)
 
957
@end lisp
 
958
@noindent
 
959
anywhere in your @file{.emacs} file. The variable @code{indent-tabs-mode} is
 
960
automatically made local to the current buffer whenever it is set
 
961
explicitly, so it @emph{must} be set in a hook if you always want
 
962
SML mode to behave like this.
 
963
 
 
964
Another hook is @code{inferior-sml-mode-hook}. This can be used to
 
965
control the behaviour of the interaction buffer through various
 
966
variables meaningful to @file{comint}-based packages:
 
967
 
 
968
@lisp
 
969
(defun my-inf-sml-mode-hook () "Local defaults for inferior SML mode"
 
970
  (add-hook 'comint-output-filter-functions 'comint-truncate-buffer)
 
971
  (setq      comint-scroll-show-maximum-output t)
 
972
  (setq      comint-input-autoexpand nil))
 
973
(add-hook 'inferior-sml-mode-hook 'my-inf-sml-mode-hook)
 
974
@end lisp
 
975
@noindent
 
976
Again, the body is a sequence of assignments. Unless you run several ML
 
977
compilers simultaneously under one Emacs, this hook will normally only
 
978
get run once. You might want to look up the documentation (@kbd{C-h v}
 
979
and @kbd{C-h f}) for these buffer-local @code{comint} things.
 
980
 
 
981
 
 
982
@c ======================================================== Key Bindings
 
983
 
 
984
@node Key Bindings, Highlighting, Hooks, Configuration
 
985
 
 
986
@section Key bindings
 
987
 
 
988
@noindent
 
989
Customisation (in Emacs) usually entails putting favourite commands on
 
990
easily remembered keys. Two `keymaps' are defined in SML mode: one
 
991
is effective in program text buffers (@code{sml-mode-map}) and the other
 
992
is effective in interaction buffers (@code{inferior-sml-mode-map}).
 
993
The initial design ensures that (many of) the default key bindings from
 
994
the former keymap will also be available in the latter (e.g.,
 
995
@kbd{C-c`}).
 
996
 
 
997
Type @kbd{C-h m} in an SML mode buffer to find the default key
 
998
bindings (and similarly in an ML interaction buffer), and use the hooks
 
999
provided to install your preferred key bindings. Given that the keymaps
 
1000
are global (variables):
 
1001
 
 
1002
@lisp
 
1003
(defun my-sml-mode-hook () "Global defaults for SML mode"
 
1004
  (define-key sml-mode-map "\C-cd" 'sml-cd))
 
1005
(add-hook 'sml-mode-hook 'my-sml-mode-hook)
 
1006
@end lisp
 
1007
@noindent
 
1008
This has the effect of binding @code{sml-cd} to the key @kbd{C-c d}.
 
1009
If you want the same behaviour from @kbd{C-c d} in the ML buffer:
 
1010
 
 
1011
@lisp
 
1012
(defun my-inf-sml-mode-hook () "Global defaults for inferior SML mode"
 
1013
  (define-key inferior-sml-mode-map "\C-cd" 'sml-cd)
 
1014
  ;; NB. for SML/NJ '96
 
1015
  (setq sml-cd-command "OS.FileSys.chDir \"%s\""))
 
1016
(add-hook 'inferior-sml-mode-hook 'my-inf-sml-mode-hook)
 
1017
@end lisp
 
1018
 
 
1019
There is nothing to stop you rebuilding the entire keymap for
 
1020
SML mode and the ML interaction buffer in your @file{.emacs} of
 
1021
course: SML mode won't define @code{sml-mode-map} or
 
1022
@code{inferior-sml-mode-map} if you have already done so. 
 
1023
 
 
1024
 
 
1025
@c ======================================================== Highlighting
 
1026
 
 
1027
@node Highlighting, Advanced Topics, Key Bindings, Configuration
 
1028
 
 
1029
@section Syntax colouring
 
1030
 
 
1031
 
 
1032
@noindent
 
1033
Highlighting is very handy for picking out keywords in the program text,
 
1034
spotting misspelled kewyords, and, if you have Emacs' @file{ps-print}
 
1035
package installed (you usually do these days), obtaining pretty, even
 
1036
colourful code listings---quite properly for your colourful ML programs.
 
1037
 
 
1038
The indentation scheme (strangely enough) also relies on the
 
1039
highlighting code to properly handle nested comments, which is yet
 
1040
another reason to turn on highlighting.  To turn on highlighting,
 
1041
use either of:
 
1042
 
 
1043
@lisp
 
1044
M-x font-lock-mode
 
1045
(add-hook 'sml-mode-hook 'turn-on-font-lock)
 
1046
(global-font-lock-mode 1)
 
1047
@end lisp
 
1048
 
 
1049
The first will turn it on in the current buffer.
 
1050
The second will turn it on in all sml-mode buffers.
 
1051
The last will turn it on everywhere.
 
1052
This is valid for Emacs but maybe not for XEmacs.  Check font-lock
 
1053
documentation if you encounter problems.
 
1054
 
 
1055
@c ===================================================== ADVANCED TOPICS
 
1056
 
 
1057
@node Advanced Topics, , Highlighting, Configuration
 
1058
 
 
1059
@section Advanced Topics
 
1060
 
 
1061
@flushright
 
1062
@emph{These forms are bloody useless; can't we have better ones?}
 
1063
@end flushright
 
1064
 
 
1065
@sp 1
 
1066
@noindent
 
1067
You can indeed. @code{sml-insert-form} is extensible so all you need to
 
1068
do is create the macros yourself. Define a @emph{keybord macro}
 
1069
(@kbd{C-x (} <something> @kbd{C-x )}) and give it a suitable name:
 
1070
@code{sml-addto-forms-alist} prompts for a name, say @code{NAME}, and
 
1071
binds the macro @code{sml-form-NAME}. Thereafter @kbd{C-c @key{RET}
 
1072
NAME} will insert the macro at point, and @kbd{C-u C-c @key{RET} NAME}
 
1073
will insert the macro after a @code{newline-and-indent}. If you want to
 
1074
keep your macros from one editing session to the next, go to your
 
1075
@file{.emacs} file and call @code{insert-kbd-macro}; you'll need
 
1076
to add @code{NAME} to @code{sml-forms-alist} permanently yourself:
 
1077
 
 
1078
@lisp
 
1079
(defun my-sml-mode-hook () "Global defaults for SML mode"
 
1080
  ;; whatever else you do
 
1081
  (add-to-list 'sml-forms-alist '("NAME" . FUNCTION)))
 
1082
@end lisp
 
1083
 
 
1084
If you want to create templates like `case' that prompt for parameters
 
1085
you'll have to do some Lisp programming. The @code{skeleton} package is
 
1086
a good stating point.  Better yet, you can reuse the wrappers used by
 
1087
sml-mode itself in your sml-mode-hook:
 
1088
 
 
1089
@lisp
 
1090
(add-hook 'sml-mode-hook
 
1091
  (lambda ()
 
1092
    (sml-def-skeleton "case" "Case expr: "
 
1093
      str " of" \n _ " => ")))
 
1094
@end lisp
 
1095
 
 
1096
This will redefine `case' in order to leave the `of' on the first line.
 
1097
See the documentation of @code{skeleton-insert} to get a better
 
1098
understanding of how this works.
 
1099
 
 
1100
@sp 1
 
1101
@flushright
 
1102
@emph{I hate that indentation algorithm; can't I tweak it?}
 
1103
@end flushright
 
1104
 
 
1105
@sp 1
 
1106
@noindent
 
1107
Ah, yes, of course, but this manual will not tell you how.
 
1108
 
 
1109
 
 
1110
@sp 1
 
1111
@flushright
 
1112
@emph{Can SML mode handle more than one compiler running at once?}
 
1113
@end flushright
 
1114
 
 
1115
Sure, just rename the @samp{*sml*} buffer and then use @code{run-sml}
 
1116
as usual.
 
1117
 
 
1118
@sp 1
 
1119
@flushright
 
1120
@emph{What needs to be done to support other ML compilers?}
 
1121
@end flushright
 
1122
 
 
1123
@sp 1
 
1124
@noindent
 
1125
Not much really.  Just add the right regular expressions to
 
1126
@code{sml-error-regexp-alist} and that should be all.
 
1127
 
 
1128
 
 
1129
@c ======================================================= COMMAND INDEX
 
1130
 
 
1131
@headings singleafter
 
1132
 
 
1133
@node Command Index, Variable Index, , Top
 
1134
 
 
1135
@unnumbered Command Index
 
1136
 
 
1137
@printindex fn
 
1138
 
 
1139
@c ====================================================== VARIABLE INDEX
 
1140
 
 
1141
@c node Variable Index, , Command Index, Top
 
1142
@node Variable Index, Key Index, Command Index, Top
 
1143
 
 
1144
@unnumbered Variable Index
 
1145
 
 
1146
@c == Variable Index, Key Index, Command Index, Top ====================
 
1147
 
 
1148
@printindex vr
 
1149
 
 
1150
@c =========================================================== KEY INDEX
 
1151
 
 
1152
@node Key Index, , Variable Index, Top
 
1153
 
 
1154
@unnumbered Key Index
 
1155
 
 
1156
@c == Key Index, , Variable Index, Top =================================
 
1157
 
 
1158
@printindex ky
 
1159
 
 
1160
@contents
 
1161
@bye