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