diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2000-02-25 19:08:53 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2000-02-25 19:08:53 +0000 |
commit | 998d769a0cf8bef7d4ca0d26945c151a23b542ec (patch) | |
tree | fe53a083eaa06a2bf7631453e18a161a86ad9d62 /usr.bin/mg/keymap.c | |
parent | b0226ecd4460819556afd27fd575d64421fd0f68 (diff) |
initial import of mg2a
Diffstat (limited to 'usr.bin/mg/keymap.c')
-rw-r--r-- | usr.bin/mg/keymap.c | 1217 |
1 files changed, 1217 insertions, 0 deletions
diff --git a/usr.bin/mg/keymap.c b/usr.bin/mg/keymap.c new file mode 100644 index 00000000000..d880bce016d --- /dev/null +++ b/usr.bin/mg/keymap.c @@ -0,0 +1,1217 @@ +/* + * Keyboard maps. This is character set dependent. + * The terminal specific parts of building the + * keymap has been moved to a better place. + */ +#include "def.h" +#include "kbd.h" + +/* + * Defined by "basic.c". + */ +extern int gotobol(); /* Move to start of line */ +extern int backchar(); /* Move backward by characters */ +extern int gotoeol(); /* Move to end of line */ +extern int forwchar(); /* Move forward by characters */ +extern int gotobob(); /* Move to start of buffer */ +extern int gotoeob(); /* Move to end of buffer */ +extern int forwline(); /* Move forward by lines */ +extern int backline(); /* Move backward by lines */ +extern int forwpage(); /* Move forward by pages */ +extern int backpage(); /* Move backward by pages */ +extern int pagenext(); /* Page forward next window */ +extern int setmark(); /* Set mark */ +extern int swapmark(); /* Swap "." and mark */ +extern int gotoline(); /* Go to a specified line. */ +#ifdef GOSMACS +extern int forw1page(); /* move forward by lines */ +extern int back1page(); /* move back by lines */ +#endif + +/* + * Defined by "buffer.c". + */ +extern int listbuffers(); /* Display list of buffers */ +extern int usebuffer(); /* Switch a window to a buffer */ +extern int poptobuffer(); /* Other window to a buffer */ +extern int killbuffer(); /* Make a buffer go away. */ +extern int savebuffers(); /* Save unmodified buffers */ +extern int bufferinsert(); /* Insert buffer into another */ +extern int notmodified(); /* Reset modification flag */ + +#ifndef NO_DIR +/* + * Defined by "dir.c" + */ +extern int changedir(); /* change current directory */ +extern int showcwdir(); /* show current directory */ + +#ifndef NO_DIRED +/* + * defined by "dired.c" + */ +extern int dired(); /* dired */ +extern int d_findfile(); /* dired find file */ +extern int d_del(); /* dired mark for deletion */ +extern int d_undel(); /* dired unmark */ +extern int d_undelbak(); /* dired unmark backwards */ +extern int d_expunge(); /* dired expunge */ +extern int d_copy(); /* dired copy */ +extern int d_rename(); /* dired rename */ +extern int d_otherwindow(); /* dired other window */ +extern int d_ffotherwindow(); /* dired find file other window */ +#endif +#endif + +/* + * Defined by "extend.c". + */ +extern int extend(); /* Extended commands. */ +extern int bindtokey(); /* Modify global key bindings. */ +extern int localbind(); /* Modify mode key bindings. */ +extern int define_key(); /* modify any key map */ +extern int unbindtokey(); /* delete global binding */ +extern int localunbind(); /* delete local binding */ +extern int insert(); /* insert string */ +#ifndef NO_STARTUP +extern int evalexpr(); /* Extended commands (again) */ +extern int evalbuffer(); /* Evaluate current buffer */ +extern int evalfile(); /* Evaluate a file */ +#endif + +/* + * Defined by "file.c". + */ +extern int filevisit(); /* Get a file, read write */ +extern int poptofile(); /* Get a file, other window */ +extern int filewrite(); /* Write a file */ +extern int filesave(); /* Save current file */ +extern int fileinsert(); /* Insert file into buffer */ +#ifndef NO_BACKUP +extern int makebkfile(); /* Control backups on saves */ +#endif + +/* + * defined by help.c + */ +#ifndef NO_HELP +extern int desckey(); /* describe key */ +extern int wallchart(); /* Make wall chart. */ +extern int help_help(); /* help help */ +extern int apropos_command(); /* apropos */ +#endif + +/* + * defined by "kbd.c" + */ +#ifdef DO_METAKEY +extern int do_meta(); /* interpret meta keys */ +#endif +#ifdef BSMAP +extern int bsmap(); /* backspace mapping */ +#endif +extern int universal_argument(); /* Ctrl-U */ +extern int digit_argument(); /* M-1, etc. */ +extern int negative_argument(); /* M-- */ +extern int selfinsert(); /* Insert character */ +extern int rescan(); /* internal try again function */ + +/* + * defined by "macro.c" + */ +#ifndef NO_MACRO +extern int definemacro(); /* Begin macro */ +extern int finishmacro(); /* End macro */ +extern int executemacro(); /* Execute macro */ +#endif + +/* + * Defined by "main.c". + */ +extern int ctrlg(); /* Abort out of things */ +extern int quit(); /* Quit */ + +/* + * Defined by "match.c" + */ +extern int showmatch(); /* Hack to show matching paren */ + +/* defined by "modes.c" */ + +extern int indentmode(); /* set auto-indent mode */ +extern int fillmode(); /* set word-wrap mode */ +extern int blinkparen(); /* Fake blink-matching-paren var */ +#ifdef NOTAB +extern int notabmode(); /* no tab mode */ +#endif +extern int overwrite(); /* overwrite mode */ +extern int set_default_mode(); /* set default modes */ + +/* + * defined by "paragraph.c" - the paragraph justification code. + */ +extern int gotobop(); /* Move to start of paragraph. */ +extern int gotoeop(); /* Move to end of paragraph. */ +extern int fillpara(); /* Justify a paragraph. */ +extern int killpara(); /* Delete a paragraph. */ +extern int setfillcol(); /* Set fill column for justify. */ +extern int fillword(); /* Insert char with word wrap. */ + +/* + * Defined by "random.c". + */ +extern int showcpos(); /* Show the cursor position */ +extern int twiddle(); /* Twiddle characters */ +extern int quote(); /* Insert literal */ +extern int openline(); /* Open up a blank line */ +extern int newline(); /* Insert newline */ +extern int deblank(); /* Delete blank lines */ +extern int justone(); /* Delete extra whitespace */ +extern int delwhite(); /* Delete all whitespace */ +extern int indent(); /* Insert newline, then indent */ +extern int forwdel(); /* Forward delete */ +extern int backdel(); /* Backward delete in */ +extern int killline(); /* Kill forward */ +extern int yank(); /* Yank back from killbuffer. */ +#ifdef NOTAB +extern int space_to_tabstop(); +#endif + +#ifdef REGEX +/* + * Defined by "re_search.c" + */ +extern int re_forwsearch(); /* Regex search forward */ +extern int re_backsearch(); /* Regex search backwards */ +extern int re_searchagain(); /* Repeat regex search command */ +extern int re_queryrepl(); /* Regex query replace */ +extern int setcasefold(); /* Set case fold in searches */ +extern int delmatchlines(); /* Delete all lines matching */ +extern int delnonmatchlines(); /* Delete all lines not matching */ +extern int cntmatchlines(); /* Count matching lines */ +extern int cntnonmatchlines(); /* Count nonmatching lines */ +#endif + +/* + * Defined by "region.c". + */ +extern int killregion(); /* Kill region. */ +extern int copyregion(); /* Copy region to kill buffer. */ +extern int lowerregion(); /* Lower case region. */ +extern int upperregion(); /* Upper case region. */ +#ifdef PREFIXREGION +extern int prefixregion(); /* Prefix all lines in region */ +extern int setprefix(); /* Set line prefix string */ +#endif + +/* + * Defined by "search.c". + */ +extern int forwsearch(); /* Search forward */ +extern int backsearch(); /* Search backwards */ +extern int searchagain(); /* Repeat last search command */ +extern int forwisearch(); /* Incremental search forward */ +extern int backisearch(); /* Incremental search backwards */ +extern int queryrepl(); /* Query replace */ + +/* + * Defined by "spawn.c". + */ +extern int spawncli(); /* Run CLI in a subjob. */ +extern int attachtoparent(); /* Attach to parent process */ + +/* defined by "version.c" */ + +extern int showversion(); /* Show version numbers, etc. */ + +/* + * Defined by "window.c". + */ +extern int reposition(); /* Reposition window */ +extern int refresh(); /* Refresh the screen */ +extern int nextwind(); /* Move to the next window */ +#ifdef GOSMACS +extern int prevwind(); /* Move to the previous window */ +#endif +extern int onlywind(); /* Make current window only one */ +extern int splitwind(); /* Split current window */ +extern int delwind(); /* Delete current window */ +extern int enlargewind(); /* Enlarge display window. */ +extern int shrinkwind(); /* Shrink window. */ + +/* + * Defined by "word.c". + */ +extern int backword(); /* Backup by words */ +extern int forwword(); /* Advance by words */ +extern int upperword(); /* Upper case word. */ +extern int lowerword(); /* Lower case word. */ +extern int capword(); /* Initial capitalize word. */ +extern int delfword(); /* Delete forward word. */ +extern int delbword(); /* Delete backward word. */ + +#ifdef AMIGA +#ifdef DO_ICONIFY +extern int tticon(); +#endif +#ifdef DO_MENU +extern int amigamenu(); /* Menu function */ +#endif +#ifdef MOUSE +extern int amigamouse(); /* Amiga mouse functions */ +extern int mgotobob(); +extern int mforwdel(); +extern int mdelwhite(); +extern int mdelwind(); +extern int mgotoeob(); +extern int menlargewind(); +extern int mkillline(); +extern int mkillregion(); +extern int mdelfword(); +extern int mreposition(); +extern int mbackpage(); +extern int mforwpage(); +extern int mshrinkwind(); +extern int msplitwind(); +extern int myank(); +#endif MOUSE + +extern int togglewindow(); /* Defined by "ttyio.c" */ +extern int togglezooms(); /* "" "" */ + +#ifdef CHANGE_FONT +extern int setfont(); /* Defined by "ttyio.c" */ +#endif + +#ifdef CHANGE_COLOR + /* functions to mess with the mode line rendition, window colors*/ +extern int ttmode(); /* Defined by "tty.c" */ +extern int tttext(); /* "" */ +extern int textforeground(); /* "" */ +extern int textbackground(); /* "" */ +extern int modeforeground(); /* "" */ +extern int modebackground(); /* "" */ +#endif + +/* + * This file contains map segment definitions for adding function keys to + * keymap declarations. Currently you can add things to the fundamental + * mode keymap and the dired mode keymap. See the declaration of + * diredmap and fundmap for details. + */ +#include "amiga_maps.c" + +#endif /* AMIGA */ + +/* initial keymap declarations, deepest first */ + +#ifndef NO_HELP +static PF cHcG[] = { + ctrlg, /* ^G */ + help_help, /* ^H */ +}; +static PF cHa[] = { + apropos_command,/* a */ + wallchart, /* b */ + desckey, /* c */ +}; +static struct KEYMAPE(2+IMAPEXT) helpmap = { + 2, + 2+IMAPEXT, + rescan, + { + {CCHR('G'),CCHR('H'), cHcG, (KEYMAP *)NULL}, + {'a', 'c', cHa, (KEYMAP *)NULL}, + } +}; +#endif + +static struct KEYMAPE(1+IMAPEXT) extramap1 = { + 0, + 1+IMAPEXT, + rescan +}; + +static struct KEYMAPE(1+IMAPEXT) extramap2 = { + 0, + 1+IMAPEXT, + rescan +}; + +static struct KEYMAPE(1+IMAPEXT) extramap3 = { + 0, + 1+IMAPEXT, + rescan +}; + +static struct KEYMAPE(1+IMAPEXT) extramap4 = { + 0, + 1+IMAPEXT, + rescan +}; + +static struct KEYMAPE(1+IMAPEXT) extramap5 = { + 0, + 1+IMAPEXT, + rescan +}; + +static PF cX4cF[] = { + poptofile, /* ^f */ + ctrlg, /* ^g */ +}; +static PF cX4b[] = { + poptobuffer, /* b */ + rescan, /* c */ + rescan, /* d */ + rescan, /* e */ + poptofile, /* f */ +}; +static struct KEYMAPE(2+IMAPEXT) cX4map = { + 2, + 2+IMAPEXT, + rescan, + { + {CCHR('F'),CCHR('G'), cX4cF, (KEYMAP *)NULL}, + {'b', 'f', cX4b, (KEYMAP *)NULL}, + } +}; + +static PF cXcB[] = { + listbuffers, /* ^B */ + quit, /* ^C */ + rescan, /* ^D */ + rescan, /* ^E */ + filevisit, /* ^F */ + ctrlg, /* ^G */ +}; +static PF cXcL[] = { + lowerregion, /* ^L */ + rescan, /* ^M */ + rescan, /* ^N */ + deblank, /* ^O */ + rescan, /* ^P */ + rescan, /* ^Q */ + rescan, /* ^R */ + filesave, /* ^S */ + rescan, /* ^T */ + upperregion, /* ^U */ + rescan, /* ^V */ + filewrite, /* ^W */ + swapmark, /* ^X */ +}; +#ifndef NO_MACRO +static PF cXlp[] = { + definemacro, /* ( */ + finishmacro, /* ) */ +}; +#endif +static PF cX0[] = { + delwind, /* 0 */ + onlywind, /* 1 */ + splitwind, /* 2 */ + rescan, /* 3 */ + prefix, /* 4 */ +}; +static PF cXeq[] = { + showcpos, /* = */ +}; +static PF cXcar[] = { + enlargewind, /* ^ */ + rescan, /* _ */ + rescan, /* ` */ + rescan, /* a */ + usebuffer, /* b */ + rescan, /* c */ +#ifndef NO_DIRED + dired, /* d */ +#else + rescan, /* d */ +#endif +#ifndef NO_MACRO + executemacro, /* e */ +#else + rescan, /* e */ +#endif + setfillcol, /* f */ + rescan, /* g */ + rescan, /* h */ + fileinsert, /* i */ + rescan, /* j */ + killbuffer, /* k */ + rescan, /* l */ + rescan, /* m */ + rescan, /* n */ + nextwind, /* o */ + rescan, /* p */ + rescan, /* q */ + rescan, /* r */ + savebuffers, /* s */ +}; +#ifndef NO_MACRO +static struct KEYMAPE(6+IMAPEXT) cXmap = { + 6, + 6+IMAPEXT, +#else +static struct KEYMAPE(5+IMAPEXT) cXmap = { + 5, + 5+IMAPEXT, +#endif + rescan, + { + {CCHR('B'),CCHR('G'), cXcB, (KEYMAP *)NULL}, + {CCHR('L'),CCHR('X'), cXcL, (KEYMAP *)NULL}, +#ifndef NO_MACRO + {'(', ')', cXlp, (KEYMAP *)NULL}, +#endif + {'0', '4', cX0, (KEYMAP *)&cX4map}, + {'=', '=', cXeq, (KEYMAP *)NULL}, + {'^', 's', cXcar, (KEYMAP *)NULL}, + } +}; + +static PF metacG[] = { + ctrlg, /* ^G */ +}; +static PF metacV[] = { + pagenext, /* ^V */ +}; +static PF metasp[] = { + justone, /* space */ +}; +static PF metapct[] = { + queryrepl, /* % */ +}; +static PF metami[] = { + negative_argument, /* - */ + rescan, /* . */ + rescan, /* / */ + digit_argument, /* 0 */ + digit_argument, /* 1 */ + digit_argument, /* 2 */ + digit_argument, /* 3 */ + digit_argument, /* 4 */ + digit_argument, /* 5 */ + digit_argument, /* 6 */ + digit_argument, /* 7 */ + digit_argument, /* 8 */ + digit_argument, /* 9 */ + rescan, /* : */ + rescan, /* ; */ + gotobob, /* < */ + rescan, /* = */ + gotoeob, /* > */ +}; +static PF metalb[] = { + gotobop, /* [ */ + delwhite, /* \ */ + gotoeop, /* ] */ + rescan, /* ^ */ + rescan, /* _ */ + rescan, /* ` */ + rescan, /* a */ + backword, /* b */ + capword, /* c */ + delfword, /* d */ + rescan, /* e */ + forwword, /* f */ +}; +static PF metal[] = { + lowerword, /* l */ + rescan, /* m */ + rescan, /* n */ + rescan, /* o */ + rescan, /* p */ + fillpara, /* q */ + backsearch, /* r */ + forwsearch, /* s */ + rescan, /* t */ + upperword, /* u */ + backpage, /* v */ + copyregion, /* w */ + extend, /* x */ +}; +static PF metatilde[] = { + notmodified, /* ~ */ + delbword, /* DEL */ +}; +static struct KEYMAPE(8+IMAPEXT) metamap = { + 8, + 8+IMAPEXT, + rescan, + { + {CCHR('G'),CCHR('G'), metacG, (KEYMAP *)NULL}, + {CCHR('V'),CCHR('V'), metacV, (KEYMAP *)NULL}, + {' ', ' ', metasp, (KEYMAP *)NULL}, + {'%', '%', metapct,(KEYMAP *)NULL}, + {'-', '>', metami, (KEYMAP *)NULL}, + {'[', 'f', metalb, (KEYMAP *)NULL}, + {'l', 'x', metal, (KEYMAP *)NULL}, + {'~', CCHR('?'), metatilde,(KEYMAP *)NULL}, + } +}; + +static PF fund_at[] = { + setmark, /* ^@ */ + gotobol, /* ^A */ + backchar, /* ^B */ + rescan, /* ^C */ + forwdel, /* ^D */ + gotoeol, /* ^E */ + forwchar, /* ^F */ + ctrlg, /* ^G */ +#ifndef NO_HELP + prefix, /* ^H */ +#else + rescan, /* ^H */ +#endif +}; +/* ^I is selfinsert */ +static PF fund_CJ[] = { + indent, /* ^J */ + killline, /* ^K */ + reposition, /* ^L */ + newline, /* ^M */ + forwline, /* ^N */ + openline, /* ^O */ + backline, /* ^P */ + quote, /* ^Q */ + backisearch, /* ^R */ + forwisearch, /* ^S */ + twiddle, /* ^T */ + universal_argument, /* ^U */ + forwpage, /* ^V */ + killregion, /* ^W */ + prefix, /* ^X */ + yank, /* ^Y */ + attachtoparent, /* ^Z */ +}; +static PF fund_esc[] = { + prefix, /* esc */ + rescan, /* ^\ */ /* selfinsert is default on fundamental */ + rescan, /* ^] */ + rescan, /* ^^ */ + rescan, /* ^_ */ +}; +static PF fund_del[] = { + backdel, /* DEL */ +}; + +#ifndef FUND_XMAPS +#define NFUND_XMAPS 0 /* extra map sections after normal ones */ +#endif + +static struct KEYMAPE(4+NFUND_XMAPS+IMAPEXT) fundmap = { + 4 + NFUND_XMAPS, + 4 + NFUND_XMAPS + IMAPEXT, + selfinsert, + { +#ifndef NO_HELP + {CCHR('@'),CCHR('H'), fund_at, (KEYMAP *)&helpmap}, +#else + {CCHR('@'),CCHR('H'), fund_at, (KEYMAP *)NULL}, +#endif + {CCHR('J'),CCHR('Z'), fund_CJ, (KEYMAP *)&cXmap}, + {CCHR('['),CCHR('_'), fund_esc,(KEYMAP *)&metamap}, + {CCHR('?'),CCHR('?'), fund_del,(KEYMAP *)NULL}, +#ifdef FUND_XMAPS + FUND_XMAPS, +#endif + } +}; + +static PF fill_sp[] = { + fillword, /* ' ' */ +}; +static struct KEYMAPE(1+IMAPEXT) fillmap = { + 1, + 1+IMAPEXT, + rescan, + { + {' ', ' ', fill_sp, (KEYMAP *)NULL}, + } +}; + +static PF indent_lf[] = { + newline, /* ^J */ + rescan, /* ^K */ + rescan, /* ^L */ + indent, /* ^M */ +}; +static struct KEYMAPE(1+IMAPEXT) indntmap = { + 1, + 1+IMAPEXT, + rescan, + { + {CCHR('J'), CCHR('M'), indent_lf, (KEYMAP *)NULL}, + } +}; +static PF blink_rp[] = { + showmatch, /* ) */ +}; +static struct KEYMAPE(1+IMAPEXT) blinkmap = { + 1, + 1+IMAPEXT, + rescan, + { + {')', ')', blink_rp, (KEYMAP *)NULL}, + } +}; + +#ifdef NOTAB +static PF notab_tab[] = { + space_to_tabstop, /* ^I */ +}; +static struct KEYMAPE(1+IMAPEXT) notabmap = { + 1, + 1+IMAPEXT, + rescan, + { + {CCHR('I'),CCHR('I'), notab_tab, (KEYMAP *)NULL}, + } +}; +#endif + +static struct KEYMAPE(1+IMAPEXT) overwmap = { + 0, + 1+IMAPEXT, /* 1 to avoid 0 sized array */ + rescan, + { + /* unused dummy entry for VMS C */ + {(KCHAR)0, (KCHAR)0, (PF *)NULL, (KEYMAP *)NULL}, + } +}; + +#ifndef NO_DIRED +static PF dirednul[] = { + setmark, /* ^@ */ + gotobol, /* ^A */ + backchar, /* ^B */ + rescan, /* ^C */ + d_del, /* ^D */ + gotoeol, /* ^E */ + forwchar, /* ^F */ + ctrlg, /* ^G */ +#ifndef NO_HELP + prefix, /* ^H */ +#endif +}; +static PF diredcl[] = { + reposition, /* ^L */ + forwline, /* ^M */ + forwline, /* ^N */ + rescan, /* ^O */ + backline, /* ^P */ + rescan, /* ^Q */ + backisearch, /* ^R */ + forwisearch, /* ^S */ + rescan, /* ^T */ + universal_argument, /* ^U */ + forwpage, /* ^V */ + rescan, /* ^W */ + prefix, /* ^X */ +}; +static PF diredcz[] = { + attachtoparent, /* ^Z */ + prefix, /* esc */ + rescan, /* ^\ */ + rescan, /* ^] */ + rescan, /* ^^ */ + rescan, /* ^_ */ + forwline, /* SP */ +}; +static PF diredc[] = { + d_copy, /* c */ + d_del, /* d */ + d_findfile, /* e */ + d_findfile, /* f */ +}; +static PF diredn[] = { + forwline, /* n */ + d_ffotherwindow,/* o */ + backline, /* p */ + rescan, /* q */ + d_rename, /* r */ + rescan, /* s */ + rescan, /* t */ + d_undel, /* u */ + rescan, /* v */ + rescan, /* w */ + d_expunge, /* x */ +}; +static PF direddl[] = { + d_undelbak, /* del */ +}; + +#ifndef DIRED_XMAPS +#define NDIRED_XMAPS 0 /* number of extra map sections */ +#endif + +static struct KEYMAPE(6 + NDIRED_XMAPS + IMAPEXT) diredmap = { + 6 + NDIRED_XMAPS, + 6 + NDIRED_XMAPS + IMAPEXT, + rescan, + { +#ifndef NO_HELP + {CCHR('@'), CCHR('H'), dirednul, (KEYMAP *)&helpmap}, +#else + {CCHR('@'), CCHR('G'), dirednul, (KEYMAP *)NULL}, +#endif + {CCHR('L'), CCHR('X'), diredcl, (KEYMAP *)&cXmap}, + {CCHR('Z'), ' ', diredcz, (KEYMAP *)&metamap}, + {'c', 'f', diredc, (KEYMAP *)NULL}, + {'n', 'x', diredn, (KEYMAP *)NULL}, + {CCHR('?'), CCHR('?'), direddl, (KEYMAP *)NULL}, +#ifdef DIRED_XMAPS + DIRED_XMAPS, /* map sections for dired mode keys */ +#endif + } +}; +#endif + +/* give names to the maps, for use by help etc. + * If the map is to be bindable, it must also be listed in the + * function name table below with the same name. + * Maps created dynamicly currently don't get added here, thus are unnamed. + * Modes are just named keymaps with functions to add/subtract them from + * a buffer's list of modes. If you change a mode name, change it in + * modes.c also. + */ + +MAPS map_table[] = { + /* fundamental map MUST be first entry */ + {(KEYMAP *)&fundmap, "fundamental"}, + {(KEYMAP *)&fillmap, "fill"}, + {(KEYMAP *)&indntmap, "indent"}, + {(KEYMAP *)&blinkmap, "blink"}, +#ifdef NOTAB + {(KEYMAP *)¬abmap, "notab"}, +#endif + {(KEYMAP *)&overwmap, "overwrite"}, + {(KEYMAP *)&metamap, "esc prefix"}, + {(KEYMAP *)&cXmap, "c-x prefix"}, + {(KEYMAP *)&cX4map, "c-x 4 prefix"}, + {(KEYMAP *)&extramap1, "extra prefix 1"}, + {(KEYMAP *)&extramap2, "extra prefix 2"}, + {(KEYMAP *)&extramap3, "extra prefix 3"}, + {(KEYMAP *)&extramap4, "extra prefix 4"}, + {(KEYMAP *)&extramap5, "extra prefix 5"}, +#ifndef NO_HELP + {(KEYMAP *)&helpmap, "help"}, +#endif +#ifndef NO_DIRED + {(KEYMAP *)&diredmap, "dired"}, +#endif +}; + +#define NMAPS (sizeof map_table/sizeof(MAPS)) +int nmaps = NMAPS; /* for use by rebind in extend.c */ + +char *map_name(map) +KEYMAP *map; +{ + MAPS *mp = &map_table[0]; + + do { + if(mp->p_map == map) return mp->p_name; + } while(++mp < &map_table[NMAPS]); + return (char *)NULL; +} + +MAPS *name_mode(name) +char *name; +{ + MAPS *mp = &map_table[0]; + + do { + if(strcmp(mp->p_name,name)==0) return mp; + } while(++mp < &map_table[NMAPS]); + return (MAPS *)NULL; +} + +KEYMAP *name_map(name) +char *name; +{ + MAPS *mp; + return (mp=name_mode(name))==NULL ? (KEYMAP *)NULL : mp->p_map; +} + +/* Warning: functnames MUST be in alphabetical order! (due to binary + * search in name_function.) If the function is prefix, it must be listed + * with the same name in the map_table above. + */ + +FUNCTNAMES functnames[] = { +#ifdef AMIGA +#ifdef DO_ICONIFY + {tticon, "amiga-iconify"}, +#endif +#ifdef DO_MENU + {amigamenu, "amiga-menu"}, +#endif +#ifdef CHANGE_COLOR + {modebackground,"amiga-mode-background"}, + {modeforeground,"amiga-mode-foreground"}, + {ttmode, "amiga-mode-rendition"}, +#endif +#ifdef CHANGE_FONT + {setfont, "amiga-set-font"}, +#endif +#ifdef CHANGE_COLOR + {textbackground,"amiga-text-background"}, + {textforeground,"amiga-text-foreground"}, + {tttext, "amiga-text-rendition"}, +#endif + {togglewindow, "amiga-toggle-border"}, + {togglezooms, "amiga-zoom-mode"}, +#endif /* AMIGA */ +#ifndef NO_HELP + {apropos_command, "apropos"}, +#endif + {fillmode, "auto-fill-mode"}, + {indentmode, "auto-indent-mode"}, + {backchar, "backward-char"}, + {delbword, "backward-kill-word"}, + {gotobop, "backward-paragraph"}, + {backword, "backward-word"}, + {gotobob, "beginning-of-buffer"}, + {gotobol, "beginning-of-line"}, + {blinkparen, "blink-matching-paren"}, + {showmatch, "blink-matching-paren-hack"}, +#ifdef BSMAP + {bsmap, "bsmap-mode"}, +#endif + {prefix, "c-x 4 prefix"}, + {prefix, "c-x prefix"}, +#ifndef NO_MACRO + {executemacro, "call-last-kbd-macro"}, +#endif + {capword, "capitalize-word"}, +#ifndef NO_DIR + {changedir, "cd"}, +#endif + {copyregion, "copy-region-as-kill"}, +#ifdef REGEX + {cntmatchlines, "count-matches"}, + {cntnonmatchlines,"count-non-matches"}, +#endif + {define_key, "define-key"}, + {backdel, "delete-backward-char"}, + {deblank, "delete-blank-lines"}, + {forwdel, "delete-char"}, + {delwhite, "delete-horizontal-space"}, +#ifdef REGEX + {delmatchlines, "delete-matching-lines"}, + {delnonmatchlines,"delete-non-matching-lines"}, +#endif + {onlywind, "delete-other-windows"}, + {delwind, "delete-window"}, +#ifndef NO_HELP + {wallchart, "describe-bindings"}, + {desckey, "describe-key-briefly"}, +#endif + {digit_argument,"digit-argument"}, +#ifndef NO_DIRED + {dired, "dired"}, + {d_undelbak, "dired-backup-unflag"}, + {d_copy, "dired-copy-file"}, + {d_expunge, "dired-do-deletions"}, + {d_findfile, "dired-find-file"}, + {d_ffotherwindow, "dired-find-file-other-window"}, + {d_del, "dired-flag-file-deleted"}, + {d_otherwindow, "dired-other-window"}, + {d_rename, "dired-rename-file"}, + {d_undel, "dired-unflag"}, +#endif + {lowerregion, "downcase-region"}, + {lowerword, "downcase-word"}, + {showversion, "emacs-version"}, +#ifndef NO_MACRO + {finishmacro, "end-kbd-macro"}, +#endif + {gotoeob, "end-of-buffer"}, + {gotoeol, "end-of-line"}, + {enlargewind, "enlarge-window"}, + {prefix, "esc prefix"}, +#ifndef NO_STARTUP + {evalbuffer, "eval-current-buffer"}, + {evalexpr, "eval-expression"}, +#endif + {swapmark, "exchange-point-and-mark"}, + {extend, "execute-extended-command"}, + {prefix, "extra prefix 1"}, + {prefix, "extra prefix 2"}, + {prefix, "extra prefix 3"}, + {prefix, "extra prefix 4"}, + {prefix, "extra prefix 5"}, + {fillpara, "fill-paragraph"}, + {filevisit, "find-file"}, + {poptofile, "find-file-other-window"}, + {forwchar, "forward-char"}, + {gotoeop, "forward-paragraph"}, + {forwword, "forward-word"}, + {bindtokey, "global-set-key"}, + {unbindtokey, "global-unset-key"}, + {gotoline, "goto-line"}, +#ifndef NO_HELP + {prefix, "help"}, + {help_help, "help-help"}, +#endif + {insert, "insert"}, + {bufferinsert, "insert-buffer"}, + {fileinsert, "insert-file"}, + {fillword, "insert-with-wrap"}, + {backisearch, "isearch-backward"}, + {forwisearch, "isearch-forward"}, + {justone, "just-one-space"}, + {ctrlg, "keyboard-quit"}, + {killbuffer, "kill-buffer"}, + {killline, "kill-line"}, + {killpara, "kill-paragraph"}, + {killregion, "kill-region"}, + {delfword, "kill-word"}, + {listbuffers, "list-buffers"}, +#ifndef NO_STARTUP + {evalfile, "load"}, +#endif + {localbind, "local-set-key"}, + {localunbind, "local-unset-key"}, +#ifndef NO_BACKUP + {makebkfile, "make-backup-files"}, +#endif +#ifdef DO_METAKEY + {do_meta, "meta-key-mode"}, /* better name, anyone? */ +#endif +#ifdef AMIGA +#ifdef MOUSE + {mgotobob, "mouse-beginning-of-buffer"}, + {mforwdel, "mouse-delete-char"}, + {mdelwhite, "mouse-delete-horizontal-space"}, + {mdelwind, "mouse-delete-window"}, + {mgotoeob, "mouse-end-of-buffer"}, + {menlargewind, "mouse-enlarge-window"}, + {mkillline, "mouse-kill-line"}, + {mkillregion, "mouse-kill-region"}, + {mdelfword, "mouse-kill-word"}, + {mreposition, "mouse-recenter"}, + {mbackpage, "mouse-scroll-down"}, + {mforwpage, "mouse-scroll-up"}, + {amigamouse, "mouse-set-point"}, + {mshrinkwind, "mouse-shrink-window"}, + {msplitwind, "mouse-split-window-vertically"}, + {myank, "mouse-yank"}, +#endif +#endif + {negative_argument, "negative-argument"}, + {newline, "newline"}, + {indent, "newline-and-indent"}, + {forwline, "next-line"}, +#ifdef NOTAB + {notabmode, "no-tab-mode"}, +#endif + {notmodified, "not-modified"}, + {openline, "open-line"}, + {nextwind, "other-window"}, + {overwrite, "overwrite-mode"}, +#ifdef PREFIXREGION + {prefixregion, "prefix-region"}, +#endif + {backline, "previous-line"}, +#ifdef GOSMACS + {prevwind, "previous-window"}, +#endif +#ifdef VMS + {spawncli, "push-to-dcl"}, +#else + {spawncli, "push-shell"}, +#endif +#ifndef NO_DIR + {showcwdir, "pwd"}, +#endif + {queryrepl, "query-replace"}, +#ifdef REGEX + {re_queryrepl, "query-replace-regexp"}, +#endif + {quote, "quoted-insert"}, +#ifdef REGEX + {re_searchagain,"re-search-again"}, + {re_backsearch, "re-search-backward"}, + {re_forwsearch, "re-search-forward"}, +#endif + {reposition, "recenter"}, + {refresh, "redraw-display"}, + {filesave, "save-buffer"}, + {quit, "save-buffers-kill-emacs"}, + {savebuffers, "save-some-buffers"}, + {backpage, "scroll-down"}, +#ifdef GOSMACS + {back1page, "scroll-one-line-down"}, + {forw1page, "scroll-one-line-up"}, +#endif + {pagenext, "scroll-other-window"}, + {forwpage, "scroll-up"}, + {searchagain, "search-again"}, + {backsearch, "search-backward"}, + {forwsearch, "search-forward"}, + {selfinsert, "self-insert-command"}, +#ifdef REGEX + {setcasefold, "set-case-fold-search"}, +#endif + {set_default_mode, "set-default-mode"}, + {setfillcol, "set-fill-column"}, + {setmark, "set-mark-command"}, +#ifdef PREFIXREGION + {setprefix, "set-prefix-string"}, +#endif + {shrinkwind, "shrink-window"}, +#ifdef NOTAB + {space_to_tabstop, "space-to-tabstop"}, +#endif + {splitwind, "split-window-vertically"}, +#ifndef NO_MACRO + {definemacro, "start-kbd-macro"}, +#endif + {attachtoparent,"suspend-emacs"}, + {usebuffer, "switch-to-buffer"}, + {poptobuffer, "switch-to-buffer-other-window"}, + {twiddle, "transpose-chars"}, + {universal_argument, "universal-argument"}, + {upperregion, "upcase-region"}, + {upperword, "upcase-word"}, + {showcpos, "what-cursor-position"}, + {filewrite, "write-file"}, + {yank, "yank"}, +}; + +#define NFUNCT (sizeof(functnames)/sizeof(FUNCTNAMES)) + +int nfunct = NFUNCT; /* used by help.c */ + +/* + * The general-purpose version of ROUND2 blows osk C (2.0) out of the water. + * (reboot required) If you need to build a version of mg with less than 32 + * or more than 511 functions, something better must be done. + * The version that should work, but doesn't is: + * #define ROUND2(x) (1+((x>>1)|(x>>2)|(x>>3)|(x>>4)|(x>>5)|(x>>6)|(x>>7)|\ + * (x>>8)|(x>>9)|(x>>10)|(x>>11)|(x>>12)|(x>>13)|(x>>14)|(x>>15))) + */ +#define ROUND2(x) (x<128?(x<64?32:64):(x<256?128:256)) + +static name_fent(fname, flag) +register char *fname; +int flag; +{ + register int try; + register int x = ROUND2(NFUNCT); + register int base = 0; + register int notit; + + do { + /* + can be used instead of | here if more efficent. */ + if((try = base | x) < NFUNCT) { + if((notit = strcmp(fname, functnames[try].n_name)) >= 0) { + if(!notit) return try; + base = try; + } + } + } while((x>>=1) || (try==1 && base==0)); /* try 0 once if needed */ + return flag ? base : -1; +} + +/* + * Translate from function name to function pointer, using binary search. + */ + +PF name_function(fname) +char *fname; +{ + int i; + if((i = name_fent(fname, FALSE)) >= 0) return functnames[i].n_funct; + return (PF)NULL; +} + +/* complete function name */ + +complete_function(fname, c) +register char *fname; +{ + register int i, j, k, l; + int oj; + + i = name_fent(fname, TRUE); + for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {} + if(fname[j]!='\0') { + if(++i >= NFUNCT) return -2; /* no match */ + for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {} + if(fname[j]!='\0') return -2; /* no match */ + } + if(c==CCHR('M') && functnames[i].n_name[j]=='\0') return -1; + for(k=i+1; k<NFUNCT; k++) { /* find last match */ + for(l=0; functnames[k].n_name[l]==fname[l]; l++) {} + if(l<j) break; + } + k--; + oj = j; + if(k>i) { /* multiple matches */ + while((l = functnames[i].n_name[j]) == functnames[k].n_name[j]) { + fname[j++] = l; + if(l=='-' && c==' ') break; + } + if(j==oj) return -3; /* ambiguous */ + } else { /* single match */ + while(l = functnames[i].n_name[j]) { + fname[j++] = l; + if(l=='-' && c==' ') break; + } + } + fname[j] = '\0'; + return j - oj; +} + +/* list possible function name completions */ + +LIST *complete_function_list(fname, c) +register char *fname; +{ + register int i, j, k, l; + int oj; + LIST *current,*last; + + i = name_fent(fname, TRUE); + for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {} + if(fname[j]!='\0') { + if(++i >= NFUNCT) return NULL; /* no match */ + for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {} + if(fname[j]!='\0') return NULL; /* no match */ + } +/* + * if(c==CCHR('M') && functnames[i].n_name[j]=='\0') return -1; + */ + for(k=i+1; k<NFUNCT; k++) { /* find last match */ + for(l=0; functnames[k].n_name[l]==fname[l]; l++) {} + if(l<j) break; + } + k--; + last = NULL; + for (; k >= i; k--) { + current = (LIST *)malloc(sizeof(LIST)); + current->l_next = last; + current->l_name = functnames[k].n_name; + last = current; + } + return(last); +} + +/* translate from function pointer to function name. */ + +char *function_name(fpoint) +register PF fpoint; +{ + register FUNCTNAMES *fnp = &functnames[0]; + + if(fpoint == prefix) return (char *)NULL; /* ambiguous */ + do { + if(fnp->n_funct == fpoint) return fnp->n_name; + } while(++fnp < &functnames[NFUNCT]); + return (char *)NULL; +} |