mirror of https://github.com/Hilbis/Hilbish
Compare commits
No commits in common. "1ff3ff854b4397da4f876bfb802ebb52964a1456" and "0850247615732eaa6eb0e49f28e0e7eb0c9d5c48" have entirely different histories.
1ff3ff854b
...
0850247615
|
@ -8,8 +8,8 @@ function doPrompt(fail)
|
|||
))
|
||||
end
|
||||
|
||||
print(lunacolors.format('Welcome to {magenta}Hilbish{reset}, {cyan}' .. hilbish.user
|
||||
.. '{reset}.\n' .. 'The nice lil shell for {blue}Lua{reset} fanatics!\n'))
|
||||
print(lunacolors.format('Welcome to {magenta}Hilbish{reset}, {cyan}' .. _user ..
|
||||
'{reset}.\n' .. 'The nice lil shell for {blue}Lua{reset} fanatics!\n'))
|
||||
|
||||
doPrompt()
|
||||
|
||||
|
|
55
hilbish.go
55
hilbish.go
|
@ -1,55 +0,0 @@
|
|||
// Here is the core api for the hilbi shell itself
|
||||
// Basically, stuff about the shell itself and other functions
|
||||
// go here.
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/pborman/getopt"
|
||||
"github.com/yuin/gopher-lua"
|
||||
"mvdan.cc/sh/v3/interp"
|
||||
)
|
||||
|
||||
var exports = map[string]lua.LGFunction {
|
||||
"run": run,
|
||||
"flag": flag,
|
||||
}
|
||||
|
||||
func HilbishLoader(L *lua.LState) int {
|
||||
mod := L.SetFuncs(L.NewTable(), exports)
|
||||
|
||||
host, _ := os.Hostname()
|
||||
|
||||
L.SetField(mod, "ver", lua.LString(version))
|
||||
L.SetField(mod, "user", lua.LString(curuser.Username))
|
||||
L.SetField(mod, "host", lua.LString(host))
|
||||
|
||||
L.Push(mod)
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
// Runs a command
|
||||
func run(L *lua.LState) int {
|
||||
var exitcode uint8 = 0
|
||||
cmd := L.CheckString(1)
|
||||
err := execCommand(cmd)
|
||||
|
||||
if code, ok := interp.IsExitStatus(err); ok {
|
||||
exitcode = code
|
||||
} else if err != nil {
|
||||
exitcode = 1
|
||||
}
|
||||
|
||||
L.Push(lua.LNumber(exitcode))
|
||||
return 1
|
||||
}
|
||||
|
||||
func flag(L *lua.LState) int {
|
||||
flagchar := L.CheckString(1)
|
||||
|
||||
L.Push(lua.LBool(getopt.Lookup([]rune(flagchar)[0]).Seen()))
|
||||
|
||||
return 1
|
||||
}
|
11
lua.go
11
lua.go
|
@ -23,18 +23,18 @@ prompt(ansikit.format(
|
|||
|
||||
func LuaInit() {
|
||||
l = lua.NewState()
|
||||
|
||||
l.OpenLibs()
|
||||
|
||||
l.SetGlobal("_ver", lua.LString(version))
|
||||
l.SetGlobal("_user", lua.LString(curuser.Username))
|
||||
|
||||
l.SetGlobal("prompt", l.NewFunction(hshprompt))
|
||||
l.SetGlobal("multiprompt", l.NewFunction(hshmlprompt))
|
||||
l.SetGlobal("alias", l.NewFunction(hshalias))
|
||||
l.SetGlobal("appendPath", l.NewFunction(hshappendPath))
|
||||
l.SetGlobal("exec", l.NewFunction(hshexec))
|
||||
|
||||
// yes this is stupid, i know
|
||||
l.PreloadModule("hilbish", HilbishLoader)
|
||||
l.DoString("hilbish = require 'hilbish'")
|
||||
|
||||
// Add fs module to Lua
|
||||
l.PreloadModule("fs", fs.Loader)
|
||||
|
||||
|
@ -147,7 +147,6 @@ func hshexec(L *lua.LState) int {
|
|||
|
||||
// syscall.Exec requires an absolute path to a binary
|
||||
// path, args, string slice of environments
|
||||
// TODO: alternative for windows
|
||||
syscall.Exec(cmdPath, cmdArgs, os.Environ())
|
||||
return 0 // random thought: does this ever return?
|
||||
return 0
|
||||
}
|
||||
|
|
10
main.go
10
main.go
|
@ -18,9 +18,9 @@ import (
|
|||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
var version = "v0.4.0"
|
||||
|
||||
var (
|
||||
version = "v0.4.0"
|
||||
l *lua.LState
|
||||
|
||||
prompt string // User's prompt, this will get set when lua side is initialized
|
||||
|
@ -158,7 +158,6 @@ func main() {
|
|||
}
|
||||
}
|
||||
running = true
|
||||
HandleHistory(input)
|
||||
RunInput(input)
|
||||
|
||||
termwidth, _, err := term.GetSize(0)
|
||||
|
@ -219,10 +218,3 @@ func HandleSignals() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func HandleHistory(cmd string) {
|
||||
readline.AddHistory(cmd)
|
||||
readline.SaveHistory(homedir + "/.hilbish-history")
|
||||
// TODO: load history again (history shared between sessions like this ye)
|
||||
}
|
||||
|
||||
|
|
19
shell.go
19
shell.go
|
@ -8,7 +8,6 @@ import (
|
|||
|
||||
"github.com/bobappleyard/readline"
|
||||
"github.com/yuin/gopher-lua"
|
||||
"github.com/yuin/gopher-lua/parse"
|
||||
"layeh.com/gopher-luar"
|
||||
"mvdan.cc/sh/v3/interp"
|
||||
"mvdan.cc/sh/v3/syntax"
|
||||
|
@ -32,11 +31,6 @@ func RunInput(input string) {
|
|||
fn, err := l.LoadString(cmdString)
|
||||
if err != nil && noexecute {
|
||||
fmt.Println(err)
|
||||
if lerr, ok := err.(*lua.ApiError); ok {
|
||||
if perr, ok := lerr.Cause.(*parse.Error); ok {
|
||||
print(perr.Pos.Line == parse.EOF)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
// And if there's no syntax errors and -n isnt provided, run
|
||||
|
@ -45,6 +39,9 @@ func RunInput(input string) {
|
|||
err = l.PCall(0, lua.MultRet, nil)
|
||||
}
|
||||
if err == nil {
|
||||
// If it succeeds, add to history and prompt again
|
||||
HandleHistory(input)
|
||||
|
||||
hooks.Em.Emit("command.exit", 0)
|
||||
return
|
||||
}
|
||||
|
@ -72,6 +69,9 @@ func RunInput(input string) {
|
|||
fmt.Fprintln(os.Stderr,
|
||||
"Error in command:\n\n" + err.Error())
|
||||
}
|
||||
if cmdArgs[0] != "exit" {
|
||||
HandleHistory(cmdString)
|
||||
}
|
||||
hooks.Em.Emit("command.exit", exitcode)
|
||||
return
|
||||
}
|
||||
|
@ -107,6 +107,7 @@ func RunInput(input string) {
|
|||
} else {
|
||||
hooks.Em.Emit("command.exit", 0)
|
||||
}
|
||||
HandleHistory(cmdString)
|
||||
}
|
||||
|
||||
// Run command in sh interpreter
|
||||
|
@ -176,3 +177,9 @@ func splitInput(input string) ([]string, string) {
|
|||
return cmdArgs, cmdstr.String()
|
||||
}
|
||||
|
||||
func HandleHistory(cmd string) {
|
||||
readline.AddHistory(cmd)
|
||||
readline.SaveHistory(homedir + "/.hilbish-history")
|
||||
// TODO: load history again (history shared between sessions like this ye)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue