2015-05-23 23:16:09 +08:00
|
|
|
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
|
2016-03-15 13:36:43 +08:00
|
|
|
Ctrl-Left, Alt-B | Move cursor to previous word
|
|
|
|
Ctrl-Right, Alt-F | Move cursor to next word
|
2015-05-23 23:16:09 +08:00
|
|
|
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"
|
2016-03-15 13:36:43 +08:00
|
|
|
"path/filepath"
|
2015-05-23 23:16:09 +08:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/peterh/liner"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2016-03-15 13:36:43 +08:00
|
|
|
history_fn = filepath.Join(os.TempDir(), ".liner_example_history")
|
2015-05-23 23:16:09 +08:00
|
|
|
names = []string{"john", "james", "mary", "nancy"}
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
line := liner.NewLiner()
|
|
|
|
defer line.Close()
|
|
|
|
|
2016-03-15 13:36:43 +08:00
|
|
|
line.SetCtrlCAborts(true)
|
|
|
|
|
2015-05-23 23:16:09 +08:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
2016-03-15 13:36:43 +08:00
|
|
|
if name, err := line.Prompt("What is your name? "); err == nil {
|
2015-05-23 23:16:09 +08:00
|
|
|
log.Print("Got: ", name)
|
|
|
|
line.AppendHistory(name)
|
2016-03-15 13:36:43 +08:00
|
|
|
} else if err == liner.ErrPromptAborted {
|
|
|
|
log.Print("Aborted")
|
|
|
|
} else {
|
|
|
|
log.Print("Error reading line: ", err)
|
2015-05-23 23:16:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|