From 6d99d34eb09331468d2213b8524734ffe212f881 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 8 Feb 2020 21:06:13 -0500 Subject: [PATCH] Fix unsplit crash Fixes #1488 --- internal/action/actions.go | 28 ++++++++++++++++------------ internal/views/splits.go | 9 +++++---- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/internal/action/actions.go b/internal/action/actions.go index 3f0d6ee1..783bffad 100644 --- a/internal/action/actions.go +++ b/internal/action/actions.go @@ -1373,38 +1373,42 @@ func (h *BufPane) HSplitAction() bool { // Unsplit closes all splits in the current tab except the active one func (h *BufPane) Unsplit() bool { - n := MainTab().GetNode(h.splitID) - n.Unsplit() + tab := h.tab + n := tab.GetNode(h.splitID) + ok := n.Unsplit() + if ok { + tab.RemovePane(tab.GetPane(h.splitID)) + tab.Resize() + tab.SetActive(len(tab.Panes) - 1) - MainTab().RemovePane(MainTab().GetPane(h.splitID)) - MainTab().Resize() - MainTab().SetActive(len(MainTab().Panes) - 1) - return true + return true + } + return false } // NextSplit changes the view to the next split func (h *BufPane) NextSplit() bool { - a := MainTab().active - if a < len(MainTab().Panes)-1 { + a := h.tab.active + if a < len(h.tab.Panes)-1 { a++ } else { a = 0 } - MainTab().SetActive(a) + h.tab.SetActive(a) return true } // PreviousSplit changes the view to the previous split func (h *BufPane) PreviousSplit() bool { - a := MainTab().active + a := h.tab.active if a > 0 { a-- } else { - a = len(MainTab().Panes) - 1 + a = len(h.tab.Panes) - 1 } - MainTab().SetActive(a) + h.tab.SetActive(a) return true } diff --git a/internal/views/splits.go b/internal/views/splits.go index 55d9d751..1168ab5d 100644 --- a/internal/views/splits.go +++ b/internal/views/splits.go @@ -456,9 +456,9 @@ func (n *Node) unsplit(i int, h bool) { // Unsplit deletes this split and resizes everything // else accordingly -func (n *Node) Unsplit() { - if !n.IsLeaf() { - return +func (n *Node) Unsplit() bool { + if !n.IsLeaf() || n.parent == nil { + return false } ind := 0 for i, c := range n.parent.children { @@ -473,8 +473,9 @@ func (n *Node) Unsplit() { } if n.parent.IsLeaf() { - n.parent.Unsplit() + return n.parent.Unsplit() } + return true } // String returns the string form of the node and all children (used for debugging)