@@ -162,6 +162,7 @@ typedef enum
162
162
MARK_MODE_BLOCK , /* activated by F15 ~ Shift F3 */
163
163
MARK_MODE_COLUMNS , /* activated by F15 ~ Shift F3, when row cursor is hidden */
164
164
MARK_MODE_CURSOR , /* activated by SHIFT + CURSOR */
165
+ MARK_MODE_CURSOR_COLUMNS , /* activated by SHIFT - vertical cursors */
165
166
MARK_MODE_MOUSE , /* activated by CTRL + MOUSE */
166
167
MARK_MODE_MOUSE_COLUMNS ,/* activated by CTRL + MOUSE on column headers */
167
168
MARK_MODE_MOUSE_BLOCK , /* activated by ALT + MOUSE */
@@ -1029,7 +1030,8 @@ redraw_screen(void)
1029
1030
mark_mode == MARK_MODE_MOUSE_COLUMNS )
1030
1031
ref_col = mouse_col ;
1031
1032
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 )
1033
1035
ref_col = vertical_cursor_column ;
1034
1036
else
1035
1037
ref_col = -1 ;
@@ -1213,8 +1215,7 @@ redraw_screen(void)
1213
1215
!opts -> no_mouse &&
1214
1216
!(mark_mode == MARK_MODE_MOUSE ||
1215
1217
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 ))
1218
1219
{
1219
1220
long td = time_diff (current_sec , current_ms ,
1220
1221
last_doupdate_sec , last_doupdate_ms );
@@ -2384,6 +2385,38 @@ throw_selection(ScrDesc *scrdesc, DataDesc *desc, MarkModeType *_mark_mode)
2384
2385
throw_searching (scrdesc , desc );
2385
2386
}
2386
2387
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
+
2387
2420
static bool
2388
2421
check_visible_vertical_cursor (DataDesc * desc ,
2389
2422
Options * opts ,
@@ -3533,13 +3566,9 @@ main(int argc, char *argv[])
3533
3566
}
3534
3567
3535
3568
/* 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 ) ||
3543
3572
is_cmd_RowNumToggle (event_keycode , nced .alt )))
3544
3573
mark_mode = MARK_MODE_NONE ;
3545
3574
@@ -4447,7 +4476,9 @@ main(int argc, char *argv[])
4447
4476
case cmd_Mark :
4448
4477
if (mark_mode != MARK_MODE_ROWS &&
4449
4478
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 )
4451
4482
{
4452
4483
throw_selection (& scrdesc , & desc , & mark_mode );
4453
4484
@@ -4487,14 +4518,54 @@ main(int argc, char *argv[])
4487
4518
break ;
4488
4519
4489
4520
case cmd_Mark_NestedCursorCommand :
4490
- if (mark_mode != MARK_MODE_CURSOR )
4491
4521
{
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
+
4492
4561
throw_selection (& scrdesc , & desc , & mark_mode );
4493
4562
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 ;
4496
4568
}
4497
- next_command = nested_command ;
4498
4569
break ;
4499
4570
4500
4571
case cmd_Unmark :
0 commit comments