main.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "moose/internal/buffer"
  6. "moose/internal/editor"
  7. "strings"
  8. "github.com/gdamore/tcell/v3"
  9. )
  10. func main() {
  11. m := editor.NewModel()
  12. s, err := tcell.NewScreen()
  13. if err != nil {
  14. fmt.Println("moose: error: %v", err)
  15. os.Exit(1)
  16. }
  17. if err := s.Init(); err != nil {
  18. fmt.Println("moose: error: %v", err)
  19. os.Exit(1)
  20. }
  21. defStyle := tcell.StyleDefault.Background(tcell.ColorDefault).Foreground(tcell.ColorDefault)
  22. s.SetStyle(defStyle)
  23. s.EnableMouse()
  24. s.Clear()
  25. quit := func() {
  26. maybePanic := recover()
  27. s.Fini()
  28. if maybePanic != nil {
  29. panic(maybePanic)
  30. }
  31. }
  32. defer quit()
  33. for {
  34. s.Clear()
  35. if m.ShouldQuit {
  36. return
  37. }
  38. ev := <-s.EventQ()
  39. outer:
  40. switch ev := ev.(type) {
  41. case *tcell.EventResize:
  42. s.Sync()
  43. case *tcell.EventKey:
  44. for i := range m.Actions {
  45. action := m.Actions[i]
  46. if strings.ToLower(ev.Name()) == strings.ToLower(action.Binding) {
  47. action.Callback(&m, []string{})
  48. break outer
  49. }
  50. }
  51. if ev.Key() == tcell.KeyRune {
  52. for _, r := range ev.Str() {
  53. m.Buffer.Insert(r)
  54. }
  55. }
  56. }
  57. table := strings.SplitAfter(m.Buffer.String(), "\n")
  58. for i, line := range table {
  59. s.PutStrStyled(0, i, line, defStyle)
  60. }
  61. for _, cur := range m.Buffer.CM.Cursors {
  62. line, col := buffer.LineCol(m.Buffer.Rope, cur.Offset)
  63. s.SetContent(col, line, ' ', nil, tcell.StyleDefault.Reverse(true))
  64. }
  65. s.Show()
  66. }
  67. }