mirror of https://github.com/Hilbis/Hilbish
Compare commits
1 Commits
28c6cb1e70
...
22efef531b
Author | SHA1 | Date |
---|---|---|
sammyette | 22efef531b |
|
@ -11,8 +11,6 @@
|
|||
|
||||
### Changed
|
||||
- Remove usage of `hilbish.goro` in Greenhouse.
|
||||
- Values in `hilbish` table are no longer protected. This means
|
||||
they can be overridden. (#287)
|
||||
|
||||
## [2.2.1] - 2023-12-26
|
||||
### Fixed
|
||||
|
|
61
api.go
61
api.go
|
@ -59,8 +59,47 @@ var hilbishLoader = packagelib.Loader{
|
|||
}
|
||||
|
||||
func hilbishLoad(rtm *rt.Runtime) (rt.Value, func()) {
|
||||
fakeMod := rt.NewTable()
|
||||
modmt := rt.NewTable()
|
||||
mod := rt.NewTable()
|
||||
|
||||
modIndex := func(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
||||
arg := c.Arg(1)
|
||||
val := mod.Get(arg)
|
||||
|
||||
return c.PushingNext1(t.Runtime, val), nil
|
||||
}
|
||||
modNewIndex := func(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
||||
k, err := c.StringArg(1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
v := c.Arg(2)
|
||||
if k == "highlighter" {
|
||||
var err error
|
||||
// fine to assign, since itll be either nil or a closure
|
||||
highlighter, err = c.ClosureArg(2)
|
||||
if err != nil {
|
||||
return nil, errors.New("hilbish.highlighter has to be a function")
|
||||
}
|
||||
} else if k == "hinter" {
|
||||
var err error
|
||||
hinter, err = c.ClosureArg(2)
|
||||
if err != nil {
|
||||
return nil, errors.New("hilbish.hinter has to be a function")
|
||||
}
|
||||
} else if modVal := mod.Get(rt.StringValue(k)); modVal != rt.NilValue {
|
||||
return nil, errors.New("not allowed to override in hilbish table")
|
||||
}
|
||||
mod.Set(rt.StringValue(k), v)
|
||||
|
||||
return c.Next(), nil
|
||||
}
|
||||
modmt.Set(rt.StringValue("__newindex"), rt.FunctionValue(rt.NewGoFunction(modNewIndex, "__newindex", 3, false)))
|
||||
modmt.Set(rt.StringValue("__index"), rt.FunctionValue(rt.NewGoFunction(modIndex, "__index", 2, false)))
|
||||
fakeMod.SetMetatable(modmt)
|
||||
|
||||
util.SetExports(rtm, mod, exports)
|
||||
hshMod = mod
|
||||
|
||||
|
@ -71,16 +110,16 @@ func hilbishLoad(rtm *rt.Runtime) (rt.Value, func()) {
|
|||
username = strings.Split(username, "\\")[1] // for some reason Username includes the hostname on windows
|
||||
}
|
||||
|
||||
util.SetField(rtm, mod, "ver", rt.StringValue(getVersion()))
|
||||
util.SetField(rtm, mod, "goVersion", rt.StringValue(runtime.Version()))
|
||||
util.SetField(rtm, mod, "user", rt.StringValue(username))
|
||||
util.SetField(rtm, mod, "host", rt.StringValue(host))
|
||||
util.SetField(rtm, mod, "home", rt.StringValue(curuser.HomeDir))
|
||||
util.SetField(rtm, mod, "dataDir", rt.StringValue(dataDir))
|
||||
util.SetField(rtm, mod, "interactive", rt.BoolValue(interactive))
|
||||
util.SetField(rtm, mod, "login", rt.BoolValue(login))
|
||||
util.SetField(rtm, mod, "vimMode", rt.NilValue)
|
||||
util.SetField(rtm, mod, "exitCode", rt.IntValue(0))
|
||||
util.SetFieldProtected(fakeMod, mod, "ver", rt.StringValue(getVersion()))
|
||||
util.SetFieldProtected(fakeMod, mod, "goVersion", rt.StringValue(runtime.Version()))
|
||||
util.SetFieldProtected(fakeMod, mod, "user", rt.StringValue(username))
|
||||
util.SetFieldProtected(fakeMod, mod, "host", rt.StringValue(host))
|
||||
util.SetFieldProtected(fakeMod, mod, "home", rt.StringValue(curuser.HomeDir))
|
||||
util.SetFieldProtected(fakeMod, mod, "dataDir", rt.StringValue(dataDir))
|
||||
util.SetFieldProtected(fakeMod, mod, "interactive", rt.BoolValue(interactive))
|
||||
util.SetFieldProtected(fakeMod, mod, "login", rt.BoolValue(login))
|
||||
util.SetFieldProtected(fakeMod, mod, "vimMode", rt.NilValue)
|
||||
util.SetFieldProtected(fakeMod, mod, "exitCode", rt.IntValue(0))
|
||||
|
||||
// hilbish.userDir table
|
||||
hshuser := userDirLoader(rtm)
|
||||
|
@ -132,7 +171,7 @@ func hilbishLoad(rtm *rt.Runtime) (rt.Value, func()) {
|
|||
pluginModule := moduleLoader(rtm)
|
||||
mod.Set(rt.StringValue("module"), rt.TableValue(pluginModule))
|
||||
|
||||
return rt.TableValue(mod), nil
|
||||
return rt.TableValue(fakeMod), nil
|
||||
}
|
||||
|
||||
func getenv(key, fallback string) string {
|
||||
|
|
2
go.mod
2
go.mod
|
@ -1,6 +1,6 @@
|
|||
module hilbish
|
||||
|
||||
go 1.18
|
||||
go 1.17
|
||||
|
||||
require (
|
||||
github.com/arnodel/golua v0.0.0-20220221163911-dfcf252b6f86
|
||||
|
|
|
@ -1,7 +1,21 @@
|
|||
local opts = {}
|
||||
hilbish.opts = {}
|
||||
|
||||
setmetatable(hilbish.opts, {
|
||||
__newindex = function(_, k, v)
|
||||
if opts[k] == nil then
|
||||
error(string.format('opt %s does not exist', k))
|
||||
end
|
||||
|
||||
opts[k] = v
|
||||
end,
|
||||
__index = function(_, k)
|
||||
return opts[k]
|
||||
end
|
||||
})
|
||||
|
||||
local function setupOpt(name, default)
|
||||
hilbish.opts[name] = default
|
||||
opts[name] = default
|
||||
pcall(require, 'nature.opts.' .. name)
|
||||
end
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package readline
|
||||
|
||||
import (
|
||||
// "fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
|
@ -69,40 +68,6 @@ func (rl *Instance) getCursorPos() (x int, y int) {
|
|||
// This means that they are not used to keep any reference point when
|
||||
// when we internally move around clearning and printing things
|
||||
|
||||
/*
|
||||
func moveCursorUpBuffered(i int) {
|
||||
if i < 1 {
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Fprintf(rl.bufferedOut, "\x1b[%dA", i)
|
||||
}
|
||||
|
||||
func moveCursorDownBuffered(i int) {
|
||||
if i < 1 {
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Fprintf(rl.bufferedOut, "\x1b[%dB", i)
|
||||
}
|
||||
|
||||
func moveCursorForwardsBuffered(i int) {
|
||||
if i < 1 {
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Fprintf(rl.bufferedOut, "\x1b[%dC", i)
|
||||
}
|
||||
|
||||
func moveCursorUpBuffered(i int) {
|
||||
if i < 1 {
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Fprintf(rl.bufferedOut, "\x1b[%dD", i)
|
||||
}
|
||||
*/
|
||||
|
||||
func moveCursorUp(i int) {
|
||||
if i < 1 {
|
||||
return
|
||||
|
@ -135,14 +100,6 @@ func moveCursorBackwards(i int) {
|
|||
printf("\x1b[%dD", i)
|
||||
}
|
||||
|
||||
func hideCursor() {
|
||||
print(seqHideCursor)
|
||||
}
|
||||
|
||||
func unhideCursor() {
|
||||
print(seqUnhideCursor)
|
||||
}
|
||||
|
||||
func (rl *Instance) backspace(forward bool) {
|
||||
if len(rl.line) == 0 || rl.pos == 0 {
|
||||
return
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
module github.com/maxlandon/readline
|
||||
|
||||
go 1.18
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package readline
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"os"
|
||||
"regexp"
|
||||
"sync"
|
||||
|
@ -204,8 +203,6 @@ type Instance struct {
|
|||
ViActionCallback func(ViAction, []string)
|
||||
|
||||
RawInputCallback func([]rune) // called on all input
|
||||
|
||||
bufferedOut *bufio.Writer
|
||||
}
|
||||
|
||||
// NewInstance is used to create a readline instance and initialise it with sane defaults.
|
||||
|
@ -254,8 +251,6 @@ func NewInstance() *Instance {
|
|||
return suggs
|
||||
}
|
||||
|
||||
rl.bufferedOut = bufio.NewWriter(os.Stdout)
|
||||
|
||||
// Registers
|
||||
rl.initRegisters()
|
||||
|
||||
|
|
|
@ -33,21 +33,19 @@ func (rl *Instance) GetLine() []rune {
|
|||
func (rl *Instance) echo() {
|
||||
|
||||
// Then we print the prompt, and the line,
|
||||
hideCursor()
|
||||
switch {
|
||||
case rl.PasswordMask != 0:
|
||||
case rl.PasswordMask > 0:
|
||||
rl.bufprint(strings.Repeat(string(rl.PasswordMask), len(rl.line)) + " ")
|
||||
print(strings.Repeat(string(rl.PasswordMask), len(rl.line)) + " ")
|
||||
|
||||
default:
|
||||
|
||||
// Go back to prompt position, and clear everything below
|
||||
moveCursorBackwards(GetTermWidth())
|
||||
moveCursorUp(rl.posY)
|
||||
rl.bufprint(seqClearScreenBelow)
|
||||
print(seqClearScreenBelow)
|
||||
|
||||
// Print the prompt
|
||||
rl.bufprint(string(rl.realPrompt))
|
||||
print(string(rl.realPrompt))
|
||||
|
||||
// Assemble the line, taking virtual completions into account
|
||||
var line []rune
|
||||
|
@ -59,13 +57,11 @@ func (rl *Instance) echo() {
|
|||
|
||||
// Print the input line with optional syntax highlighting
|
||||
if rl.SyntaxHighlighter != nil {
|
||||
rl.bufprint(rl.SyntaxHighlighter(line))
|
||||
print(rl.SyntaxHighlighter(line))
|
||||
} else {
|
||||
rl.bufprint(string(line))
|
||||
print(string(line))
|
||||
}
|
||||
|
||||
}
|
||||
rl.bufflush()
|
||||
|
||||
// Update references with new coordinates only now, because
|
||||
// the new line may be longer/shorter than the previous one.
|
||||
|
@ -76,7 +72,6 @@ func (rl *Instance) echo() {
|
|||
moveCursorUp(rl.fullY)
|
||||
moveCursorDown(rl.posY)
|
||||
moveCursorForwards(rl.posX)
|
||||
unhideCursor()
|
||||
}
|
||||
|
||||
func (rl *Instance) insert(r []rune) {
|
||||
|
@ -164,7 +159,7 @@ func (rl *Instance) clearLine() {
|
|||
moveCursorForwards(rl.promptLen)
|
||||
|
||||
// Clear everything after & below the cursor
|
||||
//print(seqClearScreenBelow)
|
||||
print(seqClearScreenBelow)
|
||||
|
||||
// Real input line
|
||||
rl.line = []rune{}
|
||||
|
|
|
@ -48,7 +48,7 @@ func (rl *Instance) RefreshPromptLog(log string) (err error) {
|
|||
rl.stillOnRefresh = true
|
||||
moveCursorUp(rl.infoY + rl.tcUsedY)
|
||||
moveCursorBackwards(GetTermWidth())
|
||||
//print("\r\n" + seqClearScreenBelow)
|
||||
print("\r\n" + seqClearScreenBelow)
|
||||
|
||||
// Print the log
|
||||
fmt.Printf(log)
|
||||
|
@ -97,7 +97,7 @@ func (rl *Instance) RefreshPromptInPlace(prompt string) (err error) {
|
|||
print(seqClearLine)
|
||||
moveCursorUp(rl.infoY + rl.tcUsedY)
|
||||
moveCursorBackwards(GetTermWidth())
|
||||
//print("\r\n" + seqClearScreenBelow)
|
||||
print("\r\n" + seqClearScreenBelow)
|
||||
|
||||
// Add a new line if needed
|
||||
if rl.Multiline {
|
||||
|
@ -137,7 +137,7 @@ func (rl *Instance) RefreshPromptCustom(prompt string, offset int, clearLine boo
|
|||
moveCursorUp(offset)
|
||||
|
||||
// Then clear everything below our new position
|
||||
//print(seqClearScreenBelow)
|
||||
print(seqClearScreenBelow)
|
||||
|
||||
// Update the prompt if a special has been passed.
|
||||
if prompt != "" {
|
||||
|
|
|
@ -276,14 +276,13 @@ func (rl *Instance) writeTabCompletion() {
|
|||
// than what their MaxLength allows them to, cycling sometimes occur,
|
||||
// but does not fully clears itself: some descriptions are messed up with.
|
||||
// We always clear the screen as a result, between writings.
|
||||
//rl.bufprint(seqClearScreenBelow)
|
||||
print(seqClearScreenBelow)
|
||||
|
||||
// Crop the completions so that it fits within our MaxTabCompleterRows
|
||||
completions, rl.tcUsedY = rl.cropCompletions(completions)
|
||||
|
||||
// Then we print all of them.
|
||||
rl.bufprintF(completions)
|
||||
rl.bufflush()
|
||||
fmt.Printf(completions)
|
||||
}
|
||||
|
||||
// cropCompletions - When the user cycles through a completion list longer
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package readline
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/text/width"
|
||||
|
@ -121,7 +120,7 @@ func (rl *Instance) clearHelpers() {
|
|||
moveCursorForwards(rl.fullX)
|
||||
|
||||
// Clear everything below
|
||||
//print(seqClearScreenBelow)
|
||||
print(seqClearScreenBelow)
|
||||
|
||||
// Go back to current cursor position
|
||||
moveCursorBackwards(GetTermWidth())
|
||||
|
@ -196,15 +195,3 @@ func (rl *Instance) renderHelpers() {
|
|||
moveCursorUp(rl.fullY - rl.posY)
|
||||
moveCursorForwards(rl.posX)
|
||||
}
|
||||
|
||||
func (rl *Instance) bufprintF(format string, a ...any) {
|
||||
fmt.Fprintf(rl.bufferedOut, format, a...)
|
||||
}
|
||||
|
||||
func (rl *Instance) bufprint(text string) {
|
||||
fmt.Fprint(rl.bufferedOut, text)
|
||||
}
|
||||
|
||||
func (rl *Instance) bufflush() {
|
||||
rl.bufferedOut.Flush()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue