From b09c2afba792282de34ed8865fd2a4ca53a48d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 28 Nov 2015 13:37:25 +0100 Subject: view: preserve column position when moving across lines --- view.c | 26 ++++++++++++++++++-------- 1 file 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) { -- cgit v1.2.3