diff --git a/complete.go b/complete.go index 063add4..279cd48 100644 --- a/complete.go +++ b/complete.go @@ -321,6 +321,44 @@ func completeCmd(acc []rune) (matches []string, longestAcc []rune) { return } +func completeFile(acc []rune) (matches []string, longestAcc []rune) { + s := string(acc) + + wd, err := os.Getwd() + if err != nil { + log.Printf("getting current directory: %s", err) + } + + files, err := ioutil.ReadDir(wd) + if err != nil { + log.Printf("reading directory: %s", err) + } + + var longest string + + for _, f := range files { + if !strings.HasPrefix(f.Name(), s) { + continue + } + + matches = append(matches, f.Name()) + + if longest != "" { + longest = matchLongest(longest, f.Name()) + } else if s != "" { + longest = f.Name() + } + } + + if longest == "" { + longest = s + } + + longestAcc = []rune(longest) + + return +} + func completeShell(acc []rune) (matches []string, longestAcc []rune) { s := string(acc) f := tokenize(s) diff --git a/eval.go b/eval.go index 8f5fe7a..eff0678 100644 --- a/eval.go +++ b/eval.go @@ -839,10 +839,15 @@ func (e *callExpr) eval(app *app, args []string) { app.ui.cmdPrefix = "" case "cmd-complete": var matches []string - if app.ui.cmdPrefix == ":" { + switch app.ui.cmdPrefix { + case ":": matches, app.ui.cmdAccLeft = completeCmd(app.ui.cmdAccLeft) - } else { + case "/", "?": + matches, app.ui.cmdAccLeft = completeFile(app.ui.cmdAccLeft) + case "$", "%", "!", "&": matches, app.ui.cmdAccLeft = completeShell(app.ui.cmdAccLeft) + default: + return } app.ui.draw(app.nav) if len(matches) > 1 {