diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2014-09-30 20:38:47 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2014-09-30 20:38:47 +0200 |
| commit | bb7ada0f41bb82280817570ea9a2b963372e97c6 (patch) | |
| tree | 6b0a1d37c1f74a7e5ece1b1c0cc6363edbf7ab4f /vis.c | |
| parent | 14ab569ac03d5fd1e641948dbfc3decd5b74421c (diff) | |
| download | vis-bb7ada0f41bb82280817570ea9a2b963372e97c6.tar.gz vis-bb7ada0f41bb82280817570ea9a2b963372e97c6.tar.xz | |
Make text objects available in visual mode
Diffstat (limited to 'vis.c')
| -rw-r--r-- | vis.c | 45 |
1 files changed, 27 insertions, 18 deletions
@@ -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]) |
