commit e3427d18a9b8da6cfaadd1018d5ce2f400c73185 from: Omar Polo date: Fri Jun 25 10:05:38 2021 UTC allow `bind map key cmd' in config file commit - a3666ed5ebac24e75f8bed25238464dfff5dd34a commit + e3427d18a9b8da6cfaadd1018d5ce2f400c73185 blob - 09436da517ae457b3987176f9a746841215e1f08 blob + 794615cdbe415482fd8b6376f181be91d9895951 --- parse.y +++ parse.y @@ -62,6 +62,7 @@ static void setcolor(const char *, const char *, const static int attrname(char *); static void setattr(char *, char *, char *); static void add_proxy(char *, char *); +static void bindkey(const char *, const char *, const char *); %} @@ -120,10 +121,10 @@ attr : TSTRING { setattr($1, $1, $1); free($1); } | TSTRING TSTRING TSTRING { setattr($1, $2, $3); free($1); free($2); free($3); } ; -bind : TBIND TSTRING TSTRING TSTRING { printf("TODO: bind %s %s %s\n", $2, $3, $4); } +bind : TBIND TSTRING TSTRING TSTRING { bindkey($2, $3, $4); free($2); free($3); free($4); } ; -unbind : TUNBIND TSTRING TSTRING { printf("TODO: unbind %s %s\n", $2, $3); } +unbind : TUNBIND TSTRING TSTRING { yyerror("TODO: unbind %s %s", $2, $3); } ; proxy : TPROXY TSTRING TVIA TSTRING { add_proxy($2, $4); free($4); } @@ -482,6 +483,43 @@ add_proxy(char *proto, char *proxy) err(1, "strdup"); TAILQ_INSERT_HEAD(&proxies, p, proxies); +} + +static interactivefn * +cmdname(const char *name) +{ + struct cmd *cmd; + + for (cmd = cmds; cmd->cmd != NULL; ++cmd) { + if (!strcmp(cmd->cmd, name)) + return cmd->fn; + } + + return NULL; +} + +static void +bindkey(const char *map, const char *key, const char *cmd) +{ + struct kmap *kmap; + interactivefn *fn; + + if (!strcmp(map, "global-map")) + kmap = &global_map; + else if (!strcmp(map, "minibuffer-map")) + kmap = &minibuffer_map; + else { + yyerror("unknown map: %s", map); + return; + } + + if ((fn = cmdname(cmd)) == NULL) { + yyerror("unknown cmd: %s", fn); + return; + } + + if (!kmap_define_key(kmap, key, fn)) + yyerror("failed to bind %s %s %s", map, key, cmd); } void blob - 261557b1c6e31e11c107f150ba3e3d8fe87dab0c blob + 7aab450ee15857744123cddfe7f9f2d9ff8aee10 --- telescope.h +++ telescope.h @@ -276,12 +276,15 @@ struct kmap { TAILQ_HEAD(map, keymap) m; void (*unhandled_input)(void); }; +extern struct kmap global_map, minibuffer_map; +typedef void(interactivefn)(struct buffer *); + struct keymap { int meta; int key; struct kmap map; - void (*fn)(struct buffer*); + interactivefn *fn; TAILQ_ENTRY(keymap) keymaps; }; blob - 76ab7b16f7b1774a349d8c624970aa0191cb888a blob + 67ed7a754b7fb7fe33c6274eb7fefd0b65013ee8 --- ui.c +++ ui.c @@ -1394,6 +1394,14 @@ ui_init(int argc, char * const *argv) } argc -= optind; argv += optind; + + /* setup keys before reading the config */ + TAILQ_INIT(&global_map.m); + global_map.unhandled_input = global_key_unbound; + + TAILQ_INIT(&minibuffer_map.m); + + load_default_keys(); config_init(); parseconfig(path, fonf); @@ -1407,11 +1415,6 @@ ui_init(int argc, char * const *argv) setlocale(LC_ALL, ""); - TAILQ_INIT(&global_map.m); - global_map.unhandled_input = global_key_unbound; - - TAILQ_INIT(&minibuffer_map.m); - TAILQ_INIT(&eecmd_history.head); TAILQ_INIT(&ir_history.head); TAILQ_INIT(&lu_history.head); @@ -1425,7 +1428,6 @@ ui_init(int argc, char * const *argv) base_map = &global_map; current_map = &global_map; - load_default_keys(); initscr();