Implement basic tab completion support

Tab completion currently only works on commands. Contextual completion
will be added in the future.
This commit is contained in:
Gregory Mullen 2019-06-27 10:33:11 -07:00 committed by Drew DeVault
parent 177651bdda
commit 2a0961701c
47 changed files with 598 additions and 154 deletions

View file

@ -6,11 +6,21 @@ import (
"git.sr.ht/~sircmpwn/aerc/widgets"
)
type Close struct{}
func init() {
register("close", CommandClose)
register(Close{})
}
func CommandClose(aerc *widgets.Aerc, args []string) error {
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")
}

View file

@ -8,9 +8,9 @@ var (
MessageViewCommands *commands.Commands
)
func register(name string, cmd commands.AercCommand) {
func register(cmd commands.Command) {
if MessageViewCommands == nil {
MessageViewCommands = commands.NewCommands()
}
MessageViewCommands.Register(name, cmd)
MessageViewCommands.Register(cmd)
}

View file

@ -8,16 +8,21 @@ import (
"git.sr.ht/~sircmpwn/aerc/widgets"
)
type NextPrevPart struct{}
func init() {
register("next-part", NextPrevPart)
register("prev-part", NextPrevPart)
register(NextPrevPart{})
}
func nextPrevPartUsage(cmd string) error {
return errors.New(fmt.Sprintf("Usage: %s [n]", cmd))
func (_ NextPrevPart) Aliases() []string {
return []string{"next-part", "prev-part"}
}
func NextPrevPart(aerc *widgets.Aerc, args []string) error {
func (_ NextPrevPart) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (_ NextPrevPart) Execute(aerc *widgets.Aerc, args []string) error {
if len(args) > 2 {
return nextPrevPartUsage(args[0])
}
@ -41,3 +46,7 @@ func NextPrevPart(aerc *widgets.Aerc, args []string) error {
}
return nil
}
func nextPrevPartUsage(cmd string) error {
return errors.New(fmt.Sprintf("Usage: %s [n]", cmd))
}

View file

@ -6,14 +6,21 @@ import (
"git.sr.ht/~sircmpwn/aerc/widgets"
)
type NextPrevMsg struct{}
func init() {
register("next", NextPrevMessage)
register("next-message", NextPrevMessage)
register("prev", NextPrevMessage)
register("prev-message", NextPrevMessage)
register(NextPrevMsg{})
}
func NextPrevMessage(aerc *widgets.Aerc, args []string) error {
func (_ NextPrevMsg) Aliases() []string {
return []string{"next", "next-message", "prev", "prev-message"}
}
func (_ NextPrevMsg) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (_ NextPrevMsg) Execute(aerc *widgets.Aerc, args []string) error {
mv, _ := aerc.SelectedTab().(*widgets.MessageViewer)
acct := mv.SelectedAccount()
store := mv.Store()

View file

@ -14,11 +14,21 @@ import (
"git.sr.ht/~sircmpwn/aerc/widgets"
)
type Open struct{}
func init() {
register("open", Open)
register(Open{})
}
func Open(aerc *widgets.Aerc, args []string) error {
func (_ Open) Aliases() []string {
return []string{"open"}
}
func (_ Open) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (_ Open) Execute(aerc *widgets.Aerc, args []string) error {
if len(args) != 1 {
return errors.New("Usage: open")
}

View file

@ -12,11 +12,21 @@ import (
"git.sr.ht/~sircmpwn/aerc/widgets"
)
type Pipe struct{}
func init() {
register("pipe", Pipe)
register(Pipe{})
}
func Pipe(aerc *widgets.Aerc, args []string) error {
func (_ Pipe) Aliases() []string {
return []string{"pipe"}
}
func (_ Pipe) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (_ Pipe) Execute(aerc *widgets.Aerc, args []string) error {
if len(args) < 2 {
return errors.New("Usage: :pipe <cmd> [args...]")
}

View file

@ -16,19 +16,31 @@ import (
"github.com/mitchellh/go-homedir"
)
type Save struct{}
func init() {
register("save", Save)
register(Save{})
}
func Save(aerc *widgets.Aerc, args []string) error {
func (_ Save) Aliases() []string {
return []string{"save"}
}
func (_ Save) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (_ Save) Execute(aerc *widgets.Aerc, args []string) error {
opts, optind, err := getopt.Getopts(args, "p")
if err != nil {
return err
}
var (
mkdirs bool
path string
)
for _, opt := range opts {
switch opt.Option {
case 'p':

View file

@ -7,15 +7,21 @@ import (
"git.sr.ht/~sircmpwn/aerc/widgets"
)
type ToggleHeaders struct{}
func init() {
register("toggle-headers", ToggleHeaders)
register(ToggleHeaders{})
}
func toggleHeadersUsage(cmd string) error {
return errors.New(fmt.Sprintf("Usage: %s", cmd))
func (_ ToggleHeaders) Aliases() []string {
return []string{"toggle-headers"}
}
func ToggleHeaders(aerc *widgets.Aerc, args []string) error {
func (_ ToggleHeaders) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (_ ToggleHeaders) Execute(aerc *widgets.Aerc, args []string) error {
if len(args) > 1 {
return toggleHeadersUsage(args[0])
}
@ -23,3 +29,7 @@ func ToggleHeaders(aerc *widgets.Aerc, args []string) error {
mv.ToggleHeaders()
return nil
}
func toggleHeadersUsage(cmd string) error {
return errors.New(fmt.Sprintf("Usage: %s", cmd))
}