#include <sys/queue.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "kbd.h"
static PF cHcG[] = {
ctrlg,
help_help
};
static PF cHa[] = {
apropos_command,
wallchart,
desckey
};
struct KEYMAPE (2) helpmap = {
2,
2,
rescan,
{
{
CCHR('G'), CCHR('H'), cHcG, NULL
},
{
'a', 'c', cHa, NULL
}
}
};
static PF cCsc[] = {
cscallerfuncs,
csdefinition,
csegrep,
csfindfile,
rescan,
rescan,
csfindinc,
rescan,
rescan,
rescan,
rescan,
csnextmatch,
rescan,
csprevmatch,
rescan,
rescan,
cssymbol,
csfindtext
};
static struct KEYMAPE (1) cCsmap = {
1,
1,
rescan,
{
{
'c', 't', cCsc, NULL
}
}
};
static PF cCs[] = {
NULL
};
struct KEYMAPE (2) ccmap = {
2,
2,
rescan,
{
{
CCHR('@'), CCHR('@'), (PF[]){ rescan }, NULL
},
{
's', 's', cCs, (KEYMAP *) & cCsmap
}
}
};
static PF cX4cF[] = {
poptofile,
ctrlg
};
static PF cX4b[] = {
poptobuffer,
rescan,
rescan,
rescan,
poptofile
};
static struct KEYMAPE (2) cX4map = {
2,
2,
rescan,
{
{
CCHR('F'), CCHR('G'), cX4cF, NULL
},
{
'b', 'f', cX4b, NULL
}
}
};
static PF cXcB[] = {
listbuffers,
quit,
rescan,
rescan,
filevisit,
ctrlg
};
static PF cXcJ[] = {
dired_jump,
rescan,
lowerregion,
rescan,
rescan,
deblank,
rescan,
togglereadonly,
filevisitro,
filesave,
rescan,
upperregion,
filevisitalt,
filewrite,
swapmark
};
static PF cXlp[] = {
definemacro,
finishmacro
};
static PF cX0[] = {
delwind,
onlywind,
splitwind,
rescan,
NULL
};
static PF cXeq[] = {
showcpos
};
static PF cXcar[] = {
enlargewind,
rescan,
next_error,
rescan,
usebuffer,
rescan,
rescan,
executemacro,
setfillcol,
gotoline,
markbuffer,
fileinsert,
rescan,
killbuffer_cmd,
rescan,
rescan,
nextwind,
nextwind,
prevwind,
rescan,
rescan,
savebuffers,
rescan,
undo
};
struct KEYMAPE (6) cXmap = {
6,
6,
rescan,
{
{
CCHR('B'), CCHR('G'), cXcB, NULL
},
{
CCHR('J'), CCHR('X'), cXcJ, NULL
},
{
'(', ')', cXlp, NULL
},
{
'0', '4', cX0, (KEYMAP *) & cX4map
},
{
'=', '=', cXeq, NULL
},
{
'^', 'u', cXcar, NULL
}
}
};
static PF metacG[] = {
ctrlg
};
static PF metacV[] = {
pagenext
};
static PF metaspex[] = {
justone,
shellcommand
};
static PF metapct[] = {
queryrepl
};
static PF metami[] = {
poptag,
rescan,
rescan,
negative_argument,
findtag,
rescan,
digit_argument,
digit_argument,
digit_argument,
digit_argument,
digit_argument,
digit_argument,
digit_argument,
digit_argument,
digit_argument,
digit_argument,
rescan,
rescan,
gotobob,
rescan,
gotoeob
};
static PF metasqf[] = {
NULL,
delwhite,
rescan,
joinline,
rescan,
rescan,
rescan,
backword,
capword,
delfword,
rescan,
forwword,
rescan,
markpara
};
static PF metal[] = {
lowerword,
backtoindent,
rescan,
rescan,
rescan,
fillpara,
backsearch,
forwsearch,
transposeword,
upperword,
backpage,
copyregion,
extend,
rescan,
zaptochar,
gotobop,
piperegion,
gotoeop
};
static PF metasqlZ[] = {
rescan
};
static PF metatilde[] = {
notmodified,
delbword
};
struct KEYMAPE (1) metasqlmap = {
1,
1,
rescan,
{
{
'Z', 'Z', metasqlZ, NULL
}
}
};
struct KEYMAPE (8) metamap = {
8,
8,
rescan,
{
{
CCHR('G'), CCHR('G'), metacG, NULL
},
{
CCHR('V'), CCHR('V'), metacV, NULL
},
{
' ', '!', metaspex, NULL
},
{
'%', '%', metapct, NULL
},
{
'*', '>', metami, NULL
},
{
'[', 'h', metasqf, (KEYMAP *) &metasqlmap
},
{
'l', '}', metal, NULL
},
{
'~', CCHR('?'), metatilde, NULL
}
}
};
static PF fund_at[] = {
setmark,
gotobol,
backchar,
NULL,
forwdel,
gotoeol,
forwchar,
ctrlg,
};
static PF fund_h[] = {
NULL,
};
static PF fund_CJ[] = {
lfindent,
killline,
reposition,
enewline,
forwline,
openline,
backline,
quote,
backisearch,
forwisearch,
twiddle,
universal_argument,
forwpage,
killregion,
NULL,
yank,
spawncli
};
static PF fund_esc[] = {
NULL,
rescan,
rescan,
rescan,
undo
};
static PF fund_del[] = {
backdel
};
static PF fund_cb[] = {
showmatch
};
static struct KEYMAPE (8) fundmap = {
8,
8,
selfinsert,
{
{
CCHR('@'), CCHR('G'), fund_at, (KEYMAP *) & ccmap
},
{
CCHR('H'), CCHR('H'), fund_h, (KEYMAP *) & helpmap
},
{
CCHR('J'), CCHR('Z'), fund_CJ, (KEYMAP *) & cXmap
},
{
CCHR('['), CCHR('_'), fund_esc, (KEYMAP *) & metamap
},
{
')', ')', fund_cb, NULL
},
{
']', ']', fund_cb, NULL
},
{
'}', '}', fund_cb, NULL
},
{
CCHR('?'), CCHR('?'), fund_del, NULL
},
}
};
static PF fill_sp[] = {
fillword
};
static struct KEYMAPE (1) fillmap = {
1,
1,
rescan,
{
{ ' ', ' ', fill_sp, NULL }
}
};
static PF indent_lf[] = {
enewline,
rescan,
rescan,
lfindent
};
static struct KEYMAPE (1) indntmap = {
1,
1,
rescan,
{
{
CCHR('J'), CCHR('M'), indent_lf, NULL
}
}
};
static PF notab_tab[] = {
space_to_tabstop
};
static struct KEYMAPE (1) notabmap = {
1,
1,
rescan,
{
{
CCHR('I'), CCHR('I'), notab_tab, NULL
}
}
};
static struct KEYMAPE (1) overwmap = {
0,
1,
rescan,
{
{
(KCHAR)0, (KCHAR)0, NULL, NULL
}
}
};
struct maps_s fundamental_mode = { (KEYMAP *)&fundmap, "fundamental" };
static struct maps_s map_table[] = {
{(KEYMAP *) &fillmap, "fill",},
{(KEYMAP *) &indntmap, "indent",},
{(KEYMAP *) ¬abmap, "notab",},
{(KEYMAP *) &overwmap, "overwrite",},
{(KEYMAP *) &metamap, "esc prefix",},
{(KEYMAP *) &cXmap, "c-x prefix",},
{(KEYMAP *) &cX4map, "c-x 4 prefix",},
{(KEYMAP *) &helpmap, "help",},
{NULL, NULL}
};
struct maps_s *maps;
void
maps_init(void)
{
int i;
struct maps_s *mp;
maps = &fundamental_mode;
for (i = 0; map_table[i].p_name != NULL; i++) {
mp = &map_table[i];
mp->p_next = maps;
maps = mp;
}
}
int
maps_add(KEYMAP *map, const char *name)
{
struct maps_s *mp;
if ((mp = malloc(sizeof(*mp))) == NULL)
return (FALSE);
mp->p_name = name;
mp->p_map = map;
mp->p_next = maps;
maps = mp;
return (TRUE);
}
struct maps_s *
name_mode(const char *name)
{
struct maps_s *mp;
for (mp = maps; mp != NULL; mp = mp->p_next)
if (strcmp(mp->p_name, name) == 0)
return (mp);
return (NULL);
}
KEYMAP *
name_map(const char *name)
{
struct maps_s *mp;
return ((mp = name_mode(name)) == NULL ? NULL : mp->p_map);
}