refactor: put file history handler in line reader instance instead of global

lua-history
TorchedSammy 2022-07-09 13:51:32 -04:00
parent e0694c8862
commit 8552b8968f
Signed by: sammyette
GPG Key ID: 904FC49417B44DCD
2 changed files with 21 additions and 16 deletions

View File

@ -4,6 +4,7 @@ import (
"errors" "errors"
"io/fs" "io/fs"
"os" "os"
"path/filepath"
"strings" "strings"
) )
@ -12,13 +13,15 @@ type fileHistory struct {
f *os.File f *os.File
} }
func newFileHistory() *fileHistory { func newFileHistory(path string) *fileHistory {
err := os.MkdirAll(defaultHistDir, 0755) dir := filepath.Dir(path)
err := os.MkdirAll(dir, 0755)
if err != nil { if err != nil {
panic(err) panic(err)
} }
data, err := os.ReadFile(defaultHistPath) data, err := os.ReadFile(path)
if err != nil { if err != nil {
if !errors.Is(err, fs.ErrNotExist) { if !errors.Is(err, fs.ErrNotExist) {
panic(err) panic(err)
@ -33,7 +36,7 @@ func newFileHistory() *fileHistory {
} }
itms = append(itms, l) itms = append(itms, l)
} }
f, err := os.OpenFile(defaultHistPath, os.O_APPEND | os.O_WRONLY | os.O_CREATE, 0755) f, err := os.OpenFile(path, os.O_APPEND | os.O_WRONLY | os.O_CREATE, 0755)
if err != nil { if err != nil {
panic(err) panic(err)
} }

26
rl.go
View File

@ -13,18 +13,22 @@ import (
type lineReader struct { type lineReader struct {
rl *readline.Instance rl *readline.Instance
fileHist *fileHistory
} }
var fileHist *fileHistory
var hinter *rt.Closure var hinter *rt.Closure
var highlighter *rt.Closure var highlighter *rt.Closure
func newLineReader(prompt string, noHist bool) *lineReader { func newLineReader(prompt string, noHist bool) *lineReader {
rl := readline.NewInstance() rl := readline.NewInstance()
lr := &lineReader{
rl: rl,
}
// we don't mind hilbish.read rl instances having completion, // we don't mind hilbish.read rl instances having completion,
// but it cant have shared history // but it cant have shared history
if !noHist { if !noHist {
fileHist = newFileHistory() lr.fileHist = newFileHistory(defaultHistPath)
rl.SetHistoryCtrlR("History", fileHist) rl.SetHistoryCtrlR("History", lr.fileHist)
rl.HistoryAutoWrite = false rl.HistoryAutoWrite = false
} }
rl.ShowVimMode = false rl.ShowVimMode = false
@ -171,9 +175,7 @@ func newLineReader(prompt string, noHist bool) *lineReader {
return pfx, compGroups return pfx, compGroups
} }
return &lineReader{ return lr
rl,
}
} }
func (lr *lineReader) Read() (string, error) { func (lr *lineReader) Read() (string, error) {
@ -212,7 +214,7 @@ func (lr *lineReader) SetRightPrompt(p string) {
} }
func (lr *lineReader) AddHistory(cmd string) { func (lr *lineReader) AddHistory(cmd string) {
fileHist.Write(cmd) lr.fileHist.Write(cmd)
} }
func (lr *lineReader) ClearInput() { func (lr *lineReader) ClearInput() {
@ -253,7 +255,7 @@ func (lr *lineReader) luaAddHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error)
} }
func (lr *lineReader) luaSize(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { func (lr *lineReader) luaSize(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
return c.PushingNext1(t.Runtime, rt.IntValue(int64(fileHist.Len()))), nil return c.PushingNext1(t.Runtime, rt.IntValue(int64(lr.fileHist.Len()))), nil
} }
func (lr *lineReader) luaGetHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { func (lr *lineReader) luaGetHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
@ -265,17 +267,17 @@ func (lr *lineReader) luaGetHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error)
return nil, err return nil, err
} }
cmd, _ := fileHist.GetLine(int(idx)) cmd, _ := lr.fileHist.GetLine(int(idx))
return c.PushingNext1(t.Runtime, rt.StringValue(cmd)), nil return c.PushingNext1(t.Runtime, rt.StringValue(cmd)), nil
} }
func (lr *lineReader) luaAllHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { func (lr *lineReader) luaAllHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
tbl := rt.NewTable() tbl := rt.NewTable()
size := fileHist.Len() size := lr.fileHist.Len()
for i := 1; i < size; i++ { for i := 1; i < size; i++ {
cmd, _ := fileHist.GetLine(i) cmd, _ := lr.fileHist.GetLine(i)
tbl.Set(rt.IntValue(int64(i)), rt.StringValue(cmd)) tbl.Set(rt.IntValue(int64(i)), rt.StringValue(cmd))
} }
@ -283,6 +285,6 @@ func (lr *lineReader) luaAllHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error)
} }
func (lr *lineReader) luaClearHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { func (lr *lineReader) luaClearHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
fileHist.clear() lr.fileHist.clear()
return c.Next(), nil return c.Next(), nil
} }