package main import ( "io" "log" "strconv" "strings" "time" "github.com/chzyer/readline" ) func usage(w io.Writer) { io.WriteString(w, ` login setprompt say bye `[1:]) } var completer = readline.NewPrefixCompleter( readline.PcItem("mode", readline.PcItem("vi"), readline.PcItem("emacs"), ), readline.PcItem("login"), readline.PcItem("say", readline.PcItem("hello"), readline.PcItem("bye"), ), readline.PcItem("setprompt"), readline.PcItem("bye"), readline.PcItem("help"), readline.PcItem("go", readline.PcItem("build"), readline.PcItem("install"), readline.PcItem("test"), ), ) func main() { l, err := readline.NewEx(&readline.Config{ Prompt: "\033[31m»\033[0m ", HistoryFile: "/tmp/readline.tmp", AutoComplete: completer, }) if err != nil { panic(err) } defer l.Close() log.SetOutput(l.Stderr()) for { line, err := l.Readline() if err != nil { break } line = strings.TrimSpace(line) switch { case strings.HasPrefix(line, "mode "): switch line[5:] { case "vi": l.SetVimMode(true) case "emacs": l.SetVimMode(false) default: println("invalid mode:", line[5:]) } case line == "mode": if l.IsVimMode() { println("current mode: vim") } else { println("current mode: emacs") } case line == "login": pswd, err := l.ReadPassword("please enter your password: ") if err != nil { break } println("you enter:", strconv.Quote(string(pswd))) case line == "help": usage(l.Stderr()) case strings.HasPrefix(line, "setprompt"): prompt := line[10:] if prompt == "" { log.Println("setprompt ") break } l.SetPrompt(prompt) case strings.HasPrefix(line, "say"): line := strings.TrimSpace(line[3:]) if len(line) == 0 { log.Println("say what?") break } go func() { for _ = range time.Tick(time.Second) { log.Println(line) } }() case line == "bye": goto exit case line == "": default: log.Println("you said:", strconv.Quote(line)) } } exit: }