Gim/internal/core/register.go
Hayden Hargreaves 10e37b82af
All checks were successful
Run Test Suite / test (push) Successful in 13s
feat: implemented the command window! Not tested. Maybe we need some?
2026-03-14 23:13:59 -07:00

106 lines
2.7 KiB
Go

package core
// RegisterType: Indicates how the register content should be interpreted when
// pasting. Charwise treats content as continuous text, linewise operates on
// complete lines, and blockwise represents rectangular selections.
type RegisterType int
const (
CharwiseRegister RegisterType = iota
LinewiseRegister
BlockwiseRegister
)
func (r RegisterType) ToString() string {
switch r {
case CharwiseRegister:
return "c"
case LinewiseRegister:
return "l"
case BlockwiseRegister:
return "b"
}
return "-"
}
// Register: Stores yanked or deleted text with metadata about how it should be
// pasted. The Type determines paste behavior and Content holds the text lines.
type Register struct {
Type RegisterType
Content []string
}
// DefaultRegisters: Creates and initializes the complete set of vim-style
// registers. Returns a map containing special registers (", *, _, etc.),
// named registers (a-z), and numbered registers (0-9).
func DefaultRegisters() map[rune]Register {
reg := make(map[rune]Register)
addSpecialRegisters(reg)
addNamedRegisters(reg)
addNumberedRegisters(reg)
return reg
}
// addNamedRegisters: Initializes the 26 named registers (a-z) used for explicit
// yank/delete operations. Users can target these with commands like "ayy or "ap.
func addNamedRegisters(reg map[rune]Register) {
name := 'a'
for name <= 'z' {
reg[name] = emptyRegister()
name++
}
}
// addNumberedRegisters: Initializes the numbered registers (0-9) which form the
// delete history. Register 0 holds the most recent yank, and 1-9 hold previous
// deletes in chronological order.
func addNumberedRegisters(reg map[rune]Register) {
name := '0'
for name <= '9' {
reg[name] = emptyRegister()
name++
}
}
// addSpecialRegisters: Initializes special-purpose registers with specific
// behaviors. Includes the unnamed register ("), black hole (_), clipboard (*),
// last insert (.), current filename (%), last command (:), and alternate file (#).
func addSpecialRegisters(reg map[rune]Register) {
// Unnamed (default)
reg['"'] = emptyRegister()
// Black hole (readonly)
reg['_'] = emptyRegister()
// System clipboard
reg['*'] = emptyRegister()
// Small delete? Expression?
// Last inserted text (readonly)
reg['.'] = emptyRegister()
// Current file name (readonly)
reg['%'] = emptyRegister()
// Last executed command (readonly)
reg[':'] = emptyRegister()
// Alternate (previous) file (readonly)
reg['#'] = emptyRegister()
}
// emptyRegister: Creates a new register initialized with charwise type and empty
// content. Used as the default state for all registers during initialization.
func emptyRegister() Register {
return Register{
Type: CharwiseRegister,
Content: []string{},
}
}