From f580110640e0213502e4fe1138a06f57b532ff7a Mon Sep 17 00:00:00 2001 From: Eyal Posener Date: Sat, 13 May 2017 00:17:48 +0300 Subject: gocomplete: complete by packages --- gocomplete/complete.go | 37 ++++++++++++++++++------------------- gocomplete/pkgs.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 gocomplete/pkgs.go (limited to 'gocomplete') diff --git a/gocomplete/complete.go b/gocomplete/complete.go index 1575e1b..4b4da67 100644 --- a/gocomplete/complete.go +++ b/gocomplete/complete.go @@ -4,19 +4,18 @@ package main import "github.com/posener/complete" var ( - predictEllipsis = complete.PredictSet("./...") - - goFilesOrPackages = complete.PredictOr( - complete.PredictFiles("*.go"), - complete.PredictDirs("*"), - predictEllipsis, - ) + ellipsis = complete.PredictSet("./...") + mainPackages = predictPackages("main") + anyPackage = predictPackages("") + goFiles = complete.PredictFiles("*.go") + anyFile = complete.PredictFiles("*") + anyGo = complete.PredictOr(goFiles, anyPackage, ellipsis) ) func main() { build := complete.Command{ Flags: complete.Flags{ - "-o": complete.PredictFiles("*"), + "-o": anyFile, "-i": complete.PredictNothing, "-a": complete.PredictNothing, @@ -35,18 +34,18 @@ func main() { "-installsuffix": complete.PredictAnything, "-ldflags": complete.PredictAnything, "-linkshared": complete.PredictNothing, - "-pkgdir": complete.PredictDirs("*"), + "-pkgdir": anyPackage, "-tags": complete.PredictAnything, "-toolexec": complete.PredictAnything, }, - Args: goFilesOrPackages, + Args: anyGo, } run := complete.Command{ Flags: complete.Flags{ "-exec": complete.PredictAnything, }, - Args: complete.PredictFiles("*.go"), + Args: goFiles, } test := complete.Command{ @@ -78,7 +77,7 @@ func main() { "-outputdir": complete.PredictDirs("*"), "-trace": complete.PredictFiles("*.out"), }, - Args: goFilesOrPackages, + Args: anyGo, } fmt := complete.Command{ @@ -86,7 +85,7 @@ func main() { "-n": complete.PredictNothing, "-x": complete.PredictNothing, }, - Args: goFilesOrPackages, + Args: anyGo, } get := complete.Command{ @@ -98,7 +97,7 @@ func main() { "-t": complete.PredictNothing, "-u": complete.PredictNothing, }, - Args: goFilesOrPackages, + Args: anyGo, } generate := complete.Command{ @@ -108,7 +107,7 @@ func main() { "-v": complete.PredictNothing, "-run": complete.PredictAnything, }, - Args: goFilesOrPackages, + Args: anyGo, } vet := complete.Command{ @@ -116,7 +115,7 @@ func main() { "-n": complete.PredictNothing, "-x": complete.PredictNothing, }, - Args: complete.PredictDirs("*"), + Args: anyGo, } list := complete.Command{ @@ -125,7 +124,7 @@ func main() { "-f": complete.PredictAnything, "-json": complete.PredictNothing, }, - Args: complete.PredictDirs("*"), + Args: complete.PredictOr(anyPackage, ellipsis), } tool := complete.Command{ @@ -142,7 +141,7 @@ func main() { "-n": complete.PredictNothing, "-x": complete.PredictNothing, }, - Args: complete.PredictDirs("*"), + Args: complete.PredictOr(anyPackage, ellipsis), } env := complete.Command{ @@ -153,7 +152,7 @@ func main() { version := complete.Command{} fix := complete.Command{ - Args: complete.PredictDirs("*"), + Args: anyGo, } // commands that also accepts the build flags diff --git a/gocomplete/pkgs.go b/gocomplete/pkgs.go new file mode 100644 index 0000000..b223ea9 --- /dev/null +++ b/gocomplete/pkgs.go @@ -0,0 +1,50 @@ +package main + +import ( + "bytes" + "encoding/json" + "os/exec" + "strings" + + "github.com/posener/complete" +) + +const goListFormat = `'{"name": "{{.Name}}", "dir": "{{.Dir}}"}'` + +func predictPackages(packageName string) complete.Predictor { + return complete.PredictFunc(func(a complete.Args) (prediction []string) { + dir := a.Directory() + dir = strings.TrimRight(dir, "/.") + "/..." + + pkgs := listPackages(dir) + + files := make([]string, 0, len(pkgs)) + for _, p := range pkgs { + if packageName != "" && p.Name != packageName { + continue + } + files = append(files, p.Path) + } + return complete.PredictFilesSet(files).Predict(a) + }) +} + +type pack struct { + Name string + Path string +} + +func listPackages(dir string) (pkgs []pack) { + out, err := exec.Command("go", "list", "-f", goListFormat, dir).Output() + if err != nil { + return + } + lines := bytes.Split(out, []byte("\n")) + for _, line := range lines { + var p pack + if err := json.Unmarshal(line, &p); err == nil { + pkgs = append(pkgs, p) + } + } + return +} -- cgit v1.2.3 From bc5d682221f38e82bbd977d5567da8b884a30cbc Mon Sep 17 00:00:00 2001 From: Eyal Posener Date: Sat, 13 May 2017 00:40:26 +0300 Subject: fix nested files --- complete_test.go | 10 +++++----- gocomplete/complete.go | 1 - predict_files.go | 2 +- predict_test.go | 18 +++++++++++++++--- tests/outer/inner/readme.md | 0 5 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 tests/outer/inner/readme.md (limited to 'gocomplete') diff --git a/complete_test.go b/complete_test.go index c9d544b..5cc4be0 100644 --- a/complete_test.go +++ b/complete_test.go @@ -81,11 +81,11 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "sub2 ", - want: []string{"./", "./dir/", "./readme.md", "-flag2", "-flag3", "-h", "-global1", "-o"}, + want: []string{"./", "./dir/", "./outer/", "./readme.md", "-flag2", "-flag3", "-h", "-global1", "-o"}, }, { args: "sub2 ./", - want: []string{"./", "./readme.md", "./dir/"}, + want: []string{"./", "./readme.md", "./dir/", "./outer/"}, }, { args: "sub2 re", @@ -93,7 +93,7 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "sub2 -flag2 ", - want: []string{"./", "./dir/", "./readme.md", "-flag2", "-flag3", "-h", "-global1", "-o"}, + want: []string{"./", "./dir/", "./outer/", "./readme.md", "-flag2", "-flag3", "-h", "-global1", "-o"}, }, { args: "sub1 -fl", @@ -129,7 +129,7 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "-o ", - want: append(testTXTFiles, "./", "./dir/"), + want: append(testTXTFiles, "./", "./dir/", "./outer/"), }, { args: "-o ./no-su", @@ -137,7 +137,7 @@ func TestCompleter_Complete(t *testing.T) { }, { args: "-o ./", - want: append(testTXTFiles, "./", "./dir/"), + want: append(testTXTFiles, "./", "./dir/", "./outer/"), }, { args: "-o ./read", diff --git a/gocomplete/complete.go b/gocomplete/complete.go index 4b4da67..e8ecacd 100644 --- a/gocomplete/complete.go +++ b/gocomplete/complete.go @@ -5,7 +5,6 @@ import "github.com/posener/complete" var ( ellipsis = complete.PredictSet("./...") - mainPackages = predictPackages("main") anyPackage = predictPackages("") goFiles = complete.PredictFiles("*.go") anyFile = complete.PredictFiles("*") diff --git a/predict_files.go b/predict_files.go index 0543442..5f83e77 100644 --- a/predict_files.go +++ b/predict_files.go @@ -107,7 +107,7 @@ func listFiles(dir, pattern string, allowFiles bool) []string { if dirs, err := ioutil.ReadDir(dir); err == nil { for _, d := range dirs { if d.IsDir() { - m[d.Name()] = true + m[filepath.Join(dir, d.Name())] = true } } } diff --git a/predict_test.go b/predict_test.go index 9fe22a9..b2840c0 100644 --- a/predict_test.go +++ b/predict_test.go @@ -60,7 +60,7 @@ func TestPredicate(t *testing.T) { { name: "files/txt", p: PredictFiles("*.txt"), - want: []string{"./", "./dir/", "./a.txt", "./b.txt", "./c.txt", "./.dot.txt"}, + want: []string{"./", "./dir/", "./outer/", "./a.txt", "./b.txt", "./c.txt", "./.dot.txt"}, }, { name: "files/txt", @@ -84,7 +84,7 @@ func TestPredicate(t *testing.T) { name: "files/md", p: PredictFiles("*.md"), argList: []string{"", ".", "./"}, - want: []string{"./", "./dir/", "./readme.md"}, + want: []string{"./", "./dir/", "./outer/", "./readme.md"}, }, { name: "dirs", @@ -102,7 +102,19 @@ func TestPredicate(t *testing.T) { name: "root directories", p: PredictDirs("*"), argList: []string{"", ".", "./"}, - want: []string{"./", "./dir/"}, + want: []string{"./", "./dir/", "./outer/"}, + }, + { + name: "nested directories", + p: PredictDirs("*.md"), + argList: []string{"ou", "./ou", "./outer", "./outer/"}, + want: []string{"./outer/", "./outer/inner/"}, + }, + { + name: "nested inner directory", + p: PredictFiles("*.md"), + argList: []string{"outer/i"}, + want: []string{"./outer/inner/", "./outer/inner/readme.md"}, }, } diff --git a/tests/outer/inner/readme.md b/tests/outer/inner/readme.md new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3