vis

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

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

commit ef0aceff8480099f15fa6a3308e19614ddc43840
parent 840bfd1a681753594549f1cc5843ce3c9e5d3370
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Fri, 27 Nov 2015 13:57:01 +0100

vis: improve cursor alignment command <C-a>

Diffstat:
Mmain.c | 13+++++++------
Mview.c | 11+++++++++++
Mview.h | 4++++
3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/main.c b/main.c @@ -1127,15 +1127,16 @@ static const char *cursors_align(Vis *vis, const char *keys, const Arg *arg) { Text *txt = vis_text(vis); int mincol = INT_MAX; for (Cursor *c = view_cursors(view); c; c = view_cursors_next(c)) { - size_t pos = view_cursors_pos(c); - int col = text_line_char_get(txt, pos); - if (col < mincol) + int col = view_cursors_cell_get(c); + if (col >= 0 && col < mincol) mincol = col; } for (Cursor *c = view_cursors(view); c; c = view_cursors_next(c)) { - size_t pos = view_cursors_pos(c); - size_t col = text_line_char_set(txt, pos, mincol); - view_cursors_to(c, col); + if (view_cursors_cell_set(c, mincol) == -1) { + size_t pos = view_cursors_pos(c); + size_t col = text_line_char_set(txt, pos, mincol); + view_cursors_to(c, col); + } } return keys; } diff --git a/view.c b/view.c @@ -1091,6 +1091,17 @@ size_t view_cursors_pos(Cursor *c) { return text_mark_get(c->view->text, c->mark); } +int view_cursors_cell_get(Cursor *c) { + return c->line ? c->col : -1; +} + +int view_cursors_cell_set(Cursor *c, int cell) { + if (!c->line || cell < 0) + return -1; + cursor_set(c, c->line, cell); + return c->col; +} + Register *view_cursors_register(Cursor *c) { return &c->reg; } diff --git a/view.h b/view.h @@ -136,6 +136,10 @@ Cursor *view_cursors_prev(Cursor*); Cursor *view_cursors_next(Cursor*); /* get current position of cursor in bytes from the start of the file */ size_t view_cursors_pos(Cursor*); +/* get/set zero based index of cell on which cursor currently resides, + * -1 if cursor is currently not visible */ +int view_cursors_cell_get(Cursor*); +int view_cursors_cell_set(Cursor*, int cell); /* place cursor at `pos' which should be in the interval [0, text-size] */ void view_cursors_to(Cursor*, size_t pos); void view_cursors_scroll_to(Cursor*, size_t pos);