aboutsummaryrefslogtreecommitdiff
path: root/view.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2015-11-28 13:37:25 +0100
committerMarc André Tanner <mat@brain-dump.org>2015-11-28 20:09:14 +0100
commitb09c2afba792282de34ed8865fd2a4ca53a48d9d (patch)
tree3b52284bb0215419ba6c109323daaf27748b44d0 /view.c
parent51cd7471a0d6b7fc60fba5956b7ddc827e567776 (diff)
downloadvis-b09c2afba792282de34ed8865fd2a4ca53a48d9d.tar.gz
vis-b09c2afba792282de34ed8865fd2a4ca53a48d9d.tar.xz
view: preserve column position when moving across lines
Diffstat (limited to 'view.c')
-rw-r--r--view.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/view.c b/view.c
index d374bec..dfb4c57 100644
--- a/view.c
+++ b/view.c
@@ -830,20 +830,30 @@ size_t view_scroll_down(View *view, int lines) {
size_t view_line_up(Cursor *cursor) {
if (cursor->line && cursor->line->prev && cursor->line->prev->prev &&
- cursor->line->lineno != cursor->line->prev->lineno &&
- cursor->line->prev->lineno != cursor->line->prev->prev->lineno)
+ cursor->line->lineno != cursor->line->prev->lineno &&
+ cursor->line->prev->lineno != cursor->line->prev->prev->lineno)
return view_screenline_up(cursor);
- size_t pos = text_line_up(cursor->view->text, cursor->pos);
- view_cursors_to(cursor, pos);
- return pos;
+ int lastcol = cursor->lastcol;
+ if (!lastcol)
+ lastcol = cursor->col;
+ view_cursors_to(cursor, text_line_up(cursor->view->text, cursor->pos));
+ if (cursor->line)
+ cursor_set(cursor, cursor->line, lastcol);
+ cursor->lastcol = lastcol;
+ return cursor->pos;
}
size_t view_line_down(Cursor *cursor) {
if (cursor->line && (!cursor->line->next || cursor->line->next->lineno != cursor->line->lineno))
return view_screenline_down(cursor);
- size_t pos = text_line_down(cursor->view->text, cursor->pos);
- view_cursors_to(cursor, pos);
- return pos;
+ int lastcol = cursor->lastcol;
+ if (!lastcol)
+ lastcol = cursor->col;
+ view_cursors_to(cursor, text_line_down(cursor->view->text, cursor->pos));
+ if (cursor->line)
+ cursor_set(cursor, cursor->line, lastcol);
+ cursor->lastcol = lastcol;
+ return cursor->pos;
}
size_t view_screenline_up(Cursor *cursor) {