home *** CD-ROM | disk | FTP | other *** search
- This documentation covers mg 2a.
-
- I do want feedback from other mg developers on what they think of my
- changes, documentation, and what needs to be done to make mg better.
- This document is not complete, it mainly covers the areas I have
- recently changed.
-
- Possible future changes:
-
- Rearange file contents along more rational lines. Further split the
- monolithic def.h file.
-
- Changing the echo line stuff to use a minibuffer keymap.
-
- Making the kill buffer a linked list of lines.
-
- Variables.
-
- Allow for backspace, ^s, etc. to be changed in some reasonable manner.
- (Probably using variables or a simulation thereof.) I do not think an
- input keymap is the correct solution, even if it is frequently used in
- Gnu emacs. (Besides the extra overhead, keynames come out wrong.)
-
- Make long lines wrap like they do in GNU emacs.
-
- Fix known (and unknown :-) bugs.
-
- Have the keymaps and associated tables generated by a program.
-
-
- Known bugs/limitations:
-
- Binding a key in a named keymap may or may not change the binding of
- other keys pointing to the same keymap. (i.e. if ^H and ^_ are bound
- to help, rebinding ^Hb may not (or may) change ^_b. This can be cured
- by rebinding ^_ to help.)
-
- Overwrite mode does not work in macros. (Characters are inserted
- rather than overwriting.)
-
- Dired mode has some problems: Rename does not update the buffer.
- Doing a dired again will update the buffer (whether it needs it or
- not) and will lose any marks for deletion. .. and . are not
- recognized as special cases.
-
-
-
- New implementation oddities:
-
- insert and define-key are new commands corresponding to the mocklisp
- functions in Gnu Emacs. (Mg does not have non-command functions.)
- (Mg's insert will only insert one string.)
-
- The display wrap code does not work at all like that of GNU emacs.
-
-
-
- Adding command functions to mg:
-
- Command functions take two integer aguments and return an integer.
- The first argument, f, is a set of flags. (f&FFARG) is non-zero if a
- numeric arguement was passed to the function. (There are bits
- indicating how the agument was specified, but they are not fully
- impleminted.) (f&FFRAND) is non-zero if the function is being called
- by another function and that possibly slightly different action should
- be taken. (No error checking, supress output, etc.) The second
- argument, n, is the numeric agument passed or one if there was no
- numeric arugment. The fuction should return TRUE if it executes
- correctly, FALSE if it could not, and ABORT if the user typed the
- keyboard quit character at a prompt.
-
- The function must be added to the functnames table in keymap.c. This
- table must be kept in assending ascii sequence.
-
-
-
- Key maps:
-
- Key maps are structures containing information on what action should
- be taken corresponding to an individual keypress. That action could
- be an indication that this is a prefix key and the next kepress should
- be looked up in another keymap.
-
- Example keymap:
-
- static struct KEYMAPE(6+IMAPEXT) cXmap = {
- 6,
- 6+IMAPEXT,
- rescan,
- {
- {CCHR('B'),CCHR('G'), cXcB, (KEYMAP *)NULL},
- {CCHR('L'),CCHR('X'), cXcL, (KEYMAP *)NULL},
- {'(', ')', cXlp, (KEYMAP *)NULL},
- {'0', '4', cX0, (KEYMAP *)&cX4map},
- {'=', '=', cXeq, (KEYMAP *)NULL},
- {'^', 's', cXcar, (KEYMAP *)NULL},
- }
- };
-
- (Note: this example is a simplified example of a real keymap in keymap.c.)
-
- Since C does not directly support structures containing undementioned
- arrays, the macro KEYMAPE is used to create a structure with an array
- of the proper size. 6 is the current size of the array, and IMAPEXT
- is the number of extra elements left for future groth (by rebinding
- keys) before the map must be reallocated. rescan is the function to
- be executed if a specific entry for the key is not found. (rescan is
- a special function that searches for something else to do -- first by
- trying lowercasing the last character in the keymap, then by trying
- the other modes in effect.)
-
- The array elements must be in order by the keys they define. Each
- covers a range of characters. Numeric values should not be used for
- characters, they make porting mg to some other systems harder. The
- CCHR macro may be used to specify control characters, including DEL
- (CCHR('?')). cXcB, cXcL, etc. are arrays of pointers to functions
- returning int. One of these fuction pointers per element may be to
- the pseuto-function prefix. cX4map is the keymap coresponding to the
- prefix function bound to '4' in this keymap. Having several keys in
- an element bound to the default function is better than increasing the
- number of elements.
-
-
-
- Modes:
-
- Modes are named key maps that are scanned for key bindings before the
- global keymap is. There are functions in modes.c to toggle modes on
- or off for individual buffers. Note that the "major"/"minor" mode
- distiction is different than in Gnu Emacs. Dired is currently the
- only major mode available, buffers are put into dired mode on creation
- by the dired code. (The distiction in mg is the major mode replaces
- the default keymap instead of being an overlay.) Some modes (overwrite
- and no-tab) also trigger per-buffer flags that should be convered to
- per-buffer variables when we add variables. Keymaps for the modes are
- kept in keymap.c with the other keymaps.
-
-
-
- System dependent files:
-
- Fileio.c:
- Contains file i/o routines:
- ffputbuf(BUFFER *):
- Write all lines of buffer to the file. The last line of the buffer does
- NOT have the normally implied newline. (One may be added if
- nessisary, but don't write out the last line if it is zero characters
- long.)
-
- ffgetline(char *buf, int nbuf, int *nbytes):
- Read a line from the file up to the length specified by the second
- argument in to the buffer pointed to by the first. If a newline is
- not found after reading nbuf characters, return FIOLONG and on the
- next call to ffgetline return the remaining portion (or nbuf more
- characters and return FIOLONG). If a newline is found, set *nbytes to
- the number of characters read and return FIOSUC. If the end of file
- is descovered, set *nbytes and return FIOEOF. (If the file ends in a
- newline, the call returning FIOEOF will set *nbytes to 0.) If any
- other error occurs, return FIOERR.
-
- char *adjustname(char *fname)
- Standardize filename. On mono-case systems, lowercase the file name.
- If NO_DIR is not defined, make fully qualified. (not relitive to the
- current directory, which may change.)
-
- fncmp(char *fna, char *fnb)
- Return 0 if both arguments refer to the same file or buffer. #define
- it to be strcmp on mono-case or case sensitive systems, use a non-case
- sensitive compareison otherwise. (Borrow it from the osk fileio.c)
- Both arguments have been through adjustname already.
-
- routines needed for dired:
-
- rename(char *fromname, char *toname)
- rename file. BSD systems have this as a system call. return -1 on
- error.
-
- copy(char *fromname, char *toname)
- copy file. return -1 on error.
-
- unlinkdir(char *name)
- Delete directory. return -1 on error. (possibly including non-empty
- directory.)
-
- BUFFER *dired_(char *name)
- Create dired buffer for named directory. See example from osk or bsd.
-
- d_makename(LINE *l, char *fname)
- Concatinate directory name associated with the current dired BUFFER
- with file name in line. Return ABORT if no file name on line, FALSE
- if it is an ordinary file, or TRUE if there is a directory. Name made
- should be the same as if it were run through adjustname.
-
-
- Converting system & terminal dependent files from mg1b:
-
- All command functions will have to be rewritten to use the new two
- argument calling sequence. (Some compilers will let you get away
- without doing this for testing purposes. Problems, if any, will show
- up at run-time.)
-
- Key binding is completly different. See extend.c if your code needs
- to do rebinding.
-
- I have attempted make mg less dependant on ascii character values.
- Keymap.c depends on ascii sorting order. Cinfo.c depends on character
- values and contains a function to convert from a character value
- to a key name. Several modules assume 3 octal digits are enough for
- any character value.
-
- Names of most compile time options have changed. Whatever is most
- GNU-emacs like is now the default.
-
- sysdef.h:
- The type KEY should not be defined. The type KCHAR should be defined.
- All posible key inputs must be positive in type KCHAR. short is
- recomended.
-
- spawn.c:
- Update to the new function calling conventions.
-
- Makefile:
- Needs complete rewrite. You can probably figure out the dependencies
- from the bsd or osk one. Compile time options have changed.
-
- Fileio.c:
- Remove function ffputline. Add function ffputbuf (described above).
- Rewrite ffgetline to conform to the new way of doing things. (see
- above.) These routines can probably be borrowed intact from the
- OSK system dependant fileio.c for unix systems.
- Replace adjustcase with adjustname. Add fncmp either here or
- as a #define in sysdef.h. Add functions needed by dired.
-
-
-
-
- Compile time options:
-
- extentions not directly in gnu emacs
-
- BSMAP input mapping exchanging ^H and DEL.
- 1 for defaulting to this, 0 for normal default.
- NOTAB for systems that don't like tabs
- CVMVAS arguments to ^V in screens not lines
- PREFIXREGION prefix region
- PREVWIND previous window
- GOSREC Gossling style recenter
- STARTUPFILE (unix & OSK) system-wide startup file
- XKEYS (Termcap) Put kepad in alternate mode, use
- terminal-dependent startup file.
-
- Features removeable to save space
-
- NO_HELP help, descibe-bindings, describe-key-briefly, apropos
- NO_MACRO keyboard macros. If defined, NO_STARTUP must be also.
- NO_STARTUP startup files, load, etc.
- NO_BACKUP backup files when writing
- NO_DPROMPT Delayed prompt on multi-key sequences
- NO_DIR Dir change functions. If defined, NO_DIRED must be also.
- NO_DIRED Dired mode
- REGEX Regular expressions. Not default, since the code is rather
- unportable and has the GNU copywrite on it.
-
- System dependant garbage (avoid where practical)
-
- VMS VMS
- AMIGA AMIGA
-
-
- Things that may be defined in system dependant code:
-
- XCHAR XCHAR and XSHORT (char and short for space savings)
- BDC2 more special characters for filenames
- BDC3 dito.
- METABIT Bit of KCHAR set on meta keys
- OFFSET macro to calculate offset of member from start of structure
- NBLOCK line growth amount
- KBLOCK kill buffer growth amount
- MALLOCROUND macro to predict malloc allocations stratagy
- SYSINIT system dependant initialization
- NO_VOID_TYPE compiler dosen't have type void
- ZEROARRAY zero length arrays are allowed
- BINDKEY include bindkey routine for use by system & terminal
- dependent code.
-
- Terminal dependant
-
- DO_METAKEY meta key
- METABIT Which bit in a KCHAR is used by the meta key (default 0x80)
- STANDOUT_GLITCH standout (may) take character position(s)
- GOSLING optimize redisplay
- MEMMAP memory mapped display
- MOVE_STANDOUT cursor addressing may be done in standout mode
- FKEYS function keys do not fit in type char.
- Not for use where function keys send multiple characters.
-