diff options
| -rw-r--r-- | config.def.h | 43 | ||||
| -rw-r--r-- | vis.c | 45 |
2 files changed, 54 insertions, 34 deletions
diff --git a/config.def.h b/config.def.h index 99148ce..a9b4e21 100644 --- a/config.def.h +++ b/config.def.h @@ -427,13 +427,17 @@ static KeyBinding vis_mode_visual[] = { }; static void vis_mode_visual_enter(Mode *old) { - if (!old->visual) + if (!old->visual) { window_selection_start(vis->win->win); + vis_modes[VIS_MODE_OPERATOR].parent = &vis_modes[VIS_MODE_TEXTOBJ]; + } } static void vis_mode_visual_leave(Mode *new) { - if (!new->visual) + if (!new->visual) { window_selection_clear(vis->win->win); + vis_modes[VIS_MODE_OPERATOR].parent = &vis_modes[VIS_MODE_MOVE]; + } } static KeyBinding vis_mode_visual_line[] = { @@ -445,14 +449,18 @@ static KeyBinding vis_mode_visual_line[] = { static void vis_mode_visual_line_enter(Mode *old) { Win *win = vis->win->win; window_cursor_to(win, text_line_begin(vis->win->text, window_cursor_get(win))); - if (!old->visual) + if (!old->visual) { window_selection_start(vis->win->win); + vis_modes[VIS_MODE_OPERATOR].parent = &vis_modes[VIS_MODE_TEXTOBJ]; + } movement(&(const Arg){ .i = MOVE_LINE_END }); } static void vis_mode_visual_line_leave(Mode *new) { - if (!new->visual) + if (!new->visual) { window_selection_clear(vis->win->win); + vis_modes[VIS_MODE_OPERATOR].parent = &vis_modes[VIS_MODE_MOVE]; + } } static KeyBinding vis_mode_readline[] = { @@ -573,6 +581,9 @@ static void vis_mode_replace_input(const char *str, size_t len) { * reachable. once the operator is processed (i.e. the OPERATOR mode is left) its parent * mode is reset back to MOVE. * + * Similarly the +-ed line between OPERATOR and TEXTOBJ is only active within the visual + * modes. + * * * BASIC * (arrow keys etc.) @@ -590,18 +601,18 @@ static void vis_mode_replace_input(const char *str, size_t len) { * | (h,j,k,l ...) * | | \-----------------\ * | | | - * REPLACE OPERATOR ======\\ INNER-TEXTOBJ - * (d,c,y,p ..) || (i [wsp[]()b<>{}B"'`] ) - * | || | - * | || | - * REGISTER || TEXTOBJ - * (" [a-z]) || (a [wsp[]()b<>{}B"'`] ) - * /-----------/ | \\ | - * / | \\ | - * VISUAL MARK-SET \\ OPERATOR-OPTION - * | (m [a-z]) \\ (v,V) - * | | \\ // - * | | \\======// + * REPLACE OPERATOR ++++ INNER-TEXTOBJ + * (d,c,y,p ..) + (i [wsp[]()b<>{}B"'`] ) + * | \\ + | + * | \\ + | + * REGISTER \\ + TEXTOBJ + * (" [a-z]) \\ + (a [wsp[]()b<>{}B"'`] ) + * /-----------/ | \\ + + | + * / | \\ + + | + * VISUAL MARK-SET \\ OPERATOR-OPTION + * | (m [a-z]) \\ (v,V) + * | | \\ // + * | | \\======// * VISUAL-LINE NORMAL */ @@ -1111,31 +1111,18 @@ static void action_do(Action *a) { else window_cursor_to(win, pos); - if (mode == &vis_modes[VIS_MODE_VISUAL_LINE]) { - Filerange sel = window_selection_get(win); - sel.end = text_char_prev(txt, sel.end); - size_t start = text_line_begin(txt, sel.start); - size_t end = text_line_end(txt, sel.end); - if (sel.start == pos) { /* extend selection upwards */ - sel.end = start; - sel.start = end; - } else { /* extend selection downwards */ - sel.start = start; - sel.end = end; - } - window_selection_set(win, &sel); - c.range = sel; - } } else if (a->movement->type & INCLUSIVE) { Iterator it = text_iterator_get(txt, c.range.end); text_iterator_char_next(&it, NULL); c.range.end = it.pos; } } else if (a->textobj) { - Filerange r; - c.range.start = c.range.end = pos; + if (mode->visual) + c.range = window_selection_get(win); + else + c.range.start = c.range.end = pos; for (int i = 0; i < count; i++) { - r = a->textobj->range(txt, pos); + Filerange r = a->textobj->range(txt, pos); if (!text_range_valid(&r)) break; if (a->textobj->type == OUTER) { @@ -1153,12 +1140,34 @@ static void action_do(Action *a) { } } } + + if (mode->visual) { + window_selection_set(win, &c.range); + pos = c.range.end; + window_cursor_to(win, pos); + } } else if (mode->visual) { c.range = window_selection_get(win); if (!text_range_valid(&c.range)) c.range.start = c.range.end = pos; } + if (mode == &vis_modes[VIS_MODE_VISUAL_LINE] && (a->movement || a->textobj)) { + Filerange sel = window_selection_get(win); + sel.end = text_char_prev(txt, sel.end); + size_t start = text_line_begin(txt, sel.start); + size_t end = text_line_end(txt, sel.end); + if (sel.start == pos) { /* extend selection upwards */ + sel.end = start; + sel.start = end; + } else { /* extend selection downwards */ + sel.start = start; + sel.end = end; + } + window_selection_set(win, &sel); + c.range = sel; + } + if (a->op) { a->op->func(&c); if (mode == &vis_modes[VIS_MODE_OPERATOR]) |
