diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index ce849eff..04b07f86 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -768,8 +768,9 @@ func (v *View) Quit() bool { if v.CanClose("Quit anyway? (yes, no, save) ") { v.CloseBuffer() if len(tabs[curTab].views) > 1 { - screen.Fini() - os.Exit(0) + v.splitNode.Delete() + tabs[v.TabNum].Cleanup() + tabs[v.TabNum].Resize() } else if len(tabs) > 1 { if len(tabs[v.TabNum].views) == 1 { tabs = tabs[:v.TabNum+copy(tabs[v.TabNum:], tabs[v.TabNum+1:])] diff --git a/cmd/micro/split_tree.go b/cmd/micro/split_tree.go index 5afbf001..d9ec5511 100644 --- a/cmd/micro/split_tree.go +++ b/cmd/micro/split_tree.go @@ -92,6 +92,40 @@ func (l *LeafNode) HSplit(buf *Buffer) { } } +func (l *LeafNode) Delete() { + i := search(l.parent.children, l) + + copy(l.parent.children[i:], l.parent.children[i+1:]) + l.parent.children[len(l.parent.children)-1] = nil + l.parent.children = l.parent.children[:len(l.parent.children)-1] + + tab := tabs[l.parent.tabNum] + j := findView(tab.views, l.view) + copy(tab.views[j:], tab.views[j+1:]) + tab.views[len(tab.views)-1] = nil // or the zero value of T + tab.views = tab.views[:len(tab.views)-1] + + for i, v := range tab.views { + v.Num = i + } + if tab.curView > 0 { + tab.curView-- + } +} + +func (s *SplitTree) Cleanup() { + for i, node := range s.children { + if n, ok := node.(*SplitTree); ok { + if len(n.children) == 1 { + if _, ok := n.children[0].(*LeafNode); ok { + s.children[i] = n.children[0] + } + } + n.Cleanup() + } + } +} + func (s *SplitTree) ResizeSplits() { for i, node := range s.children { if n, ok := node.(*LeafNode); ok { @@ -108,6 +142,7 @@ func (s *SplitTree) ResizeSplits() { n.view.y = s.y + n.view.height*i n.view.x = s.x } + n.view.matches = Match(n.view) } else if n, ok := node.(*SplitTree); ok { if s.kind == VerticalSplit { n.width = s.width / len(s.children) @@ -140,6 +175,15 @@ func search(haystack []Node, needle Node) int { return 0 } +func findView(haystack []*View, needle *View) int { + for i, x := range haystack { + if x == needle { + return i + } + } + return 0 +} + func (s *SplitTree) VSplit(buf *Buffer) {} func (s *SplitTree) HSplit(buf *Buffer) {} diff --git a/cmd/micro/tab.go b/cmd/micro/tab.go index 6f289468..3a836cc6 100644 --- a/cmd/micro/tab.go +++ b/cmd/micro/tab.go @@ -42,6 +42,10 @@ func (t *Tab) SetNum(num int) { } } +func (t *Tab) Cleanup() { + t.tree.Cleanup() +} + func (t *Tab) Resize() { t.tree.ResizeSplits() }