Liner ===== Liner is a command line editor with history. It was inspired by linenoise; everything Unix-like is a VT100 (or is trying very hard to be). If your terminal is not pretending to be a VT100, change it. Liner also support Windows. Liner is released under the X11 license (which is similar to the new BSD license). Line Editing ------------ The following line editing commands are supported on platforms and terminals that Liner supports: Keystroke | Action --------- | ------ Ctrl-A, Home | Move cursor to beginning of line Ctrl-E, End | Move cursor to end of line Ctrl-B, Left | Move cursor one character left Ctrl-F, Right| Move cursor one character right Ctrl-Left, Alt-B | Move cursor to previous word Ctrl-Right, Alt-F | Move cursor to next word Ctrl-D, Del | (if line is *not* empty) Delete character under cursor Ctrl-D | (if line *is* empty) End of File - usually quits application Ctrl-C | Reset input (create new empty prompt) Ctrl-L | Clear screen (line is unmodified) Ctrl-T | Transpose previous character with current character Ctrl-H, BackSpace | Delete character before cursor Ctrl-W | Delete word leading up to cursor Ctrl-K | Delete from cursor to end of line Ctrl-U | Delete from start of line to cursor Ctrl-P, Up | Previous match from history Ctrl-N, Down | Next match from history Ctrl-R | Reverse Search history (Ctrl-S forward, Ctrl-G cancel) Ctrl-Y | Paste from Yank buffer (Alt-Y to paste next yank instead) Tab | Next completion Shift-Tab | (after Tab) Previous completion Getting started ----------------- ```go package main import ( "log" "os" "path/filepath" "strings" "github.com/peterh/liner" ) var ( history_fn = filepath.Join(os.TempDir(), ".liner_example_history") names = []string{"john", "james", "mary", "nancy"} ) func main() { line := liner.NewLiner() defer line.Close() line.SetCtrlCAborts(true) line.SetCompleter(func(line string) (c []string) { for _, n := range names { if strings.HasPrefix(n, strings.ToLower(line)) { c = append(c, n) } } return }) if f, err := os.Open(history_fn); err == nil { line.ReadHistory(f) f.Close() } if name, err := line.Prompt("What is your name? "); err == nil { log.Print("Got: ", name) line.AppendHistory(name) } else if err == liner.ErrPromptAborted { log.Print("Aborted") } else { log.Print("Error reading line: ", err) } if f, err := os.Create(history_fn); err != nil { log.Print("Error writing history file: ", err) } else { line.WriteHistory(f) f.Close() } } ``` For documentation, see http://godoc.org/github.com/peterh/liner