diff --git a/comp.go b/comp.go new file mode 100644 index 0000000..e3fdf64 --- /dev/null +++ b/comp.go @@ -0,0 +1,111 @@ +package main + +import ( + "io/ioutil" + "log" + "os" + "strings" +) + +var ( + gCmdWords = []string{"set", "map", "cmd"} + gOptWords = []string{ + "preview", + "nopreview", + "hidden", + "nohidden", + "tabstop", + "scrolloff", + "sortby", + "showinfo", + "opener", + "ratios", + } +) + +func matchWord(s string, words []string) string { + var match string + + for _, w := range words { + if strings.HasPrefix(w, s) { + if match != "" { + return s + } + match = w + } + } + + if match != "" { + return match + " " + } + + return s +} + +func matchFile(s string) string { + var match string + + wd, err := os.Getwd() + if err != nil { + log.Print(err) + } + + fi, err := ioutil.ReadDir(wd) + if err != nil { + log.Print(err) + } + + for _, f := range fi { + if strings.HasPrefix(f.Name(), s) { + if match != "" { + return s + } + match = f.Name() + } + } + + if match != "" { + return match + " " + } + + return s +} + +func compCmd(acc []rune) []rune { + if len(acc) == 0 || acc[len(acc)-1] == ' ' { + return acc + } + + s := string(acc) + f := strings.Fields(s) + + switch len(f) { + case 0: // do nothing + case 1: + words := gCmdWords + for c, _ := range gOpts.cmds { + words = append(words, c) + } + return []rune(matchWord(s, words)) + default: + switch f[0] { + case "set": + opt := matchWord(f[1], gOptWords) + ret := []rune(f[0]) + ret = append(ret, ' ') + ret = append(ret, []rune(opt)...) + return ret + case "map", "cmd": // do nothing + default: + ret := []rune(f[0]) + ret = append(ret, ' ') + for i := 1; i < len(f); i++ { + name := matchFile(f[i]) + ret = append(ret, []rune(name)...) + } + return ret + } + } + + return acc +} diff --git a/ui.go b/ui.go index 546056d..05d5a84 100644 --- a/ui.go +++ b/ui.go @@ -445,6 +445,8 @@ func (ui *UI) prompt(pref string) string { termbox.SetCursor(win.x, win.y) termbox.Flush() return string(acc) + case termbox.KeyTab: + acc = compCmd(acc) case termbox.KeyEsc: return "" }