diff options
Diffstat (limited to 'readline/vi_mode.c')
-rw-r--r-- | readline/vi_mode.c | 164 |
1 files changed, 25 insertions, 139 deletions
diff --git a/readline/vi_mode.c b/readline/vi_mode.c index cae80cac8c4..a3c35786c36 100644 --- a/readline/vi_mode.c +++ b/readline/vi_mode.c @@ -1,7 +1,7 @@ /* vi_mode.c -- A vi emulation mode for Bash. Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */ -/* Copyright (C) 1987-2012 Free Software Foundation, Inc. +/* Copyright (C) 1987-2010 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. @@ -108,13 +108,9 @@ static const char * const vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; /* Arrays for the saved marks. */ static int vi_mark_chars['z' - 'a' + 1]; -static void _rl_vi_replace_insert PARAMS((int)); -static void _rl_vi_save_replace PARAMS((void)); static void _rl_vi_stuff_insert PARAMS((int)); static void _rl_vi_save_insert PARAMS((UNDO_LIST *)); -static void vi_save_insert_buffer PARAMS ((int, int)); - static void _rl_vi_backup PARAMS((void)); static int _rl_vi_arg_dispatch PARAMS((int)); @@ -192,29 +188,6 @@ _rl_vi_textmod_command (c) return (member (c, vi_textmod)); } -int -_rl_vi_motion_command (c) - int c; -{ - return (member (c, vi_motion)); -} - -static void -_rl_vi_replace_insert (count) - int count; -{ - int nchars; - - nchars = strlen (vi_insert_buffer); - - rl_begin_undo_group (); - while (count--) - /* nchars-1 to compensate for _rl_replace_text using `end+1' in call - to rl_delete_text */ - _rl_replace_text (vi_insert_buffer, rl_point, rl_point+nchars-1); - rl_end_undo_group (); -} - static void _rl_vi_stuff_insert (count) int count; @@ -234,7 +207,7 @@ rl_vi_redo (count, c) { int r; - if (rl_explicit_arg == 0) + if (!rl_explicit_arg) { rl_numeric_arg = _rl_vi_last_repeat; rl_arg_sign = _rl_vi_last_arg_sign; @@ -251,13 +224,6 @@ rl_vi_redo (count, c) if (rl_point > 0) _rl_vi_backup (); } - else if (_rl_vi_last_command == 'R' && vi_insert_buffer && *vi_insert_buffer) - { - _rl_vi_replace_insert (count); - /* And back up point over the last character inserted. */ - if (rl_point > 0) - _rl_vi_backup (); - } /* Ditto for redoing an insert with `I', but move to the beginning of the line like the `I' command does. */ else if (_rl_vi_last_command == 'I' && vi_insert_buffer && *vi_insert_buffer) @@ -471,7 +437,7 @@ rl_vi_end_word (count, key) if (count < 0) { rl_ding (); - return 1; + return -1; } if (_rl_uppercase_p (key)) @@ -713,8 +679,6 @@ rl_vi_insertion_mode (count, key) { _rl_keymap = vi_insertion_keymap; _rl_vi_last_key_before_insert = key; - if (_rl_show_mode_in_prompt) - _rl_reset_prompt (); return (0); } @@ -727,43 +691,6 @@ rl_vi_insert_mode (count, key) } static void -vi_save_insert_buffer (start, len) - int start, len; -{ - /* Same code as _rl_vi_save_insert below */ - if (len >= vi_insert_buffer_size) - { - vi_insert_buffer_size += (len + 32) - (len % 32); - vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size); - } - strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1); - vi_insert_buffer[len-1] = '\0'; -} - -static void -_rl_vi_save_replace () -{ - int len, start, end; - UNDO_LIST *up; - - up = rl_undo_list; - if (up == 0 || up->what != UNDO_END || vi_replace_count <= 0) - { - if (vi_insert_buffer_size >= 1) - vi_insert_buffer[0] = '\0'; - return; - } - /* Let's try it the quick and easy way for now. This should essentially - accommodate every UNDO_INSERT and save the inserted text to - vi_insert_buffer */ - end = rl_point; - start = end - vi_replace_count + 1; - len = vi_replace_count + 1; - - vi_save_insert_buffer (start, len); -} - -static void _rl_vi_save_insert (up) UNDO_LIST *up; { @@ -779,8 +706,13 @@ _rl_vi_save_insert (up) start = up->start; end = up->end; len = end - start + 1; - - vi_save_insert_buffer (start, len); + if (len >= vi_insert_buffer_size) + { + vi_insert_buffer_size += (len + 32) - (len % 32); + vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size); + } + strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1); + vi_insert_buffer[len-1] = '\0'; } void @@ -796,10 +728,7 @@ _rl_vi_done_inserting () on absolute indices into the line which may change (though they probably will not). */ _rl_vi_doing_insert = 0; - if (_rl_vi_last_key_before_insert == 'R') - _rl_vi_save_replace (); /* Half the battle */ - else - _rl_vi_save_insert (rl_undo_list->next); + _rl_vi_save_insert (rl_undo_list->next); vi_continued_command = 1; } else @@ -833,9 +762,6 @@ rl_vi_movement_mode (count, key) if (RL_ISSTATE (RL_STATE_VICMDONCE) == 0) rl_free_undo_list (); - if (_rl_show_mode_in_prompt) - _rl_reset_prompt (); - RL_SETSTATE (RL_STATE_VICMDONCE); return (0); } @@ -1308,19 +1234,11 @@ rl_vi_delete_to (count, key) _rl_vimvcxt->motion = '$'; r = rl_domove_motion_callback (_rl_vimvcxt); } - else if (vi_redoing && _rl_vi_last_motion != 'd') /* `dd' is special */ + else if (vi_redoing) { _rl_vimvcxt->motion = _rl_vi_last_motion; r = rl_domove_motion_callback (_rl_vimvcxt); } - else if (vi_redoing) /* handle redoing `dd' here */ - { - _rl_vimvcxt->motion = _rl_vi_last_motion; - rl_mark = rl_end; - rl_beg_of_line (1, key); - RL_UNSETSTATE (RL_STATE_VIMOTION); - r = vidomove_dispatch (_rl_vimvcxt); - } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { @@ -1398,19 +1316,11 @@ rl_vi_change_to (count, key) _rl_vimvcxt->motion = '$'; r = rl_domove_motion_callback (_rl_vimvcxt); } - else if (vi_redoing && _rl_vi_last_motion != 'c') /* `cc' is special */ + else if (vi_redoing) { _rl_vimvcxt->motion = _rl_vi_last_motion; r = rl_domove_motion_callback (_rl_vimvcxt); } - else if (vi_redoing) /* handle redoing `cc' here */ - { - _rl_vimvcxt->motion = _rl_vi_last_motion; - rl_mark = rl_end; - rl_beg_of_line (1, key); - RL_UNSETSTATE (RL_STATE_VIMOTION); - r = vidomove_dispatch (_rl_vimvcxt); - } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { @@ -1467,19 +1377,6 @@ rl_vi_yank_to (count, key) _rl_vimvcxt->motion = '$'; r = rl_domove_motion_callback (_rl_vimvcxt); } - else if (vi_redoing && _rl_vi_last_motion != 'y') /* `yy' is special */ - { - _rl_vimvcxt->motion = _rl_vi_last_motion; - r = rl_domove_motion_callback (_rl_vimvcxt); - } - else if (vi_redoing) /* handle redoing `yy' here */ - { - _rl_vimvcxt->motion = _rl_vi_last_motion; - rl_mark = rl_end; - rl_beg_of_line (1, key); - RL_UNSETSTATE (RL_STATE_VIMOTION); - r = vidomove_dispatch (_rl_vimvcxt); - } #if defined (READLINE_CALLBACKS) else if (RL_ISSTATE (RL_STATE_CALLBACK)) { @@ -1541,7 +1438,7 @@ rl_vi_rubout (count, key) if (rl_point == 0) { rl_ding (); - return 1; + return -1; } opoint = rl_point; @@ -1572,7 +1469,7 @@ rl_vi_delete (count, key) if (rl_end == 0) { rl_ding (); - return 1; + return -1; } if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) @@ -1657,13 +1554,13 @@ rl_vi_char_search (count, key) if (key == ';' || key == ',') { if (_rl_cs_orig_dir == 0) - return 1; + return -1; #if defined (HANDLE_MULTIBYTE) if (_rl_vi_last_search_mblen == 0) - return 1; + return -1; #else if (_rl_vi_last_search_char == 0) - return 1; + return -1; #endif _rl_cs_dir = (key == ';') ? _rl_cs_orig_dir : -_rl_cs_orig_dir; } @@ -1762,7 +1659,7 @@ rl_vi_match (ignore, key) { rl_point = pos; rl_ding (); - return 1; + return -1; } } @@ -1792,7 +1689,7 @@ rl_vi_match (ignore, key) else { rl_ding (); - return 1; + return -1; } } } @@ -1816,7 +1713,7 @@ rl_vi_match (ignore, key) else { rl_ding (); - return 1; + return -1; } } } @@ -2014,20 +1911,14 @@ rl_vi_replace (count, key) vi_replace_count = 0; - if (vi_replace_map == 0) + if (!vi_replace_map) { vi_replace_map = rl_make_bare_keymap (); - for (i = 0; i < ' '; i++) - if (vi_insertion_keymap[i].type == ISFUNC) - vi_replace_map[i].function = vi_insertion_keymap[i].function; - for (i = ' '; i < KEYMAP_SIZE; i++) vi_replace_map[i].function = rl_vi_overstrike; vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete; - - /* Make sure these are what we want. */ vi_replace_map[ESC].function = rl_vi_movement_mode; vi_replace_map[RETURN].function = rl_newline; vi_replace_map[NEWLINE].function = rl_newline; @@ -2040,12 +1931,7 @@ rl_vi_replace (count, key) vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete; } - - rl_vi_start_inserting (key, 1, rl_arg_sign); - - _rl_vi_last_key_before_insert = key; _rl_keymap = vi_replace_map; - return (0); } @@ -2090,7 +1976,7 @@ _rl_vi_set_mark () if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ { rl_ding (); - return 1; + return -1; } ch -= 'a'; vi_mark_chars[ch] = rl_point; @@ -2142,14 +2028,14 @@ _rl_vi_goto_mark () else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ { rl_ding (); - return 1; + return -1; } ch -= 'a'; if (vi_mark_chars[ch] == -1) { rl_ding (); - return 1; + return -1; } rl_point = vi_mark_chars[ch]; return 0; |