@@ -162,6 +162,7 @@ typedef enum
162162 MARK_MODE_BLOCK , /* activated by F15 ~ Shift F3 */
163163 MARK_MODE_COLUMNS , /* activated by F15 ~ Shift F3, when row cursor is hidden */
164164 MARK_MODE_CURSOR , /* activated by SHIFT + CURSOR */
165+ MARK_MODE_CURSOR_COLUMNS , /* activated by SHIFT - vertical cursors */
165166 MARK_MODE_MOUSE , /* activated by CTRL + MOUSE */
166167 MARK_MODE_MOUSE_COLUMNS ,/* activated by CTRL + MOUSE on column headers */
167168 MARK_MODE_MOUSE_BLOCK , /* activated by ALT + MOUSE */
@@ -1029,7 +1030,8 @@ redraw_screen(void)
10291030 mark_mode == MARK_MODE_MOUSE_COLUMNS )
10301031 ref_col = mouse_col ;
10311032 else if (mark_mode == MARK_MODE_BLOCK ||
1032- mark_mode == MARK_MODE_COLUMNS )
1033+ mark_mode == MARK_MODE_COLUMNS ||
1034+ mark_mode == MARK_MODE_CURSOR_COLUMNS )
10331035 ref_col = vertical_cursor_column ;
10341036 else
10351037 ref_col = -1 ;
@@ -1213,8 +1215,7 @@ redraw_screen(void)
12131215 !opts -> no_mouse &&
12141216 !(mark_mode == MARK_MODE_MOUSE ||
12151217 mark_mode == MARK_MODE_MOUSE_BLOCK ||
1216- mark_mode == MARK_MODE_MOUSE_COLUMNS ||
1217- mark_mode == MARK_MODE_COLUMNS ))
1218+ mark_mode == MARK_MODE_MOUSE_COLUMNS ))
12181219 {
12191220 long td = time_diff (current_sec , current_ms ,
12201221 last_doupdate_sec , last_doupdate_ms );
@@ -2384,6 +2385,38 @@ throw_selection(ScrDesc *scrdesc, DataDesc *desc, MarkModeType *_mark_mode)
23842385 throw_searching (scrdesc , desc );
23852386}
23862387
2388+ static bool
2389+ is_horizontal_move (int c )
2390+ {
2391+ switch (c )
2392+ {
2393+ case cmd_MoveColumnLeft :
2394+ case cmd_MoveColumnRight :
2395+ case cmd_ShowFirstCol :
2396+ case cmd_ShowLastCol :
2397+ return true;
2398+ }
2399+
2400+ return false;
2401+ }
2402+
2403+ static bool
2404+ is_vertical_move (int c )
2405+ {
2406+ switch (c )
2407+ {
2408+ case cmd_CursorUp :
2409+ case cmd_CursorDown :
2410+ case cmd_PageUp :
2411+ case cmd_PageDown :
2412+ case cmd_CursorFirstRow :
2413+ case cmd_CursorLastRow :
2414+ return true;
2415+ }
2416+
2417+ return false;
2418+ }
2419+
23872420static bool
23882421check_visible_vertical_cursor (DataDesc * desc ,
23892422 Options * opts ,
@@ -3533,13 +3566,9 @@ main(int argc, char *argv[])
35333566 }
35343567
35353568 /* Disable mark cursor mode immediately */
3536- if (mark_mode == MARK_MODE_CURSOR &&
3537- !(event_keycode == KEY_SF ||
3538- event_keycode == KEY_SR ||
3539- event_keycode == KEY_SNEXT ||
3540- event_keycode == KEY_SPREVIOUS ||
3541- event_keycode == KEY_LEFT ||
3542- event_keycode == KEY_RIGHT ||
3569+ if ((mark_mode == MARK_MODE_CURSOR ||
3570+ mark_mode == MARK_MODE_CURSOR_COLUMNS ) &&
3571+ !(key_is_allowed_mark_mode_cursor (event_keycode ) ||
35433572 is_cmd_RowNumToggle (event_keycode , nced .alt )))
35443573 mark_mode = MARK_MODE_NONE ;
35453574
@@ -4447,7 +4476,9 @@ main(int argc, char *argv[])
44474476 case cmd_Mark :
44484477 if (mark_mode != MARK_MODE_ROWS &&
44494478 mark_mode != MARK_MODE_BLOCK &&
4450- mark_mode != MARK_MODE_COLUMNS )
4479+ mark_mode != MARK_MODE_COLUMNS &&
4480+ mark_mode != MARK_MODE_CURSOR &&
4481+ mark_mode != MARK_MODE_CURSOR_COLUMNS )
44514482 {
44524483 throw_selection (& scrdesc , & desc , & mark_mode );
44534484
@@ -4487,14 +4518,54 @@ main(int argc, char *argv[])
44874518 break ;
44884519
44894520 case cmd_Mark_NestedCursorCommand :
4490- if (mark_mode != MARK_MODE_CURSOR )
44914521 {
4522+ MarkModeType next_mark_mode = MARK_MODE_NONE ;
4523+ int next_mark_mode_start_col = -1 ;
4524+ int next_mark_mode_start_row = -1 ;
4525+ bool is_horizontal_mv ;
4526+ bool is_vertical_mv ;
4527+
4528+ is_horizontal_mv = is_horizontal_move (nested_command );
4529+ is_vertical_mv = is_vertical_move (nested_command );
4530+
4531+ if (mark_mode == MARK_MODE_CURSOR && is_vertical_mv )
4532+ {
4533+ next_command = nested_command ;
4534+ break ;
4535+ }
4536+
4537+ if (mark_mode == MARK_MODE_CURSOR_COLUMNS && is_horizontal_mv )
4538+ {
4539+ next_command = nested_command ;
4540+ break ;
4541+ }
4542+
4543+ if (is_vertical_mv )
4544+ {
4545+ if (opts .no_cursor )
4546+ break ;
4547+
4548+ next_mark_mode = MARK_MODE_CURSOR ;
4549+ next_mark_mode_start_row = cursor_row ;
4550+ }
4551+
4552+ if (is_horizontal_mv )
4553+ {
4554+ if (!opts .vertical_cursor )
4555+ break ;
4556+
4557+ next_mark_mode = MARK_MODE_CURSOR_COLUMNS ;
4558+ next_mark_mode_start_col = vertical_cursor_column ;
4559+ }
4560+
44924561 throw_selection (& scrdesc , & desc , & mark_mode );
44934562
4494- mark_mode = MARK_MODE_CURSOR ;
4495- mark_mode_start_row = cursor_row ;
4563+ mark_mode = next_mark_mode ;
4564+ mark_mode_start_row = next_mark_mode_start_row ;
4565+ mark_mode_start_col = next_mark_mode_start_col ;
4566+
4567+ next_command = nested_command ;
44964568 }
4497- next_command = nested_command ;
44984569 break ;
44994570
45004571 case cmd_Unmark :
0 commit comments