13 KiB
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.
It can also provides shell-like interactives by using flagly (demo: flagly-shell)
Demo
Also works fine in windows
-
example/readline-demo The source code about the demo above
-
example/readline-im Example for how to write a IM program.
-
example/readline-multiline Example for how to parse command which can submit by multiple time.
-
example/readline-pass-strength A example about checking password strength, written by @sahib
Todo
- Vi Mode is not completely finish
- More funny examples
- Support dumb/eterm-color terminal in emacs
Features
- Support emacs/vi mode, almost all basic features that GNU-Readline is supported
- zsh-style backward/forward history search
- zsh-style completion
- Readline auto refresh when others write to Stdout while editing (it needs specify the Stdout/Stderr provided by *readline.Instance to others).
- Support colourful prompt in all platforms.
Usage
- Import package
go get gopkg.in/readline.v1
or
go get github.com/chzyer/readline
- Simplest example
import "gopkg.in/readline.v1"
rl, err := readline.New("> ")
if err != nil {
panic(err)
}
defer rl.Close()
for {
line, err := rl.Readline()
if err != nil { // io.EOF, readline.ErrInterrupt
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, readline.ErrInterrupt
break
}
println(line)
}
- Example with auto completion
import (
"gopkg.in/readline.v1"
)
var completer = readline.NewPrefixCompleter(
readline.PcItem("say",
readline.PcItem("hello"),
readline.PcItem("bye"),
),
readline.PcItem("help"),
)
rl, err := readline.NewEx(&readline.Config{
Prompt: "> ",
AutoComplete: completer,
})
if err != nil {
panic(err)
}
defer rl.Close()
for {
line, err := rl.Readline()
if err != nil { // io.EOF, readline.ErrInterrupt
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
Notice: Meta
+B
is equals with Alt
+B
in windows.
- 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 |
Ctrl +W |
Cut previous word |
Backspace |
Delete previous character |
Meta +Backspace |
Cut previous word |
Enter |
Line feed |
- Shortcut in Search Mode (
Ctrl
+S
orCtrl
+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 |
Backspace |
Delete previous character |
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 |
Tested with
Environment | $TERM |
---|---|
Mac OS X iTerm2 | xterm |
Mac OS X default Terminal.app | xterm |
Mac OS X iTerm2 Screen | screen |
Mac OS X iTerm2 Tmux | screen |
Ubuntu Server 14.04 LTS | linux |
Centos 7 | linux |
Windows 10 | - |
Notice:
Ctrl
+A
is not working inscreen
because it used as a control command by default
If you test it otherwhere, whether it works fine or not, please let me know!
Who is using Readline
Feedback
If you have any questions, please submit a github issue and any pull requests is welcomed :)
Backers
Love Readline? Help me keep it alive by donating funds to cover project expenses!
[Become a backer]