forked from mirror/readline
173 lines
4.4 KiB
Markdown
173 lines
4.4 KiB
Markdown
# readline
|
|
|
|
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE.md)
|
|
[![Build Status](https://travis-ci.org/chzyer/readline.svg?branch=master)](https://travis-ci.org/chzyer/readline)
|
|
[![GoDoc](https://godoc.org/github.com/chzyer/readline?status.svg)](https://godoc.org/github.com/chzyer/readline)
|
|
|
|
Readline is A Pure Go Implementation of a libreadline-style Library.
|
|
The goal is to be a powerful alternater for GNU-Readline.
|
|
|
|
|
|
**WHY:**
|
|
Readline will support most of features which GNU Readline is supported, and provide a pure go environment and a MIT license.
|
|
|
|
# Demo
|
|
|
|
![demo](https://raw.githubusercontent.com/chzyer/readline/master/example/demo.gif)
|
|
|
|
You can read the source code in [example/main.go](https://github.com/chzyer/readline/blob/master/example/main.go).
|
|
|
|
# Todo
|
|
|
|
* Vim mode
|
|
* Transpose words
|
|
* More funny examples
|
|
|
|
# Usage
|
|
|
|
* Simplest example
|
|
|
|
```go
|
|
import "github.com/chzyer/readline"
|
|
|
|
rl, err := readline.New("> ")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer rl.Close()
|
|
|
|
for {
|
|
line, err := rl.Readline()
|
|
if err != nil { // io.EOF
|
|
break
|
|
}
|
|
println(line)
|
|
}
|
|
```
|
|
|
|
* Example with durable history
|
|
|
|
```go
|
|
rl, err := readline.NewEx(&readline.Config{
|
|
Prompt: "> ",
|
|
HistoryFile: "/tmp/readline.tmp",
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer rl.Close()
|
|
|
|
for {
|
|
line, err := rl.Readline()
|
|
if err != nil { // io.EOF
|
|
break
|
|
}
|
|
println(line)
|
|
}
|
|
```
|
|
|
|
* Example with auto refresh
|
|
|
|
```go
|
|
import (
|
|
"log"
|
|
"github.com/chzyer/readline"
|
|
)
|
|
|
|
rl, err := readline.New("> ")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer rl.Close()
|
|
log.SetOutput(l.Stderr()) // let "log" write to l.Stderr instead of os.Stderr
|
|
|
|
go func() {
|
|
for _ = range time.Tick(time.Second) {
|
|
log.Println("hello")
|
|
}
|
|
}()
|
|
|
|
for {
|
|
line, err := rl.Readline()
|
|
if err != nil { // io.EOF
|
|
break
|
|
}
|
|
println(line)
|
|
}
|
|
```
|
|
|
|
* Example with auto completion
|
|
|
|
```go
|
|
import (
|
|
"log"
|
|
"github.com/chzyer/readline"
|
|
)
|
|
|
|
var completer = readline.NewPrefixCompleter(
|
|
readline.PcItem("say",
|
|
readline.PcItem("hello"),
|
|
readline.PcItem("bye"),
|
|
),
|
|
readline.PcItem("help"),
|
|
)
|
|
|
|
rl, err := readline.New(&readline.Config{
|
|
Prompt: "> ",
|
|
AutoComplete: completer,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer rl.Close()
|
|
|
|
for {
|
|
line, err := rl.Readline()
|
|
if err != nil { // io.EOF
|
|
break
|
|
}
|
|
println(line)
|
|
}
|
|
```
|
|
|
|
|
|
# Shortcut
|
|
|
|
`Meta`+`B` means press `Esc` and `n` separately.
|
|
Users can change that in terminal simulator(i.e. iTerm2) to `Alt`+`B`
|
|
|
|
| Shortcut | Comment | Support |
|
|
|--------------------|-----------------------------------|---------|
|
|
| `Ctrl`+`A` | Beginning of line | Yes |
|
|
| `Ctrl`+`B` / `←` | Backward one character | Yes |
|
|
| `Meta`+`B` | Backward one word | Yes |
|
|
| `Ctrl`+`C` | Send io.EOF | Yes |
|
|
| `Ctrl`+`D` | Delete one character | Yes |
|
|
| `Meta`+`D` | Delete one word | Yes |
|
|
| `Ctrl`+`E` | End of line | Yes |
|
|
| `Ctrl`+`F` / `→` | Forward one character | Yes |
|
|
| `Meta`+`F` | Forward one word | Yes |
|
|
| `Ctrl`+`G` | Cancel | Yes |
|
|
| `Ctrl`+`H` | Delete previous character | Yes |
|
|
| `Ctrl`+`I` / `Tab` | Command line completion | Yes |
|
|
| `Ctrl`+`J` | Line feed | Yes |
|
|
| `Ctrl`+`K` | Cut text to the end of line | Yes |
|
|
| `Ctrl`+`L` | Clean screen | NoYet |
|
|
| `Ctrl`+`M` | Same as Enter key | Yes |
|
|
| `Ctrl`+`N` / `↓` | Next line (in history) | Yes |
|
|
| `Ctrl`+`P` / `↑` | Prev line (in history) | Yes |
|
|
| `Ctrl`+`R` | Search backwards in history | Yes |
|
|
| `Ctrl`+`S` | Search forwards in history | Yes |
|
|
| `Ctrl`+`T` | Transpose characters | Yes |
|
|
| `Meta`+`T` | Transpose words | Not Yet |
|
|
| `Ctrl`+`U` | Cut text to the beginning of line | Not Yet |
|
|
| `Ctrl`+`W` | Cut previous word | Yes |
|
|
| `Backspace` | Delete previous character | Yes |
|
|
| `Meta`+`Backspace` | Cut previous word | Yes |
|
|
| `Enter` | Line feed | Yes |
|
|
|
|
|
|
# Feedback
|
|
|
|
If you have any question, please submit an GitHub Issues and any pull request is welcomed :)
|