Compare commits

..

11 Commits

Author SHA1 Message Date
sammyette 2cf979401b
feat: use dataDir in requirePaths 2021-10-17 23:14:18 -04:00
sammyette 87fcdd3c10
fix: remove / at the end of xdg data path 2021-10-17 23:13:53 -04:00
sammyette 9f523ba3c0
chore: fix merge conflict 2021-10-17 23:10:20 -04:00
sammyette e08e3b9b94
fix: require paths 2021-10-17 23:09:48 -04:00
sammyette 00f41a95bc
fix: use dataDir var in requirePaths 2021-10-17 23:00:38 -04:00
sammyette b1f4efd9ac
docs: remove links section 2021-10-17 22:43:58 -04:00
sammyette 212a52fd04
docs: fix link to nixos install info 2021-10-17 22:36:42 -04:00
legendofmiracles 0c7fadbaad
docs: add nix installation instructions (#78) 2021-10-17 22:34:43 -04:00
sammyette a8ecd44efb
docs: add changelog for 0.6.0 2021-10-17 19:43:28 -04:00
sammyette ce4ba48da0
feat: pass command string to command.exit, fix aliases with sh interp 2021-10-17 19:37:37 -04:00
sammyette 7a4cbbddff
fix(ansikit)!: return hyperlink ascii code instead of printing it 2021-10-17 19:19:43 -04:00
6 changed files with 75 additions and 24 deletions

View File

@ -2,6 +2,42 @@
This is the changelog for the Hilbish shell made in Go and Lua. This is the changelog for the Hilbish shell made in Go and Lua.
## [0.6.0] - 2021-10-17
## Added
- Hilbish will expand `~` in the preloadPath and samplePathConf variables. These are for compile time.
- On Windows, the hostname in `%u` has been removed.
- Made it easier to compile on Windows by adding Windows-tailored vars and paths.
- Add require paths `./libs/?/?.lua`
- Hilbish will now respect $XDG_CONFIG_HOME and will load its config and history there first and use Lua libraries in there and $XDG_DATA_HOME if they are set. (#71)
- If not, Hilbish will still default to `~`
- Added some new hooks
- `command.precmd` is thrown right before Hilbish prompts for input
- `command.preexec` is thrown right before Hilbish executes a command. It passes 2 arguments: the command as the user typed, and what Hilbish will actually execute (resolved alias)
- `hilbish.dataDir` is now available to know the directory of Hilbish data files (default config, docs, preload, etc)
- A `docgen` program has been added to `cmd/docgen` in the GitHub repository, As the name suggests, it will output docs in a `docs` folder for functions implemented in Go
- All hilbish modules/libraries now have a `__doc` metatable entry which is simply a short description of the module.
- `fs.readdir(dir)` has been added. It will return a table of files in `dir`
- Errors in the `fs.mkdir` function are now handled.
- **Breaking Change:** `fs.cd` no longer returns a numeric code to indicate error. Instead, it returns an error message.
- The `doc` command has been added to document functions of Hilbish libraries. Run the command for more details.
- `link(url, text)` has been added to `ansikit`. It returns a string which can be printed to produce a hyperlink in a terminal. Note that not all terminals support this feature.
- The [Succulent](https://github.com/Rosettea/Succulent) library has been added. This includes more utility functions and expansions to the Lua standard library itself.
- The command string is now passed to the `command.exit` hook
# Changed
- Hilbish won't print an extra newline at exit with ctrl + d
- `command.exit` with 0 exit code will now be thrown if input is nothing
- **Breaking Change:** `fs.stat` has been made better. It returns a proper table instead of userdata, and has fields instead of functions
- It includes `name`, `mode` as a octal representation in a string, `isDir`, and `size`
# Fixed
- `timeout()` is now blocking
- Directories with spaces in them can now be `cd`'d to
- An alias with the same name as the command will now not cause a freeze (#73)
- Userdata is no longer returned in the following cases:
- Commander arguments
- `fs` functions
## [0.5.1] - 2021-06-16 ## [0.5.1] - 2021-06-16
## Added ## Added
@ -203,6 +239,7 @@ This input for example will prompt for more input to complete:
First "stable" release of Hilbish. First "stable" release of Hilbish.
[0.6.0]: https://github.com/Rosettea/Hilbish/compare/v0.5.1...v0.6.0
[0.5.1]: https://github.com/Rosettea/Hilbish/compare/v0.5.0...v0.5.1 [0.5.1]: https://github.com/Rosettea/Hilbish/compare/v0.5.0...v0.5.1
[0.5.0]: https://github.com/Rosettea/Hilbish/compare/v0.4.0...v0.5.0 [0.5.0]: https://github.com/Rosettea/Hilbish/compare/v0.4.0...v0.5.0
[0.4.0]: https://github.com/Rosettea/Hilbish/compare/v0.3.2...v0.4.0 [0.4.0]: https://github.com/Rosettea/Hilbish/compare/v0.3.2...v0.4.0

View File

@ -26,11 +26,6 @@ to make your life in a terminal easier.
<img src="gallery/pillprompt.png"> <img src="gallery/pillprompt.png">
</div> </div>
# Links
- **[Documentation](https://github.com/Hilbis/Hilbish/wiki)**
- **[Gallery](https://github.com/Hilbis/Hilbish/discussions/36)** - See
more screenshots of Hilbish in action
# Installation # Installation
**NOTE:** Hilbish is currently only officially supported and tested on Linux **NOTE:** Hilbish is currently only officially supported and tested on Linux
@ -58,6 +53,11 @@ Or from the latest `master` commit with:
yay -S hilbish-git yay -S hilbish-git
``` ```
### Nixpkgs
Nix/NixOS users can install Hilbish from the central repository, nixpkgs, through the usual ways.
If you're new to nix you should probably read up on how to do that [here](https://nixos.wiki/wiki/Cheatsheet).
### Manual Build ### Manual Build
#### Prerequisites #### Prerequisites
- [Go 1.16+](https://go.dev) - [Go 1.16+](https://go.dev)

View File

@ -39,7 +39,7 @@ func HilbishLoader(L *lua.LState) int {
xdg := L.NewTable() xdg := L.NewTable()
L.SetField(xdg, "config", lua.LString(confDir)) L.SetField(xdg, "config", lua.LString(confDir))
L.SetField(xdg, "data", lua.LString(getenv("XDG_DATA_HOME", homedir + "/.local/share/"))) L.SetField(xdg, "data", lua.LString(getenv("XDG_DATA_HOME", homedir + "/.local/share")))
L.SetField(mod, "xdg", xdg) L.SetField(mod, "xdg", xdg)
util.Document(L, mod, "A miscellaneous sort of \"core\" API for things that relate to the shell itself and others.") util.Document(L, mod, "A miscellaneous sort of \"core\" API for things that relate to the shell itself and others.")

View File

@ -80,7 +80,7 @@ end
ansikit.link = function(url, text) ansikit.link = function(url, text)
if not url then error 'ansikit: missing url for hyperlink' end if not url then error 'ansikit: missing url for hyperlink' end
local text = (text and text or 'link') local text = (text and text or 'link')
io.write(lunacolors.blue('\27]8;;' .. url .. '\27\\' .. text .. '\27]8;;\27\\\n')) return lunacolors.blue('\27]8;;' .. url .. '\27\\' .. text .. '\27]8;;\27\\\n')
end end
ansikit.print = function(text) ansikit.print = function(text)

View File

@ -10,7 +10,6 @@ import (
// "github.com/bobappleyard/readline" // "github.com/bobappleyard/readline"
"github.com/yuin/gopher-lua" "github.com/yuin/gopher-lua"
// "github.com/yuin/gopher-lua/parse" // "github.com/yuin/gopher-lua/parse"
"layeh.com/gopher-luar"
"mvdan.cc/sh/v3/interp" "mvdan.cc/sh/v3/interp"
"mvdan.cc/sh/v3/syntax" "mvdan.cc/sh/v3/syntax"
) )
@ -51,7 +50,7 @@ func RunInput(input string) {
err = l.PCall(0, lua.MultRet, nil) err = l.PCall(0, lua.MultRet, nil)
} }
if err == nil { if err == nil {
hooks.Em.Emit("command.exit", 0) cmdFinish(0, cmdString)
return return
} }
if commands[cmdArgs[0]] != nil { if commands[cmdArgs[0]] != nil {
@ -68,7 +67,7 @@ func RunInput(input string) {
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, fmt.Fprintln(os.Stderr,
"Error in command:\n\n" + err.Error()) "Error in command:\n\n" + err.Error())
hooks.Em.Emit("command.exit", 1) cmdFinish(1, cmdString)
return return
} }
luaexitcode := l.Get(-1) luaexitcode := l.Get(-1)
@ -80,7 +79,7 @@ func RunInput(input string) {
exitcode = uint8(code) exitcode = uint8(code)
} }
hooks.Em.Emit("command.exit", exitcode) cmdFinish(exitcode, cmdString)
return return
} }
@ -98,22 +97,22 @@ func RunInput(input string) {
if syntax.IsIncomplete(err) || strings.HasSuffix(input, "\\") { if syntax.IsIncomplete(err) || strings.HasSuffix(input, "\\") {
continue continue
} else if code, ok := interp.IsExitStatus(err); ok { } else if code, ok := interp.IsExitStatus(err); ok {
hooks.Em.Emit("command.exit", code) cmdFinish(code, cmdString)
} else if err != nil { } else if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
hooks.Em.Emit("command.exit", 1) cmdFinish(1, cmdString)
} }
break break
} }
} else { } else {
if code, ok := interp.IsExitStatus(err); ok { if code, ok := interp.IsExitStatus(err); ok {
hooks.Em.Emit("command.exit", code) cmdFinish(code, cmdString)
} else { } else {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
} }
} }
} else { } else {
hooks.Em.Emit("command.exit", 0) cmdFinish(0, cmdString)
} }
} }
@ -129,20 +128,32 @@ func execCommand(cmd string) error {
_, argstring := splitInput(strings.Join(args, " ")) _, argstring := splitInput(strings.Join(args, " "))
// If alias was found, use command alias // If alias was found, use command alias
if aliases[args[0]] != "" { for aliases[args[0]] != "" {
alias := aliases[args[0]] alias := aliases[args[0]]
argstring = alias + strings.TrimPrefix(argstring, args[0]) argstring = alias + strings.TrimPrefix(argstring, args[0])
cmdArgs, _ := splitInput(argstring) cmdArgs, _ := splitInput(argstring)
args = cmdArgs args = cmdArgs
if aliases[args[0]] == alias {
break
}
if aliases[args[0]] != "" {
continue
}
} }
// If command is defined in Lua then run it // If command is defined in Lua then run it
luacmdArgs := l.NewTable()
for _, str := range args[1:] {
luacmdArgs.Append(lua.LString(str))
}
if commands[args[0]] != nil { if commands[args[0]] != nil {
err := l.CallByParam(lua.P{ err := l.CallByParam(lua.P{
Fn: commands[args[0]], Fn: commands[args[0]],
NRet: 1, NRet: 1,
Protect: true, Protect: true,
}, luar.New(l, args[1:])) }, luacmdArgs)
luaexitcode := l.Get(-1) luaexitcode := l.Get(-1)
var exitcode uint8 = 0 var exitcode uint8 = 0
@ -156,7 +167,7 @@ func execCommand(cmd string) error {
fmt.Fprintln(os.Stderr, fmt.Fprintln(os.Stderr,
"Error in command:\n\n" + err.Error()) "Error in command:\n\n" + err.Error())
} }
hooks.Em.Emit("command.exit", exitcode) cmdFinish(exitcode, argstring)
return interp.NewExitStatus(exitcode) return interp.NewExitStatus(exitcode)
} }
@ -229,3 +240,6 @@ func splitInput(input string) ([]string, string) {
return cmdArgs, cmdstr.String() return cmdArgs, cmdstr.String()
} }
func cmdFinish(code uint8, cmdstr string) {
hooks.Em.Emit("command.exit", code, cmdstr)
}

