	-*-text-*-
Branched ME to ME2
DONE:
- The init file is me2.mco.  ME2 is the env var.
- Added a maybe arg to (current-window).  If arg, the current window is
  set to n.
- change register to bag
- (create-bag ?n), (free-bag bag-id ...)
- added (create-buffer), (free-buffer), (nth-buffer)
- add a maybe arg to (current-buffer).  If arg, the current buffer is
  set to n
- all buffer commands take buffer ids.
- removed (kill-buffer)
- removed (use-existing-buffer).
- (read-file-hook) called after a file is read in.
- added (goto-mark mark-id), (set-mark [mark-id]).
- changed set mark routine that is bound to key to set-the-mark.
- have shell-command return a error code.
- removed query-replace and re-query-replace.
- added search-replace and re-search-replace.
- moved re-search-forward, re-search-reverse, search-forward, and
  search-reverse to Mutt.
- cache some windows at startup to (hopefully) reduce malloc thrashing.
  Should also think about caching buffers and bags.
- Changed the way single line edits updates are done to fix a bug.
- Moved (goto-line n) to Mutt.  Added functionality:  if n < 0, goes to
  nth line from end of buffer.
- remove CR not giving a new line if a blank line is below.
- do more error checking in edinit().
- Removed (buffer-var) and (buffer-string)
- Added (create-buffer-var type name ...) and (buffer-var name [val]).
- Replaced (filter-region) with (OS-filter).
- Added (create-mark [n]) and (free-mark mark-id [n]).  Now have a
  unlimited number of marks per buffer.
- Changed (compare-dot-and-mark) to (compare-marks [mark1 mark2]).
- Added args to (region-stats).  Is now (region-stats blob [mark1 mark2]).
  Defaults to (DOT,THE-MARK).
- Removed (next-buffer).  Rewrote in mutt (hidebuf.mut).  Ignores
  Hidden2  buffers.
- Modified (nth-buffer) to return the count of the current buffer if no
  args.
- Modified (load) to take a search path ala Unix ksh (using the ME2 env
  var).  Current directory no longer automatically searched.  Hopefully,
  this will add support for lots of ME2 users using same .mco files and
  minor extensions.
- Added a tickle bit in the buffer flags for the the modified bit:
  BFMode (0x10).  Its write-only, it can't be set, is always 0.  If
  tickle it, all the modelines for the buffer are updated.  Use like so:
  (buffer-flags -1 BFMode).  Use it when you need to force modeline-hook
  to be called for a buffer.
- (buffer-flags ...) now properly reacts to the all the flags.  Used to
  not do much if the modified bit was changed.  Now will update
  modelines if needbe.  Note that modelines ONLY updated if the state of
  the bit changes.  Set the modified bit with (buffer-modified) and
  (buffer-flags) have the same results.
- UNDO prototyped and working (1/91).
- Dot is just mark 0.
- Removed case routines because they don't undo.
  Routines removed:  (case-region-lower), (case-region-upper),
    (case-word-capitalize), (case-word-lower), (case-word-upper)
  Replaced with:
    (case-text op bag-id op) where op is one of upper case, lower case
    or capitalize.  Case match with another string or bag (or query
    replace) would be nice.
  See case.mut for the new user routines.
- Added garbage collection for buffers, bags and marks (6/91).  This
  will be intergrated into Mutt2 when that gets done.  Added immortal
  bits to bags and buffers.  Changed (create-bag) to (create-bag
  [immortal]).  This is a limited gc, see other doc.
- Added functionality to (append-to-bag).  Can now append arbitrary
  region, characters or text to bag.  6/91
- Added arg to (visit-file).  If arg flag, use the current window to
  display the buffer.  Suggestion from David J Bartrum
  <djb%gmsws.co.uk@hplb.hpl.hp.com>.  6/91
- Added a "general" interrupt handler.
- Added a SIGWINCH signal handler so ME2 can detect and react window
  size changes.
- Moved garbage collection to process_hooks() because so many pgms are
  run as hooks.  Hopfully, this speed things up.  Relys on programmers
  being good most of the time.
- Prototyped a very rudimentry interprocess communication scheme.
  Tested with a clock (another process) in the modeline (ticking every
  second).  7/91
  Can run makes and process the results as they happen.
  (Unix only):  way to talk to a external process via signals and files
    (maybe pipes).  This would allow things like concurrent compiles and
    viewing the output as it happens and editing would not be
    interrupted.  Also would need a hook that is called when ex-proc
    sends something back to ME.  I could also use this to implement
    "tell me when I have mail", system load and current time on the
    modeline.
  Provides a mechinism that allows a process ME knows nothing about to
    send ME messages that ME passes on to to a hook.
- Modified the buffer var stuff to use the object manager (also used in
  MM).  This added lists as a buffer var type.  9/91
- Reworked the way I maintain marks (mark.c).  Removed multiple
  allocatation of marks.  Changed (create-mark) and (free-mark) to
  reflect these changes.  9/91
- (OS-filter) is a bool.  Doesn't abort if the filter fails.  User
  request.  9/91
- Added a sleazy hack to (load).  If arg is 42 and the block already
  exists, it is not loaded again.  This makes (require) work quiet and
  avoids loading things multiple times.  9/91
