From ee34ccdbc32d37093fb4d9cdf4646ace9cee7f86 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 17 Sep 2022 10:48:34 -0400 Subject: [PATCH 001/119] fix: check if key in _G is string before trying to getenv --- nature/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nature/init.lua b/nature/init.lua index df31d8d..2b8b8c4 100644 --- a/nature/init.lua +++ b/nature/init.lua @@ -28,7 +28,9 @@ do return got_virt end - virt_G[key] = os.getenv(key) + if type(key) == 'string' then + virt_G[key] = os.getenv(key) + end return virt_G[key] end, From 7108523a4c7d4debdac7ae834c83520a9a66bda2 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 17 Sep 2022 14:08:15 -0400 Subject: [PATCH 002/119] fix: remove logging of autostart modules --- nature/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/nature/init.lua b/nature/init.lua index 2b8b8c4..5359dc0 100644 --- a/nature/init.lua +++ b/nature/init.lua @@ -56,7 +56,6 @@ do if ok then for _, module in ipairs(modules) do local entry = package.searchpath(module, startSearchPath) - print(entry) if entry then dofile(entry) end From 8f41005da77ab4b496b1ffe6864d10df11f6e8bc Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 17 Sep 2022 20:24:31 -0400 Subject: [PATCH 003/119] chore: update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49904ad..f24d618 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -145,6 +145,9 @@ menu is open. - Escape codes now work. - Escape percentage symbols in completion entries, so you will no longer see an error of missing format variable +- Fix an error with sh syntax in aliases +- Prompt now works with east asian characters (CJK) +- Set back the prompt to normal after exiting the continue prompt with ctrl-d ## [1.2.0] - 2022-03-17 ### Added From 8647dc57a11be912942fa69f9cc3c8cd0c9bb6a7 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 17 Sep 2022 20:28:52 -0400 Subject: [PATCH 004/119] fix: set cmdString after prompting for continue input makes sure that the old + new input is actually used for builtin runners --- exec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exec.go b/exec.go index 6e24719..5aee94a 100644 --- a/exec.go +++ b/exec.go @@ -130,7 +130,7 @@ func runInput(input string, priv bool) { } if cont { - input, err = reprompt(input) + cmdString, err = reprompt(input) if err == nil { goto rerun } else if err == io.EOF { From e5c8e5eaffae28099c8b83db4fef501a899d23a4 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 17 Sep 2022 21:00:28 -0400 Subject: [PATCH 005/119] fix!: pass non expanded input to builtin runners fixes an issue with expanded aliases being added to history with a recent commit (6th time now with this issue?) and makes behavior with other runners consistent this can technically be a breaking change to people overriding the sh runner function --- exec.go | 15 ++++++++------- runnermode.go | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/exec.go b/exec.go index 5aee94a..caf7d1b 100644 --- a/exec.go +++ b/exec.go @@ -96,23 +96,23 @@ func runInput(input string, priv bool) { if currentRunner.Type() == rt.StringType { switch currentRunner.AsString() { case "hybrid": - _, _, err = handleLua(cmdString) + _, _, err = handleLua(input) if err == nil { cmdFinish(0, input, priv) return } - input, exitCode, cont, err = handleSh(cmdString) + input, exitCode, cont, err = handleSh(input) case "hybridRev": _, _, _, err = handleSh(input) if err == nil { cmdFinish(0, input, priv) return } - input, exitCode, err = handleLua(cmdString) + input, exitCode, err = handleLua(input) case "lua": - input, exitCode, err = handleLua(cmdString) + input, exitCode, err = handleLua(input) case "sh": - input, exitCode, cont, err = handleSh(cmdString) + input, exitCode, cont, err = handleSh(input) } } else { // can only be a string or function so @@ -130,7 +130,7 @@ func runInput(input string, priv bool) { } if cont { - cmdString, err = reprompt(input) + input, err = reprompt(input) if err == nil { goto rerun } else if err == io.EOF { @@ -195,7 +195,8 @@ func runLuaRunner(runr rt.Value, userInput string) (input string, exitCode uint8 return } -func handleLua(cmdString string) (string, uint8, error) { +func handleLua(input string) (string, uint8, error) { + cmdString := aliases.Resolve(input) // First try to load input, essentially compiling to bytecode chunk, err := l.CompileAndLoadLuaChunk("", []byte(cmdString), rt.TableValue(l.GlobalEnv())) if err != nil && noexecute { diff --git a/runnermode.go b/runnermode.go index b8995cd..c26ed03 100644 --- a/runnermode.go +++ b/runnermode.go @@ -28,13 +28,13 @@ func shRunner(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return nil, err } - input, exitCode, cont, err := execSh(cmd) + _, exitCode, cont, err := execSh(aliases.Resolve(cmd)) var luaErr rt.Value = rt.NilValue if err != nil { luaErr = rt.StringValue(err.Error()) } runnerRet := rt.NewTable() - runnerRet.Set(rt.StringValue("input"), rt.StringValue(input)) + runnerRet.Set(rt.StringValue("input"), rt.StringValue(cmd)) runnerRet.Set(rt.StringValue("exitCode"), rt.IntValue(int64(exitCode))) runnerRet.Set(rt.StringValue("continue"), rt.BoolValue(cont)) runnerRet.Set(rt.StringValue("err"), luaErr) From 91596fa81c77e11415180f19405af801f9612b9d Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 17:33:36 -0400 Subject: [PATCH 006/119] docs: document drop in windows support --- CHANGELOG.md | 2 ++ README.md | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f24d618..1fdae95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased **NOTE:** Hilbish now uses [Task] insead of Make for builds. +Windows support is also now at a lower tier; The only thing guaranteed is +Hilbish *compiling* on Windows. [Task]: https://taskfile.dev/#/ diff --git a/README.md b/README.md index 86879d1..00c8e76 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,10 @@ and aims to be infinitely configurable. If something isn't, open an issue! # Installation +**NOTE:** Hilbish is not guaranteed to work properly on Windows, starting +from the 2.0 version. It will still be able to compile, but functionality +may be lacking. + ## Prebuilt binaries Go [here](https://nightly.link/Rosettea/Hilbish/workflows/build/master) for builds on the master branch. From 22f6ea8a3eaec2d81b8e9a6d2ecd4e4fc9db1b0c Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 17:34:08 -0400 Subject: [PATCH 007/119] docs: remove getting started from readme toc --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 00c8e76..5ca8232 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,6 @@ and aims to be infinitely configurable. If something isn't, open an issue! - [AUR](#AUR) - [Nixpkgs](#Nixpkgs) - [Manual Build](#Manual-Build) -- [Getting Started](#Getting-Started) - [Contributing](#Contributing) # Screenshots From 7db2a2c826efdcefc44d0a542c59b4815efbe084 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:11:09 -0400 Subject: [PATCH 008/119] fix: check if there is cmd input before attempting to add to history (closes #206) --- nature/opts/history.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/nature/opts/history.lua b/nature/opts/history.lua index f7ab1d7..016b22d 100644 --- a/nature/opts/history.lua +++ b/nature/opts/history.lua @@ -1,5 +1,6 @@ local bait = require 'bait' bait.catch('command.exit', function(_, cmd, priv) + if not cmd then return end if not priv and hilbish.opts.history then hilbish.history.add(cmd) end end) From 308e2578722d61d236508a35b60a744f18ab4b39 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:17:58 -0400 Subject: [PATCH 009/119] fix(readline): take into account newlines when calculating amount of lines taken up by input this does not really fix the issue of multiline input being broken completely, but prevents the prompt being reprinted on input --- readline/update.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/readline/update.go b/readline/update.go index 0c2de38..8f85c6d 100644 --- a/readline/update.go +++ b/readline/update.go @@ -1,6 +1,10 @@ package readline -import "golang.org/x/text/width" +import ( + "strings" + + "golang.org/x/text/width" +) // updateHelpers is a key part of the whole refresh process: // it should coordinate reprinting the input line, any Infos and completions @@ -52,19 +56,19 @@ func (rl *Instance) updateReferences() { rl.posY = 0 rl.fullY = 0 - var fullLine, cPosLine int + var curLine []rune if len(rl.currentComp) > 0 { - fullLine = getWidth(rl.lineComp) - cPosLine = getWidth(rl.lineComp[:rl.pos]) + curLine = rl.lineComp } else { - fullLine = getWidth(rl.line) - cPosLine = getWidth(rl.line[:rl.pos]) + curLine = rl.line } + fullLine := getWidth(curLine) + cPosLine := getWidth(curLine[:rl.pos]) // We need the X offset of the whole line toEndLine := rl.promptLen + fullLine fullOffset := toEndLine / GetTermWidth() - rl.fullY = fullOffset + rl.fullY = fullOffset + strings.Count(string(curLine), "\n") fullRest := toEndLine % GetTermWidth() rl.fullX = fullRest From b4ca5bfda378d2029e72942b1cc74dff7f00656d Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:19:24 -0400 Subject: [PATCH 010/119] fix(readline): put cursor at end of text when exiting editor --- readline/vim.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readline/vim.go b/readline/vim.go index 886927b..d496705 100644 --- a/readline/vim.go +++ b/readline/vim.go @@ -245,7 +245,7 @@ func (rl *Instance) vi(r rune) { } // Keep the previous cursor position - prev := rl.pos + //prev := rl.pos new, err := rl.StartEditorWithBuffer(multiline, "") if err != nil || len(new) == 0 || string(new) == string(multiline) { @@ -257,11 +257,11 @@ func (rl *Instance) vi(r rune) { // Clean the shell and put the new buffer, with adjusted pos if needed. rl.clearLine() rl.line = new - if prev > len(rl.line) { - rl.pos = len(rl.line) - 1 + rl.pos = len(rl.line) + /*if prev > len(rl.line) { } else { rl.pos = prev - } + }*/ case 'w': // If we were not yanking From 3bec2c91a8d58f328243759f9ed9dda7b8c409ec Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:26:54 -0400 Subject: [PATCH 011/119] fix: create an empty line reader instance for hilbish.read (closes #190) --- api.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api.go b/api.go index d060597..ed59396 100644 --- a/api.go +++ b/api.go @@ -263,7 +263,9 @@ func hlread(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err != nil { return nil, err } - lualr := newLineReader("", true) + lualr := &lineReader{ + rl: readline.NewInstance(), + } lualr.SetPrompt(luaprompt) input, err := lualr.Read() From 3ee2b033300c322908f06c7b0e64a47335cd436d Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:40:29 -0400 Subject: [PATCH 012/119] feat: make prompt optional in hilbish.read --- api.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/api.go b/api.go index ed59396..3e5f892 100644 --- a/api.go +++ b/api.go @@ -250,23 +250,27 @@ func hlcwd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { } -// read(prompt) -> input? +// read(prompt?) -> input? // Read input from the user, using Hilbish's line editor/input reader. // This is a separate instance from the one Hilbish actually uses. // Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) // --- @param prompt string func hlread(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { - if err := c.Check1Arg(); err != nil { - return nil, err + luaprompt := c.Arg(0) + if typ := luaprompt.Type(); typ != rt.StringType && typ != rt.NilType { + return nil, errors.New("expected #1 to be a string") } - luaprompt, err := c.StringArg(0) - if err != nil { - return nil, err + prompt, ok := luaprompt.TryString() + if !ok { + // if we are here and `luaprompt` is not a string, it's nil + // substitute with an empty string + prompt = "" } + lualr := &lineReader{ rl: readline.NewInstance(), } - lualr.SetPrompt(luaprompt) + lualr.SetPrompt(prompt) input, err := lualr.Read() if err != nil { From 300248de5417593ed58534ff9db48b9d0852e7e3 Mon Sep 17 00:00:00 2001 From: TorchedSammy Date: Mon, 10 Oct 2022 22:41:10 +0000 Subject: [PATCH 013/119] docs: [ci] generate new docs --- docs/hilbish.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hilbish.txt b/docs/hilbish.txt index d9763a0..20a9bd7 100644 --- a/docs/hilbish.txt +++ b/docs/hilbish.txt @@ -41,7 +41,7 @@ These will be formatted and replaced with the appropriate values. `%u` - Name of current user `%h` - Hostname of device -read(prompt) -> input? > Read input from the user, using Hilbish's line editor/input reader. +read(prompt?) -> input? > Read input from the user, using Hilbish's line editor/input reader. This is a separate instance from the one Hilbish actually uses. Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) From 0db7f96fd75ab8e791d832d955d1a4f54f007b62 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:55:03 -0400 Subject: [PATCH 014/119] build: disable cgo in builds --- Taskfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Taskfile.yaml b/Taskfile.yaml index 067f2ba..54b5ea0 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -13,13 +13,13 @@ vars: tasks: default: cmds: - - go build {{.GOFLAGS}} + - CGO_ENABLED=0 go build {{.GOFLAGS}} vars: GOFLAGS: '-ldflags "-s -w -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' build: cmds: - - go build {{.GOFLAGS}} + - CGO_ENABLED=0 go build {{.GOFLAGS}} install: cmds: From 068a5b514916c92a1afc32f9460de8c877180934 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Tue, 11 Oct 2022 17:41:13 -0400 Subject: [PATCH 015/119] feat(bait): add error hook and hooks function (closes #205) an `error` hook is now thrown when an event in lua throws an error (errors from go side should not happen) it includes the event name, handler, and error message a hooks function has also been added. it returns a table of handlers for a specific event. --- docs/hooks/index.txt | 5 +++++ golibs/bait/bait.go | 41 +++++++++++++++++++++++++++++++++++++++-- lua.go | 2 +- nature/init.lua | 5 +++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/docs/hooks/index.txt b/docs/hooks/index.txt index f771543..6616b05 100644 --- a/docs/hooks/index.txt +++ b/docs/hooks/index.txt @@ -6,3 +6,8 @@ Here is the format for a doc for a hook: `` just means the arguments of the hook. If a hook doc has the format of `arg...`, it means the hook can take/recieve any number of `arg`. + ++ error -> eventName, handler, err > Emitted when there is an error in +an event handler. The `eventName` is the name of the event the handler +is for, the `handler` is the callback function, and `err` is the error +message. diff --git a/golibs/bait/bait.go b/golibs/bait/bait.go index 89e0c4a..f071f92 100644 --- a/golibs/bait/bait.go +++ b/golibs/bait/bait.go @@ -1,6 +1,8 @@ package bait import ( + "errors" + "hilbish/util" rt "github.com/arnodel/golua/runtime" @@ -72,8 +74,12 @@ func (b *Bait) Emit(event string, args ...interface{}) { } _, err := rt.Call1(b.rtm.MainThread(), funcVal, luaArgs...) if err != nil { - // panicking here won't actually cause hilbish to panic and instead will - // print the error and remove the hook. reference the recoverer function in lua.go + if event != "error" { + b.Emit("error", event, handle.luaCaller, err.Error()) + return + } + // if there is an error in an error event handler, panic instead + // (calls the go recoverer function) panic(err) } } else { @@ -187,6 +193,7 @@ func (b *Bait) loaderFunc(rtm *rt.Runtime) (rt.Value, func()) { "catchOnce": util.LuaExport{b.bcatchOnce, 2, false}, "throw": util.LuaExport{b.bthrow, 1, true}, "release": util.LuaExport{b.brelease, 2, false}, + "hooks": util.LuaExport{b.bhooks, 1, false}, } mod := rt.NewTable() util.SetExports(rtm, mod, exports) @@ -289,3 +296,33 @@ func (b *Bait) brelease(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } + +// hooks(name) -> {cb, cb...} +// Returns a table with hooks on the event with `name`. +func (b *Bait) bhooks(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { + if err := c.Check1Arg(); err != nil { + return nil, err + } + evName, err := c.StringArg(0) + if err != nil { + return nil, err + } + noHooks := errors.New("no hooks for event " + evName) + + handlers := b.handlers[evName] + if handlers == nil { + return nil, noHooks + } + + luaHandlers := rt.NewTable() + for _, handler := range handlers { + if handler.typ != luaListener { continue } + luaHandlers.Set(rt.IntValue(luaHandlers.Len() + 1), rt.FunctionValue(handler.luaCaller)) + } + + if luaHandlers.Len() == 0 { + return nil, noHooks + } + + return c.PushingNext1(t.Runtime, rt.TableValue(luaHandlers)), nil +} diff --git a/lua.go b/lua.go index 419970c..79eb1f7 100644 --- a/lua.go +++ b/lua.go @@ -49,7 +49,7 @@ func luaInit() { hooks = bait.New(l) hooks.SetRecoverer(func(event string, handler *bait.Listener, err interface{}) { - fmt.Println("Error in", event, "event:", err) + fmt.Println("Error in `error` hook handler:", err) hooks.Off(event, handler) }) diff --git a/nature/init.lua b/nature/init.lua index 5359dc0..aa85a2e 100644 --- a/nature/init.lua +++ b/nature/init.lua @@ -1,5 +1,6 @@ -- Prelude initializes everything else for our shell local _ = require 'succulent' -- Function additions +local bait = require 'bait' local fs = require 'fs' package.path = package.path .. ';' .. hilbish.dataDir .. '/?/init.lua' @@ -64,3 +65,7 @@ do package.path = package.path .. ';' .. startSearchPath end + +bait.catch('error', function(event, handler, err) + bait.release(event, handler) +end) From cc6e5d01ddf65349401914832b66f4bb3ff00ee1 Mon Sep 17 00:00:00 2001 From: TorchedSammy Date: Tue, 11 Oct 2022 21:43:22 +0000 Subject: [PATCH 016/119] docs: [ci] generate new docs --- docs/bait.txt | 2 ++ emmyLuaDocs/bait.lua | 3 +++ 2 files changed, 5 insertions(+) diff --git a/docs/bait.txt b/docs/bait.txt index fdc712f..2b6f7ae 100644 --- a/docs/bait.txt +++ b/docs/bait.txt @@ -2,6 +2,8 @@ catch(name, cb) > Catches a hook with `name`. Runs the `cb` when it is thrown catchOnce(name, cb) > Same as catch, but only runs the `cb` once and then removes the hook +hooks(name) -> {cb, cb...} > Returns a table with hooks on the event with `name`. + release(name, catcher) > Removes the `catcher` for the event with `name` For this to work, `catcher` has to be the same function used to catch an event, like one saved to a variable. diff --git a/emmyLuaDocs/bait.lua b/emmyLuaDocs/bait.lua index a5ecebd..c2c4b60 100644 --- a/emmyLuaDocs/bait.lua +++ b/emmyLuaDocs/bait.lua @@ -12,6 +12,9 @@ function bait.catch(name, cb) end --- @param cb function function bait.catchOnce(name, cb) end +--- Returns a table with hooks on the event with `name`. +function bait.hooks() end + --- Removes the `catcher` for the event with `name` --- For this to work, `catcher` has to be the same function used to catch --- an event, like one saved to a variable. From 0d32a10ca3b0c047d7fa2a3e76e01143af9c7779 Mon Sep 17 00:00:00 2001 From: sammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 14 Oct 2022 19:15:40 -0400 Subject: [PATCH 017/119] feat: add builtins clear, exec and cat (#208) * feat: add clear and exec command * docs: add builtins to changelog * feat: add cat command --- CHANGELOG.md | 1 + nature/commands/cat.lua | 25 +++++++++++++++++++++++++ nature/commands/clear.lua | 7 +++++++ nature/commands/exec.lua | 5 +++++ 4 files changed, 38 insertions(+) create mode 100644 nature/commands/cat.lua create mode 100644 nature/commands/clear.lua create mode 100644 nature/commands/exec.lua diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fdae95..738991a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,6 +75,7 @@ disables commands being added to history. - A new and "safer" event emitter has been added. This causes a performance deficit, but avoids a lot of random errors introduced with the new Lua runtime (see [#197]) - `bait.release(name, catcher)` removes `handler` for the named `event` +- `exec`, `clear` and `cat` builtin commands [#197]: https://github.com/Rosettea/Hilbish/issues/197 diff --git a/nature/commands/cat.lua b/nature/commands/cat.lua new file mode 100644 index 0000000..132db5f --- /dev/null +++ b/nature/commands/cat.lua @@ -0,0 +1,25 @@ +local commander = require 'commander' +local fs = require 'fs' + +commander.register('cat', function(args) + local exit = 0 + + if #args == 0 then + print [[ +usage: cat [file]...]] + end + + for _, fName in ipairs(args) do + local f = io.open(fName) + if f == nil then + exit = 1 + print(string.format('cat: %s: no such file or directory', fName)) + goto continue + end + + io.write(f:read '*a') + ::continue:: + end + io.flush() + return exit +end) diff --git a/nature/commands/clear.lua b/nature/commands/clear.lua new file mode 100644 index 0000000..68aa197 --- /dev/null +++ b/nature/commands/clear.lua @@ -0,0 +1,7 @@ +local ansikit = require 'ansikit' +local commander = require 'commander' + +commander.register('clear', function() + ansikit.clear(true) + ansikit.cursorTo(0, 0) +end) diff --git a/nature/commands/exec.lua b/nature/commands/exec.lua new file mode 100644 index 0000000..d279e31 --- /dev/null +++ b/nature/commands/exec.lua @@ -0,0 +1,5 @@ +local commander = require 'commander' + +commander.register('exec', function(args) + hilbish.exec(args[1]) +end) From fe47c6c7a189bdec5139511a0c533c8f4131b77a Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 14 Oct 2022 19:16:24 -0400 Subject: [PATCH 018/119] chore: change version to rc1 --- vars.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vars.go b/vars.go index 810c1ee..70406cf 100644 --- a/vars.go +++ b/vars.go @@ -11,7 +11,7 @@ var ( // Version info var ( - ver = "v2.0.0" + ver = "v2.0.0-rc1" releaseName = "Hibiscus" gitCommit string gitBranch string From 6ffcc498ac59fa8f1f33f3079a89eda5b8accd47 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 14 Oct 2022 19:25:18 -0400 Subject: [PATCH 019/119] docs: update changelog for rc --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 738991a..13f8b0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -152,6 +152,11 @@ an error of missing format variable - Prompt now works with east asian characters (CJK) - Set back the prompt to normal after exiting the continue prompt with ctrl-d +## [2.0.0-rc1] - 2022-09-14 +This is a pre-release version of Hilbish for testing. To see the changelog, +refer to the `Unreleased` section of the [full changelog](CHANGELOG.md) +(version 2.0.0 for future reference). + ## [1.2.0] - 2022-03-17 ### Added - Job Management additions @@ -575,6 +580,8 @@ This input for example will prompt for more input to complete: First "stable" release of Hilbish. +[2.0.0-rc1]: https://github.com/Rosettea/Hilbish/compare/v1.2.0...v2.0.0-rc1 +[1.2.0]: https://github.com/Rosettea/Hilbish/compare/v1.1.4...v1.2.0 [1.1.0]: https://github.com/Rosettea/Hilbish/compare/v1.0.4...v1.1.0 [1.0.4]: https://github.com/Rosettea/Hilbish/compare/v1.0.3...v1.0.4 [1.0.3]: https://github.com/Rosettea/Hilbish/compare/v1.0.2...v1.0.3 From 1febe66f846f500f4bd07fe14691e3b359f49c80 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Thu, 17 Nov 2022 19:18:57 -0400 Subject: [PATCH 020/119] fix(readline): use uniseg to calculate width of virtual tab entry (closes #209) --- readline/tab-virtual.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/readline/tab-virtual.go b/readline/tab-virtual.go index fa7318e..d1e1d76 100644 --- a/readline/tab-virtual.go +++ b/readline/tab-virtual.go @@ -2,6 +2,7 @@ package readline import ( "strings" + "github.com/rivo/uniseg" ) // insertCandidateVirtual - When a completion candidate is selected, we insert it virtually in the input line: @@ -249,10 +250,10 @@ func (rl *Instance) viJumpEVirtual(tokeniser func([]rune, int) ([]string, int, i return case pos >= len(word)-1: word = rTrimWhiteSpace(split[index+1]) - adjust = len(split[index]) - pos - adjust += len(word) - 1 + adjust = uniseg.GraphemeClusterCount(split[index]) - pos + adjust += uniseg.GraphemeClusterCount(word) - 1 default: - adjust = len(word) - pos - 1 + adjust = uniseg.GraphemeClusterCount(word) - pos - 1 } return } From 8b547f2af039c45968b505a7dc947766b305ac9e Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 25 Nov 2022 16:56:35 -0400 Subject: [PATCH 021/119] feat: make tab completion work with spaces and escaped characters --- CHANGELOG.md | 3 +++ complete.go | 62 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13f8b0d..32db1e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -151,6 +151,9 @@ an error of missing format variable - Fix an error with sh syntax in aliases - Prompt now works with east asian characters (CJK) - Set back the prompt to normal after exiting the continue prompt with ctrl-d +- Users can now tab complete files with spaces while quoted or with escaped spaces. +This means a query of `Files\ to\ ` with file names of `Files to tab complete` and `Files to complete` +will result in the files being completed. ## [2.0.0-rc1] - 2022-09-14 This is a pre-release version of Hilbish for testing. To see the changelog, diff --git a/complete.go b/complete.go index 76d65f7..7c5153f 100644 --- a/complete.go +++ b/complete.go @@ -11,15 +11,49 @@ import ( rt "github.com/arnodel/golua/runtime" ) -func splitQuote(str string) []string { +var charEscapeMap = []string{ + "\"", "\\\"", + "'", "\\'", + "`", "\\`", + " ", "\\ ", + "(", "\\(", + ")", "\\)", + "[", "\\[", + "]", "\\]", + "$", "\\$", + "&", "\\&", + "*", "\\*", + ">", "\\>", + "<", "\\<", + "|", "\\|", +} +var charEscapeMapInvert = invert(charEscapeMap) +var escapeReplaer = strings.NewReplacer(charEscapeMap...) +var escapeInvertReplaer = strings.NewReplacer(charEscapeMapInvert...) + +func invert(m []string) []string { + newM := make([]string, len(charEscapeMap)) + for i := range m { + if (i + 1) % 2 == 0 { + newM[i] = m[i - 1] + newM[i - 1] = m[i] + } + } + + return newM +} + +func splitForFile(str string) []string { split := []string{} sb := &strings.Builder{} quoted := false - for _, r := range str { + for i, r := range str { if r == '"' { quoted = !quoted sb.WriteRune(r) + } else if r == ' ' && str[i - 1] == '\\' { + sb.WriteRune(r) } else if !quoted && r == ' ' { split = append(split, sb.String()) sb.Reset() @@ -39,7 +73,7 @@ func splitQuote(str string) []string { } func fileComplete(query, ctx string, fields []string) ([]string, string) { - q := splitQuote(ctx) + q := splitForFile(ctx) return matchPath(q[len(q) - 1]) } @@ -66,7 +100,6 @@ func binaryComplete(query, ctx string, fields []string) ([]string, string) { // filter out executables, but in path for _, dir := range filepath.SplitList(os.Getenv("PATH")) { - // print dir to stderr for debugging // search for an executable which matches our query string if matches, err := filepath.Glob(filepath.Join(dir, query + "*")); err == nil { // get basename from matches @@ -102,6 +135,7 @@ func matchPath(query string) ([]string, string) { var entries []string var baseName string + query = escapeInvertReplaer.Replace(query) path, _ := filepath.Abs(util.ExpandHome(filepath.Dir(query))) if string(query) == "" { // filepath base below would give us "." @@ -129,25 +163,7 @@ func matchPath(query string) ([]string, string) { } func escapeFilename(fname string) string { - args := []string{ - "\"", "\\\"", - "'", "\\'", - "`", "\\`", - " ", "\\ ", - "(", "\\(", - ")", "\\)", - "[", "\\[", - "]", "\\]", - "$", "\\$", - "&", "\\&", - "*", "\\*", - ">", "\\>", - "<", "\\<", - "|", "\\|", - } - - r := strings.NewReplacer(args...) - return r.Replace(fname) + return escapeReplaer.Replace(fname) } func completionLoader(rtm *rt.Runtime) *rt.Table { From 3eaeb6a5da169925fe748c096ac3069c3cb97b00 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 25 Nov 2022 18:39:18 -0400 Subject: [PATCH 022/119] fix(readline): grip completion menu fixes - dont print item left justified if the max number of cells is 1 (this fixes issues in cjk as an example) - trim items that are longer than the terminal width --- readline/comp-grid.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/readline/comp-grid.go b/readline/comp-grid.go index 48a2039..c198bdb 100644 --- a/readline/comp-grid.go +++ b/readline/comp-grid.go @@ -4,7 +4,8 @@ import ( "fmt" "strconv" "strings" -) + "github.com/rivo/uniseg" +) // initGrid - Grid display details. Called each time we want to be sure to have // a working completion group either immediately, or later on. Generally defered. @@ -13,8 +14,8 @@ func (g *CompletionGroup) initGrid(rl *Instance) { // Compute size of each completion item box tcMaxLength := 1 for i := range g.Suggestions { - if len(g.Suggestions[i]) > tcMaxLength { - tcMaxLength = len([]rune(g.Suggestions[i])) + if uniseg.GraphemeClusterCount(g.Suggestions[i]) > tcMaxLength { + tcMaxLength = uniseg.GraphemeClusterCount(g.Suggestions[i]) } } @@ -103,7 +104,7 @@ func (g *CompletionGroup) writeGrid(rl *Instance) (comp string) { rl.tcUsedY++ } - cellWidth := strconv.Itoa((GetTermWidth() / g.tcMaxX) - 2) + cellWidth := strconv.Itoa((GetTermWidth() / g.tcMaxX) - 4) x := 0 y := 1 @@ -124,7 +125,15 @@ func (g *CompletionGroup) writeGrid(rl *Instance) (comp string) { comp += seqInvert } - comp += fmt.Sprintf("%-"+cellWidth+"s %s", fmtEscape(g.Suggestions[i]), seqReset) + sugg := g.Suggestions[i] + if len(sugg) > GetTermWidth() { + sugg = sugg[:GetTermWidth() - 4] + "..." + } + formatStr := "%-"+cellWidth+"s%s " + if g.tcMaxX == 1 { + formatStr = "%s%s" + } + comp += fmt.Sprintf(formatStr, fmtEscape(sugg), seqReset) } // Always add a newline to the group if the end if not punctuated with one From d6338fc021f56ee5a58f1d5ca5d93b958eba2dbd Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 25 Nov 2022 19:08:38 -0400 Subject: [PATCH 023/119] fix(readline): make completion search menu display --- readline/readline.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readline/readline.go b/readline/readline.go index 731e297..9723f95 100644 --- a/readline/readline.go +++ b/readline/readline.go @@ -238,7 +238,9 @@ func (rl *Instance) Readline() (string, error) { // Normal completion search does only refresh the search pattern and the comps if rl.modeTabFind || rl.modeAutoFind { + rl.resetVirtualComp(false) rl.backspaceTabFind() + rl.renderHelpers() rl.viUndoSkipAppend = true } else { // Always cancel any virtual completion @@ -517,7 +519,9 @@ func (rl *Instance) Readline() (string, error) { if rl.modeAutoFind || rl.modeTabFind { rl.resetVirtualComp(false) rl.updateTabFind(r[:i]) + rl.renderHelpers() rl.viUndoSkipAppend = true + continue } else { rl.resetVirtualComp(false) rl.editorInput(r[:i]) From ef3e7d92bc1303c866a2f27e84e12943a040dcf9 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 25 Nov 2022 19:13:32 -0400 Subject: [PATCH 024/119] chore: update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32db1e1..11d44e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -154,6 +154,9 @@ an error of missing format variable - Users can now tab complete files with spaces while quoted or with escaped spaces. This means a query of `Files\ to\ ` with file names of `Files to tab complete` and `Files to complete` will result in the files being completed. +- Fixed grid menu display if cell width ends up being the width of the terminal +- Cut off item names in grid menu if its longer than cell width +- Fix completion search menu disappearing ## [2.0.0-rc1] - 2022-09-14 This is a pre-release version of Hilbish for testing. To see the changelog, From ff4609e4320f51d202dc575733ffc5232b814ec1 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 25 Nov 2022 19:21:36 -0400 Subject: [PATCH 025/119] feat: add hilbish.cancel hook (closes #213) --- CHANGELOG.md | 1 + docs/hooks/hilbish.txt | 2 ++ main.go | 7 +++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11d44e8..7c02489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,6 +76,7 @@ disables commands being added to history. random errors introduced with the new Lua runtime (see [#197]) - `bait.release(name, catcher)` removes `handler` for the named `event` - `exec`, `clear` and `cat` builtin commands +- `hilbish.cancel` hook [#197]: https://github.com/Rosettea/Hilbish/issues/197 diff --git a/docs/hooks/hilbish.txt b/docs/hooks/hilbish.txt index d6d5542..3d6d2ea 100644 --- a/docs/hooks/hilbish.txt +++ b/docs/hooks/hilbish.txt @@ -5,3 +5,5 @@ + `hilbish.vimAction` -> actionName, args > Sent when the user does a "vim action," being something like yanking or pasting text. See `doc vim-mode actions` for more info. + ++ `hilbish.cancel` > Sent when the user cancels their input with Ctrl-C. diff --git a/main.go b/main.go index ee0f584..1b5e6b8 100644 --- a/main.go +++ b/main.go @@ -181,11 +181,14 @@ input: break } if err != nil { - if err != readline.CtrlC { + if err == readline.CtrlC { + fmt.Println("^C") + hooks.Emit("hilbish.cancel") + } else { // If we get a completely random error, print fmt.Fprintln(os.Stderr, err) } - fmt.Println("^C") + // TODO: Halt if any other error occurs continue } var priv bool From ebec5856904e5f5b6c8b88045c27afab23d5bad8 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 25 Nov 2022 19:35:26 -0400 Subject: [PATCH 026/119] fix: binary completion with spaces (closes #210) --- complete.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/complete.go b/complete.go index 7c5153f..99da07f 100644 --- a/complete.go +++ b/complete.go @@ -79,6 +79,9 @@ func fileComplete(query, ctx string, fields []string) ([]string, string) { } func binaryComplete(query, ctx string, fields []string) ([]string, string) { + q := splitForFile(ctx) + query = q[len(q) - 1] + var completions []string prefixes := []string{"./", "../", "/", "~/"} @@ -88,7 +91,7 @@ func binaryComplete(query, ctx string, fields []string) ([]string, string) { if len(fileCompletions) != 0 { for _, f := range fileCompletions { fullPath, _ := filepath.Abs(util.ExpandHome(query + strings.TrimPrefix(f, filePref))) - if err := findExecutable(fullPath, false, true); err != nil { + if err := findExecutable(escapeInvertReplaer.Replace(fullPath), false, true); err != nil { continue } completions = append(completions, f) From bd4e0df7b32e43115ae307d7ff7b9ab0c8da3b11 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 25 Nov 2022 20:14:29 -0400 Subject: [PATCH 027/119] feat: select 1st item on history find menu (closes #148) cancels on escape unless the user moves to another item --- readline/readline.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/readline/readline.go b/readline/readline.go index 9723f95..7397faf 100644 --- a/readline/readline.go +++ b/readline/readline.go @@ -333,6 +333,8 @@ func (rl *Instance) Readline() (string, error) { rl.modeTabFind = true rl.updateTabFind([]rune{}) + rl.updateVirtualComp() + rl.renderHelpers() rl.viUndoSkipAppend = true // Tab Completion & Completion Search --------------------------------------------------------------- @@ -486,7 +488,10 @@ func (rl *Instance) Readline() (string, error) { if string(r[:i]) != seqShiftTab && string(r[:i]) != seqForwards && string(r[:i]) != seqBackwards && string(r[:i]) != seqUp && string(r[:i]) != seqDown { - rl.resetVirtualComp(false) + // basically only applies except on 1st ctrl r open + // so if we have not explicitly selected something + // (tabCompletionSelect is false) drop virtual completion + rl.resetVirtualComp(!rl.tabCompletionSelect) } } @@ -608,6 +613,7 @@ func (rl *Instance) escapeSeq(r []rune) { case string(charEscape): switch { case rl.modeAutoFind: + rl.resetVirtualComp(true) rl.resetTabFind() rl.clearHelpers() rl.resetTabCompletion() @@ -615,6 +621,7 @@ func (rl *Instance) escapeSeq(r []rune) { rl.renderHelpers() case rl.modeTabFind: + rl.resetVirtualComp(true) rl.resetTabFind() rl.resetTabCompletion() From 06102ebdaeb8664005632c4ed935a8b89b6ef5a0 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Wed, 30 Nov 2022 13:20:00 -0400 Subject: [PATCH 028/119] perf: preallocate history slice --- history.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/history.go b/history.go index a8eb089..51ccf27 100644 --- a/history.go +++ b/history.go @@ -73,13 +73,13 @@ func newFileHistory(path string) *fileHistory { } } - itms := []string{""} lines := strings.Split(string(data), "\n") + itms := make([]string, len(lines) - 1) for i, l := range lines { if i == len(lines) - 1 { continue } - itms = append(itms, l) + itms[i] = l } f, err := os.OpenFile(path, os.O_APPEND | os.O_WRONLY | os.O_CREATE, 0755) if err != nil { From b395b70ecdf6bfad7d0bfd6b09047a608f25aa7f Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Wed, 30 Nov 2022 14:26:43 -0400 Subject: [PATCH 029/119] fix: escape completion prefix if completions are escaped fixes an issue with duplicated characters when completing escaped paths --- complete.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/complete.go b/complete.go index 99da07f..c2a107c 100644 --- a/complete.go +++ b/complete.go @@ -161,6 +161,9 @@ func matchPath(query string) ([]string, string) { entries = append(entries, entry) } } + if !strings.HasPrefix(oldQuery, "\"") { + baseName = escapeFilename(baseName) + } return entries, baseName } From 3f9b23038192c84ff2f73491c70593ddf6b1aced Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Wed, 30 Nov 2022 14:29:46 -0400 Subject: [PATCH 030/119] chore: update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c02489..1c621d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,7 +77,9 @@ random errors introduced with the new Lua runtime (see [#197]) - `bait.release(name, catcher)` removes `handler` for the named `event` - `exec`, `clear` and `cat` builtin commands - `hilbish.cancel` hook +- 1st item on history is now inserted when history search menu is opened ([#148]) +[#148]: https://github.com/Rosettea/Hilbish/issues/148 [#197]: https://github.com/Rosettea/Hilbish/issues/197 ### Changed @@ -158,6 +160,7 @@ will result in the files being completed. - Fixed grid menu display if cell width ends up being the width of the terminal - Cut off item names in grid menu if its longer than cell width - Fix completion search menu disappearing +- Completion paths having duplicated characters if it's escaped ## [2.0.0-rc1] - 2022-09-14 This is a pre-release version of Hilbish for testing. To see the changelog, From b6aecb12f603ae89c660e52eb5cf733b2a3065d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20de=20S=C3=A1?= Date: Thu, 1 Dec 2022 10:29:27 -0300 Subject: [PATCH 031/119] chore: add .editorconfig file (#217) --- .editorconfig | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a06ed29 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = tab From 5e2b3367de00f2a50ecd4fd441334583fc9dea9d Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Thu, 1 Dec 2022 20:04:24 -0400 Subject: [PATCH 032/119] docs(bait): add annotation strings for release and hooks functions --- golibs/bait/bait.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/golibs/bait/bait.go b/golibs/bait/bait.go index f071f92..70e122c 100644 --- a/golibs/bait/bait.go +++ b/golibs/bait/bait.go @@ -286,6 +286,8 @@ func (b *Bait) bcatchOnce(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // Removes the `catcher` for the event with `name` // For this to work, `catcher` has to be the same function used to catch // an event, like one saved to a variable. +// --- @param name string +// --- @param catcher function func (b *Bait) brelease(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { name, catcher, err := util.HandleStrCallback(t, c) if err != nil { @@ -299,6 +301,8 @@ func (b *Bait) brelease(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // hooks(name) -> {cb, cb...} // Returns a table with hooks on the event with `name`. +// --- @param name string +// --- @returns table func (b *Bait) bhooks(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err From 09d04a7850f25db730dbfe833eaf402538045ff2 Mon Sep 17 00:00:00 2001 From: TorchedSammy Date: Fri, 2 Dec 2022 00:05:24 +0000 Subject: [PATCH 033/119] docs: [ci] generate new docs --- emmyLuaDocs/bait.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/emmyLuaDocs/bait.lua b/emmyLuaDocs/bait.lua index c2c4b60..a957e00 100644 --- a/emmyLuaDocs/bait.lua +++ b/emmyLuaDocs/bait.lua @@ -13,12 +13,16 @@ function bait.catch(name, cb) end function bait.catchOnce(name, cb) end --- Returns a table with hooks on the event with `name`. -function bait.hooks() end +--- @param name string +--- @returns table +function bait.hooks(name) end --- Removes the `catcher` for the event with `name` --- For this to work, `catcher` has to be the same function used to catch --- an event, like one saved to a variable. -function bait.release() end +--- @param name string +--- @param catcher function +function bait.release(name, catcher) end --- Throws a hook with `name` with the provided `args` --- @param name string From 4e850bb3224e901b427c3f7ffc5d1608bc0c2775 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 2 Dec 2022 09:39:22 -0400 Subject: [PATCH 034/119] ci: set build version to 1.18, use task for release builds --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 371d284..4aab838 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v2 with: - go-version: '1.17.7' + go-version: '1.18.8' - name: Download Task run: 'sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d' - name: Build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3a2840..3165a2f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,10 +33,13 @@ jobs: - uses: actions/checkout@v3 with: submodules: true + - name: Download Task + run: 'sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d' - uses: wangyoucao577/go-release-action@v1.25 with: github_token: ${{ secrets.GITHUB_TOKEN }} goos: ${{ matrix.goos }} goarch: ${{ matrix.goarch }} + build_command: task binary_name: hilbish extra_files: LICENSE README.md CHANGELOG.md .hilbishrc.lua nature libs docs emmyLuaDocs From 395f3c0742511fcd5cf5b4c8c65e1b33616c3816 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 2 Dec 2022 09:42:06 -0400 Subject: [PATCH 035/119] ci: remove extra indent in release action --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3165a2f..9f9163d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,7 +34,7 @@ jobs: with: submodules: true - name: Download Task - run: 'sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d' + run: 'sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d' - uses: wangyoucao577/go-release-action@v1.25 with: github_token: ${{ secrets.GITHUB_TOKEN }} From 604dedb36d172a18dd3b805412c9879766eac5d8 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 5 Dec 2022 14:16:43 -0400 Subject: [PATCH 036/119] chore: update lunacolors --- libs/lunacolors | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/lunacolors b/libs/lunacolors index 8467b87..34a57c9 160000 --- a/libs/lunacolors +++ b/libs/lunacolors @@ -1 +1 @@ -Subproject commit 8467b87dd8d49c68b4100b2d129d5f071544b8cf +Subproject commit 34a57c964590f89aa065188a588c7b38aff99c28 From 26ff6c9a46ae757963f7fdd9b075a99cc043c75e Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 5 Dec 2022 23:15:35 -0400 Subject: [PATCH 037/119] fix(nature/completions): get command name properly for custom completions --- CHANGELOG.md | 1 + nature/completions.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c621d1..1a2c86e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -161,6 +161,7 @@ will result in the files being completed. - Cut off item names in grid menu if its longer than cell width - Fix completion search menu disappearing - Completion paths having duplicated characters if it's escaped +- Get custom completion command properly to call from Lua ## [2.0.0-rc1] - 2022-09-14 This is a pre-release version of Hilbish for testing. To see the changelog, diff --git a/nature/completions.lua b/nature/completions.lua index d20cc59..f8127a1 100644 --- a/nature/completions.lua +++ b/nature/completions.lua @@ -24,7 +24,7 @@ function hilbish.completion.handler(line, pos) return {compGroup}, pfx else local ok, compGroups, pfx = pcall(hilbish.completion.call, - 'command.' .. #fields[1], query, ctx, fields) + 'command.' .. fields[1], query, ctx, fields) if ok then return compGroups, pfx end From 9131c7250128fb8c74316cf8e3f95e30132cf711 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 5 Dec 2022 23:38:52 -0400 Subject: [PATCH 038/119] build: apply hilbish datadir to allow changing install path --- Taskfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Taskfile.yaml b/Taskfile.yaml index 54b5ea0..f6b1d0f 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -8,14 +8,14 @@ vars: BINDIR: '{{default .bindir__ .BINDIR}}' libdir__: '{{.PREFIX}}/share/hilbish' LIBDIR: '{{default .libdir__ .LIBDIR}}' - GOFLAGS: '-ldflags "-s -w"' + GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}}"' tasks: default: cmds: - CGO_ENABLED=0 go build {{.GOFLAGS}} vars: - GOFLAGS: '-ldflags "-s -w -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' + GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}} -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' build: cmds: From 9c8d7692bc73c59dfaa9d74e90bf7b3448f5e434 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Tue, 6 Dec 2022 10:29:47 -0400 Subject: [PATCH 039/119] chore: revert "build: apply hilbish datadir to allow changing install path" This reverts commit 9131c7250128fb8c74316cf8e3f95e30132cf711. temporary revert, will have to apply datadir eventually --- Taskfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Taskfile.yaml b/Taskfile.yaml index f6b1d0f..54b5ea0 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -8,14 +8,14 @@ vars: BINDIR: '{{default .bindir__ .BINDIR}}' libdir__: '{{.PREFIX}}/share/hilbish' LIBDIR: '{{default .libdir__ .LIBDIR}}' - GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}}"' + GOFLAGS: '-ldflags "-s -w"' tasks: default: cmds: - CGO_ENABLED=0 go build {{.GOFLAGS}} vars: - GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}} -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' + GOFLAGS: '-ldflags "-s -w -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' build: cmds: From 1024f9344613576772e79f71455081cd31950b8f Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:54:56 -0400 Subject: [PATCH 040/119] chore: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a2c86e..6d8c4f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,7 @@ of a dot. (ie. `job.stop()` -> `job:stop()`) - All `fs` module functions which take paths now implicitly expand ~ to home. - **Breaking Change:** `hilbish.greeting` has been moved to an opt (`hilbish.opts.greeting`) and is always printed by default. To disable it, set the opt to false. +- **Breaking Change:** `command.no-perm` hook has been replaced with `command.not-executable` - History is now fetched from Lua, which means users can override `hilbish.history` methods to make it act how they want. - `guide` has been removed. See the [website](https://rosettea.github.io/Hilbish/) From 4ee160fb664907b0ad405d1f461831a508ad4053 Mon Sep 17 00:00:00 2001 From: sammyette Date: Fri, 9 Dec 2022 21:45:52 -0400 Subject: [PATCH 041/119] fix: provide correct command when navigating history (#214) fixes an issue of going up and down in history results in the incorrect order of commands being inserted (nothing happens to the order in the history itself, just when navigating via arrow keys) * fix: provide correct command when navigating history previously, the order while navigating history with the arrow keys would be incorrect meaning the command you expect if you go u then go back down would not be there * chore: update changelog --- CHANGELOG.md | 1 + readline/history.go | 18 +++++++----------- readline/instance.go | 1 + readline/readline.go | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d8c4f1..f240f11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -163,6 +163,7 @@ will result in the files being completed. - Fix completion search menu disappearing - Completion paths having duplicated characters if it's escaped - Get custom completion command properly to call from Lua +- Put proper command on the line when using up and down arrow keys to go through command history ## [2.0.0-rc1] - 2022-09-14 This is a pre-release version of Hilbish for testing. To see the changelog, diff --git a/readline/history.go b/readline/history.go index 41200c6..f772813 100644 --- a/readline/history.go +++ b/readline/history.go @@ -123,23 +123,20 @@ func (rl *Instance) walkHistory(i int) { // When we are exiting the current line buffer to move around // the history, we make buffer the current line - if rl.histPos == 0 && (rl.histPos+i) == 1 { + if rl.histOffset == 0 && rl.histOffset + i == 1 { rl.lineBuf = string(rl.line) } - switch rl.histPos + i { - case 0, history.Len() + 1: - rl.histPos = 0 + rl.histOffset += i + if rl.histOffset == 0 { rl.line = []rune(rl.lineBuf) rl.pos = len(rl.lineBuf) - return - case -1: - rl.histPos = 0 - rl.lineBuf = string(rl.line) - default: + } else if rl.histOffset <= -1 { + rl.histOffset = 0 + } else { dedup = true old = string(rl.line) - new, err = history.GetLine(history.Len() - rl.histPos - 1) + new, err = history.GetLine(history.Len() - rl.histOffset) if err != nil { rl.resetHelpers() print("\r\n" + err.Error() + "\r\n") @@ -148,7 +145,6 @@ func (rl *Instance) walkHistory(i int) { } rl.clearLine() - rl.histPos += i rl.line = []rune(new) rl.pos = len(rl.line) if rl.pos > 0 { diff --git a/readline/instance.go b/readline/instance.go index fcd8379..039f040 100644 --- a/readline/instance.go +++ b/readline/instance.go @@ -134,6 +134,7 @@ type Instance struct { // history operating params lineBuf string histPos int + histOffset int histNavIdx int // Used for quick history navigation. // diff --git a/readline/readline.go b/readline/readline.go index 7397faf..dc8407c 100644 --- a/readline/readline.go +++ b/readline/readline.go @@ -49,7 +49,7 @@ func (rl *Instance) Readline() (string, error) { // History Init // We need this set to the last command, so that we can access it quickly - rl.histPos = 0 + rl.histOffset = 0 rl.viUndoHistory = []undoItem{{line: "", pos: 0}} // Multisplit From f7e725b5b9cf50088726b411c6777f6e7b31a59f Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Fri, 9 Dec 2022 21:49:58 -0400 Subject: [PATCH 042/119] docs: make note on task --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ca8232..8302d48 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,8 @@ If you're new to nix you should probably read up on how to do that [here](https: ## Manual Build ### Prerequisites - [Go 1.17+](https://go.dev) -- [Task](https://taskfile.dev/#/) +- [Task](https://taskfile.dev/#/) + - **Do go to the link here for the installation of Task. Too much people install taskwarrior, which is the wrong program** ### Build First, clone Hilbish. The recursive is required, as some Lua libraries From 8d40179a73fe5942707cd43f9c0463dee53eedd8 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 10 Dec 2022 17:27:42 -0400 Subject: [PATCH 043/119] fix(readline): dont do anything if length of input rune slice is 0 this fixes an issue when readline splits multiline input. sometimes, the multiple lines just end up being "stray?" inputs of enter plus a newline. this can happen if a user attempts to prefire the enter key while a command is running, for example --- readline/readline.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readline/readline.go b/readline/readline.go index dc8407c..f1d6c96 100644 --- a/readline/readline.go +++ b/readline/readline.go @@ -546,6 +546,10 @@ func (rl *Instance) Readline() (string, error) { // entry readline is currently configured for and then update the line entries // accordingly. func (rl *Instance) editorInput(r []rune) { + if len(r) == 0 { + return + } + switch rl.modeViMode { case VimKeys: rl.vi(r[0]) From 813354b662808411ad9add0a831f30ee8d2ce4eb Mon Sep 17 00:00:00 2001 From: sammyette Date: Mon, 12 Dec 2022 21:01:44 -0400 Subject: [PATCH 044/119] build!: set datadir of hilbish and change default prefix to /usr/local (#221) BREAKING (ish) CHANGE: Hilbish will by default install to `/usr/local`. To revert this, set `PREFIX="/usr/"` --- Taskfile.yaml | 6 +++--- vars_linux.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Taskfile.yaml b/Taskfile.yaml index 54b5ea0..603633f 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -3,19 +3,19 @@ version: '3' vars: - PREFIX: '{{default "/usr" .PREFIX}}' + PREFIX: '{{default "/usr/local" .PREFIX}}' bindir__: '{{.PREFIX}}/bin' BINDIR: '{{default .bindir__ .BINDIR}}' libdir__: '{{.PREFIX}}/share/hilbish' LIBDIR: '{{default .libdir__ .LIBDIR}}' - GOFLAGS: '-ldflags "-s -w"' + GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}}"' tasks: default: cmds: - CGO_ENABLED=0 go build {{.GOFLAGS}} vars: - GOFLAGS: '-ldflags "-s -w -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' + GOFLAGS: '-ldflags "-s -w -X main.dataDir={{.LIBDIR}} -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' build: cmds: diff --git a/vars_linux.go b/vars_linux.go index 815ba6a..e1160ba 100644 --- a/vars_linux.go +++ b/vars_linux.go @@ -14,7 +14,7 @@ var ( .. hilbish.userDir.config .. '/hilbish/?/init.lua;' .. hilbish.userDir.config .. '/hilbish/?/?.lua;' .. hilbish.userDir.config .. '/hilbish/?.lua'` - dataDir = "/usr/share/hilbish" + dataDir = "/usr/local/share/hilbish" preloadPath = dataDir + "/nature/init.lua" sampleConfPath = dataDir + "/.hilbishrc.lua" // Path to default/sample config defaultConfDir = "" From 5ca728ba0689e69a234e5d4d28099140fca7e2c2 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 12 Dec 2022 21:03:36 -0400 Subject: [PATCH 045/119] docs: change task link and notice --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 8302d48..b4f85f7 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,7 @@ If you're new to nix you should probably read up on how to do that [here](https: ## Manual Build ### Prerequisites - [Go 1.17+](https://go.dev) -- [Task](https://taskfile.dev/#/) - - **Do go to the link here for the installation of Task. Too much people install taskwarrior, which is the wrong program** +- [Task](https://taskfile.dev/installation/) (**Go on the hyperlink here to see Task's install method for your OS.**) ### Build First, clone Hilbish. The recursive is required, as some Lua libraries From 6ca36847f163373f79ca756ddb5e2bb87d53e25b Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Mon, 12 Dec 2022 21:03:58 -0400 Subject: [PATCH 046/119] docs: add bolded notes/changes for building and installing hilbish 2.0 --- CHANGELOG.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f240f11..e856546 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,16 @@ # 🎀 Changelog ## Unreleased -**NOTE:** Hilbish now uses [Task] insead of Make for builds. -Windows support is also now at a lower tier; The only thing guaranteed is -Hilbish *compiling* on Windows. +**NOTES FOR USERS/PACKAGERS UPDATING:** +- Hilbish now uses [Task] insead of Make for builds. +- The doc format has been changed from plain text to markdown. +**YOU MUST reinstall Hilbish to remove the duplicate, old docs.** +- Hilbish will by default install to **`/usr/local`** instead of just `/usr/` +when building via Task. This is mainly to avoid conflict of distro packages +and local installs, and is the correct place when building from git either way. +To keep Hilbish in `/usr`, you must have `PREFIX="/usr/"` when running `task build` or `task install` +- Windows is no longer supported. It will build and run, but **will** have problems. +If you want to help fix the situation, start a discussion or open an issue and contribute. [Task]: https://taskfile.dev/#/ From 0a49e1a4ef4004a680e92a137d65cadca0d309f0 Mon Sep 17 00:00:00 2001 From: sammyette Date: Tue, 13 Dec 2022 12:57:27 -0400 Subject: [PATCH 047/119] feat: print command errors via hook this allows users to remove the handlers and print a custom message to their liking --- exec.go | 4 ++-- nature/init.lua | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/exec.go b/exec.go index caf7d1b..d668192 100644 --- a/exec.go +++ b/exec.go @@ -141,9 +141,9 @@ func runInput(input string, priv bool) { if err != nil { if exErr, ok := isExecError(err); ok { hooks.Emit("command." + exErr.typ, exErr.cmd) - err = exErr.sprint() + } else { + fmt.Fprintln(os.Stderr, err) } - fmt.Fprintln(os.Stderr, err) } cmdFinish(exitCode, input, priv) } diff --git a/nature/init.lua b/nature/init.lua index aa85a2e..ecd1054 100644 --- a/nature/init.lua +++ b/nature/init.lua @@ -69,3 +69,11 @@ end bait.catch('error', function(event, handler, err) bait.release(event, handler) end) + +bait.catch('command.not-found', function(cmd) + print(string.format('hilbish: %s not found', cmd)) +end) + +bait.catch('command.not-executable', function(cmd) + print(string.format('hilbish: %s: not executable', cmd)) +end) From 7b3dc951c9ce5e99b911ec4ad136aef45ce54ca6 Mon Sep 17 00:00:00 2001 From: sammyette Date: Tue, 13 Dec 2022 15:14:48 -0400 Subject: [PATCH 048/119] docs: add website (#176) --- .github/workflows/website.yml | 31 ++++ website/.hugo_build.lock | 0 website/archetypes/default.md | 6 + website/config.toml | 25 ++++ website/content/_index.md | 134 ++++++++++++++++++ website/content/docs/_index.md | 19 +++ website/content/docs/faq.md | 25 ++++ website/content/docs/features/_index.md | 11 ++ website/content/docs/features/runner-mode.md | 17 +++ website/content/docs/getting-started.md | 59 ++++++++ website/content/install.md | 38 +++++ website/static/hilbish-flower.png | Bin 0 -> 15941 bytes website/themes/hsh/LICENSE | 21 +++ website/themes/hsh/archetypes/default.md | 2 + website/themes/hsh/layouts/404.html | 7 + .../_default/_markup/render-heading.html | 6 + .../layouts/_default/_markup/render-link.html | 4 + .../themes/hsh/layouts/_default/baseof.html | 21 +++ website/themes/hsh/layouts/_default/doc.html | 53 +++++++ website/themes/hsh/layouts/_default/list.html | 0 website/themes/hsh/layouts/_default/page.html | 7 + .../themes/hsh/layouts/_default/single.html | 8 ++ website/themes/hsh/layouts/index.html | 6 + .../themes/hsh/layouts/partials/footer.html | 32 +++++ website/themes/hsh/layouts/partials/head.html | 26 ++++ .../themes/hsh/layouts/partials/header.html | 25 ++++ .../hsh/layouts/shortcodes/warning.html | 6 + website/themes/hsh/theme.toml | 21 +++ 28 files changed, 610 insertions(+) create mode 100644 .github/workflows/website.yml create mode 100644 website/.hugo_build.lock create mode 100644 website/archetypes/default.md create mode 100644 website/config.toml create mode 100644 website/content/_index.md create mode 100644 website/content/docs/_index.md create mode 100644 website/content/docs/faq.md create mode 100644 website/content/docs/features/_index.md create mode 100644 website/content/docs/features/runner-mode.md create mode 100644 website/content/docs/getting-started.md create mode 100644 website/content/install.md create mode 100644 website/static/hilbish-flower.png create mode 100644 website/themes/hsh/LICENSE create mode 100644 website/themes/hsh/archetypes/default.md create mode 100644 website/themes/hsh/layouts/404.html create mode 100644 website/themes/hsh/layouts/_default/_markup/render-heading.html create mode 100644 website/themes/hsh/layouts/_default/_markup/render-link.html create mode 100644 website/themes/hsh/layouts/_default/baseof.html create mode 100644 website/themes/hsh/layouts/_default/doc.html create mode 100644 website/themes/hsh/layouts/_default/list.html create mode 100644 website/themes/hsh/layouts/_default/page.html create mode 100644 website/themes/hsh/layouts/_default/single.html create mode 100644 website/themes/hsh/layouts/index.html create mode 100644 website/themes/hsh/layouts/partials/footer.html create mode 100644 website/themes/hsh/layouts/partials/head.html create mode 100644 website/themes/hsh/layouts/partials/header.html create mode 100644 website/themes/hsh/layouts/shortcodes/warning.html create mode 100644 website/themes/hsh/theme.toml diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 0000000..fc06a70 --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,31 @@ +name: Build website + +on: + push: + branches: + - master + - website + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + fetch-depth: 0 + + - name: Setup Hugo + uses: peaceiris/actions-hugo@v2 + with: + hugo-version: 'latest' + extended: true + + - name: Build + run: 'cd website && hugo --minify' + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./website/public diff --git a/website/.hugo_build.lock b/website/.hugo_build.lock new file mode 100644 index 0000000..e69de29 diff --git a/website/archetypes/default.md b/website/archetypes/default.md new file mode 100644 index 0000000..00e77bd --- /dev/null +++ b/website/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/website/config.toml b/website/config.toml new file mode 100644 index 0000000..ff6b801 --- /dev/null +++ b/website/config.toml @@ -0,0 +1,25 @@ +baseURL = 'https://rosettea.github.io/Hilbish/' +languageCode = 'en-us' +title = 'Hilbish' +theme = 'hsh' +enableGitInfo = true + +[menu] +[[menu.nav]] + identifier = 'home' + name = 'Home' + pageref = '/' + weight = 1 +[[menu.nav]] + identifier = 'install' + name = 'Install' + pageref = '/install' + weight = 2 +[[menu.nav]] + identifier = 'docs' + name = 'Docs' + pageref = '/docs' + weight = 3 + +[markup.goldmark.renderer] +unsafe = true diff --git a/website/content/_index.md b/website/content/_index.md new file mode 100644 index 0000000..2b1087b --- /dev/null +++ b/website/content/_index.md @@ -0,0 +1,134 @@ +--- +description: 'Something Unique. Hilbish is the new interactive shell for Lua fans. Extensible, scriptable, configurable: All in Lua.' +--- + +[//]: <> + + +
+

