Browse Source

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 <il.smind@gmail.com>
Ilia Maslakov 14 years ago
parent
commit
067b274c1c
7 changed files with 90 additions and 3 deletions
  1. 2 0
      lib/keybind.c
  2. 2 0
      lib/keybind.h
  3. 2 0
      misc/mc.keymap.default
  4. 2 0
      misc/mc.keymap.emacs
  5. 2 0
      src/editor/edit-impl.h
  6. 66 3
      src/editor/edit.c
  7. 14 0
      src/editor/editwidget.c

+ 2 - 0
lib/keybind.c

@@ -83,6 +83,8 @@ static name_keymap_t command_names[] = {
     {"EditRemove", CK_Remove},
     {"EditRemove", CK_Remove},
     {"EditMarkAll", CK_Mark_All},
     {"EditMarkAll", CK_Mark_All},
     {"EditUnmark", CK_Unmark},
     {"EditUnmark", CK_Unmark},
+    {"EditMarkWord", CK_Mark_Word},
+    {"EditMarkLine", CK_Mark_Line},
     {"EditSaveBlock", CK_Save_Block},
     {"EditSaveBlock", CK_Save_Block},
     {"EditColumnMark", CK_Column_Mark},
     {"EditColumnMark", CK_Column_Mark},
     {"EditFind", CK_Find},
     {"EditFind", CK_Find},

+ 2 - 0
lib/keybind.h

@@ -64,6 +64,8 @@
 #define CK_Shift_Block_Left  211
 #define CK_Shift_Block_Left  211
 #define CK_Shift_Block_Right 212
 #define CK_Shift_Block_Right 212
 #define CK_Mark_All          213
 #define CK_Mark_All          213
+#define CK_Mark_Word         214
+#define CK_Mark_Line         215
 
 
 /* search and replace */
 /* search and replace */
 #define CK_Find          301
 #define CK_Find          301

+ 2 - 0
misc/mc.keymap.default

@@ -44,6 +44,8 @@ EditRemove = f8
 EditMarkAll =
 EditMarkAll =
 EditUnmark =
 EditUnmark =
 EditFind = f7
 EditFind = f7
+EditMarkLine =
+EditMarkWord =
 
 
 EditShiftBlockLeft =
 EditShiftBlockLeft =
 EditShiftBlockRight =
 EditShiftBlockRight =

+ 2 - 0
misc/mc.keymap.emacs

@@ -43,6 +43,8 @@ EditRemove = f8
 EditMarkAll =
 EditMarkAll =
 EditUnmark =
 EditUnmark =
 EditFind = f7; ctrl-s
 EditFind = f7; ctrl-s
+EditMarkLine =
+EditMarkWord =
 
 
 EditShiftBlockLeft =
 EditShiftBlockLeft =
 EditShiftBlockRight =
 EditShiftBlockRight =

+ 2 - 0
src/editor/edit-impl.h

@@ -275,6 +275,8 @@ int edit_new_cmd (WEdit * edit);
 int edit_reload (WEdit * edit, const char *filename);
 int edit_reload (WEdit * edit, const char *filename);
 int edit_load_cmd (WEdit * edit, edit_current_file_t what);
 int edit_load_cmd (WEdit * edit, edit_current_file_t what);
 void edit_mark_cmd (WEdit * edit, int unmark);
 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_set_markers (WEdit * edit, long m1, long m2, int c1, int c2);
 void edit_push_markers (WEdit * edit);
 void edit_push_markers (WEdit * edit);
 void edit_replace_cmd (WEdit * edit, int again);
 void edit_replace_cmd (WEdit * edit, int again);

+ 66 - 3
src/editor/edit.c

@@ -3,7 +3,9 @@
    Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004, 2005, 2006,
    Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004, 2005, 2006,
    2007 Free Software Foundation, Inc.
    2007 Free Software Foundation, Inc.
 
 
-   Authors: 1996, 1997 Paul Sheer
+   Authors:
+   Paul Sheer 1996, 1997
+   Ilia Maslakov <il.smind@gmail.com> 2009, 2010, 2011
 
 
    This program is free software; you can redistribute it and/or modify
    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
    it under the terms of the GNU General Public License as published by
@@ -57,7 +59,7 @@
 #endif
 #endif
 
 
 #include "src/filemanager/cmd.h"        /* view_other_cmd() */
 #include "src/filemanager/cmd.h"        /* view_other_cmd() */
-#include "src/filemanager/usermenu.h"       /* user_menu_cmd() */
+#include "src/filemanager/usermenu.h"   /* user_menu_cmd() */
 
 
 #include "src/main.h"           /* source_codepage */
 #include "src/main.h"           /* source_codepage */
 #include "src/setup.h"          /* option_tab_spacing */
 #include "src/setup.h"          /* option_tab_spacing */
@@ -3127,6 +3129,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
 void
@@ -3686,7 +3738,18 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
         edit->column_highlight = 0;
         edit->column_highlight = 0;
         edit_mark_cmd (edit, 1);
         edit_mark_cmd (edit, 1);
         break;
         break;
-
+    case CK_Mark_Word:
+        if (edit->column_highlight)
+            edit_push_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_action (edit, COLUMN_ON);
+        edit->column_highlight = 0;
+        edit_mark_current_line_cmd (edit);
+        break;
     case CK_Toggle_Line_State:
     case CK_Toggle_Line_State:
         option_line_state = !option_line_state;
         option_line_state = !option_line_state;
         if (option_line_state)
         if (option_line_state)

+ 14 - 0
src/editor/editwidget.c

@@ -132,6 +132,20 @@ edit_event (Gpm_Event * event, void *data)
         || event->x > edit->num_widget_columns || event->y > edit->num_widget_lines + 1)
         || event->x > edit->num_widget_columns || event->y > edit->num_widget_lines + 1)
         return MOU_NORMAL;
         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 */
     /* Wheel events */
     if ((event->buttons & GPM_B_UP) && (event->type & GPM_DOWN))
     if ((event->buttons & GPM_B_UP) && (event->type & GPM_DOWN))
     {
     {