tAllow deletion across lines - ve - a minimal text editor (work in progress)
 (HTM) git clone git://src.adamsgaard.dk/ve
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5a34030990e5e1ea2cd8c30403c22c85c4ea088c
 (DIR) parent 2485a4471857acd56602b5069e6f08f388bed7aa
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Tue,  6 Aug 2019 18:54:34 +0200
       
       Allow deletion across lines
       
       Diffstat:
         M edit.c                              |       8 +++++++-
         M input.c                             |       3 +++
         M row.c                               |      30 ++++++++++++++++++++++++++++++
         M row.h                               |       2 ++
       
       4 files changed, 42 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/edit.c b/edit.c
       t@@ -13,12 +13,18 @@ editor_insert_char(int c)
        void
        editor_delete_char_left()
        {
       -        if (E.cursor_y == E.num_rows)
       +        if (E.cursor_y == E.num_rows || (E.cursor_x == 0 && E.cursor_y == 0))
                        return;
                eRow *row = &E.row[E.cursor_y];
                if (E.cursor_x > 0) {
                        editor_row_delete_char(row, E.cursor_x - 1);
                        E.cursor_x--;
       +        } else {
       +                E.cursor_x = E.row[E.cursor_y - 1].size;
       +                editor_row_append_string(&E.row[E.cursor_y - 1],
       +                                         row->chars, row->size);
       +                editor_row_delete(E.cursor_y);
       +                E.cursor_y--;
                }
        }
        
 (DIR) diff --git a/input.c b/input.c
       t@@ -133,6 +133,9 @@ editor_process_keypress()
                                case 'x':
                                        editor_delete_char_right();
                                        break;
       +                        case 'd':
       +                                editor_row_delete(E.cursor_y);
       +                                break;
        
                                case 'I':
                                        E.cursor_x = 0;
 (DIR) diff --git a/row.c b/row.c
       t@@ -82,6 +82,18 @@ editor_row_insert_char(eRow *row, int i, int c)
                E.file_changed = 1;
        }
        
       +/* append a string to the end of a row */
       +void
       +editor_row_append_string(eRow *row, char *s, size_t len)
       +{
       +        row->chars = realloc(row->chars, row->size + len + 1);
       +        memcpy(&row->chars[row->size], s, len);
       +        row->size += len;
       +        row->chars[row->size] = '\0';
       +        editor_update_row(row);
       +        E.file_changed = 1;
       +}
       +
        void
        editor_row_delete_char(eRow *row, int i)
        {
       t@@ -92,3 +104,21 @@ editor_row_delete_char(eRow *row, int i)
                editor_update_row(row);
                E.file_changed = 1;
        }
       +
       +void
       +editor_row_free(eRow *row)
       +{
       +        free(row->rchars);
       +        free(row->chars);
       +}
       +
       +void
       +editor_row_delete(int i)
       +{
       +        if (i<0 || i >= E.num_rows)
       +                return;
       +        editor_row_free(&E.row[i]);
       +        memmove(&E.row[i], &E.row[i+1], sizeof(eRow)*(E.num_rows-i-1));
       +        E.num_rows--;
       +        E.file_changed = 1;
       +}
 (DIR) diff --git a/row.h b/row.h
       t@@ -5,7 +5,9 @@
        
        int editor_row_cursor_x_to_rx(eRow *row, int cursor_x);
        void editor_append_row(char *s, size_t len);
       +void editor_row_append_string(eRow *row, char *s, size_t len);
        void editor_row_insert_char(eRow *row, int i, int c);
        void editor_row_delete_char(eRow *row, int i);
       +void editor_row_delete(int i);
        
        #endif