Something Unique.

+

+ Hilbish is the new interactive shell for Lua fans.
+ Extensible, scriptable, configurable: All in Lua. +

+ Install + Github +
+ +
+ +
+
+
+
+
+ + + +
+
+
Simple and Easy Scripting
+
+

+ Hilbish is configured and scripted in the Lua programming language. + This removes all the old, ugly things about Shell script and introduces + everything good about Lua, including other languages (Moonscript & Fennel). +

+
+
+
+
+
+
+
+
+
+ + + +
+
+
History and Completion Menus
+
+

+ Hilbish provides the user with proper menus for completions, + history searching. Want to see your previous commands? Hit Ctrl-R. +

+
+
+
+
+
+
+
+
+
+ + + +
+
+
Tons of Features, and More to Come
+
+

+ Hilbish offers a bunch of features to make your interactive + shell experience rich. Things like syntax highlighting and hinting + available via the Lua API. +

+

* Command hints shown in photo are not default.

+
+
+
+
+
+ + +
+ +
+ +

Why not just Lua?

+

+ Hilbish is your interactive shell as well as a just a Lua interpreter + and enhanced REPL.
+

+
    +
  • Batteries included Lua runtime that's also your user shell!
  • +
  • Hilbish is easily cross platform. It has OS agnostic interfaces for easy cross platform Lua code.
  • +
