From d0f7ecf9caf2e9516257478303619d6cfbe5135f Mon Sep 17 00:00:00 2001 From: Jeff Warner Date: Thu, 14 May 2020 18:51:49 -0700 Subject: [PATCH] =?UTF-8?q?Adds=20command=20"tabmove=20=C2=B1n",=20for=20b?= =?UTF-8?q?etter=20tab=20management=20(#1636)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adds command "tabmove ±n", for better tab management * Added tabmove to help:commands * Replace uses of util.Min, util.Max with util.Clamp Browsing code and discovered `util.Clamp`, ideal for this section of my code * oops, missed an arg * Typo, again --- internal/action/command.go | 51 ++++++++++++++++++++++++++++++++++++++ runtime/help/commands.md | 5 ++++ 2 files changed, 56 insertions(+) diff --git a/internal/action/command.go b/internal/action/command.go index 1218bc42..8361e5a1 100644 --- a/internal/action/command.go +++ b/internal/action/command.go @@ -56,6 +56,7 @@ func InitCommands() { "cd": {(*BufPane).CdCmd, buffer.FileComplete}, "pwd": {(*BufPane).PwdCmd, nil}, "open": {(*BufPane).OpenCmd, buffer.FileComplete}, + "tabmove": {(*BufPane).TabMoveCmd, nil}, "tabswitch": {(*BufPane).TabSwitchCmd, nil}, "term": {(*BufPane).TermCmd, nil}, "memusage": {(*BufPane).MemUsageCmd, nil}, @@ -155,6 +156,56 @@ func (h *BufPane) TextFilterCmd(args []string) { h.Buf.Insert(h.Cursor.Loc, bout.String()) } +// TabMoveCmd moves the current tab to a given index (starts at 1). The +// displaced tabs are moved up. +func (h *BufPane) TabMoveCmd(args []string) { + if len(args) <= 0 { + InfoBar.Error("Not enough arguments: provide an index, starting at 1") + return + } + + if len(args[0]) <= 0 { + InfoBar.Error("Invalid argument: empty string") + return + } + + num, err := strconv.Atoi(args[0]) + if err != nil { + InfoBar.Error("Invalid argument: ", err) + return + } + + // Preserve sign for relative move, if one exists + var shiftDirection byte + if strings.Contains("-+", string([]byte{args[0][0]})) { + shiftDirection = args[0][0] + } + + // Relative positions -> absolute positions + idxFrom := Tabs.Active() + idxTo := 0 + offset := util.Abs(num) + if shiftDirection == '-' { + idxTo = idxFrom - offset + } else if shiftDirection == '+' { + idxTo = idxFrom + offset + } else { + idxTo = offset - 1 + } + + // Restrain position to within the valid range + idxTo = util.Clamp(idxTo, 0, len(Tabs.List)-1) + + activeTab := Tabs.List[idxFrom] + Tabs.RemoveTab(activeTab.ID()) + Tabs.List = append(Tabs.List, nil) + copy(Tabs.List[idxTo+1:], Tabs.List[idxTo:]) + Tabs.List[idxTo] = activeTab + Tabs.UpdateNames() + Tabs.SetActive(idxTo) + // InfoBar.Message(fmt.Sprintf("Moved tab from slot %d to %d", idxFrom+1, idxTo+1)) +} + // TabSwitchCmd switches to a given tab either by name or by number func (h *BufPane) TabSwitchCmd(args []string) { if len(args) > 0 { diff --git a/runtime/help/commands.md b/runtime/help/commands.md index ff4e9994..9f43085c 100644 --- a/runtime/help/commands.md +++ b/runtime/help/commands.md @@ -62,6 +62,11 @@ quotes here but these are not necessary when entering the command in micro. * `tab 'filename'`: opens the given file in a new tab. +* `tabmove '[-+]?n'`: Moves the active tab to another slot. `n` is an integer. + If `n` is prefixed with `-` or `+`, then it represents a relative position + (e.g. `tabmove +2` moves the tab to the right by `2`). If `n` has no prefix, + it represents an absolute position (e.g. `tabmove 2` moves the tab to slot `2`). + * `tabswitch 'tab'`: This command will switch to the specified tab. The `tab` can either be a tab number, or a name of a tab.