import (
"bufio"
+ "bytes"
"fmt"
- "github.com/gdamore/tcell"
"os"
"strconv"
+
+ "github.com/zyedidia/tcell"
)
// TermMessage sends a message to the user in the terminal. This usually occurs before
// The function must be called when the screen is not initialized
// This will write the message, and wait for the user
// to press and key to continue
-func TermMessage(msg string) {
- fmt.Println(msg)
+func TermMessage(msg ...interface{}) {
+ screenWasNil := screen == nil
+ if !screenWasNil {
+ screen.Fini()
+ }
+
+ fmt.Println(msg...)
fmt.Print("\nPress enter to continue")
reader := bufio.NewReader(os.Stdin)
reader.ReadString('\n')
+
+ if !screenWasNil {
+ InitScreen()
+ }
}
// TermError sends an error to the user in the terminal. Like TermMessage except formatted
// We have to keep track of the cursor for prompting
cursorx int
+
+ // Is the current message a message from the gutter
+ gutterMessage bool
}
// Message sends a message to the user
-func (m *Messenger) Message(msg string) {
- m.message = msg
+func (m *Messenger) Message(msg ...interface{}) {
+ buf := new(bytes.Buffer)
+ fmt.Fprint(buf, msg...)
+ m.message = buf.String()
m.style = defStyle
if _, ok := colorscheme["message"]; ok {
}
// Error sends an error message to the user
-func (m *Messenger) Error(msg string) {
- m.message = msg
+func (m *Messenger) Error(msg ...interface{}) {
+ buf := new(bytes.Buffer)
+ fmt.Fprint(buf, msg...)
+ m.message = buf.String()
m.style = defStyle.
Foreground(tcell.ColorBlack).
Background(tcell.ColorMaroon)
}
// YesNoPrompt asks the user a yes or no question (waits for y or n) and returns the result
-func (m *Messenger) YesNoPrompt(prompt string) bool {
+func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) {
m.Message(prompt)
for {
switch e := event.(type) {
case *tcell.EventKey:
- if e.Key() == tcell.KeyRune {
+ switch e.Key() {
+ case tcell.KeyRune:
if e.Rune() == 'y' {
- return true
+ return true, false
} else if e.Rune() == 'n' {
- return false
+ return false, false
}
+ case tcell.KeyCtrlC, tcell.KeyCtrlQ, tcell.KeyEscape:
+ return false, true
}
}
}
if m.cursorx < Count(m.response) {
m.cursorx++
}
- case tcell.KeyBackspace2:
+ case tcell.KeyBackspace2, tcell.KeyBackspace:
if m.cursorx > 0 {
m.response = string([]rune(m.response)[:m.cursorx-1]) + string(m.response[m.cursorx:])
}
m.cursorx--
- case tcell.KeySpace:
- m.response += " "
- m.cursorx++
case tcell.KeyRune:
m.response = Insert(m.response, m.cursorx, string(e.Rune()))
m.cursorx++
screen.Show()
}
}
+
+// A GutterMessage is a message displayed on the side of the editor
+type GutterMessage struct {
+ lineNum int
+ msg string
+ kind int
+}
+
+// These are the different types of messages
+const (
+ // GutterInfo represents a simple info message
+ GutterInfo = iota
+ // GutterWarning represents a compiler warning
+ GutterWarning
+ // GutterError represents a compiler error
+ GutterError
+)