mirror of
https://github.com/zyedidia/micro.git
synced 2026-02-06 23:20:18 +09:00
Refine gutter messages and add go build checking to go plugin
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user