]> git.lizzy.rs Git - micro.git/blob - micro.go
Really improve syntax file compatibility with nano
[micro.git] / micro.go
1 package main
2
3 import (
4         "fmt"
5         "github.com/gdamore/tcell"
6         "github.com/go-errors/errors"
7         "github.com/mattn/go-isatty"
8         "io/ioutil"
9         "os"
10 )
11
12 const (
13         tabSize = 4
14 )
15
16 func main() {
17         var input []byte
18         var filename string
19
20         if len(os.Args) > 1 {
21                 filename = os.Args[1]
22                 if _, err := os.Stat(filename); err == nil {
23                         var err error
24                         input, err = ioutil.ReadFile(filename)
25
26                         if err != nil {
27                                 fmt.Println(err)
28                                 os.Exit(1)
29                         }
30                 }
31         } else if !isatty.IsTerminal(os.Stdin.Fd()) {
32                 bytes, err := ioutil.ReadAll(os.Stdin)
33                 if err != nil {
34                         fmt.Println("Error reading stdin")
35                         os.Exit(1)
36                 }
37                 input = bytes
38         }
39
40         LoadSyntaxFiles()
41
42         s, e := tcell.NewScreen()
43         if e != nil {
44                 fmt.Fprintf(os.Stderr, "%v\n", e)
45                 os.Exit(1)
46         }
47         if e := s.Init(); e != nil {
48                 fmt.Fprintf(os.Stderr, "%v\n", e)
49                 os.Exit(1)
50         }
51
52         defer func() {
53                 if err := recover(); err != nil {
54                         s.Fini()
55                         fmt.Println("Micro encountered an error:", err)
56                         fmt.Print(errors.Wrap(err, 2).ErrorStack())
57                         os.Exit(1)
58                 }
59         }()
60
61         defStyle := tcell.StyleDefault.
62                 Background(tcell.ColorDefault).
63                 Foreground(tcell.ColorDefault)
64
65         s.SetStyle(defStyle)
66         s.EnableMouse()
67
68         v := NewView(NewBuffer(string(input), filename), s)
69
70         // Initially everything needs to be drawn
71         redraw := 2
72         for {
73                 if redraw == 2 {
74                         s.Clear()
75                         v.Display()
76                         v.cursor.Display()
77                         v.sl.Display()
78                         s.Show()
79                 } else if redraw == 1 {
80                         v.cursor.Display()
81                         v.sl.Display()
82                         s.Show()
83                 }
84
85                 event := s.PollEvent()
86
87                 switch e := event.(type) {
88                 case *tcell.EventKey:
89                         if e.Key() == tcell.KeyCtrlQ {
90                                 s.Fini()
91                                 os.Exit(0)
92                         }
93                 }
94
95                 redraw = v.HandleEvent(event)
96         }
97 }