- (bag-to-string bag-id) : returns bag contents as a string. 9/91
- Added (swap-marks [mark-id [mark-id]]) 9/91
- Modified (window-height) so it can resize a window.  10/91
- Removed (enlarge-window) and (shrink-window).  Rewrote them in Mutt.
  10/91
- Removed (copy-rectangle) and moved the functionality to
  (append-to-bag).  10/91
- Changed the spelling of (isspace) to (is-space).  10/91
- Renamed delete-window to free-window  10/91
- Removed the buffer id from (clear-buffer).  I always seem to clear the
  current buffer (its easy) and removes a thorn from undo.  10/91
- Added boolean arg to (update).  If false, only sync window and current
    buffer dots.  Need this so I can have a window track a buffer while
    a program is running. 10/91
- Made file-to-bag and bag-to-file bools (instead of void).  In case you
  want to do something if an error occurs instead of die.  11/91
- Changed all keywords with "kill" in them to "cut" or "delete".  I'd
  rather not have programs that kill things - bad karma.  11/91
- Added pgm-exists.  I want/need this to implement maybe hooks (hooks
  that are only called if the hook exists).  12/91
- Added buffer bit to mark "interactive" buffers and two "soft" hooks
  (hooks in Mutt code:  iread-file and icreate-buffer) that are called
  if the buffer is marked interactive.  I do too much stuff (markring,
  mode setting, etc) for buffers that don't need it.  Could also use the
  mortal or nocare bits.

TODO
? turn off signals when fork shell or pause?  What if comserver sends
  stuff while paused?  select on return?  events_pending()
- ReDO
- UNDO tuning.
- (create-file-name):  Generate a unique file name ala (OS-filter).
  Used when need a filename in stuff that uses (shell-command).  Gotta
  make sure that multiple calls generate different names.
- (create-buffer-name file-name)  Since this is OS specific, easier to
  do in C, etc.
? (forward-character n) (forward-word n)
  Are these worth it?  Don't seem to be from the programs I've written.
? (delete-text n)  Del n characters from dot.   If <0, delete backwards.
  Is this worth it?  The cheap hack in delete_characters() seems to be
  good enough for the programs I've written.
- (region-to-mini) so I can yank a region to the command line and edit
  it (like grabing a compile line from the file).  Could also do this
  with command line programming.
? Remove HELP and add help-hook with args to do help stuff.
- When word wrap is on and you are banging on a white space key, the
  line is wrapped and you get an extra ws that you don't want.  To fix:
  only wrap on non-ws?
- make "space bar nukes msg line" configurable (via a sysvar?).
- Need better ways to control name space pollution.
  Maybe something like (extern package block-name block-name ...).  Then,
  to resolve a possible extern reference, search only those blocks.
- Need a way to point local/global key bindings at the routine level.
  ie if a bunch of keys are bound to (next-buffer), I want to be able to
  have those keys invoke (new-next-buffer) for this buffer.  I don't
  what to have to know what the keys are or remember them to undo this
  redirection.  Could do this by having buffer local routines.  It is
  eash to do this globally by just defuning a new routine called
  (next-buffer).  All the keys will bind to it.  Warning:  If it is in a
  block of the same name, keys will get gc'ed.
- Make overstrike a buffer local thing by having a flag in b_flags and
  set the global in use_buffer().
- Bring out thisflag and lastflag so Mutt can do stuff like chained
  kills.  Also, kbd macros don't use the flags right.
- change all op that act between mark and dot to act between 2 marks.
  eg (erase-rectangle) -> (erase-rectangle mark1 mark2)
? (current-time) returns the time.  What format? ascii, struct, ...?
? remove (compare-marks) cause its not used much.
? (copy-text-to-bag bag-id n) copy n characters from dot to bag.
? Remove kill buffer stuff from stuff like (delete-character).
? Remove insert-file.  Can get the functionality with
  (file-to-bag)(insert-bag).
- muttize bind routines, remove interactive ones.
- Better error recovery in resize_display().
- Have resize_display() not malloc() if the display size is smaller than
  current.  This helps core dumps on UNIX.  Also, don't reread termcap?
? (copy-to-bag) since its used so much.
? remove all stuffing of killbuffer as kill (line.c, killbuf.c).
  Instead, copy the data to a bag, then erase it.  Con: maybe slower
  (2 passes), if close to the mem limit, might have more problems.
? (clear-mark mark-id ...)(clear-mark) clears all marks?
? inverse video an area between 2 marks
? (mark-exists mark-id)
? use fast string search - strstr().
? windows that are narrower and smaller that the screen that can be
  placed anywhere on the screen.  ie disjoint windows - would also be
  handi for windowing systems.  Also, the popup menu packages could be
  spiffed up.
- Ability to command complete arbitrary lists.
? (file-read) reads the file.  You have to check.  No asking.
  Can get this with (clear-buffer -1)(read-file foo)
- Try to remove ABORT as much as possible.
? Have 2 key maps - one lower to upper and one straight through.  Then
  can use a pointer to it in buffer for case folding.
- Support for multiple screens.  A screen is the thing that holds
  windows.  Each screen has its own width, height, etc.  With this I
  should be able to implement work spaces, add enough hooks for X and
  maybe stacked windows.
- Workspaces:  Instead of mearly hiding buffers, have workspaces.  These
  are seprate contexts.  Might be better done as running another ME2.
