@@ -932,6 +932,41 @@ my_type_of (int c)
932932 return r ;
933933}
934934
935+ /* --------------------------------------------------------------------------------------------- */
936+ /** get word at cursor for marking */
937+
938+ static void
939+ edit_get_current_word_extents (WEdit * edit , off_t * start , off_t * end )
940+ {
941+ long pos ;
942+
943+ for (pos = edit -> buffer .curs1 ; pos < edit -> buffer .size ; pos ++ )
944+ {
945+ const int check_char = edit_buffer_get_byte (& edit -> buffer , pos );
946+
947+ if (is_break_char (check_char ))
948+ {
949+ if (pos == edit -> buffer .curs1 ) // always select at least one character.
950+ {
951+ * start = pos ;
952+ * end = pos + 1 ;
953+ return ;
954+ }
955+ break ;
956+ }
957+ }
958+ * end = pos ;
959+
960+ for (; pos != 0 ; pos -- )
961+ {
962+ const int check_char = edit_buffer_get_byte (& edit -> buffer , pos - 1 );
963+
964+ if (is_break_char (check_char ))
965+ break ;
966+ }
967+ * start = pos ;
968+ }
969+
935970/* --------------------------------------------------------------------------------------------- */
936971
937972static void
@@ -3078,8 +3113,8 @@ edit_set_markers (WEdit *edit, off_t m1, off_t m2, long c1, long c2)
30783113
30793114/* --------------------------------------------------------------------------------------------- */
30803115/**
3081- if mark2 is -1 then marking is from mark1 to the cursor.
3082- Otherwise its between the markers. This handles this .
3116+ if mark2 is -1 then marking is from mark1 to end_mark_curs ( the cursor) .
3117+ This also handles the logic for word/line highlighting .
30833118 Returns FALSE if no text is marked.
30843119 */
30853120
@@ -3107,8 +3142,25 @@ eval_marks (WEdit *edit, off_t *start_mark, off_t *end_mark)
31073142 }
31083143 else
31093144 {
3110- * start_mark = MIN (edit -> mark1 , end_mark_curs );
3111- * end_mark = MAX (edit -> mark1 , end_mark_curs );
3145+ if (edit -> word_highlight )
3146+ {
3147+ off_t word_start ;
3148+ off_t word_end ;
3149+
3150+ edit_get_current_word_extents (edit , & word_start , & word_end );
3151+ * start_mark = MIN (edit -> mark1 , word_start );
3152+ * end_mark = MAX (end_mark_curs , word_end );
3153+ }
3154+ else if (edit -> line_highlight )
3155+ {
3156+ * start_mark = MIN (edit -> mark1 , edit_buffer_get_current_bol (& edit -> buffer ));
3157+ * end_mark = MAX (end_mark_curs , edit_buffer_get_current_eol (& edit -> buffer ));
3158+ }
3159+ else
3160+ {
3161+ * start_mark = MIN (edit -> mark1 , end_mark_curs );
3162+ * end_mark = MAX (edit -> mark1 , end_mark_curs );
3163+ }
31123164 edit -> column2 = edit -> curs_col + edit -> over_col ;
31133165 }
31143166
@@ -3154,18 +3206,30 @@ edit_mark_cmd (WEdit *edit, gboolean unmark)
31543206 edit_set_markers (edit , 0 , 0 , 0 , 0 );
31553207 edit -> force |= REDRAW_PAGE ;
31563208 }
3157- else if (edit -> mark2 >= 0 )
3209+ else if (edit -> mark2 >= 0 ) // mark highlighting just started.
31583210 {
3211+ off_t m1 = edit -> buffer .curs1 ;
3212+
31593213 edit -> end_mark_curs = -1 ;
3160- edit_set_markers (edit , edit -> buffer .curs1 , -1 , edit -> curs_col + edit -> over_col ,
3214+ if (edit -> word_highlight )
3215+ edit_get_current_word_extents (edit , & m1 , & edit -> end_mark_curs );
3216+ else if (edit -> line_highlight )
3217+ {
3218+ m1 = edit_buffer_get_current_bol (& edit -> buffer );
3219+ edit -> end_mark_curs = edit_buffer_get_current_eol (& edit -> buffer );
3220+ }
3221+ edit_set_markers (edit , m1 , -1 , edit -> curs_col + edit -> over_col ,
31613222 edit -> curs_col + edit -> over_col );
31623223 edit -> force |= REDRAW_PAGE ;
31633224 }
3164- else
3225+ else // mark highlighting just ended.
31653226 {
3166- edit -> end_mark_curs = edit -> buffer .curs1 ;
3167- edit_set_markers (edit , edit -> mark1 , edit -> buffer .curs1 , edit -> column1 ,
3168- edit -> curs_col + edit -> over_col );
3227+ off_t m1 ;
3228+ off_t m2 ;
3229+
3230+ eval_marks (edit , & m1 , & m2 );
3231+ edit -> end_mark_curs = m2 ;
3232+ edit_set_markers (edit , m1 , m2 , edit -> column1 , edit -> curs_col + edit -> over_col );
31693233 }
31703234}
31713235
@@ -3175,33 +3239,7 @@ edit_mark_cmd (WEdit *edit, gboolean unmark)
31753239void
31763240edit_mark_current_word_cmd (WEdit * edit )
31773241{
3178- long pos ;
3179-
3180- for (pos = edit -> buffer .curs1 ; pos != 0 ; pos -- )
3181- {
3182- int c1 , c2 ;
3183-
3184- c1 = edit_buffer_get_byte (& edit -> buffer , pos );
3185- c2 = edit_buffer_get_byte (& edit -> buffer , pos - 1 );
3186- if (!isspace (c1 ) && isspace (c2 ))
3187- break ;
3188- if ((my_type_of (c1 ) & my_type_of (c2 )) == 0 )
3189- break ;
3190- }
3191- edit -> mark1 = pos ;
3192-
3193- for (; pos < edit -> buffer .size ; pos ++ )
3194- {
3195- int c1 , c2 ;
3196-
3197- c1 = edit_buffer_get_byte (& edit -> buffer , pos );
3198- c2 = edit_buffer_get_byte (& edit -> buffer , pos + 1 );
3199- if (!isspace (c1 ) && isspace (c2 ))
3200- break ;
3201- if ((my_type_of (c1 ) & my_type_of (c2 )) == 0 )
3202- break ;
3203- }
3204- edit -> mark2 = MIN (pos + 1 , edit -> buffer .size );
3242+ edit_get_current_word_extents (edit , & edit -> mark1 , & edit -> mark2 );
32053243
32063244 edit -> force |= REDRAW_LINE_ABOVE | REDRAW_AFTER_CURSOR ;
32073245}
0 commit comments