mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 04:46:55 +03:00
Ticket #27 (group undo)
added option editor_group_undo unset by default added group undo mechanism Signed-off-by: Ilia Maslakov <il.smind@gmail.com>
This commit is contained in:
parent
1c57748571
commit
b39033812b
@ -107,6 +107,8 @@
|
||||
#define CURS_RIGHT_LOTS 607
|
||||
#define COLUMN_ON 608
|
||||
#define COLUMN_OFF 609
|
||||
#define DELCHAR_BR 610
|
||||
#define BACKSPACE_BR 611
|
||||
#define MARK_1 1000
|
||||
#define MARK_2 700000000
|
||||
#define KEY_PRESS 1400000000
|
||||
|
@ -90,6 +90,7 @@ int option_edit_top_extreme = 0;
|
||||
int option_edit_bottom_extreme = 0;
|
||||
int enable_show_tabs_tws = 1;
|
||||
int option_check_nl_at_eof = 0;
|
||||
int option_group_undo = 0;
|
||||
int show_right_margin = 0;
|
||||
|
||||
const char *option_whole_chars_search = "0123456789abcdefghijklmnopqrstuvwxyz_";
|
||||
@ -641,6 +642,26 @@ edit_pop_redo_action (WEdit * edit)
|
||||
return c;
|
||||
}
|
||||
|
||||
static long
|
||||
get_prev_undo_action (WEdit * edit)
|
||||
{
|
||||
long c;
|
||||
unsigned long sp = edit->undo_stack_pointer;
|
||||
|
||||
if (sp == edit->undo_stack_bottom)
|
||||
return STACK_BOTTOM;
|
||||
|
||||
sp = (sp - 1) & edit->undo_stack_size_mask;
|
||||
c = edit->undo_stack[sp];
|
||||
if (c >= 0)
|
||||
return c;
|
||||
|
||||
if (sp == edit->undo_stack_bottom)
|
||||
return STACK_BOTTOM;
|
||||
|
||||
c = edit->undo_stack[(sp - 1) & edit->undo_stack_size_mask];
|
||||
return c;
|
||||
}
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/** is called whenever a modification is made by one of the four routines below */
|
||||
|
||||
@ -1251,9 +1272,11 @@ edit_do_undo (WEdit * edit)
|
||||
edit_cursor_move (edit, -1);
|
||||
break;
|
||||
case BACKSPACE:
|
||||
case BACKSPACE_BR:
|
||||
edit_backspace (edit, 1);
|
||||
break;
|
||||
case DELCHAR:
|
||||
case DELCHAR_BR:
|
||||
edit_delete (edit, 1);
|
||||
break;
|
||||
case COLUMN_ON:
|
||||
@ -1370,6 +1393,24 @@ edit_do_redo (WEdit * edit)
|
||||
done_redo:;
|
||||
}
|
||||
|
||||
static void
|
||||
edit_group_undo (WEdit * edit)
|
||||
{
|
||||
long ac = KEY_PRESS;
|
||||
long cur_ac = KEY_PRESS;
|
||||
while (ac != STACK_BOTTOM && ac == cur_ac)
|
||||
{
|
||||
cur_ac = get_prev_undo_action (edit);
|
||||
edit_do_undo (edit);
|
||||
ac = get_prev_undo_action (edit);
|
||||
/* exit from cycle if option_group_undo is not set,
|
||||
* and make single UNDO operation
|
||||
*/
|
||||
if (!option_group_undo)
|
||||
ac = STACK_BOTTOM;
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
@ -2559,8 +2600,11 @@ edit_insert (WEdit * edit, int c)
|
||||
}
|
||||
|
||||
/* save the reverse command onto the undo stack */
|
||||
edit_push_undo_action (edit, BACKSPACE);
|
||||
|
||||
/* ordinary char and not space */
|
||||
if (c > 32)
|
||||
edit_push_undo_action (edit, BACKSPACE);
|
||||
else
|
||||
edit_push_undo_action (edit, BACKSPACE_BR);
|
||||
/* update markers */
|
||||
edit->mark1 += (edit->mark1 > edit->curs1);
|
||||
edit->mark2 += (edit->mark2 > edit->curs1);
|
||||
@ -2604,7 +2648,11 @@ edit_insert_ahead (WEdit * edit, int c)
|
||||
edit->total_lines++;
|
||||
edit->force |= REDRAW_AFTER_CURSOR;
|
||||
}
|
||||
edit_push_undo_action (edit, DELCHAR);
|
||||
/* ordinary char and not space */
|
||||
if (c > 32)
|
||||
edit_push_undo_action (edit, DELCHAR);
|
||||
else
|
||||
edit_push_undo_action (edit, DELCHAR_BR);
|
||||
|
||||
edit->mark1 += (edit->mark1 >= edit->curs1);
|
||||
edit->mark2 += (edit->mark2 >= edit->curs1);
|
||||
@ -3326,7 +3374,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
|
||||
if (command == CK_Undo)
|
||||
{
|
||||
edit->redo_stack_reset = 0;
|
||||
edit_do_undo (edit);
|
||||
edit_group_undo (edit);
|
||||
edit->found_len = 0;
|
||||
edit->prev_col = edit_get_col (edit);
|
||||
edit->search_start = edit->curs1;
|
||||
|
@ -62,6 +62,7 @@ extern int option_line_state;
|
||||
extern int option_save_mode;
|
||||
extern int option_save_position;
|
||||
extern int option_syntax_highlighting;
|
||||
extern int option_group_undo;
|
||||
extern char *option_backup_ext;
|
||||
|
||||
extern int edit_confirm_save;
|
||||
|
@ -320,6 +320,7 @@ static const struct
|
||||
{ "editor_simple_statusbar", &simple_statusbar },
|
||||
{ "editor_check_new_line", &option_check_nl_at_eof },
|
||||
{ "editor_show_right_margin", &show_right_margin },
|
||||
{ "editor_group_undo", &option_group_undo },
|
||||
#endif /* USE_INTERNAL_EDIT */
|
||||
{ "nice_rotating_dash", &nice_rotating_dash },
|
||||
{ "horizontal_split", &horizontal_split },
|
||||
|
Loading…
Reference in New Issue
Block a user