Annotation of researchv10no/cmd/sml/lib/emacs/sml-mode.doc, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: 
                      4:                                 SML MODE
                      5: 
                      6:                                Version 2.4
                      7: 
                      8: 
                      9:                 A major mode for editing and running SML.
                     10: 
                     11: 
                     12:                              Lars Bo Nielsen
                     13:                             ([email protected])
                     14: 
                     15: 
                     16: 
                     17: Sml-mode is a major GnuEmacs mode for editing and running (Standard) ML
                     18: (sml). It features:
                     19: 
                     20:       o Automatic indentation of sml code. With a number of constants to
                     21:        customize the indentation.   
                     22: 
                     23:       o Short cut insertion of commonly used structures, like
                     24:         "let in end", "signature xxx = sig end", etc.
                     25: 
                     26:       o Short cut insertion of "|". Will automaticly determine if
                     27:         "|" is used after a "case", "fun" etc. If used after a "fun"
                     28:         automaticly insert the name of the function, used after
                     29:         case automaticly insert "=>" etc.
                     30: 
                     31:       o Inferior shell running sml. No need to leave emacs, just
                     32:         keep right on editing while sml runs in another window.
                     33: 
                     34:       o Automatic "use file" in inferior shell. Send regions of code
                     35:         to the running sml program.
                     36: 
                     37:       o Parsing of errors in the inferior shell. Like the next-error
                     38:         function used in c-mode (This will only work with SML of
                     39:         New Jersey).
                     40: 
                     41: 
                     42: 
                     43: 1. HOW TO USE THE SML-MODE
                     44: ==========================
                     45: 
                     46: Here is a short introduction to the mode. If you are an experienced user of
                     47: Emacs, just skip the first section, and go straight to 1.2.
                     48: 
                     49: If you run into any problems, your local emacs-administrator should be able
                     50: to help you.  You are also wellcome to send me a note asking for help.
                     51: 
                     52: 
                     53: 1.1 GETTING STARTED
                     54: -------------------
                     55: 
                     56: The mode for sml is in the file "sml-mode.el". We will have to tell Emacs
                     57: where to find this file and when to use it.
                     58: 
                     59: Insert this in your "~/.emacs" file :
                     60: 
                     61:    (setq auto-mode-alist (cons '("\\.sml$" . sml-mode) 
                     62:                           auto-mode-alist)) 
                     63:    (autoload 'sml-mode "sml-mode" "Major mode for editing SML." t)
                     64: 
                     65: Now every time a file with the extension `.sml' is found, it is
                     66: automatically started up in sml-mode.
                     67: 
                     68: You will also have to specify the path to the "sml-mode.el" file, so you
                     69: will have to add this as well:
                     70: 
                     71:    (setq load-path (cons "/usr/me/emacs" load-path))
                     72: 
                     73: where "/usr/me/emacs" is the directory where the file "sml-mode.el" is
                     74: located.
                     75: 
                     76: You may also want to compile the file (M-x byte-compile-file)
                     77: for speed.
                     78: 
                     79: You are now ready to start using sml-mode. If you have tried other
                     80: language modes (like lisp-mode or C-mode), you should have no
                     81: problems. There are only a few extra functions in this mode.
                     82: 
                     83: 
                     84: 1.2. EDITING COMMANDS.
                     85: ----------------------
                     86: 
                     87: The following editing and inferior-shell commands can ONLY be issued
                     88: from within a buffer in sml-mode. (The names in parenthesis is the
                     89: Emacs-lisp name of the function, that is associated with the keystroke
                     90: command).
                     91: 
                     92: M-| (sml-electric-pipe). 
                     93:     In the case you are typing in a case expression, a function with
                     94:     patterns etc., this function will give you some help. First of all
                     95:     it  will put the `|' on a line by itself. If it is used in the
                     96:     definition of a function it inserts the functions name, else it
                     97:     inserts `=>'. Just try it, you will like it.
                     98: 
                     99: LFD (reindent-then-newline-and-indent).  
                    100:     This is probably the function you will be using the most (press
                    101:     CTRL while you press Return, press C-j or press Newline). It
                    102:     will reindent the line, then make a new line and perform a new
                    103:     indentation.
                    104: 
                    105: TAB (sml-indent-line).  
                    106:     This function indents the current line.
                    107: 
                    108: C-c TAB (sml-indent-region).
                    109:     This function indents the current region (be patient if the
                    110:     region is large).
                    111: 
                    112: M-; (indent-for-comment).
                    113:     Like in other language modes, this command will give you a comment
                    114:     at the of the current line. The column where the comment starts is
                    115:     determined by the variable comment-column (default: 40).
                    116:    
                    117: C-c C-v (sml-mode-version). 
                    118:     Get the version of the sml-mode.
                    119: 
                    120: 
                    121: 1.3. COMMANDS RELATED TO THE INFERIOR SHELL
                    122: -------------------------------------------
                    123: 
                    124: C-c C-s (sml-pop-to-shell).
                    125:     This command starts up an inferior shell running sml. If the shell
                    126:     is running, it will just pop up the shell window.
                    127: 
                    128: C-c C-u (sml-save-buffer-use-file).
                    129:     This command will save the current buffer and send a "use file",
                    130:     where file is the file visited by the current buffer, to the
                    131:     inferior shell running sml.
                    132: 
                    133: C-c i (sml-import-file)
                    134:     Will save the current buffer and send an "import file", where file
                    135:     is the file visited by the current buffer, to the inferior shell
                    136:     running sml. 
                    137: 
                    138: C-c C-f (sml-run-on-file).
                    139:     Will send a "use file" to the inferior shell running sml,
                    140:     prompting you for the file name.
                    141:    
                    142: C-c ' (sml-next-error). 
                    143:     This function parses the buffer of the inferior shell running sml,
                    144:     and finds the errors one by one. The cursor is positioned at the
                    145:     line of the file indicated by the error message, while the
                    146:     inferior shell buffer running sml will be positioned at the error
                    147:     message in another window. 
                    148: 
                    149: C-c C-k (sml-skip-errors)
                    150:     This function will skip past the rest of the error messages in
                    151:     the inferior shell
                    152: 
                    153:     IMPORTANT: These two functions only knows the syntax of error
                    154:     messages produced by SML of New Jersey. To have these functions
                    155:     working with other implementations of sml you will have to
                    156:     rewrite them.
                    157: 
                    158: C-c C-r (sml-send-region). 
                    159:     Will send region, from point to mark, to the inferior shell
                    160:     running sml.
                    161: 
                    162: C-c C-c (sml-send-function). 
                    163:     Will send function to the inferior shell running sml. (This only
                    164:     sends the paragraph, so you might prefer the sml-send-region
                    165:     instead. Paragraphs are separated by blank lines only).
                    166: 
                    167: C-c C-b (sml-send-buffer). 
                    168:     Will send whole buffer to inferior shell running sml.
                    169: 
                    170: 
                    171: 2. INDENTATION
                    172: ==============
                    173: 
                    174: The indentation algorithm has been the hardest one to implement.
                    175: 
                    176:         What is the standard way of indenting sml-code?
                    177: 
                    178: The algorithm has its own view of the right way to indent code,
                    179: according to the constants you can set to control the mode.
                    180: 
                    181: 
                    182: 2.1. CONSTANTS CONTROLLING THE INDENTATION
                    183: ------------------------------------------
                    184: 
                    185: sml-indent-level (default 4)
                    186:     Indentation of blocks in sml.
                    187: 
                    188: sml-pipe-indent (default -2)
                    189:     The amount of extra indentation (negative) of lines beginning
                    190:     with "|". 
                    191: 
                    192: sml-case-indent (default nil)
                    193:     How to indent case-of expressions.
                    194: 
                    195:     If t:   case expr              If nil:   case expr of
                    196:               of exp1 => ...                     exp1 => ...
                    197:                | exp2 => ...                   | exp2 => ...
                    198: 
                    199:     The first seems to be the standard in NJ-SML. The second is the
                    200:     default.
                    201: 
                    202: sml-nested-if-indent (default nil)
                    203:     If set to t, nested if-then-else expressions will have the
                    204:     indentation:
                    205: 
                    206:                if exp1 then exp2
                    207:                else if exp3 then exp4
                    208:                else if exp5 then exp6
                    209:                     else exp7
                    210: 
                    211:     If nil, they will be indented as:
                    212: 
                    213:                if exp1 then exp2
                    214:                else if exp3 then exp4
                    215:                     else if exp5 then exp6
                    216:                          else exp7
                    217: 
                    218:     With the "else" at the same column as the matching "if".
                    219: 
                    220: sml-type-of-indent (default t)
                    221:     Determines how to indent `let', `struct' etc.
                    222:     
                    223:     If t:      fun foo bar = let
                    224:                                  val p = 4
                    225:                              in
                    226:                                  bar + p
                    227:                              end
                    228: 
                    229:     If nil:    fun foo bar = let
                    230:                    val p = 4
                    231:                in
                    232:                    bar + p
                    233:                end
                    234: 
                    235:     Will not have any effect if the starting keyword is first on the
                    236:     line.
                    237: 
                    238: sml-electric-semi-mode (default t)
                    239:     If t, a ";" will reindent the current line, and make a newline. To
                    240:     override this (to type in a ";" without a newline) just type: C-q ;
                    241: 
                    242: sml-paren-lookback (default 200)
                    243:     Determines how far back (in chars) the indentation algorithm
                    244:     should look for open parenthesis. High value means slow
                    245:     indentation algorithm. A value of 200 (being the equivalent of
                    246:     4-6 lines) should suffice most uses. (A value of nil, means do
                    247:     not look at all).
                    248: 
                    249: To change these constants, See CUSTOMIZING YOUR SML-MODE below.
                    250: 
                    251: 
                    252: 3. INFERIOR SHELL.
                    253: ==================
                    254: 
                    255: The mode for Standard ML also contains a mode for an inferior shell
                    256: running sml. The mode is the same as the shell-mode, with just one
                    257: extra command.
                    258: 
                    259: 
                    260: 3.1. INFERIOR SHELL COMMANDS
                    261: ----------------------------
                    262: 
                    263: C-c C-f (sml-run-on-file).  Send a `use file' to the process running
                    264: sml.
                    265: 
                    266: 
                    267: 3.2. CONSTANTS CONTROLLING THE INFERIOR SHELL MODE
                    268: --------------------------------------------------
                    269: 
                    270: Because sml is called differently on various machines, and the
                    271: sml-systems have their own command for reading in a file, a set of
                    272: constants controls the behavior of the inferior shell running sml (to
                    273: change these constants: See CUSTOMIZING YOUR SML-MODE below).
                    274: 
                    275: sml-prog-name (default "sml").
                    276:     This constant is a string, containing the command to invoke
                    277:     Standard ML on your system. 
                    278: 
                    279: sml-prog-name-ask-p (default nil)
                    280:     If t, you will be asked which program to run when the inferior
                    281:     shell starts up. Usefull if you have exported images of sml.
                    282: 
                    283: sml-use-right-delim (default "\"")
                    284: sml-use-left-delim  (default "\"")
                    285:     The left and right delimiter used by your version of sml, for
                    286:     `use file-name'.
                    287: 
                    288: sml-process-name (default "SML"). 
                    289:     The name of the process running sml. (This will be the name
                    290:     appearing on the mode line of the buffer)
                    291: 
                    292: NOTE: The sml-mode functions: sml-send-buffer, sml-send-function and
                    293: sml-send-region, creates temporary files (I could not figure out how
                    294: to send large amounts of data to a process). These files will be
                    295: removed when you leave emacs.
                    296: 
                    297: 
                    298: 4. CUSTOMIZING YOUR SML-MODE
                    299: ============================
                    300: 
                    301: If you have to change some of the constants, you will have to add a
                    302: `hook' to the sml-mode. Insert this in your "~/.emacs" file.
                    303: 
                    304:    (setq sml-mode-hook 'my-sml-constants)
                    305: 
                    306: Your function "my-sml-constants" will then be executed every time
                    307: "sml-mode" is invoked.  Now you only have to write the emacs-lisp
                    308: function "my-sml-constants", and put it in your "~/.emacs" file.
                    309: 
                    310: Say you are running a version of sml that uses the syntax `use
                    311: ["file"]', is invoked by the command "OurSML" and you don't want the
                    312: indentation algorithm to indent according to open parenthesis, your
                    313: function should look like this:
                    314: 
                    315:    (defun my-sml-constants ()
                    316:       (setq sml-prog-name "OurSML")
                    317:       (setq sml-use-left-delim "[\"")
                    318:       (setq sml-use-right-delim "\"]")
                    319:       (setq sml-paren-lookback nil))
                    320: 
                    321: Other things could be added to this function. As an example:
                    322: 
                    323:       (setq sml-paren-lookback 1000) ; Look back 1000 chars for open
                    324:                                      ;  parenthesis.
                    325: 
                    326:       (setq sml-case-indent t)       ; Select other type of case
                    327:                                      ;  expressions 
                    328: 
                    329:       (turn-on-auto-fill)            ; Turn on auto-fill
                    330: 
                    331:       (setq sml-indent-level 8)      ; change the indentation to 8
                    332: 
                    333:       (setq sml-prog-name-ask-p t)   ; Ask which program to run when the
                    334:                                     ;  inferior shell starts up.
                    335: 
                    336:       (define-key sml-mode-map "|"   ; Let "|" be electric,
                    337:           'sml-electric-pipe)        ;  like M-|
                    338: 
                    339: The sml-shell also runs a `hook' (sml-shell-hook) when it is invoked.
                    340: 
                    341: 
                    342: 5. CHANGES FROM PREVIOUS VERSIONS
                    343: ================================
                    344: 
                    345: For those of you who have been using sml-mode in an earlier version,
                    346: here is a compiled list of the changes made.
                    347: 
                    348: 
                    349: 5.1 VERSION 1.0 TO 2.0
                    350: ----------------------
                    351: 
                    352:   o Some bugs fixed.
                    353:   
                    354:   o The indentation algorithm has become better at determining the
                    355:     right indentation, and faster.
                    356: 
                    357:   o A number of constants have been introduced to customize the mode
                    358:     to your needs.
                    359: 
                    360:   o The indentation algorithm recognizes `else if' (nested if then
                    361:     else), but only if the variable "sml-nested-if-indent" has been
                    362:     set to t, the default is nil.
                    363: 
                    364:   o By setting the variable sml-case-indent to either nil or t you now
                    365:     can have two different indentations of case-expr-of.
                    366: 
                    367:   o The constant sml-type-of-indent now determines the way to indent
                    368:     blocks, if the starting keyword is not first on the line.
                    369: 
                    370:   o The indentation algorithm now indents to same level as an open
                    371:     parenthesis if this was left open at a previous line (the variable
                    372:     sml-paren-lookback controls this action.)
                    373: 
                    374:   o A couple of extra functions have been added:
                    375:         sml-next-error and sml-save-buffer-use-file.
                    376: 
                    377:   o If temporary files are created, these files will be removed when
                    378:     emacs is killed.
                    379: 
                    380:   o Thanks to Andy Norman (ange%[email protected]) you are no
                    381:     longer placed in the inferior shell when you send a `use file' to
                    382:     the inferior shell. The shell window will pop up, and the window
                    383:     will scroll. He also added a shell-prompt-pattern variable for the
                    384:     inferior sml shell mode. This will allow you to move the cursor
                    385:     backwards in the buffer, and re-execute lines that begin with this
                    386:     pattern (pattern is found in the variable sml-shell-prompt-pattern).
                    387: 
                    388: 
                    389: 5.2 VERSION 2.0 TO 2.1
                    390: ----------------------
                    391: 
                    392:   o Some bugs fixed.
                    393:   
                    394:   o Due to a bug in the Un*x function mktemp, you could only send
                    395:     26 temporary files. This has been fixed by adding an extra letter
                    396:     to the file-name (sml-tmp-file-name) in the function that sends
                    397:     the files (sml-simulate-send-region).
                    398: 
                    399: 
                    400: 5.3 VERSION 2.1 TO 2.2
                    401: ----------------------
                    402: 
                    403:   o Some bugs fixed.
                    404:   
                    405:   o A new function (sml-skip-errors, bound to C-c C-k) has been
                    406:     added. It skips the rest of the error messages. Very handy if a
                    407:     lot of errors follows a simple mistake.
                    408: 
                    409:   o Sending something to the process running sml, will call
                    410:     sml-skip-errors first, so old errors will be forgotten.
                    411:     
                    412:   o sml-indent-line (TAB) now leaves the point where it is (unless
                    413:     if it is before the indentation).
                    414: 
                    415: 5.3 VERSION 2.2 TO 2.3
                    416: ----------------------
                    417: 
                    418:   o Some bugs fixed.
                    419: 
                    420:   o New variable (sml-prog-name-ask-p). If t, you will be asked which
                    421:     program to run when the inferior shell starts up. Usefull if you have
                    422:     exported images of sml.
                    423: 
                    424: 5.4 VERSION 2.2 TO 2.4
                    425: ----------------------
                    426: 
                    427:   o Some bugs fixed.
                    428: 
                    429:   o Added sml-import-file.
                    430: 
                    431: 6. THINGS TO DO
                    432: ===============
                    433: 
                    434: And there are still things to do:
                    435: 
                    436:   o Find a better way to send regions to the inferior shell (the command
                    437:     process-send-region does not work on larger regions, that is why the
                    438:     function sml-simulate-send-region uses temporary files).
                    439: 
                    440:   o Have sml-next-error recognizing more than just SML of New Jersey
                    441:     syntax of error messages.
                    442: 
                    443:   o The indentation algorithm still can be fooled. I don't know if it
                    444:     will ever be 100% right, as this means it will have to actually
                    445:     parse all of the buffer up to the actual line (this can get -very-
                    446:     slow).
                    447: 
                    448:   o Add tags.
                    449: 
                    450: 
                    451: Thanks
                    452: ======
                    453: 
                    454: Thanks to Andy Norman (ange%[email protected]) for helping me a
                    455: lot. Not only did he tell me about the bugs, he also included fixes.
                    456: 
                    457: 
                    458: Author
                    459: ======
                    460:         Lars Bo Nielsen
                    461:         Aalborg University
                    462:         Computer Science Dept.
                    463:         9000 Aalborg
                    464:         Denmark
                    465: 
                    466:         [email protected]
                    467:         or: ...!mcvax!diku!iesd!lbn
                    468:         or: [email protected]
                    469: 
                    470: Please let me know if you come up with any ideas, bugs, or fixes.
                    471: 
                    472: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.