1 /* $Id: cmd-list-keys.c,v 1.1.1.1 2011/03/10 09:15:37 jmmv 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 if (bd->can_repeat) { 84 used = strlcat(tmp, "(repeat) ", sizeof tmp); 85 if (used >= sizeof tmp) 86 continue; 87 } 88 cmd_list_print(bd->cmdlist, tmp + used, (sizeof tmp) - used); 89 ctx->print(ctx, "%s", tmp); 90 } 91 92 return (0); 93 } 94 95 int 96 cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx) 97 { 98 struct cmd_target_data *data = self->data; 99 const struct mode_key_table *mtab; 100 struct mode_key_binding *mbind; 101 const char *key, *cmdstr, *mode; 102 int width, keywidth; 103 104 if ((mtab = mode_key_findtable(data->target)) == NULL) { 105 ctx->error(ctx, "unknown key table: %s", data->target); 106 return (-1); 107 } 108 109 width = 0; 110 SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { 111 key = key_string_lookup_key(mbind->key); 112 if (key == NULL) 113 continue; 114 115 keywidth = strlen(key) + 1; 116 if (keywidth > width) 117 width = keywidth; 118 } 119 120 SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { 121 key = key_string_lookup_key(mbind->key); 122 if (key == NULL) 123 continue; 124 125 mode = ""; 126 if (mbind->mode != 0) 127 mode = "(command mode) "; 128 cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd); 129 if (cmdstr != NULL) 130 ctx->print(ctx, "%*s: %s%s", width, key, mode, cmdstr); 131 } 132 133 return (0); 134 } 135