Compare commits

..

18 Commits

Author SHA1 Message Date
sammyette edcc1b39f0
docs: add todo to lua.go 2021-06-09 20:43:01 -04:00
sammyette 646cb93dec
feat: support comptime sample conf declaration 2021-06-09 20:33:30 -04:00
sammyette 13dc0cd857
feat: support comptime config dir declaration 2021-06-09 20:30:53 -04:00
sammyette 792ce996d3
fix: return 0 exit code when cd with noarg instead of throwing hook explicitly 2021-06-09 20:30:12 -04:00
sammyette 95dee1f4dd
fix: check aliases before going to sh interp 2021-06-09 19:16:08 -04:00
sammyette 14064eceda
chore: cleanup and remove extra spaces 2021-06-09 18:41:37 -04:00
sammyette ce5ac86a4c
docs: make build for stable release more clear 2021-06-09 18:19:52 -04:00
sammyette fa1cdbefa2
docs: move aur install step up 2021-06-09 18:18:23 -04:00
sammyette a9b39834b3
docs: make build steps clearer 2021-06-09 18:16:04 -04:00
sammyette 6cbebcbae9
docs: fix arch install step for readline 2021-06-09 18:13:43 -04:00
sammyette 42c22aac96
docs: add newline between readline dep and fedora install step 2021-06-09 18:12:45 -04:00
sammyette 084f049ba5
style: add spaces between multiply op 2021-06-09 18:10:34 -04:00
Daniel de Sá ea67ae228c
docs: add readline install for arch (#60) 2021-06-09 14:38:04 -04:00
sammyette e37abcb08b
feat: define preload file in var
same as before, enables changing at compile time
2021-06-08 21:00:31 -04:00
sammyette be5ebd6ada
feat: add back cancel input on ctrl c 2021-06-08 21:00:01 -04:00
sammyette 86dbb97cae
feat: define lua require paths in var
this makes it able to be changed compile time, which should help
in support for systems that dont follow fhs (damn nix)
and windows as well, but that'll be first class
2021-06-08 19:16:37 -04:00
sammyette 2a084fc03e
fix: make minimal config work with new version 2021-06-08 17:40:52 -04:00
sammyette ef45bafb54
fix: remove extra newline in error message 2021-06-08 17:24:54 -04:00
8 changed files with 103 additions and 55 deletions

View File

@ -41,11 +41,21 @@ Then click on the artifacts drop down, and download artifact for your platform,
like what is highlighted in the screenshot.
<br><img src="https://modeus.is-inside.me/KJ0Puceb.png"><br>
### AUR
Arch Linux users can install Hilbish from the AUR.
```sh
yay -S hilbish
```
If you want the latest and greatest, you can install and compile from the latest git commit
```sh
yay -S hilbish-git
```
### Manual Build
#### Prerequisites
- [Go 1.16](https://go.dev)
- GNU Readline
On Fedora, readline can be installed with:
```
sudo dnf install readline-devel
@ -61,6 +71,11 @@ On OpenSUSE, it can be installed with:
sudo zypper install readline-devel
```
On Arch Linux, it can be installed with:
```
sudo pacman -S readline
```
#### Build
First, clone Hilbish:
```sh
@ -74,23 +89,16 @@ And get dependencies and build:
```sh
go get -d all
make dev
# If you want to use latest stable release,
make build
# or want to use Hilbiline,
make hilbiline
```
If you `git checkout`'d the latest stable release, run
`make build` instead of `make dev`.
or want to experiment Hilbiline, instead run
`make hilbiline`
#### Install
`sudo make install`
Alternatively, if you use Arch Linux, you can compile Hilbish with an **(unofficial)** AUR package:
```sh
yay -S hilbish
```
If you want the latest and greatest, you can install and compile from latest git commit:
```sh
yay -S hilbish-git
```
### Uninstall
```sh
sudo make uninstall

18
lua.go
View File

@ -16,8 +16,8 @@ import (
)
var minimalconf = `
ansikit = require 'ansikit'
prompt(ansikit.format(
lunacolors = require 'lunacolors'
prompt(lunacolors.format(
'{blue}%u {cyan}%d {green}{reset} '
))
`
@ -42,6 +42,7 @@ func LuaInit() {
cmds := commander.New()
// When a command from Lua is added, register it for use
// TODO: maybe dont add command code to a lua table? insstead use a map
cmds.Events.On("commandRegister",
func(cmdName string, cmd *lua.LFunction) {
commands[cmdName] = true
@ -58,18 +59,11 @@ func LuaInit() {
l.PreloadModule("bait", hooks.Loader)
// Add more paths that Lua can require from
l.DoString(`package.path = package.path
.. ';./libs/?/init.lua;./?/init.lua;./?/?.lua'
.. ';/usr/share/hilbish/libs/?/init.lua;'
.. ';/usr/share/hilbish/libs/?/?.lua;'
.. os.getenv 'HOME' .. '/.local/share/hilbish/libs/?/init.lua;'
.. os.getenv 'HOME' .. '/.local/share/hilbish/libs/?/?.lua;'
.. os.getenv 'HOME' .. '/.local/share/hilbish/libs/?.lua'
`)
l.DoString("package.path = package.path .. " + requirePaths)
err := l.DoFile("preload.lua")
if err != nil {
err = l.DoFile("/usr/share/hilbish/preload.lua")
err = l.DoFile(preloadPath)
if err != nil {
fmt.Fprintln(os.Stderr,
"Missing preload file, builtins may be missing.")
@ -83,7 +77,7 @@ func RunConfig(confpath string) {
err := l.DoFile(confpath)
if err != nil {
fmt.Fprintln(os.Stderr, err,
"\nAn error has occured while loading your config! Falling back to minimal default config.\n")
"\nAn error has occured while loading your config! Falling back to minimal default config.")
l.DoString(minimalconf)
}

34
main.go
View File

@ -18,37 +18,36 @@ import (
"golang.org/x/term"
)
var (
version = "v0.4.0"
l *lua.LState
lr *LineReader
prompt string // User's prompt, this will get set when lua side is initialized
multilinePrompt = "> "
commands = map[string]bool{}
aliases = map[string]string{}
homedir string
curuser *user.User
running bool // Is a command currently running
hooks bait.Bait
interactive bool
login bool // Are we the login shell?
noexecute bool // Should we run Lua or only report syntax errors
defaultConfPath string
)
func main() {
homedir, _ = os.UserHomeDir()
curuser, _ = user.Current()
defaultconfpath := homedir + "/.hilbishrc.lua"
if defaultConfDir == "" {
// we'll add *our* default if its empty (wont be if its changed comptime)
defaultConfPath = filepath.Join(homedir, "/.hilbishrc.lua")
} else {
// else do ~ substitution
defaultConfPath = filepath.Join(strings.Replace(defaultConfDir, "~", homedir, 1), ".hilbishrc.lua")
}
verflag := getopt.BoolLong("version", 'v', "Prints Hilbish version")
setshflag := getopt.BoolLong("setshellenv", 'S', "Sets $SHELL to Hilbish's executed path")
cmdflag := getopt.StringLong("command", 'c', "", "Executes a command on startup")
configflag := getopt.StringLong("config", 'C', defaultconfpath, "Sets the path to Hilbish's config")
configflag := getopt.StringLong("config", 'C', defaultConfPath, "Sets the path to Hilbish's config")
getopt.BoolLong("login", 'l', "Makes Hilbish act like a login shell")
getopt.BoolLong("interactive", 'i', "Force Hilbish to be an interactive shell")
getopt.BoolLong("noexec", 'n', "Don't execute and only report Lua syntax errors")
@ -90,21 +89,21 @@ func main() {
}
// If user's config doesn't exixt,
if _, err := os.Stat(defaultconfpath); os.IsNotExist(err) {
if _, err := os.Stat(defaultConfPath); os.IsNotExist(err) {
// Read default from current directory
// (this is assuming the current dir is Hilbish's git)
input, err := os.ReadFile(".hilbishrc.lua")
if err != nil {
// If it wasnt found, go to "real default"
input, err = os.ReadFile("/usr/share/hilbish/.hilbishrc.lua")
// If it wasnt found, go to the real sample conf
input, err = os.ReadFile(sampleConfPath)
if err != nil {
fmt.Println("could not find .hilbishrc.lua or /usr/share/hilbish/.hilbishrc.lua")
fmt.Println("could not find .hilbishrc.lua or", sampleConfPath)
return
}
}
// Create it using either default config we found
err = os.WriteFile(homedir + "/.hilbishrc.lua", input, 0644)
err = os.WriteFile(defaultConfPath, input, 0644)
if err != nil {
// If that fails, bail
fmt.Println("Error creating config file")
@ -227,8 +226,7 @@ func HandleSignals() {
for range c {
if !running {
//readline.ReplaceLine("", 0)
//readline.RefreshLine()
lr.ClearInput()
}
}
}

View File

@ -35,7 +35,8 @@ commander.register('cd', function (args)
return
end
fs.cd(os.getenv 'HOME')
bait.throw('command.exit', 0)
return
end)
commander.register('exit', function()
@ -44,19 +45,19 @@ end)
do
local virt_G = { }
setmetatable(_G, {
__index = function (self, key)
__index = function (_, key)
local got_virt = virt_G[key]
if got_virt ~= nil then
return got_virt
end
virt_G[key] = os.getenv(key)
return virt_G[key]
end,
__newindex = function (self, key, value)
__newindex = function (_, key, value)
if type(value) == 'string' then
os.setenv(key, value)
virt_G[key] = value
@ -68,7 +69,7 @@ do
end
end,
})
bait.catch('command.exit', function ()
for key, value in pairs(virt_G) do
if type(value) == 'string' then
@ -82,15 +83,15 @@ end
function string.split(str, delimiter)
local result = {}
local from = 1
local delim_from, delim_to = string.find(str, delimiter, from)
while delim_from do
table.insert(result, string.sub(str, from, delim_from - 1))
from = delim_to + 1
delim_from, delim_to = string.find(str, delimiter, from)
end
table.insert(result, string.sub(str, from))
return result

5
rl.go
View File

@ -34,3 +34,8 @@ func (lr *LineReader) AddHistory(cmd string) {
readline.SaveHistory(homedir + "/.hilbish-history")
}
func (lr *LineReader) ClearInput() {
readline.ReplaceLine("", 0)
readline.RefreshLine()
}

View File

@ -32,3 +32,7 @@ func (lr *LineReader) AddHistory(cmd string) {
return
}
func (lr *LineReader) ClearInput() {
return
}

View File

@ -18,6 +18,17 @@ import (
func RunInput(input string) {
cmdArgs, cmdString := splitInput(input)
// If alias was found, use command alias
for aliases[cmdArgs[0]] != "" {
alias := aliases[cmdArgs[0]]
cmdString = alias + strings.TrimPrefix(cmdString, cmdArgs[0])
cmdArgs, cmdString = splitInput(cmdString)
if aliases[cmdArgs[0]] != "" {
continue
}
}
// First try to load input, essentially compiling to bytecode
fn, err := l.LoadString(cmdString)
if err != nil && noexecute {
@ -149,7 +160,7 @@ func execCommand(cmd string) error {
return interp.NewExitStatus(127)
}
return interp.DefaultExecHandler(2*time.Second)(ctx, args)
return interp.DefaultExecHandler(2 * time.Second)(ctx, args)
}
runner, _ := interp.New(
interp.StdIO(os.Stdin, os.Stdout, os.Stderr),

27
vars.go 100644
View File

@ -0,0 +1,27 @@
package main
// String vars that are free to be changed at compile time
var (
version = "v0.4.0"
requirePaths = `';./libs/?/init.lua;./?/init.lua;./?/?.lua'
.. ';/usr/share/hilbish/libs/?/init.lua;'
.. ';/usr/share/hilbish/libs/?/?.lua;'
.. os.getenv 'HOME' .. '/.local/share/hilbish/libs/?/init.lua;'
.. os.getenv 'HOME' .. '/.local/share/hilbish/libs/?/?.lua;'
.. os.getenv 'HOME' .. '/.local/share/hilbish/libs/?.lua'`
preloadPath = "/usr/share/hilbish/preload.lua"
defaultConfDir = "" // ~ will be substituted for home, path for user's default config
sampleConfPath = "/usr/share/hilbish/.hilbishrc.lua" // Path to default/sample config
prompt string // Prompt will always get changed anyway
multilinePrompt = "> "
)
// Flags
var (
running bool // Is a command currently running
interactive bool
login bool // Are we the login shell?
noexecute bool // Should we run Lua or only report syntax errors
)