vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit e3f7cc05e952b1f14c5311f32e47ab79d9721491 parent 12cdd40b06eff8fe27b0aae77a4baaa5a480ecea Author: Marc André Tanner <mat@brain-dump.org> Date: Wed, 15 Apr 2015 00:05:17 +0200 Try to remember column position when moving across lines This currently only works for non-wrapped lines. Diffstat:
| M | window.c | | | 17 | +++++++++++++++-- |
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/window.c b/window.c @@ -28,7 +28,9 @@ typedef struct { /* cursor position */ Filepos pos; /* in bytes from the start of the file */ + Filepos lastpos; /* previous cursor position */ int row, col; /* in terms of zero based screen coordinates */ + int lastcol; /* remembered column used when moving across lines */ Line *line; /* screen line on which cursor currently resides */ bool highlighted; /* true e.g. when cursor is on a bracket */ } Cursor; @@ -292,6 +294,9 @@ static size_t window_cursor_update(Win *win) { window_draw(win); } } + if (cursor->pos != cursor->lastpos) + cursor->lastcol = 0; + cursor->lastpos = cursor->pos; if (win->ui) win->ui->cursor_to(win->ui, cursor->col, cursor->row); return cursor->pos; @@ -753,19 +758,27 @@ size_t window_line_down(Win *win) { size_t window_screenline_up(Win *win) { Cursor *cursor = &win->cursor; + int lastcol = cursor->lastcol; + if (!lastcol) + lastcol = cursor->col; if (!cursor->line->prev) window_scroll_up(win, 1); if (cursor->line->prev) - window_cursor_set(win, cursor->line->prev, cursor->col); + window_cursor_set(win, cursor->line->prev, lastcol); + cursor->lastcol = lastcol; return cursor->pos; } size_t window_screenline_down(Win *win) { Cursor *cursor = &win->cursor; + int lastcol = cursor->lastcol; + if (!lastcol) + lastcol = cursor->col; if (!cursor->line->next && cursor->line == win->bottomline) window_scroll_down(win, 1); if (cursor->line->next) - window_cursor_set(win, cursor->line->next, cursor->col); + window_cursor_set(win, cursor->line->next, lastcol); + cursor->lastcol = lastcol; return cursor->pos; }