URI: 
       tRename some functions - ledit - Text editor (WIP)
  HTML git clone git://lumidify.org/ledit.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit f0abd591c8ef4c52c3649aba5b68d460a1c78f47
   DIR parent 9bdc877acf81ae270c68cacad2e70b9860f0832e
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Mon, 29 Nov 2021 09:19:33 +0100
       
       Rename some functions
       
       But it's still very inconsistent.
       
       Diffstat:
         M buffer.c                            |     180 ++++++++++++++++----------------
         M buffer.h                            |      88 ++++++++++++++++----------------
         M keys_basic.c                        |     134 ++++++++++++++++----------------
         M keys_command.c                      |      44 ++++++++++++++++----------------
         M keys_command.h                      |       2 +-
         M ledit.c                             |      31 +++++++++++++++++--------------
         M search.c                            |      40 ++++++++++++++++----------------
         M search.h                            |       8 ++++----
         M theme.c                             |       4 ++--
         M theme.h                             |       4 ++--
         M undo.c                              |      34 ++++++++++++++++----------------
         M undo.h                              |      26 +++++++++++++-------------
         M util.c                              |       6 +++---
         M util.h                              |       6 +++---
         M view.c                              |     235 ++++++++++++++++---------------
         M window.c                            |     102 ++++++++++++++++----------------
         M window.h                            |      74 ++++++++++++++++----------------
       
       17 files changed, 511 insertions(+), 507 deletions(-)
       ---
   DIR diff --git a/buffer.c b/buffer.c
       t@@ -86,7 +86,7 @@ marklist_destroy(ledit_buffer_marklist *marklist) {
        }
        
        void
       -ledit_buffer_insert_mark(ledit_buffer *buffer, char *mark, size_t len, size_t line, size_t byte) {
       +buffer_insert_mark(ledit_buffer *buffer, char *mark, size_t len, size_t line, size_t byte) {
                ledit_buffer_marklist *marklist = buffer->marklist;
                for (size_t i = 0; i < marklist->len; i++) {
                        if (!strncmp(mark, marklist->marks[i].text, len)) {
       t@@ -118,10 +118,10 @@ marklist_create(void) {
        }
        
        ledit_buffer *
       -ledit_buffer_create(ledit_common *common) {
       +buffer_create(ledit_common *common) {
                ledit_buffer *buffer = ledit_malloc(sizeof(ledit_buffer));
                buffer->common = common;
       -        buffer->undo = ledit_undo_stack_create();
       +        buffer->undo = undo_stack_create();
                buffer->marklist = marklist_create();
        
                buffer->filename = NULL;
       t@@ -137,7 +137,7 @@ ledit_buffer_create(ledit_common *common) {
                resize_and_move_line_gap(buffer, 1, 0);
                buffer->lines_num++;
                buffer->lines_gap++;
       -        ledit_line *ll = ledit_buffer_get_line(buffer, 0);
       +        ledit_line *ll = buffer_get_line(buffer, 0);
                init_line(buffer, ll);
        
                return buffer;
       t@@ -146,11 +146,11 @@ ledit_buffer_create(ledit_common *common) {
        static void
        set_view_hard_line_text(ledit_buffer *buffer, ledit_view *view) {
                char *text = buffer->hard_line_based ? "|HL" : "|SL";
       -        ledit_window_set_mode_extra_text(view->window, text);
       +        window_set_mode_extra_text(view->window, text);
        }
        
        void
       -ledit_buffer_set_hard_line_based(ledit_buffer *buffer, int hl) {
       +buffer_set_hard_line_based(ledit_buffer *buffer, int hl) {
                buffer->hard_line_based = hl;
                for (size_t i = 0; i < buffer->views_num; i++) {
                        set_view_hard_line_text(buffer, buffer->views[i]);
       t@@ -158,7 +158,7 @@ ledit_buffer_set_hard_line_based(ledit_buffer *buffer, int hl) {
        }
        
        void
       -ledit_buffer_add_view(ledit_buffer *buffer, ledit_theme *theme, enum ledit_mode mode, size_t line, size_t pos) {
       +buffer_add_view(ledit_buffer *buffer, ledit_theme *theme, enum ledit_mode mode, size_t line, size_t pos) {
                size_t new_num = buffer->views_num + 1;
                if (new_num <= buffer->views_num)
                        err_overflow();
       t@@ -170,7 +170,7 @@ ledit_buffer_add_view(ledit_buffer *buffer, ledit_theme *theme, enum ledit_mode 
        
        /* FIXME: error checking */
        void
       -ledit_buffer_remove_view(ledit_buffer *buffer, ledit_view *view) {
       +buffer_remove_view(ledit_buffer *buffer, ledit_view *view) {
                size_t i = 0;
                int found = 0;
                for (; i < buffer->views_num; i++) {
       t@@ -191,7 +191,7 @@ ledit_buffer_remove_view(ledit_buffer *buffer, ledit_view *view) {
        }
        
        void
       -ledit_buffer_recalc_all_views_from_line(ledit_buffer *buffer, size_t line) {
       +buffer_recalc_all_views_from_line(ledit_buffer *buffer, size_t line) {
                for (size_t i = 0; i < buffer->views_num; i++) {
                        view_recalc_from_line(buffer->views[i], line);
                }
       t@@ -200,7 +200,7 @@ ledit_buffer_recalc_all_views_from_line(ledit_buffer *buffer, size_t line) {
        /* FIXME: don't generate extra blank line at end! */
        /* WARNING: errstr must be copied as soon as possible! */
        int
       -ledit_buffer_load_file(ledit_buffer *buffer, char *filename, size_t line, char **errstr) {
       +buffer_load_file(ledit_buffer *buffer, char *filename, size_t line, char **errstr) {
                long len;
                int off = 0;
                ledit_line *ll;
       t@@ -214,7 +214,7 @@ ledit_buffer_load_file(ledit_buffer *buffer, char *filename, size_t line, char *
                if (len < 0) goto errorclose;
                if (fseek(file, 0, SEEK_SET)) goto errorclose;
        
       -        ll = ledit_buffer_get_line(buffer, line);
       +        ll = buffer_get_line(buffer, line);
                file_contents = ledit_malloc(len + 2);
                /* mimic nvi (or at least the openbsd version) - if the line
                   is empty, insert directly, otherwise insert after the line */
       t@@ -233,7 +233,7 @@ ledit_buffer_load_file(ledit_buffer *buffer, char *filename, size_t line, char *
                }
                if (fclose(file)) goto error;
        
       -        ledit_buffer_insert_text_with_newlines(
       +        buffer_insert_text_with_newlines(
                    buffer, line, ll->len, file_contents, len + off, NULL, NULL
                );
                free(file_contents);
       t@@ -251,15 +251,15 @@ errorclose:
        
        /* FIXME: allow to write only certain lines */
        int
       -ledit_buffer_write_to_file(ledit_buffer *buffer, char *filename, char **errstr) {
       +buffer_write_to_file(ledit_buffer *buffer, char *filename, char **errstr) {
                FILE *file;
                ledit_line *ll;
                file = fopen(filename, "w");
                if (!file) goto error;
                clearerr(file);
                for (size_t i = 0; i < buffer->lines_num; i++) {
       -                ll = ledit_buffer_get_line(buffer, i);
       -                ledit_buffer_normalize_line(ll);
       +                ll = buffer_get_line(buffer, i);
       +                buffer_normalize_line(ll);
                        if (fprintf(file, "%s\n", ll->text) < 0) goto errorclose;
                }
                if (fclose(file)) goto error;
       t@@ -276,13 +276,13 @@ errorclose:
        }
        
        void
       -ledit_buffer_destroy(ledit_buffer *buffer) {
       +buffer_destroy(ledit_buffer *buffer) {
                ledit_line *l;
                for (size_t i = 0; i < buffer->lines_num; i++) {
       -                l = ledit_buffer_get_line(buffer, i);
       +                l = buffer_get_line(buffer, i);
                        free(l->text);
                }
       -        ledit_undo_stack_destroy(buffer->undo);
       +        undo_stack_destroy(buffer->undo);
                free(buffer->lines);
                if (buffer->filename)
                        free(buffer->filename);
       t@@ -291,7 +291,7 @@ ledit_buffer_destroy(ledit_buffer *buffer) {
        }
        
        void
       -ledit_buffer_normalize_line(ledit_line *line) {
       +buffer_normalize_line(ledit_line *line) {
                if (line->gap < line->len) {
                        memmove(
                            line->text + line->gap,
       t@@ -308,35 +308,35 @@ ledit_buffer_normalize_line(ledit_line *line) {
        /* FIXME: To simplify this a bit, maybe just copy text to txtbuf first and
           then insert it in one go instead of having this complex logic */
        void
       -ledit_buffer_insert_text_from_line(
       +buffer_insert_text_from_line(
            ledit_buffer *buffer,
            size_t dst_line, size_t dst_index,
            size_t src_line, size_t src_index, size_t src_len,
            txtbuf *text_ret) {
       -        ledit_buffer_insert_text_from_line_base(
       +        buffer_insert_text_from_line_base(
                    buffer, dst_line, dst_index, src_line, src_index, src_len, text_ret
                );
       -        ledit_buffer_recalc_line(buffer, dst_line);
       +        buffer_recalc_line(buffer, dst_line);
        }
        
        /* FIXME: check if there can be bugs when a newline is inserted in some way
           other than pasting or pressing enter */
        
        void
       -ledit_buffer_insert_text_from_line_base(
       +buffer_insert_text_from_line_base(
            ledit_buffer *buffer,
            size_t dst_line, size_t dst_index,
            size_t src_line, size_t src_index, size_t src_len,
            txtbuf *text_ret) {
                assert(dst_line != src_line);
       -        ledit_line *ll = ledit_buffer_get_line(buffer, src_line);
       +        ledit_line *ll = buffer_get_line(buffer, src_line);
                if (text_ret != NULL) {
                        txtbuf_grow(text_ret, src_len);
                        text_ret->len = src_len;
                }
                if (src_index >= ll->gap) {
                        /* all text to insert is after gap */
       -                ledit_buffer_insert_text_base(
       +                buffer_insert_text_base(
                            buffer, dst_line, dst_index,
                            ll->text + src_index + ll->cap - ll->len, src_len
                        );
       t@@ -349,7 +349,7 @@ ledit_buffer_insert_text_from_line_base(
                        }
                } else if (ll->gap - src_index >= src_len) {
                        /* all text to insert is before gap */
       -                ledit_buffer_insert_text_base(
       +                buffer_insert_text_base(
                            buffer, dst_line, dst_index,
                            ll->text + src_index, src_len
                        );
       t@@ -362,12 +362,12 @@ ledit_buffer_insert_text_from_line_base(
                        }
                } else {
                        /* insert part of text before gap */
       -                ledit_buffer_insert_text_base(
       +                buffer_insert_text_base(
                            buffer, dst_line, dst_index,
                            ll->text + src_index, ll->gap - src_index
                        );
                        /* insert part of text after gap */
       -                ledit_buffer_insert_text_base(
       +                buffer_insert_text_base(
                            buffer, dst_line, dst_index + ll->gap - src_index,
                            ll->text + ll->gap + ll->cap - ll->len,
                            src_len - ll->gap + src_index
       t@@ -436,14 +436,14 @@ resize_and_move_line_gap(ledit_buffer *buffer, size_t min_size, size_t index) {
        }
        
        void
       -ledit_buffer_insert_text(ledit_buffer *buffer, size_t line_index, size_t index, char *text, size_t len) {
       -        ledit_buffer_insert_text_base(buffer, line_index, index, text, len);
       -        ledit_buffer_recalc_line(buffer, line_index);
       +buffer_insert_text(ledit_buffer *buffer, size_t line_index, size_t index, char *text, size_t len) {
       +        buffer_insert_text_base(buffer, line_index, index, text, len);
       +        buffer_recalc_line(buffer, line_index);
        }
        
        void
       -ledit_buffer_insert_text_base(ledit_buffer *buffer, size_t line_index, size_t index, char *text, size_t len) {
       -        ledit_line *line = ledit_buffer_get_line(buffer, line_index);
       +buffer_insert_text_base(ledit_buffer *buffer, size_t line_index, size_t index, char *text, size_t len) {
       +        ledit_line *line = buffer_get_line(buffer, line_index);
                /* \0 is not included in line->len */
                /* FIXME: this if should be redundant now because resize_and_move... includes a check */
                if (line->len + len + 1 > line->cap || line->text == NULL)
       t@@ -471,27 +471,27 @@ strchr_len(char *text, char c, size_t len) {
        
        /* FIXME: make these functions that call recalc* also be final as described above */
        void
       -ledit_buffer_insert_text_with_newlines(
       +buffer_insert_text_with_newlines(
            ledit_buffer *buffer,
            size_t line_index, size_t index,
            char *text, size_t len,
            size_t *end_line_ret, size_t *end_byte_ret) {
                size_t end;
       -        ledit_buffer_insert_text_with_newlines_base(
       +        buffer_insert_text_with_newlines_base(
                    buffer, line_index, index, text, len,
                    &end, end_byte_ret
                );
                if (end_line_ret)
                        *end_line_ret = end;
                if (line_index == end)
       -                ledit_buffer_recalc_line(buffer, line_index);
       +                buffer_recalc_line(buffer, line_index);
                else
       -                ledit_buffer_recalc_from_line(buffer, line_index);
       +                buffer_recalc_from_line(buffer, line_index);
        }
        
        /* FIXME: also look for \r */
        void
       -ledit_buffer_insert_text_with_newlines_base(
       +buffer_insert_text_with_newlines_base(
            ledit_buffer *buffer,
            size_t line_index, size_t index,
            char *text, size_t len,
       t@@ -504,15 +504,15 @@ ledit_buffer_insert_text_with_newlines_base(
                while ((cur = strchr_len(last, '\n', rem_len)) != NULL) {
                        /* FIXME: this is probably inefficient, but I don't have time to
                           think about it right now */
       -                ledit_buffer_append_line_base(buffer, cur_line, cur_index, 1);
       -                ledit_buffer_insert_text_base(buffer, cur_line, cur_index, last, cur - last);
       +                buffer_append_line_base(buffer, cur_line, cur_index, 1);
       +                buffer_insert_text_base(buffer, cur_line, cur_index, last, cur - last);
                        cur_index = 0;
                        cur_line++;
                        rem_len -= cur - last + 1;
                        last = cur + 1;
                }
                /* FIXME: check how legal this casting between pointers and ints is */
       -        ledit_buffer_insert_text_base(buffer, cur_line, cur_index, last, text + len - last);
       +        buffer_insert_text_base(buffer, cur_line, cur_index, last, text + len - last);
                if (end_line_ret)
                        *end_line_ret = cur_line;
                if (end_byte_ret)
       t@@ -530,14 +530,14 @@ init_line(ledit_buffer *buffer, ledit_line *line) {
        }
        
        void
       -ledit_buffer_append_line(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text) {
       -        ledit_buffer_append_line_base(buffer, line_index, text_index, break_text);
       -        ledit_buffer_recalc_from_line(buffer, line_index);
       +buffer_append_line(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text) {
       +        buffer_append_line_base(buffer, line_index, text_index, break_text);
       +        buffer_recalc_from_line(buffer, line_index);
        }
        
        /* FIXME: error checking (index out of bounds, etc.) */
        void
       -ledit_buffer_append_line_base(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text) {
       +buffer_append_line_base(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text) {
                size_t new_len = buffer->lines_num + 1;
                if (new_len <= buffer->lines_num)
                        err_overflow();
       t@@ -547,18 +547,18 @@ ledit_buffer_append_line_base(ledit_buffer *buffer, size_t line_index, size_t te
                resize_and_move_line_gap(buffer, new_len, insert_index);
                buffer->lines_num++;
                buffer->lines_gap++;
       -        ledit_line *new_l = ledit_buffer_get_line(buffer, line_index + 1);
       +        ledit_line *new_l = buffer_get_line(buffer, line_index + 1);
                init_line(buffer, new_l);
                for (size_t i = 0; i < buffer->views_num; i++) {
                        view_notify_append_line(buffer->views[i], line_index);
                }
                if (break_text) {
       -                ledit_line *l = ledit_buffer_get_line(buffer, line_index);
       -                ledit_buffer_insert_text_from_line_base(
       +                ledit_line *l = buffer_get_line(buffer, line_index);
       +                buffer_insert_text_from_line_base(
                            buffer, line_index + 1, 0,
                            line_index, text_index, l->len - text_index, NULL
                        );
       -                ledit_buffer_delete_line_section_base(
       +                buffer_delete_line_section_base(
                            buffer, line_index,
                            text_index, l->len - text_index
                        );
       t@@ -567,20 +567,20 @@ ledit_buffer_append_line_base(ledit_buffer *buffer, size_t line_index, size_t te
        
        /* FIXME: set offset to 0 when recalculating first line? */
        void
       -ledit_buffer_delete_line_entries(ledit_buffer *buffer, size_t index1, size_t index2) {
       -        ledit_buffer_delete_line_entries_base(buffer, index1, index2);
       -        ledit_buffer_recalc_from_line(buffer, index1 > 0 ? index1 - 1 : 0);
       +buffer_delete_line_entries(ledit_buffer *buffer, size_t index1, size_t index2) {
       +        buffer_delete_line_entries_base(buffer, index1, index2);
       +        buffer_recalc_from_line(buffer, index1 > 0 ? index1 - 1 : 0);
        }
        
       -/* IMPORTANT: ledit_buffer_recalc_from_line needs to be called sometime after this! */
       +/* IMPORTANT: buffer_recalc_from_line needs to be called sometime after this! */
        void
       -ledit_buffer_delete_line_entries_base(ledit_buffer *buffer, size_t index1, size_t index2) {
       +buffer_delete_line_entries_base(ledit_buffer *buffer, size_t index1, size_t index2) {
                ledit_line *l;
                assert (index2 >= index1);
                /* it isn't allowed to delete all lines */
                assert(index2 - index1 != buffer->lines_num);
                for (size_t i = index1; i <= index2; i++) {
       -                l = ledit_buffer_get_line(buffer, i);
       +                l = buffer_get_line(buffer, i);
                        free(l->text);
                }
                move_line_gap(buffer, index1);
       t@@ -591,17 +591,17 @@ ledit_buffer_delete_line_entries_base(ledit_buffer *buffer, size_t index1, size_
        }
        
        void
       -ledit_buffer_delete_line_entry(ledit_buffer *buffer, size_t index) {
       -        ledit_buffer_delete_line_entries(buffer, index, index);
       +buffer_delete_line_entry(ledit_buffer *buffer, size_t index) {
       +        buffer_delete_line_entries(buffer, index, index);
        }
        
        void
       -ledit_buffer_delete_line_entry_base(ledit_buffer *buffer, size_t index) {
       -        ledit_buffer_delete_line_entries_base(buffer, index, index);
       +buffer_delete_line_entry_base(ledit_buffer *buffer, size_t index) {
       +        buffer_delete_line_entries_base(buffer, index, index);
        }
        
        ledit_line *
       -ledit_buffer_get_line(ledit_buffer *buffer, size_t index) {
       +buffer_get_line(ledit_buffer *buffer, size_t index) {
                assert(index < buffer->lines_num);
                return index < buffer->lines_gap ?
                       &buffer->lines[index] :
       t@@ -609,38 +609,38 @@ ledit_buffer_get_line(ledit_buffer *buffer, size_t index) {
        }
        
        void
       -ledit_buffer_recalc_line(ledit_buffer *buffer, size_t line) {
       +buffer_recalc_line(ledit_buffer *buffer, size_t line) {
                for (size_t i = 0; i < buffer->views_num; i++) {
                        view_recalc_line(buffer->views[i], line);
                }
        }
        
        void
       -ledit_buffer_recalc_from_line(ledit_buffer *buffer, size_t line) {
       +buffer_recalc_from_line(ledit_buffer *buffer, size_t line) {
                for (size_t i = 0; i < buffer->views_num; i++) {
                        view_recalc_from_line(buffer->views[i], line);
                }
        }
        
        void
       -ledit_buffer_recalc_all_lines(ledit_buffer *buffer) {
       +buffer_recalc_all_lines(ledit_buffer *buffer) {
                for (size_t i = 0; i < buffer->views_num; i++) {
                        view_recalc_all_lines(buffer->views[i]);
                }
        }
        
        size_t
       -ledit_buffer_textlen(ledit_buffer *buffer, size_t line1, size_t byte1, size_t line2, size_t byte2) {
       +buffer_textlen(ledit_buffer *buffer, size_t line1, size_t byte1, size_t line2, size_t byte2) {
                assert(line1 < line2 || (line1 == line2 && byte1 <= byte2));
                size_t len = 0;
       -        ledit_line *ll = ledit_buffer_get_line(buffer, line1);
       +        ledit_line *ll = buffer_get_line(buffer, line1);
                if (line1 == line2) {
                        len = byte2 - byte1;
                } else {
                        /* + 1 for newline */
                        len = ll->len - byte1 + byte2 + 1;
                        for (size_t i = line1 + 1; i < line2; i++) {
       -                        ll = ledit_buffer_get_line(buffer, i);
       +                        ll = buffer_get_line(buffer, i);
                                len += ll->len + 1;
                        }
                }
       t@@ -654,11 +654,11 @@ ledit_buffer_textlen(ledit_buffer *buffer, size_t line1, size_t byte1, size_t li
              of pango's requirements). If a more efficient rendering
              backend is added, it would be good to optimize this, though. */
        void
       -ledit_buffer_copy_text(ledit_buffer *buffer, char *dst, int line1, int byte1, int line2, int byte2) {
       +buffer_copy_text(ledit_buffer *buffer, char *dst, int line1, int byte1, int line2, int byte2) {
                assert(line1 < line2 || (line1 == line2 && byte1 <= byte2));
       -        ledit_line *ll1 = ledit_buffer_get_line(buffer, line1);
       -        ledit_line *ll2 = ledit_buffer_get_line(buffer, line2);
       -        ledit_buffer_normalize_line(ll1);
       +        ledit_line *ll1 = buffer_get_line(buffer, line1);
       +        ledit_line *ll2 = buffer_get_line(buffer, line2);
       +        buffer_normalize_line(ll1);
                if (line1 == line2) {
                        memcpy(dst, ll1->text + byte1, byte2 - byte1);
                        dst[byte2 - byte1] = '\0';
       t@@ -669,14 +669,14 @@ ledit_buffer_copy_text(ledit_buffer *buffer, char *dst, int line1, int byte1, in
                        dst[cur_pos] = '\n';
                        cur_pos++;
                        for (int i = line1 + 1; i < line2; i++) {
       -                        ledit_line *ll = ledit_buffer_get_line(buffer, i);
       -                        ledit_buffer_normalize_line(ll);
       +                        ledit_line *ll = buffer_get_line(buffer, i);
       +                        buffer_normalize_line(ll);
                                memcpy(dst + cur_pos, ll->text, ll->len);
                                cur_pos += ll->len;
                                dst[cur_pos] = '\n';
                                cur_pos++;
                        }
       -                ledit_buffer_normalize_line(ll2);
       +                buffer_normalize_line(ll2);
                        memcpy(dst + cur_pos, ll2->text, byte2);
                        cur_pos += byte2;
                        dst[cur_pos] = '\0';
       t@@ -684,15 +684,15 @@ ledit_buffer_copy_text(ledit_buffer *buffer, char *dst, int line1, int byte1, in
        }
        
        void
       -ledit_buffer_copy_text_to_txtbuf(
       +buffer_copy_text_to_txtbuf(
            ledit_buffer *buffer,
            txtbuf *buf,
            size_t line1, size_t byte1,
            size_t line2, size_t byte2) {
                assert(line1 < line2 || (line1 == line2 && byte1 <= byte2));
       -        size_t len = ledit_buffer_textlen(buffer, line1, byte1, line2, byte2);
       +        size_t len = buffer_textlen(buffer, line1, byte1, line2, byte2);
                txtbuf_grow(buf, len + 1);
       -        ledit_buffer_copy_text(buffer, buf->text, line1, byte1, line2, byte2);
       +        buffer_copy_text(buffer, buf->text, line1, byte1, line2, byte2);
                buf->len = len;
        }
        
       t@@ -700,7 +700,7 @@ ledit_buffer_copy_text_to_txtbuf(
        #define LINE_CHAR(line, i) ((i) < (line)->gap ? (line)->text[i] : (line)->text[i + (line)->cap - (line)->len])
        
        size_t
       -ledit_line_prev_utf8(ledit_line *line, size_t index) {
       +line_prev_utf8(ledit_line *line, size_t index) {
                if (index <= 0)
                        return 0;
                size_t i = index - 1;
       t@@ -712,7 +712,7 @@ ledit_line_prev_utf8(ledit_line *line, size_t index) {
        }
        
        size_t
       -ledit_line_next_utf8(ledit_line *line, size_t index) {
       +line_next_utf8(ledit_line *line, size_t index) {
                if (index >= line->len)
                        return line->len;
                size_t i = index + 1;
       t@@ -731,14 +731,14 @@ line_byte_to_char(ledit_line *line, size_t byte) {
                size_t b = byte > line->len ? line->len : byte; /* maybe not necessary */
                while (i < b) {
                        c++;
       -                i = ledit_line_next_utf8(line, i);
       +                i = line_next_utf8(line, i);
                }
                return c;
        }
        
        void
       -ledit_buffer_delete_line_section_base(ledit_buffer *buffer, size_t line, size_t start, size_t length) {
       -        ledit_line *l = ledit_buffer_get_line(buffer, line);
       +buffer_delete_line_section_base(ledit_buffer *buffer, size_t line, size_t start, size_t length) {
       +        ledit_line *l = buffer_get_line(buffer, line);
                if (start <= l->gap && start + length >= l->gap) {
                        l->gap = start;
                } else if (start < l->gap && start + length < l->gap) {
       t@@ -762,23 +762,23 @@ ledit_buffer_delete_line_section_base(ledit_buffer *buffer, size_t line, size_t 
        }
        
        size_t
       -ledit_buffer_delete_unicode_char(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir) {
       -        size_t new_index = ledit_buffer_delete_unicode_char_base(buffer, line_index, byte_index, dir);
       -        ledit_buffer_recalc_line(buffer, line_index);
       +buffer_delete_unicode_char(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir) {
       +        size_t new_index = buffer_delete_unicode_char_base(buffer, line_index, byte_index, dir);
       +        buffer_recalc_line(buffer, line_index);
                return new_index;
        }
        
        size_t
       -ledit_buffer_delete_unicode_char_base(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir) {
       -        ledit_line *l = ledit_buffer_get_line(buffer, line_index);
       +buffer_delete_unicode_char_base(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir) {
       +        ledit_line *l = buffer_get_line(buffer, line_index);
                size_t new_index = byte_index;
                if (dir < 0) {
       -                size_t i = ledit_line_prev_utf8(l, byte_index);
       -                ledit_buffer_delete_line_section_base(buffer, line_index, i, byte_index - i);
       +                size_t i = line_prev_utf8(l, byte_index);
       +                buffer_delete_line_section_base(buffer, line_index, i, byte_index - i);
                        new_index = i;
                } else {
       -                size_t i = ledit_line_next_utf8(l, byte_index);
       -                ledit_buffer_delete_line_section_base(buffer, line_index, byte_index, i - byte_index);
       +                size_t i = line_next_utf8(l, byte_index);
       +                buffer_delete_line_section_base(buffer, line_index, byte_index, i - byte_index);
                }
                return new_index;
        }
   DIR diff --git a/buffer.h b/buffer.h
       t@@ -29,7 +29,7 @@ typedef struct {
        struct ledit_buffer {
                ledit_common *common;            /* common stuff, e.g. display, etc. */
                char *filename;                  /* last opened filename */
       -        ledit_undo_stack *undo;          /* undo manager */
       +        undo_stack *undo;          /* undo manager */
                ledit_buffer_marklist *marklist; /* list of mark positions set */
                ledit_line *lines;               /* array of lines */
                ledit_view **views;              /* array of registered views */
       t@@ -46,29 +46,29 @@ struct ledit_buffer {
        /*
         * Create a new buffer with one empty line
         */
       -ledit_buffer *ledit_buffer_create(ledit_common *common);
       +ledit_buffer *buffer_create(ledit_common *common);
        
        /*
         * Set the hard line mode of the buffer and update the
         * displayed mode in all views.
         */
       -void ledit_buffer_set_hard_line_based(ledit_buffer *buffer, int hl);
       +void buffer_set_hard_line_based(ledit_buffer *buffer, int hl);
        
        /*
         * Add a new view to the buffer.
         */
       -void ledit_buffer_add_view(ledit_buffer *buffer, ledit_theme *theme, enum ledit_mode mode, size_t line, size_t pos);
       +void buffer_add_view(ledit_buffer *buffer, ledit_theme *theme, enum ledit_mode mode, size_t line, size_t pos);
        
        /*
         * Remove the given view from the buffer.
         * Nothing is done if the view does not belong to the buffer.
         */
       -void ledit_buffer_remove_view(ledit_buffer *buffer, ledit_view *view);
       +void buffer_remove_view(ledit_buffer *buffer, ledit_view *view);
        
        /*
         * Call 'view_recalc_from_line' for all views.
         */
       -void ledit_buffer_recalc_all_views_from_line(ledit_buffer *buffer, size_t line);
       +void buffer_recalc_all_views_from_line(ledit_buffer *buffer, size_t line);
        
        /*
         * Load a file into the buffer at line 'line'.
       t@@ -78,7 +78,7 @@ void ledit_buffer_recalc_all_views_from_line(ledit_buffer *buffer, size_t line);
         * with an error message which must be copied as soon as possible because it may
         * be overwritten by subsequent function calls.
         */
       -int ledit_buffer_load_file(ledit_buffer *buffer, char *filename, size_t line, char **errstr);
       +int buffer_load_file(ledit_buffer *buffer, char *filename, size_t line, char **errstr);
        
        /*
         * Write the buffer to a file.
       t@@ -86,18 +86,18 @@ int ledit_buffer_load_file(ledit_buffer *buffer, char *filename, size_t line, ch
         * with an error message which must be copied as soon as possible because it may
         * be overwritten by subsequent function calls.
         */
       -int ledit_buffer_write_to_file(ledit_buffer *buffer, char *filename, char **errstr);
       +int buffer_write_to_file(ledit_buffer *buffer, char *filename, char **errstr);
        
        /*
         * Destroy a buffer.
         */
       -void ledit_buffer_destroy(ledit_buffer *buffer);
       +void buffer_destroy(ledit_buffer *buffer);
        
        /*
         * Normalize a line, i.e. move the gap to the end and add '\0'
         * so the text can be used as a normal string
         */
       -void ledit_buffer_normalize_line(ledit_line *line);
       +void buffer_normalize_line(ledit_line *line);
        
        /*
         * Insert 'src_len' bytes from 'src_line' starting at byte position 'src_index'
       t@@ -107,7 +107,7 @@ void ledit_buffer_normalize_line(ledit_line *line);
         * This function does not update the views or normalize the lines, so it should
         * only be used for efficiency purposes when performing multiple operations.
         */
       -void ledit_buffer_insert_text_from_line_base(
       +void buffer_insert_text_from_line_base(
            ledit_buffer *buffer,
            size_t dst_line, size_t dst_index,
            size_t src_line, size_t src_index, size_t src_len,
       t@@ -115,9 +115,9 @@ void ledit_buffer_insert_text_from_line_base(
        );
        
        /*
       - * Same as ledit_buffer_insert_text_from_line_base, but the views are updated afterwards.
       + * Same as buffer_insert_text_from_line_base, but the views are updated afterwards.
         */
       -void ledit_buffer_insert_text_from_line(
       +void buffer_insert_text_from_line(
            ledit_buffer *buffer,
            size_t dst_line, size_t dst_index,
            size_t src_line, size_t src_index, size_t src_len,
       t@@ -130,16 +130,16 @@ void ledit_buffer_insert_text_from_line(
         * This function does not update the views or normalize the lines, so it should
         * only be used for efficiency purposes when performing multiple operations.
         */
       -void ledit_buffer_insert_text_base(
       +void buffer_insert_text_base(
            ledit_buffer *buffer,
            size_t line_index, size_t index,
            char *text, size_t len
        );
        
        /*
       - * Same as ledit_buffer_insert_text_base, but the views are updated afterwards.
       + * Same as buffer_insert_text_base, but the views are updated afterwards.
         */
       -void ledit_buffer_insert_text(
       +void buffer_insert_text(
            ledit_buffer *buffer,
            size_t line_index, size_t index,
            char *text, size_t len
       t@@ -154,7 +154,7 @@ void ledit_buffer_insert_text(
         * This function does not update the views or normalize the lines, so it should
         * only be used for efficiency purposes when performing multiple operations.
         */
       -void ledit_buffer_insert_text_with_newlines_base(
       +void buffer_insert_text_with_newlines_base(
            ledit_buffer *buffer,
            size_t line_index, size_t index,
            char *text, size_t len,
       t@@ -162,9 +162,9 @@ void ledit_buffer_insert_text_with_newlines_base(
        );
        
        /*
       - * Same as ledit_buffer_insert_text_with_newlines_base, but the views are updated afterwards.
       + * Same as buffer_insert_text_with_newlines_base, but the views are updated afterwards.
         */
       -void ledit_buffer_insert_text_with_newlines(
       +void buffer_insert_text_with_newlines(
            ledit_buffer *buffer,
            size_t line_index, size_t index,
            char *text, size_t len,
       t@@ -178,51 +178,51 @@ void ledit_buffer_insert_text_with_newlines(
         * The views are notified that a line has been appended, but not told to update
         * their line heights and offsets.
         */
       -void ledit_buffer_append_line_base(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text);
       +void buffer_append_line_base(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text);
        
        /*
       - * Same as ledit_buffer_append_line_base, but the views are told to update
       + * Same as buffer_append_line_base, but the views are told to update
         * their line heights and offsets afterwards.
         */
       -void ledit_buffer_append_line(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text);
       +void buffer_append_line(ledit_buffer *buffer, size_t line_index, size_t text_index, int break_text);
        
        /*
         * Delete lines between 'index1' and 'index2' (inclusive).
         * The views are notified of the deletion but not told to
         * update their line heights and offsets.
         */
       -void ledit_buffer_delete_line_entries_base(ledit_buffer *buffer, size_t index1, size_t index2);
       +void buffer_delete_line_entries_base(ledit_buffer *buffer, size_t index1, size_t index2);
        
        /*
       - * Same as ledit_buffer_delete_line_entries_base, but the views are told to
       + * Same as buffer_delete_line_entries_base, but the views are told to
         * update their line heights and offsets.
         */
       -void ledit_buffer_delete_line_entries(ledit_buffer *buffer, size_t index1, size_t index2);
       +void buffer_delete_line_entries(ledit_buffer *buffer, size_t index1, size_t index2);
        
        /*
       - * Convenience function to call ledit_buffer_delete_line_entries_base
       + * Convenience function to call buffer_delete_line_entries_base
         * with two times the same line index.
         */
       -void ledit_buffer_delete_line_entry_base(ledit_buffer *buffer, size_t index);
       +void buffer_delete_line_entry_base(ledit_buffer *buffer, size_t index);
        
        /*
       - * Convenience function to call ledit_buffer_delete_line_entries
       + * Convenience function to call buffer_delete_line_entries
         * with two times the same line index.
         */
       -void ledit_buffer_delete_line_entry(ledit_buffer *buffer, size_t index);
       +void buffer_delete_line_entry(ledit_buffer *buffer, size_t index);
        
        /*
         * Get the line at logical index 'index'.
         * The returned line is only valid until the next
         * action that appends or deletes line entries.
         */
       -ledit_line *ledit_buffer_get_line(ledit_buffer *buffer, size_t index);
       +ledit_line *buffer_get_line(ledit_buffer *buffer, size_t index);
        
        /*
         * Tell views to recalculate the height of line 'line' and
         * update the pixel offsets of the following lines.
         */
       -void ledit_buffer_recalc_line(ledit_buffer *buffer, size_t line);
       +void buffer_recalc_line(ledit_buffer *buffer, size_t line);
        
        /*
         * Tell views to recalculate the height for all lines starting at 'line'
       t@@ -230,13 +230,13 @@ void ledit_buffer_recalc_line(ledit_buffer *buffer, size_t line);
         * all lines after 'line'.
         * Also clear the text_dirty attribute for all lines starting at 'line'.
         */
       -void ledit_buffer_recalc_from_line(ledit_buffer *buffer, size_t line);
       +void buffer_recalc_from_line(ledit_buffer *buffer, size_t line);
        
        /*
         * Tell views to recalculate all lines.
         * Also clear the text_dirty attribute for all lines.
         */
       -void ledit_buffer_recalc_all_lines(ledit_buffer *buffer);
       +void buffer_recalc_all_lines(ledit_buffer *buffer);
        
        /*
         * Get needed length of text range, including newlines.
       t@@ -244,21 +244,21 @@ void ledit_buffer_recalc_all_lines(ledit_buffer *buffer);
         * - if the last range ends at the end of a line, the newline is *not* included
         * - the range must be sorted already
         */
       -size_t ledit_buffer_textlen(ledit_buffer *buffer, size_t line1, size_t byte1, size_t line2, size_t byte2);
       +size_t buffer_textlen(ledit_buffer *buffer, size_t line1, size_t byte1, size_t line2, size_t byte2);
        
        /*
         * Copy text range into given buffer.
         * - dst is null-terminated
       - * - dst must be large enough to contain the text and NUL (only use this together with ledit_buffer_textlen)
       + * - dst must be large enough to contain the text and NUL (only use this together with buffer_textlen)
         * - the range must be sorted already
         */
       -void ledit_buffer_copy_text(ledit_buffer *buffer, char *dst, int line1, int byte1, int line2, int byte2);
       +void buffer_copy_text(ledit_buffer *buffer, char *dst, int line1, int byte1, int line2, int byte2);
        
        /*
         * Copy text range into given buffer and resize it if necessary.
         * - the range must be sorted already
         */
       -void ledit_buffer_copy_text_to_txtbuf(
       +void buffer_copy_text_to_txtbuf(
            ledit_buffer *buffer,
            txtbuf *buf, /* oh, isn't that a very non-confusing name? */
            size_t line1, size_t byte1,
       t@@ -268,12 +268,12 @@ void ledit_buffer_copy_text_to_txtbuf(
        /*
         * Get the byte index of the previous utf8 character starting at byte index 'index'.
         */
       -size_t ledit_line_next_utf8(ledit_line *line, size_t index);
       +size_t line_next_utf8(ledit_line *line, size_t index);
        
        /*
         * Get the byte index of the previous utf8 character starting at byte index 'index'.
         */
       -size_t ledit_line_prev_utf8(ledit_line *line, size_t index);
       +size_t line_prev_utf8(ledit_line *line, size_t index);
        
        /*
         * Get the unicode character index of a byte position.
       t@@ -285,7 +285,7 @@ size_t line_byte_to_char(ledit_line *line, size_t byte);
         * and notify the views.
         * Note that this does not tell the views to recalculate their line heights and offsets.
         */
       -void ledit_buffer_delete_line_section_base(ledit_buffer *buffer, size_t line, size_t start, size_t length);
       +void buffer_delete_line_section_base(ledit_buffer *buffer, size_t line, size_t start, size_t length);
        
        /*
         * Delete the unicode char at 'line_index' and 'byte_index' if 'dir' is >= 0,
       t@@ -294,16 +294,16 @@ void ledit_buffer_delete_line_section_base(ledit_buffer *buffer, size_t line, si
         * This function only notifies the views of the deletion, but does not tell
         * them to recalculate their line heights and offsets.
         */
       -size_t ledit_buffer_delete_unicode_char_base(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir);
       +size_t buffer_delete_unicode_char_base(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir);
        
        /*
       - * Same as ledit_buffer_delete_unicode_char_base, but the views are updated.
       + * Same as buffer_delete_unicode_char_base, but the views are updated.
         */
       -size_t ledit_buffer_delete_unicode_char(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir);
       +size_t buffer_delete_unicode_char(ledit_buffer *buffer, size_t line_index, size_t byte_index, int dir);
        
        /*
         * Insert a mark with key 'mark' at line 'line' and byte 'byte'.
         */
       -void ledit_buffer_insert_mark(ledit_buffer *buffer, char *mark, size_t len, size_t line, size_t byte);
       +void buffer_insert_mark(ledit_buffer *buffer, char *mark, size_t len, size_t line, size_t byte);
        
        #endif
   DIR diff --git a/keys_basic.c b/keys_basic.c
       t@@ -180,7 +180,7 @@ clear_key_stack(void) {
        
        static struct action
        err_invalid_key(ledit_view *view) {
       -        ledit_window_show_message(view->window, "Invalid key", -1);
       +        window_show_message(view->window, "Invalid key", -1);
                clear_key_stack();
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
       t@@ -423,7 +423,7 @@ delete_range(
                );
                cur_range.line2 = view->cur_line;
                cur_range.byte2 = view->cur_index;
       -        ledit_push_undo_delete(
       +        undo_push_delete(
                    view->buffer->undo, buf, del_range, cur_range, 1, view->mode
                );
                if (!copy_to_buffer)
       t@@ -450,7 +450,7 @@ insert_text(
                del_range.line1 = line;
                del_range.byte1 = index;
                size_t cur_line, cur_index;
       -        ledit_buffer_insert_text_with_newlines(
       +        buffer_insert_text_with_newlines(
                    view->buffer, line, index, text, len,
                    &cur_line, &cur_index
                );
       t@@ -465,7 +465,7 @@ insert_text(
                }
                del_range.line2 = cur_line;
                del_range.byte2 = cur_index;
       -        ledit_push_undo_insert(
       +        undo_push_insert(
                    view->buffer->undo, &ins_buf, del_range, cur_range, start_group, view->mode
                );
        }
       t@@ -494,7 +494,7 @@ delete_chars_forwards(ledit_view *view, char *text, size_t len) {
                (void)len;
                int num = get_key_repeat();
                if (num == -1) {
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                        return (struct action){ACTION_NONE, NULL};
                } else if (num == 0) {
                        num = 1;
       t@@ -521,7 +521,7 @@ delete_chars_backwards(ledit_view *view, char *text, size_t len) {
                (void)len;
                int num = get_key_repeat();
                if (num == -1) {
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                        return (struct action){ACTION_NONE, NULL};
                } else if (num == 0) {
                        num = 1;
       t@@ -550,7 +550,7 @@ push_undo_empty_insert(ledit_view *view, size_t line, size_t index, int start_gr
                txtbuf ins_buf = {.text = "", .len = 0, .cap = 0};
                ledit_range ins_range = {.line1 = line, .byte1 = index, .line2 = line, .byte2 = index};
                ledit_range cur_range = {.line1 = line, .byte1 = index, .line2 = line, .byte2 = index};
       -        ledit_push_undo_insert(
       +        undo_push_insert(
                    view->buffer->undo, &ins_buf, ins_range, cur_range, start_group, view->mode
                );
        }
       t@@ -575,7 +575,7 @@ append_line_below(ledit_view *view, char *text, size_t len) {
                size_t start, end;
                enter_insert(view, text, len);
                view_get_pos_softline_bounds(view, view->cur_line, view->cur_index, &start, &end);
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, view->cur_line);
       +        ledit_line *ll = buffer_get_line(view->buffer, view->cur_line);
                if (hard_line_based || end == ll->len) {
                        insert_text(view, view->cur_line, ll->len, "\n", 1, 0, 0, view->cur_line + 1, 0, 0, 1, 1);
                } else {
       t@@ -602,7 +602,7 @@ append_after_eol(ledit_view *view, char *text, size_t len) {
                view_get_pos_softline_bounds(view, view->cur_line, view->cur_index, &start, &end);
                /* make cursor jump back to original position on undo */
                push_undo_empty_insert(view, view->cur_line, view->cur_index, 1);
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, view->cur_line);
       +        ledit_line *ll = buffer_get_line(view->buffer, view->cur_line);
                if (hard_line_based)
                        view->cur_index = ll->len;
                else
       t@@ -630,7 +630,7 @@ move_to_line(ledit_view *view, char *text, size_t len) {
                        view->cur_line = line - 1;
                        view->cur_index = 0;
                        int text_w, text_h;
       -                ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +                window_get_textview_size(view->window, &text_w, &text_h);
                        ledit_view_line *vl = view_get_line(view, view->cur_line);
                        int x, y, h;
                        view_get_cursor_pixel_pos(view, view->cur_line, 0, &x, &y, &h);
       t@@ -659,7 +659,7 @@ scroll_lines(ledit_view *view, int lines, int dir) {
                        /* get the middle position of char */
                        ledit_pos_to_x_softline(view, view->cur_line, view->cur_index, &x, &sli);
                        long abs_pos = vl->y_offset + y;
       -                ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +                window_get_textview_size(view->window, &text_w, &text_h);
                        if (lines > 0)
                                final_lines = last_lines_scrolled = lines;
                        else
       t@@ -689,7 +689,7 @@ scroll_lines_up(ledit_view *view, char *text, size_t len) {
                if (repeat >= 0)
                        scroll_lines(view, repeat, -1);
                else
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
        }
       t@@ -702,7 +702,7 @@ scroll_lines_down(ledit_view *view, char *text, size_t len) {
                if (repeat >= 0)
                        scroll_lines(view, repeat, 1);
                else
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
        }
       t@@ -744,7 +744,7 @@ scroll_with_cursor_up(ledit_view *view, char *text, size_t len) {
                if (repeat >= 0)
                        scroll_with_cursor(view, -(repeat == 0 ? 1 : repeat));
                else
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
        }
       t@@ -757,7 +757,7 @@ scroll_with_cursor_down(ledit_view *view, char *text, size_t len) {
                if (repeat >= 0)
                        scroll_with_cursor(view, repeat == 0 ? 1 : repeat);
                else
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
        }
       t@@ -770,7 +770,7 @@ scroll_with_cursor_down(ledit_view *view, char *text, size_t len) {
        static void
        move_half_screen(ledit_view *view, int movement) {
                int w, h;
       -        ledit_window_get_textview_size(view->window, &w, &h);
       +        window_get_textview_size(view->window, &w, &h);
                /* FIXME: overflow */
                int total = movement * h/2;
                ledit_view_line *vl = view_get_line(view, view->cur_line);
       t@@ -825,7 +825,7 @@ screen_up(ledit_view *view, char *text, size_t len) {
                if (repeat >= 0)
                        move_half_screen(view, -(repeat == 0 ? 2 : repeat*2));
                else
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
        }
       t@@ -838,7 +838,7 @@ screen_down(ledit_view *view, char *text, size_t len) {
                if (repeat >= 0)
                        move_half_screen(view, repeat == 0 ? 2 : repeat*2);
                else
       -                ledit_window_show_message(view->window, "Invalid key", -1);
       +                window_show_message(view->window, "Invalid key", -1);
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
        }
       t@@ -850,7 +850,7 @@ delete_to_eol(ledit_view *view, char *text, size_t len) {
                if (!key_stack_empty())
                        return err_invalid_key(view);
                size_t start, end;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, view->cur_line);
       +        ledit_line *ll = buffer_get_line(view->buffer, view->cur_line);
                if (hard_line_based) {
                        end = ll->len;
                } else {
       t@@ -877,7 +877,7 @@ change_to_eol(ledit_view *view, char *text, size_t len) {
                        return err_invalid_key(view);
                view_set_mode(view, INSERT);
                size_t start, end;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, view->cur_line);
       +        ledit_line *ll = buffer_get_line(view->buffer, view->cur_line);
                if (hard_line_based) {
                        end = ll->len;
                } else {
       t@@ -947,7 +947,7 @@ change_cb(ledit_view *view, size_t line, size_t char_pos, enum key_type type) {
                        view_get_pos_softline_bounds(view, line, char_pos, &tmp, &pos2);
                } else if (line_based && hard_line_based) {
                        pos1 = 0;
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +                ledit_line *ll = buffer_get_line(view->buffer, line);
                        pos2 = ll->len;
                }
                /* force line_based to 0 (see comment about hackery above) */
       t@@ -970,7 +970,7 @@ yank(ledit_view *view, char *text, size_t len) {
                        view_sort_selection(
                            &view->sel.line1, &view->sel.byte1, &view->sel.line2, &view->sel.byte2
                        );
       -                ledit_buffer_copy_text_to_txtbuf(
       +                buffer_copy_text_to_txtbuf(
                            view->buffer, paste_buffer,
                            view->sel.line1, view->sel.byte1, view->sel.line2, view->sel.byte2
                        );
       t@@ -1049,26 +1049,26 @@ yank_cb(ledit_view *view, size_t line, size_t char_pos, enum key_type type) {
                        size_t start1, end2, tmp;
                        view_get_pos_softline_bounds(view, l1, b1, &start1, &tmp);
                        view_get_pos_softline_bounds(view, l2, b2, &tmp, &end2);
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, l2);
       +                ledit_line *ll = buffer_get_line(view->buffer, l2);
                        if (end2 == ll->len && l2 < view->lines_num - 1) {
                                l2++;
                                end2 = 0;
                        }
       -                ledit_buffer_copy_text_to_txtbuf(
       +                buffer_copy_text_to_txtbuf(
                            view->buffer, paste_buffer, l1, start1, l2, end2
                        );
                } else if (line_based && hard_line_based) {
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, l2);
       +                ledit_line *ll = buffer_get_line(view->buffer, l2);
                        size_t end = ll->len;
                        if (l2 < view->lines_num - 1) {
                                l2++;
                                end = 0;
                        }
       -                ledit_buffer_copy_text_to_txtbuf(
       +                buffer_copy_text_to_txtbuf(
                            view->buffer, paste_buffer, l1, 0, l2, end
                        );
                } else {
       -                ledit_buffer_copy_text_to_txtbuf(
       +                buffer_copy_text_to_txtbuf(
                            view->buffer, paste_buffer, l1, b1, l2, b2
                        );
                }
       t@@ -1138,13 +1138,13 @@ paste_normal(ledit_view *view, char *text, size_t len) {
                (void)text;
                (void)len;
                if (!paste_buffer) {
       -                ledit_window_show_message(view->window, "Nothing to paste", -1);
       +                window_show_message(view->window, "Nothing to paste", -1);
                        discard_repetition_stack();
                        return (struct action){ACTION_NONE, NULL};
                }
                if (paste_buffer_line_based) {
                        view_wipe_line_cursor_attrs(view, view->cur_line);
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, view->cur_line);
       +                ledit_line *ll = buffer_get_line(view->buffer, view->cur_line);
                        size_t brk = 0;
                        if (hard_line_based) {
                                brk = ll->len;
       t@@ -1157,7 +1157,7 @@ paste_normal(ledit_view *view, char *text, size_t len) {
                            "\n", 1, 0, 0, view->cur_line, view->cur_index, 0, 1, 1
                        );
                        size_t text_len = paste_buffer->len;
       -                ll = ledit_buffer_get_line(view->buffer, view->cur_line + 1);
       +                ll = buffer_get_line(view->buffer, view->cur_line + 1);
                        if (ll->len == 0 && paste_buffer->text[text_len-1] == '\n') {
                                /* remove trailing newline if it exists and text is already on own line */
                                text_len--;
       t@@ -1194,13 +1194,13 @@ paste_normal_backwards(ledit_view *view, char *text, size_t len) {
                (void)text;
                (void)len;
                if (!paste_buffer) {
       -                ledit_window_show_message(view->window, "Nothing to paste", -1);
       +                window_show_message(view->window, "Nothing to paste", -1);
                        discard_repetition_stack();
                        return (struct action){ACTION_NONE, NULL};
                }
                if (paste_buffer_line_based) {
                        view_wipe_line_cursor_attrs(view, view->cur_line);
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, view->cur_line);
       +                ledit_line *ll = buffer_get_line(view->buffer, view->cur_line);
                        size_t brk = 0;
                        if (!hard_line_based) {
                                size_t tmp;
       t@@ -1212,7 +1212,7 @@ paste_normal_backwards(ledit_view *view, char *text, size_t len) {
                            "\n", 1, 0, 0, view->cur_line, view->cur_index, 0, 1, 1
                        );
                        size_t text_len = paste_buffer->len;
       -                ll = ledit_buffer_get_line(view->buffer, view->cur_line);
       +                ll = buffer_get_line(view->buffer, view->cur_line);
                        if (paste_buffer->text[text_len-1] == '\n') {
                                /* remove trailing newline if it exists */
                                text_len--;
       t@@ -1363,12 +1363,12 @@ backspace(ledit_view *view, char *text, size_t len) {
                        /* NOP */
                } else if (view->cur_index == 0) {
                        if (view->cur_line != 0) {
       -                        ledit_line *l1 = ledit_buffer_get_line(view->buffer, view->cur_line - 1);
       +                        ledit_line *l1 = buffer_get_line(view->buffer, view->cur_line - 1);
                                delete_range(view, 0, 0, view->cur_line - 1, l1->len, view->cur_line, 0, 0);
                        }
                } else {
       -                ledit_line *l = ledit_buffer_get_line(view->buffer, view->cur_line);
       -                int i = ledit_line_prev_utf8(l, view->cur_index);
       +                ledit_line *l = buffer_get_line(view->buffer, view->cur_line);
       +                int i = line_prev_utf8(l, view->cur_index);
                        delete_range(view, 0, 0, view->cur_line, view->cur_index, view->cur_line, i, 0);
                }
                return (struct action){ACTION_NONE, NULL};
       t@@ -1378,7 +1378,7 @@ static struct action
        delete_key(ledit_view *view, char *text, size_t len) {
                (void)text;
                (void)len;
       -        ledit_line *cur_line = ledit_buffer_get_line(view->buffer, view->cur_line);
       +        ledit_line *cur_line = buffer_get_line(view->buffer, view->cur_line);
                if (delete_selection(view)) {
                        /* NOP */
                } else if (view->cur_index == cur_line->len) {
       t@@ -1386,7 +1386,7 @@ delete_key(ledit_view *view, char *text, size_t len) {
                                delete_range(view, 0, 0, view->cur_line, cur_line->len, view->cur_line + 1, 0, 0);
                        }
                } else {
       -                int i = ledit_line_next_utf8(cur_line, view->cur_index);
       +                int i = line_next_utf8(cur_line, view->cur_index);
                        delete_range(view, 0, 0, view->cur_line, view->cur_index, view->cur_line, i, 0);
                }
                /* FIXME: This was probably a mistake earlier, right?
       t@@ -1411,7 +1411,7 @@ move_to_eol(ledit_view *view, char *text, size_t len) {
                    view, view->cur_line, view->cur_index, num - 1,
                    &new_line, &new_softline
                );
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, new_line);
       +        ledit_line *ll = buffer_get_line(view->buffer, new_line);
                size_t end_index = ll->len;
                if (!hard_line_based) {
                        size_t tmp;
       t@@ -1461,7 +1461,7 @@ name(ledit_view *view, char *text, size_t len) {                                
                if (cb != NULL) {                                                        \
                        cb(view, new_line, new_real_index, KEY_MOTION_CHAR);             \
                } else {                                                                 \
       -                if (view->mode == VISUAL) {                      \
       +                if (view->mode == VISUAL) {                                      \
                                view_set_selection(                                      \
                                    view,                                                \
                                    view->sel.line1, view->sel.byte1,                    \
       t@@ -1502,7 +1502,7 @@ move_cursor_left_right(ledit_view *view, int dir, int allow_illegal_index) {
                if (num == 0)
                        num = 1;
        
       -        ledit_line *cur_line = ledit_buffer_get_line(view->buffer, view->cur_line);
       +        ledit_line *cur_line = buffer_get_line(view->buffer, view->cur_line);
                /* FIXME: standardize interface - num * dir or separately? */
                size_t last_index;
                size_t new_index = view_move_cursor_visually(
       t@@ -1693,7 +1693,7 @@ join_lines(ledit_view *view, char *text, size_t len) {
                        /* getting cur line again should be unnecessary, but
                           I'll just leave it in case I change the way lines
                           are stored later */
       -                ll1 = ledit_buffer_get_line(view->buffer, cur_line);
       +                ll1 = buffer_get_line(view->buffer, cur_line);
                        oldlen = ll1->len;
                        /* FIXME: truncate whitespace to one space */
                        view_delete_range(
       t@@ -1704,7 +1704,7 @@ join_lines(ledit_view *view, char *text, size_t len) {
                        cur_range.byte1 = view->cur_index;
                        cur_range.byte2 = view->cur_index =
                            view_get_legal_normal_pos(view, view->cur_line, oldlen);
       -                ledit_push_undo_delete(
       +                undo_push_delete(
                            view->buffer->undo, buf, del_range, cur_range,
                            start_group, view->mode
                        );
       t@@ -1833,46 +1833,46 @@ static struct action
        enter_commandedit(ledit_view *view, char *text, size_t len) {
                (void)text;
                (void)len;
       -        ledit_window_set_bottom_bar_text(view->window, ":", -1);
       -        ledit_window_set_bottom_bar_min_pos(view->window, 1);
       -        ledit_window_set_bottom_bar_cursor(view->window, 1);
       +        window_set_bottom_bar_text(view->window, ":", -1);
       +        window_set_bottom_bar_min_pos(view->window, 1);
       +        window_set_bottom_bar_cursor(view->window, 1);
                view->cur_command_type = CMD_EDIT;
       -        ledit_window_set_bottom_bar_text_shown(view->window, 1);
       +        window_set_bottom_bar_text_shown(view->window, 1);
                discard_repetition_stack();
       -        return (struct action){ACTION_GRABKEY, &ledit_command_key_handler};
       +        return (struct action){ACTION_GRABKEY, &command_key_handler};
        }
        
        static struct action
        enter_searchedit_forward(ledit_view *view, char *text, size_t len) {
                (void)text;
                (void)len;
       -        ledit_window_set_bottom_bar_text(view->window, "/", -1);
       -        ledit_window_set_bottom_bar_min_pos(view->window, 1);
       -        ledit_window_set_bottom_bar_cursor(view->window, 1);
       +        window_set_bottom_bar_text(view->window, "/", -1);
       +        window_set_bottom_bar_min_pos(view->window, 1);
       +        window_set_bottom_bar_cursor(view->window, 1);
                view->cur_command_type = CMD_EDITSEARCH;
       -        ledit_window_set_bottom_bar_text_shown(view->window, 1);
       +        window_set_bottom_bar_text_shown(view->window, 1);
                discard_repetition_stack();
       -        return (struct action){ACTION_GRABKEY, &ledit_command_key_handler};
       +        return (struct action){ACTION_GRABKEY, &command_key_handler};
        }
        
        static struct action
        enter_searchedit_backward(ledit_view *view, char *text, size_t len) {
                (void)text;
                (void)len;
       -        ledit_window_set_bottom_bar_text(view->window, "?", -1);
       -        ledit_window_set_bottom_bar_min_pos(view->window, 1);
       -        ledit_window_set_bottom_bar_cursor(view->window, 1);
       +        window_set_bottom_bar_text(view->window, "?", -1);
       +        window_set_bottom_bar_min_pos(view->window, 1);
       +        window_set_bottom_bar_cursor(view->window, 1);
                view->cur_command_type = CMD_EDITSEARCHB;
       -        ledit_window_set_bottom_bar_text_shown(view->window, 1);
       +        window_set_bottom_bar_text_shown(view->window, 1);
                discard_repetition_stack();
       -        return (struct action){ACTION_GRABKEY, &ledit_command_key_handler};
       +        return (struct action){ACTION_GRABKEY, &command_key_handler};
        }
        
        /* FIXME: differentiate between jumping to line and index like nvi */
        static struct action
        mark_line_cb(ledit_view *view, char *text, size_t len) {
                grab_char_cb = NULL;
       -        ledit_buffer_insert_mark(
       +        buffer_insert_mark(
                    view->buffer, text, len, view->cur_line, view->cur_index
                );
                return (struct action){ACTION_NONE, NULL};
       t@@ -1896,11 +1896,11 @@ jump_to_mark_cb(ledit_view *view, char *text, size_t len) {
                                ledit_buffer_mark *m = &marklist->marks[i];
                                if (m->line >= view->lines_num) {
                                        line = view->lines_num - 1;
       -                                ll = ledit_buffer_get_line(view->buffer, line);
       +                                ll = buffer_get_line(view->buffer, line);
                                        index = ll->len;
                                } else {
                                        line = m->line;
       -                                ll = ledit_buffer_get_line(view->buffer, m->line);
       +                                ll = buffer_get_line(view->buffer, m->line);
                                        if (m->byte >= ll->len)
                                                index = ll->len;
                                        else
       t@@ -1983,7 +1983,7 @@ show_line(ledit_view *view, char *text, size_t len) {
                int textlen = snprintf(NULL, 0, "Line %zu of %zu", view->cur_line + 1, view->lines_num);
                char *str = ledit_malloc(textlen + 1);
                snprintf(str, textlen + 1, "Line %zu of %zu", view->cur_line + 1, view->lines_num);
       -        ledit_window_show_message(view->window, str, textlen);
       +        window_show_message(view->window, str, textlen);
                discard_repetition_stack();
                return (struct action){ACTION_NONE, NULL};
        }
       t@@ -2101,7 +2101,7 @@ name##_cb(ledit_view *view, char *text, size_t len) {                           
                        return err_invalid_key(view);                                      \
                if (num == 0)                                                              \
                        num = 1;                                                           \
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, view->cur_line);      \
       +        ledit_line *ll = buffer_get_line(view->buffer, view->cur_line);            \
                size_t new_index = view->cur_index;                                        \
                int ret = -1;                                                              \
                for (int i = 0; i < num; i++) {                                            \
       t@@ -2118,7 +2118,7 @@ name##_cb(ledit_view *view, char *text, size_t len) {                           
                                );                                                         \
                                cb(view, view->cur_line, new_index, KEY_MOTION_CHAR);      \
                        } else {                                                           \
       -                        if (view->mode == VISUAL) {                \
       +                        if (view->mode == VISUAL) {                                \
                                        view->cur_index = cur_funcv(                       \
                                            view, view->cur_line, new_index, 1             \
                                        );                                                 \
       t@@ -2145,7 +2145,7 @@ name##_cb(ledit_view *view, char *text, size_t len) {                           
                                                                                           \
        static struct action                                                               \
        name(ledit_view *view, char *text, size_t len) {                                   \
       -        (void)view;                                                              \
       +        (void)view;                                                                \
                (void)text;                                                                \
                (void)len;                                                                 \
                grab_char_cb = &name##_cb;                                                 \
       t@@ -2215,7 +2215,7 @@ toggle_hard_line_based(ledit_view *view, char *text, size_t len) {
                int num = get_key_repeat();
                if (num != 0)
                        return err_invalid_key(view);
       -        ledit_buffer_set_hard_line_based(view->buffer, !view->buffer->hard_line_based);
       +        buffer_set_hard_line_based(view->buffer, !view->buffer->hard_line_based);
                return (struct action){ACTION_NONE, NULL};
        }
        
       t@@ -2295,7 +2295,7 @@ basic_key_handler(ledit_view *view, XEvent *event, int lang_index) {
                re->lang_index = lang_index;
        
                /* FIXME: only hide when actually necessary */
       -        ledit_window_hide_message(view->window);
       +        window_hide_message(view->window);
                int found = 0;
                struct action act = handle_key(view, buf, (size_t)n, sym, key_state, lang_index, &found);
        
   DIR diff --git a/keys_command.c b/keys_command.c
       t@@ -47,7 +47,7 @@ handle_write(ledit_view *view, char *cmd, size_t l1, size_t l2) {
                /* FIXME: Implement properly; handle error */
                char *errstr;
                if (view->buffer->filename)
       -                ledit_buffer_write_to_file(view->buffer, view->buffer->filename, &errstr);
       +                buffer_write_to_file(view->buffer, view->buffer->filename, &errstr);
                return 0;
        }
        
       t@@ -68,7 +68,7 @@ create_view(ledit_view *view, char *cmd, size_t l1, size_t l2) {
                (void)cmd;
                (void)l1;
                (void)l2;
       -        ledit_buffer_add_view(view->buffer, view->theme, view->mode, view->cur_line, view->cur_index);
       +        buffer_add_view(view->buffer, view->theme, view->mode, view->cur_line, view->cur_index);
                return 0;
        }
        
       t@@ -79,7 +79,7 @@ close_view(ledit_view *view, char *cmd, size_t l1, size_t l2) {
                (void)l2;
                /* FIXME: This will lead to problems if I add something that
                   requires access to the view after the command is handled. */
       -        ledit_buffer_remove_view(view->buffer, view);
       +        buffer_remove_view(view->buffer, view);
                if (view->buffer->views_num == 0) {
                        ledit_cleanup();
                        exit(0);
       t@@ -264,8 +264,8 @@ substitute_no_all(ledit_view *view, char *key_text, size_t len) {
        static int
        edit_insert_text(ledit_view *view, char *key_text, size_t len) {
                /* FIXME: overflow */
       -        ledit_window_insert_bottom_bar_text(view->window, key_text, len);
       -        ledit_window_set_bottom_bar_cursor(
       +        window_insert_bottom_bar_text(view->window, key_text, len);
       +        window_set_bottom_bar_cursor(
                    view->window, ledit_window_get_bottom_bar_cursor(view->window) + len
                );
                return 1;
       t@@ -275,7 +275,7 @@ static int
        edit_cursor_to_end(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_bottom_bar_cursor_to_end(view->window);
       +        window_bottom_bar_cursor_to_end(view->window);
                return 1;
        }
        
       t@@ -283,7 +283,7 @@ static int
        edit_cursor_to_beginning(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_bottom_bar_cursor_to_beginning(view->window);
       +        window_bottom_bar_cursor_to_beginning(view->window);
                return 1;
        }
        
       t@@ -291,7 +291,7 @@ static int
        edit_cursor_left(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_move_bottom_bar_cursor(view->window, -1);
       +        window_move_bottom_bar_cursor(view->window, -1);
                return 1;
        }
        
       t@@ -299,7 +299,7 @@ static int
        edit_cursor_right(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_move_bottom_bar_cursor(view->window, 1);
       +        window_move_bottom_bar_cursor(view->window, 1);
                return 1;
        }
        
       t@@ -307,7 +307,7 @@ static int
        edit_backspace(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_delete_bottom_bar_char(view->window, -1);
       +        window_delete_bottom_bar_char(view->window, -1);
                return 1;
        }
        
       t@@ -315,7 +315,7 @@ static int
        edit_delete(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_delete_bottom_bar_char(view->window, 1);
       +        window_delete_bottom_bar_char(view->window, 1);
                return 1;
        }
        
       t@@ -323,9 +323,9 @@ static int
        edit_submit(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_set_bottom_bar_text_shown(view->window, 0);
       +        window_set_bottom_bar_text_shown(view->window, 0);
                /* FIXME: this is hacky */
       -        return handle_cmd(view, ledit_window_get_bottom_bar_text(view->window) + 1, -1);
       +        return handle_cmd(view, window_get_bottom_bar_text(view->window) + 1, -1);
        }
        
        /* FIXME: support visual mode, i.e. change selection to new place? */
       t@@ -335,7 +335,7 @@ search_next(ledit_view *view) {
                enum ledit_search_state ret = ledit_search_next(view, &view->cur_line, &view->cur_index);
                view_set_line_cursor_attrs(view, view->cur_line, view->cur_index);
                if (ret != SEARCH_NORMAL)
       -                ledit_window_show_message(view->window, ledit_search_state_to_str(ret), -1);
       +                window_show_message(view->window, search_state_to_str(ret), -1);
        }
        
        void
       t@@ -344,15 +344,15 @@ search_prev(ledit_view *view) {
                enum ledit_search_state ret = ledit_search_prev(view, &view->cur_line, &view->cur_index);
                view_set_line_cursor_attrs(view, view->cur_line, view->cur_index);
                if (ret != SEARCH_NORMAL)
       -                ledit_window_show_message(view->window, ledit_search_state_to_str(ret), -1);
       +                window_show_message(view->window, search_state_to_str(ret), -1);
        }
        
        static int
        editsearch_submit(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_set_bottom_bar_text_shown(view->window, 0);
       -        ledit_set_search_forward(ledit_window_get_bottom_bar_text(view->window) + 1);
       +        window_set_bottom_bar_text_shown(view->window, 0);
       +        set_search_forward(window_get_bottom_bar_text(view->window) + 1);
                search_next(view);
                return 0;
        }
       t@@ -361,8 +361,8 @@ static int
        editsearchb_submit(ledit_view *view, char *key_text, size_t len) {
                (void)key_text;
                (void)len;
       -        ledit_window_set_bottom_bar_text_shown(view->window, 0);
       -        ledit_set_search_backward(ledit_window_get_bottom_bar_text(view->window) + 1);
       +        window_set_bottom_bar_text_shown(view->window, 0);
       +        set_search_backward(window_get_bottom_bar_text(view->window) + 1);
                search_next(view);
                return 0;
        }
       t@@ -372,12 +372,12 @@ edit_discard(ledit_view *view, char *key_text, size_t len) {
                (void)view;
                (void)key_text;
                (void)len;
       -        ledit_window_set_bottom_bar_text_shown(view->window, 0);
       +        window_set_bottom_bar_text_shown(view->window, 0);
                return 0;
        }
        
        struct action
       -ledit_command_key_handler(ledit_view *view, XEvent *event, int lang_index) {
       +command_key_handler(ledit_view *view, XEvent *event, int lang_index) {
                char buf[64];
                KeySym sym;
                int n;
       t@@ -404,7 +404,7 @@ ledit_command_key_handler(ledit_view *view, XEvent *event, int lang_index) {
                        }
                }
                if (grabkey)
       -                return (struct action){ACTION_GRABKEY, &ledit_command_key_handler};
       +                return (struct action){ACTION_GRABKEY, &command_key_handler};
                else
                        return (struct action){ACTION_NONE, NULL};
        }
   DIR diff --git a/keys_command.h b/keys_command.h
       t@@ -2,4 +2,4 @@
        void search_next(ledit_view *view);
        void search_prev(ledit_view *view);
        
       -struct action ledit_command_key_handler(ledit_view *view, XEvent *event, int lang_index);
       +struct action command_key_handler(ledit_view *view, XEvent *event, int lang_index);
   DIR diff --git a/ledit.c b/ledit.c
       t@@ -1,3 +1,6 @@
       +/* FIXME: On large files, expose event takes a long time for some reason
       +   -> but somehow only sometimes... */
       +/* FIXME: generally optimize redrawing */
        /* FIXME: Just use int for everything? size_t just doesn't seem to be worth it */
        /* FIXME: Make scrolling more smooth */
        /* FIXME: Document that everything is assumed to be utf8 */
       t@@ -119,23 +122,23 @@ mainloop(void) {
                                        view->redraw = 1;
                                        break;
                                case ConfigureNotify:
       -                                ledit_window_register_resize(view->window, &event);
       +                                window_register_resize(view->window, &event);
                                        break;
                                case ButtonPress:
       -                                ledit_window_register_button_press(view->window, &event);
       +                                window_register_button_press(view->window, &event);
                                        break;
                                case ButtonRelease:
       -                                ledit_window_button_release(view->window, &event);
       +                                window_button_release(view->window, &event);
                                        break;
                                case MotionNotify:
       -                                ledit_window_register_motion(window, &event);
       +                                window_register_motion(window, &event);
                                        break;
                                case KeyPress:
                                        key_press(view, &event);
                                        break;
                                case ClientMessage:
                                        if ((Atom)event.xclient.data.l[0] == view->window->wm_delete_msg) {
       -                                        ledit_buffer_remove_view(buffer, view);
       +                                        buffer_remove_view(buffer, view);
                                                if (buffer->views_num == 0)
                                                        running = 0;
                                        }
       t@@ -143,7 +146,7 @@ mainloop(void) {
                                case SelectionNotify:
                                case PropertyNotify:
                                case SelectionRequest:
       -                                ledit_window_clipboard_event(view->window, &event);
       +                                window_clipboard_event(view->window, &event);
                                        break;
                                default:
                                        break;
       t@@ -151,7 +154,7 @@ mainloop(void) {
                        };
        
                        for (size_t i = 0; i < buffer->views_num; i++) {
       -                        ledit_window_handle_filtered_events(buffer->views[i]->window);
       +                        window_handle_filtered_events(buffer->views[i]->window);
                        }
        
                        if (change_kbd) {
       t@@ -229,12 +232,12 @@ setup(int argc, char *argv[]) {
                common.depth = DefaultDepth(common.dpy, common.screen);
                common.cm = DefaultColormap(common.dpy, common.screen);
        
       -        theme = ledit_theme_create(&common);
       -        buffer = ledit_buffer_create(&common);
       +        theme = theme_create(&common);
       +        buffer = buffer_create(&common);
                /* FIXME: Support multiple buffers/files */
                if (argc > 1) {
                        char *load_err;
       -                if (ledit_buffer_load_file(buffer, argv[1], 0, &load_err)) {
       +                if (buffer_load_file(buffer, argv[1], 0, &load_err)) {
                                fprintf(stderr, "Error opening file '%s': %s\n", argv[1], load_err);
                                ledit_cleanup();
                                exit(1);
       t@@ -242,7 +245,7 @@ setup(int argc, char *argv[]) {
                        /* FIXME: encapsulate */
                        buffer->filename = ledit_strdup(argv[1]);
                }
       -        ledit_buffer_add_view(buffer, theme, NORMAL, 0, 0);
       +        buffer_add_view(buffer, theme, NORMAL, 0, 0);
                /* FIXME: don't access view directly here */
                ledit_view *view = buffer->views[0];
                view_set_line_cursor_attrs(view, view->cur_line, view->cur_index);
       t@@ -253,12 +256,12 @@ setup(int argc, char *argv[]) {
        void
        ledit_cleanup(void) {
                /* FIXME: check for other things to clean up */
       -        ledit_search_cleanup();
       +        search_cleanup();
                basic_key_cleanup();
                if (buffer)
       -                ledit_buffer_destroy(buffer);
       +                buffer_destroy(buffer);
                if (theme)
       -                ledit_theme_destroy(&common, theme);
       +                theme_destroy(&common, theme);
                XCloseDisplay(common.dpy);
        }
        
   DIR diff --git a/search.c b/search.c
       t@@ -26,19 +26,19 @@ enum {
        } last_dir = FORWARD;
        
        void
       -ledit_search_cleanup(void) {
       +search_cleanup(void) {
                free(last_search);
        }
        
        void
       -ledit_set_search_forward(char *pattern) {
       +set_search_forward(char *pattern) {
                last_dir = FORWARD;
                free(last_search);
                last_search = ledit_strdup(pattern);
        }
        
        void
       -ledit_set_search_backward(char *pattern) {
       +set_search_backward(char *pattern) {
                last_dir = BACKWARD;
                free(last_search);
                last_search = ledit_strdup(pattern);
       t@@ -55,16 +55,16 @@ search_forward(ledit_view *view, size_t *line_ret, size_t *byte_ret) {
                   note: since the string ends with '\0', this is always valid */
                size_t byte = view->cur_index + 1;
                char *res;
       -        ledit_line *lline = ledit_buffer_get_line(view->buffer, line);
       -        ledit_buffer_normalize_line(lline);
       +        ledit_line *lline = buffer_get_line(view->buffer, line);
       +        buffer_normalize_line(lline);
                if ((res = strstr(lline->text + byte, last_search)) != NULL) {
                        *line_ret = line;
                        *byte_ret = (size_t)(res - lline->text);
                        return SEARCH_NORMAL;
                }
                for (size_t i = line + 1; i < view->lines_num; i++) {
       -                lline = ledit_buffer_get_line(view->buffer, i);
       -                ledit_buffer_normalize_line(lline);
       +                lline = buffer_get_line(view->buffer, i);
       +                buffer_normalize_line(lline);
                        if ((res = strstr(lline->text, last_search)) != NULL) {
                                *line_ret = i;
                                *byte_ret = (size_t)(res - lline->text);
       t@@ -72,16 +72,16 @@ search_forward(ledit_view *view, size_t *line_ret, size_t *byte_ret) {
                        }
                }
                for (size_t i = 0; i < line; i++) {
       -                lline = ledit_buffer_get_line(view->buffer, i);
       -                ledit_buffer_normalize_line(lline);
       +                lline = buffer_get_line(view->buffer, i);
       +                buffer_normalize_line(lline);
                        if ((res = strstr(lline->text, last_search)) != NULL) {
                                *line_ret = i;
                                *byte_ret = (size_t)(res - lline->text);
                                return SEARCH_WRAPPED;
                        }
                }
       -        lline = ledit_buffer_get_line(view->buffer, line);
       -        ledit_buffer_normalize_line(lline);
       +        lline = buffer_get_line(view->buffer, line);
       +        buffer_normalize_line(lline);
                if ((res = strstr(lline->text, last_search)) != NULL) {
                        *line_ret = line;
                        *byte_ret = (size_t)(res - lline->text);
       t@@ -100,8 +100,8 @@ search_backward(ledit_view *view, size_t *line_ret, size_t *byte_ret) {
                        return SEARCH_NO_PATTERN;
                size_t line = view->cur_line;
                size_t byte = view->cur_index;
       -        ledit_line *lline = ledit_buffer_get_line(view->buffer, line);
       -        ledit_buffer_normalize_line(lline);
       +        ledit_line *lline = buffer_get_line(view->buffer, line);
       +        buffer_normalize_line(lline);
                char *last = NULL, *res = lline->text;
                while ((res = strstr(res, last_search)) != NULL && res < lline->text + byte) {
                        last = res;
       t@@ -114,8 +114,8 @@ search_backward(ledit_view *view, size_t *line_ret, size_t *byte_ret) {
                        return SEARCH_NORMAL;
                }
                for (size_t i = line; i > 0; i--) {
       -                lline = ledit_buffer_get_line(view->buffer, i-1);
       -                ledit_buffer_normalize_line(lline);
       +                lline = buffer_get_line(view->buffer, i-1);
       +                buffer_normalize_line(lline);
                        res = lline->text;
                        while ((res = strstr(res, last_search)) != NULL) {
                                last = res;
       t@@ -128,8 +128,8 @@ search_backward(ledit_view *view, size_t *line_ret, size_t *byte_ret) {
                        }
                }
                for (size_t i = view->lines_num - 1; i > line; i--) {
       -                lline = ledit_buffer_get_line(view->buffer, i);
       -                ledit_buffer_normalize_line(lline);
       +                lline = buffer_get_line(view->buffer, i);
       +                buffer_normalize_line(lline);
                        res = lline->text;
                        while ((res = strstr(res, last_search)) != NULL) {
                                last = res;
       t@@ -141,8 +141,8 @@ search_backward(ledit_view *view, size_t *line_ret, size_t *byte_ret) {
                                return SEARCH_WRAPPED;
                        }
                }
       -        lline = ledit_buffer_get_line(view->buffer, line);
       -        ledit_buffer_normalize_line(lline);
       +        lline = buffer_get_line(view->buffer, line);
       +        buffer_normalize_line(lline);
                res = lline->text + byte;
                while ((res = strstr(res, last_search)) != NULL) {
                        last = res;
       t@@ -173,7 +173,7 @@ ledit_search_prev(ledit_view *view, size_t *line_ret, size_t *byte_ret) {
        }
        
        char *
       -ledit_search_state_to_str(enum ledit_search_state state) {
       +search_state_to_str(enum ledit_search_state state) {
                switch (state) {
                        case SEARCH_WRAPPED:
                                return "Search wrapped";
   DIR diff --git a/search.h b/search.h
       t@@ -5,9 +5,9 @@ enum ledit_search_state {
                SEARCH_NO_PATTERN
        };
        
       -void ledit_search_cleanup(void);
       -void ledit_set_search_forward(char *pattern);
       -void ledit_set_search_backward(char *pattern);
       +void search_cleanup(void);
       +void set_search_forward(char *pattern);
       +void set_search_backward(char *pattern);
        enum ledit_search_state ledit_search_next(ledit_view *view, size_t *line_ret, size_t *byte_ret);
        enum ledit_search_state ledit_search_prev(ledit_view *view, size_t *line_ret, size_t *byte_ret);
       -char *ledit_search_state_to_str(enum ledit_search_state state);
       +char *search_state_to_str(enum ledit_search_state state);
   DIR diff --git a/theme.c b/theme.c
       t@@ -9,7 +9,7 @@
        #include "theme_config.h"
        
        ledit_theme *
       -ledit_theme_create(ledit_common *common) {
       +theme_create(ledit_common *common) {
                ledit_theme *theme = ledit_malloc(sizeof(ledit_theme));
                theme->scrollbar_width = SCROLLBAR_WIDTH;
                theme->scrollbar_step = SCROLLBAR_STEP;
       t@@ -26,7 +26,7 @@ ledit_theme_create(ledit_common *common) {
        }
        
        void
       -ledit_theme_destroy(ledit_common *common, ledit_theme *theme) {
       +theme_destroy(ledit_common *common, ledit_theme *theme) {
                XftColorFree(common->dpy, common->vis, common->cm, &theme->text_fg);
                XftColorFree(common->dpy, common->vis, common->cm, &theme->text_bg);
                XftColorFree(common->dpy, common->vis, common->cm, &theme->scrollbar_fg);
   DIR diff --git a/theme.h b/theme.h
       t@@ -12,5 +12,5 @@ typedef struct {
                const char *scrollbar_bg_hex;
        } ledit_theme;
        
       -ledit_theme *ledit_theme_create(ledit_common *common);
       -void ledit_theme_destroy(ledit_common *common, ledit_theme *theme);
       +ledit_theme *theme_create(ledit_common *common);
       +void theme_destroy(ledit_common *common, ledit_theme *theme);
   DIR diff --git a/undo.c b/undo.c
       t@@ -40,16 +40,16 @@ typedef struct {
                int mode_group;
        } undo_elem;
        
       -struct ledit_undo_stack {
       +struct undo_stack {
                /* FIXME: size_t? */
                int len, cur, cap;
                undo_elem *stack;
                int change_mode_group;
        };
        
       -ledit_undo_stack *
       -ledit_undo_stack_create(void) {
       -        ledit_undo_stack *undo = ledit_malloc(sizeof(ledit_undo_stack));
       +undo_stack *
       +undo_stack_create(void) {
       +        undo_stack *undo = ledit_malloc(sizeof(undo_stack));
                undo->len = undo->cap = 0;
                undo->cur = -1;
                undo->stack = NULL;
       t@@ -58,14 +58,14 @@ ledit_undo_stack_create(void) {
        }
        
        void
       -ledit_undo_stack_destroy(ledit_undo_stack *undo) {
       +undo_stack_destroy(undo_stack *undo) {
                free(undo->stack);
                free(undo);
        }
        
        /* FIXME: resize text buffers when they aren't needed anymore */
        static undo_elem *
       -push_undo_elem(ledit_undo_stack *undo) {
       +push_undo_elem(undo_stack *undo) {
                assert(undo->cur >= -1);
                undo->cur++;
                undo->len = undo->cur + 1;
       t@@ -82,20 +82,20 @@ push_undo_elem(ledit_undo_stack *undo) {
        }
        
        static undo_elem *
       -peek_undo_elem(ledit_undo_stack *undo) {
       +peek_undo_elem(undo_stack *undo) {
                if (undo->cur < 0)
                        return NULL;
                return &undo->stack[undo->cur];
        }
        
        void
       -ledit_change_mode_group(ledit_undo_stack *undo) {
       +undo_change_mode_group(undo_stack *undo) {
                undo->change_mode_group = 1;
        }
        
        static void
        push_undo(
       -    ledit_undo_stack *undo, txtbuf *text,
       +    undo_stack *undo, txtbuf *text,
            ledit_range insert_range,
            ledit_range cursor_range,
            int start_group,
       t@@ -118,8 +118,8 @@ push_undo(
        }
        
        void
       -ledit_push_undo_insert(
       -    ledit_undo_stack *undo, txtbuf *text,
       +undo_push_insert(
       +    undo_stack *undo, txtbuf *text,
            ledit_range insert_range, ledit_range cursor_range,
            int start_group, enum ledit_mode mode) {
                push_undo(
       t@@ -129,8 +129,8 @@ ledit_push_undo_insert(
        }
        
        void
       -ledit_push_undo_delete(
       -    ledit_undo_stack *undo, txtbuf *text,
       +undo_push_delete(
       +    undo_stack *undo, txtbuf *text,
            ledit_range insert_range, ledit_range cursor_range,
            int start_group, enum ledit_mode mode) {
                push_undo(
       t@@ -139,8 +139,8 @@ ledit_push_undo_delete(
                );
        }
        
       -ledit_undo_status
       -ledit_undo(ledit_undo_stack *undo, enum ledit_mode mode, void *callback_data,
       +undo_status
       +ledit_undo(undo_stack *undo, enum ledit_mode mode, void *callback_data,
            undo_insert_callback insert_cb, undo_delete_callback delete_cb,
            size_t *cur_line_ret, size_t *cur_index_ret, size_t *min_line_ret) {
                undo_elem *e;
       t@@ -209,8 +209,8 @@ ledit_undo(ledit_undo_stack *undo, enum ledit_mode mode, void *callback_data,
                return UNDO_NORMAL;
        }
        
       -ledit_undo_status
       -ledit_redo(ledit_undo_stack *undo, enum ledit_mode mode, void *callback_data,
       +undo_status
       +ledit_redo(undo_stack *undo, enum ledit_mode mode, void *callback_data,
            undo_insert_callback insert_cb, undo_delete_callback delete_cb,
            size_t *cur_line_ret, size_t *cur_index_ret, size_t *min_line_ret) {
                undo_elem *e;
   DIR diff --git a/undo.h b/undo.h
       t@@ -2,32 +2,32 @@ typedef enum {
                UNDO_NORMAL,
                UNDO_OLDEST_CHANGE,
                UNDO_NEWEST_CHANGE
       -} ledit_undo_status;
       +} undo_status;
        
       -typedef struct ledit_undo_stack ledit_undo_stack;
       +typedef struct undo_stack undo_stack;
        typedef void (*undo_insert_callback)(void *, size_t, size_t, char *, size_t);
        typedef void (*undo_delete_callback)(void *, size_t, size_t, size_t, size_t);
        
       -ledit_undo_stack *ledit_undo_stack_create(void);
       -void ledit_undo_stack_destroy(ledit_undo_stack *undo);
       -void ledit_change_mode_group(ledit_undo_stack *undo);
       -void ledit_push_undo_insert(
       -    ledit_undo_stack *undo, txtbuf *text,
       +undo_stack *undo_stack_create(void);
       +void undo_stack_destroy(undo_stack *undo);
       +void undo_change_mode_group(undo_stack *undo);
       +void undo_push_insert(
       +    undo_stack *undo, txtbuf *text,
            ledit_range insert_range, ledit_range cursor_range,
            int start_group, enum ledit_mode mode
        );
       -void ledit_push_undo_delete(
       -    ledit_undo_stack *undo, txtbuf *text,
       +void undo_push_delete(
       +    undo_stack *undo, txtbuf *text,
            ledit_range insert_range, ledit_range cursor_range,
            int start_group, enum ledit_mode mode
        );
       -ledit_undo_status ledit_undo(
       -    ledit_undo_stack *undo, enum ledit_mode mode,
       +undo_status ledit_undo(
       +    undo_stack *undo, enum ledit_mode mode,
            void *callback_data, undo_insert_callback insert_cb, undo_delete_callback delete_cb,
            size_t *cur_line_ret, size_t *cur_index_ret, size_t *min_line_ret
        );
       -ledit_undo_status ledit_redo(
       -    ledit_undo_stack *undo, enum ledit_mode mode,
       +undo_status ledit_redo(
       +    undo_stack *undo, enum ledit_mode mode,
            void *callback_data, undo_insert_callback insert_cb, undo_delete_callback delete_cb,
            size_t *cur_line_ret, size_t *cur_index_ret, size_t *min_line_ret
        );
   DIR diff --git a/util.c b/util.c
       t@@ -13,7 +13,7 @@
        #include "util.h"
        
        ledit_draw *
       -ledit_draw_create(ledit_window *window, int w, int h) {
       +draw_create(ledit_window *window, int w, int h) {
                ledit_draw *draw = ledit_malloc(sizeof(ledit_draw));
                draw->w = w;
                draw->h = h;
       t@@ -27,7 +27,7 @@ ledit_draw_create(ledit_window *window, int w, int h) {
        }
        
        void
       -ledit_draw_grow(ledit_window *window, ledit_draw *draw, int w, int h) {
       +draw_grow(ledit_window *window, ledit_draw *draw, int w, int h) {
                /* FIXME: sensible default pixmap sizes here */
                /* FIXME: maybe shrink the pixmaps at some point */
                if (draw->w < w || draw->h < h) {
       t@@ -43,7 +43,7 @@ ledit_draw_grow(ledit_window *window, ledit_draw *draw, int w, int h) {
        }
        
        void
       -ledit_draw_destroy(ledit_window *window, ledit_draw *draw) {
       +draw_destroy(ledit_window *window, ledit_draw *draw) {
                XFreePixmap(window->common->dpy, draw->pixmap);
                XftDrawDestroy(draw->xftdraw);
                free(draw);
   DIR diff --git a/util.h b/util.h
       t@@ -6,6 +6,6 @@ typedef struct {
                int w, h;
        } ledit_draw;
        
       -ledit_draw *ledit_draw_create(ledit_window *window, int w, int h);
       -void ledit_draw_grow(ledit_window *window, ledit_draw *draw, int w, int h);
       -void ledit_draw_destroy(ledit_window *window, ledit_draw *draw);
       +ledit_draw *draw_create(ledit_window *window, int w, int h);
       +void draw_grow(ledit_window *window, ledit_draw *draw, int w, int h);
       +void draw_destroy(ledit_window *window, ledit_draw *draw);
   DIR diff --git a/view.c b/view.c
       t@@ -71,8 +71,8 @@ static void invalidate_layout_line_helper(void *data, size_t line);
        void
        view_set_mode(ledit_view *view, enum ledit_mode mode) {
                view->mode = mode;
       -        ledit_change_mode_group(view->buffer->undo);
       -        ledit_window_set_mode(view->window, mode);
       +        undo_change_mode_group(view->buffer->undo);
       +        window_set_mode(view->window, mode);
        }
        
        ledit_view *
       t@@ -88,13 +88,13 @@ view_create(ledit_buffer *buffer, ledit_theme *theme, enum ledit_mode mode, size
                ledit_view *view = ledit_malloc(sizeof(ledit_view));
                view->mode = mode;
                view->buffer = buffer;
       -        view->window = ledit_window_create(buffer->common, theme, mode);
       +        view->window = window_create(buffer->common, theme, mode);
                view->theme = theme;
                view->cache = cache_create(buffer->common->dpy);
                view->cur_action = (struct action){ACTION_NONE, NULL};
       -        ledit_window_set_scroll_callback(view->window, &view_scroll_handler, view);
       -        ledit_window_set_button_callback(view->window, &view_button_handler, view);
       -        ledit_window_set_resize_callback(view->window, &view_resize_textview, view);
       +        window_set_scroll_callback(view->window, &view_scroll_handler, view);
       +        window_set_button_callback(view->window, &view_button_handler, view);
       +        window_set_resize_callback(view->window, &view_resize_textview, view);
        
                view->lines = ledit_reallocarray(NULL, buffer->lines_cap, sizeof(ledit_view_line));
                view->lines_cap = buffer->lines_cap;
       t@@ -235,7 +235,7 @@ view_notify_delete_lines(ledit_view *view, size_t index1, size_t index2) {
        void
        view_destroy(ledit_view *view) {
                cache_destroy(view->cache);
       -        ledit_window_destroy(view->window);
       +        window_destroy(view->window);
                free(view->lines);
                free(view);
        }
       t@@ -269,7 +269,7 @@ get_pango_attributes(ledit_view *view, size_t start_byte, size_t end_byte) {
        /* this takes layout directly to possibly avoid infinite recursion */
        static void
        set_line_layout_attrs(ledit_view *view, size_t line, PangoLayout *layout) {
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                ledit_view_line *vl = view_get_line(view, line);
                PangoAttrList *list = NULL;
                if (view->sel_valid) {
       t@@ -375,7 +375,7 @@ view_render_line(ledit_view *view, size_t line_index) {
        static void
        init_line(ledit_view *view, ledit_view_line *line) {
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                line->view = view;
                line->w = text_w;
                line->h = 0;
       t@@ -429,7 +429,7 @@ view_recalc_line(ledit_view *view, size_t line) {
                        set_pango_text_and_highlight(view, line);
        
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                /* if height changed, set height of current line
                 * and adjust offsets of all lines following it */
                if (l->h_dirty) {
       t@@ -449,7 +449,7 @@ view_recalc_line(ledit_view *view, size_t line) {
                    l->y_offset + l->h >= view->display_offset) {
                        view->redraw = 1;
                }
       -        ledit_window_set_scroll_max(view->window, view->total_height);
       +        window_set_scroll_max(view->window, view->total_height);
                view_scroll(view, view->display_offset);
        }
        
       t@@ -459,7 +459,7 @@ void
        view_recalc_from_line(ledit_view *view, size_t line) {
                ledit_view_line *l = view_get_line(view, line);
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                long off = l->y_offset;
                if (off < view->display_offset + text_h)
                        view->redraw = 1;
       t@@ -472,7 +472,7 @@ view_recalc_from_line(ledit_view *view, size_t line) {
                        off += l->h;
                }
                view->total_height = off;
       -        ledit_window_set_scroll_max(view->window, view->total_height);
       +        window_set_scroll_max(view->window, view->total_height);
                view_scroll(view, view->display_offset);
        }
        
       t@@ -487,7 +487,7 @@ view_recalc_all_lines(ledit_view *view) {
        int
        view_line_visible(ledit_view *view, size_t index) {
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                ledit_view_line *l = view_get_line(view, index);
                return l->y_offset < view->display_offset + text_h &&
                       l->y_offset + l->h > view->display_offset;
       t@@ -498,7 +498,7 @@ view_line_visible(ledit_view *view, size_t index) {
        size_t
        view_next_cursor_pos(ledit_view *view, size_t line, size_t byte, int num) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                size_t c = line_byte_to_char(ll, byte);
                size_t cur_byte = byte;
                PangoLayout *layout = get_pango_layout(view, line);
       t@@ -507,11 +507,11 @@ view_next_cursor_pos(ledit_view *view, size_t line, size_t byte, int num) {
                if (num < 0)
                        return 0; /* FIXME: error */
                for (size_t i = 0; i < (size_t)num; i++) {
       -                cur_byte = ledit_line_next_utf8(ll, byte);
       +                cur_byte = line_next_utf8(ll, byte);
                        for (c++; c < (size_t)nattrs; c++) {
                                if (attrs[c].is_cursor_position)
                                        break;
       -                        cur_byte = ledit_line_next_utf8(ll, cur_byte);
       +                        cur_byte = line_next_utf8(ll, cur_byte);
                        }
                        if (cur_byte >= ll->len)
                                break;
       t@@ -522,7 +522,7 @@ view_next_cursor_pos(ledit_view *view, size_t line, size_t byte, int num) {
        size_t
        view_prev_cursor_pos(ledit_view *view, size_t line, size_t byte, int num) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                size_t c = line_byte_to_char(ll, byte);
                size_t cur_byte = byte;
                PangoLayout *layout = get_pango_layout(view, line);
       t@@ -531,11 +531,11 @@ view_prev_cursor_pos(ledit_view *view, size_t line, size_t byte, int num) {
                if (num < 0)
                        return 0; /* FIXME: error */
                for (int i = 0; i < num; i++) {
       -                cur_byte = ledit_line_prev_utf8(ll, cur_byte);
       +                cur_byte = line_prev_utf8(ll, cur_byte);
                        for (; c > 0; c--) {
                                if (attrs[c-1].is_cursor_position)
                                        break;
       -                        cur_byte = ledit_line_prev_utf8(ll, cur_byte);
       +                        cur_byte = line_prev_utf8(ll, cur_byte);
                        }
                        if (cur_byte <= 0)
                                break;
       t@@ -549,8 +549,8 @@ line_next_word(
            size_t line, size_t byte, size_t char_index, int wrapped_line,
            size_t *char_ret, size_t *byte_ret, size_t *real_byte_ret) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       -        int cur_byte = wrapped_line ? byte : ledit_line_next_utf8(ll, byte);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
       +        int cur_byte = wrapped_line ? byte : line_next_utf8(ll, byte);
                PangoLayout *layout = get_pango_layout(view, line);
                const PangoLogAttr *attrs =
                    pango_layout_get_log_attrs_readonly(layout, &nattrs);
       t@@ -561,7 +561,7 @@ line_next_word(
                                *byte_ret = cur_byte;
                                return 0;
                        }
       -                cur_byte = ledit_line_next_utf8(ll, cur_byte);
       +                cur_byte = line_next_utf8(ll, cur_byte);
                }
                return -1;
        }
       t@@ -572,8 +572,8 @@ line_prev_word(
            size_t line, size_t byte, size_t char_index,
            size_t *char_ret, size_t *byte_ret) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       -        size_t cur_byte = ledit_line_prev_utf8(ll, byte);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
       +        size_t cur_byte = line_prev_utf8(ll, byte);
                PangoLayout *layout = get_pango_layout(view, line);
                const PangoLogAttr *attrs =
                    pango_layout_get_log_attrs_readonly(layout, &nattrs);
       t@@ -586,7 +586,7 @@ line_prev_word(
                                *byte_ret = cur_byte;
                                return 0;
                        }
       -                cur_byte = ledit_line_prev_utf8(ll, cur_byte);
       +                cur_byte = line_prev_utf8(ll, cur_byte);
                }
                return -1;
        }
       t@@ -597,8 +597,8 @@ line_prev_bigword(
            size_t line, size_t byte, size_t char_index,
            size_t *char_ret, size_t *byte_ret) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       -        size_t cur_byte = ledit_line_prev_utf8(ll, byte);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
       +        size_t cur_byte = line_prev_utf8(ll, byte);
                PangoLayout *layout = get_pango_layout(view, line);
                const PangoLogAttr *attrs =
                    pango_layout_get_log_attrs_readonly(layout, &nattrs);
       t@@ -623,7 +623,7 @@ line_prev_bigword(
                                next_cursorc = i-1;
                                next_cursorb = cur_byte;
                        }
       -                cur_byte = ledit_line_prev_utf8(ll, cur_byte);
       +                cur_byte = line_prev_utf8(ll, cur_byte);
                }
                return -1;
        }
       t@@ -634,7 +634,7 @@ line_next_bigword_end(
            size_t line, size_t byte, size_t char_index, int wrapped_line,
            size_t *char_ret, size_t *byte_ret, size_t *real_byte_ret) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                PangoLayout *layout = get_pango_layout(view, line);
                const PangoLogAttr *attrs =
                    pango_layout_get_log_attrs_readonly(layout, &nattrs);
       t@@ -663,7 +663,7 @@ line_next_bigword_end(
                                last_cursorb = cur_byte;
                                last_cursor_valid = 1;
                        }
       -                cur_byte = ledit_line_next_utf8(ll, cur_byte);
       +                cur_byte = line_next_utf8(ll, cur_byte);
                }
                return -1;
        }
       t@@ -674,8 +674,8 @@ line_next_word_end(
            size_t line, size_t byte, size_t char_index, int wrapped_line,
            size_t *char_ret, size_t *byte_ret, size_t *real_byte_ret) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       -        size_t cur_byte = ledit_line_next_utf8(ll, byte);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
       +        size_t cur_byte = line_next_utf8(ll, byte);
                PangoLayout *layout = get_pango_layout(view, line);
                const PangoLogAttr *attrs =
                    pango_layout_get_log_attrs_readonly(layout, &nattrs);
       t@@ -700,7 +700,7 @@ line_next_word_end(
                                last_cursorb = cur_byte;
                                last_cursor_valid = 1;
                        }
       -                cur_byte = ledit_line_next_utf8(ll, cur_byte);
       +                cur_byte = line_next_utf8(ll, cur_byte);
                }
                return -1;
        }
       t@@ -711,7 +711,7 @@ line_next_bigword(
            size_t line, size_t byte, size_t char_index, int wrapped_line,
            size_t *char_ret, size_t *byte_ret, size_t *real_byte_ret) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                size_t cur_byte = byte;
                PangoLayout *layout = get_pango_layout(view, line);
                const PangoLogAttr *attrs =
       t@@ -726,7 +726,7 @@ line_next_bigword(
                                *byte_ret = cur_byte;
                                return 0;
                        }
       -                cur_byte = ledit_line_next_utf8(ll, cur_byte);
       +                cur_byte = line_next_utf8(ll, cur_byte);
                }
                return -1;
        }
       t@@ -734,7 +734,7 @@ line_next_bigword(
        size_t
        view_line_next_non_whitespace(ledit_view *view, size_t line, size_t byte) {
                int nattrs;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                size_t c = line_byte_to_char(ll, byte);
                size_t cur_byte = byte;
                PangoLayout *layout = get_pango_layout(view, line);
       t@@ -743,7 +743,7 @@ view_line_next_non_whitespace(ledit_view *view, size_t line, size_t byte) {
                for (; c < (size_t)nattrs; c++) {
                        if (!attrs[c].is_white)
                                return cur_byte;
       -                cur_byte = ledit_line_next_utf8(ll, cur_byte);
       +                cur_byte = line_next_utf8(ll, cur_byte);
                }
                return ll->len;
        }
       t@@ -758,7 +758,7 @@ view_next_##name(                                                               
            size_t *line_ret, size_t *byte_ret, size_t *real_byte_ret) {                           \
                size_t cur_line = line;                                                            \
                size_t cur_byte = byte;                                                            \
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);                        \
       +        ledit_line *ll = buffer_get_line(view->buffer, line);                              \
                size_t cur_char = line_byte_to_char(ll, byte);                                     \
                size_t real_byte = 0;                                                              \
                int last_ret = -1;                                                                 \
       t@@ -777,7 +777,7 @@ view_next_##name(                                                               
                }                                                                                  \
                if (last_ret == -1) {                                                              \
                        *line_ret = view->lines_num - 1;                                           \
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, view->lines_num - 1); \
       +                ledit_line *ll = buffer_get_line(view->buffer, view->lines_num - 1);       \
                        *byte_ret = view_get_legal_normal_pos(view, view->lines_num - 1, ll->len); \
                        *real_byte_ret = ll->len;                                                  \
                } else {                                                                           \
       t@@ -795,14 +795,14 @@ view_prev_##name(                                                               
            size_t *line_ret, size_t *byte_ret, size_t *real_byte_ret) {                           \
                size_t cur_line = line;                                                            \
                size_t cur_byte = byte;                                                            \
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);                        \
       +        ledit_line *ll = buffer_get_line(view->buffer, line);                              \
                size_t cur_char = line_byte_to_char(ll, byte);                                     \
                int last_ret = -1;                                                                 \
                for (int i = 0; i < num_repeat; i++) {                                             \
                        while ((last_ret = func(view, cur_line, cur_byte, cur_char,                \
                                &cur_char, &cur_byte)) == -1 && cur_line > 0) {                    \
                                cur_line--;                                                        \
       -                        ll = ledit_buffer_get_line(view->buffer, cur_line);                \
       +                        ll = buffer_get_line(view->buffer, cur_line);                      \
                                cur_byte = ll->len;                                                \
                        }                                                                          \
                        if (last_ret == -1 && cur_line == 0)                                       \
       t@@ -831,7 +831,7 @@ view_get_pos_softline_bounds(
            ledit_view *view, size_t line, size_t pos,
            size_t *start_byte_ret, size_t *end_byte_ret) {
                assert(line < view->lines_num);
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                assert(pos <= ll->len);
                PangoLayout *layout = get_pango_layout(view, line);
                int x, sli;
       t@@ -868,7 +868,7 @@ view_get_softline_count(ledit_view *view, size_t line) {
        int
        view_pos_to_softline(ledit_view *view, size_t line, size_t pos) {
                assert(line < view->lines_num);
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                assert(pos <= ll->len);
                PangoLayout *layout = get_pango_layout(view, line);
                int x, sli;
       t@@ -881,7 +881,7 @@ view_pos_to_softline(ledit_view *view, size_t line, size_t pos) {
        void
        view_get_cursor_pixel_pos(ledit_view *view, size_t line, size_t pos, int *x_ret, int *y_ret, int *h_ret) {
                assert(line < view->lines_num);
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                assert(pos <= ll->len);
                PangoLayout *layout = get_pango_layout(view, line);
                PangoRectangle strong, weak;
       t@@ -904,7 +904,7 @@ view_move_cursor_visually(ledit_view *view, size_t line, size_t pos, int movemen
                        err_overflow();
                /* FIXME: trailing */
                int trailing = 0;
       -        ledit_line *cur_line = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *cur_line = buffer_get_line(view->buffer, line);
                PangoLayout *layout = get_pango_layout(view, line);
                int tmp_index;
                int new_index = (int)pos, last_index = (int)pos;
       t@@ -942,7 +942,7 @@ view_move_cursor_visually(ledit_view *view, size_t line, size_t pos, int movemen
                /* FIXME: spaces at end of softlines are weird in normal mode */
                while (trailing > 0) {
                        trailing--;
       -                new_index = ledit_line_next_utf8(cur_line, new_index);
       +                new_index = line_next_utf8(cur_line, new_index);
                }
                if (new_index < 0)
                        new_index = 0;
       t@@ -965,7 +965,7 @@ ledit_line_word_boundaries(ledit_line *line, int byte, int *start_ret, int *end_
        static void
        set_pango_text_and_highlight(ledit_view *view, size_t line) {
                cache_layout *cl;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                ledit_view_line *vl = view_get_line(view, line);
                char old_valid = vl->cache_layout_valid;
                if (!vl->cache_layout_valid) {
       t@@ -983,7 +983,7 @@ set_pango_text_and_highlight(ledit_view *view, size_t line) {
                        pango_layout_set_wrap(cl->layout, PANGO_WRAP_WORD_CHAR);
                }
                if (vl->text_dirty || !old_valid) {
       -                ledit_buffer_normalize_line(ll);
       +                buffer_normalize_line(ll);
                        if (ll->len > INT_MAX)
                                err_overflow();
                        pango_layout_set_text(cl->layout, ll->text, (int)ll->len);
       t@@ -1064,10 +1064,10 @@ ledit_x_softline_to_pos(ledit_view *view, size_t line, int x, int softline, size
                /* if in insert mode, snap to the nearest border between graphemes */
                /* FIXME: add parameter for this instead of checking mode */
                if (view->mode == INSERT) {
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +                ledit_line *ll = buffer_get_line(view->buffer, line);
                        while (trailing > 0) {
                                trailing--;
       -                        *pos_ret = ledit_line_next_utf8(ll, *pos_ret);
       +                        *pos_ret = line_next_utf8(ll, *pos_ret);
                        }
                }
        }
       t@@ -1076,7 +1076,7 @@ size_t
        view_get_legal_normal_pos(ledit_view *view, size_t line, size_t pos) {
                /* move back one grapheme if at end of line */
                size_t ret = pos;
       -        ledit_line *ll = ledit_buffer_get_line(view->buffer, line);
       +        ledit_line *ll = buffer_get_line(view->buffer, line);
                if (pos == ll->len && pos > 0) {
                        int nattrs;
                        PangoLayout *layout = get_pango_layout(view, line);
       t@@ -1085,10 +1085,10 @@ view_get_legal_normal_pos(ledit_view *view, size_t line, size_t pos) {
                        if (nattrs < 2)
                                return 0;
                        size_t cur = nattrs - 2;
       -                ret = ledit_line_prev_utf8(ll, ret);
       +                ret = line_prev_utf8(ll, ret);
                        while (ret > 0 && cur > 0 && !attrs[cur].is_cursor_position) {
                                cur--;
       -                        ret = ledit_line_prev_utf8(ll, ret);
       +                        ret = line_prev_utf8(ll, ret);
                        }
                }
                return ret;
       t@@ -1113,7 +1113,7 @@ view_delete_range(
                size_t min = line_index1 < line_index2 ? line_index1 : line_index2;
                /* FIXME: a bit ugly to do this here */
                for (size_t i = 0; i < view->buffer->views_num; i++) {
       -                ledit_buffer_recalc_all_views_from_line(
       +                buffer_recalc_all_views_from_line(
                            view->buffer, min > 0 ? min - 1 : min
                        );
                }
       t@@ -1149,7 +1149,7 @@ view_delete_range_base(
                                l2 = line_index1;
                        }
                        size_t dell1 = l1, dell2 = l2;
       -                ledit_line *ll = ledit_buffer_get_line(view->buffer, line_index1);
       +                ledit_line *ll = buffer_get_line(view->buffer, line_index1);
                        ledit_pos_to_x_softline(view, line_index1, byte_index1, &x, &sl_useless);
                        if (l1 > 0 && l2 < view->lines_num - 1) {
                                rgl1 = l1;
       t@@ -1158,10 +1158,10 @@ view_delete_range_base(
                                rgb2 = 0;
                        } else if (l1 > 0) {
                                rgl1 = l1 - 1;
       -                        ll = ledit_buffer_get_line(view->buffer, rgl1);
       +                        ll = buffer_get_line(view->buffer, rgl1);
                                rgb1 = ll->len;
                                rgl2 = l2;
       -                        ll = ledit_buffer_get_line(view->buffer, rgl2);
       +                        ll = buffer_get_line(view->buffer, rgl2);
                                rgb2 = ll->len;
                        } else if (l2 < view->lines_num - 1) {
                                rgl1 = l1;
       t@@ -1172,11 +1172,11 @@ view_delete_range_base(
                                rgl1 = l1;
                                rgb1 = 0;
                                rgl2 = l2;
       -                        ll = ledit_buffer_get_line(view->buffer, rgl2);
       +                        ll = buffer_get_line(view->buffer, rgl2);
                                rgb2 = ll->len;
                        }
                        if (text_ret) {
       -                        ledit_buffer_copy_text_to_txtbuf(
       +                        buffer_copy_text_to_txtbuf(
                                    view->buffer, text_ret,
                                    rgl1, rgb1, rgl2, rgb2
                                );
       t@@ -1200,17 +1200,17 @@ view_delete_range_base(
                                new_line = l1;
                                new_byte = 0;
                                /* happens when all lines are deleted, so one line has to be cleared */
       -                        ll = ledit_buffer_get_line(view->buffer, l1);
       -                        ledit_buffer_delete_line_section_base(
       +                        ll = buffer_get_line(view->buffer, l1);
       +                        buffer_delete_line_section_base(
                                    view->buffer, l1, 0, ll->len
                                );
                        }
                        if (dell1 <= dell2) {
       -                        ledit_buffer_delete_line_entries_base(view->buffer, dell1, dell2);
       +                        buffer_delete_line_entries_base(view->buffer, dell1, dell2);
                        }
                } else if (delmode == DELETE_SOFTLINE) {
                        int x, softline1, softline2;
       -                ledit_line *line1 = ledit_buffer_get_line(view->buffer, line_index1);
       +                ledit_line *line1 = buffer_get_line(view->buffer, line_index1);
                        ledit_view_line *vline1 = view_get_line(view, line_index1);
                        ledit_pos_to_x_softline(view, line_index1, byte_index1, &x, &softline1);
                        if (line_index1 == line_index2) {
       t@@ -1242,7 +1242,7 @@ view_delete_range_base(
                                                /* note: logically, line_index1 - 1 must be >= 0 because
                                                   view->lines_num > 1 && line_index1 >= view->lines_num - 1 */
                                                new_line = line_index1 - 1;
       -                                        ledit_line *prevline = ledit_buffer_get_line(view->buffer, new_line);
       +                                        ledit_line *prevline = buffer_get_line(view->buffer, new_line);
                                                ledit_view_line *vprevline = view_get_line(view, new_line);
                                                if (vprevline->text_dirty)
                                                        set_pango_text_and_highlight(view, new_line);
       t@@ -1253,26 +1253,26 @@ view_delete_range_base(
                                                rgb2 = line1->len;
                                        }
                                        if (text_ret) {
       -                                        ledit_buffer_copy_text_to_txtbuf(
       +                                        buffer_copy_text_to_txtbuf(
                                                    view->buffer, text_ret,
                                                    rgl1, rgb1,
                                                    rgl2, rgb2
                                                );
                                        }
       -                                ledit_buffer_delete_line_entry_base(view->buffer, line_index1);
       +                                buffer_delete_line_entry_base(view->buffer, line_index1);
                                } else {
                                        assert(pl2->start_index + pl2->length >= pl1->start_index);
                                        rgl1 = rgl2 = line_index1;
                                        rgb1 = (size_t)pl1->start_index;
                                        rgb2 = (size_t)(pl2->start_index + pl2->length);
                                        if (text_ret) {
       -                                        ledit_buffer_copy_text_to_txtbuf(
       +                                        buffer_copy_text_to_txtbuf(
                                                    view->buffer, text_ret,
                                                    rgl1, rgb1,
                                                    rgl2, rgb2
                                                );
                                        }
       -                                ledit_buffer_delete_line_section_base(
       +                                buffer_delete_line_section_base(
                                            view->buffer, line_index1, rgb1, rgb2 - rgb1
                                        );
                                        if (l2 == vline1->softlines - 1 && line_index1 < view->lines_num - 1) {
       t@@ -1319,8 +1319,8 @@ view_delete_range_base(
                                        l2 = line_index1;
                                        b2 = byte_index1;
                                }
       -                        ledit_line *ll1 = ledit_buffer_get_line(view->buffer, l1);
       -                        ledit_line *ll2 = ledit_buffer_get_line(view->buffer, l2);
       +                        ledit_line *ll1 = buffer_get_line(view->buffer, l1);
       +                        ledit_line *ll2 = buffer_get_line(view->buffer, l2);
                                ledit_view_line *vl1 = view_get_line(view, l1);
                                ledit_view_line *vl2 = view_get_line(view, l2);
                                PangoLayout *layout1 = get_pango_layout(view, l1);
       t@@ -1336,20 +1336,20 @@ view_delete_range_base(
                                                rgb1 = 0;
                                                rgb2 = ll2->len;
                                                if (text_ret) {
       -                                                ledit_buffer_copy_text_to_txtbuf(
       +                                                buffer_copy_text_to_txtbuf(
                                                            view->buffer, text_ret,
                                                            rgl1, rgb1,
                                                            rgl2, rgb2
                                                        );
                                                }
       -                                        ledit_buffer_delete_line_section_base(view->buffer, l1, 0, ll1->len);
       -                                        ledit_buffer_delete_line_entries_base(view->buffer, l1 + 1, l2);
       +                                        buffer_delete_line_section_base(view->buffer, l1, 0, ll1->len);
       +                                        buffer_delete_line_entries_base(view->buffer, l1 + 1, l2);
                                                new_line = 0;
                                                new_byte = 0;
                                        } else {
                                                if (l2 == view->lines_num - 1) {
                                                        new_line = l1 - 1;
       -                                                ledit_line *new_lline = ledit_buffer_get_line(view->buffer, new_line);
       +                                                ledit_line *new_lline = buffer_get_line(view->buffer, new_line);
                                                        ledit_view_line *new_vline = view_get_line(view, new_line);
                                                        if (new_vline->text_dirty)
                                                                set_pango_text_and_highlight(view, new_line);
       t@@ -1369,13 +1369,13 @@ view_delete_range_base(
                                                        rgb2 = 0;
                                                }
                                                if (text_ret) {
       -                                                ledit_buffer_copy_text_to_txtbuf(
       +                                                buffer_copy_text_to_txtbuf(
                                                            view->buffer, text_ret,
                                                            rgl1, rgb1,
                                                            rgl2, rgb2
                                                        );
                                                }
       -                                        ledit_buffer_delete_line_entries_base(view->buffer, l1, l2);
       +                                        buffer_delete_line_entries_base(view->buffer, l1, l2);
                                        }
                                } else if (sl1 == 0) {
                                        rgl1 = l1;
       t@@ -1383,16 +1383,16 @@ view_delete_range_base(
                                        rgl2 = l2;
                                        rgb2 = (size_t)(pl2->start_index + pl2->length);
                                        if (text_ret) {
       -                                        ledit_buffer_copy_text_to_txtbuf(
       +                                        buffer_copy_text_to_txtbuf(
                                                    view->buffer, text_ret,
                                                    rgl1, rgb1,
                                                    rgl2, rgb2
                                                );
                                        }
       -                                ledit_buffer_delete_line_section_base(view->buffer, l2, 0, rgb2);
       +                                buffer_delete_line_section_base(view->buffer, l2, 0, rgb2);
                                        new_line = l1;
                                        ledit_x_softline_to_pos(view, l2, x, 0, &new_byte);
       -                                ledit_buffer_delete_line_entries_base(view->buffer, l1, l2 - 1);
       +                                buffer_delete_line_entries_base(view->buffer, l1, l2 - 1);
                                } else if (sl2 == vl2->softlines - 1) {
                                        rgl1 = l1;
                                        rgb1 = (size_t)pl1->start_index;
       t@@ -1409,14 +1409,14 @@ view_delete_range_base(
                                                );
                                        }
                                        if (text_ret) {
       -                                        ledit_buffer_copy_text_to_txtbuf(
       +                                        buffer_copy_text_to_txtbuf(
                                                    view->buffer, text_ret,
                                                    rgl1, rgb1,
                                                    rgl2, rgb2
                                                );
                                        }
       -                                ledit_buffer_delete_line_section_base(view->buffer, l1, rgb1, ll1->len - rgb1);
       -                                ledit_buffer_delete_line_entries_base(view->buffer, l1 + 1, l2);
       +                                buffer_delete_line_section_base(view->buffer, l1, rgb1, ll1->len - rgb1);
       +                                buffer_delete_line_entries_base(view->buffer, l1 + 1, l2);
                                } else {
                                        /* FIXME: this could be made nicer by just using the range to
                                           delete all in one go at the end */
       t@@ -1425,19 +1425,19 @@ view_delete_range_base(
                                        rgl2 = l2;
                                        rgb2 = (size_t)(pl2->start_index + pl2->length);
                                        if (text_ret) {
       -                                        ledit_buffer_copy_text_to_txtbuf(
       +                                        buffer_copy_text_to_txtbuf(
                                                    view->buffer, text_ret,
                                                    rgl1, rgb1,
                                                    rgl2, rgb2
                                                );
                                        }
       -                                ledit_buffer_delete_line_section_base(view->buffer, l1, rgb1, ll1->len - rgb1);
       -                                ledit_buffer_insert_text_from_line_base(
       +                                buffer_delete_line_section_base(view->buffer, l1, rgb1, ll1->len - rgb1);
       +                                buffer_insert_text_from_line_base(
                                            view->buffer,
                                            l1, rgb1, l2, rgb2,
                                            ll2->len - rgb2, NULL
                                        );
       -                                ledit_buffer_delete_line_entries_base(view->buffer, l1 + 1, l2);
       +                                buffer_delete_line_entries_base(view->buffer, l1 + 1, l2);
                                        new_line = l1;
                                        set_pango_text_and_highlight(view, l1);
                                        /* it's technically possible that the remaining part of the
       t@@ -1462,13 +1462,13 @@ view_delete_range_base(
                                        rgb2 = byte_index1;
                                }
                                if (text_ret) {
       -                                ledit_buffer_copy_text_to_txtbuf(
       +                                buffer_copy_text_to_txtbuf(
                                            view->buffer, text_ret,
                                            rgl1, rgb1,
                                            rgl2, rgb2
                                        );
                                }
       -                        ledit_buffer_delete_line_section_base(view->buffer, line_index1, rgb1, rgb2 - rgb1);
       +                        buffer_delete_line_section_base(view->buffer, line_index1, rgb1, rgb2 - rgb1);
                                new_line = line_index1;
                                new_byte = rgb1;
                        } else {
       t@@ -1484,21 +1484,21 @@ view_delete_range_base(
                                        rgb2 = byte_index1;
                                }
                                if (text_ret) {
       -                                ledit_buffer_copy_text_to_txtbuf(
       +                                buffer_copy_text_to_txtbuf(
                                            view->buffer, text_ret,
                                            rgl1, rgb1,
                                            rgl2, rgb2
                                        );
                                }
       -                        ledit_line *line1 = ledit_buffer_get_line(view->buffer, rgl1);
       -                        ledit_line *line2 = ledit_buffer_get_line(view->buffer, rgl2);
       -                        ledit_buffer_delete_line_section_base(view->buffer, rgl1, rgb1, line1->len - rgb1);
       -                        ledit_buffer_insert_text_from_line_base(
       +                        ledit_line *line1 = buffer_get_line(view->buffer, rgl1);
       +                        ledit_line *line2 = buffer_get_line(view->buffer, rgl2);
       +                        buffer_delete_line_section_base(view->buffer, rgl1, rgb1, line1->len - rgb1);
       +                        buffer_insert_text_from_line_base(
                                    view->buffer, rgl1, rgb1, rgl2, rgb2, line2->len - rgb2, NULL
                                );
                                new_line = rgl1;
                                new_byte = rgb1;
       -                        ledit_buffer_delete_line_entries_base(view->buffer, rgl1 + 1, rgl2);
       +                        buffer_delete_line_entries_base(view->buffer, rgl1 + 1, rgl2);
                        }
                        /* FIXME: too much magic - maybe don't include this here */
                        if (view->mode == NORMAL)
       t@@ -1522,7 +1522,7 @@ view_resize_textview(void *data) {
                ledit_view *view = (ledit_view *)data;
                view->total_height = 0;
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                for (size_t i = 0; i < view->lines_num; i++) {
                        ledit_view_line *line = view_get_line(view, i);
                        line->w = text_w;
       t@@ -1533,7 +1533,7 @@ view_resize_textview(void *data) {
                        line->h_dirty = 0;
                        view->total_height += line->h;
                }
       -        ledit_window_set_scroll_max(view->window, view->total_height);
       +        window_set_scroll_max(view->window, view->total_height);
                if (view->display_offset > 0 &&
                    view->display_offset + text_h > view->total_height) {
                        view_scroll(view, view->total_height - text_h);
       t@@ -1543,13 +1543,13 @@ view_resize_textview(void *data) {
        void
        view_scroll(ledit_view *view, long new_offset) {
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                if (new_offset + text_h > view->total_height)
                        new_offset = view->total_height - text_h;
                if (new_offset < 0)
                        new_offset = 0;
                view->display_offset = new_offset;
       -        ledit_window_set_scroll_pos(view->window, view->display_offset);
       +        window_set_scroll_pos(view->window, view->display_offset);
        }
        
        /* FIXME: there's gotta be a better/more efficient way to do this... */
       t@@ -1563,7 +1563,7 @@ view_get_nearest_legal_pos(
                PangoRectangle strong, weak;
                int text_w, text_h;
                int x, sl_useless;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                ledit_view_line *vline = view_get_line(view, line);
                PangoLayout *layout = get_pango_layout(view, line);
                if (byte > INT_MAX)
       t@@ -1669,10 +1669,10 @@ ledit_xy_to_line_byte(ledit_view *view, int x, int y, int snap_to_nearest, size_
                                );
                                *byte_ret = (size_t)index;
                                if (snap_to_nearest) {
       -                                ledit_line *ll = ledit_buffer_get_line(view->buffer, i);
       +                                ledit_line *ll = buffer_get_line(view->buffer, i);
                                        while (trailing > 0) {
                                                trailing--;
       -                                        *byte_ret = ledit_line_next_utf8(ll, *byte_ret);
       +                                        *byte_ret = line_next_utf8(ll, *byte_ret);
                                        }
                                }
                                *line_ret = i;
       t@@ -1686,7 +1686,7 @@ static void
        scroll_to_pos(ledit_view *view, size_t line, size_t byte, int top) {
                PangoRectangle strong, weak;
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                ledit_view_line *vl = view_get_line(view, line);
                PangoLayout *layout = get_pango_layout(view, line);
                if (byte > INT_MAX)
       t@@ -1714,7 +1714,7 @@ void
        view_ensure_cursor_shown(ledit_view *view) {
                PangoRectangle strong, weak;
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
                ledit_view_line *vline = view_get_line(view, view->cur_line);
                PangoLayout *layout = get_pango_layout(view, view->cur_line);
                if (view->cur_index > INT_MAX)
       t@@ -1755,8 +1755,8 @@ view_sort_selection(size_t *line1, size_t *byte1, size_t *line2, size_t *byte2) 
        static void
        copy_selection_to_x_primary(ledit_view *view, size_t line1, size_t byte1, size_t line2, size_t byte2) {
                /* FIXME: let window handle this */
       -        txtbuf *primary = ledit_window_get_primary_clipboard_buffer();
       -        ledit_buffer_copy_text_to_txtbuf(view->buffer, primary, line1, byte1, line2, byte2);
       +        txtbuf *primary = window_get_primary_clipboard_buffer();
       +        buffer_copy_text_to_txtbuf(view->buffer, primary, line1, byte1, line2, byte2);
                XSetSelectionOwner(view->buffer->common->dpy, XA_PRIMARY, view->window->xwin, CurrentTime);
                /*
                FIXME
       t@@ -1889,7 +1889,8 @@ view_redraw_text(ledit_view *view) {
                int cur_line_y = 0;
                int cursor_displayed = 0;
                int text_w, text_h;
       -        ledit_window_get_textview_size(view->window, &text_w, &text_h);
       +        window_get_textview_size(view->window, &text_w, &text_h);
       +        /* FIXME: use binary search here */
                for (size_t i = 0; i < view->lines_num; i++) {
                        ledit_view_line *vline = view_get_line(view, i);
                        if (h + vline->h > view->display_offset) {
       t@@ -1931,7 +1932,7 @@ view_redraw_text(ledit_view *view) {
        
                XSetForeground(view->buffer->common->dpy, view->window->gc, view->theme->text_fg.pixel);
                PangoRectangle strong, weak;
       -        ledit_line *cur_line = ledit_buffer_get_line(view->buffer, view->cur_line);
       +        ledit_line *cur_line = buffer_get_line(view->buffer, view->cur_line);
                PangoLayout *layout = get_pango_layout(view, view->cur_line);
                pango_layout_get_cursor_pos(
                    layout, (int)view->cur_index, &strong, &weak
       t@@ -1999,16 +2000,16 @@ view_redraw_text(ledit_view *view) {
        void
        view_redraw(ledit_view *view) {
                if (view->redraw || view->window->redraw) {
       -                ledit_window_clear(view->window);
       +                window_clear(view->window);
                        view_redraw_text(view);
       -                ledit_window_redraw(view->window);
       +                window_redraw(view->window);
                }
        }
        
        static void
        undo_insert_helper(void *data, size_t line, size_t byte, char *text, size_t text_len) {
                ledit_view *view = (ledit_view *)data;
       -        ledit_buffer_insert_text_with_newlines_base(view->buffer, line, byte, text, text_len, NULL, NULL);
       +        buffer_insert_text_with_newlines_base(view->buffer, line, byte, text, text_len, NULL, NULL);
        }
        
        static void
       t@@ -2033,7 +2034,7 @@ view_undo(ledit_view *view) {
                view_wipe_line_cursor_attrs(view, old_line);
                view_set_line_cursor_attrs(view, view->cur_line, view->cur_index);
                if (min_line < view->lines_num) {
       -                ledit_buffer_recalc_all_views_from_line(
       +                buffer_recalc_all_views_from_line(
                            view->buffer, min_line > 0 ? min_line - 1 : min_line
                        );
                }
       t@@ -2056,7 +2057,7 @@ view_redo(ledit_view *view) {
                view_wipe_line_cursor_attrs(view, old_line);
                view_set_line_cursor_attrs(view, view->cur_line, view->cur_index);
                if (min_line < view->lines_num) {
       -                ledit_buffer_recalc_all_views_from_line(
       +                buffer_recalc_all_views_from_line(
                            view->buffer, min_line > 0 ? min_line - 1 : min_line
                        );
                }
       t@@ -2070,13 +2071,13 @@ paste_callback(void *data, char *text, size_t len) {
                ledit_range cur_range, ins_range;
                cur_range.line1 = ins_range.line1 = view->cur_line;
                cur_range.byte1 = ins_range.byte1 = view->cur_index;
       -        ledit_buffer_insert_text_with_newlines(
       +        buffer_insert_text_with_newlines(
                    view->buffer, view->cur_line, view->cur_index,
                    text, len, &view->cur_line, &view->cur_index
                );
                cur_range.line2 = ins_range.line2 = view->cur_line;
                cur_range.byte2 = ins_range.byte2 = view->cur_index;
       -        ledit_push_undo_insert(
       +        undo_push_insert(
                    view->buffer->undo, &ins_buf, ins_range, cur_range, 1, view->mode
                );
        }
       t@@ -2085,12 +2086,12 @@ paste_callback(void *data, char *text, size_t len) {
        
        void
        view_paste_clipboard(ledit_view *view) {
       -        ledit_window_set_paste_callback(view->window, &paste_callback, view);
       +        window_set_paste_callback(view->window, &paste_callback, view);
                clipboard_paste_clipboard(view->window);
        }
        
        void
        view_paste_primary(ledit_view *view) {
       -        ledit_window_set_paste_callback(view->window, &paste_callback, view);
       +        window_set_paste_callback(view->window, &paste_callback, view);
                clipboard_paste_primary(view->window);
        }
   DIR diff --git a/window.c b/window.c
       t@@ -57,7 +57,7 @@ static void clipboard_selnotify(ledit_window *window, XEvent *e);
        static void clipboard_selrequest(ledit_window *window, XEvent *e);
        
        txtbuf *
       -ledit_window_get_primary_clipboard_buffer(void) {
       +window_get_primary_clipboard_buffer(void) {
                /* FIXME: check if NULL */
                return xsel.primary;
        }
       t@@ -76,7 +76,7 @@ recalc_text_size(ledit_window *window) {
        
        /* FIXME: allow lines longer than window width to be displayed properly */
        void
       -ledit_window_insert_bottom_bar_text(ledit_window *window, char *text, int len) {
       +window_insert_bottom_bar_text(ledit_window *window, char *text, int len) {
                assert(len >= -1);
                assert(window->bb->line_cur_pos <= window->bb->line_len);
        
       t@@ -101,7 +101,7 @@ ledit_window_insert_bottom_bar_text(ledit_window *window, char *text, int len) {
                window->bb->line_text[window->bb->line_len] = '\0';
                pango_layout_set_text(window->bb->line, window->bb->line_text, window->bb->line_len);
                pango_layout_get_pixel_size(window->bb->line, &window->bb->line_w, &window->bb->line_h);
       -        ledit_draw_grow(window, window->bb->line_draw, window->bb->line_w, window->bb->line_h);
       +        draw_grow(window, window->bb->line_draw, window->bb->line_w, window->bb->line_h);
                XftDrawRect(window->bb->line_draw->xftdraw, &window->theme->text_bg, 0, 0, window->bb->line_w, window->bb->line_h);
                pango_xft_render_layout(window->bb->line_draw->xftdraw, &window->theme->text_fg, window->bb->line, 0, 0);
                recalc_text_size(window);
       t@@ -109,7 +109,7 @@ ledit_window_insert_bottom_bar_text(ledit_window *window, char *text, int len) {
        }
        
        void
       -ledit_window_move_bottom_bar_cursor(ledit_window *window, int movement) {
       +window_move_bottom_bar_cursor(ledit_window *window, int movement) {
                assert(window->bb->line_cur_pos <= window->bb->line_len);
                int trailing = 0;
                int new_index = window->bb->line_cur_pos;
       t@@ -135,25 +135,25 @@ ledit_window_move_bottom_bar_cursor(ledit_window *window, int movement) {
        }
        
        void
       -ledit_window_set_bottom_bar_min_pos(ledit_window *window, int pos) {
       +window_set_bottom_bar_min_pos(ledit_window *window, int pos) {
                window->bb->min_pos = pos;
        }
        
        void
       -ledit_window_bottom_bar_cursor_to_beginning(ledit_window *window) {
       +window_bottom_bar_cursor_to_beginning(ledit_window *window) {
                window->bb->line_cur_pos = window->bb->min_pos;
                window->redraw = 1;
        }
        
        void
       -ledit_window_bottom_bar_cursor_to_end(ledit_window *window) {
       +window_bottom_bar_cursor_to_end(ledit_window *window) {
                window->bb->line_cur_pos = window->bb->line_len;
                window->redraw = 1;
        }
        
        /* FIXME: respect PangoLogAttr.backspace_deletes_character */
        void
       -ledit_window_delete_bottom_bar_char(ledit_window *window, int dir) {
       +window_delete_bottom_bar_char(ledit_window *window, int dir) {
                int byte = window->bb->line_cur_pos;
                if (dir < 0) {
                        byte--;
       t@@ -189,7 +189,7 @@ ledit_window_delete_bottom_bar_char(ledit_window *window, int dir) {
                window->bb->line_text[window->bb->line_len] = '\0';
                pango_layout_set_text(window->bb->line, window->bb->line_text, window->bb->line_len);
                pango_layout_get_pixel_size(window->bb->line, &window->bb->line_w, &window->bb->line_h);
       -        ledit_draw_grow(window, window->bb->line_draw, window->bb->line_w, window->bb->line_h);
       +        draw_grow(window, window->bb->line_draw, window->bb->line_w, window->bb->line_h);
                XftDrawRect(window->bb->line_draw->xftdraw, &window->theme->text_bg, 0, 0, window->bb->line_w, window->bb->line_h);
                pango_xft_render_layout(window->bb->line_draw->xftdraw, &window->theme->text_fg, window->bb->line, 0, 0);
                recalc_text_size(window);
       t@@ -197,7 +197,7 @@ ledit_window_delete_bottom_bar_char(ledit_window *window, int dir) {
        }
        
        void
       -ledit_window_set_bottom_bar_cursor(ledit_window *window, int byte_pos) {
       +window_set_bottom_bar_cursor(ledit_window *window, int byte_pos) {
                /* FIXME: check if valid? */
                window->bb->line_cur_pos = byte_pos;
                window->redraw = 1;
       t@@ -209,7 +209,7 @@ ledit_window_get_bottom_bar_cursor(ledit_window *window) {
        }
        
        void
       -ledit_window_set_bottom_bar_text_shown(ledit_window *window, int shown) {
       +window_set_bottom_bar_text_shown(ledit_window *window, int shown) {
                window->bottom_text_shown = shown;
                window->redraw = 1;
        }
       t@@ -221,21 +221,21 @@ ledit_window_bottom_bar_text_shown(ledit_window *window) {
        }
        
        void
       -ledit_window_set_bottom_bar_text(ledit_window *window, char *text, int len) {
       +window_set_bottom_bar_text(ledit_window *window, char *text, int len) {
                window->bb->line_len = 0;
                window->bb->line_cur_pos = 0;
       -        ledit_window_insert_bottom_bar_text(window, text, len);
       +        window_insert_bottom_bar_text(window, text, len);
                window->redraw = 1;
        }
        
        char *
       -ledit_window_get_bottom_bar_text(ledit_window *window) {
       +window_get_bottom_bar_text(ledit_window *window) {
                return window->bb->line_text;
        }
        
        void
       -ledit_window_show_message(ledit_window *window, char *text, int len) {
       -        ledit_window_set_bottom_bar_text(window, text, len);
       +window_show_message(ledit_window *window, char *text, int len) {
       +        window_set_bottom_bar_text(window, text, len);
                /* FIXME: rename these */
                window->bottom_text_shown = 0;
                window->message_shown = 1;
       t@@ -243,18 +243,18 @@ ledit_window_show_message(ledit_window *window, char *text, int len) {
        }
        
        int
       -ledit_window_message_shown(ledit_window *window) {
       +window_message_shown(ledit_window *window) {
                return window->message_shown;
        }
        
        void
       -ledit_window_hide_message(ledit_window *window) {
       +window_hide_message(ledit_window *window) {
                window->message_shown = 0;
                window->redraw = 1;
        }
        
        void
       -ledit_window_set_mode(ledit_window *window, enum ledit_mode mode) {
       +window_set_mode(ledit_window *window, enum ledit_mode mode) {
                window->mode = mode;
                char *text;
                switch (mode) {
       t@@ -275,7 +275,7 @@ ledit_window_set_mode(ledit_window *window, enum ledit_mode mode) {
                pango_layout_set_text(window->bb->mode, final_text, -1);
                free(final_text);
                pango_layout_get_pixel_size(window->bb->mode, &window->bb->mode_w, &window->bb->mode_h);
       -        ledit_draw_grow(window, window->bb->mode_draw, window->bb->mode_w, window->bb->mode_h);
       +        draw_grow(window, window->bb->mode_draw, window->bb->mode_w, window->bb->mode_h);
                XftDrawRect(window->bb->mode_draw->xftdraw, &window->theme->text_bg, 0, 0, window->bb->mode_w, window->bb->mode_h);
                pango_xft_render_layout(window->bb->mode_draw->xftdraw, &window->theme->text_fg, window->bb->mode, 0, 0);
                recalc_text_size(window);
       t@@ -283,9 +283,9 @@ ledit_window_set_mode(ledit_window *window, enum ledit_mode mode) {
        }
        
        void
       -ledit_window_set_mode_extra_text(ledit_window *window, char *text) {
       +window_set_mode_extra_text(ledit_window *window, char *text) {
                window->mode_extra_text = ledit_strdup(text);
       -        ledit_window_set_mode(window, window->mode);
       +        window_set_mode(window, window->mode);
                window->redraw = 1;
        }
        
       t@@ -311,37 +311,37 @@ set_scroll_pos(ledit_window *window, double pos) {
        }
        
        void
       -ledit_window_set_scroll_max(ledit_window *window, long max) {
       +window_set_scroll_max(ledit_window *window, long max) {
                window->scroll_max = max;
                window->redraw = 1;
        }
        
        void
       -ledit_window_set_scroll_pos(ledit_window *window, long pos) {
       +window_set_scroll_pos(ledit_window *window, long pos) {
                window->scroll_offset = pos;
                window->redraw = 1;
        }
        
        void
       -ledit_window_set_scroll_callback(ledit_window *window, void (*cb)(void *, long), void *data) {
       +window_set_scroll_callback(ledit_window *window, void (*cb)(void *, long), void *data) {
                window->scroll_callback = cb;
                window->scroll_cb_data = data;
        }
        
        void
       -ledit_window_set_paste_callback(ledit_window *window, void (*cb)(void *, char *, size_t), void *data) {
       +window_set_paste_callback(ledit_window *window, void (*cb)(void *, char *, size_t), void *data) {
                window->paste_callback = cb;
                window->paste_cb_data = data;
        }
        
        void
       -ledit_window_set_button_callback(ledit_window *window, void (*cb)(void *, XEvent *), void *data) {
       +window_set_button_callback(ledit_window *window, void (*cb)(void *, XEvent *), void *data) {
                window->button_callback = cb;
                window->button_cb_data = data;
        }
        
        void
       -ledit_window_set_resize_callback(ledit_window *window, void (*cb)(void *), void *data) {
       +window_set_resize_callback(ledit_window *window, void (*cb)(void *), void *data) {
                window->resize_callback = cb;
                window->resize_cb_data = data;
        }
       t@@ -433,7 +433,7 @@ xximspot(ledit_window *window, int x, int y) {
        }
        
        ledit_window *
       -ledit_window_create(ledit_common *common, ledit_theme *theme, enum ledit_mode mode) {
       +window_create(ledit_common *common, ledit_theme *theme, enum ledit_mode mode) {
                XSetWindowAttributes attrs;
                XGCValues gcv;
        
       t@@ -500,10 +500,10 @@ ledit_window_create(ledit_common *common, ledit_theme *theme, enum ledit_mode mo
                window->bb->mode = pango_layout_new(window->context);
                pango_layout_set_font_description(window->bb->mode, window->font);
                /* FIXME: only create "dummy draw" at first and create with proper size when needed */
       -        window->bb->mode_draw = ledit_draw_create(window, 10, 10);
       +        window->bb->mode_draw = draw_create(window, 10, 10);
                window->bb->line = pango_layout_new(window->context);
                pango_layout_set_font_description(window->bb->line, window->font);
       -        window->bb->line_draw = ledit_draw_create(window, 10, 10);
       +        window->bb->line_draw = draw_create(window, 10, 10);
                window->bb->line_w = window->bb->line_h = 10;
                window->bb->line_text = NULL;
                window->bb->line_alloc = window->bb->line_len = 0;
       t@@ -554,13 +554,13 @@ ledit_window_create(ledit_common *common, ledit_theme *theme, enum ledit_mode mo
        }
        
        void
       -ledit_window_destroy(ledit_window *window) {
       +window_destroy(ledit_window *window) {
                /* FIXME: check what's still missing */
                g_object_unref(window->bb->mode);
                /*g_object_unref(window->bb->ruler);*/ /* FIXME: implement ruler */
                g_object_unref(window->bb->line);
       -        ledit_draw_destroy(window, window->bb->mode_draw);
       -        ledit_draw_destroy(window, window->bb->line_draw);
       +        draw_destroy(window, window->bb->mode_draw);
       +        draw_destroy(window, window->bb->line_draw);
        
                pango_font_description_free(window->font);
                /* FIXME: The pango documentation says that the context must be freed,
       t@@ -581,13 +581,13 @@ ledit_window_destroy(ledit_window *window) {
        }
        
        void
       -ledit_window_cleanup(void) {
       +window_cleanup(void) {
                txtbuf_destroy(xsel.primary);
                free(xsel.clipboard);
        }
        
        void
       -ledit_window_clear(ledit_window *window) {
       +window_clear(ledit_window *window) {
                XSetForeground(window->common->dpy, window->gc, window->theme->text_bg.pixel);
                XFillRectangle(
                    window->common->dpy, window->back_buf, window->gc, 0, 0, window->w, window->h
       t@@ -595,7 +595,7 @@ ledit_window_clear(ledit_window *window) {
        }
        
        void
       -ledit_window_redraw(ledit_window *window) {
       +window_redraw(ledit_window *window) {
                ledit_theme *t = window->theme;
                if (window->scroll_max > window->text_h) {
                        XSetForeground(window->common->dpy, window->gc, t->scrollbar_bg.pixel);
       t@@ -680,19 +680,19 @@ ledit_window_redraw(ledit_window *window) {
        }
        
        void
       -ledit_window_get_textview_size(ledit_window *window, int *w_ret, int *h_ret) {
       +window_get_textview_size(ledit_window *window, int *w_ret, int *h_ret) {
                *w_ret = window->text_w;
                *h_ret = window->text_h;
        }
        
        void
       -ledit_window_handle_filtered_events(ledit_window *window) {
       +window_handle_filtered_events(ledit_window *window) {
                struct timespec now, elapsed;
                if (window->last_motion_valid) {
                        clock_gettime(CLOCK_MONOTONIC, &now);
                        ledit_timespecsub(&now, &window->last_motion, &elapsed);
                        if (elapsed.tv_sec > 0 || elapsed.tv_nsec >= MOUSE_TICK) {
       -                        ledit_window_drag_motion(window, &window->last_motion_event);
       +                        window_drag_motion(window, &window->last_motion_event);
                                window->last_motion = now;
                                window->last_motion_valid = 0;
                        }
       t@@ -701,7 +701,7 @@ ledit_window_handle_filtered_events(ledit_window *window) {
                        clock_gettime(CLOCK_MONOTONIC, &now);
                        ledit_timespecsub(&now, &window->last_scroll, &elapsed);
                        if (elapsed.tv_sec > 0 || elapsed.tv_nsec >= MOUSE_TICK) {
       -                        ledit_window_button_press(window, &window->last_scroll_event, window->scroll_num);
       +                        window_button_press(window, &window->last_scroll_event, window->scroll_num);
                                window->last_scroll = now;
                                window->last_scroll_valid = 0;
                        }
       t@@ -710,7 +710,7 @@ ledit_window_handle_filtered_events(ledit_window *window) {
                        clock_gettime(CLOCK_MONOTONIC, &now);
                        ledit_timespecsub(&now, &window->last_resize, &elapsed);
                        if (elapsed.tv_sec > 0 || elapsed.tv_nsec >= RESIZE_TICK) {
       -                        ledit_window_resize(
       +                        window_resize(
                                    window,
                                    window->last_resize_event.xconfigure.width,
                                    window->last_resize_event.xconfigure.height
       t@@ -723,7 +723,7 @@ ledit_window_handle_filtered_events(ledit_window *window) {
        }
        
        void
       -ledit_window_resize(ledit_window *window, int w, int h) {
       +window_resize(ledit_window *window, int w, int h) {
                window->w = w;
                window->h = h;
                recalc_text_size(window);
       t@@ -908,7 +908,7 @@ clipboard_selrequest(ledit_window *window, XEvent *e)
        }
        
        void
       -ledit_window_register_button_press(ledit_window *window, XEvent *event) {
       +window_register_button_press(ledit_window *window, XEvent *event) {
                int scroll_delta;
                if (event->xbutton.button == Button4 ||
                    event->xbutton.button == Button5) {
       t@@ -921,25 +921,25 @@ ledit_window_register_button_press(ledit_window *window, XEvent *event) {
                                window->scroll_num = scroll_delta;
                        }
                } else {
       -                ledit_window_button_press(window, event, 0);
       +                window_button_press(window, event, 0);
                }
        }
        
        void
       -ledit_window_register_resize(ledit_window *window, XEvent *event) {
       +window_register_resize(ledit_window *window, XEvent *event) {
                window->last_resize_event = *event;
                window->last_resize_valid = 1;
        }
        
        void
       -ledit_window_register_motion(ledit_window *window, XEvent *event) {
       +window_register_motion(ledit_window *window, XEvent *event) {
                window->last_motion_event = *event;
                window->last_motion_valid = 1;
        }
        
        /* FIXME: improve set_scroll_pos; make it a bit clearer */
        void
       -ledit_window_button_press(ledit_window *window, XEvent *event, int scroll_num) {
       +window_button_press(ledit_window *window, XEvent *event, int scroll_num) {
                int x, y;
                double scroll_h, scroll_y;
                switch (event->xbutton.button) {
       t@@ -976,7 +976,7 @@ ledit_window_button_press(ledit_window *window, XEvent *event, int scroll_num) {
        }
        
        void
       -ledit_window_button_release(ledit_window *window, XEvent *event) {
       +window_button_release(ledit_window *window, XEvent *event) {
                if (event->xbutton.button == Button1) {
                        window->scroll_dragging = 0;
                        if (window->button_callback)
       t@@ -986,7 +986,7 @@ ledit_window_button_release(ledit_window *window, XEvent *event) {
        }
        
        void
       -ledit_window_drag_motion(ledit_window *window, XEvent *event) {
       +window_drag_motion(ledit_window *window, XEvent *event) {
                if (window->scroll_dragging) {
                        double scroll_h, scroll_y;
                        get_scroll_pos_height(window, &scroll_y, &scroll_h);
       t@@ -1002,7 +1002,7 @@ ledit_window_drag_motion(ledit_window *window, XEvent *event) {
        }
        
        void
       -ledit_window_clipboard_event(ledit_window *window, XEvent *event) {
       +window_clipboard_event(ledit_window *window, XEvent *event) {
                /* FIXME: paste in bottom bar */
                switch (event->type) {
                case SelectionNotify:
   DIR diff --git a/window.h b/window.h
       t@@ -59,53 +59,53 @@ typedef struct {
                char *mode_extra_text;
        } ledit_window;
        
       -ledit_window *ledit_window_create(ledit_common *common, ledit_theme *theme, enum ledit_mode mode);
       -void ledit_window_destroy(ledit_window *window);
       -void ledit_window_cleanup(void);
       +ledit_window *window_create(ledit_common *common, ledit_theme *theme, enum ledit_mode mode);
       +void window_destroy(ledit_window *window);
       +void window_cleanup(void);
        
        /* FIXME: this is a bit confusing because there's a difference between editable
           text shown and non-editable message shown */
       -void ledit_window_move_bottom_bar_cursor(ledit_window *window, int movement);
       -void ledit_window_delete_bottom_bar_char(ledit_window *window, int dir);
       -void ledit_window_bottom_bar_cursor_to_beginning(ledit_window *window);
       -void ledit_window_bottom_bar_cursor_to_end(ledit_window *window);
       -void ledit_window_set_bottom_bar_min_pos(ledit_window *window, int pos);
       -void ledit_window_set_bottom_bar_text_shown(ledit_window *window, int shown);
       +void window_move_bottom_bar_cursor(ledit_window *window, int movement);
       +void window_delete_bottom_bar_char(ledit_window *window, int dir);
       +void window_bottom_bar_cursor_to_beginning(ledit_window *window);
       +void window_bottom_bar_cursor_to_end(ledit_window *window);
       +void window_set_bottom_bar_min_pos(ledit_window *window, int pos);
       +void window_set_bottom_bar_text_shown(ledit_window *window, int shown);
        int ledit_window_bottom_bar_text_shown(ledit_window *window);
       -void ledit_window_set_bottom_bar_cursor(ledit_window *window, int byte_pos);
       +void window_set_bottom_bar_cursor(ledit_window *window, int byte_pos);
        int ledit_window_get_bottom_bar_cursor(ledit_window *window);
       -void ledit_window_insert_bottom_bar_text(ledit_window *window, char *text, int len);
       -void ledit_window_set_bottom_bar_text(ledit_window *window, char *text, int len);
       -char *ledit_window_get_bottom_bar_text(ledit_window *window);
       -void ledit_window_show_message(ledit_window *window, char *text, int len);
       -void ledit_window_hide_message(ledit_window *window);
       -int ledit_window_message_shown(ledit_window *window);
       -void ledit_window_set_mode(ledit_window *window, enum ledit_mode mode);
       -void ledit_window_set_mode_extra_text(ledit_window *window, char *text);
       +void window_insert_bottom_bar_text(ledit_window *window, char *text, int len);
       +void window_set_bottom_bar_text(ledit_window *window, char *text, int len);
       +char *window_get_bottom_bar_text(ledit_window *window);
       +void window_show_message(ledit_window *window, char *text, int len);
       +void window_hide_message(ledit_window *window);
       +int window_message_shown(ledit_window *window);
       +void window_set_mode(ledit_window *window, enum ledit_mode mode);
       +void window_set_mode_extra_text(ledit_window *window, char *text);
        
       -void ledit_window_set_scroll_max(ledit_window *window, long max);
       -void ledit_window_set_scroll_pos(ledit_window *window, long pos);
       -void ledit_window_set_scroll_callback(ledit_window *window, void (*cb)(void *, long), void *data);
       -void ledit_window_set_paste_callback(ledit_window *window, void (*cb)(void *, char *, size_t), void *data);
       -void ledit_window_set_button_callback(ledit_window *window, void (*cb)(void *, XEvent *), void *data);
       -void ledit_window_set_resize_callback(ledit_window *window, void (*cb)(void *), void *data);
       -void ledit_window_register_resize(ledit_window *window, XEvent *event);
       -void ledit_window_register_button_press(ledit_window *window, XEvent *event);
       -void ledit_window_register_motion(ledit_window *window, XEvent *event);
       -void ledit_window_handle_filtered_events(ledit_window *window);
       +void window_set_scroll_max(ledit_window *window, long max);
       +void window_set_scroll_pos(ledit_window *window, long pos);
       +void window_set_scroll_callback(ledit_window *window, void (*cb)(void *, long), void *data);
       +void window_set_paste_callback(ledit_window *window, void (*cb)(void *, char *, size_t), void *data);
       +void window_set_button_callback(ledit_window *window, void (*cb)(void *, XEvent *), void *data);
       +void window_set_resize_callback(ledit_window *window, void (*cb)(void *), void *data);
       +void window_register_resize(ledit_window *window, XEvent *event);
       +void window_register_button_press(ledit_window *window, XEvent *event);
       +void window_register_motion(ledit_window *window, XEvent *event);
       +void window_handle_filtered_events(ledit_window *window);
        
       -void ledit_window_clear(ledit_window *window);
       -void ledit_window_redraw(ledit_window *window);
       -void ledit_window_resize(ledit_window *window, int w, int h);
       -void ledit_window_get_textview_size(ledit_window *window, int *w_ret, int *h_ret);
       +void window_clear(ledit_window *window);
       +void window_redraw(ledit_window *window);
       +void window_resize(ledit_window *window, int w, int h);
       +void window_get_textview_size(ledit_window *window, int *w_ret, int *h_ret);
        
        void clipboard_primary_to_clipboard(ledit_window *window);
        void clipboard_paste_clipboard(ledit_window *window);
        void clipboard_paste_primary(ledit_window *window);
       -txtbuf *ledit_window_get_primary_clipboard_buffer(void);
       +txtbuf *window_get_primary_clipboard_buffer(void);
        
       -void ledit_window_button_press(ledit_window *window, XEvent *event, int scroll_num);
       -void ledit_window_button_release(ledit_window *window, XEvent *event);
       -void ledit_window_drag_motion(ledit_window *window, XEvent *event);
       -void ledit_window_clipboard_event(ledit_window *window, XEvent *event);
       +void window_button_press(ledit_window *window, XEvent *event, int scroll_num);
       +void window_button_release(ledit_window *window, XEvent *event);
       +void window_drag_motion(ledit_window *window, XEvent *event);
       +void window_clipboard_event(ledit_window *window, XEvent *event);
        void xximspot(ledit_window *window, int x, int y);