aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-04-07 14:33:49 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-04-08 10:44:22 +0200
commita2abb7d9c8df32f65f907452f292784d569e8e88 (patch)
tree20ca619bd560c6f53f6974d3e1efb41b5e967090
parentb9b6b8fb15f1a8986aa5195fbca0d89155ad768e (diff)
downloadvis-a2abb7d9c8df32f65f907452f292784d569e8e88.tar.gz
vis-a2abb7d9c8df32f65f907452f292784d569e8e88.tar.xz
vis: indicate primary cursor number in status bar
If there exist multiple cursors, [n/m] is added to the status bar. Meaning the n-th cursor out of the existing m cursors is currently the primary one.
-rw-r--r--ui-curses.c18
-rw-r--r--view.c29
-rw-r--r--view.h2
3 files changed, 35 insertions, 14 deletions
diff --git a/ui-curses.c b/ui-curses.c
index f6d4a43..d335995 100644
--- a/ui-curses.c
+++ b/ui-curses.c
@@ -641,15 +641,21 @@ static void ui_window_draw_status(UiWin *w) {
text_modified(vis_file_text(win->file)) ? "[+]" : "",
vis_macro_recording(vis) ? "recording": "");
+ char buf[4*32] = "", *msg = buf;
+ int cursor_count = view_cursors_count(win->view);
+ if (cursor_count > 1) {
+ Cursor *c = view_cursors_primary_get(win->view);
+ int cursor_number = view_cursors_number(c) + 1;
+ msg += sprintf(msg, "[%d/%d] ", cursor_number, cursor_count);
+ }
+
if (!(win->options & UI_OPTION_LARGE_FILE)) {
CursorPos pos = view_cursor_getpos(win->view);
- char buf[win->width + 1];
- int len = snprintf(buf, win->width, "%zd, %zd", pos.line, pos.col);
- if (len > 0) {
- buf[len] = '\0';
- mvwaddstr(win->winstatus, 0, win->width - len - 1, buf);
- }
+ msg += sprintf(msg, "%zd, %zd", pos.line, pos.col);
}
+
+ if (buf[0])
+ mvwaddstr(win->winstatus, 0, win->width - (msg - buf) - 1, buf);
}
static void ui_window_draw(UiWin *w) {
diff --git a/view.c b/view.c
index 9dbcc3e..ee6d5fb 100644
--- a/view.c
+++ b/view.c
@@ -59,8 +59,9 @@ struct Cursor { /* cursor position */
Mark lastsel_cursor;/* used to restore it */
Register reg; /* per cursor register to support yank/put operation */
int generation; /* used to filter out newly created cursors during iteration */
+ int number; /* how many cursors are located before this one */
View *view; /* associated view to which this cursor belongs */
- Cursor *prev, *next;/* previous/next cursors in no particular order */
+ Cursor *prev, *next;/* previous/next cursors ordered by location at creation time */
};
/* Viewable area, showing part of a file. Keeps track of cursors and selections.
@@ -79,6 +80,7 @@ struct View {
Line *lastline; /* last currently used line, always <= bottomline */
Line *bottomline; /* bottom of view, might be unused if lastline < bottomline */
Cursor *cursor; /* main cursor, always placed within the visible viewport */
+ int cursor_count; /* how many cursors do currently exist */
Line *line; /* used while drawing view content, line where next char will be drawn */
int col; /* used while drawing view content, column where next char will be drawn */
const SyntaxSymbol *symbols[SYNTAX_SYMBOL_LAST]; /* symbols to use for white spaces etc */
@@ -1066,6 +1068,7 @@ Cursor *view_cursors_new(View *view, size_t pos) {
if (!view->cursors) {
view->cursor = c;
view->cursors = c;
+ view->cursor_count = 1;
return c;
}
@@ -1090,15 +1093,21 @@ Cursor *view_cursors_new(View *view, size_t pos) {
if (pos == cur)
goto err;
+ for (Cursor *after = next; after; after = after->next)
+ after->number++;
+
c->prev = prev;
c->next = next;
- if (prev)
- prev->next = c;
if (next)
next->prev = c;
- if (!prev)
+ if (prev) {
+ prev->next = c;
+ c->number = prev->number + 1;
+ } else {
view->cursors = c;
+ }
view->cursor = c;
+ view->cursor_count++;;
view_cursors_to(c, pos);
return c;
err:
@@ -1107,10 +1116,11 @@ err:
}
int view_cursors_count(View *view) {
- int i = 0;
- for (Cursor *c = view->cursors; c; c = c->next)
- i++;
- return i;
+ return view->cursor_count;
+}
+
+int view_cursors_number(Cursor *c) {
+ return c->number;
}
int view_cursors_column_count(View *view) {
@@ -1174,6 +1184,8 @@ static void view_cursors_free(Cursor *c) {
if (!c)
return;
register_release(&c->reg);
+ for (Cursor *after = c->next; after; after = after->next)
+ after->number--;
if (c->prev)
c->prev->next = c->next;
if (c->next)
@@ -1182,6 +1194,7 @@ static void view_cursors_free(Cursor *c) {
c->view->cursors = c->next;
if (c->view->cursor == c)
c->view->cursor = c->next ? c->next : c->prev;
+ c->view->cursor_count--;
free(c);
}
diff --git a/view.h b/view.h
index fda953f..fd0c329 100644
--- a/view.h
+++ b/view.h
@@ -123,6 +123,8 @@ void view_cursor_to(View*, size_t pos);
Cursor *view_cursors_new(View*, size_t pos);
/* get number of active cursors */
int view_cursors_count(View*);
+/* get index/relative order at time of creation of a cursor [0,count-1] */
+int view_cursors_number(Cursor*);
/* exist there more than 1 cursor */
bool view_cursors_multiple(View*);
/* dispose an existing cursor with its associated selection (if any),