summaryrefslogtreecommitdiff
path: root/gocomplete
diff options
context:
space:
mode:
Diffstat (limited to 'gocomplete')
-rw-r--r--gocomplete/complete.go36
-rw-r--r--gocomplete/pkgs.go50
2 files changed, 67 insertions, 19 deletions
diff --git a/gocomplete/complete.go b/gocomplete/complete.go
index 1575e1b..e8ecacd 100644
--- a/gocomplete/complete.go
+++ b/gocomplete/complete.go
@@ -4,19 +4,17 @@ package main
import "github.com/posener/complete"
var (
- predictEllipsis = complete.PredictSet("./...")
-
- goFilesOrPackages = complete.PredictOr(
- complete.PredictFiles("*.go"),
- complete.PredictDirs("*"),
- predictEllipsis,
- )
+ ellipsis = complete.PredictSet("./...")
+ 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 +33,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 +76,7 @@ func main() {
"-outputdir": complete.PredictDirs("*"),
"-trace": complete.PredictFiles("*.out"),
},
- Args: goFilesOrPackages,
+ Args: anyGo,
}
fmt := complete.Command{
@@ -86,7 +84,7 @@ func main() {
"-n": complete.PredictNothing,
"-x": complete.PredictNothing,
},
- Args: goFilesOrPackages,
+ Args: anyGo,
}
get := complete.Command{
@@ -98,7 +96,7 @@ func main() {
"-t": complete.PredictNothing,
"-u": complete.PredictNothing,
},
- Args: goFilesOrPackages,
+ Args: anyGo,
}
generate := complete.Command{
@@ -108,7 +106,7 @@ func main() {
"-v": complete.PredictNothing,
"-run": complete.PredictAnything,
},
- Args: goFilesOrPackages,
+ Args: anyGo,
}
vet := complete.Command{
@@ -116,7 +114,7 @@ func main() {
"-n": complete.PredictNothing,
"-x": complete.PredictNothing,
},
- Args: complete.PredictDirs("*"),
+ Args: anyGo,
}
list := complete.Command{
@@ -125,7 +123,7 @@ func main() {
"-f": complete.PredictAnything,
"-json": complete.PredictNothing,
},
- Args: complete.PredictDirs("*"),
+ Args: complete.PredictOr(anyPackage, ellipsis),
}
tool := complete.Command{
@@ -142,7 +140,7 @@ func main() {
"-n": complete.PredictNothing,
"-x": complete.PredictNothing,
},
- Args: complete.PredictDirs("*"),
+ Args: complete.PredictOr(anyPackage, ellipsis),
}
env := complete.Command{
@@ -153,7 +151,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
+}