+ +
+ +

Try It Today!

+

+ Hilbish is known to run on the 3 major platforms (Windows, MacOS, Linux) + but likely builds on other Unixes! +
+ Windows doesn't work as well as it should, so if you're a Windows user, + say something! +

+

diff --git a/website/content/docs/_index.md b/website/content/docs/_index.md new file mode 100644 index 0000000..4f30ab3 --- /dev/null +++ b/website/content/docs/_index.md @@ -0,0 +1,19 @@ +--- +title: Introduction +layout: doc +weight: -1 +menu: docs +--- + +Here lies the documentation for Hilbish, the hyper extensible Lua shell. +Hilbish provides you with a few quality of life features and useful +functions to ensure you can make the shell fully yours. + +These features include: +- Completion and history search menus +- Hinting and syntax highlighting (scripted by user) + +# Installation +Steps on installing Hilbish will be at the Install page in the navigation bar +at the top. This also included getting development builds from the GitHub +repository. diff --git a/website/content/docs/faq.md b/website/content/docs/faq.md new file mode 100644 index 0000000..d5cd1a2 --- /dev/null +++ b/website/content/docs/faq.md @@ -0,0 +1,25 @@ +--- +title: Frequently Asked Questions +layout: doc +weight: -20 +menu: docs +--- + +# Is Hilbish POSIX compliant? +No, it is not. POSIX compliance is a non-goal. Perhaps in the future, +someone would be able to write a native plugin to support shell scripting +(which would be against it's main goal, but ....) + +# Windows Support? +It compiles for Windows (CI ensures it does), but otherwise it is not +directly supported. If you'd like to improve this situation, +checkout [the discussion](https://github.com/Rosettea/Hilbish/discussions/165). + +# Where is the API documentation? +The builtin `doc` command supplies all documentation of Hilbish provided +APIs. This will be on the website in the near future. + +# Why? +Hilbish emerged from the desire of a Lua configured shell. +It was the initial reason that it was created, but now it's more: +to be hyper extensible, simpler and more user friendly. diff --git a/website/content/docs/features/_index.md b/website/content/docs/features/_index.md new file mode 100644 index 0000000..0e14346 --- /dev/null +++ b/website/content/docs/features/_index.md @@ -0,0 +1,11 @@ +--- +title: Features +layout: doc +weight: -40 +menu: docs +--- + +Hilbish has a wide range of features to enhance the user's experience and +is always adding new ones. If there is something missing here or something +you would like to see, please [start a discussion](https://github.com/Rosettea/Hilbish/discussions) +or comment on any existing ones which match your request. diff --git a/website/content/docs/features/runner-mode.md b/website/content/docs/features/runner-mode.md new file mode 100644 index 0000000..87ecc8b --- /dev/null +++ b/website/content/docs/features/runner-mode.md @@ -0,0 +1,17 @@ +--- +title: Runner Mode +description: Customize the interactive script/command runner. +layout: doc +menu: + docs: + parent: "Features" +--- + +Hilbish allows you to change how interactive text can be interpreted. +This is mainly due to the fact that the default method Hilbish uses +is that it runs Lua first and then falls back to shell script. + +In some cases, someone might want to switch to just shell script to avoid +it while interactive but still have a Lua config, or go full Lua to use +Hilbish as a REPL. This also allows users to add alternative languages, +instead of either like Fennel. diff --git a/website/content/docs/getting-started.md b/website/content/docs/getting-started.md new file mode 100644 index 0000000..f0fe56d --- /dev/null +++ b/website/content/docs/getting-started.md @@ -0,0 +1,59 @@ +--- +title: Getting Started +layout: doc +weight: -10 +menu: docs +--- + +To start Hilbish, open a terminal. If Hilbish has been installed and is not the +default shell, you can simply run `hilbish` to start it. This will launch +a normal interactive session. +To exit, you can either run the `exit` command or hit Ctrl+D. + +# Setting as Default +## Login shell +There are a few ways to make Hilbish your default shell. A simple way is +to make it your user/login shell. + +{{< warning `It is not recommended to set Hilbish as your login shell. That is expected to be a +POSIX compliant shell, which Hilbish is not. At most, there will just be a +few variables missing in your environment` >}} + +To do that, simply run `chsh -s /usr/bin/hilbish`. +Some distros (namely Fedora) might have `lchsh` instead, which is used like `lchsh `. +When prompted, you can put the path for Hilbish. + +## Default with terminal +The simpler way is to set the default shell for your terminal. The way of +doing this depends on how your terminal settings are configured. + +## Run after login shell +Some shells (like zsh) have an rc file, like `.zlogin`, which is ran when the shell session +is a login shell. In that file, you can run Hilbish. Example: + +``` +exec hilbish -S -l +``` + +This will replace the shell with Hilbish, set $SHELL to Hilbish and launch it as a login shell. + +# Configuration +Once installation and setup has been done, you can then configure Hilbish. +It is configured and scripted via Lua, so the config file is a Lua file. +You can use any pure Lua library to do whatever you want. + +Hilbish's sample configuration is usually located in `hilbish.dataDir .. '/.hilbishrc.lua'`. +You can print that path via Lua to see what it is: `print(hilbish.dataDir .. '/.hilbishrc.lua')`. +As an example, it will usually will result in `/usr/share/hilbish/.hilbishrc.lua` on Linux. + +To edit your user configuration, you can copy that file to `hilbish.userDir.config .. '/hilbish/init.lua'`, +which follows XDG on Linux and MacOS, and is located in %APPDATA% on Windows. + +As the directory is usually `~/.config` on Linux, you can run this command to copy it: +`cp /usr/share/hilbish/.hilbishrc.lua ~/.config/hilbish/init.lua` + +Now you can get to editing it. Since it's just a Lua file, having basic +knowledge of Lua would help. All of Lua's standard libraries and functions +from Lua 5.4 are available. Hilbish has some custom and modules that are +available. To see them, you can run the `doc` command. This also works as +general documentation for other things. diff --git a/website/content/install.md b/website/content/install.md new file mode 100644 index 0000000..731b8c0 --- /dev/null +++ b/website/content/install.md @@ -0,0 +1,38 @@ +--- +title: Install +description: Steps on how to install Hilbish on all the OSes and distros supported. +layout: page +--- + +## Official Binaries +The best way to get Hilbish is to get a build directly from GitHub. +At any time, there are 2 versions of Hilbish recommended for download: +the latest stable release, and development builds from the master branch. + +You can download both at any time, but note that the development builds may +have breaking changes. + +For the latest **stable release**, check here: https://github.com/Rosettea/Hilbish/releases/latest +For a **development build**: https://nightly.link/Rosettea/Hilbish/workflows/build/master + +## Package Repositories +### Arch Linux (AUR) +Hilbish is on the AUR. Setup an AUR helper, and install. +Example with yay: + +``` +yay -S hilbish +``` + +Or, from master branch: +``` +yay -S hilbish-git +``` + +### Alpine Linux +Hilbish is currentlty in the testing/edge repository for Alpine. +Follow the steps [here](https://wiki.alpinelinux.org/wiki/Enable_Community_Repository) +(Using testing repositories) and install: +``` +apk add hilbish +``` diff --git a/website/static/hilbish-flower.png b/website/static/hilbish-flower.png new file mode 100644 index 0000000000000000000000000000000000000000..b4fb0f72d2cb09e1a301e0ca24cd857e7435be6c GIT binary patch literal 15941 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 +
+

