diff --git a/.github/semantic.yml b/.github/semantic.yml new file mode 100644 index 0000000..2b82d0f --- /dev/null +++ b/.github/semantic.yml @@ -0,0 +1 @@ +titleAndCommits: true diff --git a/TODO.md b/TODO.md index 154560b..84bd742 100644 --- a/TODO.md +++ b/TODO.md @@ -6,3 +6,5 @@ - [ ] Readme badges - [x] Hooks - [x] Aliases +- [ ] hlua (hilbish lua) - 100% lua in the hilbish interactive shell, cuz why not +- [ ] Petals (name of plugins) diff --git a/golibs/fs/fs.go b/golibs/fs/fs.go index 6716664..9e24f94 100644 --- a/golibs/fs/fs.go +++ b/golibs/fs/fs.go @@ -2,6 +2,7 @@ package fs import ( "os" + "strings" "github.com/yuin/gopher-lua" ) @@ -13,6 +14,12 @@ func Loader(L *lua.LState) int { return 1 } + +func LuaErr(L *lua.LState, code int) { + // TODO: Error with a table, with path and error code + L.Error(lua.LNumber(code), 2) +} + var exports = map[string]lua.LGFunction{ "cd": cd, } @@ -20,7 +27,13 @@ var exports = map[string]lua.LGFunction{ func cd(L *lua.LState) int { path := L.ToString(1) - os.Chdir(path) + err := os.Chdir(strings.TrimSpace(path)) + if err != nil { + switch err.(*os.PathError).Err.Error() { + case "no such file or directory": + LuaErr(L, 1) + } + } return 0 } diff --git a/lua.go b/lua.go index f605ebd..b8d0d9b 100644 --- a/lua.go +++ b/lua.go @@ -1,9 +1,63 @@ package main import ( + "fmt" + "os" + lfs "hilbish/golibs/fs" + cmds "hilbish/golibs/commander" + hooks "hilbish/golibs/bait" + "github.com/yuin/gopher-lua" ) +func LuaInit() { + l = lua.NewState() + + l.OpenLibs() + + l.SetGlobal("prompt", l.NewFunction(hshprompt)) + l.SetGlobal("alias", l.NewFunction(hshalias)) + + // Add fs module to Lua + l.PreloadModule("fs", lfs.Loader) + + commander := cmds.New() + // When a command from Lua is added, register it for use + commander.Events.On("commandRegister", + func (cmdName string, cmd *lua.LFunction) { + commands[cmdName] = true + l.SetField( + l.GetTable(l.GetGlobal("commanding"), + lua.LString("__commands")), + cmdName, + cmd) + }) + + l.PreloadModule("commander", commander.Loader) + + bait = hooks.New() + l.PreloadModule("bait", bait.Loader) + + // Add more paths that Lua can require from + l.DoString("package.path = package.path .. ';./libs/?/init.lua;/usr/share/hilbish/libs/?/init.lua'") + + err := l.DoFile("/usr/share/hilbish/preload.lua") + if err != nil { + err = l.DoFile("preload.lua") + if err != nil { + fmt.Fprintln(os.Stderr, + "Missing preload file, builtins may be missing.") + } + } + + homedir, _ := os.UserHomeDir() + // Run config + err = l.DoFile(homedir + "/.hilbishrc.lua") + if err != nil { + panic(err) + } +} + func hshprompt(L *lua.LState) int { prompt = L.ToString(1) diff --git a/main.go b/main.go index 91ecf90..c3625f5 100644 --- a/main.go +++ b/main.go @@ -10,8 +10,6 @@ import ( "strings" "io" "context" - lfs "hilbish/golibs/fs" - cmds "hilbish/golibs/commander" hooks "hilbish/golibs/bait" "github.com/akamensky/argparse" @@ -110,6 +108,7 @@ func main() { if err == nil { // If it succeeds, add to history and prompt again readline.AddHistory(cmdString) + bait.Em.Emit("command.success", nil) continue } @@ -304,51 +303,3 @@ func HandleSignals() { }() } -func LuaInit() { - // TODO: Move to lua.go - l = lua.NewState() - - l.OpenLibs() - - l.SetGlobal("prompt", l.NewFunction(hshprompt)) - l.SetGlobal("alias", l.NewFunction(hshalias)) - - // Add fs module to Lua - l.PreloadModule("fs", lfs.Loader) - - commander := cmds.New() - // When a command from Lua is added, register it for use - commander.Events.On("commandRegister", - func (cmdName string, cmd *lua.LFunction) { - commands[cmdName] = true - l.SetField( - l.GetTable(l.GetGlobal("commanding"), - lua.LString("__commands")), - cmdName, - cmd) - }) - - l.PreloadModule("commander", commander.Loader) - - bait = hooks.New() - l.PreloadModule("bait", bait.Loader) - - // Add more paths that Lua can require from - l.DoString("package.path = package.path .. ';./libs/?/init.lua;/usr/share/hilbish/libs/?/init.lua'") - - err := l.DoFile("/usr/share/hilbish/preload.lua") - if err != nil { - err = l.DoFile("preload.lua") - if err != nil { - fmt.Fprintln(os.Stderr, - "Missing preload file, builtins may be missing.") - } - } - - homedir, _ := os.UserHomeDir() - // Run config - err = l.DoFile(homedir + "/.hilbishrc.lua") - if err != nil { - panic(err) - } -} diff --git a/preload.lua b/preload.lua index 76f48eb..9032f2d 100644 --- a/preload.lua +++ b/preload.lua @@ -3,9 +3,25 @@ local fs = require 'fs' local commander = require 'commander' +local bait = require 'bait' -commander.register('cd', function (path) - if #path == 1 then - fs.cd(path[1]) +commander.register('cd', function (args) + bait.throw('cd', args) + if #args > 0 then + local path = '' + for i = 1, #args do + path = path .. tostring(args[i]) .. ' ' + end + + local ok, err = pcall(function() fs.cd(path) end) + if not ok then + if err == 1 then + print('directory does not exist') + end + bait.throw('command.fail', nil) + else bait.throw('command.success', nil) end + return end + fs.cd(os.getenv 'HOME') + bait.throw('command.success', nil) end)