Commit Diff


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();