commit - a3666ed5ebac24e75f8bed25238464dfff5dd34a
commit + e3427d18a9b8da6cfaadd1018d5ce2f400c73185
blob - 09436da517ae457b3987176f9a746841215e1f08
blob + 794615cdbe415482fd8b6376f181be91d9895951
--- parse.y
+++ parse.y
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 *);
%}
| 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); }
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
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
}
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);
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);
base_map = &global_map;
current_map = &global_map;
- load_default_keys();
initscr();