Filerange text_object_word_find_prev(Text *txt, size_t pos, const char *word) { size_t len = strlen(word); for (;;) { size_t match_pos = text_find_prev(txt, pos, word); if (match_pos != pos) { Filerange match_word = text_object_word(txt, match_pos); if (text_range_size(&match_word) == len) return match_word; pos = match_pos; } else { return text_range_empty(); } } }
static const char *cursors_select(Vis *vis, const char *keys, const Arg *arg) { Text *txt = vis_text(vis); View *view = vis_view(vis); for (Cursor *cursor = view_cursors(view); cursor; cursor = view_cursors_next(cursor)) { Filerange sel = view_cursors_selection_get(cursor); Filerange word = text_object_word(txt, view_cursors_pos(cursor)); if (!text_range_valid(&sel) && text_range_valid(&word)) { view_cursors_selection_set(cursor, &word); view_cursors_to(cursor, text_char_prev(txt, word.end)); } } vis_mode_switch(vis, VIS_MODE_VISUAL); return keys; }