home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / appl / microema.sit / Mouser < prev    next >
Text File  |  1989-04-28  |  20KB  |  464 lines

  1.  
  2.             
  3.              Mousing in MicroEmacs
  4.         Topics of Interest to the Macintosh User
  5.                 Earle R. Horton
  6.               Wednesday, October 26, 1988
  7.  
  8.      This version of MicroEmacs for the Macintosh incorporates several
  9. enhancements to make life easier for the typical Macintosh user.  Most
  10. important is that the mouse is supported to a much greater extent than
  11. in previous versions.  This document is meant for both the experienced
  12. MicroEmacs user and the novice, but those new to emacs editors are
  13. encouraged to read the emacs tutorial (emacs.tut) first.  Those who are
  14. already familiar with emacs in one form or another are welcome to forge
  15. ahead.
  16.  
  17. # General.
  18.  
  19.      The Mac version of MicroEmacs incorporates many Macintosh-specific
  20. features.  For this reason, and because Dan Lawrence seems to seldom
  21. answer computer mail, it is usually a revision level or two behind the
  22. version that Dan puts out.  The present sources I have can be compiled
  23. with either LightSpeed C 2.15, Aztec C 3.6c, or MPW C 2.0.2.
  24.  
  25. # Windows.
  26.  
  27.      MicroEmacs uses only one proper Macintosh "window" as a terminal
  28. emulator for the emacs editor.  Several rows of text in this window can
  29. be separated into distinct areas, known also as "windows" in the emacs
  30. tutorial.  For purposes of this document, a window is the area between
  31. one mode line and the next, and not the terminal emulator window within
  32. which editing is done.
  33.  
  34. # Mousing.
  35.  
  36.      Several things can be done with the mouse, and many are analogous
  37. to functions which can be performed with a "regular" Macintosh text
  38. editor or word processor.
  39.  
  40. ## Standard mousing.
  41.  
  42.      The action of the scroll bar in MicroEmacs is fairly normal, except
  43. that the insertion point is always kept visible.  Pressing the close box
  44. in the title bar causes MicroEmacs to quit, but it will ask for
  45. confirmation if modified buffers exist.  Typing 'y' at this point goes
  46. ahead anyway, while 'n' backs out.  The zoom box and drag region of the
  47. title bar work normally.  Note that it is possible to drag the terminal
  48. emulator window such that the message line is not visible.  This is not
  49. recommended, since important messages may be missed.
  50.  
  51. ## Mousing in mode lines.
  52.  
  53.      Several things can happen when the mouse is pressed in a mode line.
  54. If one double-clicks in the mode line, the "next" buffer is displayed in
  55. the associated window.  This is the same as first typing ^X-O the
  56. required number of times to make the window active, then typing ^X-X.
  57. It works much faster, of course.
  58.  
  59.      Mode lines may be dragged, either with single or double clicks.
  60. Double-click-drag switches to the next buffer first.  A drag then moves
  61. the mode line to follow the mouse, resizing the window.  A window can be
  62. deleted by dragging its mode line upwards until it contains zero lines.
  63. A window cannot, however, be deleted by making the window above it
  64. larger.  When there is only window and the user attempts to drag the
  65. bottom mode line, then the one window is split.  Dragging the bottom
  66. mode line when there are multiple windows has the same effect as
  67. dragging one of the other mode lines, but it looks quite different.
  68. Since the bottom mode line is always one line above the bottom of the
  69. terminal emulator, drags on this line cause the mode line above to move.
  70. The result is the same, however:  Dragging up makes the window smaller;
  71. dragging down makes it bigger.
  72.  
  73. ## Entering commands with the aid of the mouse.
  74.  
  75.      Pressing the mouse in the message line moves the cursor into the
  76. message line, a ':' prompt appears, and the user may type a named
  77. command.  This is the same as typing M-X.  If you didn't mean to type a
  78. command, click in some other area to get out of the message line.
  79.  
  80. ## Mousing in text.
  81.  
  82.      A key difference in the user interface between MicroEmacs and other
  83. Macintosh software is that there is no concept of a "selection range."
  84. There is a similar entity known as the "region," discussed in the
  85. tutorial, but it behaves differently from the standard selection range.
  86. Once the user has set the mark, a region always exists in a window.
  87. Keys for modifying text, such as the delete key and characters which are
  88. inserted into the buffer, do not erase the region, but merely change it.
  89. Cut and Copy work on the contents of the region in the standard way, but
  90. Paste does not overwrite the region, rather inserting the 'TEXT'
  91. contents of the clipboard after point.  For these reasons (and for
  92. performance, I admit it) the region is not highlighted.
  93.  
  94. ### Simple cursor moves.
  95.  
  96.      Pressing the mouse in the text region of a window makes that window
  97. the active window, and moves point to where the mouse was pressed.
  98.  
  99.      Double-clicking moves point to the mouse cursor, then swaps the mark
  100. and the point.  This is equivalent to moving the text cursor over the
  101. character where the mouse cursor is, then typing ^X-X.  This can be
  102. convenient for defining a region which is larger than one screenful.
  103.  
  104. ### Dragging and stuff.
  105.  
  106.      Pressing the mouse in the text, then dragging, causes the mark to
  107. be set to the first character clicked on, and point to wind up at the
  108. character where the mouse was released.  You can drag beyond the bounds
  109. of the present window, and new text is scrolled into view.  Horizontal
  110. scrolling is not supported.
  111.  
  112.      Shift-clicking moves the point but never the mark.
  113.  
  114. # Menus.
  115.  
  116.      MicroEmacs has eight menus.  The PopUp menu is gone.  Sorry if you
  117. liked it.
  118.  
  119.      The Apple menu is for the credits, and for opening Desk Accessories.
  120. The credits contain names of people who are known by me to have worked
  121. on MicroEmacs, or whose names I have found in the source.  If I have
  122. missed anyone, I am sorry.
  123.  
  124.      The Edit menu is primarilly for use by Desk Accessories, but also
  125. for Cut, Copy, and Paste, which are Macintosh MicroEmacs commands.  Note
  126. that Cut is a lot like kill-region, Copy is like copy-region, and Paste
  127. is like yank.  Cut-Copy-Paste uses the clipboard, however, while kill,
  128. kill-region, and yank use MicroEmacs' own internal kill buffer.  This
  129. gives you two places to stash stuff.
  130.  
  131.      The Buffers menu is used to switch between buffers.  Its contents
  132. change dynamically as buffers are added and deleted.  A modified
  133. buffer's name appears in italics.  To make a buffer current in the
  134. active window, select its name from the Buffers menu.
  135.  
  136.      The other five menus are named File, Search, Modes, User, and Help.
  137. The contents of a menu item in these five menus can be any valid
  138. MicroEmacs named command or command line.  These can be changed to
  139. whichever commands you like using a resource editor or compiler.
  140. Consider customizing the menus for frequently used commands.
  141.  
  142. # Keyboard.
  143.  
  144.      Most of this section is for programmer types, but towards the end
  145. is some stuff of general use.
  146.  
  147.      Keyboard events are interpreted by a stand alone code resource of
  148. type 'GetC' and ID 606.  This code resource has its entry point at the
  149. top, and accepts a pointer to an Event Record on the stack.  The Event
  150. Record was returned by GetNextEvent() when the last keyboard event was
  151. detected.  The routine returns a short integer in register D0.  The
  152. return value is the character value of the returned key, ORed with one
  153. of the following flags.
  154.  
  155. #define CTRL    0x0100        /* Control flag, or'ed in       */
  156. #define META    0x0200        /* Meta flag, or'ed in          */
  157. #define CTLX    0x0400        /* ^X flag, or'ed in            */
  158. #define SPEC    0x0800        /* special key (function key)    */
  159.  
  160.      Control-A is CTRL OR 'A', or 0x0100 | 'A', or 0x0141.  Similarly,
  161. META-A is 0x0241, and so forth.  The two high bytes of D0 are ignored.
  162. Values less than ASCII space (0x0020) are converted to the internal CTRL
  163. representation by MicroEmacs:  0x0001 => 0x0141 and so forth.
  164.  
  165.      On entry, the stack looks like this:
  166.   
  167.     4(a7)    ->    Event Record
  168.     (a7)    -    return address
  169.  
  170.      To return, pop the return address off the stack, and jump to it.
  171. Alternately, position the stack as it was on entry, and do an RTS.  You
  172. do NOT pop the argument off the stack before returning.  The 'GetC'
  173. resource may trash registers a0, a1, and d1; all others must be
  174. preserved.  Satisfactory 'GetC' resources may be created with most any C
  175. compiler which can create stand alone code, with an assembler, or with
  176. Pascal compilers which know how to implement the C calling conventions.
  177.  
  178.      When MicroEmacs is first loaded, the 'GetC' resource is loaded into
  179. memory, moved high, locked, and made non-purgeable.  You do not have to
  180. lock it yourself.
  181.  
  182.      The default code resource included with MicroEmacs converts command
  183. key combinations to control keys, command number combinations to
  184. "function" keys, and knows about some of the special keys on the
  185. standard and extended ADB keyboards.
  186.  
  187.      On the extended keyboard, the page-up, page-down, and
  188. forward-delete keys have the obvious effect.  The help key is bound to
  189. "describe-bindings," and the home and end keys move to either end of the
  190. buffer.  The Cut-Copy-Paste keys are bound to the functions for which
  191. they are named.
  192.  
  193.      The default META prefix key is escape, labelled "esc" on the ADB
  194. keyboards.  The key labelled "clear" produces the same key code.  It is
  195. possible to use the backquote key, '`' for this function using the
  196. bind-to-key command.
  197.  
  198. # Tags.
  199.  
  200.      This version of MicroEmacs supports ctags, just like vi.  The tag
  201. command first looks for a file named "tags" in the current folder, then
  202. for the file named in the variable $tags, which may be set in the
  203. command line or in your startup file.  How you create the tags file is
  204. up to you, but copies of ctags.c may be found in the comp.sources.unix
  205. archives at j.cc.purdue.edu, in the GNU Emacs distribution sources, and
  206. lots of other places.  Both regular expression tags and line number tags
  207. are supported.
  208.  
  209.      The named command "tag" prompts for a tag, and then looks for it.
  210. The command "dotag," bound to META-T, treats the next word after the
  211. text cursor as the tag.  Vi uses ^] for this function, but that is a
  212. Macintosh arrow key.
  213.  
  214. # File access.
  215.  
  216.      File access is preferably by use of Standard File dialogs.  This
  217. saves the user and MicroEmacs the trouble of knowing pathnames.  Files
  218. may also be accessed by pathname, but only from within macros and
  219. command files.  When opening a file using a partial pathname within a
  220. command file or macro, the default folder is the folder containing the
  221. last-opened file.  For the tags commands, the default folder is the
  222. folder containing the file associated with the current buffer.
  223.  
  224.      MicroEmacs tries to find out if there is enough room on disk before
  225. writing out a buffer.  Since I generally use a hard disk, I have not
  226. tested this.  It is not a good idea to edit files on almost-full disks,
  227. anyway.  When a file is written out, the volume containing the file is
  228. flushed.  This takes more time, but is much safer, and those who have
  229. written to me wanted it this way.
  230.  
  231.      MicroEmacs no longer deletes the resource fork of a pre-existing
  232. file when saving over it.  It no longer changes the creator to itself.
  233. New files will have MicroEmacs as the creator, however.  MicroEmacs
  234. ignores any information in the resource fork.
  235.  
  236.      This version of MicroEmacs now knows that the line terminator
  237. character is 0x0D everywhere.  It will no longer tell you that the
  238. current character is 0x0A when you do a "buffer-position" at the end of
  239. a line.
  240.  
  241.      Binary files may be edited with MicroEmacs.  If a file is not of
  242. type 'TEXT' it must be read using:
  243.  
  244. execute-command-line "find-file <whatever>"
  245.  
  246.      The file type and creator will not be changed if the file is
  247. altered and saved.  Files which are written out are always terminated
  248. with a carriage return, however.  This may confuse the "real owner" of
  249. the file.
  250.  
  251.      If you need to do anything with binary files, MicroEmacs is
  252. recommended only for occasional or emergency use.  In most cases,
  253. setting "over" mode is recommended.
  254.  
  255. # Tabs.
  256.  
  257.      All tabs are real.  The code to emulate tabs with spaces has been
  258. removed.  As a consolation, tab stops may be set globally to any
  259. positive number.  META-<number>-TAB may be used to do this.  The default
  260. tab stop is eight, which may be changed in the emacs.rc file by a line
  261. of the form:
  262.  
  263. <n>    handle-tab
  264.  
  265. # Miscellaneous.
  266.  
  267.      The Macintosh specific function "Insert-date" takes an argument to
  268. determine the format of the string produced.  Valid arguments and
  269. results are shown below:
  270.  
  271.         Arg.    Result
  272.         ---     ------
  273.           0     10/24/88
  274.           1     Monday, October 24, 1988
  275.           2     Mon, Oct 24, 1988
  276.  
  277.      Gee, that's today!
  278.  
  279.      MicroEmacs handles the full Macintosh character set.  That is why
  280. there is no META key.  It also thinks the "enter" key is Control-C,
  281. which is exactly what it returns on the Macintosh!
  282.  
  283.      Kill-buffer now defaults to the current buffer, and is capable of
  284. killing a buffer which is being displayed.  It will, of course, ask for
  285. confirmation if you attempt to kill a modified buffer.  In fact, you can
  286. kill buffers all day long if you want to, and MicroEmacs will keep
  287. giving you new ones named "main" and "MAIN."
  288.  
  289. # Command files.
  290.  
  291.      The startup command file is named "emacs.rc" and may be located in
  292. the system folder, the folder MicroEmacs is in, or in the folder where
  293. documents exist when opening MicroEmacs by double-clicking on a
  294. document.  Other command files may be loaded later using Standard File,
  295. or by name from within a macro or using "execute-command-line."
  296.  
  297. # The command language.
  298.  
  299.      Since there is not much said about the command language in the
  300. tutorial, I give a few comments here.  Most of this stuff comes from the
  301. header files where these things are defined.
  302.  
  303.      An identifier which starts with '$' is taken to be a MicroEmacs
  304. environment variable.  These generally are tied to internal variables
  305. used directly used by the editor code.  Example: $cbufname points to a C
  306. string containing the name of the current buffer.  Another: $tpause sets
  307. the time to pause when doing fence-matching (jumping to matching braces
  308. and back when in C mode).
  309.  
  310.      Identifiers starting with '%' are names of user variables.  User
  311. variable names may be up to ten characters each, and up to 255 of them
  312. may be defined.
  313.  
  314.      If it starts with a '&' then it is a user function.  User function
  315. is a misnomer, since these are all executed by C code in a big switch
  316. statement, which does the appropriate operation on the arguments.  Four
  317. kinds of user functions exist:
  318.  
  319. #define NILNAMIC    0
  320. #define MONAMIC     1
  321. #define DYNAMIC     2
  322. #define TRINAMIC    3
  323.  
  324.      Their type names indicate how many arguments are expected.  All
  325. take C strings as arguments, and return C strings as results.
  326.  
  327.      Procedures written in the command language can be executed in a
  328. number of ways.  Forty macros can be defined, in addition to the
  329. keyboard macro.  Named procedures can be stored and run later.  Buffers
  330. may be executed.  Files can be executed.
  331.  
  332.      All work the same way, by execution of a buffer.  Macros are stored
  333. in buffers named "[Macro nn]" where "nn" is the macro number.
  334. Procedures are stored in buffers named "[proc]" where "proc" is the
  335. procedure name.  Files are executed by first reading them into buffers.
  336. Buffers are executed by the C function dobuf().  This information can be
  337. helpful in debugging macros.  You could peek in the appropriate buffer
  338. if you have trouble with a stored macro, for instance.  By the way, if
  339. "list-buffers" is given an argument, it shows all "hidden" buffers,
  340. including macro buffers.
  341.  
  342.      The macro language also includes command directives.  The following
  343. comment was extracted from the header to dobuf().
  344.  
  345. -------------------------------------------------------------------
  346.     Directives start with a "!" and include:
  347.  
  348.     !endm        End a macro
  349.     !if (cond)    conditional execution
  350.     !else
  351.     !endif
  352.     !return     Return (terminating current macro)
  353.     !goto <label>    Jump to a label in the current macro
  354.     !force        Force macro to continue...even if command fails
  355.     !while (cond)    Execute a loop if the condition is true
  356.     !endwhile
  357.     
  358.     Line Labels begin with a "*" as the first nonblank char, like:
  359.  
  360.     *LBL01
  361. -------------------------------------------------------------------
  362.  
  363.      There is also a "!break" which jumps to the endwhile from within
  364. the while loop.
  365.  
  366.      Two other tokens exist.
  367.  
  368.          '@'            /* interactive argument     */
  369.  
  370.      This writes the text following '@' as a prompt on the message line,
  371. then returns the text typed in.
  372.  
  373.     '#'            /* buffer argument        */
  374.  
  375.      This returns the text after point, in the line containing point, in
  376. the buffer named after the '#'.  Point is advanced one line in the
  377. buffer from which the text is extracted.
  378.  
  379.      The following pre-defined "environment variables" exist in
  380. MicroEmacs.  Some are not real appropriate in the Macintosh environment,
  381. and contain nonsense or nil values.
  382.  
  383.     "fillcol",        /* current fill column */
  384.     "pagelen",        /* number of lines used by editor */
  385.     "curcol",        /* current column pos of cursor */
  386.     "curline",        /* current line in file */
  387.     "ram",            /* ram in use by malloc */    ( kilobytes )
  388.     "flicker",        /* flicker supression */
  389.     "curwidth",        /* current screen width */
  390.     "cbufname",        /* current buffer name */
  391.     "cfname",        /* current file name */
  392.     "sres",         /* current screen resolution */
  393.     "debug",        /* macro debugging */
  394.     "status",        /* returns the status of the last command */
  395.     "palette",        /* current palette string */
  396.     "asave",        /* # of chars between auto-saves */
  397.     "acount",        /* # of chars until next auto-save */
  398.     "lastkey",        /* last keyboard char struck */
  399.     "curchar",        /* current character under the cursor */
  400.     "discmd",        /* display commands on command line */
  401.     "version",        /* current version number */
  402.     "progname",        /* returns current prog name - "MicroEMACS" */
  403.     "seed",         /* current random number seed */
  404.     "disinp",        /* display command line input characters */
  405.     "wline",        /* # of lines in current window */
  406.     "cwline",        /* current screen line in window */
  407.     "target",        /* target for line moves */
  408.     "search",        /* search pattern */
  409.     "replace",        /* replacement pattern */
  410.     "match",        /* last matched magic pattern */
  411.     "kill",         /* kill buffer (read only) */
  412.     "cmode",        /* mode of current buffer */
  413.     "gmode",        /* global modes */
  414.     "tpause",        /* length to pause for paren matching */
  415.     "pending",        /* type ahead pending flag */
  416.     "lwidth",        /* width of current line */
  417.     "line",         /* text of current line */
  418.     "gflags",        /* global internal emacs flags */
  419.     "rval",         /* child process return value */
  420.     "tags",         /* name of tags file */
  421.  
  422.      The following functions may be called from macros or procedures:
  423.  
  424.     "add", DYNAMIC,     /* add two numbers together */
  425.     "sub", DYNAMIC,     /* subtraction */
  426.     "tim", DYNAMIC,     /* multiplication */
  427.     "div", DYNAMIC,     /* division */
  428.     "mod", DYNAMIC,     /* mod */
  429.     "neg", MONAMIC,     /* negate */
  430.     "cat", DYNAMIC,     /* concatinate string */
  431.     "lef", DYNAMIC,     /* left string(string, len) */
  432.     "rig", DYNAMIC,     /* right string(string, pos) */
  433.     "mid", TRINAMIC,    /* mid string(string, pos, len) */
  434.     "not", MONAMIC,     /* logical not */
  435.     "equ", DYNAMIC,     /* logical equality check */
  436.     "les", DYNAMIC,     /* logical less than */
  437.     "gre", DYNAMIC,     /* logical greater than */
  438.     "seq", DYNAMIC,     /* string logical equality check */
  439.     "sle", DYNAMIC,     /* string logical less than */
  440.     "sgr", DYNAMIC,     /* string logical greater than */
  441.     "ind", MONAMIC,     /* evaluate indirect value */
  442.     "and", DYNAMIC,     /* logical and */
  443.     "or",  DYNAMIC,     /* logical or */
  444.     "len", MONAMIC,     /* string length */
  445.     "upp", MONAMIC,     /* uppercase string */
  446.     "low", MONAMIC,     /* lower case string */
  447.     "tru", MONAMIC,     /* Truth of the universe logical test */
  448.     "asc", MONAMIC,     /* char to integer conversion */
  449.     "chr", MONAMIC,     /* integer to char conversion */
  450.     "gtk", NILNAMIC,    /* get 1 charater */
  451.     "rnd", MONAMIC,     /* get a random number */
  452.     "abs", MONAMIC,     /* absolute value of a number */
  453.     "sin", DYNAMIC,     /* find the index of one string in another */
  454.     "env", MONAMIC,     /* retrieve a system environment var */
  455.     "bin", MONAMIC,     /* loopup what function name is bound to a key */
  456.     "exi", MONAMIC,     /* check if a file exists */
  457.     "fin", MONAMIC,     /* look for a file on the path... */
  458.     "ban", DYNAMIC,     /* bitwise and     9-10-87  jwm */
  459.     "bor", DYNAMIC,     /* bitwise or     9-10-87  jwm */
  460.     "bxo", DYNAMIC,     /* bitwise xor     9-10-87  jwm */
  461.     "bno", MONAMIC,     /* bitwise not */
  462.     "xla", TRINAMIC,    /* XLATE character string translation */
  463.  
  464.