Go Home

+
+ +{{ end }} diff --git a/website/themes/hsh/layouts/_default/_markup/render-heading.html b/website/themes/hsh/layouts/_default/_markup/render-heading.html new file mode 100644 index 0000000..6ea5346 --- /dev/null +++ b/website/themes/hsh/layouts/_default/_markup/render-heading.html @@ -0,0 +1,6 @@ + + {{ .Text | safeHTML }} + +{{ if eq .Text ""}} +
+{{ end }} diff --git a/website/themes/hsh/layouts/_default/_markup/render-link.html b/website/themes/hsh/layouts/_default/_markup/render-link.html new file mode 100644 index 0000000..9c2a95e --- /dev/null +++ b/website/themes/hsh/layouts/_default/_markup/render-link.html @@ -0,0 +1,4 @@ + + {{ .Text | safeHTML }} + + diff --git a/website/themes/hsh/layouts/_default/baseof.html b/website/themes/hsh/layouts/_default/baseof.html new file mode 100644 index 0000000..dad9ef8 --- /dev/null +++ b/website/themes/hsh/layouts/_default/baseof.html @@ -0,0 +1,21 @@ + + + {{- partial "head.html" . -}} + + + + + + + + + + + + + + {{- partial "header.html" . -}} + {{- block "main" . }}{{- end }} + {{- partial "footer.html" . -}} + + diff --git a/website/themes/hsh/layouts/_default/doc.html b/website/themes/hsh/layouts/_default/doc.html new file mode 100644 index 0000000..bebbf5e --- /dev/null +++ b/website/themes/hsh/layouts/_default/doc.html @@ -0,0 +1,53 @@ +{{ define "main" }} +
+
+
+ +
+
+
+
+

{{ .Title }}

+

+ {{ $date := .Date.UTC.Format "Jan 2, 2006" }} + {{ $lastmod := .Lastmod.UTC.Format "Jan 2, 2006" }} + {{ if and (ne $lastmod $date) (gt .Lastmod .Date) }} + Last updated {{ $lastmod }}
+ {{ end }} + + {{ if .Description }} + {{ .Description }}
+ {{ end}} +

