~sircmpwn/aerc

39307a6fa7e96641b822ed0a9acb75021dcf7fe9 — Jeffas 1 year, 4 months ago 3ec9fd2
Make commands join args with spaces

This patch ensures the following commands join their arguments with
spaces to make it easier to interact with:

- cf
- mkdir
- cd
- attach
- detach
- ct
- copy
- move
- save
M commands/account/cf.go => commands/account/cf.go +4 -6
@@ 28,7 28,7 @@ func (ChangeFolder) Complete(aerc *widgets.Aerc, args []string) []string {
}

func (ChangeFolder) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) < 2 {
	if len(args) == 1 {
		return errors.New("Usage: cf <folder>")
	}
	acct := aerc.SelectedAccount()


@@ 36,17 36,15 @@ func (ChangeFolder) Execute(aerc *widgets.Aerc, args []string) error {
		return errors.New("No account selected")
	}
	previous := acct.Directories().Selected()
	if args[1] == "-" {
	joinedArgs := strings.Join(args[1:], " ")
	if joinedArgs == "-" {
		if dir, ok := history[acct.Name()]; ok {
			acct.Directories().Select(dir)
		} else {
			return errors.New("No previous folder to return to")
		}
	} else {
		if len(args) > 2 {
			args[1] = strings.Join(args[1:], " ")
		}
		acct.Directories().Select(args[1])
		acct.Directories().Select(joinedArgs)
	}
	history[acct.Name()] = previous


M commands/account/mkdir.go => commands/account/mkdir.go +3 -2
@@ 2,6 2,7 @@ package account

import (
	"errors"
	"strings"
	"time"

	"github.com/gdamore/tcell"


@@ 25,14 26,14 @@ func (MakeDir) Complete(aerc *widgets.Aerc, args []string) []string {
}

func (MakeDir) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) != 2 {
	if len(args) == 0 {
		return errors.New("Usage: :mkdir <name>")
	}
	acct := aerc.SelectedAccount()
	if acct == nil {
		return errors.New("No account selected")
	}
	name := args[1]
	name := strings.Join(args[1:], " ")
	acct.Worker().PostAction(&types.CreateDirectory{
		Directory: name,
	}, func(msg types.WorkerMessage) {

M commands/cd.go => commands/cd.go +5 -11
@@ 24,11 24,7 @@ func (ChangeDirectory) Aliases() []string {
}

func (ChangeDirectory) Complete(aerc *widgets.Aerc, args []string) []string {
	path := ""
	if len(args) >= 1 {
		path = args[0]
	}

	path := strings.Join(args, " ")
	completions := CompletePath(path)

	var dirs []string


@@ 43,24 39,22 @@ func (ChangeDirectory) Complete(aerc *widgets.Aerc, args []string) []string {
}

func (ChangeDirectory) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) < 1 || len(args) > 2 {
	if len(args) < 1 {
		return errors.New("Usage: cd [directory]")
	}
	cwd, err := os.Getwd()
	if err != nil {
		return err
	}
	var target string
	if len(args) == 1 {
	target := strings.Join(args[1:], " ")
	if target == "" {
		target = "~"
	} else if args[1] == "-" {
	} else if target == "-" {
		if previousDir == "" {
			return errors.New("No previous folder to return to")
		} else {
			target = previousDir
		}
	} else {
		target = args[1]
	}
	target, err = homedir.Expand(target)
	if err != nil {

M commands/compose/attach.go => commands/compose/attach.go +4 -7
@@ 3,6 3,7 @@ package compose
import (
	"fmt"
	"os"
	"strings"
	"time"

	"git.sr.ht/~sircmpwn/aerc/commands"


@@ 22,20 23,16 @@ func (Attach) Aliases() []string {
}

func (Attach) Complete(aerc *widgets.Aerc, args []string) []string {
	path := ""
	if len(args) >= 1 {
		path = args[0]
	}

	path := strings.Join(args, " ")
	return commands.CompletePath(path)
}

func (Attach) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) != 2 {
	if len(args) == 1 {
		return fmt.Errorf("Usage: :attach <path>")
	}

	path := args[1]
	path := strings.Join(args[1:], " ")

	path, err := homedir.Expand(path)
	if err != nil {

M commands/compose/detach.go => commands/compose/detach.go +3 -7
@@ 2,6 2,7 @@ package compose

import (
	"fmt"
	"strings"
	"time"

	"git.sr.ht/~sircmpwn/aerc/widgets"


@@ 20,7 21,6 @@ func (Detach) Aliases() []string {

func (Detach) Complete(aerc *widgets.Aerc, args []string) []string {
	composer, _ := aerc.SelectedTab().(*widgets.Composer)

	return composer.GetAttachments()
}



@@ 28,12 28,8 @@ func (Detach) Execute(aerc *widgets.Aerc, args []string) error {
	var path string
	composer, _ := aerc.SelectedTab().(*widgets.Composer)

	if len(args) > 2 {
		return fmt.Errorf("Usage: :detach [path]")
	}

	if len(args) == 2 {
		path = args[1]
	if len(args) > 1 {
		path = strings.Join(args[1:], " ")
	} else {
		// if no attachment is specified, delete the first in the list
		atts := composer.GetAttachments()

M commands/ct.go => commands/ct.go +9 -7
@@ 23,9 23,10 @@ func (ChangeTab) Complete(aerc *widgets.Aerc, args []string) []string {
	if len(args) == 0 {
		return aerc.TabNames()
	}
	joinedArgs := strings.Join(args, " ")
	out := make([]string, 0)
	for _, tab := range aerc.TabNames() {
		if strings.HasPrefix(tab, args[0]) {
		if strings.HasPrefix(tab, joinedArgs) {
			out = append(out, tab)
		}
	}


@@ 33,22 34,23 @@ func (ChangeTab) Complete(aerc *widgets.Aerc, args []string) []string {
}

func (ChangeTab) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) != 2 {
	if len(args) == 1 {
		return fmt.Errorf("Usage: %s <tab>", args[0])
	}
	if args[1] == "-" {
	joinedArgs := strings.Join(args[1:], " ")
	if joinedArgs == "-" {
		ok := aerc.SelectPreviousTab()
		if !ok {
			return errors.New("No previous tab to return to")
		}
	} else {
		n, err := strconv.Atoi(args[1])
		n, err := strconv.Atoi(joinedArgs)
		if err == nil {
			if strings.HasPrefix(args[1], "+") {
			if strings.HasPrefix(joinedArgs, "+") {
				for ; n > 0; n-- {
					aerc.NextTab()
				}
			} else if strings.HasPrefix(args[1], "-") {
			} else if strings.HasPrefix(joinedArgs, "-") {
				for ; n < 0; n++ {
					aerc.PrevTab()
				}


@@ 60,7 62,7 @@ func (ChangeTab) Execute(aerc *widgets.Aerc, args []string) error {
				}
			}
		} else {
			ok := aerc.SelectTab(args[1])
			ok := aerc.SelectTab(joinedArgs)
			if !ok {
				return errors.New("No tab with that name")
			}

M commands/msg/copy.go => commands/msg/copy.go +15 -13
@@ 2,6 2,7 @@ package msg

import (
	"errors"
	"strings"
	"time"

	"git.sr.ht/~sircmpwn/getopt"


@@ 27,13 28,13 @@ func (Copy) Complete(aerc *widgets.Aerc, args []string) []string {
}

func (Copy) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) == 1 {
		return errors.New("Usage: cp [-p] <folder>")
	}
	opts, optind, err := getopt.Getopts(args, "p")
	if err != nil {
		return err
	}
	if optind != len(args)-1 {
		return errors.New("Usage: cp [-p] <folder>")
	}
	var (
		createParents bool
	)


@@ 53,16 54,17 @@ func (Copy) Execute(aerc *widgets.Aerc, args []string) error {
	if err != nil {
		return err
	}
	store.Copy([]uint32{msg.Uid}, args[optind], createParents, func(
		msg types.WorkerMessage) {
	store.Copy([]uint32{msg.Uid}, strings.Join(args[optind:], " "),
		createParents, func(
			msg types.WorkerMessage) {

		switch msg := msg.(type) {
		case *types.Done:
			aerc.PushStatus("Messages copied.", 10*time.Second)
		case *types.Error:
			aerc.PushStatus(" "+msg.Error.Error(), 10*time.Second).
				Color(tcell.ColorDefault, tcell.ColorRed)
		}
	})
			switch msg := msg.(type) {
			case *types.Done:
				aerc.PushStatus("Messages copied.", 10*time.Second)
			case *types.Error:
				aerc.PushStatus(" "+msg.Error.Error(), 10*time.Second).
					Color(tcell.ColorDefault, tcell.ColorRed)
			}
		})
	return nil
}

M commands/msg/move.go => commands/msg/move.go +7 -5
@@ 2,6 2,7 @@ package msg

import (
	"errors"
	"strings"
	"time"

	"git.sr.ht/~sircmpwn/getopt"


@@ 27,13 28,13 @@ func (Move) Complete(aerc *widgets.Aerc, args []string) []string {
}

func (Move) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) == 1 {
		return errors.New("Usage: mv [-p] <folder>")
	}
	opts, optind, err := getopt.Getopts(args, "p")
	if err != nil {
		return err
	}
	if optind != len(args)-1 {
		return errors.New("Usage: mv [-p] <folder>")
	}
	var (
		createParents bool
	)


@@ 63,12 64,13 @@ func (Move) Execute(aerc *widgets.Aerc, args []string) error {
	}
	store.Next()
	acct.Messages().Scroll()
	store.Move([]uint32{msg.Uid}, args[optind], createParents, func(
	joinedArgs := strings.Join(args[optind:], " ")
	store.Move([]uint32{msg.Uid}, joinedArgs, createParents, func(
		msg types.WorkerMessage) {

		switch msg := msg.(type) {
		case *types.Done:
			aerc.PushStatus("Message moved to "+args[optind], 10*time.Second)
			aerc.PushStatus("Message moved to "+joinedArgs, 10*time.Second)
		case *types.Error:
			aerc.PushStatus(" "+msg.Error.Error(), 10*time.Second).
				Color(tcell.ColorDefault, tcell.ColorRed)

M commands/msgview/save.go => commands/msgview/save.go +10 -8
@@ 11,9 11,11 @@ import (
	"strings"
	"time"

	"git.sr.ht/~sircmpwn/aerc/widgets"
	"git.sr.ht/~sircmpwn/getopt"
	"github.com/mitchellh/go-homedir"

	"git.sr.ht/~sircmpwn/aerc/commands"
	"git.sr.ht/~sircmpwn/aerc/widgets"
)

type Save struct{}


@@ 27,10 29,14 @@ func (Save) Aliases() []string {
}

func (Save) Complete(aerc *widgets.Aerc, args []string) []string {
	return nil
	path := strings.Join(args, " ")
	return commands.CompletePath(path)
}

func (Save) Execute(aerc *widgets.Aerc, args []string) error {
	if len(args) == 1 {
		return errors.New("Usage: :save [-p] <path>")
	}
	opts, optind, err := getopt.Getopts(args, "p")
	if err != nil {
		return err


@@ 38,7 44,7 @@ func (Save) Execute(aerc *widgets.Aerc, args []string) error {

	var (
		mkdirs bool
		path   string
		path   string = strings.Join(args[optind:], " ")
	)

	for _, opt := range opts {


@@ 47,12 53,8 @@ func (Save) Execute(aerc *widgets.Aerc, args []string) error {
			mkdirs = true
		}
	}
	if len(args) == optind+1 {
		path = args[optind]
	} else if defaultPath := aerc.Config().General.DefaultSavePath; defaultPath != "" {
	if defaultPath := aerc.Config().General.DefaultSavePath; defaultPath != "" {
		path = defaultPath
	} else {
		return errors.New("Usage: :save [-p] <path>")
	}

	mv := aerc.SelectedTab().(*widgets.MessageViewer)