]> git.mdlowis.com Git - projs/tide.git/commitdiff
implemented expected behavior for backspace, delete, and insert with selection
authorMichael D. Lowis <mike@mdlowis.com>
Thu, 17 Nov 2016 01:19:13 +0000 (20:19 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Thu, 17 Nov 2016 01:19:13 +0000 (20:19 -0500)
inc/edit.h
libedit/view.c
xedit [deleted file]
xedit.c

index 0e15682496e750898f259946c6f85dfcf465d0eb..c7e1a5f9a0fed8c19f01f8dfac79913ec4f00045 100644 (file)
@@ -154,6 +154,7 @@ void view_byline(View* view, int move);
 void view_setcursor(View* view, size_t row, size_t col);
 void view_selext(View* view, size_t row, size_t col);
 void view_insert(View* view, Rune rune);
+void view_delete(View* view);
 
 //size_t view_getoff(View* view, size_t pos, size_t row, size_t col);
 //void view_getsize(View* view, size_t* nrows, size_t* ncols);
index b22d8091583d18d5684c4a74fa16bd83b84db470..8877a17c4878905f9ee60b18908b30e2d4df3907 100644 (file)
@@ -36,12 +36,21 @@ static size_t setcell(View* view, size_t row, size_t col, uint32_t attr, Rune r)
     return ncols;
 }
 
-static bool in_selection(Sel sel, size_t off) {
-    if (sel.end < sel.beg) {
-        size_t temp = sel.beg;
-        sel.beg = sel.end;
-        sel.end = temp;
+static void selswap(Sel* sel) {
+    if (sel->end < sel->beg) {
+        size_t temp = sel->beg;
+        sel->beg = sel->end;
+        sel->end = temp;
     }
+}
+
+static size_t num_selected(Sel sel) {
+    selswap(&sel);
+    return (sel.end - sel.beg);
+}
+
+static bool in_selection(Sel sel, size_t off) {
+    selswap(&sel);
     return (sel.beg <= off && off < sel.end);
 }
 
@@ -232,12 +241,16 @@ void view_selext(View* view, size_t row, size_t col) {
 
 void view_insert(View* view, Rune rune) {
     if (rune == '\b') {
-        if (view->selection.end > 0)
+        if (num_selected(view->selection))
+            view_delete(view);
+        else if (view->selection.end > 0)
             buf_del(&(view->buffer), --view->selection.end);
     } else {
         /* ignore non-printable control characters */
         if (!isspace(rune) && rune < 0x20)
             return;
+        if (num_selected(view->selection))
+            view_delete(view);
         buf_ins(&(view->buffer), view->selection.end++, rune);
     }
     view->selection.beg = view->selection.end;
@@ -246,11 +259,15 @@ void view_insert(View* view, Rune rune) {
 }
 
 void view_delete(View* view) {
-    //if (SelEnd == buf_end(&Buffer)) return;
-    //size_t n = SelEnd - SelBeg;
-    //for (size_t i = 0; i < n; i++)
-    //    buf_del(&Buffer, SelBeg);
-    //SelEnd = SelBeg;
-    //TargetCol = buf_getcol(&Buffer, SelEnd);
-    //view->sync_needed = true;
+    Sel sel = view->selection;
+    selswap(&sel);
+    size_t num = num_selected(view->selection);
+    if (num == 0)
+        buf_del(&(view->buffer), sel.beg);
+    else
+        for (size_t i = 0; i < num; i++)
+            buf_del(&(view->buffer), sel.beg);
+    view->selection.beg = view->selection.end = sel.beg;
+    view->selection.col = buf_getcol(&(view->buffer), view->selection.end);
+    view->sync_needed = true;
 }
diff --git a/xedit b/xedit
deleted file mode 100755 (executable)
index 1fcba5c..0000000
Binary files a/xedit and /dev/null differ
diff --git a/xedit.c b/xedit.c
index 9a4339020272b21d11dded75610d91af4b9fe41c..da1689a26ba6cd3516cef7b4c01b2a383e540e39 100644 (file)
--- a/xedit.c
+++ b/xedit.c
@@ -56,6 +56,10 @@ static enum RegionId getregion(size_t x, size_t y) {
 }
 /* UI Callbacks
  *****************************************************************************/
+static void delete(void) {
+    view_delete(currview());
+}
+
 static void cursor_up(void) {
     view_byline(currview(), -1);
 }
@@ -172,6 +176,7 @@ static void mouse_handler(MouseAct act, MouseBtn btn, int x, int y) {
 /* Keyboard Bindings
  *****************************************************************************/
 static KeyBinding Insert[] = {
+    { KEY_DELETE,    delete        },
     { KEY_UP,        cursor_up     },
     { KEY_DOWN,      cursor_dn     },
     { KEY_LEFT,      cursor_left   },
@@ -186,7 +191,6 @@ static KeyBinding Insert[] = {
     //{ KEY_CTRL_V,    paste         },
     //{ KEY_HOME,      cursor_bol    },
     //{ KEY_END,       cursor_eol    },
-    //{ KEY_DELETE,    delete        },
     //{ KEY_BACKSPACE, backspace     },
     { 0,             NULL          }
 };