home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Moscow ML 1.31 / source code / mosml / README.Mac < prev    next >
Encoding:
Text File  |  1995-10-20  |  22.5 KB  |  563 lines  |  [TEXT/Moml]

  1. 20Oct95 e
  2.  
  3. Moscow ML for the Apple Macintoshâ„¢
  4.  
  5. mosml is a port of Moscow ML 1.31 to the Apple Macintosh.
  6. It was done by e (Doug Currie) in late October 1995.
  7.  
  8. mosml is freeware. The entire source code for mosml is available.
  9. A number of authors have contributed to its development; see the file 
  10. copyrght/copyrght.cl for restrictions on charging money for distribution 
  11. of this software.
  12.  
  13. I have tested mosml on a PowerMac 8100 and a Mac IIfx. It surely needs 
  14. an FPU or an FPU emulator. I have not stress tested memory requirements. 
  15. I usually run with 8M allocated to mosml, but it will probably run with 
  16. much less.
  17.  
  18. Comments/questions about the port should be directed to <e@flavors.com>.
  19.  
  20. Comments/questions about Moscow ML should probably be directed elsewhere, 
  21. as I am not an expert in ML or its implementation! Please read this file, 
  22. and any other README or documentation that accompanies this release 
  23. before sending questions to me or any of the other authors, mailing lists, 
  24. or newsgroups. See the SML FAQ, and  newsgroup comp.lang.ml which I watch 
  25. via the SML-LIST mailing list.
  26.  
  27. Getting Started
  28. ---------------
  29.  
  30. Extract the files onto your hard disk. The self extracting archive should 
  31. create a mosml folder. Inside this folder are the applications, the 
  32. image, and library files.
  33.  
  34. There are two applications: mosml13ppc and mosml13m68. They are both the 
  35. same except that mosml13ppc only runs on PowerMacs, and runs faster on 
  36. PowerMacs than mosml13m68. Keep the version for your Mac and trash 
  37. the other version. From now on I'll call the version you kept "mosml."
  38.  
  39. The binary image file "mosml.image" is loaded automatically when mosml is 
  40. launched. mosml then loads some library files. It's important to avoid 
  41. moving the image or library files; they should be left where installed 
  42. (relative to mosml and the mosml folder).
  43.  
  44. Now you are running mosml interactively. Typing expressions, followed by 
  45. the Enter key (or Option-Return), causes the expression to be sent to 
  46. mosml for evaluation. Try typing:
  47.   help "lib";
  48. followed by Enter.
  49.  
  50. The Command menu contains mosml specific commands. Use these menu items 
  51. to use, load, compile, etc. The meaning of these commands is documented 
  52. in the Moscow ML documentation. The File, Edit, Search, and Windows menus 
  53. are for using the built in editor. Also in the Edit menu is a Styles item 
  54. for setting preferences (which are recorded in a "Mosml Preferences" file 
  55. in your Preferences Folder).
  56.  
  57. Later you can use the link function to build your own images. If you name 
  58. your image "mosml.image" then it will be loaded automatically at launch 
  59. instead of the original mosml image. You can also select an image to load 
  60. at launch time using the command line, see below.
  61.  
  62. Also below is a section called eConsole User Notes which describes how to 
  63. use the console and editor features.
  64.  
  65. Cow Icons
  66. ---------
  67.  
  68. My nine year old daughter, Megan, drew the icons. She is better at it than 
  69. me. I chose a cow for the icon for three reasons:
  70. 1) "cow" are the letters missing from mosml
  71. 2) Caml Light uses a camel, so I though an animal face would be appropriate
  72. 3) I think cows are nice.
  73.  
  74. Cows in New Hampshire look _something_ like the icon. They are white with 
  75. blotchy black spots. If there are any Moscow ML users out there who are also 
  76. artists, please feel free to contribute more polished icons!
  77.  
  78. Command Lines
  79. -------------
  80.  
  81. [Command lines are very non-Mac. You don't need to use them unless you 
  82. need to use mosmllex, or are bootstrapping a new version.]
  83.  
  84. If mosml cannot find the image file, or if the command key is held down 
  85. when mosml is launched, then mosml will display a single question mark 
  86. and await a command line. [The command key is the one with an apple or
  87. a "freeway interchange" symbol on it.]
  88.  
  89. The Moscow ML documentation describes command lines. The command line 
  90. options are specific to the image loaded. The general format is: 
  91.   <image-name> <command-line-options>
  92.  
  93. Examples:
  94.  
  95. :mosml.image -stdlib Bang:mosml:src:mosmllib:
  96. :mosml.image -stdlib Bang:mosml:src:mosmllib: -P full
  97. :mosmllexe :src:toolssrc:Deplex.lex
  98.  
  99. Note: when specifying -stdlib, or -I include paths, it is best to provide 
  100. complete pathnames. A relative name for the image is fine since generally 
  101. it will go unused after the image is loaded, but paths are recorded 
  102. verbatim and become useless as soon as chDir() is executed.
  103.  
  104. When launched with the command key down, mosml will type the command line 
  105. it would have executed had no keys been held down. This can be copied and 
  106. pasted into the mosml console to customize the startup, e.g., add "-P full" 
  107. or "-P none" after the typed command line to change the set of library files 
  108. initially loaded. See the Moscow ML documentation for these sets.
  109.  
  110. WARNING: The command line parser will barf at pathnames with spaces in them. 
  111. The entire path from the root to the image file, and to stdlib, should only 
  112. contain volumes and directories without spaces (or returns!) in their names.
  113.  
  114. Library Status
  115. --------------
  116.  
  117. Although much of it is UNIX derived, a surprising amount of the library 
  118. now works with the Mac. In particular, walking directory structures, and 
  119. getting information about files, elapsed/used time, time of day, and dates 
  120. are all working. In fact, as of this release, the Mac version is ahead of 
  121. the DOS and UNIX versions in capability. In particular, the Mac version:
  122. - reports time spent in GC and Multifinder when timing functions
  123. - has the mosmldep capability built into a new make function
  124. - has the linker integrated into the toplevel environment.
  125.  
  126. One compromise was necessary in Path.sml -- it assumes that the pathname 
  127. string can be used to determine if a path is relative to the current 
  128. working directory or absolute (relative to "root"). While it is always the 
  129. case that Mac pathnames starting with ":" are relative, all other pathnames 
  130. can be relative or absolute. The Mac tries its darndest to find the file 
  131. somewhere. So, I made the following choice: if the name starts with a ":" 
  132. then it's relative, else if it contains a ":" it's absolute, else it's 
  133. relative. This seems to handle common cases (i.e., it's rare to store files 
  134. at root level). Path.sml also has assumptions built in about how pathname 
  135. arcs "." and ".." behave. These are just file (or directory) names on the 
  136. Mac. The Mac approach of "::" meaning up versus ":" meaning down is so 
  137. dissimilar to the UNIX approach that I gave up and left the UNIX version 
  138. of "." and ".." processing in place.
  139.  
  140. There are also some differences in how file system links work. Mac aliases 
  141. are not 100% like UNIX links. For example, readLink() returns the absolute 
  142. pathname of the original file on the Mac. Also, stat on the Mac is actually 
  143. lstat [I think; I'm not a UNIX guru either!].
  144.  
  145. Configuration
  146. -------------
  147.  
  148. mosml remembers your Styles preferences in a Preferences Folder file.
  149.  
  150. [You need to understand Mac resources and ResEdit for the rest of the 
  151. Configuration section to make sense. Don't worry, you don't need to 
  152. know any of this to use mosml.]
  153.  
  154. The Mac version of mosml simulates UNIX environment variables with 
  155. resources of type 'ENV '. The resource number doesn't matter, the 
  156. resources are identified by name. The format of an 'ENV ' resource is 
  157. simply a C string. mosml only looks for one 'ENV ' variable called 
  158. CAMLRUNPARAM. It is used to configure the memory manager. I don't know 
  159. where it's documented (probably the Caml Light distribution). A sensible 
  160. value for this string is provided as an 'ENV ' resource in the mosml 
  161. application. If the resource is not found, another sensible value is used.
  162.  
  163. You may add 'ENV ' resources to the mosml application (or to the system, 
  164. although I wouldn't recommend it) and they can be read using the function 
  165. Process.getEnv; here's an example...
  166.  
  167. - chDir "Bang:mosml:src:mosmllib:"; load "Process.uo";
  168. > val it = () : unit
  169. - > val it = () : unit
  170. - Process.getEnv "VERSION";
  171. > val it = SOME "mosml 1.30e" : string option
  172.  
  173. There is also a 'STR#' resource in the mosml application called 
  174. econfigstrs. The five strings in this string list are used to form the 
  175. default command line and console window title. They are:
  176.  
  177. - image name              :mosml.image   [*]
  178. - stdlib relative path    :src:mosmllib: [*]
  179. - optional                -P
  180. - optional                default
  181. - console name            Mosml Console
  182.  
  183. When mosml uses the default command line, it converts the stdlib relative 
  184. path and the image name (marked with [*]) to absolute pathnames before 
  185. passing them to the image.
  186.  
  187. Mac toplevel
  188. ------------
  189.  
  190. The mosml toplevel environment on the Macintosh is extended from the 
  191. UNIX/DOS version. There are five new names:
  192.  
  193. make           -- see below
  194. link           -- see below
  195. moolevel       -- see below
  196. getDir         -- same as FileSys.getDir
  197. gc_full_major  -- same as Memory.gc_full_major
  198.  
  199. The first three are documented below. The last two are used by the Command 
  200. menu. gc_full_major is useful to force a garbage collect, before a benchmark 
  201. test for example.
  202.  
  203. The make and link functions can be used to build complete mosml applications 
  204. without any other tools, i.e., without a UNIX shell or make program. 
  205. Together with the separate mosmllex and mosmlyac, make and link can be used 
  206. to bootstrap mosml. [If you start from the UNIX distribution you will also 
  207. need perl, e.g., MacPerl, and you may need to preprocess some files with 
  208. the C preprocessor or by hand -- the Mac source distribution has these files 
  209. included "pre-processed."]
  210.  
  211. make
  212. ----
  213.  
  214. The make command compiles all files in a directory needing recompilation. 
  215. It has all the compile capabilities of mosmlc, plus it finds dependencies 
  216. among the files. It only compiles what needs to be compiled.
  217.  
  218. make : string -> string -> string list -> string -> unit
  219.  
  220. Evaluating:
  221.  
  222.   make <oset> <stdlib> [<dir1>..<dirN>] <path>
  223.  
  224. is equivalent to running mosmlc as follows:
  225.  
  226.   mosmlc -P <oset> -stdlib <stdlib> -I <dir1> ..  -I <dirN> <files...>
  227.  
  228. where <files...> is a subset of the files in directory <path> determined by 
  229. tracing out the dependencies among the files and their need for compilation.
  230.  
  231. The make command uses the mosmldeps parser to find dependencies for all 
  232. files in a directory, computes the transitive closure of these dependencies, 
  233. finds a consistent ordering for the files, tests each file in turn to see if 
  234. it needs compilation (including tests upon modification times of units 
  235. outside the target directory as long as they're visible to find_in_path()), 
  236. and compiles the files if necessary. It takes as arguments -stdlib and -I 
  237. paths and -P so it can be used to compile the library and compiler 
  238. directories.
  239.  
  240. A file needs compilation if:
  241.    1- there is no corresponding object file, "object"
  242.    2- the mtime of the object is older than the epoch
  243.    3- the mtime of the source is newer than mtime of the object
  244.    4- the mtime of any dependency is newer than the mtime of the object
  245. where the epoch is a built in time variable, currently Time.zeroTime.
  246.  
  247. Make keeps a cache of file dependencies; when run a second or subsequent 
  248. time the cache is consulted and verified based on the mtime of the source 
  249. file. This can save considerable time. If you ever need to flush this 
  250. cache (although I can't think of why you would) see moolevel below.
  251.  
  252. Caveats: make doesn't know about cpp, yacc, lex, sed, awk, perl, etc. It 
  253. does report when it finds ".grm" files without corresponding ".sig" and 
  254. ".sml" files, for example, (and the same for .mlp & .lex) but these must be 
  255. made manually. I have created a mosmlyac-mac which I have used to compile 
  256. the .grm files, and as I said above, mosml can run mosmllex with the command 
  257. line, and I have used this technique to compile the .lex files.
  258.  
  259. moolevel
  260. --------
  261.  
  262. moolevel : int ref
  263.  
  264. moolevel controls the verbosity of make.
  265.  
  266. 0: no messages
  267. 1: error messages
  268. 2: compile messages
  269. 3: progress messages
  270.  
  271. It defaults to 1, but I personally like level 2.
  272.  
  273. As a special hack, if moolevel is negative, then it is negated, and the 
  274. cache of file dependencies is cleared. You should never need this.
  275.  
  276. link
  277. ----
  278.  
  279. link : string -> bool * bool -> string -> string  \
  280.               -> string list -> string list -> unit
  281.  
  282. link is the link portion of mosmlc.
  283.  
  284. Evaluating:
  285.  
  286.   link <file> (<g>,<h>) <oset> <stdlib> [<dir1>..<dirN>] [<file1>..<fileN>]
  287.  
  288. is equivalent to running mosmllnk as follows
  289.  
  290.   mosmllnk -o <file> {-g} {-noheader} -P <oset> -stdlib <stdlib> \
  291.            -I <dir1> ..  -I <dirN> <file1>..<fileN>
  292.  
  293. where -g is included if <g> is true, -noheader is included if <h> is true.
  294.  
  295. If <oset> is "" then it is replaced by "default"
  296. If <oset> is "lorder" then link does the following:
  297. 1- trace out all load dependencies of <file1>..<fileN>
  298. 2- include in the list of files to be linked all other files depended upon
  299.    if they can be found in any of the specified paths
  300. 3- construct a legal link order for the files
  301. 4- then link this list as usual
  302.  
  303. Typically, simply specifying your Main program to be linked will find all 
  304. the required .uo files and put them in the right order.
  305.  
  306. Examples
  307. --------
  308.  
  309. To create a new mosml project, put all the source files in a new directory, 
  310. "project." Don't put any incomplete or irrelevant sources in the same 
  311. directory or they will be compiled, too. Assuming your project only depends 
  312. on library files, evaluate:
  313.  
  314. let val base = "pathname of the mosml directory"
  315. in
  316.   make "full" (base ^ "mosmllib") [] (base ^ "project")
  317. end;
  318.  
  319. to compile all your files. Evaluate this each time you have made changes in 
  320. your sources to keep the object files up to date.
  321.  
  322. Here is a sample make and link script to build mosml.image:
  323.  
  324. (* ********************************** *)
  325.  
  326. val home = "Bang"; (* your path to the mosml folder goes here! *)
  327.  
  328. moolevel := 2;
  329.  
  330. (* to compile the toplevel mosml image and the lexer *)
  331.  
  332. let val base = home ^ ":mosml:src:"
  333. in
  334.   make "none" (base ^ "mosmllib") [] (base ^ "mosmllib");
  335.   make "none" (base ^ "mosmllib") [] (base ^ "compiler");
  336.   make "none" (base ^ "mosmllib") [(base ^ "compiler")] (base ^ "toolssrc");
  337.   make "none" (base ^ "mosmllib") [(base ^ "compiler")] (base ^ "lex")
  338. end;
  339.  
  340. (* to build the toplevel mosml image into file "testtop.image" *)
  341.  
  342. let val base = "<home>" ^ ":mosml:src:"
  343. in
  344.   chDir base; chDir "::";
  345.   link "testtop.image"
  346.        (true,true) (* -g -noheader *)
  347.        "lorder" (base ^ "mosmllib") [(base ^ "compiler"),(base ^ "toolssrc")]
  348.        ["Maine.uo"]
  349. end;
  350.  
  351. (* another way to build the toplevel mosml image into file "testtop.image" *)
  352.  
  353. let val base = home ^ ":mosml:src:"
  354. in
  355.   chDir base; chDir "::";
  356.   link "testtop.image"
  357.        (true,true) (* -g -noheader *)
  358.        "none" (base ^ "mosmllib") [(base ^ "compiler"),(base ^ "toolssrc")]
  359.  
  360.        ["List.uo", "Char.uo", "Strbase.uo", "String.uo", "BasicIO.uo",
  361.         "Vector.uo", "Misc.uo", "Array.uo", "StringCvt.uo", "Word8.uo",
  362.         "Word8Vector.uo", "CharVector.uo", "Word8Array.uo", "CharArray.uo",
  363.         "Obj.uo", "Nonstdio.uo", "Substring.uo", "Path.uo", "Time.uo",
  364.         "OS.uo", "FileSys.uo", "Lexing.uo", "Parsing.uo", "Miscsys.uo",
  365.         "Printexc.uo", "Filename.uo", "Fnlib.uo", "Sort.uo", "Stack.uo",
  366.         "Arg.uo", "Hasht.uo", "Memory.uo", "Config.uo", "Mixture.uo",
  367.         "Const.uo", "Smlexc.uo", "Prim.uo", "Instruct.uo", "Lambda.uo",
  368.         "Smlprim.uo", "Globals.uo", "Location.uo", "Units.uo", "Types.uo",
  369.         "Smlperv.uo", "Asynt.uo", "Asyntfn.uo", "Parser.uo", "Lexer.uo",
  370.         "Primdec.uo", "Infixst.uo", "Ovlres.uo", "Synchk.uo", "Infixres.uo",
  371.         "Elab.uo", "Tr_env.uo", "Pr_lam.uo", "Match.uo", "Front.uo",
  372.         "Back.uo", "Pr_zam.uo", "Opcodes.uo", "Prim_opc.uo", "Buffcode.uo",
  373.         "Labels.uo", "Code_dec.uo", "Reloc.uo", "Emitcode.uo", "Emit_phr.uo",
  374.         "Sigmtch.uo", "Crc.uo", "Compiler.uo", "Predef.uo", "Prim_c.uo",
  375.         "Symtable.uo", "Patch.uo", "Tr_const.uo", "Rtvals.uo", "Load_phr.uo",
  376.         "Exec_phr.uo", "Link.uo", "Deppars.uo", "Deplex.uo",
  377.         "Smltope.uo", "Maine.uo"]
  378. end;
  379.  
  380. (* to build the lexer into file "mosmllex" *)
  381.  
  382. let val base = home ^ ":mosml:src:"
  383. in
  384.   chDir base; chDir "::";
  385.   link "mosmllex"
  386.        (true,true) (* -g -noheader *)
  387.        "none" (base ^ "mosmllib") [(base ^ "lex"),(base ^ "compiler")]
  388.  
  389.        ["List.uo", "Vector.uo", "Array.uo", "Char.uo", "Strbase.uo", 
  390.         "String.uo", "StringCvt.uo", "Word8.uo", "Word8Vector.uo", 
  391.         "Word8Array.uo", "CharVector.uo", "CharArray.uo", "Obj.uo", 
  392.         "BasicIO.uo", "Nonstdio.uo", "Lexing.uo", "Parsing.uo", 
  393.         "Miscsys.uo", "Printexc.uo", "Filename.uo", "Fnlib.uo", 
  394.         "Sort.uo", "Arg.uo", "Hasht.uo", "Syntax.uo", "Scan_aux.uo", 
  395.         "Gram_aux.uo", "Grammar.uo", "Scanner.uo", "Lexgen.uo", 
  396.         "Output.uo", "Mainlex.uo"]
  397. end;
  398.  
  399. (* ********************************** *)
  400.  
  401. eConsole User Notes
  402. -------------------
  403.  
  404. 1. Interacting with the interpreter
  405.  
  406. Interaction with the interpreter's read-eval-print (REP) loop is done 
  407. inside the "Mosml Console" window. The contents of the interaction window 
  408. can be edited by the user. This window also acts as the default standard 
  409. output port (and input port). Consequently, the interpreter sends its 
  410. output to the interaction window. User input and system output are 
  411. displayed with different fonts. By default, user input is in bold face 
  412. (but this and other attributes of the window can be changed with the 
  413. "Styles..." item in the Edit menu).
  414.  
  415. Normally, the user types an expression and then "sends" it to the 
  416. interpreter to be evaluated. The result of the evaluation is then output 
  417. to the interaction window. The preferred way of evaluating an expression 
  418. is to place the insertion point (caret) immediately after the expression 
  419. to evaluate and then typing the <enter> key. An alternative method is to 
  420. use the <opt-return> (i.e. press the <return> key while pressing the 
  421. <option> key). When <enter> is pressed, the sequence of "user input" 
  422. characters immediately preceding the insertion point are sent to the 
  423. interpreter. Because it doesn't check for a properly formed expression, 
  424. the <enter> key is useful for programs doing text oriented input. Arbitrary 
  425. text can also be sent to the interpreter by selecting the text and typing 
  426. <opt-return> or <enter>.
  427.  
  428. These interaction mechanisms also work from windows associated to files 
  429. (i.e., in an edit buffer). However, the result of evaluation is always 
  430. displayed in the interaction window.
  431.  
  432. 2. Basic editing
  433.  
  434. It is assumed that you are familiar with standard Macintosh editing 
  435. techniques. If not, you should consult your Getting Started disks and 
  436. Macintosh users' manuals.
  437.  
  438. On all keyboards the following keys are defined:
  439.  
  440.     delete - erase character before cursor position
  441.        tab - indent current line
  442.     return - insert a new line and move to the left margin (and then
  443.              do a <tab> if autoindent is selected for the window)
  444. opt-return - send the expression preceding the insertion point
  445.      enter - send the user input preceding the insertion point
  446.  
  447. 3. Special keys
  448.  
  449. On extended keyboards the following special keys are supported:
  450.  
  451.    F1 - F4 - equivalent to Undo, Cut, Copy and Paste
  452.   F5 - F15 - function keys (not used)
  453.       del> - erase character after the insertion point
  454.       home - scroll text to the top of the edit buffer
  455.        end - scroll text to the bottom of the edit buffer
  456.    page up - scroll text up a page
  457.  page down - scroll text down a page
  458.  
  459. Note that these last four do not move the insertion point, just scroll.
  460.  
  461. 4. Arrow keys
  462.  
  463. Arrow keys (when available) move the insertion point in the corresponding 
  464. direction:
  465.  
  466.       left - move cursor to the left one character
  467.      right - move cursor to the right one character
  468.         up - move cursor up one line
  469.       down - move cursor down one line
  470.  
  471. Arrow keys can be modified with the <shift>, <option>, and <command> keys.
  472.  
  473. The <shift> key may be used to extend the text selection per Apple 
  474. standards. Each selection has an anchor end and an active end. Generally, 
  475. the active end is the last end you moved, the anchor end doesn't move. When 
  476. the <shift> key is held down, the selection's active end is moved by the 
  477. arrow keys.
  478.  
  479. The <option> key may be used with the arrow keys to move the insertion 
  480. point left or right by word, or up or down by page. <Shift> and <option> 
  481. together may be used to move the active end of the selection left or right 
  482. by words, or up or down by pages.
  483.  
  484. The <command> key may be used with the arrow keys to move the insertion 
  485. point left or right to the beginning or end of the line, or up or down to 
  486. the beginning or end of the text. <Shift> and <command> together may be 
  487. used to move the active end of the selection to start or end of the line 
  488. or text.
  489.  
  490. When <shift>, <option>, and <command> are held down together, the up or 
  491. left arrow will make the beginning of the selection the active end, and the 
  492. down or right arrow will make the end of the selection the active end.
  493.  
  494.  
  495. 5. Emacs commands
  496.  
  497. [Sorry, with this version most Emacs commands are absent.]
  498.  
  499. A small subset of Emacs compatible command keys are supported by the editor.
  500. Some of these commands make use of the <control> key.
  501.  
  502. The following table lists the Emacs compatible command keys using the 
  503. following abbreviations:
  504.   C = <control> key, M = <option> key (Emacs' "meta" key).
  505.  
  506. Commands which move the insertion point:
  507.  
  508.   C-f      - forward character
  509.   C-M-f    - forward S-expression
  510.   C-b      - backward character
  511.   C-M-b    - backward S-expression
  512.   C-a      - beginning of line
  513.   C-M-a    - beginning of S-expression
  514.   C-m      - select enclosing S-expression
  515.   C-M-m    - select enclosing S-expression
  516.   C-e      - end of line
  517.   C-M-e    - end of S-expression
  518.   C-p      - previous line
  519.   C-n      - next line
  520.  
  521. Commands which modify the buffer:
  522.  
  523.   C-d      - delete forward (same as del> key)
  524.   C-del>   - delete to end of line
  525.   C-k      - same as C-del>
  526.   C-o      - open line
  527.  
  528. Other commands:   M-return - same as <opt-return>
  529.  
  530. 6. Mouse
  531.  
  532. The editing action is specified by the number of mouse button clicks:
  533.  
  534.     single - position insertion point
  535.     double - select word
  536.     triple - select line
  537.  
  538. Dragging after one of these clicks extends the selection by character, word,
  539. or line respectively; the anchor point is the original click position, the 
  540. active end is the other end of the selection. After a click-drag, the 
  541. active end can be moved with <shift> clicks or <shift> arrow keys. The 
  542. anchor and active ends of the selection can be swapped with
  543. <option+shift+click>, or <option+shift+command> up/down or left/right arrow 
  544. keys.
  545.  
  546.  
  547. 7. Scrolling
  548.  
  549. Holding down <command>, <shift>, <option>, and <control> keys speeds up 
  550. scrolling when mousing in the arrows of the scroll bar. The more keys you 
  551. hold down the faster it scrolls (exponentially).
  552.  
  553.  
  554. 8. Editor limitations
  555.  
  556. The text size is limited by memory space. There is a limit of 32,000 lines 
  557. (not characters) per window. The editor has been used with files several 
  558. hundred kilobytes in size.
  559.  
  560. Credits: Thanks to Marc Feeley for contributing to the eConsole User Notes.
  561.  
  562.