summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd-list-keys.c54
1 files changed, 33 insertions, 21 deletions
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index c6c391a2..8838060e 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -46,7 +46,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx)
struct args *args = self->args;
struct key_binding *bd;
const char *key;
- char tmp[BUFSIZ];
+ char tmp[BUFSIZ], flags[8];
size_t used;
int width, keywidth;
@@ -59,9 +59,14 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx)
if (key == NULL)
continue;
- keywidth = strlen(key) + 1;
- if (!(bd->key & KEYC_PREFIX))
- keywidth += 2;
+ keywidth = strlen(key);
+ if (!(bd->key & KEYC_PREFIX)) {
+ if (bd->can_repeat)
+ keywidth += 4;
+ else
+ keywidth += 3;
+ } else if (bd->can_repeat)
+ keywidth += 3;
if (keywidth > width)
width = keywidth;
}
@@ -70,22 +75,22 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx)
key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
if (key == NULL)
continue;
- used = xsnprintf(tmp, sizeof tmp, "%*s: ", width, key);
+
+ if (!(bd->key & KEYC_PREFIX)) {
+ if (bd->can_repeat)
+ xsnprintf(flags, sizeof flags, "-rn ");
+ else
+ xsnprintf(flags, sizeof flags, "-n ");
+ } else if (bd->can_repeat)
+ xsnprintf(flags, sizeof flags, "-r ");
+
+ used = xsnprintf(tmp, sizeof tmp, "%s%*s ",
+ flags, (int) (width - strlen(flags)), key);
if (used >= sizeof tmp)
continue;
- if (!(bd->key & KEYC_PREFIX)) {
- used = strlcat(tmp, "(no prefix) ", sizeof tmp);
- if (used >= sizeof tmp)
- continue;
- }
- if (bd->can_repeat) {
- used = strlcat(tmp, "(repeat) ", sizeof tmp);
- if (used >= sizeof tmp)
- continue;
- }
cmd_list_print(bd->cmdlist, tmp + used, (sizeof tmp) - used);
- ctx->print(ctx, "%s", tmp);
+ ctx->print(ctx, "bind-key %s", tmp);
}
return (0);
@@ -99,7 +104,7 @@ cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx)
const struct mode_key_table *mtab;
struct mode_key_binding *mbind;
const char *key, *cmdstr, *mode;
- int width, keywidth;
+ int width, keywidth, any_mode;
tablename = args_get(args, 't');
if ((mtab = mode_key_findtable(tablename)) == NULL) {
@@ -108,12 +113,16 @@ cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx)
}
width = 0;
+ any_mode = 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 (mbind->mode != 0)
+ any_mode = 1;
+
+ keywidth = strlen(key);
if (keywidth > width)
width = keywidth;
}
@@ -125,10 +134,13 @@ cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx)
mode = "";
if (mbind->mode != 0)
- mode = "(command mode) ";
+ mode = "c";
cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
- if (cmdstr != NULL)
- ctx->print(ctx, "%*s: %s%s", width, key, mode, cmdstr);
+ if (cmdstr != NULL) {
+ ctx->print(ctx, "bind-key -%st %s%s %*s %s",
+ mode, any_mode && *mode == '\0' ? " " : "",
+ mtab->name, (int) width, key, cmdstr);
+ }
}
return (0);