Readline is a pure go(golang) implementation for GNU-Readline kind library
Go to file
Cheney bed7d058a7 update README 2015-09-27 00:32:04 +08:00
example update demo 2015-09-26 01:01:20 +08:00
.gitignore support history 2015-09-21 13:14:10 +08:00
.travis.yml add test to travis 2015-09-25 12:48:59 +08:00
LICENSE Initial commit 2015-09-20 23:11:30 +08:00
README.md update README 2015-09-27 00:32:04 +08:00
char.go add auto complete 2015-09-25 22:56:00 +08:00
complete.go fix backward in complete select mode 2015-09-26 10:34:29 +08:00
complete_helper.go fix bugs in PrefixCompleter 2015-09-27 00:10:26 +08:00
doc.go add doc 2015-09-23 13:55:53 +08:00
history.go fix fwd search crash 2015-09-23 14:22:22 +08:00
operation.go update demo 2015-09-26 01:01:20 +08:00
readline.go add prefix completer 2015-09-26 00:31:09 +08:00
runebuf.go add auto complete 2015-09-25 22:56:00 +08:00
search.go support double-width-char & colorful prompt 2015-09-25 12:45:39 +08:00
terminal.go fix Ctrl+C in search mode do not send EOF 2015-09-25 00:49:55 +08:00
utils.go add prefix completer 2015-09-26 00:31:09 +08:00
utils_test.go add auto complete 2015-09-25 22:56:00 +08:00

README.md

readline

Software License Build Status GoDoc

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

You can read the source code in example/main.go.

Todo

  • Vim mode
  • Transpose words
  • More funny examples

Usage

  • Simplest example
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
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
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
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 in normal mode

| Shortcut | Comment | |--------------------+------------------------------------------| | Ctrl+A | Beginning of line | | Ctrl+B / | Backward one character | | Meta+B | Backward one word | | Ctrl+C | Send io.EOF | | Ctrl+D | Delete one character | | Meta+D | Delete one word | | Ctrl+E | End of line | | Ctrl+F / | Forward one character | | Meta+F | Forward one word | | Ctrl+G | Cancel | | Ctrl+H | Delete previous character | | Ctrl+I / Tab | Command line completion | | Ctrl+J | Line feed | | Ctrl+K | Cut text to the end of line | | Ctrl+L | Clean screen (TODO) | | Ctrl+M | Same as Enter key | | Ctrl+N / | Next line (in history) | | Ctrl+P / | Prev line (in history) | | Ctrl+R | Search backwards in history | | Ctrl+S | Search forwards in history | | Ctrl+T | Transpose characters | | Meta+T | Transpose words (TODO) | | Ctrl+U | Cut text to the beginning of line (TODO) | | Ctrl+W | Cut previous word | | Backspace | Delete previous character | | Meta+Backspace | Cut previous word | | Enter | Line feed |

  • Shortcut in Search Mode (Ctrl+S or Ctrl+r to enter this mode)

| Shortcut | Comment | |-------------------------+---------------------------------------------| | Ctrl+S | Search forwards in history | | Ctrl+R | Search backwards in history | | Ctrl+C / Ctrl+G | Exit Search Mode and revert the history | | Character | Move to next line | | Other | Exit Search Mode |

  • Shortcut in Complete Select Mode (double Tab to enter this mode)

| Shortcut | Comment | |-------------------------+---------------------------------------------| | Ctrl+F | Move Forward | | Ctrl+B | Move Backward | | Ctrl+N | Move to next line | | Ctrl+P | Move to previous line | | Ctrl+A | Move to the first candicate in current line | | Ctrl+E | Move to the last candicate in current line | | Tab / Enter | Use the word on cursor to complete | | Ctrl+C / Ctrl+G | Exit Complete Select Mode | | Other | Exit Complete Select Mode |

Feedback

If you have any question, please submit an GitHub Issues and any pull request is welcomed :)