summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--command.go27
-rw-r--r--complete_test.go43
2 files changed, 27 insertions, 43 deletions
diff --git a/command.go b/command.go
index 3566b56..c3e7e97 100644
--- a/command.go
+++ b/command.go
@@ -1,10 +1,6 @@
package complete
-import (
- "strings"
-
- "github.com/posener/complete/match"
-)
+import "github.com/posener/complete/match"
// Command represents a command line
// It holds the data that enables auto completion of command line
@@ -23,11 +19,6 @@ type Command struct {
// Global flags that can appear also after a sub command.
GlobalFlags Flags
- // FlagsRequirePrefix requires that the prefix is provided before flags are
- // autocompleted. This allows completion to only display completions for
- // arguments if for example no hypen is provided.
- FlagsRequirePrefix string
-
// Args are extra arguments that the command accepts, those who are
// given without any flag before.
Args Predictor
@@ -58,6 +49,14 @@ type Flags map[string]Predictor
// Predict completion of flags names according to command line arguments
func (f Flags) Predict(a Args) (prediction []string) {
for flag := range f {
+ // If the flag starts with a hyphen, we avoid emiting the prediction
+ // unless the last typed arg contains a hyphen as well.
+ flagHyphenStart := len(flag) != 0 && flag[0] == '-'
+ lastHyphenStart := len(a.Last) != 0 && a.Last[0] == '-'
+ if flagHyphenStart && !lastHyphenStart {
+ continue
+ }
+
if match.Prefix(flag, a.Last) {
prediction = append(prediction, flag)
}
@@ -95,9 +94,7 @@ func (c *Command) predict(a Args) (options []string, only bool) {
return predictor.Predict(a), true
}
- if c.FlagsRequirePrefix == "" || strings.HasPrefix(a.Last, c.FlagsRequirePrefix) {
- options = append(options, c.GlobalFlags.Predict(a)...)
- }
+ options = append(options, c.GlobalFlags.Predict(a)...)
// if a sub command was entered, we won't add the parent command
// completions and we return here.
@@ -112,9 +109,7 @@ func (c *Command) predict(a Args) (options []string, only bool) {
}
options = append(options, c.Sub.Predict(a)...)
- if c.FlagsRequirePrefix == "" || strings.HasPrefix(a.Last, c.FlagsRequirePrefix) {
- options = append(options, c.Flags.Predict(a)...)
- }
+ options = append(options, c.Flags.Predict(a)...)
if c.Args != nil {
options = append(options, c.Args.Predict(a)...)
}
diff --git a/complete_test.go b/complete_test.go
index 768f2c8..68efb0f 100644
--- a/complete_test.go
+++ b/complete_test.go
@@ -25,13 +25,6 @@ func TestCompleter_Complete(t *testing.T) {
},
Args: PredictFiles("*.md"),
},
- "sub3": {
- Flags: Flags{
- "-flag4": PredictAnything,
- "-flag5": PredictNothing,
- },
- FlagsRequirePrefix: "-",
- },
},
Flags: Flags{
"-o": PredictFiles("*.txt"),
@@ -48,7 +41,7 @@ func TestCompleter_Complete(t *testing.T) {
}{
{
args: "",
- want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
+ want: []string{"sub1", "sub2"},
},
{
args: "-",
@@ -56,7 +49,7 @@ func TestCompleter_Complete(t *testing.T) {
},
{
args: "-h ",
- want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
+ want: []string{"sub1", "sub2"},
},
{
args: "-global1 ", // global1 is known follow flag
@@ -64,7 +57,7 @@ func TestCompleter_Complete(t *testing.T) {
},
{
args: "sub",
- want: []string{"sub1", "sub2", "sub3"},
+ want: []string{"sub1", "sub2"},
},
{
args: "sub1",
@@ -75,16 +68,16 @@ func TestCompleter_Complete(t *testing.T) {
want: []string{"sub2"},
},
{
- args: "sub3",
- want: []string{"sub3"},
+ args: "sub1 ",
+ want: []string{},
},
{
- args: "sub1 ",
+ args: "sub1 -",
want: []string{"-flag1", "-flag2", "-h", "-global1"},
},
{
args: "sub2 ",
- want: []string{"./", "dir/", "outer/", "readme.md", "-flag2", "-flag3", "-h", "-global1"},
+ want: []string{"./", "dir/", "outer/", "readme.md"},
},
{
args: "sub2 ./",
@@ -100,7 +93,7 @@ func TestCompleter_Complete(t *testing.T) {
},
{
args: "sub2 -flag2 ",
- want: []string{"./", "dir/", "outer/", "readme.md", "-flag2", "-flag3", "-h", "-global1"},
+ want: []string{"./", "dir/", "outer/", "readme.md"},
},
{
args: "sub1 -fl",
@@ -115,24 +108,20 @@ func TestCompleter_Complete(t *testing.T) {
want: []string{}, // flag1 is unknown follow flag
},
{
- args: "sub1 -flag2 ",
+ args: "sub1 -flag2 -",
want: []string{"-flag1", "-flag2", "-h", "-global1"},
},
{
- args: "sub3 ",
- want: []string{"-h", "-global1"},
- },
- {
- args: "sub3 -",
- want: []string{"-flag4", "-flag5", "-h", "-global1"},
- },
- {
args: "-no-such-flag",
want: []string{},
},
{
args: "-no-such-flag ",
- want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
+ want: []string{"sub1", "sub2"},
+ },
+ {
+ args: "-no-such-flag -",
+ want: []string{"-h", "-global1", "-o"},
},
{
args: "no-such-command",
@@ -140,7 +129,7 @@ func TestCompleter_Complete(t *testing.T) {
},
{
args: "no-such-command ",
- want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
+ want: []string{"sub1", "sub2"},
},
{
args: "-o ",
@@ -168,7 +157,7 @@ func TestCompleter_Complete(t *testing.T) {
},
{
args: "-o ./readme.md ",
- want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
+ want: []string{"sub1", "sub2"},
},
{
args: "-o sub2 -flag3 ",