static const char *cursors_select_next(Vis *vis, const char *keys, const Arg *arg) { Text *txt = vis_text(vis); View *view = vis_view(vis); Cursor *cursor = view_cursor(view); Filerange sel = view_cursors_selection_get(cursor); if (!text_range_valid(&sel)) return keys; size_t len = text_range_size(&sel); char *buf = malloc(len+1); if (!buf) return keys; len = text_bytes_get(txt, sel.start, len, buf); buf[len] = '\0'; Filerange word = text_object_word_find_next(txt, sel.end, buf); free(buf); if (text_range_valid(&word)) { cursor = view_cursors_new(view); if (!cursor) return keys; view_cursors_selection_set(cursor, &word); view_cursors_to(cursor, text_char_prev(txt, word.end)); } return keys; }
static const char *cursors_new(Vis *vis, const char *keys, const Arg *arg) { View *view = vis_view(vis); size_t pos = view_cursor_get(view); Cursor *cursor = view_cursors_new(view); if (cursor) { view_cursors_to(cursor, pos); if (arg->i > 0) view_line_down(cursor); else if (arg->i < 0) view_line_up(cursor); } return keys; }
static size_t op_cursor(Vis *vis, Text *txt, OperatorContext *c) { View *view = vis->win->view; Filerange r = text_range_linewise(txt, &c->range); for (size_t line = text_range_line_first(txt, &r); line != EPOS; line = text_range_line_next(txt, &r, line)) { Cursor *cursor = view_cursors_new(view); if (cursor) { size_t pos; if (c->arg->i == VIS_OP_CURSOR_EOL) pos = text_line_finish(txt, line); else pos = text_line_start(txt, line); view_cursors_to(cursor, pos); } } return EPOS; }