+ {{.Content}} +
+ + +
+
+{{ end }} + diff --git a/website/themes/hsh/layouts/_default/list.html b/website/themes/hsh/layouts/_default/list.html new file mode 100644 index 0000000..e69de29 diff --git a/website/themes/hsh/layouts/_default/page.html b/website/themes/hsh/layouts/_default/page.html new file mode 100644 index 0000000..69aaf99 --- /dev/null +++ b/website/themes/hsh/layouts/_default/page.html @@ -0,0 +1,7 @@ +{{ define "main" }} +
+
+ {{.Content}} +
+
+{{ end }} diff --git a/website/themes/hsh/layouts/_default/single.html b/website/themes/hsh/layouts/_default/single.html new file mode 100644 index 0000000..0ac0e37 --- /dev/null +++ b/website/themes/hsh/layouts/_default/single.html @@ -0,0 +1,8 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+ {{.Content}} +
+
+{{ end }} diff --git a/website/themes/hsh/layouts/index.html b/website/themes/hsh/layouts/index.html new file mode 100644 index 0000000..a9f64d2 --- /dev/null +++ b/website/themes/hsh/layouts/index.html @@ -0,0 +1,6 @@ +{{ define "main" }} +
+ {{.Content}} +
+{{ end }} + diff --git a/website/themes/hsh/layouts/partials/footer.html b/website/themes/hsh/layouts/partials/footer.html new file mode 100644 index 0000000..15aa193 --- /dev/null +++ b/website/themes/hsh/layouts/partials/footer.html @@ -0,0 +1,32 @@ + diff --git a/website/themes/hsh/layouts/partials/head.html b/website/themes/hsh/layouts/partials/head.html new file mode 100644 index 0000000..3556074 --- /dev/null +++ b/website/themes/hsh/layouts/partials/head.html @@ -0,0 +1,26 @@ + + {{ $title := print .Title " — " .Site.Title }} + {{ if .IsHome }}{{ $title = .Site.Title }}{{ end }} + {{ $title }} + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/themes/hsh/layouts/partials/header.html b/website/themes/hsh/layouts/partials/header.html new file mode 100644 index 0000000..281b602 --- /dev/null +++ b/website/themes/hsh/layouts/partials/header.html @@ -0,0 +1,25 @@ +
+ +
diff --git a/website/themes/hsh/layouts/shortcodes/warning.html b/website/themes/hsh/layouts/shortcodes/warning.html new file mode 100644 index 0000000..b217b57 --- /dev/null +++ b/website/themes/hsh/layouts/shortcodes/warning.html @@ -0,0 +1,6 @@ + diff --git a/website/themes/hsh/theme.toml b/website/themes/hsh/theme.toml new file mode 100644 index 0000000..a567739 --- /dev/null +++ b/website/themes/hsh/theme.toml @@ -0,0 +1,21 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "Hsh" +license = "MIT" +licenselink = "https://github.com/yourname/yourtheme/blob/master/LICENSE" +description = "" +homepage = "http://example.com/" +tags = [] +features = [] +min_version = "0.41.0" + +[author] + name = "" + homepage = "" + +# If porting an existing theme +[original] + name = "" + homepage = "" + repo = "" From f94b8ae59bffe06dffc9b386528b5ba18b1734d0 Mon Sep 17 00:00:00 2001 From: sammyette Date: Tue, 13 Dec 2022 15:37:01 -0400 Subject: [PATCH 049/119] chore: update golua for popen (#172) * chore: update golua to popen branch * chore: fix go sum * chore: update golua with popen branch --- go.mod | 2 +- go.sum | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 825dae0..52b274a 100644 --- a/go.mod +++ b/go.mod @@ -29,4 +29,4 @@ replace github.com/maxlandon/readline => ./readline replace layeh.com/gopher-luar => github.com/layeh/gopher-luar v1.0.10 -replace github.com/arnodel/golua => github.com/Rosettea/golua v0.0.0-20220518005949-116371948fe3 +replace github.com/arnodel/golua => github.com/Rosettea/golua v0.0.0-20221213193027-cbf6d4e4d345 diff --git a/go.sum b/go.sum index c313c19..74a351b 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,10 @@ github.com/Rosettea/golua v0.0.0-20220419183026-6d22d6fec5ac h1:dtXrgjch8PQyf7C9 github.com/Rosettea/golua v0.0.0-20220419183026-6d22d6fec5ac/go.mod h1:9jzpYPiU2is0HVGCiuIOBSXdergHUW44IEjmuN1UrIE= github.com/Rosettea/golua v0.0.0-20220518005949-116371948fe3 h1:I/wWr40FFLFF9pbT3wLb1FAEZhKb/hUWE+nJ5uHBK2g= github.com/Rosettea/golua v0.0.0-20220518005949-116371948fe3/go.mod h1:9jzpYPiU2is0HVGCiuIOBSXdergHUW44IEjmuN1UrIE= +github.com/Rosettea/golua v0.0.0-20220621002945-b05143999437 h1:6lWu4YVLeKuZ8jR9xwHONhkHBsrIbw5dpfG1gtOVw0A= +github.com/Rosettea/golua v0.0.0-20220621002945-b05143999437/go.mod h1:9jzpYPiU2is0HVGCiuIOBSXdergHUW44IEjmuN1UrIE= +github.com/Rosettea/golua v0.0.0-20221213193027-cbf6d4e4d345 h1:QNYjYDogUSiNUkffbhFSrSCtpZhofeiVYGFN2FI4wSs= +github.com/Rosettea/golua v0.0.0-20221213193027-cbf6d4e4d345/go.mod h1:9jzpYPiU2is0HVGCiuIOBSXdergHUW44IEjmuN1UrIE= github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20220306140409-795a84b00b4e h1:P2XupP8SaylWaudD1DqbWtZ3mIa8OsE9635LmR+Q+lg= github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20220306140409-795a84b00b4e/go.mod h1:R09vh/04ILvP2Gj8/Z9Jd0Dh0ZIvaucowMEs6abQpWs= github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20220524215627-dfd9a4fa219b h1:s5eDMhBk6H1BgipgLub/gv9qeyBaTuiHM0k3h2/9TSE= From 84dd939bbf23d02449edb276e69893a0c4773958 Mon Sep 17 00:00:00 2001 From: sammyette Date: Wed, 14 Dec 2022 21:30:47 -0400 Subject: [PATCH 050/119] ci: replace website build branch with docs-refactor for website --- .github/workflows/website.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index fc06a70..f9a45e8 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - website + - docs-refactor jobs: deploy: From 514cbe25c71862c14d9af622ebdacc22f1bbdbb0 Mon Sep 17 00:00:00 2001 From: sammyette Date: Wed, 14 Dec 2022 21:31:11 -0400 Subject: [PATCH 051/119] ci: set fetch-depth to 0 and checkout action to v3 --- .github/workflows/release.yml | 1 + .github/workflows/website.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9f9163d..bf81cb9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,6 +33,7 @@ jobs: - uses: actions/checkout@v3 with: submodules: true + fetch-depth: 0 - name: Download Task run: 'sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d' - uses: wangyoucao577/go-release-action@v1.25 diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index f9a45e8..547673b 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -10,7 +10,7 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: submodules: true fetch-depth: 0 From 6525fa774edb261cb02570b7602c29674adecabd Mon Sep 17 00:00:00 2001 From: sammyette Date: Wed, 14 Dec 2022 21:32:21 -0400 Subject: [PATCH 052/119] ci: fix indents --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf81cb9..4d9afba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,7 +33,7 @@ jobs: - uses: actions/checkout@v3 with: submodules: true - fetch-depth: 0 + fetch-depth: 0 - name: Download Task run: 'sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d' - uses: wangyoucao577/go-release-action@v1.25 From e5eefb1d2de6dd5a70bf1f1b85b0672bbf9f32ec Mon Sep 17 00:00:00 2001 From: sammyette Date: Thu, 15 Dec 2022 00:00:54 -0400 Subject: [PATCH 053/119] refactor!: rework docs and doc command (#218) changes the actual file format of docs to markup since that's basically what we have been using in the first place. the docgen command has been modified to write markdown headings with the function name and yaml metadata for easy consumption by hugo for the website. all other docs have been moved to markdown as well this is the main reason this is a "breaking" change users will have to reinstall hilbish (task uninstall and task install) to remove the old plaintext docs --- .github/workflows/docs.yml | 5 +- .gitignore | 2 + aliases.go | 45 ++- api.go | 44 +-- cmd/docgen/docgen.go | 427 ++++++++++++++++------ complete.go | 19 +- docs/api/_index.md | 7 + docs/api/bait.md | 34 ++ docs/api/commander.md | 19 + docs/api/fs.md | 46 +++ docs/api/hilbish/_index.md | 104 ++++++ docs/api/hilbish/hilbish.aliases.md | 25 ++ docs/api/hilbish/hilbish.completions.md | 28 ++ docs/api/hilbish/hilbish.editor.md | 26 ++ docs/api/hilbish/hilbish.history.md | 27 ++ docs/api/hilbish/hilbish.jobs.md | 54 +++ docs/api/hilbish/hilbish.os.md | 19 + docs/api/hilbish/hilbish.runner.md | 31 ++ docs/api/hilbish/hilbish.timers.md | 33 ++ docs/api/hilbish/hilbish.userDir.md | 18 + docs/api/terminal.md | 26 ++ docs/bait.txt | 12 - docs/commander.txt | 4 - docs/{completions.txt => completions.md} | 0 docs/fs.txt | 22 -- docs/hilbish.txt | 62 ---- docs/hooks/{command.txt => command.md} | 0 docs/hooks/{hilbish.txt => hilbish.md} | 0 docs/hooks/{index.txt => index.md} | 0 docs/hooks/{job.txt => job.md} | 0 docs/hooks/{signal.txt => signal.md} | 0 docs/{jobs.txt => jobs.md} | 0 docs/{lunacolors.txt => lunacolors.md} | 0 docs/nature/{index.txt => index.md} | 0 docs/{runner-mode.txt => runner-mode.md} | 0 docs/terminal.txt | 9 - docs/{timers.txt => timers.md} | 0 docs/vim-mode/{actions.txt => actions.md} | 0 docs/vim-mode/{index.txt => index.md} | 0 editor.go | 16 + emmyLuaDocs/bait.lua | 2 +- emmyLuaDocs/fs.lua | 8 +- emmyLuaDocs/hilbish.lua | 122 ++++++- golibs/bait/bait.go | 6 + golibs/commander/commander.go | 2 + golibs/fs/fs.go | 4 + golibs/terminal/terminal.go | 2 + job.go | 45 +++ nature/commands/doc.lua | 64 ++-- nature/runner.lua | 1 + os.go | 27 ++ rl.go | 21 +- runnermode.go | 23 ++ timer.go | 10 +- timerhandler.go | 35 +- userdir.go | 23 ++ website/content/docs/api | 1 + 57 files changed, 1255 insertions(+), 305 deletions(-) create mode 100644 docs/api/_index.md create mode 100644 docs/api/bait.md create mode 100644 docs/api/commander.md create mode 100644 docs/api/fs.md create mode 100644 docs/api/hilbish/_index.md create mode 100644 docs/api/hilbish/hilbish.aliases.md create mode 100644 docs/api/hilbish/hilbish.completions.md create mode 100644 docs/api/hilbish/hilbish.editor.md create mode 100644 docs/api/hilbish/hilbish.history.md create mode 100644 docs/api/hilbish/hilbish.jobs.md create mode 100644 docs/api/hilbish/hilbish.os.md create mode 100644 docs/api/hilbish/hilbish.runner.md create mode 100644 docs/api/hilbish/hilbish.timers.md create mode 100644 docs/api/hilbish/hilbish.userDir.md create mode 100644 docs/api/terminal.md delete mode 100644 docs/bait.txt delete mode 100644 docs/commander.txt rename docs/{completions.txt => completions.md} (100%) delete mode 100644 docs/fs.txt delete mode 100644 docs/hilbish.txt rename docs/hooks/{command.txt => command.md} (100%) rename docs/hooks/{hilbish.txt => hilbish.md} (100%) rename docs/hooks/{index.txt => index.md} (100%) rename docs/hooks/{job.txt => job.md} (100%) rename docs/hooks/{signal.txt => signal.md} (100%) rename docs/{jobs.txt => jobs.md} (100%) rename docs/{lunacolors.txt => lunacolors.md} (100%) rename docs/nature/{index.txt => index.md} (100%) rename docs/{runner-mode.txt => runner-mode.md} (100%) delete mode 100644 docs/terminal.txt rename docs/{timers.txt => timers.md} (100%) rename docs/vim-mode/{actions.txt => actions.md} (100%) rename docs/vim-mode/{index.txt => index.md} (100%) create mode 100644 os.go create mode 100644 userdir.go create mode 120000 website/content/docs/api diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index e378376..6515d25 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -2,13 +2,14 @@ name: Generate docs on: push: - branches: [master] + branches: + - master jobs: gen: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions/setup-go@v2 - name: Run docgen run: go run cmd/docgen/docgen.go diff --git a/.gitignore b/.gitignore index 338ef97..b2be7c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ *.exe hilbish +!docs/api/hilbish docgen +!cmd/docgen .vim petals/ diff --git a/aliases.go b/aliases.go index 3007cc3..741a6a3 100644 --- a/aliases.go +++ b/aliases.go @@ -9,40 +9,40 @@ import ( rt "github.com/arnodel/golua/runtime" ) -var aliases *aliasHandler +var aliases *aliasModule -type aliasHandler struct { +type aliasModule struct { aliases map[string]string mu *sync.RWMutex } // initialize aliases map -func newAliases() *aliasHandler { - return &aliasHandler{ +func newAliases() *aliasModule { + return &aliasModule{ aliases: make(map[string]string), mu: &sync.RWMutex{}, } } -func (a *aliasHandler) Add(alias, cmd string) { +func (a *aliasModule) Add(alias, cmd string) { a.mu.Lock() defer a.mu.Unlock() a.aliases[alias] = cmd } -func (a *aliasHandler) All() map[string]string { +func (a *aliasModule) All() map[string]string { return a.aliases } -func (a *aliasHandler) Delete(alias string) { +func (a *aliasModule) Delete(alias string) { a.mu.Lock() defer a.mu.Unlock() delete(a.aliases, alias) } -func (a *aliasHandler) Resolve(cmdstr string) string { +func (a *aliasModule) Resolve(cmdstr string) string { a.mu.RLock() defer a.mu.RUnlock() @@ -66,7 +66,10 @@ func (a *aliasHandler) Resolve(cmdstr string) string { // lua section -func (a *aliasHandler) Loader(rtm *rt.Runtime) *rt.Table { +// #interface aliases +// command aliasing +// The alias interface deals with all command aliases in Hilbish. +func (a *aliasModule) Loader(rtm *rt.Runtime) *rt.Table { // create a lua module with our functions hshaliasesLua := map[string]util.LuaExport{ "add": util.LuaExport{hlalias, 2, false}, @@ -81,7 +84,17 @@ func (a *aliasHandler) Loader(rtm *rt.Runtime) *rt.Table { return mod } -func (a *aliasHandler) luaList(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +// #interface aliases +// add(alias, cmd) +// This is an alias (ha) for the `hilbish.alias` function. +// --- @param alias string +// --- @param cmd string +func _hlalias() {} + +// #interface aliases +// list() +// Get a table of all aliases. +func (a *aliasModule) luaList(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { aliasesList := rt.NewTable() for k, v := range a.All() { aliasesList.Set(rt.StringValue(k), rt.StringValue(v)) @@ -90,7 +103,11 @@ func (a *aliasHandler) luaList(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.TableValue(aliasesList)), nil } -func (a *aliasHandler) luaDelete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +// #interface aliases +// delete(name) +// Removes an alias. +// --- @param name string +func (a *aliasModule) luaDelete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -103,7 +120,11 @@ func (a *aliasHandler) luaDelete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } -func (a *aliasHandler) luaResolve(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +// #interface aliases +// resolve(alias) +// Tries to resolve an alias to its command. +// --- @param alias string +func (a *aliasModule) luaResolve(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } diff --git a/api.go b/api.go index 3e5f892..09df7c0 100644 --- a/api.go +++ b/api.go @@ -1,6 +1,14 @@ -// Here is the core api for the hilbi shell itself -// Basically, stuff about the shell itself and other functions -// go here. +// the core Hilbish API +// The Hilbish module includes the core API, containing +// interfaces and functions which directly relate to shell functionality. +// #field ver The version of Hilbish +// #field user Username of the user +// #field host Hostname of the machine +// #field dataDir Directory for Hilbish data files, including the docs and default modules +// #field interactive Is Hilbish in an interactive shell? +// #field login Is Hilbish the login shell? +// #field vimMode Current Vim input mode of Hilbish (will be nil if not in Vim input mode) +// #field exitCode xit code of the last executed command package main import ( @@ -19,7 +27,6 @@ import ( rt "github.com/arnodel/golua/runtime" "github.com/arnodel/golua/lib/packagelib" "github.com/maxlandon/readline" - "github.com/blackfireio/osinfo" "mvdan.cc/sh/v3/interp" ) @@ -114,20 +121,12 @@ func hilbishLoad(rtm *rt.Runtime) (rt.Value, func()) { util.Document(fakeMod, "Hilbish's core API, containing submodules and functions which relate to the shell itself.") // hilbish.userDir table - hshuser := rt.NewTable() - - util.SetField(rtm, hshuser, "config", rt.StringValue(confDir), "User's config directory") - util.SetField(rtm, hshuser, "data", rt.StringValue(userDataDir), "XDG data directory") + hshuser := userDirLoader(rtm) util.Document(hshuser, "User directories to store configs and/or modules.") mod.Set(rt.StringValue("userDir"), rt.TableValue(hshuser)) // hilbish.os table - hshos := rt.NewTable() - info, _ := osinfo.GetOSInfo() - - util.SetField(rtm, hshos, "family", rt.StringValue(info.Family), "Family name of the current OS") - util.SetField(rtm, hshos, "name", rt.StringValue(info.Name), "Pretty name of the current OS") - util.SetField(rtm, hshos, "version", rt.StringValue(info.Version), "Version of the current OS") + hshos := hshosLoader(rtm) util.Document(hshos, "OS info interface") mod.Set(rt.StringValue("os"), rt.TableValue(hshos)) @@ -159,10 +158,10 @@ func hilbishLoad(rtm *rt.Runtime) (rt.Value, func()) { mod.Set(rt.StringValue("jobs"), rt.TableValue(jobModule)) // hilbish.timers table - timers = newTimerHandler() - timerModule := timers.loader(rtm) - util.Document(timerModule, "Timer interface, for control of all intervals and timeouts.") - mod.Set(rt.StringValue("timers"), rt.TableValue(timerModule)) + timers = newTimersModule() + timersModule := timers.loader(rtm) + util.Document(timersModule, "Timer interface, for control of all intervals and timeouts.") + mod.Set(rt.StringValue("timers"), rt.TableValue(timersModule)) editorModule := editorLoader(rtm) util.Document(editorModule, "") @@ -250,11 +249,12 @@ func hlcwd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { } -// read(prompt?) -> input? +// read(prompt) -> input // Read input from the user, using Hilbish's line editor/input reader. // This is a separate instance from the one Hilbish actually uses. // Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) -// --- @param prompt string +// --- @param prompt string|nil +// --- @returns string|nil func hlread(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { luaprompt := c.Arg(0) if typ := luaprompt.Type(); typ != rt.StringType && typ != rt.NilType { @@ -281,7 +281,7 @@ func hlread(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { } /* -prompt(str, typ?) +prompt(str, typ) Changes the shell prompt to `str` There are a few verbs that can be used in the prompt text. These will be formatted and replaced with the appropriate values. @@ -289,7 +289,7 @@ These will be formatted and replaced with the appropriate values. `%u` - Name of current user `%h` - Hostname of device --- @param str string ---- @param typ string Type of prompt, being left or right. Left by default. +--- @param typ string|nil Type of prompt, being left or right. Left by default. */ func hlprompt(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { err := c.Check1Arg() diff --git a/cmd/docgen/docgen.go b/cmd/docgen/docgen.go index 39a2a76..cf70840 100644 --- a/cmd/docgen/docgen.go +++ b/cmd/docgen/docgen.go @@ -9,26 +9,191 @@ import ( "go/token" "strings" "os" + "sync" ) -type EmmyPiece struct { - FuncName string - Docs []string +var header = `--- +title: %s %s +description: %s +layout: doc +menu: + docs: + parent: "API" +--- + +` + +type emmyPiece struct { + DocPiece *docPiece + Annotations []string Params []string // we only need to know param name to put in function + FuncName string } -type DocPiece struct { + +type module struct { + Docs []docPiece + Fields []docPiece + Properties []docPiece + ShortDescription string + Description string + ParentModule string + HasInterfaces bool +} + +type docPiece struct { Doc []string FuncSig string FuncName string + Interfacing string + ParentModule string + GoFuncName string + IsInterface bool + IsMember bool + Fields []docPiece + Properties []docPiece +} + +type tag struct { + id string + fields []string +} + +var docs = make(map[string]module) +var interfaceDocs = make(map[string]module) +var emmyDocs = make(map[string][]emmyPiece) +var prefix = map[string]string{ + "main": "hl", + "hilbish": "hl", + "fs": "f", + "commander": "c", + "bait": "b", + "terminal": "term", +} + +func getTagsAndDocs(docs string) (map[string][]tag, []string) { + pts := strings.Split(docs, "\n") + parts := []string{} + tags := make(map[string][]tag) + + for _, part := range pts { + if strings.HasPrefix(part, "#") { + tagParts := strings.Split(strings.TrimPrefix(part, "#"), " ") + if tags[tagParts[0]] == nil { + var id string + if len(tagParts) > 1 { + id = tagParts[1] + } + tags[tagParts[0]] = []tag{ + {id: id}, + } + if len(tagParts) >= 2 { + tags[tagParts[0]][0].fields = tagParts[2:] + } + } else { + fleds := []string{} + if len(tagParts) >= 2 { + fleds = tagParts[2:] + } + tags[tagParts[0]] = append(tags[tagParts[0]], tag{ + id: tagParts[1], + fields: fleds, + }) + } + } else { + parts = append(parts, part) + } + } + + return tags, parts +} + +func docPieceTag(tagName string, tags map[string][]tag) []docPiece { + dps := []docPiece{} + for _, tag := range tags[tagName] { + dps = append(dps, docPiece{ + FuncName: tag.id, + Doc: tag.fields, + }) + } + + return dps +} + +func setupDoc(mod string, fun *doc.Func) *docPiece { + docs := strings.TrimSpace(fun.Doc) + inInterface := strings.HasPrefix(docs, "#interface") + if (!strings.HasPrefix(fun.Name, prefix[mod]) && !inInterface) || (strings.ToLower(fun.Name) == "loader" && !inInterface) { + return nil + } + + tags, parts := getTagsAndDocs(docs) + + var interfaces string + funcsig := parts[0] + doc := parts[1:] + funcName := strings.TrimPrefix(fun.Name, prefix[mod]) + funcdoc := []string{} + + if inInterface { + interfaces = tags["interface"][0].id + funcName = interfaces + "." + strings.Split(funcsig, "(")[0] + } + em := emmyPiece{FuncName: funcName} + + fields := docPieceTag("field", tags) + properties := docPieceTag("property", tags) + + for _, d := range doc { + if strings.HasPrefix(d, "---") { + emmyLine := strings.TrimSpace(strings.TrimPrefix(d, "---")) + emmyLinePieces := strings.Split(emmyLine, " ") + emmyType := emmyLinePieces[0] + if emmyType == "@param" { + em.Params = append(em.Params, emmyLinePieces[1]) + } + if emmyType == "@vararg" { + em.Params = append(em.Params, "...") // add vararg + } + em.Annotations = append(em.Annotations, d) + } else { + funcdoc = append(funcdoc, d) + } + } + + var isMember bool + if tags["member"] != nil { + isMember = true + } + var parentMod string + if inInterface { + parentMod = mod + } + dps := &docPiece{ + Doc: funcdoc, + FuncSig: funcsig, + FuncName: funcName, + Interfacing: interfaces, + GoFuncName: strings.ToLower(fun.Name), + IsInterface: inInterface, + IsMember: isMember, + ParentModule: parentMod, + Fields: fields, + Properties: properties, + } + if strings.HasSuffix(dps.GoFuncName, strings.ToLower("loader")) { + dps.Doc = parts + } + em.DocPiece = dps + + emmyDocs[mod] = append(emmyDocs[mod], em) + return dps } -// feel free to clean this up -// it works, dont really care about the code func main() { fset := token.NewFileSet() os.Mkdir("docs", 0777) + os.Mkdir("docs/api", 0777) os.Mkdir("emmyLuaDocs", 0777) - dirs := []string{"./"} filepath.Walk("golibs/", func (path string, info os.FileInfo, err error) error { @@ -51,120 +216,172 @@ func main() { } } - prefix := map[string]string{ - "hilbish": "hl", - "fs": "f", - "commander": "c", - "bait": "b", - "terminal": "term", - } - docs := make(map[string][]DocPiece) - emmyDocs := make(map[string][]EmmyPiece) - + interfaceModules := make(map[string]*module) for l, f := range pkgs { p := doc.New(f, "./", doc.AllDecls) + pieces := []docPiece{} + mod := l + if mod == "main" { + mod = "hilbish" + } + var hasInterfaces bool for _, t := range p.Funcs { - mod := l - if strings.HasPrefix(t.Name, "hl") { mod = "hilbish" } - if !strings.HasPrefix(t.Name, prefix[mod]) || t.Name == "Loader" { continue } - parts := strings.Split(strings.TrimSpace(t.Doc), "\n") - funcsig := parts[0] - doc := parts[1:] - funcdoc := []string{} - em := EmmyPiece{FuncName: strings.TrimPrefix(t.Name, prefix[mod])} - for _, d := range doc { - if strings.HasPrefix(d, "---") { - emmyLine := strings.TrimSpace(strings.TrimPrefix(d, "---")) - emmyLinePieces := strings.Split(emmyLine, " ") - emmyType := emmyLinePieces[0] - if emmyType == "@param" { - em.Params = append(em.Params, emmyLinePieces[1]) - } - if emmyType == "@vararg" { - em.Params = append(em.Params, "...") // add vararg - } - em.Docs = append(em.Docs, d) - } else { - funcdoc = append(funcdoc, d) - } + piece := setupDoc(mod, t) + if piece == nil { + continue } - - dps := DocPiece{ - Doc: funcdoc, - FuncSig: funcsig, - FuncName: strings.TrimPrefix(t.Name, prefix[mod]), + + pieces = append(pieces, *piece) + if piece.IsInterface { + hasInterfaces = true } - - docs[mod] = append(docs[mod], dps) - emmyDocs[mod] = append(emmyDocs[mod], em) } for _, t := range p.Types { for _, m := range t.Methods { - if !strings.HasPrefix(m.Name, prefix[l]) || m.Name == "Loader" { continue } - parts := strings.Split(strings.TrimSpace(m.Doc), "\n") - funcsig := parts[0] - doc := parts[1:] - funcdoc := []string{} - em := EmmyPiece{FuncName: strings.TrimPrefix(m.Name, prefix[l])} - for _, d := range doc { - if strings.HasPrefix(d, "---") { - emmyLine := strings.TrimSpace(strings.TrimPrefix(d, "---")) - emmyLinePieces := strings.Split(emmyLine, " ") - emmyType := emmyLinePieces[0] - if emmyType == "@param" { - em.Params = append(em.Params, emmyLinePieces[1]) - } - if emmyType == "@vararg" { - em.Params = append(em.Params, "...") // add vararg - } - em.Docs = append(em.Docs, d) - } else { - funcdoc = append(funcdoc, d) - } - } - dps := DocPiece{ - Doc: funcdoc, - FuncSig: funcsig, - FuncName: strings.TrimPrefix(m.Name, prefix[l]), + piece := setupDoc(mod, m) + if piece == nil { + continue } - docs[l] = append(docs[l], dps) - emmyDocs[l] = append(emmyDocs[l], em) + pieces = append(pieces, *piece) + if piece.IsInterface { + hasInterfaces = true + } } } + + tags, descParts := getTagsAndDocs(strings.TrimSpace(p.Doc)) + shortDesc := descParts[0] + desc := descParts[1:] + filteredPieces := []docPiece{} + for _, piece := range pieces { + if !piece.IsInterface { + filteredPieces = append(filteredPieces, piece) + continue + } + + modname := piece.ParentModule + "." + piece.Interfacing + if interfaceModules[modname] == nil { + interfaceModules[modname] = &module{ + ParentModule: piece.ParentModule, + } + } + + if strings.HasSuffix(piece.GoFuncName, strings.ToLower("loader")) { + shortDesc := piece.Doc[0] + desc := piece.Doc[1:] + interfaceModules[modname].ShortDescription = shortDesc + interfaceModules[modname].Description = strings.Join(desc, "\n") + interfaceModules[modname].Fields = piece.Fields + interfaceModules[modname].Properties = piece.Properties + continue + } + interfaceModules[modname].Docs = append(interfaceModules[modname].Docs, piece) + } + + docs[mod] = module{ + Docs: filteredPieces, + ShortDescription: shortDesc, + Description: strings.Join(desc, "\n"), + HasInterfaces: hasInterfaces, + Properties: docPieceTag("property", tags), + Fields: docPieceTag("field", tags), + } } + for key, mod := range interfaceModules { + docs[key] = *mod + } + + var wg sync.WaitGroup + wg.Add(len(docs) * 2) + for mod, v := range docs { - if mod == "main" { continue } - f, _ := os.Create("docs/" + mod + ".txt") - for _, dps := range v { - f.WriteString(dps.FuncSig + " > ") - for _, doc := range dps.Doc { - if !strings.HasPrefix(doc, "---") { - f.WriteString(doc + "\n") - } - } - f.WriteString("\n") + docPath := "docs/api/" + mod + ".md" + if v.HasInterfaces { + os.Mkdir("docs/api/" + mod, 0777) + os.Remove(docPath) // remove old doc path if it exists + docPath = "docs/api/" + mod + "/_index.md" } - } - - for mod, v := range emmyDocs { - if mod == "main" { continue } - f, _ := os.Create("emmyLuaDocs/" + mod + ".lua") - f.WriteString("--- @meta\n\nlocal " + mod + " = {}\n\n") - for _, em := range v { - var funcdocs []string - for _, dps := range docs[mod] { - if dps.FuncName == em.FuncName { - funcdocs = dps.Doc - } - } - f.WriteString("--- " + strings.Join(funcdocs, "\n--- ") + "\n") - if len(em.Docs) != 0 { - f.WriteString(strings.Join(em.Docs, "\n") + "\n") - } - f.WriteString("function " + mod + "." + em.FuncName + "(" + strings.Join(em.Params, ", ") + ") end\n\n") + if v.ParentModule != "" { + docPath = "docs/api/" + v.ParentModule + "/" + mod + ".md" } - f.WriteString("return " + mod + "\n") + + go func(modname, docPath string, modu module) { + defer wg.Done() + modOrIface := "Module" + if modu.ParentModule != "" { + modOrIface = "Interface" + } + + f, _ := os.Create(docPath) + f.WriteString(fmt.Sprintf(header, modOrIface, modname, modu.ShortDescription)) + f.WriteString(fmt.Sprintf("## Introduction\n%s\n\n", modu.Description)) + if len(modu.Fields) != 0 { + f.WriteString("## Interface fields\n") + for _, dps := range modu.Fields { + f.WriteString(fmt.Sprintf("- `%s`: ", dps.FuncName)) + f.WriteString(strings.Join(dps.Doc, " ")) + f.WriteString("\n") + } + f.WriteString("\n") + } + if len(modu.Properties) != 0 { + f.WriteString("## Object properties\n") + for _, dps := range modu.Properties { + f.WriteString(fmt.Sprintf("- `%s`: ", dps.FuncName)) + f.WriteString(strings.Join(dps.Doc, " ")) + f.WriteString("\n") + } + f.WriteString("\n") + } + if len(modu.Docs) != 0 { + f.WriteString("## Functions\n") + } + for _, dps := range modu.Docs { + f.WriteString(fmt.Sprintf("### %s\n", dps.FuncSig)) + for _, doc := range dps.Doc { + if !strings.HasPrefix(doc, "---") { + f.WriteString(doc + "\n") + } + } + f.WriteString("\n") + } + }(mod, docPath, v) + + go func(md, modname string, modu module) { + defer wg.Done() + + if modu.ParentModule != "" { + return + } + + ff, _ := os.Create("emmyLuaDocs/" + modname + ".lua") + ff.WriteString("--- @meta\n\nlocal " + modname + " = {}\n\n") + for _, em := range emmyDocs[modname] { + if strings.HasSuffix(em.DocPiece.GoFuncName, strings.ToLower("loader")) { + continue + } + + dps := em.DocPiece + funcdocs := dps.Doc + ff.WriteString("--- " + strings.Join(funcdocs, "\n--- ") + "\n") + if len(em.Annotations) != 0 { + ff.WriteString(strings.Join(em.Annotations, "\n") + "\n") + } + accessor := "." + if dps.IsMember { + accessor = ":" + } + signature := strings.Split(dps.FuncSig, " ->")[0] + var intrface string + if dps.IsInterface { + intrface = "." + dps.Interfacing + } + ff.WriteString("function " + modname + intrface + accessor + signature + " end\n\n") + } + ff.WriteString("return " + modname + "\n") + }(mod, mod, v) } + wg.Wait() } diff --git a/complete.go b/complete.go index c2a107c..7c3f563 100644 --- a/complete.go +++ b/complete.go @@ -172,6 +172,9 @@ func escapeFilename(fname string) string { return escapeReplaer.Replace(fname) } +// #interface completions +// tab completions +// The completions interface deals with tab completions. func completionLoader(rtm *rt.Runtime) *rt.Table { exports := map[string]util.LuaExport{ "files": {luaFileComplete, 3, false}, @@ -186,11 +189,19 @@ func completionLoader(rtm *rt.Runtime) *rt.Table { return mod } -// left as a shim, might doc in the same way as hilbish functions +// #interface completions +// handler(line, pos) +// The handler function is the callback for tab completion in Hilbish. +// You can check the completions doc for more info. func completionHandler(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface completions +// call(name, query, ctx, fields) +// Calls a completer function. This is mainly used to call +// a command completer, which will have a `name` in the form +// of `command.name`, example: `command.git` func callLuaCompleter(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.CheckNArgs(4); err != nil { return nil, err @@ -230,6 +241,9 @@ func callLuaCompleter(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, completerReturn), nil } +// #interface completions +// files(query, ctx, fields) +// Returns file completion candidates based on the provided query. func luaFileComplete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { query, ctx, fds, err := getCompleteParams(t, c) if err != nil { @@ -246,6 +260,9 @@ func luaFileComplete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext(t.Runtime, rt.TableValue(luaComps), rt.StringValue(pfx)), nil } +// #interface completions +// bins(query, ctx, fields) +// Returns binary/executale completion candidates based on the provided query. func luaBinaryComplete(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { query, ctx, fds, err := getCompleteParams(t, c) if err != nil { diff --git a/docs/api/_index.md b/docs/api/_index.md new file mode 100644 index 0000000..5c8b722 --- /dev/null +++ b/docs/api/_index.md @@ -0,0 +1,7 @@ +--- +title: API +layout: doc +weight: -50 +menu: docs +--- + diff --git a/docs/api/bait.md b/docs/api/bait.md new file mode 100644 index 0000000..fdf22b0 --- /dev/null +++ b/docs/api/bait.md @@ -0,0 +1,34 @@ +--- +title: Module bait +description: the event emitter +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +Bait is the event emitter for Hilbish. Why name it bait? Why not. +It throws hooks that you can catch. This is what you will use if +you want to listen in on hooks to know when certain things have +happened, like when you've changed directory, a command has failed, +etc. To find all available hooks thrown by Hilbish, see doc hooks. + +## Functions +### catch(name, cb) +Catches a hook with `name`. Runs the `cb` when it is thrown + +### catchOnce(name, cb) +Same as catch, but only runs the `cb` once and then removes the hook + +### hooks(name) -> {cb, cb...} +Returns a table with hooks on the event with `name`. + +### release(name, catcher) +Removes the `catcher` for the event with `name` +For this to work, `catcher` has to be the same function used to catch +an event, like one saved to a variable. + +### throw(name, ...args) +Throws a hook with `name` with the provided `args` + diff --git a/docs/api/commander.md b/docs/api/commander.md new file mode 100644 index 0000000..e3e5320 --- /dev/null +++ b/docs/api/commander.md @@ -0,0 +1,19 @@ +--- +title: Module commander +description: library for custom commands +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +Commander is a library for writing custom commands in Lua. + +## Functions +### deregister(name) +Deregisters any command registered with `name` + +### register(name, cb) +Register a command with `name` that runs `cb` when ran + diff --git a/docs/api/fs.md b/docs/api/fs.md new file mode 100644 index 0000000..6ad11de --- /dev/null +++ b/docs/api/fs.md @@ -0,0 +1,46 @@ +--- +title: Module fs +description: filesystem interaction and functionality library +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The fs module provides easy and simple access to filesystem functions +and other things, and acts an addition to the Lua standard library's +I/O and filesystem functions. + +## Functions +### abs(path) +Gives an absolute version of `path`. + +### basename(path) +Gives the basename of `path`. For the rules, +see Go's filepath.Base + +### cd(dir) +Changes directory to `dir` + +### dir(path) +Returns the directory part of `path`. For the rules, see Go's +filepath.Dir + +### glob(pattern) +Glob all files and directories that match the pattern. +For the rules, see Go's filepath.Glob + +### join(paths...) +Takes paths and joins them together with the OS's +directory separator (forward or backward slash). + +### mkdir(name, recursive) +Makes a directory called `name`. If `recursive` is true, it will create its parent directories. + +### readdir(dir) +Returns a table of files in `dir` + +### stat(path) +Returns info about `path` + diff --git a/docs/api/hilbish/_index.md b/docs/api/hilbish/_index.md new file mode 100644 index 0000000..5cdcb4d --- /dev/null +++ b/docs/api/hilbish/_index.md @@ -0,0 +1,104 @@ +--- +title: Module hilbish +description: the core Hilbish API +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The Hilbish module includes the core API, containing +interfaces and functions which directly relate to shell functionality. + +## Interface fields +- `ver`: The version of Hilbish +- `user`: Username of the user +- `host`: Hostname of the machine +- `dataDir`: Directory for Hilbish data files, including the docs and default modules +- `interactive`: Is Hilbish in an interactive shell? +- `login`: Is Hilbish the login shell? +- `vimMode`: Current Vim input mode of Hilbish (will be nil if not in Vim input mode) +- `exitCode`: xit code of the last executed command + +## Functions +### alias(cmd, orig) +Sets an alias of `cmd` to `orig` + +### appendPath(dir) +Appends `dir` to $PATH + +### complete(scope, cb) +Registers a completion handler for `scope`. +A `scope` is currently only expected to be `command.`, +replacing with the name of the command (for example `command.git`). +`cb` must be a function that returns a table of "completion groups." +Check `doc completions` for more information. + +### cwd() +Returns the current directory of the shell + +### exec(cmd) +Replaces running hilbish with `cmd` + +### goro(fn) +Puts `fn` in a goroutine + +### highlighter(line) +Line highlighter handler. This is mainly for syntax highlighting, but in +reality could set the input of the prompt to *display* anything. The +callback is passed the current line and is expected to return a line that +will be used as the input display. + +### hinter(line, pos) +The command line hint handler. It gets called on every key insert to +determine what text to use as an inline hint. It is passed the current +line and cursor position. It is expected to return a string which is used +as the text for the hint. This is by default a shim. To set hints, +override this function with your custom handler. + +### inputMode(mode) +Sets the input mode for Hilbish's line reader. Accepts either emacs or vim + +### interval(cb, time) +Runs the `cb` function every `time` milliseconds. +Returns a `timer` object (see `doc timers`). + +### multiprompt(str) +Changes the continued line prompt to `str` + +### prependPath(dir) +Prepends `dir` to $PATH + +### prompt(str, typ) +Changes the shell prompt to `str` +There are a few verbs that can be used in the prompt text. +These will be formatted and replaced with the appropriate values. +`%d` - Current working directory +`%u` - Name of current user +`%h` - Hostname of device + +### read(prompt) -> input +Read input from the user, using Hilbish's line editor/input reader. +This is a separate instance from the one Hilbish actually uses. +Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) + +### run(cmd, returnOut) -> exitCode, stdout, stderr +Runs `cmd` in Hilbish's sh interpreter. +If returnOut is true, the outputs of `cmd` will be returned as the 2nd and +3rd values instead of being outputted to the terminal. + +### runnerMode(mode) +Sets the execution/runner mode for interactive Hilbish. This determines whether +Hilbish wll try to run input as Lua and/or sh or only do one of either. +Accepted values for mode are hybrid (the default), hybridRev (sh first then Lua), +sh, and lua. It also accepts a function, to which if it is passed one +will call it to execute user input instead. + +### timeout(cb, time) +Runs the `cb` function after `time` in milliseconds +Returns a `timer` object (see `doc timers`). + +### which(name) +Checks if `name` is a valid command + diff --git a/docs/api/hilbish/hilbish.aliases.md b/docs/api/hilbish/hilbish.aliases.md new file mode 100644 index 0000000..1ff766c --- /dev/null +++ b/docs/api/hilbish/hilbish.aliases.md @@ -0,0 +1,25 @@ +--- +title: Interface hilbish.aliases +description: command aliasing +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The alias interface deals with all command aliases in Hilbish. + +## Functions +### add(alias, cmd) +This is an alias (ha) for the `hilbish.alias` function. + +### delete(name) +Removes an alias. + +### list() +Get a table of all aliases. + +### resolve(alias) +Tries to resolve an alias to its command. + diff --git a/docs/api/hilbish/hilbish.completions.md b/docs/api/hilbish/hilbish.completions.md new file mode 100644 index 0000000..bcfd2f9 --- /dev/null +++ b/docs/api/hilbish/hilbish.completions.md @@ -0,0 +1,28 @@ +--- +title: Interface hilbish.completions +description: tab completions +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The completions interface deals with tab completions. + +## Functions +### call(name, query, ctx, fields) +Calls a completer function. This is mainly used to call +a command completer, which will have a `name` in the form +of `command.name`, example: `command.git` + +### handler(line, pos) +The handler function is the callback for tab completion in Hilbish. +You can check the completions doc for more info. + +### bins(query, ctx, fields) +Returns binary/executale completion candidates based on the provided query. + +### files(query, ctx, fields) +Returns file completion candidates based on the provided query. + diff --git a/docs/api/hilbish/hilbish.editor.md b/docs/api/hilbish/hilbish.editor.md new file mode 100644 index 0000000..bb0f257 --- /dev/null +++ b/docs/api/hilbish/hilbish.editor.md @@ -0,0 +1,26 @@ +--- +title: Interface hilbish.editor +description: interactions for Hilbish's line reader +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The hilbish.editor interface provides functions to +directly interact with the line editor in use. + +## Functions +### getLine() +Returns the current input line. + +### getVimRegister(register) +Returns the text that is at the register. + +### insert(text) +Inserts text into the line. + +### setVimRegister(register, text) +Sets the vim register at `register` to hold the passed text. + diff --git a/docs/api/hilbish/hilbish.history.md b/docs/api/hilbish/hilbish.history.md new file mode 100644 index 0000000..f297ab2 --- /dev/null +++ b/docs/api/hilbish/hilbish.history.md @@ -0,0 +1,27 @@ +--- +title: Interface hilbish.history +description: command history +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The history interface deals with command history. +This includes the ability to override functions to change the main +method of saving history. + +## Functions +### add(cmd) +Adds a command to the history. + +### clear() +Deletes all commands from the history. + +### get(idx) +Retrieves a command from the history based on the `idx`. + +### size() +Returns the amount of commands in the history. + diff --git a/docs/api/hilbish/hilbish.jobs.md b/docs/api/hilbish/hilbish.jobs.md new file mode 100644 index 0000000..b180dd4 --- /dev/null +++ b/docs/api/hilbish/hilbish.jobs.md @@ -0,0 +1,54 @@ +--- +title: Interface hilbish.jobs +description: background job management +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction + +Manage interactive jobs in Hilbish via Lua. + +Jobs are the name of background tasks/commands. A job can be started via +interactive usage or with the functions defined below for use in external runners. + +## Object properties +- `cmd`: The user entered command string for the job. +- `running`: Whether the job is running or not. +- `id`: The ID of the job in the job table +- `pid`: The Process ID +- `exitCode`: The last exit code of the job. +- `stdout`: The standard output of the job. This just means the normal logs of the process. +- `stderr`: The standard error stream of the process. This (usually) includes error messages of the job. + +## Functions +### background() +Puts a job in the background. This acts the same as initially running a job. + +### foreground() +Puts a job in the foreground. This will cause it to run like it was +executed normally and wait for it to complete. + +### start() +Starts running the job. + +### stop() +Stops the job from running. + +### add(cmdstr, args, execPath) +Adds a new job to the job table. Note that this does not immediately run it. + +### all() +Returns a table of all job objects. + +### disown(id) +Disowns a job. This deletes it from the job table. + +### get(id) +Get a job object via its ID. + +### last() -> Job +Returns the last added job from the table. + diff --git a/docs/api/hilbish/hilbish.os.md b/docs/api/hilbish/hilbish.os.md new file mode 100644 index 0000000..aa2198e --- /dev/null +++ b/docs/api/hilbish/hilbish.os.md @@ -0,0 +1,19 @@ +--- +title: Interface hilbish.os +description: OS Info +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The `os` interface provides simple text information properties about +the current OS on the systen. This mainly includes the name and +version. + +## Interface fields +- `family`: Family name of the current OS +- `name`: Pretty name of the current OS +- `version`: Version of the current OS + diff --git a/docs/api/hilbish/hilbish.runner.md b/docs/api/hilbish/hilbish.runner.md new file mode 100644 index 0000000..68ffdc6 --- /dev/null +++ b/docs/api/hilbish/hilbish.runner.md @@ -0,0 +1,31 @@ +--- +title: Interface hilbish.runner +description: interactive command runner customization +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The runner interface contains functions that allow the user to change +how Hilbish interprets interactive input. +Users can add and change the default runner for interactive input to any +language or script of their choosing. A good example is using it to +write command in Fennel. + +## Functions +### setMode(cb) +This is the same as the `hilbish.runnerMode` function. It takes a callback, +which will be used to execute all interactive input. +In normal cases, neither callbacks should be overrided by the user, +as the higher level functions listed below this will handle it. + +### lua(cmd) +Evaluates `cmd` as Lua input. This is the same as using `dofile` +or `load`, but is appropriated for the runner interface. + +### sh(cmd) +Runs a command in Hilbish's shell script interpreter. +This is the equivalent of using `source`. + diff --git a/docs/api/hilbish/hilbish.timers.md b/docs/api/hilbish/hilbish.timers.md new file mode 100644 index 0000000..60bedb5 --- /dev/null +++ b/docs/api/hilbish/hilbish.timers.md @@ -0,0 +1,33 @@ +--- +title: Interface hilbish.timers +description: timeout and interval API +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The timers interface si one to easily set timeouts and intervals +to run functions after a certain time or repeatedly without using +odd tricks. + +## Object properties +- `type`: What type of timer it is +- `running`: If the timer is running +- `duration`: The duration in milliseconds that the timer will run + +## Functions +### start() +Starts a timer. + +### stop() +Stops a timer. + +### create(type, time, callback) +Creates a timer that runs based on the specified `time` in milliseconds. +The `type` can either be interval (value of 0) or timeout (value of 1). + +### get(id) +Retrieves a timer via its ID. + diff --git a/docs/api/hilbish/hilbish.userDir.md b/docs/api/hilbish/hilbish.userDir.md new file mode 100644 index 0000000..0b95057 --- /dev/null +++ b/docs/api/hilbish/hilbish.userDir.md @@ -0,0 +1,18 @@ +--- +title: Interface hilbish.userDir +description: user-related directories +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +This interface just contains properties to know about certain user directories. +It is equivalent to XDG on Linux and gets the user's preferred directories +for configs and data. + +## Interface fields +- `config`: The user's config directory +- `data`: The user's directory for program data + diff --git a/docs/api/terminal.md b/docs/api/terminal.md new file mode 100644 index 0000000..99d4b49 --- /dev/null +++ b/docs/api/terminal.md @@ -0,0 +1,26 @@ +--- +title: Module terminal +description: low level terminal library +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction +The terminal library is a simple and lower level library for certain terminal interactions. + +## Functions +### restoreState() +Restores the last saved state of the terminal + +### saveState() +Saves the current state of the terminal + +### setRaw() +Puts the terminal in raw mode + +### size() +Gets the dimensions of the terminal. Returns a table with `width` and `height` +Note: this is not the size in relation to the dimensions of the display + diff --git a/docs/bait.txt b/docs/bait.txt deleted file mode 100644 index 2b6f7ae..0000000 --- a/docs/bait.txt +++ /dev/null @@ -1,12 +0,0 @@ -catch(name, cb) > Catches a hook with `name`. Runs the `cb` when it is thrown - -catchOnce(name, cb) > Same as catch, but only runs the `cb` once and then removes the hook - -hooks(name) -> {cb, cb...} > Returns a table with hooks on the event with `name`. - -release(name, catcher) > Removes the `catcher` for the event with `name` -For this to work, `catcher` has to be the same function used to catch -an event, like one saved to a variable. - -throw(name, ...args) > Throws a hook with `name` with the provided `args` - diff --git a/docs/commander.txt b/docs/commander.txt deleted file mode 100644 index 8b4b329..0000000 --- a/docs/commander.txt +++ /dev/null @@ -1,4 +0,0 @@ -deregister(name) > Deregisters any command registered with `name` - -register(name, cb) > Register a command with `name` that runs `cb` when ran - diff --git a/docs/completions.txt b/docs/completions.md similarity index 100% rename from docs/completions.txt rename to docs/completions.md diff --git a/docs/fs.txt b/docs/fs.txt deleted file mode 100644 index 8372afd..0000000 --- a/docs/fs.txt +++ /dev/null @@ -1,22 +0,0 @@ -abs(path) > Gives an absolute version of `path`. - -basename(path) > Gives the basename of `path`. For the rules, -see Go's filepath.Base - -cd(dir) > Changes directory to `dir` - -dir(path) > Returns the directory part of `path`. For the rules, see Go's -filepath.Dir - -glob(pattern) > Glob all files and directories that match the pattern. -For the rules, see Go's filepath.Glob - -join(paths...) > Takes paths and joins them together with the OS's -directory separator (forward or backward slash). - -mkdir(name, recursive) > Makes a directory called `name`. If `recursive` is true, it will create its parent directories. - -readdir(dir) > Returns a table of files in `dir` - -stat(path) > Returns info about `path` - diff --git a/docs/hilbish.txt b/docs/hilbish.txt deleted file mode 100644 index 20a9bd7..0000000 --- a/docs/hilbish.txt +++ /dev/null @@ -1,62 +0,0 @@ -alias(cmd, orig) > Sets an alias of `cmd` to `orig` - -appendPath(dir) > Appends `dir` to $PATH - -complete(scope, cb) > Registers a completion handler for `scope`. -A `scope` is currently only expected to be `command.`, -replacing with the name of the command (for example `command.git`). -`cb` must be a function that returns a table of "completion groups." -Check `doc completions` for more information. - -cwd() > Returns the current directory of the shell - -exec(cmd) > Replaces running hilbish with `cmd` - -goro(fn) > Puts `fn` in a goroutine - -highlighter(line) > Line highlighter handler. This is mainly for syntax highlighting, but in -reality could set the input of the prompt to *display* anything. The -callback is passed the current line and is expected to return a line that -will be used as the input display. - -hinter(line, pos) > The command line hint handler. It gets called on every key insert to -determine what text to use as an inline hint. It is passed the current -line and cursor position. It is expected to return a string which is used -as the text for the hint. This is by default a shim. To set hints, -override this function with your custom handler. - -inputMode(mode) > Sets the input mode for Hilbish's line reader. Accepts either emacs or vim - -interval(cb, time) > Runs the `cb` function every `time` milliseconds. -Returns a `timer` object (see `doc timers`). - -multiprompt(str) > Changes the continued line prompt to `str` - -prependPath(dir) > Prepends `dir` to $PATH - -prompt(str, typ?) > Changes the shell prompt to `str` -There are a few verbs that can be used in the prompt text. -These will be formatted and replaced with the appropriate values. -`%d` - Current working directory -`%u` - Name of current user -`%h` - Hostname of device - -read(prompt?) -> input? > Read input from the user, using Hilbish's line editor/input reader. -This is a separate instance from the one Hilbish actually uses. -Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) - -run(cmd, returnOut) -> exitCode, stdout, stderr > Runs `cmd` in Hilbish's sh interpreter. -If returnOut is true, the outputs of `cmd` will be returned as the 2nd and -3rd values instead of being outputted to the terminal. - -runnerMode(mode) > Sets the execution/runner mode for interactive Hilbish. This determines whether -Hilbish wll try to run input as Lua and/or sh or only do one of either. -Accepted values for mode are hybrid (the default), hybridRev (sh first then Lua), -sh, and lua. It also accepts a function, to which if it is passed one -will call it to execute user input instead. - -timeout(cb, time) > Runs the `cb` function after `time` in milliseconds -Returns a `timer` object (see `doc timers`). - -which(name) > Checks if `name` is a valid command - diff --git a/docs/hooks/command.txt b/docs/hooks/command.md similarity index 100% rename from docs/hooks/command.txt rename to docs/hooks/command.md diff --git a/docs/hooks/hilbish.txt b/docs/hooks/hilbish.md similarity index 100% rename from docs/hooks/hilbish.txt rename to docs/hooks/hilbish.md diff --git a/docs/hooks/index.txt b/docs/hooks/index.md similarity index 100% rename from docs/hooks/index.txt rename to docs/hooks/index.md diff --git a/docs/hooks/job.txt b/docs/hooks/job.md similarity index 100% rename from docs/hooks/job.txt rename to docs/hooks/job.md diff --git a/docs/hooks/signal.txt b/docs/hooks/signal.md similarity index 100% rename from docs/hooks/signal.txt rename to docs/hooks/signal.md diff --git a/docs/jobs.txt b/docs/jobs.md similarity index 100% rename from docs/jobs.txt rename to docs/jobs.md diff --git a/docs/lunacolors.txt b/docs/lunacolors.md similarity index 100% rename from docs/lunacolors.txt rename to docs/lunacolors.md diff --git a/docs/nature/index.txt b/docs/nature/index.md similarity index 100% rename from docs/nature/index.txt rename to docs/nature/index.md diff --git a/docs/runner-mode.txt b/docs/runner-mode.md similarity index 100% rename from docs/runner-mode.txt rename to docs/runner-mode.md diff --git a/docs/terminal.txt b/docs/terminal.txt deleted file mode 100644 index 7683bbb..0000000 --- a/docs/terminal.txt +++ /dev/null @@ -1,9 +0,0 @@ -restoreState() > Restores the last saved state of the terminal - -saveState() > Saves the current state of the terminal - -setRaw() > Puts the terminal in raw mode - -size() > Gets the dimensions of the terminal. Returns a table with `width` and `height` -Note: this is not the size in relation to the dimensions of the display - diff --git a/docs/timers.txt b/docs/timers.md similarity index 100% rename from docs/timers.txt rename to docs/timers.md diff --git a/docs/vim-mode/actions.txt b/docs/vim-mode/actions.md similarity index 100% rename from docs/vim-mode/actions.txt rename to docs/vim-mode/actions.md diff --git a/docs/vim-mode/index.txt b/docs/vim-mode/index.md similarity index 100% rename from docs/vim-mode/index.txt rename to docs/vim-mode/index.md diff --git a/editor.go b/editor.go index 868f458..4331dd9 100644 --- a/editor.go +++ b/editor.go @@ -6,6 +6,10 @@ import ( rt "github.com/arnodel/golua/runtime" ) +// #interface editor +// interactions for Hilbish's line reader +// The hilbish.editor interface provides functions to +// directly interact with the line editor in use. func editorLoader(rtm *rt.Runtime) *rt.Table { exports := map[string]util.LuaExport{ "insert": {editorInsert, 1, false}, @@ -20,6 +24,9 @@ func editorLoader(rtm *rt.Runtime) *rt.Table { return mod } +// #interface editor +// insert(text) +// Inserts text into the line. func editorInsert(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -35,6 +42,9 @@ func editorInsert(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface editor +// setVimRegister(register, text) +// Sets the vim register at `register` to hold the passed text. func editorSetRegister(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -55,6 +65,9 @@ func editorSetRegister(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface editor +// getVimRegister(register) +// Returns the text that is at the register. func editorGetRegister(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -70,6 +83,9 @@ func editorGetRegister(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.StringValue(string(buf))), nil } +// #interface editor +// getLine() +// Returns the current input line. func editorGetLine(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { buf := lr.rl.GetLine() diff --git a/emmyLuaDocs/bait.lua b/emmyLuaDocs/bait.lua index a957e00..65f9f83 100644 --- a/emmyLuaDocs/bait.lua +++ b/emmyLuaDocs/bait.lua @@ -27,6 +27,6 @@ function bait.release(name, catcher) end --- Throws a hook with `name` with the provided `args` --- @param name string --- @vararg any -function bait.throw(name, ...) end +function bait.throw(name, ...args) end return bait diff --git a/emmyLuaDocs/fs.lua b/emmyLuaDocs/fs.lua index 14e7be4..eb5743a 100644 --- a/emmyLuaDocs/fs.lua +++ b/emmyLuaDocs/fs.lua @@ -8,7 +8,7 @@ function fs.abs(path) end --- Gives the basename of `path`. For the rules, --- see Go's filepath.Base -function fs.basename() end +function fs.basename(path) end --- Changes directory to `dir` --- @param dir string @@ -16,15 +16,15 @@ function fs.cd(dir) end --- Returns the directory part of `path`. For the rules, see Go's --- filepath.Dir -function fs.dir() end +function fs.dir(path) end --- Glob all files and directories that match the pattern. --- For the rules, see Go's filepath.Glob -function fs.glob() end +function fs.glob(pattern) end --- Takes paths and joins them together with the OS's --- directory separator (forward or backward slash). -function fs.join() end +function fs.join(paths...) end --- Makes a directory called `name`. If `recursive` is true, it will create its parent directories. --- @param name string diff --git a/emmyLuaDocs/hilbish.lua b/emmyLuaDocs/hilbish.lua index ca34425..7a6930d 100644 --- a/emmyLuaDocs/hilbish.lua +++ b/emmyLuaDocs/hilbish.lua @@ -2,6 +2,38 @@ local hilbish = {} +--- This is an alias (ha) for the `hilbish.alias` function. +--- @param alias string +--- @param cmd string +function hilbish.aliases.add(alias, cmd) end + +--- This is the same as the `hilbish.runnerMode` function. It takes a callback, +--- which will be used to execute all interactive input. +--- In normal cases, neither callbacks should be overrided by the user, +--- as the higher level functions listed below this will handle it. +function hilbish.runner.setMode(cb) end + +--- Calls a completer function. This is mainly used to call +--- a command completer, which will have a `name` in the form +--- of `command.name`, example: `command.git` +function hilbish.completions.call(name, query, ctx, fields) end + +--- The handler function is the callback for tab completion in Hilbish. +--- You can check the completions doc for more info. +function hilbish.completions.handler(line, pos) end + +--- Returns the current input line. +function hilbish.editor.getLine() end + +--- Returns the text that is at the register. +function hilbish.editor.getVimRegister(register) end + +--- Inserts text into the line. +function hilbish.editor.insert(text) end + +--- Sets the vim register at `register` to hold the passed text. +function hilbish.editor.setVimRegister(register, text) end + --- Sets an alias of `cmd` to `orig` --- @param cmd string --- @param orig string @@ -73,20 +105,21 @@ function hilbish.prependPath(dir) end --- `%u` - Name of current user --- `%h` - Hostname of device --- @param str string ---- @param typ string Type of prompt, being left or right. Left by default. +--- @param typ string|nil Type of prompt, being left or right. Left by default. function hilbish.prompt(str, typ) end --- Read input from the user, using Hilbish's line editor/input reader. --- This is a separate instance from the one Hilbish actually uses. --- Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) ---- @param prompt string +--- @param prompt string|nil +--- @returns string|nil function hilbish.read(prompt) end --- Runs `cmd` in Hilbish's sh interpreter. --- If returnOut is true, the outputs of `cmd` will be returned as the 2nd and --- 3rd values instead of being outputted to the terminal. --- @param cmd string -function hilbish.run(cmd) end +function hilbish.run(cmd, returnOut) end --- Sets the execution/runner mode for interactive Hilbish. This determines whether --- Hilbish wll try to run input as Lua and/or sh or only do one of either. @@ -105,6 +138,87 @@ function hilbish.timeout(cb, time) end --- Checks if `name` is a valid command --- @param binName string -function hilbish.which(binName) end +function hilbish.which(name) end + +--- Puts a job in the background. This acts the same as initially running a job. +function hilbish.jobs:background() end + +--- Returns binary/executale completion candidates based on the provided query. +function hilbish.completions.bins(query, ctx, fields) end + +--- Returns file completion candidates based on the provided query. +function hilbish.completions.files(query, ctx, fields) end + +--- Puts a job in the foreground. This will cause it to run like it was +--- executed normally and wait for it to complete. +function hilbish.jobs:foreground() end + +--- Evaluates `cmd` as Lua input. This is the same as using `dofile` +--- or `load`, but is appropriated for the runner interface. +function hilbish.runner.lua(cmd) end + +--- Starts running the job. +function hilbish.jobs:start() end + +--- Stops the job from running. +function hilbish.jobs.stop() end + +--- Runs a command in Hilbish's shell script interpreter. +--- This is the equivalent of using `source`. +function hilbish.runner.sh(cmd) end + +--- Starts a timer. +function hilbish.timers:start() end + +--- Stops a timer. +function hilbish.timers:stop() end + +--- Removes an alias. +--- @param name string +function hilbish.aliases.delete(name) end + +--- Get a table of all aliases. +function hilbish.aliases.list() end + +--- Tries to resolve an alias to its command. +--- @param alias string +function hilbish.aliases.resolve(alias) end + +--- Adds a new job to the job table. Note that this does not immediately run it. +function hilbish.jobs.add(cmdstr, args, execPath) end + +--- Returns a table of all job objects. +function hilbish.jobs.all() end + +--- Disowns a job. This deletes it from the job table. +function hilbish.jobs.disown(id) end + +--- Get a job object via its ID. +function hilbish.jobs.get(id) end + +--- Returns the last added job from the table. +function hilbish.jobs.last() end + +--- Adds a command to the history. +--- @param cmd string +function hilbish.history.add(cmd) end + +--- Deletes all commands from the history. +function hilbish.history.clear() end + +--- Retrieves a command from the history based on the `idx`. +--- @param idx number +function hilbish.history.get(idx) end + +--- Returns the amount of commands in the history. +--- @returns number +function hilbish.history.size() end + +--- Creates a timer that runs based on the specified `time` in milliseconds. +--- The `type` can either be interval (value of 0) or timeout (value of 1). +function hilbish.timers.create(type, time, callback) end + +--- Retrieves a timer via its ID. +function hilbish.timers.get(id) end return hilbish diff --git a/golibs/bait/bait.go b/golibs/bait/bait.go index 70e122c..8a6bf8c 100644 --- a/golibs/bait/bait.go +++ b/golibs/bait/bait.go @@ -1,3 +1,9 @@ +// the event emitter +// Bait is the event emitter for Hilbish. Why name it bait? Why not. +// It throws hooks that you can catch. This is what you will use if +// you want to listen in on hooks to know when certain things have +// happened, like when you've changed directory, a command has failed, +// etc. To find all available hooks thrown by Hilbish, see doc hooks. package bait import ( diff --git a/golibs/commander/commander.go b/golibs/commander/commander.go index 24f1c03..93785e2 100644 --- a/golibs/commander/commander.go +++ b/golibs/commander/commander.go @@ -1,3 +1,5 @@ +// library for custom commands +// Commander is a library for writing custom commands in Lua. package commander import ( diff --git a/golibs/fs/fs.go b/golibs/fs/fs.go index 5b12e73..94b8110 100644 --- a/golibs/fs/fs.go +++ b/golibs/fs/fs.go @@ -1,3 +1,7 @@ +// filesystem interaction and functionality library +// The fs module provides easy and simple access to filesystem functions +// and other things, and acts an addition to the Lua standard library's +// I/O and filesystem functions. package fs import ( diff --git a/golibs/terminal/terminal.go b/golibs/terminal/terminal.go index df1755c..4ae8f88 100644 --- a/golibs/terminal/terminal.go +++ b/golibs/terminal/terminal.go @@ -1,3 +1,5 @@ +// low level terminal library +// The terminal library is a simple and lower level library for certain terminal interactions. package terminal import ( diff --git a/job.go b/job.go index 709cc1f..b9400cd 100644 --- a/job.go +++ b/job.go @@ -110,6 +110,10 @@ func (j *job) getProc() *os.Process { return nil } +// #interface jobs +// #member +// start() +// Starts running the job. func luaStartJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -130,6 +134,9 @@ func luaStartJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface jobs +// stop() +// Stops the job from running. func luaStopJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -148,6 +155,11 @@ func luaStopJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface jobs +// #member +// foreground() +// Puts a job in the foreground. This will cause it to run like it was +// executed normally and wait for it to complete. func luaForegroundJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -180,6 +192,10 @@ func luaForegroundJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface jobs +// #member +// background() +// Puts a job in the background. This acts the same as initially running a job. func luaBackgroundJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -276,6 +292,20 @@ func (j *jobHandler) stopAll() { } } +// #interface jobs +// #property cmd The user entered command string for the job. +// #property running Whether the job is running or not. +// #property id The ID of the job in the job table +// #property pid The Process ID +// #property exitCode The last exit code of the job. +// #property stdout The standard output of the job. This just means the normal logs of the process. +// #property stderr The standard error stream of the process. This (usually) includes error messages of the job. +// background job management +/* +Manage interactive jobs in Hilbish via Lua. + +Jobs are the name of background tasks/commands. A job can be started via +interactive usage or with the functions defined below for use in external runners. */ func (j *jobHandler) loader(rtm *rt.Runtime) *rt.Table { jobMethods := rt.NewTable() jFuncs := map[string]util.LuaExport{ @@ -353,6 +383,9 @@ func jobUserData(j *job) *rt.UserData { return rt.NewUserData(j, jobMeta.AsTable()) } +// #interface jobs +// get(id) +// Get a job object via its ID. func (j *jobHandler) luaGetJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { j.mu.RLock() defer j.mu.RUnlock() @@ -373,6 +406,9 @@ func (j *jobHandler) luaGetJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext(t.Runtime, rt.UserDataValue(job.ud)), nil } +// #interface jobs +// add(cmdstr, args, execPath) +// Adds a new job to the job table. Note that this does not immediately run it. func (j *jobHandler) luaAddJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.CheckNArgs(3); err != nil { return nil, err @@ -402,6 +438,9 @@ func (j *jobHandler) luaAddJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.UserDataValue(jb.ud)), nil } +// #interface jobs +// all() +// Returns a table of all job objects. func (j *jobHandler) luaAllJobs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { j.mu.RLock() defer j.mu.RUnlock() @@ -414,6 +453,9 @@ func (j *jobHandler) luaAllJobs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.TableValue(jobTbl)), nil } +// #interface jobs +// disown(id) +// Disowns a job. This deletes it from the job table. func (j *jobHandler) luaDisownJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -431,6 +473,9 @@ func (j *jobHandler) luaDisownJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface jobs +// last() -> Job +// Returns the last added job from the table. func (j *jobHandler) luaLastJob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { j.mu.RLock() defer j.mu.RUnlock() diff --git a/nature/commands/doc.lua b/nature/commands/doc.lua index a290cd8..bc16dfe 100644 --- a/nature/commands/doc.lua +++ b/nature/commands/doc.lua @@ -4,34 +4,34 @@ local lunacolors = require 'lunacolors' commander.register('doc', function(args) local moddocPath = hilbish.dataDir .. '/docs/' - local modDocFormat = [[ -%s -%s -# Functions + local apidocHeader = [[ +# %s +{grayBg} {white}{italic}%s {reset} + ]] if #args > 0 then local mod = args[1] - local f = io.open(moddocPath .. mod .. '.txt', 'rb') + local f = io.open(moddocPath .. mod .. '.md', 'rb') local funcdocs = nil if not f then -- assume subdir - -- dataDir/docs//.txt + -- dataDir/docs//.md moddocPath = moddocPath .. mod .. '/' local subdocName = args[2] if not subdocName then subdocName = 'index' end - f = io.open(moddocPath .. subdocName .. '.txt', 'rb') + f = io.open(moddocPath .. subdocName .. '.md', 'rb') if not f then print('No documentation found for ' .. mod .. '.') return end funcdocs = f:read '*a' - local moddocs = table.filter(fs.readdir(moddocPath), function(f) return f ~= 'index.txt' end) + local moddocs = table.filter(fs.readdir(moddocPath), function(f) return f ~= 'index.md' end) local subdocs = table.map(moddocs, function(fname) - return lunacolors.underline(lunacolors.blue(string.gsub(fname, '.txt', ''))) + return lunacolors.underline(lunacolors.blue(string.gsub(fname, '.md', ''))) end) if subdocName == 'index' then funcdocs = funcdocs .. '\nSubdocs: ' .. table.concat(subdocs, ', ') @@ -41,8 +41,24 @@ commander.register('doc', function(args) if not funcdocs then funcdocs = f:read '*a' end - local desc = '' - local ok = pcall(require, mod) + local valsStr = funcdocs:match '%-%-%-\n([^%-%-%-]+)\n' + local vals = {} + if valsStr then + local _, endpos = funcdocs:find('---\n' .. valsStr .. '\n---\n\n', 1, true) + funcdocs = funcdocs:sub(endpos + 1, #funcdocs) + + -- parse vals + local lines = string.split(valsStr, '\n') + for _, line in ipairs(lines) do + local key = line:match '(%w+): ' + local val = line:match '^%w+: (.-)$' + + vals[key] = val + end + end + if mod == 'api' then + funcdocs = string.format(apidocHeader, vals.name, vals.description) .. funcdocs + end local backtickOccurence = 0 local formattedFuncs = lunacolors.format(funcdocs:sub(1, #funcdocs - 1):gsub('`', function() backtickOccurence = backtickOccurence + 1 @@ -51,34 +67,16 @@ commander.register('doc', function(args) else return '{underline}{green}' end + end):gsub('#+.-\n', function(t) + return '{bold}{magenta}' .. t .. '{reset}' end)) - - if ok then - local props = {} - local propstr = '' - local modDesc = '' - local modmt = getmetatable(require(mod)) - if modmt then - modDesc = modmt.__doc - if modmt.__docProp then - -- not all modules have docs for properties - props = table.map(modmt.__docProp, function(v, k) - return lunacolors.underline(lunacolors.blue(k)) .. ' > ' .. v - end) - end - if #props > 0 then - propstr = '\n# Properties\n' .. table.concat(props, '\n') .. '\n' - end - desc = string.format(modDocFormat, modDesc, propstr) - end - end - print(desc .. formattedFuncs) + print(formattedFuncs) f:close() return end local modules = table.map(fs.readdir(moddocPath), function(f) - return lunacolors.underline(lunacolors.blue(string.gsub(f, '.txt', ''))) + return lunacolors.underline(lunacolors.blue(string.gsub(f, '.md', ''))) end) io.write [[ diff --git a/nature/runner.lua b/nature/runner.lua index e155f63..9b62ad1 100644 --- a/nature/runner.lua +++ b/nature/runner.lua @@ -1,3 +1,4 @@ +--- hilbish.runner local currentRunner = 'hybrid' local runners = {} diff --git a/os.go b/os.go new file mode 100644 index 0000000..a214ea9 --- /dev/null +++ b/os.go @@ -0,0 +1,27 @@ +package main + +import ( + "hilbish/util" + + rt "github.com/arnodel/golua/runtime" + "github.com/blackfireio/osinfo" +) + +// #interface os +// OS Info +// The `os` interface provides simple text information properties about +// the current OS on the systen. This mainly includes the name and +// version. +// #field family Family name of the current OS +// #field name Pretty name of the current OS +// #field version Version of the current OS +func hshosLoader(rtm *rt.Runtime) *rt.Table { + info, _ := osinfo.GetOSInfo() + mod := rt.NewTable() + + util.SetField(rtm, mod, "family", rt.StringValue(info.Family), "Family name of the current OS") + util.SetField(rtm, mod, "name", rt.StringValue(info.Name), "Pretty name of the current OS") + util.SetField(rtm, mod, "version", rt.StringValue(info.Version), "Version of the current OS") + + return mod +} diff --git a/rl.go b/rl.go index f6cb6cd..6356f64 100644 --- a/rl.go +++ b/rl.go @@ -225,7 +225,11 @@ func (lr *lineReader) Resize() { return } -// lua module +// #interface history +// command history +// The history interface deals with command history. +// This includes the ability to override functions to change the main +// method of saving history. func (lr *lineReader) Loader(rtm *rt.Runtime) *rt.Table { lrLua := map[string]util.LuaExport{ "add": {lr.luaAddHistory, 1, false}, @@ -241,6 +245,10 @@ func (lr *lineReader) Loader(rtm *rt.Runtime) *rt.Table { return mod } +// #interface history +// add(cmd) +// Adds a command to the history. +// --- @param cmd string func (lr *lineReader) luaAddHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -254,10 +262,18 @@ func (lr *lineReader) luaAddHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) return c.Next(), nil } +// #interface history +// size() +// Returns the amount of commands in the history. +// --- @returns number func (lr *lineReader) luaSize(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.IntValue(int64(lr.fileHist.Len()))), nil } +// #interface history +// get(idx) +// Retrieves a command from the history based on the `idx`. +// --- @param idx number func (lr *lineReader) luaGetHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -284,6 +300,9 @@ func (lr *lineReader) luaAllHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) return c.PushingNext1(t.Runtime, rt.TableValue(tbl)), nil } +// #interface history +// clear() +// Deletes all commands from the history. func (lr *lineReader) luaClearHistory(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { lr.fileHist.clear() return c.Next(), nil diff --git a/runnermode.go b/runnermode.go index c26ed03..e212604 100644 --- a/runnermode.go +++ b/runnermode.go @@ -6,6 +6,13 @@ import ( rt "github.com/arnodel/golua/runtime" ) +// #interface runner +// interactive command runner customization +// The runner interface contains functions that allow the user to change +// how Hilbish interprets interactive input. +// Users can add and change the default runner for interactive input to any +// language or script of their choosing. A good example is using it to +// write command in Fennel. func runnerModeLoader(rtm *rt.Runtime) *rt.Table { exports := map[string]util.LuaExport{ "sh": {shRunner, 1, false}, @@ -19,6 +26,18 @@ func runnerModeLoader(rtm *rt.Runtime) *rt.Table { return mod } +// #interface runner +// setMode(cb) +// This is the same as the `hilbish.runnerMode` function. It takes a callback, +// which will be used to execute all interactive input. +// In normal cases, neither callbacks should be overrided by the user, +// as the higher level functions listed below this will handle it. +func _runnerMode() {} + +// #interface runner +// sh(cmd) +// Runs a command in Hilbish's shell script interpreter. +// This is the equivalent of using `source`. func shRunner(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -42,6 +61,10 @@ func shRunner(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext(t.Runtime, rt.TableValue(runnerRet)), nil } +// #interface runner +// lua(cmd) +// Evaluates `cmd` as Lua input. This is the same as using `dofile` +// or `load`, but is appropriated for the runner interface. func luaRunner(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err diff --git a/timer.go b/timer.go index 74d13c4..be8f270 100644 --- a/timer.go +++ b/timer.go @@ -21,7 +21,7 @@ type timer struct{ running bool dur time.Duration fun *rt.Closure - th *timerHandler + th *timersModule ticker *time.Ticker ud *rt.UserData channel chan struct{} @@ -73,6 +73,10 @@ func (t *timer) stop() error { return nil } +// #interface timers +// #member +// start() +// Starts a timer. func timerStart(thr *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err @@ -91,6 +95,10 @@ func timerStart(thr *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +// #interface timers +// #member +// stop() +// Stops a timer. func timerStop(thr *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err diff --git a/timerhandler.go b/timerhandler.go index 64caff8..92947e1 100644 --- a/timerhandler.go +++ b/timerhandler.go @@ -10,10 +10,10 @@ import ( rt "github.com/arnodel/golua/runtime" ) -var timers *timerHandler +var timers *timersModule var timerMetaKey = rt.StringValue("hshtimer") -type timerHandler struct { +type timersModule struct { mu *sync.RWMutex wg *sync.WaitGroup timers map[int]*timer @@ -21,8 +21,8 @@ type timerHandler struct { running int } -func newTimerHandler() *timerHandler { - return &timerHandler{ +func newTimersModule() *timersModule { + return &timersModule{ timers: make(map[int]*timer), latestID: 0, mu: &sync.RWMutex{}, @@ -30,11 +30,11 @@ func newTimerHandler() *timerHandler { } } -func (th *timerHandler) wait() { +func (th *timersModule) wait() { th.wg.Wait() } -func (th *timerHandler) create(typ timerType, dur time.Duration, fun *rt.Closure) *timer { +func (th *timersModule) create(typ timerType, dur time.Duration, fun *rt.Closure) *timer { th.mu.Lock() defer th.mu.Unlock() @@ -54,14 +54,18 @@ func (th *timerHandler) create(typ timerType, dur time.Duration, fun *rt.Closure return t } -func (th *timerHandler) get(id int) *timer { +func (th *timersModule) get(id int) *timer { th.mu.RLock() defer th.mu.RUnlock() return th.timers[id] } -func (th *timerHandler) luaCreate(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +// #interface timers +// create(type, time, callback) +// Creates a timer that runs based on the specified `time` in milliseconds. +// The `type` can either be interval (value of 0) or timeout (value of 1). +func (th *timersModule) luaCreate(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.CheckNArgs(3); err != nil { return nil, err } @@ -83,7 +87,10 @@ func (th *timerHandler) luaCreate(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.UserDataValue(tmr.ud)), nil } -func (th *timerHandler) luaGet(thr *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +// #interface timers +// get(id) +// Retrieves a timer via its ID. +func (th *timersModule) luaGet(thr *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -100,7 +107,15 @@ func (th *timerHandler) luaGet(thr *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } -func (th *timerHandler) loader(rtm *rt.Runtime) *rt.Table { +// #interface timers +// #property type What type of timer it is +// #property running If the timer is running +// #property duration The duration in milliseconds that the timer will run +// timeout and interval API +// The timers interface si one to easily set timeouts and intervals +// to run functions after a certain time or repeatedly without using +// odd tricks. +func (th *timersModule) loader(rtm *rt.Runtime) *rt.Table { timerMethods := rt.NewTable() timerFuncs := map[string]util.LuaExport{ "start": {timerStart, 1, false}, diff --git a/userdir.go b/userdir.go new file mode 100644 index 0000000..b3581e2 --- /dev/null +++ b/userdir.go @@ -0,0 +1,23 @@ +package main + +import ( + "hilbish/util" + + rt "github.com/arnodel/golua/runtime" +) + +// #interface userDir +// user-related directories +// This interface just contains properties to know about certain user directories. +// It is equivalent to XDG on Linux and gets the user's preferred directories +// for configs and data. +// #field config The user's config directory +// #field data The user's directory for program data +func userDirLoader(rtm *rt.Runtime) *rt.Table { + mod := rt.NewTable() + + util.SetField(rtm, mod, "config", rt.StringValue(confDir), "User's config directory") + util.SetField(rtm, mod, "data", rt.StringValue(userDataDir), "XDG data directory") + + return mod +} diff --git a/website/content/docs/api b/website/content/docs/api new file mode 120000 index 0000000..1c5c360 --- /dev/null +++ b/website/content/docs/api @@ -0,0 +1 @@ +../../../docs/api/ \ No newline at end of file From fc82d4f5ebb168d245311a94d84d998b82735a1b Mon Sep 17 00:00:00 2001 From: sammyette Date: Mon, 19 Dec 2022 00:03:13 -0400 Subject: [PATCH 054/119] website: add doc navigation to navbar for collapsing --- website/themes/hsh/layouts/_default/doc.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/themes/hsh/layouts/_default/doc.html b/website/themes/hsh/layouts/_default/doc.html index bebbf5e..8fc5958 100644 --- a/website/themes/hsh/layouts/_default/doc.html +++ b/website/themes/hsh/layouts/_default/doc.html @@ -2,7 +2,7 @@
-