mirror of https://github.com/Hilbis/Hilbish
Compare commits
7 Commits
6bb2a2f8c8
...
8f94990fc3
Author | SHA1 | Date |
---|---|---|
sammy | 8f94990fc3 | |
sammy | 1bacbfc778 | |
sammy | 8d5e36bcde | |
sammy | 941902f43b | |
sammy | cdd9dc1544 | |
sammy | e6382d454d | |
Jim Tittsler | 70a9e471eb |
|
@ -60,11 +60,11 @@ sudo make install
|
||||||
sudo make all
|
sudo make all
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternativly, if you use Arch Linux, you can compile Hilbish with an **(unofficial)** AUR package
|
Alternatively, if you use Arch Linux, you can compile Hilbish with an **(unofficial)** AUR package:
|
||||||
```sh
|
```sh
|
||||||
yay -S hilbish
|
yay -S hilbish
|
||||||
```
|
```
|
||||||
If you want the latest and greatest, you can install and compile from latest git commit
|
If you want the latest and greatest, you can install and compile from latest git commit:
|
||||||
```sh
|
```sh
|
||||||
yay -S hilbish-git
|
yay -S hilbish-git
|
||||||
```
|
```
|
||||||
|
|
19
lua.go
19
lua.go
|
@ -3,7 +3,9 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"hilbish/golibs/bait"
|
"hilbish/golibs/bait"
|
||||||
"hilbish/golibs/commander"
|
"hilbish/golibs/commander"
|
||||||
|
@ -31,6 +33,7 @@ func LuaInit() {
|
||||||
l.SetGlobal("multiprompt", l.NewFunction(hshmlprompt))
|
l.SetGlobal("multiprompt", l.NewFunction(hshmlprompt))
|
||||||
l.SetGlobal("alias", l.NewFunction(hshalias))
|
l.SetGlobal("alias", l.NewFunction(hshalias))
|
||||||
l.SetGlobal("appendPath", l.NewFunction(hshappendPath))
|
l.SetGlobal("appendPath", l.NewFunction(hshappendPath))
|
||||||
|
l.SetGlobal("exec", l.NewFunction(hshexec))
|
||||||
|
|
||||||
// Add fs module to Lua
|
// Add fs module to Lua
|
||||||
l.PreloadModule("fs", fs.Loader)
|
l.PreloadModule("fs", fs.Loader)
|
||||||
|
@ -127,3 +130,19 @@ func hshappendPath(L *lua.LState) int {
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hshexec(L *lua.LState) int {
|
||||||
|
cmd := L.CheckString(1)
|
||||||
|
cmdArgs, _ := splitInput(cmd)
|
||||||
|
cmdPath, err := exec.LookPath(cmdArgs[0])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
// if we get here, cmdPath will be nothing
|
||||||
|
// therefore nothing will run
|
||||||
|
}
|
||||||
|
|
||||||
|
// syscall.Exec requires an absolute path to a binary
|
||||||
|
// path, args, string slice of environments
|
||||||
|
syscall.Exec(cmdPath, cmdArgs, os.Environ())
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
25
main.go
25
main.go
|
@ -35,6 +35,7 @@ var (
|
||||||
hooks bait.Bait
|
hooks bait.Bait
|
||||||
interactive bool
|
interactive bool
|
||||||
login bool // Are we the login shell?
|
login bool // Are we the login shell?
|
||||||
|
noexecute bool // Should we run Lua or only report syntax errors
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -47,14 +48,14 @@ func main() {
|
||||||
setshflag := getopt.BoolLong("setshellenv", 'S', "Sets $SHELL to Hilbish's executed path")
|
setshflag := getopt.BoolLong("setshellenv", 'S', "Sets $SHELL to Hilbish's executed path")
|
||||||
cmdflag := getopt.StringLong("command", 'c', "", /*TODO: Help description*/ "")
|
cmdflag := getopt.StringLong("command", 'c', "", /*TODO: Help description*/ "")
|
||||||
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")
|
||||||
// loginshflag
|
getopt.BoolLong("login", 'l', "Makes Hilbish act like a login shell")
|
||||||
// TODO: issue #37
|
getopt.BoolLong("interactive", 'i', "Force Hilbish to be an interactive shell")
|
||||||
_ = getopt.BoolLong("login", 'l', "Makes Hilbish act like a login shell")
|
getopt.BoolLong("noexec", 'n', "Don't execute and only report Lua syntax errors")
|
||||||
_ = getopt.BoolLong("interactive", 'i', "Force Hilbish to be an interactive shell")
|
|
||||||
|
|
||||||
getopt.Parse()
|
getopt.Parse()
|
||||||
loginshflag := getopt.Lookup('l').Seen()
|
loginshflag := getopt.Lookup('l').Seen()
|
||||||
interactiveflag := getopt.Lookup('i').Seen()
|
interactiveflag := getopt.Lookup('i').Seen()
|
||||||
|
noexecflag := getopt.Lookup('n').Seen()
|
||||||
|
|
||||||
if *cmdflag == "" || interactiveflag {
|
if *cmdflag == "" || interactiveflag {
|
||||||
interactive = true
|
interactive = true
|
||||||
|
@ -64,6 +65,10 @@ func main() {
|
||||||
interactive = false
|
interactive = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if noexecflag {
|
||||||
|
noexecute = true
|
||||||
|
}
|
||||||
|
|
||||||
// first arg, first character
|
// first arg, first character
|
||||||
if loginshflag || os.Args[0][0] == '-' {
|
if loginshflag || os.Args[0][0] == '-' {
|
||||||
login = true
|
login = true
|
||||||
|
@ -103,15 +108,12 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
go HandleSignals()
|
|
||||||
LuaInit()
|
LuaInit()
|
||||||
|
|
||||||
RunLogin()
|
RunLogin()
|
||||||
|
RunInput(*cmdflag)
|
||||||
RunConfig(*configflag)
|
RunConfig(*configflag)
|
||||||
|
|
||||||
readline.Completer = readline.FilenameCompleter
|
|
||||||
readline.LoadHistory(homedir + "/.hilbish-history")
|
|
||||||
|
|
||||||
RunInput(*cmdflag)
|
|
||||||
if getopt.NArgs() > 0 {
|
if getopt.NArgs() > 0 {
|
||||||
err := l.DoFile(getopt.Arg(0))
|
err := l.DoFile(getopt.Arg(0))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -121,6 +123,11 @@ func main() {
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readline.Completer = readline.FilenameCompleter
|
||||||
|
readline.LoadHistory(homedir + "/.hilbish-history")
|
||||||
|
|
||||||
|
go HandleSignals()
|
||||||
|
|
||||||
for interactive {
|
for interactive {
|
||||||
running = false
|
running = false
|
||||||
|
|
||||||
|
|
14
shell.go
14
shell.go
|
@ -16,9 +16,17 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func RunInput(input string) {
|
func RunInput(input string) {
|
||||||
// First try to run user input in Lua
|
// First try to load input, essentially compiling to bytecode
|
||||||
err := l.DoString(input)
|
fn, err := l.LoadString(input)
|
||||||
|
if err != nil && noexecute {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// And if there's no syntax errors and -n isnt provided, run
|
||||||
|
if !noexecute {
|
||||||
|
l.Push(fn)
|
||||||
|
err = l.PCall(0, lua.MultRet, nil)
|
||||||
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
// If it succeeds, add to history and prompt again
|
// If it succeeds, add to history and prompt again
|
||||||
HandleHistory(input)
|
HandleHistory(input)
|
||||||
|
|
Loading…
Reference in New Issue