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",