Default to hiding flags that start with hyphen unless last arg has a hyphen
This commit is contained in:
parent
59e6151c5b
commit
97340ccc21
27
command.go
27
command.go
|
@ -1,10 +1,6 @@
|
||||||
package complete
|
package complete
|
||||||
|
|
||||||
import (
|
import "github.com/posener/complete/match"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/posener/complete/match"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Command represents a command line
|
// Command represents a command line
|
||||||
// It holds the data that enables auto completion of 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.
|
// Global flags that can appear also after a sub command.
|
||||||
GlobalFlags Flags
|
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
|
// Args are extra arguments that the command accepts, those who are
|
||||||
// given without any flag before.
|
// given without any flag before.
|
||||||
Args Predictor
|
Args Predictor
|
||||||
|
@ -58,6 +49,14 @@ type Flags map[string]Predictor
|
||||||
// Predict completion of flags names according to command line arguments
|
// Predict completion of flags names according to command line arguments
|
||||||
func (f Flags) Predict(a Args) (prediction []string) {
|
func (f Flags) Predict(a Args) (prediction []string) {
|
||||||
for flag := range f {
|
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) {
|
if match.Prefix(flag, a.Last) {
|
||||||
prediction = append(prediction, flag)
|
prediction = append(prediction, flag)
|
||||||
}
|
}
|
||||||
|
@ -95,9 +94,7 @@ func (c *Command) predict(a Args) (options []string, only bool) {
|
||||||
return predictor.Predict(a), true
|
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
|
// if a sub command was entered, we won't add the parent command
|
||||||
// completions and we return here.
|
// 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)...)
|
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 {
|
if c.Args != nil {
|
||||||
options = append(options, c.Args.Predict(a)...)
|
options = append(options, c.Args.Predict(a)...)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,13 +25,6 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
},
|
},
|
||||||
Args: PredictFiles("*.md"),
|
Args: PredictFiles("*.md"),
|
||||||
},
|
},
|
||||||
"sub3": {
|
|
||||||
Flags: Flags{
|
|
||||||
"-flag4": PredictAnything,
|
|
||||||
"-flag5": PredictNothing,
|
|
||||||
},
|
|
||||||
FlagsRequirePrefix: "-",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Flags: Flags{
|
Flags: Flags{
|
||||||
"-o": PredictFiles("*.txt"),
|
"-o": PredictFiles("*.txt"),
|
||||||
|
@ -48,7 +41,7 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
args: "",
|
args: "",
|
||||||
want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
|
want: []string{"sub1", "sub2"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "-",
|
args: "-",
|
||||||
|
@ -56,7 +49,7 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "-h ",
|
args: "-h ",
|
||||||
want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
|
want: []string{"sub1", "sub2"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "-global1 ", // global1 is known follow flag
|
args: "-global1 ", // global1 is known follow flag
|
||||||
|
@ -64,7 +57,7 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub",
|
args: "sub",
|
||||||
want: []string{"sub1", "sub2", "sub3"},
|
want: []string{"sub1", "sub2"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub1",
|
args: "sub1",
|
||||||
|
@ -75,16 +68,16 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
want: []string{"sub2"},
|
want: []string{"sub2"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub3",
|
args: "sub1 ",
|
||||||
want: []string{"sub3"},
|
want: []string{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub1 ",
|
args: "sub1 -",
|
||||||
want: []string{"-flag1", "-flag2", "-h", "-global1"},
|
want: []string{"-flag1", "-flag2", "-h", "-global1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub2 ",
|
args: "sub2 ",
|
||||||
want: []string{"./", "dir/", "outer/", "readme.md", "-flag2", "-flag3", "-h", "-global1"},
|
want: []string{"./", "dir/", "outer/", "readme.md"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub2 ./",
|
args: "sub2 ./",
|
||||||
|
@ -100,7 +93,7 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub2 -flag2 ",
|
args: "sub2 -flag2 ",
|
||||||
want: []string{"./", "dir/", "outer/", "readme.md", "-flag2", "-flag3", "-h", "-global1"},
|
want: []string{"./", "dir/", "outer/", "readme.md"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub1 -fl",
|
args: "sub1 -fl",
|
||||||
|
@ -115,24 +108,20 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
want: []string{}, // flag1 is unknown follow flag
|
want: []string{}, // flag1 is unknown follow flag
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "sub1 -flag2 ",
|
args: "sub1 -flag2 -",
|
||||||
want: []string{"-flag1", "-flag2", "-h", "-global1"},
|
want: []string{"-flag1", "-flag2", "-h", "-global1"},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
args: "sub3 ",
|
|
||||||
want: []string{"-h", "-global1"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
args: "sub3 -",
|
|
||||||
want: []string{"-flag4", "-flag5", "-h", "-global1"},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
args: "-no-such-flag",
|
args: "-no-such-flag",
|
||||||
want: []string{},
|
want: []string{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "-no-such-flag ",
|
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",
|
args: "no-such-command",
|
||||||
|
@ -140,7 +129,7 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "no-such-command ",
|
args: "no-such-command ",
|
||||||
want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
|
want: []string{"sub1", "sub2"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "-o ",
|
args: "-o ",
|
||||||
|
@ -168,7 +157,7 @@ func TestCompleter_Complete(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "-o ./readme.md ",
|
args: "-o ./readme.md ",
|
||||||
want: []string{"sub1", "sub2", "sub3", "-h", "-global1", "-o"},
|
want: []string{"sub1", "sub2"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
args: "-o sub2 -flag3 ",
|
args: "-o sub2 -flag3 ",
|
||||||
|
|
Loading…
Reference in New Issue