Add M-n, M-p to jump to highlights

master
C. McEnroe 2020-09-03 16:37:31 -04:00
parent dbc0c3ef40
commit 49e626b2f3
2 changed files with 26 additions and 6 deletions

View File

@ -1,4 +1,4 @@
.Dd August 20, 2020
.Dd September 3, 2020
.Dt CATGIRL 1
.Os
.
@ -473,6 +473,8 @@ Switch to previously selected window.
Scroll to top.
.It Ic M->
Scroll to bottom.
.It Ic M- Ns Ar n
Switch to window by number 0\(en9.
.It Ic M-a
Cycle through unread windows.
.It Ic M-l
@ -484,8 +486,10 @@ to return to
.Nm .
.It Ic M-m
Insert a blank line in the window.
.It Ic M- Ns Ar n
Switch to window by number 0\(en9.
.It Ic M-n
Scroll to next highlight.
.It Ic M-p
Scroll to previous highlight.
.It Ic M-u
Scroll to first unread line.
.It Ic M-v

22
ui.c
View File

@ -196,6 +196,8 @@ static short colorPair(short fg, short bg) {
X(KeyMetaF, "\33f", NULL) \
X(KeyMetaL, "\33l", NULL) \
X(KeyMetaM, "\33m", NULL) \
X(KeyMetaN, "\33n", NULL) \
X(KeyMetaP, "\33p", NULL) \
X(KeyMetaQ, "\33q", NULL) \
X(KeyMetaU, "\33u", NULL) \
X(KeyMetaV, "\33v", NULL) \
@ -499,9 +501,21 @@ static void windowScrollPage(struct Window *window, int n) {
windowScroll(window, n * (MAIN_LINES - SplitLines - MarkerLines - 1));
}
static void windowScrollUnread(struct Window *window) {
static void windowScrollTo(struct Window *window, int top) {
window->scroll = 0;
windowScroll(window, window->unreadHard - MAIN_LINES + MarkerLines);
windowScroll(window, top - MAIN_LINES + MarkerLines);
}
static void windowScrollHot(struct Window *window, int dir) {
size_t from = BufferCap - window->scroll - MAIN_LINES + MarkerLines + dir;
for (size_t i = from; i < BufferCap; i += dir) {
const struct Line *line = bufferHard(window->buffer, i);
const struct Line *prev = bufferHard(window->buffer, i - 1);
if (!line || line->heat < Hot) continue;
if (prev && prev->heat > Warm) continue;
windowScrollTo(window, BufferCap - i);
break;
}
}
struct Util uiNotifyUtil;
@ -823,8 +837,10 @@ static void keyCode(int code) {
break; case KeyMetaF: edit(id, EditNextWord, 0);
break; case KeyMetaL: bufferList(window->buffer);
break; case KeyMetaM: insertBlank(window);
break; case KeyMetaN: windowScrollHot(window, +1);
break; case KeyMetaP: windowScrollHot(window, -1);
break; case KeyMetaQ: edit(id, EditCollapse, 0);
break; case KeyMetaU: windowScrollUnread(window);
break; case KeyMetaU: windowScrollTo(window, window->unreadHard);
break; case KeyMetaV: windowScrollPage(window, +1);
break; case KEY_BACKSPACE: edit(id, EditDeletePrev, 0);