/** * dump_bind - Dump a bind map to a buffer * @param buf Output buffer * @param menu Map menu * @param map Bind keymap */ static void dump_bind(struct Buffer *buf, struct Mapping *menu, struct Keymap *map) { char key_binding[MAX_SEQ]; const char *fn_name = NULL; km_expand_key(key_binding, MAX_SEQ, map); if (map->op == OP_NULL) { mutt_buffer_add_printf(buf, "bind %s %s noop\n", menu->name, key_binding); return; } /* The pager and editor menus don't use the generic map, * however for other menus try generic first. */ if ((menu->value != MENU_PAGER) && (menu->value != MENU_EDITOR) && (menu->value != MENU_GENERIC)) { fn_name = mutt_get_func(OpGeneric, map->op); } /* if it's one of the menus above or generic doesn't find * the function, try with its own menu. */ if (!fn_name) { const struct Binding *bindings = km_get_table(menu->value); if (!bindings) return; fn_name = mutt_get_func(bindings, map->op); } mutt_buffer_add_printf(buf, "bind %s %s %s\n", menu->name, key_binding, fn_name); }
void mutt_help (int menu) { char t[_POSIX_PATH_MAX]; char buf[SHORT_STRING]; const char *desc; FILE *f; const struct binding_t *funcs; mutt_mktemp (t, sizeof (t)); funcs = km_get_table (menu); desc = mutt_getnamebyvalue (menu, Menus); if (!desc) desc = _("<UNKNOWN>"); do { if ((f = safe_fopen (t, "w")) == NULL) { mutt_perror (t); return; } dump_menu (f, menu); if (menu != MENU_EDITOR && menu != MENU_PAGER) { fputs (_("\nGeneric bindings:\n\n"), f); dump_menu (f, MENU_GENERIC); } fputs (_("\nUnbound functions:\n\n"), f); if (funcs) dump_unbound (f, funcs, Keymaps[menu], NULL); if (menu != MENU_PAGER) dump_unbound (f, OpGeneric, Keymaps[MENU_GENERIC], Keymaps[menu]); safe_fclose (&f); snprintf (buf, sizeof (buf), _("Help for %s"), desc); } while (mutt_do_pager (buf, t, M_PAGER_RETWINCH | M_PAGER_MARKER | M_PAGER_NSKIP | M_PAGER_NOWRAP, NULL) == OP_REFORMAT_WINCH); }
static const struct binding_t *help_lookupFunction (int op, int menu) { int i; const struct binding_t *map; if (menu != MENU_PAGER) { /* first look in the generic map for the function */ for (i = 0; OpGeneric[i].name; i++) if (OpGeneric[i].op == op) return (&OpGeneric[i]); } if ((map = km_get_table(menu))) { for (i = 0; map[i].name; i++) if (map[i].op == op) return (&map[i]); } return (NULL); }