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},
     {"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},

+ 2 - 0
lib/keybind.h

@@ -64,6 +64,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

+ 2 - 0
misc/mc.keymap.default

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

+ 2 - 0
misc/mc.keymap.emacs

@@ -43,6 +43,8 @@ EditRemove = f8
 EditMarkAll =
 EditUnmark =
 EditFind = f7; ctrl-s
+EditMarkLine =
+EditMarkWord =
 
 EditShiftBlockLeft =
 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_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);

+ 66 - 3
src/editor/edit.c

@@ -3,7 +3,9 @@
    Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004, 2005, 2006,
    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
    it under the terms of the GNU General Public License as published by
@@ -57,7 +59,7 @@
 #endif
 
 #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/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
@@ -3686,7 +3738,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_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:
         option_line_state = !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)
         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))
     {