From afed48a44a59b226beee442bffae4c809dd824ae Mon Sep 17 00:00:00 2001 From: Ilia Maslakov Date: Mon, 14 Feb 2011 10:43:01 +0000 Subject: [PATCH] Ticket #2499 (action to the mark current word) added action CK_Mark_Word to the mark current word changed double-click the mouse handler of the editor Signed-off-by: Ilia Maslakov --- lib/keybind.c | 2 ++ lib/keybind.h | 2 ++ misc/mc.keymap.default | 2 ++ misc/mc.keymap.emacs | 2 ++ src/editor/edit-impl.h | 2 ++ src/editor/edit.c | 66 +++++++++++++++++++++++++++++++++++++++-- src/editor/editwidget.c | 14 +++++++++ 7 files changed, 88 insertions(+), 2 deletions(-) diff --git a/lib/keybind.c b/lib/keybind.c index b36993a24..0711fda6a 100644 --- a/lib/keybind.c +++ b/lib/keybind.c @@ -84,6 +84,8 @@ static name_keymap_t command_names[] = { {"EditRemove", CK_Remove}, {"EditMarkAll", CK_Mark_All}, {"EditUnmark", CK_Unmark}, + {"EditMarkWord", CK_Mark_Word}, + {"EditMarkLine", CK_Mark_Line}, {"EditSaveBlock", CK_Save_Block}, {"EditColumnMark", CK_Column_Mark}, {"EditFind", CK_Find}, diff --git a/lib/keybind.h b/lib/keybind.h index 44a92f039..9106d4922 100644 --- a/lib/keybind.h +++ b/lib/keybind.h @@ -65,6 +65,8 @@ #define CK_Shift_Block_Left 211 #define CK_Shift_Block_Right 212 #define CK_Mark_All 213 +#define CK_Mark_Word 214 +#define CK_Mark_Line 215 /* search and replace */ #define CK_Find 301 diff --git a/misc/mc.keymap.default b/misc/mc.keymap.default index 90f60b98a..356fa5cda 100644 --- a/misc/mc.keymap.default +++ b/misc/mc.keymap.default @@ -45,6 +45,8 @@ EditRemove = f8 EditMarkAll = EditUnmark = EditFind = f7 +EditMarkLine = +EditMarkWord = EditShiftBlockLeft = EditShiftBlockRight = diff --git a/misc/mc.keymap.emacs b/misc/mc.keymap.emacs index 2482d71d4..0d357ce3e 100644 --- a/misc/mc.keymap.emacs +++ b/misc/mc.keymap.emacs @@ -43,6 +43,8 @@ EditRemove = f8 EditMarkAll = EditUnmark = EditFind = f7; ctrl-s +EditMarkLine = +EditMarkWord = EditShiftBlockLeft = EditShiftBlockRight = diff --git a/src/editor/edit-impl.h b/src/editor/edit-impl.h index b9e1976d2..c4cd99780 100644 --- a/src/editor/edit-impl.h +++ b/src/editor/edit-impl.h @@ -278,6 +278,8 @@ int edit_new_cmd (WEdit * edit); int edit_reload (WEdit * edit, const char *filename); int edit_load_cmd (WEdit * edit, edit_current_file_t what); void edit_mark_cmd (WEdit * edit, int unmark); +void edit_mark_current_word_cmd (WEdit * edit); +void edit_mark_current_line_cmd (WEdit * edit); void edit_set_markers (WEdit * edit, long m1, long m2, int c1, int c2); void edit_push_markers (WEdit * edit); void edit_replace_cmd (WEdit * edit, int again); diff --git a/src/editor/edit.c b/src/editor/edit.c index 21cad2082..cb602673c 100644 --- a/src/editor/edit.c +++ b/src/editor/edit.c @@ -4,7 +4,7 @@ 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Authors: Paul Sheer 1996, 1997 - Ilia Maslakov 2009, 2010, 2011 + Ilia Maslakov 2009, 2010, 2011 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -663,6 +663,7 @@ get_prev_undo_action (WEdit * edit) 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 */ @@ -3239,6 +3240,56 @@ edit_mark_cmd (WEdit * edit, int unmark) } } +/* --------------------------------------------------------------------------------------------- */ +/** highlight the word under cursor */ + +void +edit_mark_current_word_cmd (WEdit * edit) +{ + long pos; + + for (pos = edit->curs1; pos != 0; pos--) + { + int c1, c2; + + c1 = edit_get_byte (edit, pos); + c2 = edit_get_byte (edit, pos - 1); + if (!isspace (c1) && isspace (c2)) + break; + if ((my_type_of (c1) & my_type_of (c2)) == 0) + break; + } + edit->mark1 = pos; + + for (; pos < edit->last_byte; pos++) + { + int c1, c2; + + c1 = edit_get_byte (edit, pos); + c2 = edit_get_byte (edit, pos + 1); + if (!isspace (c1) && isspace (c2)) + break; + if ((my_type_of (c1) & my_type_of (c2)) == 0) + break; + } + edit->mark2 = min (pos + 1, edit->last_byte); + + edit->force |= REDRAW_LINE_ABOVE | REDRAW_AFTER_CURSOR; +} + +/* --------------------------------------------------------------------------------------------- */ + +void +edit_mark_current_line_cmd (WEdit * edit) +{ + long pos = edit->curs1; + + edit->mark1 = edit_bol (edit, pos); + edit->mark2 = edit_eol (edit, pos); + + edit->force |= REDRAW_LINE_ABOVE | REDRAW_AFTER_CURSOR; +} + /* --------------------------------------------------------------------------------------------- */ void @@ -3811,7 +3862,18 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion) edit->column_highlight = 0; edit_mark_cmd (edit, 1); break; - + case CK_Mark_Word: + if (edit->column_highlight) + edit_push_undo_action (edit, COLUMN_ON); + edit->column_highlight = 0; + edit_mark_current_word_cmd (edit); + break; + case CK_Mark_Line: + if (edit->column_highlight) + edit_push_undo_action (edit, COLUMN_ON); + edit->column_highlight = 0; + edit_mark_current_line_cmd (edit); + break; case CK_Toggle_Line_State: option_line_state = !option_line_state; if (option_line_state) diff --git a/src/editor/editwidget.c b/src/editor/editwidget.c index 8dfc8e1ba..381badba3 100644 --- a/src/editor/editwidget.c +++ b/src/editor/editwidget.c @@ -133,6 +133,20 @@ edit_event (Gpm_Event * event, void *data) || event->x > edit->num_widget_columns || event->y > edit->num_widget_lines + 1) return MOU_NORMAL; + /* Double click */ + if ((event->type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE)) + { + edit_mark_current_word_cmd (edit); + goto update; + } +#if 0 + /* Triple click */ + if ((event->type & (GPM_TRIPLE | GPM_UP)) == (GPM_UP | GPM_TRIPLE)) + { + edit_mark_current_line_cmd (edit); + goto update; + } +#endif /* Wheel events */ if ((event->buttons & GPM_B_UP) && (event->type & GPM_DOWN)) {