home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
156.lha
/
MicroGnuEmacs_v2.0
/
Sources
/
keymap.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-04-27
|
29KB
|
1,156 lines
/*
* 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. */
#ifdef VMS
extern int attachtoparent(); /* Attach to parent process */
#endif
/* 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 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 */
#ifndef VMS
spawncli, /* ^Z */
#else
attachtoparent, /* ^Z */
#endif
};
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[] = {
#ifndef VMS
spawncli, /* ^Z */
#else
attachtoparent, /* ^Z */
#endif
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"},
#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"},
{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"},
#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
#ifdef VMS
{attachtoparent,"suspend-emacs"},
#else
{spawncli, "suspend-emacs"},
#endif
{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;
}
/* 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;
}