View File

@ -4,15 +4,15 @@ package main
// String vars that are free to be changed at compile time // String vars that are free to be changed at compile time
var ( var (
requirePaths = commonRequirePaths + ` requirePaths = commonRequirePaths + `.. ';'
.. ';/usr/share/hilbish/libs/?/init.lua;' .. hilbish.dataDir .. '/libs/?/init.lua;'
.. ';/usr/share/hilbish/libs/?/?.lua;'` + linuxUserPaths .. hilbish.dataDir .. '/libs/?/?.lua;'` + linuxUserPaths
linuxUserPaths = ` linuxUserPaths = `
.. hilbish.xdg.data .. '/hilbish/libs/?/init.lua;' .. hilbish.xdg.data .. '/hilbish/libs/?/init.lua;'
.. hilbish.xdg.data .. '/hilbish/libs/?/?.lua;' .. hilbish.xdg.data .. '/hilbish/libs/?/?.lua;'
.. hilbish.xdg.data .. '/hilbish/libs/?.lua' .. hilbish.xdg.data .. '/hilbish/libs/?.lua;'
.. hilbish.xdg.config .. '/hilbish/?/init.lua' .. hilbish.xdg.config .. '/hilbish/?/init.lua;'
.. hilbish.xdg.config .. '/hilbish/?/?.lua' .. hilbish.xdg.config .. '/hilbish/?/?.lua;'
.. hilbish.xdg.config .. '/hilbish/?.lua'` .. hilbish.xdg.config .. '/hilbish/?.lua'`
dataDir = "/usr/share/hilbish" dataDir = "/usr/share/hilbish"
preloadPath = dataDir + "/preload.lua" preloadPath = dataDir + "/preload.lua"