aboutsummaryrefslogtreecommitdiff
path: root/editor.c
diff options
context:
space:
mode:
Diffstat (limited to 'editor.c')
-rw-r--r--editor.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/editor.c b/editor.c
index 114c06e..ae2bc2d 100644
--- a/editor.c
+++ b/editor.c
@@ -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) {