diff options
author | delitako <delitako@delitako.xyz> | 2024-01-25 22:50:14 -0600 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2024-01-26 20:27:08 +0100 |
commit | 936d519a67301bd78a4d737dc47234e3769e639f (patch) | |
tree | 701dc21c0551d4f020cb1c339ba0270c1525c2a7 /commands/ct.go | |
parent | 58585e0a8e264f7a5500b3f24b0b319d59f36882 (diff) | |
download | aerc-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.go | 16 |
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 { |