vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit af9b4dc53630c78fdf899e2ecd1fec17a01da582
parent 6a1df8e172c5e0ff818b4bf1ec467c3528557575
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Sat, 28 Nov 2015 13:37:25 +0100

view: preserve column position when moving across lines

Diffstat:
Mview.c | 26++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)

diff --git 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) {