~sircmpwn/aerc

Make commands join args with spaces v1 PROPOSED

Thanks!

To git.sr.ht:~sircmpwn/aerc
   3ec9fd2..043a02d  master -> master
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~sircmpwn/aerc/%3C20190920161629.1769701-1-dev%40jeffas.io%3E/mbox | git am -3
Learn more about email & git

[PATCH] Make commands join args with spaces Export this patch

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
---
 commands/account/cf.go     | 10 ++++------
 commands/account/mkdir.go  |  5 +++--
 commands/cd.go             | 16 +++++-----------
 commands/compose/attach.go | 11 ++++-------
 commands/compose/detach.go | 10 +++-------
 commands/ct.go             | 16 +++++++++-------
 commands/msg/copy.go       | 28 +++++++++++++++-------------
 commands/msg/move.go       | 12 +++++++-----
 commands/msgview/save.go   | 18 ++++++++++--------
 9 files changed, 60 insertions(+), 66 deletions(-)

diff --git a/commands/account/cf.go b/commands/account/cf.go
index cbef308..65b8810 100644
--- a/commands/account/cf.go
+++ b/commands/account/cf.go
@@ -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

diff --git a/commands/account/mkdir.go b/commands/account/mkdir.go
index d42928e..bb7e38a 100644
--- a/commands/account/mkdir.go
+++ b/commands/account/mkdir.go
@@ -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) {
diff --git a/commands/cd.go b/commands/cd.go
index 1d033e4..fa487e7 100644
--- a/commands/cd.go
+++ b/commands/cd.go
@@ -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 {
diff --git a/commands/compose/attach.go b/commands/compose/attach.go
index 969d12e..2b633dc 100644
--- a/commands/compose/attach.go
+++ b/commands/compose/attach.go
@@ -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 {
diff --git a/commands/compose/detach.go b/commands/compose/detach.go
index dc70ff9..e8b07ed 100644
--- a/commands/compose/detach.go
+++ b/commands/compose/detach.go
@@ -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()
diff --git a/commands/ct.go b/commands/ct.go
index 3cae0bd..8b6e8a8 100644
--- a/commands/ct.go
+++ b/commands/ct.go
@@ -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")
 			}
diff --git a/commands/msg/copy.go b/commands/msg/copy.go
index d6b78d3..48b296c 100644
--- a/commands/msg/copy.go
+++ b/commands/msg/copy.go
@@ -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
 }
diff --git a/commands/msg/move.go b/commands/msg/move.go
index 2f8c61e..d7e1ea9 100644
--- a/commands/msg/move.go
+++ b/commands/msg/move.go
@@ -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)
diff --git a/commands/msgview/save.go b/commands/msgview/save.go
index 3b38ec7..33cd45f 100644
--- a/commands/msgview/save.go
+++ b/commands/msgview/save.go
@@ -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)
--
2.23.0
Thanks!

To git.sr.ht:~sircmpwn/aerc
   3ec9fd2..043a02d  master -> master
View this thread in the archives