diff --git a/cmd/micro/view.go b/cmd/micro/view.go index 489d7bb1..031d499f 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -37,7 +37,7 @@ type View struct { eh *EventHandler // Holds the list of gutter messages - messages []GutterMessage + messages map[string][]GutterMessage // The buffer Buf *Buffer @@ -92,6 +92,8 @@ func NewViewWidthHeight(buf *Buffer, w, h int) *View { v.eh = NewEventHandler(v) + v.messages = make(map[string][]GutterMessage) + v.sline = Statusline{ view: v, } @@ -165,6 +167,7 @@ func (v *View) OpenBuffer(buf *Buffer) { v: v, } v.Cursor.ResetSelection() + v.messages = make(map[string][]GutterMessage) v.eh = NewEventHandler(v) v.matches = Match(v) @@ -380,19 +383,26 @@ func (v *View) HandleEvent(event tcell.Event) { } // 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) +} + +func (v *View) ClearGutterMessages(section string) { + v.messages[section] = []GutterMessage{} } // DisplayView renders the view to the screen @@ -411,7 +421,13 @@ func (v *View) DisplayView() { } 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 } @@ -424,33 +440,35 @@ func (v *View) DisplayView() { } 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 + 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 GutterWarning: - if style, ok := colorscheme["gutter-warning"]; ok { - gutterStyle = style + 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 } - 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 { - messenger.Message(msg.msg) - messenger.gutterMessage = true } } } diff --git a/runtime/plugins/go/go.lua b/runtime/plugins/go/go.lua index b08ddac4..3500e8da 100644 --- a/runtime/plugins/go/go.lua +++ b/runtime/plugins/go/go.lua @@ -5,7 +5,10 @@ function go_onSave() elseif settings.GoFmt then go_gofmt() end + go_build() go_golint() + + view:ReOpen() end end @@ -13,37 +16,49 @@ function go_gofmt() local handle = io.popen("gofmt -w " .. view.Buf.Path) local result = handle:read("*a") handle:close() - - view:ReOpen() end function go_golint() + view:ClearGutterMessages("go-lint") + local handle = io.popen("golint " .. view.Buf.Path) - local result = go_split(handle:read("*a"), ":") + local lines = go_split(handle:read("*a"), "\n") handle:close() - local file = result[1] - local line = tonumber(result[2]) - local col = tonumber(result[3]) - local msg = result[4] + for _,line in ipairs(lines) do + local result = go_split(line, ":") + local line = tonumber(result[2]) + local msg = result[4] - view:ReOpen() - view:GutterMessage(line, msg, 2) + view:GutterMessage("go-lint", line, msg, 2) + end +end + +function go_build() + view:ClearGutterMessages("go-build") + + local handle = io.popen("go build " .. view.Buf.Path .. " 2>&1") + local lines = go_split(handle:read("*a"), "\n") + handle:close() + + messenger:Message(view.Buf.Path) + for _,line in ipairs(lines) do + local line, msg = string.match(line, ".+:(%d+):(.+)") + view:GutterMessage("go-build", tonumber(line), msg, 2) + end end function go_goimports() local handle = io.popen("goimports -w " .. view.Buf.Path) local result = go_split(handle:read("*a"), ":") handle:close() - - view:ReOpen() end function go_split(str, sep) - local result = {} - local regex = ("([^%s]+)"):format(sep) - for each in str:gmatch(regex) do - table.insert(result, each) - end - return result + local result = {} + local regex = ("([^%s]+)"):format(sep) + for each in str:gmatch(regex) do + table.insert(result, each) + end + return result end