diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2015-06-30 11:13:17 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2015-06-30 11:13:17 +0200 |
| commit | 60fe132d6c59d54021091af8e5aa09fcd4704562 (patch) | |
| tree | 506249a4ebd7a09c0e2433c2a920c8c89a1ca4a8 /editor.c | |
| parent | 82a10e051c593e133554ce9675169fd68bb02ad7 (diff) | |
| download | vis-60fe132d6c59d54021091af8e5aa09fcd4704562.tar.gz vis-60fe132d6c59d54021091af8e5aa09fcd4704562.tar.xz | |
Cleanup insert/replace mode input handling
View should only display the file content, but not modify it.
Diffstat (limited to 'editor.c')
| -rw-r--r-- | editor.c | 61 |
1 files changed, 42 insertions, 19 deletions
@@ -5,6 +5,7 @@ #include <errno.h> #include "editor.h" #include "util.h" +#include "text-motions.h" static void file_free(Editor *ed, File *file); static File *file_new(Editor *ed, const char *filename); @@ -421,35 +422,57 @@ void editor_free(Editor *ed) { free(ed); } -void editor_insert_key(Editor *ed, const char *c, size_t len) { +void editor_insert(Editor *ed, size_t pos, const char *data, size_t len) { + text_insert(ed->win->file->text, pos, data, len); + editor_windows_invalidate(ed, pos, pos + len); +} + +void editor_insert_key(Editor *ed, const char *data, size_t len) { View *view = ed->win->view; - size_t start = view_cursor_get(view); - view_insert_key(view, c, len); - editor_windows_invalidate(ed, start, start + len); + size_t pos = view_cursor_get(view); + if (memchr(data, '\n', len) && view_cursor_viewpos(view).y+1 == view_height_get(view)) + view_viewport_down(view, 1); + editor_insert(ed, pos, data, len); + view_cursor_to(view, pos + len); +} + +void editor_replace(Editor *ed, size_t pos, const char *data, size_t len) { + size_t chars = 0; + for (size_t i = 0; i < len; i++) { + if (ISUTF8(data[i])) + chars++; + } + + Text *txt = ed->win->file->text; + Iterator it = text_iterator_get(txt, pos); + for (char c; chars-- > 0 && text_iterator_byte_get(&it, &c) && c != '\r' && c != '\n'; ) + text_iterator_char_next(&it, NULL); + + text_delete(txt, pos, it.pos - pos); + editor_insert(ed, pos, data, len); } -void editor_replace_key(Editor *ed, const char *c, size_t len) { +void editor_replace_key(Editor *ed, const char *data, size_t len) { View *view = ed->win->view; - size_t start = view_cursor_get(view); - view_replace_key(view, c, len); - editor_windows_invalidate(ed, start, start + 6); + size_t pos = view_cursor_get(view); + if (memchr(data, '\n', len) && view_cursor_viewpos(view).y+1 == view_height_get(view)) + view_viewport_down(view, 1); + editor_replace(ed, pos, data, len); + view_cursor_to(view, pos + len); } void editor_backspace_key(Editor *ed) { View *view = ed->win->view; + Text *txt = ed->win->file->text; size_t end = view_cursor_get(view); - size_t start = view_backspace_key(view); + size_t start = text_char_prev(txt, end); + if (view_viewport_get(view).start == end) { + view_viewport_up(view, 1); + view_cursor_to(view, end); + } + text_delete(txt, start, end-start); editor_windows_invalidate(ed, start, end); -} - -void editor_delete_key(Editor *ed) { - size_t start = view_delete_key(ed->win->view); - editor_windows_invalidate(ed, start, start + 6); -} - -void editor_insert(Editor *ed, size_t pos, const char *c, size_t len) { - text_insert(ed->win->file->text, pos, c, len); - editor_windows_invalidate(ed, pos, pos + len); + view_cursor_to(view, start); } void editor_delete(Editor *ed, size_t pos, size_t len) { |
