aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.def.h43
-rw-r--r--vis.c45
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
*/
diff --git a/vis.c b/vis.c
index b0733f1..6c35574 100644
--- a/vis.c
+++ b/vis.c
@@ -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])