Skip to content

Commit 7d7bc87

Browse files
committed
Improve REPL(GNU Readline like)
1 parent 478861c commit 7d7bc87

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

cmd/glua/glua.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package main
22

33
import (
4-
"bufio"
54
"flag"
65
"fmt"
6+
"github.com/chzyer/readline"
77
"github.com/yuin/gopher-lua"
88
"github.com/yuin/gopher-lua/parse"
99
"os"
@@ -122,9 +122,13 @@ Available options are:
122122

123123
// do read/eval/print/loop
124124
func doREPL(L *lua.LState) {
125-
reader := bufio.NewReader(os.Stdin)
125+
rl, err := readline.New("> ")
126+
if err != nil {
127+
panic(err)
128+
}
129+
defer rl.Close()
126130
for {
127-
if str, err := loadline(reader, L); err == nil {
131+
if str, err := loadline(rl, L); err == nil {
128132
if err := L.DoString(str); err != nil {
129133
fmt.Println(err)
130134
}
@@ -144,28 +148,28 @@ func incomplete(err error) bool {
144148
return false
145149
}
146150

147-
func loadline(reader *bufio.Reader, L *lua.LState) (string, error) {
148-
fmt.Print("> ")
149-
if line, err := reader.ReadString('\n'); err == nil {
151+
func loadline(rl *readline.Instance, L *lua.LState) (string, error) {
152+
rl.SetPrompt("> ")
153+
if line, err := rl.Readline(); err == nil {
150154
if _, err := L.LoadString("return " + line); err == nil { // try add return <...> then compile
151155
return line, nil
152156
} else {
153-
return multiline(line, reader, L)
157+
return multiline(line, rl, L)
154158
}
155159
} else {
156160
return "", err
157161
}
158162
}
159163

160-
func multiline(ml string, reader *bufio.Reader, L *lua.LState) (string, error) {
164+
func multiline(ml string, rl *readline.Instance, L *lua.LState) (string, error) {
161165
for {
162166
if _, err := L.LoadString(ml); err == nil { // try compile
163167
return ml, nil
164168
} else if !incomplete(err) { // syntax error , but not EOF
165169
return ml, nil
166170
} else {
167-
fmt.Print(">> ")
168-
if line, err := reader.ReadString('\n'); err == nil {
171+
rl.SetPrompt(">> ")
172+
if line, err := rl.Readline(); err == nil {
169173
ml = ml + "\n" + line
170174
} else {
171175
return "", err

0 commit comments

Comments
 (0)