f0a0c5aa733fa66958c113465bfc5fdd3d7cc9f0 — Aditya Srivastava 13 days ago 72204d1
add close command at global level
6 files changed, 72 insertions(+), 100 deletions(-)

A commands/close.go
D commands/compose/abort.go
D commands/msgview/close.go
D commands/terminal/close.go
M doc/aerc.1.scd
M widgets/aerc.go
A commands/close.go => commands/close.go +59 -0
@@ 0,0 1,59 @@
+ package commands
+ 
+ import (
+ 	"errors"
+ 	"fmt"
+ 
+ 	"git.sr.ht/~sircmpwn/aerc/widgets"
+ )
+ 
+ type Close struct{}
+ 
+ func init() {
+ 	register(Close{})
+ }
+ 
+ func (_ Close) Aliases() []string {
+ 	return []string{"close", "abort"}
+ }
+ 
+ func (_ Close) Complete(aerc *widgets.Aerc, args []string) []string {
+ 	return nil
+ }
+ 
+ func (_ Close) Execute(aerc *widgets.Aerc, args []string) error {
+ 	if len(args) > 2 {
+ 		return errors.New("Usage: close [tab name]")
+ 	} else if len(args) == 1 {
+ 		return CloseTab(aerc, aerc.SelectedTabName())
+ 	} else {
+ 		tabname := args[1]
+ 		for _, tab := range aerc.TabNames() {
+ 			if tab == tabname {
+ 				return CloseTab(aerc, tabname)
+ 			}
+ 		}
+ 		return errors.New(fmt.Sprintf("Tab %s not found", tabname))
+ 	}
+ 	return nil
+ }
+ 
+ func CloseTab(aerc *widgets.Aerc, tabname string) error {
+ 	curTabIndex := aerc.SelectedTabIndex()
+ 	aerc.SelectTab(tabname)
+ 	switch tab := aerc.SelectedTab().(type) {
+ 	default:
+ 		aerc.RemoveTab(tab)
+ 		return nil
+ 	case *widgets.Terminal:
+ 		tab.Close(nil)
+ 		return nil
+ 	case *widgets.Composer:
+ 		aerc.RemoveTab(tab)
+ 		tab.Close()
+ 		return nil
+ 	case *widgets.AccountView:
+ 		aerc.SelectTabIndex(curTabIndex)
+ 		return errors.New("Cannot close account tab")
+ 	}
+ }

D commands/compose/abort.go => commands/compose/abort.go +0 -33
@@ 1,33 0,0 @@-package compose
- 
- import (
- 	"errors"
- 
- 	"git.sr.ht/~sircmpwn/aerc/widgets"
- )
- 
- type Abort struct{}
- 
- func init() {
- 	register(Abort{})
- }
- 
- func (_ Abort) Aliases() []string {
- 	return []string{"abort"}
- }
- 
- func (_ Abort) Complete(aerc *widgets.Aerc, args []string) []string {
- 	return nil
- }
- 
- func (_ Abort) Execute(aerc *widgets.Aerc, args []string) error {
- 	if len(args) != 1 {
- 		return errors.New("Usage: abort")
- 	}
- 	composer, _ := aerc.SelectedTab().(*widgets.Composer)
- 
- 	aerc.RemoveTab(composer)
- 	composer.Close()
- 
- 	return nil
- }

D commands/msgview/close.go => commands/msgview/close.go +0 -30
@@ 1,30 0,0 @@-package msgview
- 
- import (
- 	"errors"
- 
- 	"git.sr.ht/~sircmpwn/aerc/widgets"
- )
- 
- type Close struct{}
- 
- func init() {
- 	register(Close{})
- }
- 
- func (_ Close) Aliases() []string {
- 	return []string{"close"}
- }
- 
- func (_ Close) Complete(aerc *widgets.Aerc, args []string) []string {
- 	return nil
- }
- 
- func (_ Close) Execute(aerc *widgets.Aerc, args []string) error {
- 	if len(args) != 1 {
- 		return errors.New("Usage: close")
- 	}
- 	mv, _ := aerc.SelectedTab().(*widgets.MessageViewer)
- 	aerc.RemoveTab(mv)
- 	return nil
- }

D commands/terminal/close.go => commands/terminal/close.go +0 -30
@@ 1,30 0,0 @@-package terminal
- 
- import (
- 	"errors"
- 
- 	"git.sr.ht/~sircmpwn/aerc/widgets"
- )
- 
- type Close struct{}
- 
- func init() {
- 	register(Close{})
- }
- 
- func (_ Close) Aliases() []string {
- 	return []string{"close"}
- }
- 
- func (_ Close) Complete(aerc *widgets.Aerc, args []string) []string {
- 	return nil
- }
- 
- func (_ Close) Execute(aerc *widgets.Aerc, args []string) error {
- 	if len(args) != 1 {
- 		return errors.New("Usage: close")
- 	}
- 	term, _ := aerc.SelectedTab().(*widgets.Terminal)
- 	term.Close(nil)
- 	return nil
- }

M doc/aerc.1.scd => doc/aerc.1.scd +5 -7
@@ 41,6 41,10 @@ it's treated as an index. If + or - is specified, the number is interpreted
  	as a delta from the selected tab.
  
+ *close* [tab name]
+ 	Closes current tab if no tab name provided, or tab with tab name if
+ 	argument is provided. Cannot close account tabs.
+ 
  *exec* <command...>
  	Executes an arbitrary command in the background.
  


@@ 184,9 188,6 @@   ## MESSAGE VIEW COMMANDS
  
- *close*
- 	Closes the message viewer.
- 
  *next* <n>[%], *prev* <n>[%]
  	Selects the next (or previous) message in the message list. If specified as
  	a percentage, the percentage is applied to the number of messages shown on


@@ 211,7 212,7 @@ ## MESSAGE COMPOSE COMMANDS
  
  *abort*
- 	Close the composor without sending, discarding the message in progress.
+     Close the composor without sending, discarding the message in progress.
  
  *attach* <path>
  	Attaches the file at the given path to the email.


@@ 246,9 247,6 @@   ## TERMINAL COMMANDS
  
- *close*
- 	Closes the terminal.
- 
  # LOGGING
  
  Aerc does not log by default, but collecting log output can be useful for

M widgets/aerc.go => widgets/aerc.go +8 -0
@@ 244,6 244,14 @@ return aerc.tabs.Tabs[aerc.tabs.Selected].Content
  }
  
+ func (aerc *Aerc) SelectedTabName() string {
+ 	return aerc.tabs.Tabs[aerc.tabs.Selected].Name
+ }
+ 
+ func (aerc *Aerc) SelectedTabIndex() int {
+ 	return aerc.tabs.Selected
+ }
+ 
  func (aerc *Aerc) NewTab(drawable ui.Drawable, name string) *ui.Tab {
  	tab := aerc.tabs.Add(drawable, name)
  	aerc.tabs.Select(len(aerc.tabs.Tabs) - 1)