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 {
GutterSize int Number bool
TabSize int RelativeNumber bool
ScrollOff int GutterSize int
TabSize int
ScrollOff int
// TODO: Colors
}
func NewDefaultSettings() Settings {
return Settings{
Number: true,
RelativeNumber: true,
GutterSize: 5,
TabSize: 2,
ScrollOff: 8,
}
} }

View File

@ -40,15 +40,11 @@ func NewModel(lines []string, pos action.Position) Model {
x: pos.Col, x: pos.Col,
y: pos.Line, y: pos.Line,
}, },
scrollY: 0, scrollY: 0,
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,27 +67,39 @@ func (m Model) View() string {
if i < m.LineCount() { if i < m.LineCount() {
var ( if m.Settings().Number || m.Settings().RelativeNumber {
gutter string var (
currentLine bool = false gutter string
lineNumber int currentLine bool = false
) lineNumber int
if i > m.CursorY() { )
lineNumber = i - m.CursorY()
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber) if m.Settings().RelativeNumber {
} else if i < m.CursorY() { // Relative line numbers: show distance from cursor, current line shows absolute
lineNumber = m.CursorY() - i if i > m.CursorY() {
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber) lineNumber = i - m.CursorY()
} else { gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber)
lineNumber = i + 1 } else if i < m.CursorY() {
currentLine = true lineNumber = m.CursorY() - i
if lineNumber < 100 { gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber)
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-2, lineNumber) } else {
} else { // Current line: show absolute number if Number is also set, otherwise show 0
currentLine = true
if m.Settings().Number {
lineNumber = i + 1
gutter = fmt.Sprintf("%*d ", m.Settings().GutterSize-1, lineNumber)
} 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 {
format := fmt.Sprintf("%%-%ds ", m.Settings().GutterSize-1) // Empty lines beyond file content
fmt.Fprintf(&view, format, "~") if m.Settings().Number || m.Settings().RelativeNumber {
format := fmt.Sprintf("%%-%ds ", m.Settings().GutterSize-1)
fmt.Fprintf(&view, format, "~")
} else {
view.WriteString("~")
}
} }
view.WriteString("\n") view.WriteString("\n")