summaryrefslogtreecommitdiffstats
path: root/cmd-list-keys.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-07-28 07:03:32 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-07-28 07:03:32 +0000
commit86785004baf4086816b5d6684b9d0e4c56b58ea6 (patch)
tree822c8656bcf8c550a62c5bd00cb072f92542b48a /cmd-list-keys.c
parent2da48644837cd51cfe5a9628140866f06e049e50 (diff)
Next step towards customisable mode keys: build each default table of keys into
a named tree on start and use that for lookups. Also add command to string translation tables and modify list-keys to show the the mode key bindings (new -t argument).
Diffstat (limited to 'cmd-list-keys.c')
-rw-r--r--cmd-list-keys.c63
1 files changed, 57 insertions, 6 deletions
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index 9110d12a..0a22e82c 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -28,25 +28,31 @@
int cmd_list_keys_exec(struct cmd *, struct cmd_ctx *);
+int cmd_list_keys_table(struct cmd *, struct cmd_ctx *);
+
const struct cmd_entry cmd_list_keys_entry = {
"list-keys", "lsk",
- "",
+ "[-t key-table]",
0, 0,
- NULL,
- NULL,
+ cmd_target_init,
+ cmd_target_parse,
cmd_list_keys_exec,
- NULL,
- NULL
+ cmd_target_free,
+ cmd_target_print
};
int
-cmd_list_keys_exec(unused struct cmd *self, struct cmd_ctx *ctx)
+cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx)
{
+ struct cmd_target_data *data = self->data;
struct key_binding *bd;
const char *key;
char tmp[BUFSIZ], keytmp[64];
int width, keywidth;
+ if (data->target != NULL)
+ return (cmd_list_keys_table(self, ctx));
+
width = 0;
SPLAY_FOREACH(bd, key_bindings, &key_bindings) {
key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
@@ -76,3 +82,48 @@ cmd_list_keys_exec(unused struct cmd *self, struct cmd_ctx *ctx)
return (0);
}
+
+int
+cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx)
+{
+ struct cmd_target_data *data = self->data;
+ const struct mode_key_table *mtab;
+ struct mode_key_binding *mbind;
+ const char *key, *cmdstr, *mode;
+ int width, keywidth;
+
+ for (mtab = mode_key_tables; mtab->name != NULL; mtab++) {
+ if (strcasecmp(data->target, mtab->name) == 0)
+ break;
+ }
+ if (mtab->name == NULL) {
+ ctx->error(ctx, "unknown key table: %s", data->target);
+ return (-1);
+ }
+
+ width = 0;
+ SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) {
+ key = key_string_lookup_key(mbind->key);
+ if (key == NULL)
+ continue;
+
+ keywidth = strlen(key) + 1;
+ if (keywidth > width)
+ width = keywidth;
+ }
+
+ SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) {
+ key = key_string_lookup_key(mbind->key);
+ if (key == NULL)
+ continue;
+
+ mode = "";
+ if (mbind->mode != 0)
+ mode = "(command mode) ";
+ cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
+ if (cmdstr != NULL)
+ ctx->print(ctx, "%*s: %s%s", width, key, mode, cmdstr);
+ }
+
+ return (0);
+}