1
1
mirror of https://github.com/walles/moar.git synced 2024-09-11 20:17:13 +03:00
moar/m/pagermode-viewing.go
Johan Walles a9d1ad542d Move gotoLineString to where it should be
It only lives as long as the GotoLine mode does, so it should be part of
that struct.
2024-01-09 17:28:49 +01:00

179 lines
4.1 KiB
Go

package m
import (
log "github.com/sirupsen/logrus"
"github.com/walles/moar/twin"
)
type PagerModeViewing struct {
pager *Pager
}
func (m PagerModeViewing) drawFooter(statusText string, spinner string) {
helpText := "Press 'ESC' / 'q' to exit, '/' to search, '?' for help"
if m.pager.isShowingHelp {
helpText = "Press 'ESC' / 'q' to exit help, '/' to search"
}
if m.pager.ShowStatusBar {
m.pager.setFooter(statusText + spinner + " " + helpText)
}
}
func (m PagerModeViewing) onKey(keyCode twin.KeyCode) {
p := m.pager
switch keyCode {
case twin.KeyEscape:
p.Quit()
case twin.KeyUp:
// Clipping is done in _Redraw()
p.scrollPosition = p.scrollPosition.PreviousLine(1)
p.handleScrolledUp()
case twin.KeyDown, twin.KeyEnter:
// Clipping is done in _Redraw()
p.scrollPosition = p.scrollPosition.NextLine(1)
p.handleScrolledDown()
case twin.KeyRight:
p.moveRight(p.SideScrollAmount)
case twin.KeyLeft:
p.moveRight(-p.SideScrollAmount)
case twin.KeyAltRight:
p.moveRight(1)
case twin.KeyAltLeft:
p.moveRight(-1)
case twin.KeyHome:
p.scrollPosition = newScrollPosition("Pager scroll position")
p.handleScrolledUp()
case twin.KeyEnd:
p.scrollToEnd()
case twin.KeyPgUp:
p.scrollPosition = p.scrollPosition.PreviousLine(p.visibleHeight())
p.handleScrolledUp()
case twin.KeyPgDown:
p.scrollPosition = p.scrollPosition.NextLine(p.visibleHeight())
p.handleScrolledDown()
default:
log.Debugf("Unhandled key event %v", keyCode)
}
}
func (m PagerModeViewing) onRune(char rune) {
p := m.pager
switch char {
case 'q':
p.Quit()
case '?':
if !p.isShowingHelp {
p.preHelpState = &_PreHelpState{
reader: p.reader,
scrollPosition: p.scrollPosition,
leftColumnZeroBased: p.leftColumnZeroBased,
targetLineNumber: p.TargetLineNumber,
}
p.reader = _HelpReader
p.scrollPosition = newScrollPosition("Pager scroll position")
p.leftColumnZeroBased = 0
p.TargetLineNumber = nil
p.isShowingHelp = true
}
case '=':
p.ShowStatusBar = !p.ShowStatusBar
// '\x10' = CTRL-p, should scroll up one line.
// Ref: https://github.com/walles/moar/issues/107#issuecomment-1328354080
case 'k', 'y', '\x10':
// Clipping is done in _Redraw()
p.scrollPosition = p.scrollPosition.PreviousLine(1)
p.handleScrolledUp()
// '\x0e' = CTRL-n, should scroll down one line.
// Ref: https://github.com/walles/moar/issues/107#issuecomment-1328354080
case 'j', 'e', '\x0e':
// Clipping is done in _Redraw()
p.scrollPosition = p.scrollPosition.NextLine(1)
p.handleScrolledDown()
case 'l':
// vim right
p.moveRight(p.SideScrollAmount)
case 'h':
// vim left
p.moveRight(-p.SideScrollAmount)
case '<':
p.scrollPosition = newScrollPosition("Pager scroll position")
p.handleScrolledUp()
case '>', 'G':
p.scrollToEnd()
case 'f', ' ':
p.scrollPosition = p.scrollPosition.NextLine(p.visibleHeight())
p.handleScrolledDown()
case 'b':
p.scrollPosition = p.scrollPosition.PreviousLine(p.visibleHeight())
p.handleScrolledUp()
// '\x15' = CTRL-u, should work like just 'u'.
// Ref: https://github.com/walles/moar/issues/90
case 'u', '\x15':
p.scrollPosition = p.scrollPosition.PreviousLine(p.visibleHeight() / 2)
p.handleScrolledUp()
// '\x04' = CTRL-d, should work like just 'd'.
// Ref: https://github.com/walles/moar/issues/90
case 'd', '\x04':
p.scrollPosition = p.scrollPosition.NextLine(p.visibleHeight() / 2)
p.handleScrolledDown()
case '/':
p.mode = PagerModeSearch{pager: p}
p.TargetLineNumber = nil
p.searchString = ""
p.searchPattern = nil
case 'g':
p.mode = &PagerModeGotoLine{pager: p}
p.TargetLineNumber = nil
// Should match the pagermode-not-found.go previous-search-hit bindings
case 'n':
p.scrollToNextSearchHit()
// Should match the pagermode-not-found.go next-search-hit bindings
case 'p', 'N':
p.scrollToPreviousSearchHit()
case 'm':
p.mode = PagerModeMark{pager: p}
p.TargetLineNumber = nil
case '\'':
p.mode = PagerModeJumpToMark{pager: p}
p.TargetLineNumber = nil
case 'w':
p.WrapLongLines = !p.WrapLongLines
default:
log.Debugf("Unhandled rune keypress '%s'/0x%08x", string(char), int32(char))
}
}