Adds command "tabmove ±n", for better tab management (#1636)
* 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
This commit is contained in:
parent
fb35e0312a
commit
d0f7ecf9ca
2 changed files with 56 additions and 0 deletions
|
@ -56,6 +56,7 @@ func InitCommands() {
|
||||||
"cd": {(*BufPane).CdCmd, buffer.FileComplete},
|
"cd": {(*BufPane).CdCmd, buffer.FileComplete},
|
||||||
"pwd": {(*BufPane).PwdCmd, nil},
|
"pwd": {(*BufPane).PwdCmd, nil},
|
||||||
"open": {(*BufPane).OpenCmd, buffer.FileComplete},
|
"open": {(*BufPane).OpenCmd, buffer.FileComplete},
|
||||||
|
"tabmove": {(*BufPane).TabMoveCmd, nil},
|
||||||
"tabswitch": {(*BufPane).TabSwitchCmd, nil},
|
"tabswitch": {(*BufPane).TabSwitchCmd, nil},
|
||||||
"term": {(*BufPane).TermCmd, nil},
|
"term": {(*BufPane).TermCmd, nil},
|
||||||
"memusage": {(*BufPane).MemUsageCmd, nil},
|
"memusage": {(*BufPane).MemUsageCmd, nil},
|
||||||
|
@ -155,6 +156,56 @@ func (h *BufPane) TextFilterCmd(args []string) {
|
||||||
h.Buf.Insert(h.Cursor.Loc, bout.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
|
// TabSwitchCmd switches to a given tab either by name or by number
|
||||||
func (h *BufPane) TabSwitchCmd(args []string) {
|
func (h *BufPane) TabSwitchCmd(args []string) {
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
|
|
|
@ -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.
|
* `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`
|
* `tabswitch 'tab'`: This command will switch to the specified tab. The `tab`
|
||||||
can either be a tab number, or a name of a tab.
|
can either be a tab number, or a name of a tab.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue