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);
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);
}
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;
}
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;
}
}
/* UI Callbacks
*****************************************************************************/
+static void delete(void) {
+ view_delete(currview());
+}
+
static void cursor_up(void) {
view_byline(currview(), -1);
}
/* Keyboard Bindings
*****************************************************************************/
static KeyBinding Insert[] = {
+ { KEY_DELETE, delete },
{ KEY_UP, cursor_up },
{ KEY_DOWN, cursor_dn },
{ KEY_LEFT, cursor_left },
//{ KEY_CTRL_V, paste },
//{ KEY_HOME, cursor_bol },
//{ KEY_END, cursor_eol },
- //{ KEY_DELETE, delete },
//{ KEY_BACKSPACE, backspace },
{ 0, NULL }
};