feat: settings abstraction supports numbers

This commit is contained in:
Hayden Hargreaves 2026-02-13 16:10:43 -07:00
parent be46cae73d
commit d5f0f2413a
3 changed files with 58 additions and 32 deletions

View File

@ -1,7 +1,20 @@
package action package action
type Settings struct { type Settings struct {
Number bool
RelativeNumber bool
GutterSize int GutterSize int
TabSize int TabSize int
ScrollOff int ScrollOff int
// TODO: Colors
}
func NewDefaultSettings() Settings {
return Settings{
Number: true,
RelativeNumber: true,
GutterSize: 5,
TabSize: 2,
ScrollOff: 8,
}
} }

View File

@ -44,11 +44,7 @@ func NewModel(lines []string, pos action.Position) Model {
mode: action.NormalMode, mode: action.NormalMode,
command: "", command: "",
input: input.NewHandler(), input: input.NewHandler(),
settings: action.Settings{ settings: action.NewDefaultSettings(),
GutterSize: 5,
TabSize: 2,
ScrollOff: 8,
},
} }
} }

View File

@ -67,11 +67,15 @@ func (m Model) View() string {
if i < m.LineCount() { if i < m.LineCount() {
if m.Settings().Number || m.Settings().RelativeNumber {
var ( var (
gutter string gutter string
currentLine bool = false currentLine bool = false
lineNumber int lineNumber int
) )
if m.Settings().RelativeNumber {
// Relative line numbers: show distance from cursor, current line shows absolute
if i > m.CursorY() { if i > m.CursorY() {
lineNumber = i - m.CursorY() lineNumber = i - m.CursorY()
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber) gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber)
@ -79,15 +83,23 @@ func (m Model) View() string {
lineNumber = m.CursorY() - i lineNumber = m.CursorY() - i
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber) gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber)
} else { } else {
lineNumber = i + 1 // Current line: show absolute number if Number is also set, otherwise show 0
currentLine = true currentLine = true
if lineNumber < 100 { if m.Settings().Number {
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-2, lineNumber) lineNumber = i + 1
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber)
} else { } else {
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, 0)
}
}
} else if m.Settings().Number {
// Absolute line numbers only
lineNumber = i + 1
currentLine = (i == m.CursorY())
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber) gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber)
} }
}
view.WriteString(m.gutterStyle(currentLine).Render(gutter)) view.WriteString(m.gutterStyle(currentLine).Render(gutter))
}
runes := []rune(m.Line(i)) runes := []rune(m.Line(i))
for x := 0; x <= len(runes); x++ { for x := 0; x <= len(runes); x++ {
@ -111,8 +123,13 @@ func (m Model) View() string {
} }
} }
} else { } else {
// Empty lines beyond file content
if m.Settings().Number || m.Settings().RelativeNumber {
format := fmt.Sprintf("%%-%ds ", m.Settings().GutterSize-1) format := fmt.Sprintf("%%-%ds ", m.Settings().GutterSize-1)
fmt.Fprintf(&view, format, "~") fmt.Fprintf(&view, format, "~")
} else {
view.WriteString("~")
}
} }
view.WriteString("\n") view.WriteString("\n")