mirror of
				https://github.com/sammy-ette/Hilbish
				synced 2025-08-10 02:52:03 +00:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			0a5a2e727e
			...
			14274a9432
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					14274a9432 | ||
| 
						 | 
					d24d773e2d | ||
| 
						 | 
					021d20585d | 
							
								
								
									
										326
									
								
								api.go
									
									
									
									
									
								
							
							
						
						
									
										326
									
								
								api.go
									
									
									
									
									
								
							@ -7,10 +7,10 @@ import (
 | 
				
			|||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
//	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
//	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"hilbish/util"
 | 
						"hilbish/util"
 | 
				
			||||||
@ -19,38 +19,28 @@ import (
 | 
				
			|||||||
	"github.com/arnodel/golua/lib/packagelib"
 | 
						"github.com/arnodel/golua/lib/packagelib"
 | 
				
			||||||
	"github.com/maxlandon/readline"
 | 
						"github.com/maxlandon/readline"
 | 
				
			||||||
//	"github.com/blackfireio/osinfo"
 | 
					//	"github.com/blackfireio/osinfo"
 | 
				
			||||||
//	"mvdan.cc/sh/v3/interp"
 | 
						"mvdan.cc/sh/v3/interp"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var exports = map[string]util.LuaExport{
 | 
					var exports = map[string]util.LuaExport{
 | 
				
			||||||
	"alias": util.LuaExport{hlalias, 2, false},
 | 
						"alias": {hlalias, 2, false},
 | 
				
			||||||
/*
 | 
						"appendPath": {hlappendPath, 1, false},
 | 
				
			||||||
	"appendPath": hlappendPath,
 | 
						"complete": {hlcomplete, 2, false},
 | 
				
			||||||
*/
 | 
						"cwd": {hlcwd, 0, false},
 | 
				
			||||||
	"complete": util.LuaExport{hlcomplete, 2, false},
 | 
						"exec": {hlexec, 1, false},
 | 
				
			||||||
	"cwd": util.LuaExport{hlcwd, 0, false},
 | 
						"runnerMode": {hlrunnerMode, 1, false},
 | 
				
			||||||
/*
 | 
						"goro": {hlgoro, 1, true},
 | 
				
			||||||
	"exec": hlexec,
 | 
						"highlighter": {hlhighlighter, 1, false},
 | 
				
			||||||
*/
 | 
						"hinter": {hlhinter, 1, false},
 | 
				
			||||||
	"runnerMode": util.LuaExport{hlrunnerMode, 1, false},
 | 
						"multiprompt": {hlmultiprompt, 1, false},
 | 
				
			||||||
/*
 | 
						"prependPath": {hlprependPath, 1, false},
 | 
				
			||||||
	"goro": hlgoro,
 | 
						"prompt": {hlprompt, 1, false},
 | 
				
			||||||
*/
 | 
						"inputMode": {hlinputMode, 1, false},
 | 
				
			||||||
	"highlighter": util.LuaExport{hlhighlighter, 1, false},
 | 
						"interval": {hlinterval, 2, false},
 | 
				
			||||||
	"hinter": util.LuaExport{hlhinter, 1, false},
 | 
						"read": {hlread, 1, false},
 | 
				
			||||||
/*
 | 
						"run": {hlrun, 1, false},
 | 
				
			||||||
	"multiprompt": hlmlprompt,
 | 
						"timeout": {hltimeout, 2, false},
 | 
				
			||||||
	"prependPath": hlprependPath,
 | 
						"which": {hlwhich, 1, false},
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
	"prompt": util.LuaExport{hlprompt, 1, false},
 | 
					 | 
				
			||||||
	"inputMode": util.LuaExport{hlinputMode, 1, false},
 | 
					 | 
				
			||||||
	"interval": util.LuaExport{hlinterval, 2, false},
 | 
					 | 
				
			||||||
	"read": util.LuaExport{hlread, 1, false},
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
	"run": hlrun,
 | 
					 | 
				
			||||||
	"timeout": hltimeout,
 | 
					 | 
				
			||||||
	"which": hlwhich,
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var greeting string
 | 
					var greeting string
 | 
				
			||||||
@ -114,21 +104,23 @@ Check out the {blue}{bold}guide{reset} command to get started.
 | 
				
			|||||||
	//util.Document(L, aliasesModule, "Alias inferface for Hilbish.")
 | 
						//util.Document(L, aliasesModule, "Alias inferface for Hilbish.")
 | 
				
			||||||
	mod.Set(rt.StringValue("aliases"), rt.TableValue(aliasesModule))
 | 
						mod.Set(rt.StringValue("aliases"), rt.TableValue(aliasesModule))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
	// hilbish.history table
 | 
						// hilbish.history table
 | 
				
			||||||
	historyModule := lr.Loader(L)
 | 
						historyModule := lr.Loader(rtm)
 | 
				
			||||||
	util.Document(L, historyModule, "History interface for Hilbish.")
 | 
						//util.Document(L, historyModule, "History interface for Hilbish.")
 | 
				
			||||||
	L.SetField(mod, "history", historyModule)
 | 
						mod.Set(rt.StringValue("history"), rt.TableValue(historyModule))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// hilbish.completion table
 | 
						// hilbish.completion table
 | 
				
			||||||
	hshcomp := L.NewTable()
 | 
						hshcomp := rt.NewTable()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	util.SetField(L, hshcomp, "files", L.NewFunction(luaFileComplete), "Completer for files")
 | 
						util.SetField(rtm, hshcomp, "files",
 | 
				
			||||||
	util.SetField(L, hshcomp, "bins", L.NewFunction(luaBinaryComplete), "Completer for executables/binaries")
 | 
						rt.FunctionValue(rt.NewGoFunction(luaFileComplete, "files", 3, false)),
 | 
				
			||||||
	util.Document(L, hshcomp, "Completions interface for Hilbish.")
 | 
						"Completer for files")
 | 
				
			||||||
	L.SetField(mod, "completion", hshcomp)
 | 
						util.SetField(rtm, hshcomp, "bins",
 | 
				
			||||||
 | 
						rt.FunctionValue(rt.NewGoFunction(luaBinaryComplete, "bins", 3, false)),
 | 
				
			||||||
 | 
						"Completer for executables/binaries")
 | 
				
			||||||
 | 
						//util.Document(L, hshcomp, "Completions interface for Hilbish.")
 | 
				
			||||||
 | 
						mod.Set(rt.StringValue("completion"), rt.TableValue(hshcomp))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
	// hilbish.runner table
 | 
						// hilbish.runner table
 | 
				
			||||||
	runnerModule := runnerModeLoader(rtm)
 | 
						runnerModule := runnerModeLoader(rtm)
 | 
				
			||||||
	//util.Document(L, runnerModule, "Runner/exec interface for Hilbish.")
 | 
						//util.Document(L, runnerModule, "Runner/exec interface for Hilbish.")
 | 
				
			||||||
@ -151,51 +143,74 @@ func getenv(key, fallback string) string {
 | 
				
			|||||||
    return value
 | 
					    return value
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					func luaFileComplete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
func luaFileComplete(L *lua.LState) int {
 | 
						query, ctx, fds, err := getCompleteParams(t, c)
 | 
				
			||||||
	query := L.CheckString(1)
 | 
						if err != nil {
 | 
				
			||||||
	ctx := L.CheckString(2)
 | 
							return nil, err
 | 
				
			||||||
	fields := L.CheckTable(3)
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	var fds []string
 | 
					 | 
				
			||||||
	fields.ForEach(func(k lua.LValue, v lua.LValue) {
 | 
					 | 
				
			||||||
		fds = append(fds, v.String())
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	completions := fileComplete(query, ctx, fds)
 | 
						completions := fileComplete(query, ctx, fds)
 | 
				
			||||||
	luaComps := L.NewTable()
 | 
						luaComps := rt.NewTable()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, comp := range completions {
 | 
						for i, comp := range completions {
 | 
				
			||||||
		luaComps.Append(lua.LString(comp))
 | 
							luaComps.Set(rt.IntValue(int64(i + 1)), rt.StringValue(comp))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	L.Push(luaComps)
 | 
						return c.PushingNext1(t.Runtime, rt.TableValue(luaComps)), nil
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func luaBinaryComplete(L *lua.LState) int {
 | 
					func luaBinaryComplete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	query := L.CheckString(1)
 | 
						query, ctx, fds, err := getCompleteParams(t, c)
 | 
				
			||||||
	ctx := L.CheckString(2)
 | 
						if err != nil {
 | 
				
			||||||
	fields := L.CheckTable(3)
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	var fds []string
 | 
					 | 
				
			||||||
	fields.ForEach(func(k lua.LValue, v lua.LValue) {
 | 
					 | 
				
			||||||
		fds = append(fds, v.String())
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	completions, _ := binaryComplete(query, ctx, fds)
 | 
						completions, _ := binaryComplete(query, ctx, fds)
 | 
				
			||||||
	luaComps := L.NewTable()
 | 
						luaComps := rt.NewTable()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, comp := range completions {
 | 
						for i, comp := range completions {
 | 
				
			||||||
		luaComps.Append(lua.LString(comp))
 | 
							luaComps.Set(rt.IntValue(int64(i + 1)), rt.StringValue(comp))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	L.Push(luaComps)
 | 
						return c.PushingNext1(t.Runtime, rt.TableValue(luaComps)), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
	return 1
 | 
					
 | 
				
			||||||
 | 
					func getCompleteParams(t *rt.Thread, c *rt.GoCont) (string, string, []string, error) {
 | 
				
			||||||
 | 
						if err := c.CheckNArgs(3); err != nil {
 | 
				
			||||||
 | 
							return "", "", []string{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						query, err := c.StringArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", "", []string{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx, err := c.StringArg(1)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", "", []string{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fields, err := c.TableArg(2)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", "", []string{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var fds []string
 | 
				
			||||||
 | 
						nextVal := rt.NilValue
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							next, val, ok := fields.Next(nextVal)
 | 
				
			||||||
 | 
							if next == rt.NilValue {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							nextVal = next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							valStr, ok := val.TryString()
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fds = append(fds, valStr)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return query, ctx, fds, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setVimMode(mode string) {
 | 
					func setVimMode(mode string) {
 | 
				
			||||||
	util.SetField(l, hshMod, "vimMode", rt.StringValue(mode), "Current Vim mode of Hilbish (nil if not in Vim mode)")
 | 
						util.SetField(l, hshMod, "vimMode", rt.StringValue(mode), "Current Vim mode of Hilbish (nil if not in Vim mode)")
 | 
				
			||||||
@ -206,14 +221,19 @@ func unsetVimMode() {
 | 
				
			|||||||
	util.SetField(l, hshMod, "vimMode", rt.NilValue, "Current Vim mode of Hilbish (nil if not in Vim mode)")
 | 
						util.SetField(l, hshMod, "vimMode", rt.NilValue, "Current Vim mode of Hilbish (nil if not in Vim mode)")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
// run(cmd)
 | 
					// run(cmd)
 | 
				
			||||||
// Runs `cmd` in Hilbish's sh interpreter.
 | 
					// Runs `cmd` in Hilbish's sh interpreter.
 | 
				
			||||||
// --- @param cmd string
 | 
					// --- @param cmd string
 | 
				
			||||||
func hlrun(L *lua.LState) int {
 | 
					func hlrun(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cmd, err := c.StringArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	var exitcode uint8
 | 
						var exitcode uint8
 | 
				
			||||||
	cmd := L.CheckString(1)
 | 
						err = execCommand(cmd)
 | 
				
			||||||
	err := execCommand(cmd)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if code, ok := interp.IsExitStatus(err); ok {
 | 
						if code, ok := interp.IsExitStatus(err); ok {
 | 
				
			||||||
		exitcode = code
 | 
							exitcode = code
 | 
				
			||||||
@ -221,10 +241,8 @@ func hlrun(L *lua.LState) int {
 | 
				
			|||||||
		exitcode = 1
 | 
							exitcode = 1
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	L.Push(lua.LNumber(exitcode))
 | 
						return c.PushingNext1(t.Runtime, rt.IntValue(int64(exitcode))), nil
 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// cwd()
 | 
					// cwd()
 | 
				
			||||||
// Returns the current directory of the shell
 | 
					// Returns the current directory of the shell
 | 
				
			||||||
@ -286,13 +304,18 @@ func hlprompt(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			|||||||
// multiprompt(str)
 | 
					// multiprompt(str)
 | 
				
			||||||
// Changes the continued line prompt to `str`
 | 
					// Changes the continued line prompt to `str`
 | 
				
			||||||
// --- @param str string
 | 
					// --- @param str string
 | 
				
			||||||
/*
 | 
					func hlmultiprompt(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
func hlmlprompt(L *lua.LState) int {
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
	multilinePrompt = L.CheckString(1)
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return 0
 | 
						prompt, err := c.StringArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						multilinePrompt = prompt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// alias(cmd, orig)
 | 
					// alias(cmd, orig)
 | 
				
			||||||
// Sets an alias of `cmd` to `orig`
 | 
					// Sets an alias of `cmd` to `orig`
 | 
				
			||||||
@ -316,24 +339,39 @@ func hlalias(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			|||||||
	return c.Next(), nil
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
// appendPath(dir)
 | 
					// appendPath(dir)
 | 
				
			||||||
// Appends `dir` to $PATH
 | 
					// Appends `dir` to $PATH
 | 
				
			||||||
// --- @param dir string|table
 | 
					// --- @param dir string|table
 | 
				
			||||||
func hlappendPath(L *lua.LState) int {
 | 
					func hlappendPath(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						arg := c.Arg(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// check if dir is a table or a string
 | 
						// check if dir is a table or a string
 | 
				
			||||||
	arg := L.Get(1)
 | 
						if arg.Type() == rt.TableType {
 | 
				
			||||||
	if arg.Type() == lua.LTTable {
 | 
							nextVal := rt.NilValue
 | 
				
			||||||
		arg.(*lua.LTable).ForEach(func(k lua.LValue, v lua.LValue) {
 | 
							for {
 | 
				
			||||||
			appendPath(v.String())
 | 
								next, val, ok := arg.AsTable().Next(nextVal)
 | 
				
			||||||
		})
 | 
								if next == rt.NilValue {
 | 
				
			||||||
	} else if arg.Type() == lua.LTString {
 | 
									break
 | 
				
			||||||
		appendPath(arg.String())
 | 
								}
 | 
				
			||||||
	} else {
 | 
								nextVal = next
 | 
				
			||||||
		L.RaiseError("bad argument to appendPath (expected string or table, got %v)", L.Get(1).Type().String())
 | 
					
 | 
				
			||||||
 | 
								valStr, ok := val.TryString()
 | 
				
			||||||
 | 
								if !ok {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0
 | 
								appendPath(valStr)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else if arg.Type() == rt.StringType {
 | 
				
			||||||
 | 
							appendPath(arg.AsString())
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return nil, errors.New("bad argument to appendPath (expected string or table, got " + arg.TypeName() + ")")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func appendPath(dir string) {
 | 
					func appendPath(dir string) {
 | 
				
			||||||
@ -349,8 +387,14 @@ func appendPath(dir string) {
 | 
				
			|||||||
// exec(cmd)
 | 
					// exec(cmd)
 | 
				
			||||||
// Replaces running hilbish with `cmd`
 | 
					// Replaces running hilbish with `cmd`
 | 
				
			||||||
// --- @param cmd string
 | 
					// --- @param cmd string
 | 
				
			||||||
func hlexec(L *lua.LState) int {
 | 
					func hlexec(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	cmd := L.CheckString(1)
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cmd, err := c.StringArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	cmdArgs, _ := splitInput(cmd)
 | 
						cmdArgs, _ := splitInput(cmd)
 | 
				
			||||||
	if runtime.GOOS != "windows" {
 | 
						if runtime.GOOS != "windows" {
 | 
				
			||||||
		cmdPath, err := exec.LookPath(cmdArgs[0])
 | 
							cmdPath, err := exec.LookPath(cmdArgs[0])
 | 
				
			||||||
@ -372,55 +416,59 @@ func hlexec(L *lua.LState) int {
 | 
				
			|||||||
		os.Exit(0)
 | 
							os.Exit(0)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// goro(fn)
 | 
					// goro(fn)
 | 
				
			||||||
// Puts `fn` in a goroutine
 | 
					// Puts `fn` in a goroutine
 | 
				
			||||||
// --- @param fn function
 | 
					// --- @param fn function
 | 
				
			||||||
func hlgoro(L *lua.LState) int {
 | 
					func hlgoro(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	fn := L.CheckFunction(1)
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
	argnum := L.GetTop()
 | 
							return nil, err
 | 
				
			||||||
	args := make([]lua.LValue, argnum)
 | 
						}
 | 
				
			||||||
	for i := 1; i <= argnum; i++ {
 | 
						fn, err := c.ClosureArg(0)
 | 
				
			||||||
		args[i - 1] = L.Get(i)
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// call fn
 | 
						// call fn
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		if err := L.CallByParam(lua.P{
 | 
							_, err := rt.Call1(l.MainThread(), rt.FunctionValue(fn), c.Etc()...)
 | 
				
			||||||
			Fn: fn,
 | 
							if err != nil {
 | 
				
			||||||
			NRet: 0,
 | 
					 | 
				
			||||||
			Protect: true,
 | 
					 | 
				
			||||||
		}, args...); err != nil {
 | 
					 | 
				
			||||||
			fmt.Fprintln(os.Stderr, "Error in goro function:\n\n", err)
 | 
								fmt.Fprintln(os.Stderr, "Error in goro function:\n\n", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// timeout(cb, time)
 | 
					// timeout(cb, time)
 | 
				
			||||||
// Runs the `cb` function after `time` in milliseconds
 | 
					// Runs the `cb` function after `time` in milliseconds
 | 
				
			||||||
// --- @param cb function
 | 
					// --- @param cb function
 | 
				
			||||||
// --- @param time number
 | 
					// --- @param time number
 | 
				
			||||||
func hltimeout(L *lua.LState) int {
 | 
					func hltimeout(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	cb := L.CheckFunction(1)
 | 
						if err := c.CheckNArgs(2); err != nil {
 | 
				
			||||||
	ms := L.CheckInt(2)
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cb, err := c.ClosureArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ms, err := c.IntArg(1)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timeout := time.Duration(ms) * time.Millisecond
 | 
						timeout := time.Duration(ms) * time.Millisecond
 | 
				
			||||||
	time.Sleep(timeout)
 | 
						time.Sleep(timeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := L.CallByParam(lua.P{
 | 
						_, err = rt.Call1(l.MainThread(), rt.FunctionValue(cb)) 
 | 
				
			||||||
		Fn: cb,
 | 
						if err != nil {
 | 
				
			||||||
		NRet: 0,
 | 
							return nil, err
 | 
				
			||||||
		Protect: true,
 | 
					 | 
				
			||||||
	}); err != nil {
 | 
					 | 
				
			||||||
		fmt.Fprintln(os.Stderr, "Error in goro function:\n\n", err)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0
 | 
					
 | 
				
			||||||
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// interval(cb, time)
 | 
					// interval(cb, time)
 | 
				
			||||||
// Runs the `cb` function every `time` milliseconds
 | 
					// Runs the `cb` function every `time` milliseconds
 | 
				
			||||||
@ -483,12 +531,17 @@ func hlcomplete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			|||||||
	return c.Next(), nil
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
// prependPath(dir)
 | 
					// prependPath(dir)
 | 
				
			||||||
// Prepends `dir` to $PATH
 | 
					// Prepends `dir` to $PATH
 | 
				
			||||||
// --- @param dir string
 | 
					// --- @param dir string
 | 
				
			||||||
func hlprependPath(L *lua.LState) int {
 | 
					func hlprependPath(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	dir := L.CheckString(1)
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dir, err := c.StringArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	dir = strings.Replace(dir, "~", curuser.HomeDir, 1)
 | 
						dir = strings.Replace(dir, "~", curuser.HomeDir, 1)
 | 
				
			||||||
	pathenv := os.Getenv("PATH")
 | 
						pathenv := os.Getenv("PATH")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -497,24 +550,27 @@ func hlprependPath(L *lua.LState) int {
 | 
				
			|||||||
		os.Setenv("PATH", dir + string(os.PathListSeparator) + pathenv)
 | 
							os.Setenv("PATH", dir + string(os.PathListSeparator) + pathenv)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// which(binName)
 | 
					// which(binName)
 | 
				
			||||||
// Searches for an executable called `binName` in the directories of $PATH
 | 
					// Searches for an executable called `binName` in the directories of $PATH
 | 
				
			||||||
// --- @param binName string
 | 
					// --- @param binName string
 | 
				
			||||||
func hlwhich(L *lua.LState) int {
 | 
					func hlwhich(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	binName := L.CheckString(1)
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						binName, err := c.StringArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	path, err := exec.LookPath(binName)
 | 
						path, err := exec.LookPath(binName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		l.Push(lua.LNil)
 | 
							return c.Next(), nil
 | 
				
			||||||
		return 1
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	l.Push(lua.LString(path))
 | 
						return c.PushingNext1(t.Runtime, rt.StringValue(path)), nil
 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// inputMode(mode)
 | 
					// inputMode(mode)
 | 
				
			||||||
// Sets the input mode for Hilbish's line reader. Accepts either emacs for vim
 | 
					// Sets the input mode for Hilbish's line reader. Accepts either emacs for vim
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										71
									
								
								rl.go
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								rl.go
									
									
									
									
									
								
							@ -5,6 +5,8 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"hilbish/util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/maxlandon/readline"
 | 
						"github.com/maxlandon/readline"
 | 
				
			||||||
	rt "github.com/arnodel/golua/runtime"
 | 
						rt "github.com/arnodel/golua/runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@ -292,58 +294,65 @@ func (lr *lineReader) Resize() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// lua module
 | 
					// lua module
 | 
				
			||||||
/*
 | 
					func (lr *lineReader) Loader(rtm *rt.Runtime) *rt.Table {
 | 
				
			||||||
func (lr *lineReader) Loader(L *lua.LState) *lua.LTable {
 | 
						lrLua := map[string]util.LuaExport{
 | 
				
			||||||
	lrLua := map[string]lua.LGFunction{
 | 
							"add": {lr.luaAddHistory, 1, false},
 | 
				
			||||||
		"add": lr.luaAddHistory,
 | 
							"all": {lr.luaAllHistory, 0, false},
 | 
				
			||||||
		"all": lr.luaAllHistory,
 | 
							"clear": {lr.luaClearHistory, 0, false},
 | 
				
			||||||
		"clear": lr.luaClearHistory,
 | 
							"get": {lr.luaGetHistory, 1, false},
 | 
				
			||||||
		"get": lr.luaGetHistory,
 | 
							"size": {lr.luaSize, 0, false},
 | 
				
			||||||
		"size": lr.luaSize,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mod := l.SetFuncs(l.NewTable(), lrLua)
 | 
						mod := rt.NewTable()
 | 
				
			||||||
 | 
						util.SetExports(rtm, mod, lrLua)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mod
 | 
						return mod
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (lr *lineReader) luaAddHistory(l *lua.LState) int {
 | 
					func (lr *lineReader) luaAddHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	cmd := l.CheckString(1)
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cmd, err := c.StringArg(0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	lr.AddHistory(cmd)
 | 
						lr.AddHistory(cmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (lr *lineReader) luaSize(L *lua.LState) int {
 | 
					func (lr *lineReader) luaSize(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	L.Push(lua.LNumber(fileHist.Len()))
 | 
						return c.PushingNext1(t.Runtime, rt.IntValue(int64(fileHist.Len()))), nil
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (lr *lineReader) luaGetHistory(L *lua.LState) int {
 | 
					func (lr *lineReader) luaGetHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	idx := L.CheckInt(1)
 | 
						if err := c.Check1Arg(); err != nil {
 | 
				
			||||||
	cmd, _ := fileHist.GetLine(idx)
 | 
							return nil, err
 | 
				
			||||||
	L.Push(lua.LString(cmd))
 | 
						}
 | 
				
			||||||
 | 
						idx, err := c.IntArg(0)
 | 
				
			||||||
	return 1
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (lr *lineReader) luaAllHistory(L *lua.LState) int {
 | 
						cmd, _ := fileHist.GetLine(int(idx))
 | 
				
			||||||
	tbl := L.NewTable()
 | 
					
 | 
				
			||||||
 | 
						return c.PushingNext1(t.Runtime, rt.StringValue(cmd)), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (lr *lineReader) luaAllHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
 | 
						tbl := rt.NewTable()
 | 
				
			||||||
	size := fileHist.Len()
 | 
						size := fileHist.Len()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := 1; i < size; i++ {
 | 
						for i := 1; i < size; i++ {
 | 
				
			||||||
		cmd, _ := fileHist.GetLine(i)
 | 
							cmd, _ := fileHist.GetLine(i)
 | 
				
			||||||
		tbl.Append(lua.LString(cmd))
 | 
							tbl.Set(rt.IntValue(int64(i)), rt.StringValue(cmd))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	L.Push(tbl)
 | 
						return c.PushingNext1(t.Runtime, rt.TableValue(tbl)), nil
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (lr *lineReader) luaClearHistory(l *lua.LState) int {
 | 
					func (lr *lineReader) luaClearHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
 | 
				
			||||||
	fileHist.clear()
 | 
						fileHist.clear()
 | 
				
			||||||
	return 0
 | 
						return c.Next(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user