aboutsummaryrefslogtreecommitdiff
path: root/vis.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2014-09-30 20:38:47 +0200
committerMarc André Tanner <mat@brain-dump.org>2014-09-30 20:38:47 +0200
commitbb7ada0f41bb82280817570ea9a2b963372e97c6 (patch)
tree6b0a1d37c1f74a7e5ece1b1c0cc6363edbf7ab4f /vis.c
parent14ab569ac03d5fd1e641948dbfc3decd5b74421c (diff)
downloadvis-bb7ada0f41bb82280817570ea9a2b963372e97c6.tar.gz
vis-bb7ada0f41bb82280817570ea9a2b963372e97c6.tar.xz
Make text objects available in visual mode
Diffstat (limited to 'vis.c')
-rw-r--r--vis.c45
1 files changed, 27 insertions, 18 deletions
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])