diff options
author | C. McEnroe | 2020-09-03 16:37:31 -0400 |
---|---|---|
committer | C. McEnroe | 2020-09-03 16:37:31 -0400 |
commit | 49e626b2f3b4b1eb984b53e94b57eb2ece69adeb (patch) | |
tree | b0148a8bb58c3b8b7eb768725e861fbaa9ca2436 | |
parent | dbc0c3ef4028ae4af2cb2d0a2088ba1e5cc2cd13 (diff) |
Add M-n, M-p to jump to highlights
-rw-r--r-- | catgirl.1 | 10 | ||||
-rw-r--r-- | ui.c | 22 |
2 files changed, 26 insertions, 6 deletions
diff --git a/catgirl.1 b/catgirl.1 index 6ae5d51..6e9f867 100644 --- a/catgirl.1 +++ b/catgirl.1 @@ -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 diff --git a/ui.c b/ui.c index 1e1f361..4178d8f 100644 --- a/ui.c +++ b/ui.c @@ -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); |