/* Initialize readline and configure the keymap for the switching key shortcut. */ void tui_initialize_readline (void) { int i; Keymap tui_ctlx_keymap; rl_initialize (); rl_add_defun ("tui-switch-mode", tui_rl_switch_mode, -1); rl_add_defun ("gdb-command", tui_rl_command_key, -1); rl_add_defun ("next-keymap", tui_rl_next_keymap, -1); tui_keymap = rl_make_bare_keymap (); tui_ctlx_keymap = rl_make_bare_keymap (); tui_readline_standard_keymap = rl_get_keymap (); for (i = 0; tui_commands[i].cmd; i++) rl_bind_key_in_map (tui_commands[i].key, tui_rl_command_key, tui_keymap); rl_generic_bind (ISKMAP, "\\C-x", (char*) tui_ctlx_keymap, tui_keymap); /* Bind all other keys to tui_rl_command_mode so that we switch temporarily from SingleKey mode and can enter a gdb command. */ for (i = ' '; i < 0x7f; i++) { int j; for (j = 0; tui_commands[j].cmd; j++) if (tui_commands[j].key == i) break; if (tui_commands[j].cmd) continue; rl_bind_key_in_map (i, tui_rl_command_mode, tui_keymap); } rl_bind_key_in_map ('a', tui_rl_switch_mode, emacs_ctlx_keymap); rl_bind_key_in_map ('a', tui_rl_switch_mode, tui_ctlx_keymap); rl_bind_key_in_map ('A', tui_rl_switch_mode, emacs_ctlx_keymap); rl_bind_key_in_map ('A', tui_rl_switch_mode, tui_ctlx_keymap); rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, emacs_ctlx_keymap); rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, tui_ctlx_keymap); rl_bind_key_in_map ('1', tui_rl_delete_other_windows, emacs_ctlx_keymap); rl_bind_key_in_map ('1', tui_rl_delete_other_windows, tui_ctlx_keymap); rl_bind_key_in_map ('2', tui_rl_change_windows, emacs_ctlx_keymap); rl_bind_key_in_map ('2', tui_rl_change_windows, tui_ctlx_keymap); rl_bind_key_in_map ('o', tui_rl_other_window, emacs_ctlx_keymap); rl_bind_key_in_map ('o', tui_rl_other_window, tui_ctlx_keymap); rl_bind_key_in_map ('q', tui_rl_next_keymap, tui_keymap); rl_bind_key_in_map ('s', tui_rl_next_keymap, emacs_ctlx_keymap); rl_bind_key_in_map ('s', tui_rl_next_keymap, tui_ctlx_keymap); }
void readline_status_mode (cli_context_t *ctx, const keymap_entry_t map[]) { int i; Keymap stkmap; readline_cli_ctx = ctx; rl_callback_handler_install (NULL, &readline_status_callback); /* Backup current keymap-name */ readline_keymap = g_strdup (rl_get_keymap_name (rl_get_keymap ())); /* New keymap for status mode */ stkmap = rl_make_bare_keymap (); /* Fill out the keymap and display it. */ g_printf ("\n"); for (i = 0; map[i].keyseq; i++) { rl_set_key (map[i].keyseq, rl_named_function (map[i].named_function), stkmap); if (map[i].readable_keyseq) { g_printf (" (%s) %s\n", map[i].readable_keyseq, map[i].readable_function ? map[i].readable_function : map[i].named_function); } } g_printf ("\n"); rl_set_keymap (stkmap); }
int rl_vi_replace (int count, int key) { int i; vi_replace_count = 0; if (!vi_replace_map) { vi_replace_map = rl_make_bare_keymap (); for (i = ' '; i < KEYMAP_SIZE; i++) vi_replace_map[i].function = (Function *)rl_vi_overstrike; vi_replace_map[RUBOUT].function = (Function *)rl_vi_overstrike_delete; vi_replace_map[ESC].function = (Function *)rl_vi_movement_mode; vi_replace_map[RETURN].function = (Function *)rl_newline; vi_replace_map[NEWLINE].function = (Function *)rl_newline; /* If the normal vi insertion keymap has ^H bound to erase, do the same here. Probably should remove the assignment to RUBOUT up there, but I don't think it will make a difference in real life. */ if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC && vi_insertion_keymap[CTRL ('H')].function == (Function *)rl_rubout) vi_replace_map[CTRL ('H')].function = (Function *)rl_vi_overstrike_delete; } _rl_keymap = vi_replace_map; return (0); }