buf->selection = (Sel){ .beg = 0, .end = buf_end(buf) };
}
+static bool selquote(Buf* buf, Rune c) {
+ Rune curr = buf_getc(buf);
+ size_t nextoff = buf_byrune(buf, buf->selection.end, RIGHT);
+ Rune prev = buf_getrat(buf, buf_byrune(buf, buf->selection.end, LEFT));
+ Rune next = buf_getrat(buf, buf_byrune(buf, buf->selection.end, RIGHT));
+ if (prev == c || curr == c) {
+ size_t bend = buf_end(buf);
+ buf->selection.beg = buf->selection.end = (prev == c ? buf->selection.end : nextoff);
+ size_t selend = buf->selection.end;
+ for (; selend < bend && buf_getrat(buf, selend) != c; selend = buf_byrune(buf, selend, RIGHT));
+ if (buf_getrat(buf, selend) == c)
+ buf->selection.end = selend;
+ return true;
+ } else if (next == c) {
+ buf->selection.beg = buf->selection.end;
+ buf->selection.end = nextoff;
+ size_t selbeg = buf->selection.beg;
+ for (; selbeg > 0 && buf_getrat(buf, selbeg) != c; selbeg = buf_byrune(buf, selbeg, LEFT));
+ if (buf_getrat(buf, selbeg) == c)
+ buf->selection.beg = buf_byrune(buf, selbeg, RIGHT);
+ return true;
+ }
+ return false;
+}
+
void buf_selctx(Buf* buf, bool (*isword)(Rune)) {
size_t bol = buf_bol(buf, buf->selection.end);
- Rune r = buf_getc(buf);
- if (r == '(' || r == ')')
+ Rune curr = buf_getc(buf);
+ if (curr == '(' || curr == ')')
selblock(buf, '(', ')');
- else if (r == '[' || r == ']')
+ else if (curr == '[' || curr == ']')
selblock(buf, '[', ']');
- else if (r == '{' || r == '}')
+ else if (curr == '{' || curr == '}')
selblock(buf, '{', '}');
- else if (r == '<' || r == '>')
+ else if (curr == '<' || curr == '>')
selblock(buf, '<', '>');
- else if (buf->selection.end == bol || r == '\n')
+ else if (selquote(buf, '"') || selquote(buf, '`') || selquote(buf, '\''))
+ ; /* condition performs selection */
+ else if (buf->selection.end == bol || curr == '\n')
selline(buf);
- else if (risword(r))
+ else if (risword(curr))
buf_selword(buf, isword);
else
buf_selword(buf, risbigword);