summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-09-03 16:37:31 -0400
committerJune McEnroe <june@causal.agency>2020-09-03 16:37:31 -0400
commit49e626b2f3b4b1eb984b53e94b57eb2ece69adeb (patch)
treeb0148a8bb58c3b8b7eb768725e861fbaa9ca2436
parentFix M-u behaviour difference before and after reflow (diff)
downloadcatgirl-49e626b2f3b4b1eb984b53e94b57eb2ece69adeb.tar.gz
catgirl-49e626b2f3b4b1eb984b53e94b57eb2ece69adeb.zip
Add M-n, M-p to jump to highlights
-rw-r--r--catgirl.110
-rw-r--r--ui.c22
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);