aboutsummaryrefslogtreecommitdiff
path: root/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'window.c')
-rw-r--r--window.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/window.c b/window.c
index d546780..47fad1a 100644
--- a/window.c
+++ b/window.c
@@ -788,6 +788,30 @@ size_t window_scroll_down(Win *win, int lines) {
return cursor->pos;
}
+size_t window_line_up(Win *win) {
+ Cursor *cursor = &win->cursor;
+ if (cursor->line->prev && cursor->line->prev->prev &&
+ cursor->line->lineno != cursor->line->prev->lineno &&
+ cursor->line->prev->lineno != cursor->line->prev->prev->lineno)
+ return window_screenline_up(win);
+ size_t bol = text_line_begin(win->text, cursor->pos);
+ size_t prev = text_line_prev(win->text, bol);
+ size_t pos = text_line_offset(win->text, prev, cursor->pos - bol);
+ window_cursor_to(win, pos);
+ return cursor->pos;
+}
+
+size_t window_line_down(Win *win) {
+ Cursor *cursor = &win->cursor;
+ if (!cursor->line->next || cursor->line->next->lineno != cursor->line->lineno)
+ return window_screenline_down(win);
+ size_t bol = text_line_begin(win->text, cursor->pos);
+ size_t next = text_line_next(win->text, bol);
+ size_t pos = text_line_offset(win->text, next, cursor->pos - bol);
+ window_cursor_to(win, pos);
+ return cursor->pos;
+}
+
size_t window_screenline_up(Win *win) {
Cursor *cursor = &win->cursor;
if (!cursor->line->prev)