diff options
| author | Eyal Posener <[email protected]> | 2017-05-13 00:45:08 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-05-13 00:45:08 +0300 |
| commit | 9123548bc5f7725948b6096be4ef490af71194b3 (patch) | |
| tree | 33e21d60ec1412ff7aaf1c73363208e79d96d8b3 /gocomplete/pkgs.go | |
| parent | 136e52e074be4a85fb9e9bccf93d060c46e67561 (diff) | |
| parent | bc5d682221f38e82bbd977d5567da8b884a30cbc (diff) | |
Merge pull request #16 from posener/recursive-dirs
Recursive directories and complete by go packages
Diffstat (limited to 'gocomplete/pkgs.go')
| -rw-r--r-- | gocomplete/pkgs.go | 50 |
1 files changed, 50 insertions, 0 deletions
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 +} |
