import (
"io/ioutil"
+ "reflect"
+ "runtime"
"strconv"
"strings"
"time"
eh *EventHandler
// Holds the list of gutter messages
- messages []GutterMessage
+ messages map[string][]GutterMessage
// The buffer
Buf *Buffer
v.eh = NewEventHandler(v)
+ v.messages = make(map[string][]GutterMessage)
+
v.sline = Statusline{
view: v,
}
h--
v.width = int(float32(w) * float32(v.widthPercent) / 100)
// We subtract 1 for the statusline
- v.height = int(float32(h)*float32(v.heightPercent)/100) - 1
+ v.height = int(float32(h) * float32(v.heightPercent) / 100)
+ if settings["statusline"].(bool) {
+ // Make room for the status line if it is enabled
+ v.height--
+ }
}
// ScrollUp scrolls the view up n lines (if possible)
// causing them to lose the unsaved changes
// The message is what to print after saying "You have unsaved changes. "
func (v *View) CanClose(msg string) bool {
- if v.Buf.IsDirty() {
+ if v.Buf.IsModified {
quit, canceled := messenger.Prompt("You have unsaved changes. " + msg)
if !canceled {
if strings.ToLower(quit) == "yes" || strings.ToLower(quit) == "y" {
v: v,
}
v.Cursor.ResetSelection()
+ v.messages = make(map[string][]GutterMessage)
v.eh = NewEventHandler(v)
v.matches = Match(v)
for key, action := range bindings {
if e.Key() == key {
relocate = action(v)
+ for _, pl := range loadedPlugins {
+ funcName := strings.Split(runtime.FuncForPC(reflect.ValueOf(action).Pointer()).Name(), ".")
+ err := Call(pl + "_on" + funcName[len(funcName)-1])
+ if err != nil {
+ TermMessage(err)
+ }
+ }
}
}
}
// every time the user moves the cursor
relocate = false
case tcell.WheelUp:
- // Scroll up two lines
- v.ScrollUp(2)
+ // Scroll up
+ scrollSpeed := int(settings["scrollspeed"].(float64))
+ v.ScrollUp(scrollSpeed)
// We don't want to relocate if the user is scrolling
relocate = false
case tcell.WheelDown:
- // Scroll down two lines
- v.ScrollDown(2)
+ // Scroll down
+ scrollSpeed := int(settings["scrollspeed"].(float64))
+ v.ScrollDown(scrollSpeed)
// We don't want to relocate if the user is scrolling
relocate = false
}
}
// GutterMessage creates a message in this view's gutter
-func (v *View) GutterMessage(lineN int, msg string, kind int) {
+func (v *View) GutterMessage(section string, lineN int, msg string, kind int) {
+ lineN--
gutterMsg := GutterMessage{
lineNum: lineN,
msg: msg,
kind: kind,
}
- for _, gmsg := range v.messages {
- if gmsg.lineNum == lineN {
- return
+ for _, v := range v.messages {
+ for _, gmsg := range v {
+ if gmsg.lineNum == lineN {
+ return
+ }
}
}
- v.messages = append(v.messages, gutterMsg)
+ messages := v.messages[section]
+ v.messages[section] = append(messages, gutterMsg)
+}
+
+// ClearGutterMessages clears all gutter messages from a given section
+func (v *View) ClearGutterMessages(section string) {
+ v.messages[section] = []GutterMessage{}
+}
+
+// ClearAllGutterMessages clears all the gutter messages
+func (v *View) ClearAllGutterMessages() {
+ for k := range v.messages {
+ v.messages[k] = []GutterMessage{}
+ }
}
// DisplayView renders the view to the screen
}
var highlightStyle tcell.Style
- if len(v.messages) > 0 {
+ var hasGutterMessages bool
+ for _, v := range v.messages {
+ if len(v) > 0 {
+ hasGutterMessages = true
+ }
+ }
+ if hasGutterMessages {
v.lineNumOffset += 2
}
}
line := v.Buf.Lines[lineN+v.Topline]
- if len(v.messages) > 0 {
+ if hasGutterMessages {
msgOnLine := false
- for _, msg := range v.messages {
- if msg.lineNum == lineN+v.Topline {
- msgOnLine = true
- gutterStyle := tcell.StyleDefault
- switch msg.kind {
- case GutterInfo:
- if style, ok := colorscheme["gutter-info"]; ok {
- gutterStyle = style
- }
- case GutterWarning:
- if style, ok := colorscheme["gutter-warning"]; ok {
- gutterStyle = style
+ for k := range v.messages {
+ for _, msg := range v.messages[k] {
+ if msg.lineNum == lineN+v.Topline {
+ msgOnLine = true
+ gutterStyle := tcell.StyleDefault
+ switch msg.kind {
+ case GutterInfo:
+ if style, ok := colorscheme["gutter-info"]; ok {
+ gutterStyle = style
+ }
+ case GutterWarning:
+ if style, ok := colorscheme["gutter-warning"]; ok {
+ gutterStyle = style
+ }
+ case GutterError:
+ if style, ok := colorscheme["gutter-error"]; ok {
+ gutterStyle = style
+ }
}
- case GutterError:
- if style, ok := colorscheme["gutter-error"]; ok {
- gutterStyle = style
+ screen.SetContent(x, lineN, '>', nil, gutterStyle)
+ x++
+ screen.SetContent(x, lineN, '>', nil, gutterStyle)
+ x++
+ if v.Cursor.y == lineN+v.Topline {
+ messenger.Message(msg.msg)
+ messenger.gutterMessage = true
}
}
- screen.SetContent(x, lineN, '>', nil, gutterStyle)
- x++
- screen.SetContent(x, lineN, '>', nil, gutterStyle)
- x++
- if v.Cursor.y == lineN {
- messenger.Message(msg.msg)
- messenger.gutterMessage = true
- }
}
}
if !msgOnLine {
x++
screen.SetContent(x, lineN, ' ', nil, tcell.StyleDefault)
x++
- if v.Cursor.y == lineN && messenger.gutterMessage {
+ if v.Cursor.y == lineN+v.Topline && messenger.gutterMessage {
messenger.Reset()
messenger.gutterMessage = false
}
func (v *View) Display() {
v.DisplayView()
v.Cursor.Display()
- v.sline.Display()
+ if settings["statusline"].(bool) {
+ v.sline.Display()
+ }
}