/* TUI readline command. Switch the output mode between TUI/standard gdb. */ static int tui_rl_switch_mode (int notused1, int notused2) { if (tui_active) { tui_disable (); rl_prep_terminal (0); } else { rl_deprep_terminal (); tui_enable (); } /* Clear the readline in case switching occurred in middle of something. */ if (rl_end) rl_kill_text (0, rl_end); /* Since we left the curses mode, the terminal mode is restored to some previous state. That state may not be suitable for readline to work correctly (it may be restored in line mode). We force an exit of the current readline so that readline is re-entered and it will be able to setup the terminal for its needs. By re-entering in readline, we also redisplay its prompt in the non-curses mode. */ rl_newline (1, '\n'); /* Make sure the \n we are returning does not repeat the last command. */ dont_repeat (); return 0; }
int cli_rl_err (struct cli_state *state, const char *fmt, va_list ap) { int tmp_rl_point = rl_point; int n = rl_end; int ret = 0; if (rl_end >= 0 ) { rl_kill_text (0, rl_end); rl_redisplay (); } fprintf (stderr, "\r%*s\r", (int)strlen (state->prompt), ""); ret = vfprintf (stderr, fmt, ap); fprintf (stderr, "\n"); fflush(stderr); if (n) { rl_do_undo (); rl_point = tmp_rl_point; rl_reset_line_state (); } return ret; }
int rl_vi_yank_to (int count, int key) { int c, save = rl_point; if (uppercase_p (key)) rl_stuff_char ('$'); if (rl_vi_domove (key, &c)) { DING (); return -1; } /* These are the motion commands that do not require adjusting the mark. */ if ((strchr (" l|h^0%bB", c) == 0) && (rl_mark < rl_end)) rl_mark++; rl_begin_undo_group (); rl_kill_text (rl_point, rl_mark); rl_end_undo_group (); rl_do_undo (); rl_point = save; return (0); }
int cli_rl_out (struct cli_state *state, const char *fmt, va_list ap) { int tmp_rl_point = rl_point; int n = rl_end; int i = 0; int ret = 0; if (rl_end >= 0 ) { rl_kill_text (0, rl_end); rl_redisplay (); } printf ("\r"); for (i = 0; i <= strlen (state->prompt); i++) printf (" "); printf ("\r"); ret = vprintf (fmt, ap); printf ("\n"); fflush(stdout); if (n) { rl_do_undo (); rl_point = tmp_rl_point; rl_reset_line_state (); } return ret; }
void async_printf (const char *fmt, va_list ap) { int tmp_rl_point = rl_point; int n = rl_end; unsigned int i; if (rl_end >= 0 ) { rl_kill_text (0, rl_end); rl_redisplay (); } printf ("\r"); for (i=0 ; i<=strlen (state.prompt) ; i++) printf (" "); printf ("\r"); vprintf (fmt, ap); printf ("\n"); fflush(stdout); if (n) { rl_do_undo (); rl_point = tmp_rl_point; rl_reset_line_state (); } rl_forced_update_display (); }
int rl_vi_delete(int count, int key) { int end; if (rl_end == 0) { rl_ding (); return -1; } if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); else end = rl_point + count; if (end >= rl_end) end = rl_end; rl_kill_text (rl_point, end); if (rl_point > 0 && rl_point == rl_end) rl_backward_char (1, key); return (0); }
static int line_kill_callback(int count, int key) { reset_indent(); int end = line_end(rl_point); int flush_right = rl_point == end; int kill = flush_right ? end + prompt_length + 1 : end; if (kill > rl_end) kill = rl_end; rl_kill_text(rl_point, kill); return 0; }
int rl_vi_change_to(int count, int key) { int c, start_pos; if (_rl_uppercase_p (key)) rl_stuff_char ('$'); else if (vi_redoing) rl_stuff_char (_rl_vi_last_motion); start_pos = rl_point; if (rl_vi_domove (key, &c)) { rl_ding (); return -1; } /* These are the motion commands that do not require adjusting the mark. c[wW] are handled by special-case code in rl_vi_domove(), and already leave the mark at the correct location. */ if ((strchr (" l|hwW^0bB", c) == 0) && (rl_mark < rl_end)) rl_mark++; /* The cursor never moves with c[wW]. */ if ((_rl_to_upper (c) == 'W') && rl_point < start_pos) rl_point = start_pos; if (vi_redoing) { if (vi_insert_buffer && *vi_insert_buffer) rl_begin_undo_group (); rl_delete_text (rl_point, rl_mark); if (vi_insert_buffer && *vi_insert_buffer) { rl_insert_text (vi_insert_buffer); rl_end_undo_group (); } } else { rl_begin_undo_group (); /* to make the `u' command work */ rl_kill_text (rl_point, rl_mark); /* `C' does not save the text inserted for undoing or redoing. */ if (_rl_uppercase_p (key) == 0) _rl_vi_doing_insert = 1; _rl_vi_set_last (key, count, rl_arg_sign); rl_vi_insertion_mode (1, key); } return (0); }
int rl_vi_delete (int count, int key) { int end; if (rl_end == 0) { DING (); return -1; } end = rl_point + count; if (end >= rl_end) end = rl_end; rl_kill_text (rl_point, end); if (rl_point > 0 && rl_point == rl_end) rl_backward (1, key); return (0); }
int rl_vi_delete_to (int count, int key) { int c; if (uppercase_p (key)) rl_stuff_char ('$'); else if (vi_redoing) rl_stuff_char (_rl_vi_last_motion); if (rl_vi_domove (key, &c)) { DING (); return -1; } /* These are the motion commands that do not require adjusting the mark. */ if ((strchr (" l|h^0bB", c) == 0) && (rl_mark < rl_end)) rl_mark++; rl_kill_text (rl_point, rl_mark); return (0); }