From 8c8b5b313e85cc3c13a1ebe33a6d718577d15a2f Mon Sep 17 00:00:00 2001
From: Junegunn Choi <junegunn.c@gmail.com>
Date: Sun, 25 Sep 2016 04:12:44 +0900
Subject: [PATCH] Add preview-page-up and preview-page-down actions

---
 src/options.go  |  4 ++++
 src/terminal.go | 27 ++++++++++++++++++---------
 2 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/src/options.go b/src/options.go
index 3b412f83..f586e5e0 100644
--- a/src/options.go
+++ b/src/options.go
@@ -667,6 +667,10 @@ func parseKeymap(keymap map[int]actionType, execmap map[int]string, str string)
 			keymap[key] = actPreviewUp
 		case "preview-down":
 			keymap[key] = actPreviewDown
+		case "preview-page-up":
+			keymap[key] = actPreviewPageUp
+		case "preview-page-down":
+			keymap[key] = actPreviewPageDown
 		default:
 			if isExecuteAction(actLower) {
 				var offset int
diff --git a/src/terminal.go b/src/terminal.go
index 9bb92629..2d7f4c6a 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -174,6 +174,8 @@ const (
 	actTogglePreview
 	actPreviewUp
 	actPreviewDown
+	actPreviewPageUp
+	actPreviewPageDown
 	actPreviousHistory
 	actNextHistory
 	actExecute
@@ -1123,6 +1125,11 @@ func (t *Terminal) Loop() {
 				req(reqInfo)
 			}
 		}
+		scrollPreview := func(amount int) {
+			t.previewer.offset = util.Constrain(
+				t.previewer.offset+amount, 0, t.previewer.lines-t.pwindow.Height)
+			req(reqPreviewRefresh)
+		}
 		for key, ret := range t.expect {
 			if keyMatch(key, event) {
 				t.pressed = ret
@@ -1171,15 +1178,19 @@ func (t *Terminal) Loop() {
 				return false
 			case actPreviewUp:
 				if t.isPreviewEnabled() {
-					t.previewer.offset = util.Constrain(
-						t.previewer.offset-1, 0, t.previewer.lines-t.pwindow.Height)
-					req(reqPreviewRefresh)
+					scrollPreview(-1)
 				}
 			case actPreviewDown:
 				if t.isPreviewEnabled() {
-					t.previewer.offset = util.Constrain(
-						t.previewer.offset+1, 0, t.previewer.lines-t.pwindow.Height)
-					req(reqPreviewRefresh)
+					scrollPreview(1)
+				}
+			case actPreviewPageUp:
+				if t.isPreviewEnabled() {
+					scrollPreview(-t.pwindow.Height)
+				}
+			case actPreviewPageDown:
+				if t.isPreviewEnabled() {
+					scrollPreview(t.pwindow.Height)
 				}
 			case actBeginningOfLine:
 				t.cx = 0
@@ -1350,9 +1361,7 @@ func (t *Terminal) Loop() {
 						t.vmove(me.S)
 						req(reqList)
 					} else if t.isPreviewEnabled() && t.pwindow.Enclose(my, mx) {
-						t.previewer.offset = util.Constrain(
-							t.previewer.offset-me.S, 0, t.previewer.lines-t.pwindow.Height)
-						req(reqPreviewRefresh)
+						scrollPreview(-me.S)
 					}
 				} else if t.window.Enclose(my, mx) {
 					mx -= t.window.Left
-- 
GitLab