-*-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 . 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.