diff --git a/cmd/micro/initlua.go b/cmd/micro/initlua.go index 08c808c2..4a3f327a 100644 --- a/cmd/micro/initlua.go +++ b/cmd/micro/initlua.go @@ -121,6 +121,9 @@ func luaImportMicroBuffer() *lua.LTable { ulua.L.SetField(pkg, "BTScratch", luar.New(ulua.L, buffer.BTScratch.Kind)) ulua.L.SetField(pkg, "BTRaw", luar.New(ulua.L, buffer.BTRaw.Kind)) ulua.L.SetField(pkg, "BTInfo", luar.New(ulua.L, buffer.BTInfo.Kind)) + ulua.L.SetField(pkg, "NewBuffer", luar.New(ulua.L, func(text, path string) *buffer.Buffer { + return buffer.NewBufferFromString(text, path, buffer.BTDefault) + })) ulua.L.SetField(pkg, "NewBufferFromFile", luar.New(ulua.L, func(path string) (*buffer.Buffer, error) { return buffer.NewBufferFromFile(path, buffer.BTDefault) })) diff --git a/internal/action/bufpane.go b/internal/action/bufpane.go index 6137b81f..e23b9a64 100644 --- a/internal/action/bufpane.go +++ b/internal/action/bufpane.go @@ -175,15 +175,17 @@ type BufPane struct { multiWord bool splitID uint64 + tab *Tab // remember original location of a search in case the search is canceled searchOrig buffer.Loc } -func NewBufPane(buf *buffer.Buffer, win display.BWindow) *BufPane { +func NewBufPane(buf *buffer.Buffer, win display.BWindow, tab *Tab) *BufPane { h := new(BufPane) h.Buf = buf h.BWindow = win + h.tab = tab h.Cursor = h.Buf.GetActiveCursor() h.mouseReleased = true @@ -193,9 +195,23 @@ func NewBufPane(buf *buffer.Buffer, win display.BWindow) *BufPane { return h } -func NewBufPaneFromBuf(buf *buffer.Buffer) *BufPane { +func NewBufPaneFromBuf(buf *buffer.Buffer, tab *Tab) *BufPane { w := display.NewBufWindow(0, 0, 0, 0, buf) - return NewBufPane(buf, w) + return NewBufPane(buf, w, tab) +} + +func (h *BufPane) SetTab(t *Tab) { + h.tab = t +} + +func (h *BufPane) Tab() *Tab { + return h.tab +} + +func (h *BufPane) ResizePane(size int) { + n := h.tab.GetNode(h.splitID) + n.ResizeSplit(size) + h.tab.Resize() } // PluginCB calls all plugin callbacks with a certain name and @@ -433,22 +449,29 @@ func (h *BufPane) DoRuneInsert(r rune) { } } -func (h *BufPane) VSplitBuf(buf *buffer.Buffer) *BufPane { - e := NewBufPaneFromBuf(buf) - e.splitID = MainTab().GetNode(h.splitID).VSplit(h.Buf.Settings["splitright"].(bool)) +func (h *BufPane) VSplitIndex(buf *buffer.Buffer, right bool) *BufPane { + e := NewBufPaneFromBuf(buf, h.tab) + e.splitID = MainTab().GetNode(h.splitID).VSplit(right) MainTab().Panes = append(MainTab().Panes, e) MainTab().Resize() MainTab().SetActive(len(MainTab().Panes) - 1) return e } -func (h *BufPane) HSplitBuf(buf *buffer.Buffer) *BufPane { - e := NewBufPaneFromBuf(buf) - e.splitID = MainTab().GetNode(h.splitID).HSplit(h.Buf.Settings["splitbottom"].(bool)) +func (h *BufPane) HSplitIndex(buf *buffer.Buffer, bottom bool) *BufPane { + e := NewBufPaneFromBuf(buf, h.tab) + e.splitID = MainTab().GetNode(h.splitID).HSplit(bottom) MainTab().Panes = append(MainTab().Panes, e) MainTab().Resize() MainTab().SetActive(len(MainTab().Panes) - 1) return e } + +func (h *BufPane) VSplitBuf(buf *buffer.Buffer) *BufPane { + return h.VSplitIndex(buf, h.Buf.Settings["splitright"].(bool)) +} +func (h *BufPane) HSplitBuf(buf *buffer.Buffer) *BufPane { + return h.HSplitIndex(buf, h.Buf.Settings["splitbottom"].(bool)) +} func (h *BufPane) Close() { h.Buf.Close() } diff --git a/internal/action/command.go b/internal/action/command.go index d6c7c3ae..baf2bf8d 100644 --- a/internal/action/command.go +++ b/internal/action/command.go @@ -147,7 +147,7 @@ func (h *BufPane) RetabCmd(args []string) { func (h *BufPane) RawCmd(args []string) { width, height := screen.Screen.Size() iOffset := config.GetInfoBarOffset() - tp := NewTabFromPane(0, 0, width, height-iOffset, NewRawPane()) + tp := NewTabFromPane(0, 0, width, height-iOffset, NewRawPane(nil)) Tabs.AddTab(tp) Tabs.SetActive(len(Tabs.List) - 1) } @@ -830,7 +830,7 @@ func (h *BufPane) ReplaceAllCmd(args []string) { // TermCmd opens a terminal in the current view func (h *BufPane) TermCmd(args []string) { - ps := MainTab().Panes + ps := h.tab.Panes if len(args) == 0 { sh := os.Getenv("SHELL") @@ -855,7 +855,7 @@ func (h *BufPane) TermCmd(args []string) { } v := h.GetView() - MainTab().Panes[i] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id) + MainTab().Panes[i] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id, MainTab()) MainTab().SetActive(i) } diff --git a/internal/action/infopane.go b/internal/action/infopane.go index 9c137c52..210bc154 100644 --- a/internal/action/infopane.go +++ b/internal/action/infopane.go @@ -17,10 +17,10 @@ type InfoPane struct { *info.InfoBuf } -func NewInfoPane(ib *info.InfoBuf, w display.BWindow) *InfoPane { +func NewInfoPane(ib *info.InfoBuf, w display.BWindow, tab *Tab) *InfoPane { ip := new(InfoPane) ip.InfoBuf = ib - ip.BufPane = NewBufPane(ib.Buffer, w) + ip.BufPane = NewBufPane(ib.Buffer, w, tab) return ip } @@ -28,7 +28,7 @@ func NewInfoPane(ib *info.InfoBuf, w display.BWindow) *InfoPane { func NewInfoBar() *InfoPane { ib := info.NewBuffer() w := display.NewInfoWindow(ib) - return NewInfoPane(ib, w) + return NewInfoPane(ib, w, nil) } func (h *InfoPane) Close() { diff --git a/internal/action/pane.go b/internal/action/pane.go index f6f68d3e..bcf1767e 100644 --- a/internal/action/pane.go +++ b/internal/action/pane.go @@ -11,4 +11,6 @@ type Pane interface { SetID(i uint64) Name() string Close() + SetTab(t *Tab) + Tab() *Tab } diff --git a/internal/action/rawpane.go b/internal/action/rawpane.go index cdeade47..db6e9171 100644 --- a/internal/action/rawpane.go +++ b/internal/action/rawpane.go @@ -13,17 +13,17 @@ type RawPane struct { *BufPane } -func NewRawPaneFromWin(b *buffer.Buffer, win display.BWindow) *RawPane { +func NewRawPaneFromWin(b *buffer.Buffer, win display.BWindow, tab *Tab) *RawPane { rh := new(RawPane) - rh.BufPane = NewBufPane(b, win) + rh.BufPane = NewBufPane(b, win, tab) return rh } -func NewRawPane() *RawPane { +func NewRawPane(tab *Tab) *RawPane { b := buffer.NewBufferFromString("", "", buffer.BTRaw) w := display.NewBufWindow(0, 0, 0, 0, b) - return NewRawPaneFromWin(b, w) + return NewRawPaneFromWin(b, w, tab) } func (h *RawPane) HandleEvent(event tcell.Event) { diff --git a/internal/action/tab.go b/internal/action/tab.go index 39e7ee8f..ac49edb9 100644 --- a/internal/action/tab.go +++ b/internal/action/tab.go @@ -167,7 +167,7 @@ func NewTabFromBuffer(x, y, width, height int, b *buffer.Buffer) *Tab { t.Node = views.NewRoot(x, y, width, height) t.UIWindow = display.NewUIWindow(t.Node) - e := NewBufPaneFromBuf(b) + e := NewBufPaneFromBuf(b, t) e.SetID(t.ID()) t.Panes = append(t.Panes, e) @@ -178,7 +178,7 @@ func NewTabFromPane(x, y, width, height int, pane Pane) *Tab { t := new(Tab) t.Node = views.NewRoot(x, y, width, height) t.UIWindow = display.NewUIWindow(t.Node) - + pane.SetTab(t) pane.SetID(t.ID()) t.Panes = append(t.Panes, pane) @@ -196,7 +196,6 @@ func (t *Tab) HandleEvent(event tcell.Event) { mx, my := e.Position() switch e.Buttons() { case tcell.Button1: - resizeID := t.GetMouseSplitID(buffer.Loc{mx, my}) if t.resizing != nil { var size int if t.resizing.Kind == views.STVert { @@ -209,6 +208,7 @@ func (t *Tab) HandleEvent(event tcell.Event) { return } + resizeID := t.GetMouseSplitID(buffer.Loc{mx, my}) if resizeID != 0 { t.resizing = t.GetNode(uint64(resizeID)) return diff --git a/internal/action/terminal_supported.go b/internal/action/terminal_supported.go index 3ae19ff1..f30f2755 100644 --- a/internal/action/terminal_supported.go +++ b/internal/action/terminal_supported.go @@ -25,7 +25,7 @@ func RunTermEmulator(h *BufPane, input string, wait bool, getOutput bool, callba id := MainTab().Panes[0].ID() v := h.GetView() - MainTab().Panes[0] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id) + MainTab().Panes[0] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id, MainTab()) MainTab().SetActive(0) return nil diff --git a/internal/action/termpane.go b/internal/action/termpane.go index 1f9b5797..6928856f 100644 --- a/internal/action/termpane.go +++ b/internal/action/termpane.go @@ -17,14 +17,16 @@ type TermPane struct { mouseReleased bool id uint64 + tab *Tab } -func NewTermPane(x, y, w, h int, t *shell.Terminal, id uint64) *TermPane { +func NewTermPane(x, y, w, h int, t *shell.Terminal, id uint64, tab *Tab) *TermPane { th := new(TermPane) th.Terminal = t th.id = id th.mouseReleased = true th.Window = display.NewTermWindow(x, y, w, h, t) + th.tab = tab return th } @@ -36,6 +38,14 @@ func (t *TermPane) SetID(i uint64) { t.id = i } +func (t *TermPane) SetTab(tab *Tab) { + t.tab = tab +} + +func (t *TermPane) Tab() *Tab { + return t.tab +} + func (t *TermPane) Close() {} func (t *TermPane) Quit() { diff --git a/internal/config/plugin.go b/internal/config/plugin.go index 1e1f9685..9dceb60b 100644 --- a/internal/config/plugin.go +++ b/internal/config/plugin.go @@ -57,9 +57,7 @@ func RunPluginFnBool(fn string, args ...lua.LValue) (bool, error) { reterr = errors.New("Plugin " + p.Name + ": " + err.Error()) continue } - if v, ok := val.(lua.LBool); !ok { - reterr = errors.New(p.Name + "." + fn + " should return a boolean") - } else { + if v, ok := val.(lua.LBool); ok { retbool = retbool && bool(v) } }