From d46913ab765545798e838a98a2a2334d285ebd5b Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 3 Apr 2018 20:53:28 -0400 Subject: [PATCH] reworked context selection code and cleaned up word handling --- inc/edit.h | 10 ++++++---- lib/buf.c | 30 ++++++++++++++---------------- lib/view.c | 44 +++++++++++++++++++------------------------- testdocs/matches.txt | 8 ++++++++ tide.c | 1 - 5 files changed, 47 insertions(+), 46 deletions(-) create mode 100644 testdocs/matches.txt diff --git a/inc/edit.h b/inc/edit.h index c0643fb..8736aac 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -62,10 +62,12 @@ size_t buf_bol(Buf* buf, size_t pos); size_t buf_eol(Buf* buf, size_t pos); size_t buf_bow(Buf* buf, size_t pos); size_t buf_eow(Buf* buf, size_t pos); -size_t buf_lscan(Buf* buf, size_t pos, Rune r); -size_t buf_rscan(Buf* buf, size_t pos, Rune r); -void buf_getword(Buf* buf, bool (*isword)(Rune), Sel* sel); -void buf_getblock(Buf* buf, Rune beg, Rune end, Sel* sel); + +void buf_selline(Buf* buf, Sel* sel); +void buf_selword(Buf* buf, bool (*isword)(Rune), Sel* sel); +void buf_selblock(Buf* buf, Rune beg, Rune end, Sel* sel); +void buf_selall(Buf* buf, Sel* sel); + size_t buf_byrune(Buf* buf, size_t pos, int count); size_t buf_byword(Buf* buf, size_t pos, int count); size_t buf_byline(Buf* buf, size_t pos, int count); diff --git a/lib/buf.c b/lib/buf.c index 0aa20fd..d201566 100644 --- a/lib/buf.c +++ b/lib/buf.c @@ -271,29 +271,21 @@ size_t buf_bow(Buf* buf, size_t off) { size_t buf_eow(Buf* buf, size_t off) { for (; risword(buf_getrat(buf, off)); off++); - return off-1; -} - -size_t buf_lscan(Buf* buf, size_t pos, Rune r) { - size_t off = pos; - for (; (off > 0) && (r != buf_getrat(buf, off)); off--); - return (buf_getrat(buf, off) == r ? off : pos); + return off; } -size_t buf_rscan(Buf* buf, size_t pos, Rune r) { - size_t off = pos; - size_t end = buf_end(buf); - for (; (off < end) && (r != buf_getrat(buf, off)); off++); - return (buf_getrat(buf, off) == r ? off : pos); +void buf_selline(Buf* buf, Sel* sel) { + sel->beg = buf_bol(buf, sel->end); + sel->end = buf_eol(buf, sel->end); + sel->end = buf_byrune(buf, sel->end, RIGHT); } -void buf_getword(Buf* buf, bool (*isword)(Rune), Sel* sel) { +void buf_selword(Buf* buf, bool (*isword)(Rune), Sel* sel) { for (; isword(buf_getrat(buf, sel->beg-1)); sel->beg--); for (; isword(buf_getrat(buf, sel->end)); sel->end++); - sel->end--; } -void buf_getblock(Buf* buf, Rune first, Rune last, Sel* sel) { +void buf_selblock(Buf* buf, Rune first, Rune last, Sel* sel) { int balance = 0, dir; size_t beg, end = sel->end; @@ -322,10 +314,16 @@ void buf_getblock(Buf* buf, Rune first, Rune last, Sel* sel) { if (balance != 0) return; /* update the passed in selection */ - if (end > beg) beg++, end--; + if (end > beg) beg++; else end++; sel->beg = beg, sel->end = end; } +void buf_selall(Buf* buf, Sel* sel) { + *sel = (Sel){ .beg = 0, .end = buf_end(buf) }; + +} + + size_t buf_byrune(Buf* buf, size_t pos, int count) { int move = (count < 0 ? -1 : 1); count *= move; // remove the sign if there is one diff --git a/lib/view.c b/lib/view.c index 059d69b..13110ef 100644 --- a/lib/view.c +++ b/lib/view.c @@ -117,8 +117,7 @@ void view_setcursor(View* view, size_t row, size_t col, bool extsel) { void view_selword(View* view, size_t row, size_t col) { if (row != SIZE_MAX && col != SIZE_MAX) view_setcursor(view, row, col, false); - buf_getword(&(view->buffer), risbigword, getsel(view)); - getsel(view)->end++; + buf_selword(&(view->buffer), risbigword, getsel(view)); } void view_selprev(View* view) { @@ -142,12 +141,10 @@ char* view_fetch(View* view, size_t row, size_t col, bool (*isword)(Rune)) { size_t off = getoffset(view, row, col); if (off != SIZE_MAX) { Sel sel = { .beg = off, .end = off }; - if (buf_insel(&(view->buffer), NULL, off)) { + if (buf_insel(&(view->buffer), NULL, off)) sel = *(getsel(view)); - } else { - buf_getword(&(view->buffer), isword, &sel); - sel.end++; - } + else + buf_selword(&(view->buffer), isword, &sel); str = view_getstr(view, &sel); } return str; @@ -280,12 +277,12 @@ void view_scrollto(View* view, size_t csr) { } void view_selectall(View* view) { - *(getsel(view)) = (Sel){ .beg = 0, .end = buf_end(&(view->buffer)) }; + buf_selall(&(view->buffer), getsel(view)); view->sync_needed = true; } void view_selectobj(View* view, bool (*istype)(Rune)) { - buf_getword(&(view->buffer), istype, getsel(view)); + buf_selword(&(view->buffer), istype, getsel(view)); view->sync_needed = true; } @@ -310,7 +307,7 @@ static void move_to(View* view, bool extsel, size_t off) { getsel(view)->end = (off > buf_end(buf) ? buf_end(buf) : off); if (!extsel) getsel(view)->beg = getsel(view)->end; - buf_getcol(&(view->buffer), getsel(view)); + buf_getcol(buf, getsel(view)); view->sync_needed = true; } @@ -318,21 +315,18 @@ static void select_context(View* view, bool (*isword)(Rune), Sel* sel) { Buf* buf = &(view->buffer); size_t bol = buf_bol(buf, sel->end); Rune r = buf_getc(buf, sel); - if (r == '(' || r == ')') { - buf_getblock(buf, '(', ')', sel); - } else if (r == '[' || r == ']') { - buf_getblock(buf, '[', ']', sel); - } else if (r == '{' || r == '}') { - buf_getblock(buf, '{', '}', sel); - } else if (sel->end == bol || r == '\n') { - sel->beg = bol; - sel->end = buf_eol(buf, sel->end); - } else if (risword(r)) { - buf_getword(buf, isword, sel); - } else { - buf_getword(buf, risbigword, sel); - } - sel->end = buf_byrune(&(view->buffer), sel->end, RIGHT); + if (r == '(' || r == ')') + buf_selblock(buf, '(', ')', sel); + else if (r == '[' || r == ']') + buf_selblock(buf, '[', ']', sel); + else if (r == '{' || r == '}') + buf_selblock(buf, '{', '}', sel); + else if (sel->end == bol || r == '\n') + buf_selline(buf, sel); + else if (risword(r)) + buf_selword(buf, isword, sel); + else + buf_selword(buf, risbigword, sel); buf_getcol(&(view->buffer), getsel(view)); } diff --git a/testdocs/matches.txt b/testdocs/matches.txt new file mode 100644 index 0000000..c9f7fe6 --- /dev/null +++ b/testdocs/matches.txt @@ -0,0 +1,8 @@ +Matching groups: + ( ( parentheses ) ) + [ [ brackets ] ] + { { braces } } + +What's the word? BIRD! bird is the word. + + /foo/bar/baz/boo diff --git a/tide.c b/tide.c index 6e3f638..4ef2433 100644 --- a/tide.c +++ b/tide.c @@ -340,7 +340,6 @@ static void pick_ctag(char* arg) { static void complete(char* arg) { View* view = win_view(FOCUSED); view_selectobj(view, risword); - view_byrune(view, RIGHT, true); cmd_execwitharg(CMD_COMPLETE, view_getstr(view, NULL)); } -- 2.52.0