diff options
| -rw-r--r-- | command.go | 19 | ||||
| -rw-r--r-- | complete_test.go | 31 |
2 files changed, 41 insertions, 9 deletions
@@ -1,6 +1,10 @@ package complete -import "github.com/posener/complete/match" +import ( + "strings" + + "github.com/posener/complete/match" +) // Command represents a command line // It holds the data that enables auto completion of command line @@ -19,6 +23,11 @@ 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 @@ -86,7 +95,9 @@ func (c *Command) predict(a Args) (options []string, only bool) { return predictor.Predict(a), true } - options = append(options, c.GlobalFlags.Predict(a)...) + if c.FlagsRequirePrefix == "" || strings.HasPrefix(a.Last, c.FlagsRequirePrefix) { + 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. @@ -101,7 +112,9 @@ func (c *Command) predict(a Args) (options []string, only bool) { } options = append(options, c.Sub.Predict(a)...) - options = append(options, c.Flags.Predict(a)...) + if c.FlagsRequirePrefix == "" || strings.HasPrefix(a.Last, c.FlagsRequirePrefix) { + 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 1a42da1..768f2c8 100644 --- a/complete_test.go +++ b/complete_test.go @@ -25,6 +25,13 @@ func TestCompleter_Complete(t *testing.T) { }, Args: PredictFiles("*.md"), }, + "sub3": { + Flags: Flags{ + "-flag4": PredictAnything, + "-flag5": PredictNothing, + }, + FlagsRequirePrefix: "-", + }, }, Flags: Flags{ "-o": PredictFiles("*.txt"), @@ -41,7 +48,7 @@ func TestCompleter_Complete(t *testing.T) { }{ { args: "", - want: []string{"sub1", "sub2", "-h", "-global1", "-o"}, + want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"}, }, { args: "-", @@ -49,7 +56,7 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "-h ", - want: []string{"sub1", "sub2", "-h", "-global1", "-o"}, + want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"}, }, { args: "-global1 ", // global1 is known follow flag @@ -57,7 +64,7 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "sub", - want: []string{"sub1", "sub2"}, + want: []string{"sub1", "sub2", "sub3"}, }, { args: "sub1", @@ -68,6 +75,10 @@ func TestCompleter_Complete(t *testing.T) { want: []string{"sub2"}, }, { + args: "sub3", + want: []string{"sub3"}, + }, + { args: "sub1 ", want: []string{"-flag1", "-flag2", "-h", "-global1"}, }, @@ -108,12 +119,20 @@ func TestCompleter_Complete(t *testing.T) { 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", "-h", "-global1", "-o"}, + want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"}, }, { args: "no-such-command", @@ -121,7 +140,7 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "no-such-command ", - want: []string{"sub1", "sub2", "-h", "-global1", "-o"}, + want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"}, }, { args: "-o ", @@ -149,7 +168,7 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "-o ./readme.md ", - want: []string{"sub1", "sub2", "-h", "-global1", "-o"}, + want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"}, }, { args: "-o sub2 -flag3 ", |
