1 /* $OpenBSD: cmd-list-keys.c,v 1.11 2009/12/03 22:50:10 nicm Exp $ */ 2 3 /* 4 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/types.h> 20 21 #include <string.h> 22 23 #include "tmux.h" 24 25 /* 26 * List key bindings. 27 */ 28 29 int cmd_list_keys_exec(struct cmd *, struct cmd_ctx *); 30 31 int cmd_list_keys_table(struct cmd *, struct cmd_ctx *); 32 33 const struct cmd_entry cmd_list_keys_entry = { 34 "list-keys", "lsk", 35 "[-t key-table]", 36 0, "", 37 cmd_target_init, 38 cmd_target_parse, 39 cmd_list_keys_exec, 40 cmd_target_free, 41 cmd_target_print 42 }; 43 44 int 45 cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx) 46 { 47 struct cmd_target_data *data = self->data; 48 struct key_binding *bd; 49 const char *key; 50 char tmp[BUFSIZ]; 51 size_t used; 52 int width, keywidth; 53 54 if (data->target != NULL) 55 return (cmd_list_keys_table(self, ctx)); 56 57 width = 0; 58 SPLAY_FOREACH(bd, key_bindings, &key_bindings) { 59 key = key_string_lookup_key(bd->key & ~KEYC_PREFIX); 60 if (key == NULL) 61 continue; 62 63 keywidth = strlen(key) + 1; 64 if (!(bd->key & KEYC_PREFIX)) 65 keywidth += 2; 66 if (keywidth > width) 67 width = keywidth; 68 } 69 70 SPLAY_FOREACH(bd, key_bindings, &key_bindings) { 71 key = key_string_lookup_key(bd->key & ~KEYC_PREFIX); 72 if (key == NULL) 73 continue; 74 used = xsnprintf(tmp, sizeof tmp, "%*s: ", width, key); 75 if (used >= sizeof tmp) 76 continue; 77 78 if (!(bd->key & KEYC_PREFIX)) { 79 used = strlcat(tmp, "(no prefix) ", sizeof tmp); 80 if (used >= sizeof tmp) 81 continue; 82 } 83 cmd_list_print(bd->cmdlist, tmp + used, (sizeof tmp) - used); 84 ctx->print(ctx, "%s", tmp); 85 } 86 87 return (0); 88 } 89 90 int 91 cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx) 92 { 93 struct cmd_target_data *data = self->data; 94 const struct mode_key_table *mtab; 95 struct mode_key_binding *mbind; 96 const char *key, *cmdstr, *mode; 97 int width, keywidth; 98 99 if ((mtab = mode_key_findtable(data->target)) == NULL) { 100 ctx->error(ctx, "unknown key table: %s", data->target); 101 return (-1); 102 } 103 104 width = 0; 105 SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { 106 key = key_string_lookup_key(mbind->key); 107 if (key == NULL) 108 continue; 109 110 keywidth = strlen(key) + 1; 111 if (keywidth > width) 112 width = keywidth; 113 } 114 115 SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { 116 key = key_string_lookup_key(mbind->key); 117 if (key == NULL) 118 continue; 119 120 mode = ""; 121 if (mbind->mode != 0) 122 mode = "(command mode) "; 123 cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd); 124 if (cmdstr != NULL) 125 ctx->print(ctx, "%*s: %s%s", width, key, mode, cmdstr); 126 } 127 128 return (0); 129 } 130