From 2e44db1ee9f36f669a46e3a0b44c091895c4aab2 Mon Sep 17 00:00:00 2001 From: Massimo Mund Date: Wed, 24 Jul 2024 11:16:34 +0200 Subject: [PATCH 1/2] Implemented new actions `FirstTab`, `LastTab`, `FirstSplit` and `LastSplit` and changed the default behavior of `NextTab`, `PreviousTab`, `NextSplit`, `PreviousSplit` to not walk in circles anymore --- internal/action/actions.go | 69 ++++++++++++++++++------------ internal/action/bufpane.go | 4 ++ internal/action/defaults.go | 2 +- internal/action/defaults_darwin.go | 10 ++--- internal/action/defaults_other.go | 10 ++--- runtime/help/keybindings.md | 14 +++--- 6 files changed, 65 insertions(+), 44 deletions(-) diff --git a/internal/action/actions.go b/internal/action/actions.go index fc9f837d..04af6e06 100644 --- a/internal/action/actions.go +++ b/internal/action/actions.go @@ -1793,27 +1793,38 @@ func (h *BufPane) AddTab() bool { // PreviousTab switches to the previous tab in the tab list func (h *BufPane) PreviousTab() bool { - tabsLen := len(Tabs.List) - if tabsLen == 1 { + if Tabs.Active() == 0 { return false } - - a := Tabs.Active() + tabsLen - Tabs.SetActive((a - 1) % tabsLen) - + Tabs.SetActive(Tabs.Active() - 1) return true } // NextTab switches to the next tab in the tab list func (h *BufPane) NextTab() bool { - tabsLen := len(Tabs.List) - if tabsLen == 1 { + if Tabs.Active() == len(Tabs.List)-1 { return false } + Tabs.SetActive(Tabs.Active() + 1) + return true +} - a := Tabs.Active() - Tabs.SetActive((a + 1) % tabsLen) +// FirstTab switches to the first tab in the tab list +func (h *BufPane) FirstTab() bool { + if Tabs.Active() == 0 { + return false + } + Tabs.SetActive(0) + return true +} +// LastTab switches to the last tab in the tab list +func (h *BufPane) LastTab() bool { + lastTabIndex := len(Tabs.List) - 1 + if Tabs.Active() == lastTabIndex { + return false + } + Tabs.SetActive(lastTabIndex) return true } @@ -1848,36 +1859,38 @@ func (h *BufPane) Unsplit() bool { // NextSplit changes the view to the next split func (h *BufPane) NextSplit() bool { - if len(h.tab.Panes) == 1 { + if h.tab.active == len(h.tab.Panes)-1 { return false } - - a := h.tab.active - if a < len(h.tab.Panes)-1 { - a++ - } else { - a = 0 - } - - h.tab.SetActive(a) - + h.tab.SetActive(h.tab.active + 1) return true } // PreviousSplit changes the view to the previous split func (h *BufPane) PreviousSplit() bool { - if len(h.tab.Panes) == 1 { + if h.tab.active == 0 { return false } + h.tab.SetActive(h.tab.active - 1) + return true +} - a := h.tab.active - if a > 0 { - a-- - } else { - a = len(h.tab.Panes) - 1 +// FirstSplit changes the view to the first split +func (h *BufPane) FirstSplit() bool { + if h.tab.active == 0 { + return false } - h.tab.SetActive(a) + h.tab.SetActive(0) + return true +} +// LastSplit changes the view to the last split +func (h *BufPane) LastSplit() bool { + lastPaneIdx := len(h.tab.Panes) - 1 + if h.tab.active == lastPaneIdx { + return false + } + h.tab.SetActive(lastPaneIdx) return true } diff --git a/internal/action/bufpane.go b/internal/action/bufpane.go index 40fb7cf1..054f3933 100644 --- a/internal/action/bufpane.go +++ b/internal/action/bufpane.go @@ -824,8 +824,12 @@ var BufKeyActions = map[string]BufKeyAction{ "AddTab": (*BufPane).AddTab, "PreviousTab": (*BufPane).PreviousTab, "NextTab": (*BufPane).NextTab, + "FirstTab": (*BufPane).FirstTab, + "LastTab": (*BufPane).LastTab, "NextSplit": (*BufPane).NextSplit, "PreviousSplit": (*BufPane).PreviousSplit, + "FirstSplit": (*BufPane).FirstSplit, + "LastSplit": (*BufPane).LastSplit, "Unsplit": (*BufPane).Unsplit, "VSplit": (*BufPane).VSplitAction, "HSplit": (*BufPane).HSplitAction, diff --git a/internal/action/defaults.go b/internal/action/defaults.go index b4104d25..53079cd0 100644 --- a/internal/action/defaults.go +++ b/internal/action/defaults.go @@ -3,7 +3,7 @@ package action var termdefaults = map[string]string{ "": "Exit", "": "CommandMode", - "": "NextSplit", + "": "NextSplit|FirstSplit", } // DefaultBindings returns a map containing micro's default keybindings diff --git a/internal/action/defaults_darwin.go b/internal/action/defaults_darwin.go index 4c781af8..c008676d 100644 --- a/internal/action/defaults_darwin.go +++ b/internal/action/defaults_darwin.go @@ -52,16 +52,16 @@ var bufdefaults = map[string]string{ "Ctrl-v": "Paste", "Ctrl-a": "SelectAll", "Ctrl-t": "AddTab", - "Alt-,": "PreviousTab", - "Alt-.": "NextTab", + "Alt-,": "PreviousTab|LastTab", + "Alt-.": "NextTab|FirstTab", "Home": "StartOfTextToggle", "End": "EndOfLine", "CtrlHome": "CursorStart", "CtrlEnd": "CursorEnd", "PageUp": "CursorPageUp", "PageDown": "CursorPageDown", - "CtrlPageUp": "PreviousTab", - "CtrlPageDown": "NextTab", + "CtrlPageUp": "PreviousTab|LastTab", + "CtrlPageDown": "NextTab|FirstTab", "ShiftPageUp": "SelectPageUp", "ShiftPageDown": "SelectPageDown", "Ctrl-g": "ToggleHelp", @@ -72,7 +72,7 @@ var bufdefaults = map[string]string{ "Ctrl-b": "ShellMode", "Ctrl-q": "Quit", "Ctrl-e": "CommandMode", - "Ctrl-w": "NextSplit", + "Ctrl-w": "NextSplit|FirstSplit", "Ctrl-u": "ToggleMacro", "Ctrl-j": "PlayMacro", "Insert": "ToggleOverwriteMode", diff --git a/internal/action/defaults_other.go b/internal/action/defaults_other.go index d74c5096..a0342866 100644 --- a/internal/action/defaults_other.go +++ b/internal/action/defaults_other.go @@ -55,16 +55,16 @@ var bufdefaults = map[string]string{ "Ctrl-v": "Paste", "Ctrl-a": "SelectAll", "Ctrl-t": "AddTab", - "Alt-,": "PreviousTab", - "Alt-.": "NextTab", + "Alt-,": "PreviousTab|LastTab", + "Alt-.": "NextTab|FirstTab", "Home": "StartOfTextToggle", "End": "EndOfLine", "CtrlHome": "CursorStart", "CtrlEnd": "CursorEnd", "PageUp": "CursorPageUp", "PageDown": "CursorPageDown", - "CtrlPageUp": "PreviousTab", - "CtrlPageDown": "NextTab", + "CtrlPageUp": "PreviousTab|LastTab", + "CtrlPageDown": "NextTab|FirstTab", "ShiftPageUp": "SelectPageUp", "ShiftPageDown": "SelectPageDown", "Ctrl-g": "ToggleHelp", @@ -75,7 +75,7 @@ var bufdefaults = map[string]string{ "Ctrl-b": "ShellMode", "Ctrl-q": "Quit", "Ctrl-e": "CommandMode", - "Ctrl-w": "NextSplit", + "Ctrl-w": "NextSplit|FirstSplit", "Ctrl-u": "ToggleMacro", "Ctrl-j": "PlayMacro", "Insert": "ToggleOverwriteMode", diff --git a/runtime/help/keybindings.md b/runtime/help/keybindings.md index a47fdfe5..c5349e98 100644 --- a/runtime/help/keybindings.md +++ b/runtime/help/keybindings.md @@ -253,11 +253,15 @@ QuitAll AddTab PreviousTab NextTab +FirstTab +LastTab NextSplit Unsplit VSplit HSplit PreviousSplit +FirstSplit +LastSplit ToggleMacro PlayMacro Suspend (Unix only) @@ -502,16 +506,16 @@ conventions for text editing defaults. "Ctrl-v": "Paste", "Ctrl-a": "SelectAll", "Ctrl-t": "AddTab", - "Alt-,": "PreviousTab", - "Alt-.": "NextTab", + "Alt-,": "PreviousTab|LastTab", + "Alt-.": "NextTab|FirstTab", "Home": "StartOfText", "End": "EndOfLine", "CtrlHome": "CursorStart", "CtrlEnd": "CursorEnd", "PageUp": "CursorPageUp", "PageDown": "CursorPageDown", - "CtrlPageUp": "PreviousTab", - "CtrlPageDown": "NextTab", + "CtrlPageUp": "PreviousTab|LastTab", + "CtrlPageDown": "NextTab|FirstTab", "ShiftPageUp": "SelectPageUp", "ShiftPageDown": "SelectPageDown", "Ctrl-g": "ToggleHelp", @@ -522,7 +526,7 @@ conventions for text editing defaults. "Ctrl-b": "ShellMode", "Ctrl-q": "Quit", "Ctrl-e": "CommandMode", - "Ctrl-w": "NextSplit", + "Ctrl-w": "NextSplit|FirstSplit", "Ctrl-u": "ToggleMacro", "Ctrl-j": "PlayMacro", "Insert": "ToggleOverwriteMode", From 5f83661fee40bcc88a5b46a5346c6ac29fc0508a Mon Sep 17 00:00:00 2001 From: Massimo Mund Date: Sat, 17 Aug 2024 13:57:07 +0200 Subject: [PATCH 2/2] Fixes a bug where new `BufPanes` are not being inserted into the right array index. When adding a new `BufPane` it is always being inserted last into `MainTab().Panes`. This leads to a confusion when using the actions `PreviousSplit`, `NextSplit` as the previous/next split may not be the expected one. How to reproduce: - Launch micro and insert char "1" - Open a new vsplit via the command `vsplit` and insert "2" - Switch back to the left split (1) by using `PreviousSplit` - Again open a new vsplit via command: `vsplit` and type char "3" - Now switch between the 3 splits using `PreviousSplit`, `NextSplit` Switching from most left split to the most right, the expected order would be 1, 3, 2 but actually is 1, 2, 3. --- internal/action/bufpane.go | 16 ++++++++++++---- internal/action/tab.go | 10 ++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/internal/action/bufpane.go b/internal/action/bufpane.go index 054f3933..b6dbdd97 100644 --- a/internal/action/bufpane.go +++ b/internal/action/bufpane.go @@ -663,9 +663,13 @@ func (h *BufPane) DoRuneInsert(r rune) { 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) + currentPaneIdx := MainTab().GetPane(h.splitID) + if right { + currentPaneIdx++ + } + MainTab().AddPane(e, currentPaneIdx) MainTab().Resize() - MainTab().SetActive(len(MainTab().Panes) - 1) + MainTab().SetActive(currentPaneIdx) return e } @@ -673,9 +677,13 @@ func (h *BufPane) VSplitIndex(buf *buffer.Buffer, right bool) *BufPane { 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) + currentPaneIdx := MainTab().GetPane(h.splitID) + if bottom { + currentPaneIdx++ + } + MainTab().AddPane(e, currentPaneIdx) MainTab().Resize() - MainTab().SetActive(len(MainTab().Panes) - 1) + MainTab().SetActive(currentPaneIdx) return e } diff --git a/internal/action/tab.go b/internal/action/tab.go index bde667a3..235cb361 100644 --- a/internal/action/tab.go +++ b/internal/action/tab.go @@ -349,6 +349,16 @@ func (t *Tab) SetActive(i int) { } } +// AddPane adds a pane at a given index +func (t *Tab) AddPane(pane Pane, i int) { + if len(t.Panes) == i { + t.Panes = append(t.Panes, pane) + return + } + t.Panes = append(t.Panes[:i+1], t.Panes[i:]...) + t.Panes[i] = pane +} + // GetPane returns the pane with the given split index func (t *Tab) GetPane(splitid uint64) int { for i, p := range t.Panes {