From 36444976197b4e9941940fc920ff2b9a6ad80cdc Mon Sep 17 00:00:00 2001 From: Manuel Laflamme Date: Sun, 26 Oct 2025 10:53:14 -0400 Subject: [PATCH] Make PgUp and PgDown keys move to the previous/next page --- docs/usage.md | 2 ++ internal/app/lazytable.go | 42 ++++++++++++++++++++++++++++----------- internal/app/logstable.go | 2 ++ internal/keymap/keymap.go | 14 ++++++++++++- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 4183fc5..c2497f3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -11,6 +11,8 @@ | Ctrl+C | Exit | | F10 | Exit | | ↑↓ | Line Up / Down | +| PgUp | Page Up | +| PgDown | Page Down | | Home | Navigate to Start | | End | Navigate to End | | ? | Show/Hide help | diff --git a/internal/app/lazytable.go b/internal/app/lazytable.go index 65b8b4a..5199704 100644 --- a/internal/app/lazytable.go +++ b/internal/app/lazytable.go @@ -50,15 +50,19 @@ func (m lazyTableModel) Update(msg tea.Msg) (lazyTableModel, tea.Cmd) { var cmd tea.Cmd render := false + captureMessage := false switch msg := msg.(type) { case tea.KeyMsg: - m, render = m.handleKey(msg, render) + m, render, captureMessage = m.handleKey(msg, render) case EntriesUpdateMsg: m.entries = msg.Entries render = true } - m.table, cmd = m.table.Update(msg) + + if !captureMessage { + m.table, cmd = m.table.Update(msg) + } if m.table.Cursor() != m.lastCursor { render = true @@ -92,18 +96,20 @@ func (m lazyTableModel) getCellRenderer() func(table.Model, string, table.CellPo } } -func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel, bool) { +func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel, bool, bool) { + captureMessage := false // when true, the key message must not be forwarded to the inner table + // toggle the reverse display of items. if key.Matches(msg, m.keys.Reverse) { m.reverse = !m.reverse render = true } - // this function increases the viewport offset by 1 if possible. (scrolls down) - increaseOffset := func() { + // this function increases the viewport offset by n if possible. (scrolls down) + increaseOffset := func(n int) { maxOffset := max(m.entries.Len()-m.table.Height(), 0) - offset := min(m.offset+1, maxOffset) + offset := min(m.offset+n, maxOffset) if offset != m.offset { m.offset = offset render = true @@ -113,9 +119,9 @@ func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel, } } - // this function decreases the viewport offset by 1 if possible. (scrolls up) - decreaseOffset := func() { - offset := max(m.offset-1, 0) + // this function decreases the viewport offset by n if possible. (scrolls up) + decreaseOffset := func(n int) { + offset := max(m.offset-n, 0) if offset != m.offset { m.offset = offset render = true @@ -131,17 +137,29 @@ func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel, if key.Matches(msg, m.keys.Down) { m.follow = false if m.table.Cursor()+1 == m.table.Height() { - increaseOffset() // move the viewport + increaseOffset(1) // move the viewport } } if key.Matches(msg, m.keys.Up) { m.follow = false if m.table.Cursor() == 0 { - decreaseOffset() // move the viewport + decreaseOffset(1) // move the viewport } } + if key.Matches(msg, m.keys.PageDown) { + m.follow = false + increaseOffset(m.table.Height() - 1) // move the viewport + captureMessage = !m.follow + } + + if key.Matches(msg, m.keys.PageUp) { + m.follow = false + decreaseOffset(m.table.Height() - 1) // move the viewport + captureMessage = !m.follow + } + if key.Matches(msg, m.keys.GotoTop) { if m.reverse { // when follow is enabled, rendering will handle setting the offset to the correct value @@ -164,7 +182,7 @@ func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel, render = true } - return m, render + return m, render, captureMessage } func (m lazyTableModel) viewPortCursor() int { diff --git a/internal/app/logstable.go b/internal/app/logstable.go index 8145ac7..752cc5a 100644 --- a/internal/app/logstable.go +++ b/internal/app/logstable.go @@ -32,6 +32,8 @@ func newLogsTableModel( ) tableLogs.KeyMap.LineUp = application.keys.Up tableLogs.KeyMap.LineDown = application.keys.Down + tableLogs.KeyMap.PageUp = application.keys.PageUp + tableLogs.KeyMap.PageDown = application.keys.PageDown tableLogs.KeyMap.GotoBottom = application.keys.GotoBottom tableLogs.KeyMap.GotoTop = application.keys.GotoTop diff --git a/internal/keymap/keymap.go b/internal/keymap/keymap.go index 049518b..8905bbd 100644 --- a/internal/keymap/keymap.go +++ b/internal/keymap/keymap.go @@ -11,6 +11,8 @@ type KeyMap struct { Up key.Binding Reverse key.Binding Down key.Binding + PageUp key.Binding + PageDown key.Binding Filter key.Binding ToggleFullHelp key.Binding GotoTop key.Binding @@ -20,6 +22,7 @@ type KeyMap struct { // GetDefaultKeys returns default KeyMap. func GetDefaultKeys() KeyMap { + const spacebar = " " return KeyMap{ Exit: key.NewBinding( key.WithKeys("ctrl+c", "f10"), @@ -48,6 +51,14 @@ func GetDefaultKeys() KeyMap { key.WithKeys("down"), key.WithHelp("↓", "Down"), ), + PageUp: key.NewBinding( + key.WithKeys("pgup"), + key.WithHelp("pgup", "page up"), + ), + PageDown: key.NewBinding( + key.WithKeys("pgdown", spacebar), + key.WithHelp("pgdn", "page down"), + ), Filter: key.NewBinding( key.WithKeys("f"), key.WithHelp("f", "Filter"), @@ -69,7 +80,7 @@ func GetDefaultKeys() KeyMap { func (k KeyMap) ShortHelp() []key.Binding { return []key.Binding{ - k.Back, k.Open, k.Up, k.Down, k.ToggleFullHelp, + k.Back, k.Open, k.Up, k.Down, k.PageUp, k.PageDown, k.ToggleFullHelp, } } @@ -78,6 +89,7 @@ func (k KeyMap) FullHelp() [][]key.Binding { {k.Up, k.Down}, {k.Back, k.Open}, {k.Filter, k.Reverse}, + {k.PageUp, k.PageDown}, {k.GotoTop, k.GotoBottom}, {k.ToggleFullHelp, k.Exit}, }