diff --git a/cmd/micro/action/actions.go b/cmd/micro/action/actions.go index a4e6e250..e41ad051 100644 --- a/cmd/micro/action/actions.go +++ b/cmd/micro/action/actions.go @@ -351,11 +351,6 @@ func (h *BufHandler) SelectToEnd() bool { // InsertNewline inserts a newline plus possible some whitespace if autoindent is on func (h *BufHandler) InsertNewline() bool { - if h.Buf.Type == buffer.BTInfo { - InfoBar.DonePrompt(false) - return false - } - // Insert a newline if h.Cursor.HasSelection() { h.Cursor.DeleteSelection() diff --git a/cmd/micro/action/command.go b/cmd/micro/action/command.go index e72c4687..ef4762df 100644 --- a/cmd/micro/action/command.go +++ b/cmd/micro/action/command.go @@ -559,9 +559,7 @@ func (h *BufHandler) TermCmd(args []string) { args = []string{sh} } - term := func(i int) { - // If there is only one open file we make a new tab instead of overwriting it - newtab := len(MainTab().Panes) == 1 && len(Tabs.List) == 1 + term := func(i int, newtab bool) { t := new(shell.Terminal) t.Start(args, false, true) @@ -580,19 +578,27 @@ func (h *BufHandler) TermCmd(args []string) { MainTab().SetActive(i) } + // If there is only one open file we make a new tab instead of overwriting it + newtab := len(MainTab().Panes) == 1 && len(Tabs.List) == 1 + + if newtab { + term(0, true) + return + } + for i, p := range ps { if p.ID() == h.ID() { if h.Buf.Modified() { InfoBar.YNPrompt("Save changes to "+h.Buf.GetName()+" before closing? (y,n,esc)", func(yes, canceled bool) { if !canceled && !yes { - term(i) + term(i, false) } else if !canceled && yes { h.Save() - term(i) + term(i, false) } }) } else { - term(i) + term(i, false) } } } diff --git a/cmd/micro/action/infohandler.go b/cmd/micro/action/infohandler.go index 337393bf..2840e22c 100644 --- a/cmd/micro/action/infohandler.go +++ b/cmd/micro/action/infohandler.go @@ -33,18 +33,19 @@ func (h *InfoHandler) HandleEvent(event tcell.Event) { } done := h.DoKeyEvent(ke) - if !done && e.Key() == tcell.KeyRune { + if e.Key() == tcell.KeyRune && h.HasYN { if e.Rune() == 'y' && h.HasYN { h.YNResp = true h.DonePrompt(false) } else if e.Rune() == 'n' && h.HasYN { h.YNResp = false h.DonePrompt(false) - } else if !h.HasYN { - h.DoRuneInsert(e.Rune()) - done = true } } + if e.Key() == tcell.KeyRune && !done && !h.HasYN { + h.DoRuneInsert(e.Rune()) + done = true + } if done && h.HasPrompt && !h.HasYN { resp := strings.TrimSpace(string(h.LineBytes(0))) hist := h.History[h.PromptType] diff --git a/cmd/micro/action/termhandler.go b/cmd/micro/action/termhandler.go index 0d19c551..388377ab 100644 --- a/cmd/micro/action/termhandler.go +++ b/cmd/micro/action/termhandler.go @@ -23,6 +23,7 @@ func NewTermHandler(x, y, w, h int, t *shell.Terminal, id uint64) *TermHandler { th := new(TermHandler) th.Terminal = t th.id = id + th.mouseReleased = true th.Window = display.NewTermWindow(x, y, w, h, t) return th } @@ -81,7 +82,7 @@ func (t *TermHandler) HandleEvent(event tcell.Event) { x, y := e.Position() v := t.GetView() x -= v.X - y += v.Y + y -= v.Y if e.Buttons() == tcell.Button1 { if !t.mouseReleased { diff --git a/cmd/micro/buffer/buffer.go b/cmd/micro/buffer/buffer.go index e9faf019..e87e5e49 100644 --- a/cmd/micro/buffer/buffer.go +++ b/cmd/micro/buffer/buffer.go @@ -427,11 +427,13 @@ func (b *Buffer) IndentString(tabsize int) []byte { // SetCursors resets this buffer's cursors to a new list func (b *Buffer) SetCursors(c []*Cursor) { b.cursors = c + b.EventHandler.cursors = b.cursors } // AddCursor adds a new cursor to the list func (b *Buffer) AddCursor(c *Cursor) { b.cursors = append(b.cursors, c) + b.EventHandler.cursors = b.cursors b.UpdateCursors() } @@ -486,6 +488,7 @@ func (b *Buffer) MergeCursors() { if b.curCursor >= len(b.cursors) { b.curCursor = len(b.cursors) - 1 } + b.EventHandler.cursors = b.cursors } // UpdateCursors updates all the cursors indicies diff --git a/cmd/micro/info/infobuffer.go b/cmd/micro/info/infobuffer.go index 58c8e428..b22c8a52 100644 --- a/cmd/micro/info/infobuffer.go +++ b/cmd/micro/info/infobuffer.go @@ -133,25 +133,30 @@ func (i *InfoBuf) DonePrompt(canceled bool) { i.HasPrompt = false i.HasYN = false i.HasGutter = false - if i.PromptCallback != nil && !hadYN { - if canceled { - i.PromptCallback("", true) - h := i.History[i.PromptType] - i.History[i.PromptType] = h[:len(h)-1] - } else { - resp := strings.TrimSpace(string(i.LineBytes(0))) - i.PromptCallback(resp, false) - h := i.History[i.PromptType] - h[len(h)-1] = resp + if !hadYN { + if i.PromptCallback != nil { + if canceled { + i.PromptCallback("", true) + h := i.History[i.PromptType] + i.History[i.PromptType] = h[:len(h)-1] + } else { + resp := strings.TrimSpace(string(i.LineBytes(0))) + i.PromptCallback(resp, false) + h := i.History[i.PromptType] + h[len(h)-1] = resp + } + i.PromptCallback = nil + i.EventCallback = nil } + if i.EventCallback != nil { + i.EventCallback = nil + } + i.Replace(i.Start(), i.End(), []byte{}) } if i.YNCallback != nil && hadYN { i.YNCallback(i.YNResp, canceled) + i.YNCallback = nil } - i.PromptCallback = nil - i.EventCallback = nil - i.YNCallback = nil - i.Replace(i.Start(), i.End(), []byte{}) } // Reset resets the infobuffer's msg and info