]> git.mdlowis.com Git - projs/tide.git/commitdiff
reworked context selection code and cleaned up word handling
authorMichael D. Lowis <mike@mdlowis.com>
Wed, 4 Apr 2018 00:53:28 +0000 (20:53 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Wed, 4 Apr 2018 00:53:28 +0000 (20:53 -0400)
inc/edit.h
lib/buf.c
lib/view.c
testdocs/matches.txt [new file with mode: 0644]
tide.c

index c0643fb2a17cf5636b800f652282d636c54b478d..8736aac6ee05c1ae84aee0fd66351121a00e3eb6 100644 (file)
@@ -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);
index 0aa20fd9d24e8fe521b2cb7cb4d84843d79302f2..d201566846f13de9bde694da3ea72389817ca052 100644 (file)
--- 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
index 059d69ba537a5c5d444472a526d395b6d476c7de..13110ef8bb0f70b01fd1ba5bf98dd042c1624bf4 100644 (file)
@@ -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 (file)
index 0000000..c9f7fe6
--- /dev/null
@@ -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 6e3f638d3a1744f1786a012c8e65d274d53c29b1..4ef24339394c7bcc1abaff491aa24fe842df0bc0 100644 (file)
--- 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));
 }