aboutsummaryrefslogtreecommitdiffstats
path: root/commands/ct.go
diff options
context:
space:
mode:
authordelitako <delitako@delitako.xyz>2024-01-25 22:50:14 -0600
committerRobin Jarry <robin@jarry.cc>2024-01-26 20:27:08 +0100
commit936d519a67301bd78a4d737dc47234e3769e639f (patch)
tree701dc21c0551d4f020cb1c339ba0270c1525c2a7 /commands/ct.go
parent58585e0a8e264f7a5500b3f24b0b319d59f36882 (diff)
downloadaerc-936d519a67301bd78a4d737dc47234e3769e639f.tar.gz
tabs: optimize switching by offsets
I imagine no sane user requires aerc to correctly handle commands like `:next-tab 1000000000`, but I tried anyway and it froze aerc while also eating up many GBs of system memory. This behavior is not ideal, so I improved it. This commit adds functions for selecting a tab at an offset from the currently-selected tab and changes the next-tab, prev-tab, and change-tab commands to use these functions instead of looping. Signed-off-by: delitako <delitako@delitako.xyz> Tested-by: Thomas Böhler <witcher@wiredspace.de> Reviewed-by: Thomas Böhler <witcher@wiredspace.de> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'commands/ct.go')
-rw-r--r--commands/ct.go16
1 files changed, 4 insertions, 12 deletions
diff --git a/commands/ct.go b/commands/ct.go
index 1f99c6a5..4f908fcf 100644
--- a/commands/ct.go
+++ b/commands/ct.go
@@ -37,20 +37,12 @@ func (c ChangeTab) Execute(args []string) error {
} else {
n, err := strconv.Atoi(c.Tab)
if err == nil {
- switch {
- case strings.HasPrefix(c.Tab, "+"):
- for ; n > 0; n-- {
- app.NextTab()
- }
- case strings.HasPrefix(c.Tab, "-"):
- for ; n < 0; n++ {
- app.PrevTab()
- }
- default:
+ if strings.HasPrefix(c.Tab, "+") || strings.HasPrefix(c.Tab, "-") {
+ app.SelectTabAtOffset(n)
+ } else {
ok := app.SelectTabIndex(n)
if !ok {
- return errors.New(
- "No tab with that index")
+ return errors.New("No tab with that index")
}
}
} else {