2
2
зеркало из https://github.com/Hilbis/Hilbish synced 2025-07-18 16:52:02 +00:00

Сравнить коммиты

..

Нет общих коммитов. «3460df6863f9fff236744cad998f0692497c63c7» и «ef4975f984b739062eb6354adf66c5424f0534dd» имеют совершенно разные истории.

6 изменённых файлов: 50 добавлений и 152 удалений

Просмотреть файл

@ -3,19 +3,23 @@ ansikit = require 'ansikit'
bait = require 'bait' bait = require 'bait'
function doPrompt(fail) function doPrompt(fail)
prompt(ansikit.format( prompt(ansikit.text(
'{blue}%u {cyan}%d ' .. (fail and '{red}' or '{green}') .. '∆{reset} ' '{blue}%u {cyan}%d ' .. (fail and '{red}' or '{green}') .. '∆{reset} '
)) ))
end end
print(ansikit.format('Welcome {cyan}'.. os.getenv 'USER' .. print(ansikit.text('Welcome {cyan}'.. os.getenv 'USER' ..
'{reset} to {magenta}Hilbish{reset},\n' .. '{reset} to {magenta}Hilbish{reset},\n' ..
'the nice lil shell for {blue}Lua{reset} fanatics!\n')) 'the nice lil shell for {blue}Lua{reset} fanatics!\n'))
doPrompt() doPrompt()
bait.catch('command.exit', function(code) bait.catch('command.fail', function()
doPrompt(code ~= 0) doPrompt(true)
end)
bait.catch('command.success', function()
doPrompt()
end) end)
--hook("tab complete", function ()) --hook("tab complete", function ())

Просмотреть файл

@ -4,78 +4,13 @@
local ansikit = {} local ansikit = {}
ansikit.clear = function(scrollback) ansikit.getCSI = function (code, endc)
typ = (scrollback and 3 or 2)
return ansikit.printCSI(typ, 'J')
end
ansikit.clearFromPos = function(scrollback)
return ansikit.printCSI(0, 'J')
end
ansikit.clearLine = function()
return ansikit.printCSI(2, 'K')
end
ansikit.clearToPos = function()
return ansikit.printCSI(1, 'J')
end
ansikit.color256 = function(color)
color = (color and color or 0)
return ansikit.printCSI('38;5;' .. color)
end
ansikit.cursorDown = function(y)
y = (y and y or 1)
return ansikit.printCSI(y, 'B')
end
ansikit.cursorLeft = function(x)
x = (x and x or 1)
return ansikit.printCSI(x, 'D')
end
-- TODO: cursorPos
-- https://github.com/Luvella/AnsiKit/blob/master/lib/index.js#L90
ansikit.cursorRight = function(x)
x = (x and x or 1)
return ansikit.printCSI(x, 'C')
end
ansikit.cursorStyle = function(style)
style = (style and style or ansikit.underlineCursor)
if style > 6 or style < 1 then style = ansikit.underlineCursor end
return ansikit.printCSI(style, ' q')
end
ansikit.cursorTo = function(x, y)
x, y = (x and x or 1), (y and y or 1)
return ansikit.printCSI(x .. ';' .. y, 'H')
end
ansikit.cursorUp = function(y)
y = (y and y or 1)
return ansikit.printCSI(y, 'A')
end
ansikit.getCode = function(code, terminate)
endc = (endc and endc or 'm')
return string.char(0x001b) .. code ..
(terminate and string.char(0x001b) .. '\\' or '')
end
ansikit.getCSI = function(code, endc)
endc = (endc and endc or 'm') endc = (endc and endc or 'm')
return string.char(0x001b) .. '[' .. code .. endc return string.char(0x001b) .. '[' .. code .. endc
end end
ansikit.format = function(text) ansikit.text = function (text)
local colors = { local colors = {
-- TODO: write codes manually instead of using functions
-- less function calls = faster ????????
reset = {'{reset}', ansikit.getCSI(0)}, reset = {'{reset}', ansikit.getCSI(0)},
bold = {'{bold}', ansikit.getCSI(1)}, bold = {'{bold}', ansikit.getCSI(1)},
dim = {'{dim}', ansikit.getCSI(2)}, dim = {'{dim}', ansikit.getCSI(2)},
@ -90,22 +25,8 @@ ansikit.format = function(text)
yellow = {'{yellow}', ansikit.getCSI(33)}, yellow = {'{yellow}', ansikit.getCSI(33)},
blue = {'{blue}', ansikit.getCSI(34)}, blue = {'{blue}', ansikit.getCSI(34)},
magenta = {'{magenta}', ansikit.getCSI(35)}, magenta = {'{magenta}', ansikit.getCSI(35)},
cyan = {'{cyan}', ansikit.getCSI(36)}, cyan = {'{cyan}', ansikit.getCSI(36)}
white = {'{white}', ansikit.getCSI(37)}, -- TODO: Background, bright colors
red_bg = {'{red-bg}', ansikit.getCSI(41)},
green_bg = {'{green-bg}', ansikit.getCSI(42)},
yellow_bg = {'{green-bg}', ansikit.getCSI(43)},
blue_bg = {'{blue-bg}', ansikit.getCSI(44)},
magenta_bg = {'{magenta-bg}', ansikit.getCSI(45)},
cyan_bg = {'{cyan-bg}', ansikit.getCSI(46)},
white_bg = {'{white-bg}', ansikit.getCSI(47)},
gray = {'{gray}', ansikit.getCSI(90)},
bright_red = {'{bright-red}', ansikit.getCSI(91)},
bright_green = {'{bright-green}', ansikit.getCSI(92)},
bright_yellow = {'{bright-yellow}', ansikit.getCSI(93)},
bright_blue = {'{bright-blue}', ansikit.getCSI(94)},
bright_magenta = {'{bright-magenta}', ansikit.getCSI(95)},
bright_cyan = {'{bright-cyan}', ansikit.getCSI(96)}
} }
for k, v in pairs(colors) do for k, v in pairs(colors) do
@ -115,25 +36,5 @@ ansikit.format = function(text)
return text return text
end end
ansikit.print = function(text)
io.write(ansikit.format(text))
return ansikit
end
ansikit.printCode = function(code, terminate)
io.write(ansikit.getCode(code, terminate))
return ansikit
end
ansikit.printCSI = function(code, endc)
io.write(ansikit.getCSI(code, endc))
return ansikit
end
ansikit.println = function(text)
print(ansikit.print(text))
return ansikit
end
return ansikit return ansikit

11
lua.go
Просмотреть файл

@ -12,7 +12,7 @@ import (
var minimalconf = ` var minimalconf = `
ansikit = require 'ansikit' ansikit = require 'ansikit'
prompt(ansikit.format( prompt(ansikit.text(
'{blue}%u {cyan}%d {green}{reset} ' '{blue}%u {cyan}%d {green}{reset} '
)) ))
` `
@ -25,7 +25,6 @@ func LuaInit() {
l.SetGlobal("_ver", lua.LString(version)) l.SetGlobal("_ver", lua.LString(version))
l.SetGlobal("prompt", l.NewFunction(hshprompt)) l.SetGlobal("prompt", l.NewFunction(hshprompt))
l.SetGlobal("multiprompt", l.NewFunction(hshmlprompt))
l.SetGlobal("alias", l.NewFunction(hshalias)) l.SetGlobal("alias", l.NewFunction(hshalias))
// Add fs module to Lua // Add fs module to Lua
@ -65,7 +64,7 @@ func LuaInit() {
err = l.DoFile(homedir + "/.hilbishrc.lua") err = l.DoFile(homedir + "/.hilbishrc.lua")
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err, fmt.Fprintln(os.Stderr, err,
"\nAn error has occured while loading your config! Falling back to minimal default config.\n") "An error has occured while loading your config! Falling back to minimal default config.\n")
l.DoString(minimalconf) l.DoString(minimalconf)
} }
@ -77,12 +76,6 @@ func hshprompt(L *lua.LState) int {
return 0 return 0
} }
func hshmlprompt(L *lua.LState) int {
multilinePrompt = L.ToString(1)
return 0
}
func hshalias(L *lua.LState) int { func hshalias(L *lua.LState) int {
alias := L.ToString(1) alias := L.ToString(1)
source := L.ToString(2) source := L.ToString(2)

Просмотреть файл

@ -17,12 +17,10 @@ import (
) )
const version = "0.3.0" const version = "0.3.0-dev"
var l *lua.LState var l *lua.LState
// User's prompt, this will get set when lua side is initialized // User's prompt, this will get set when lua side is initialized
var prompt string var prompt string
var multilinePrompt = "> "
// Map of builtin/custom commands defined in the commander lua module // Map of builtin/custom commands defined in the commander lua module
var commands = map[string]bool{} var commands = map[string]bool{}
// Command aliases // Command aliases
@ -115,7 +113,7 @@ func main() {
} }
func ContinuePrompt(prev string) (string, error) { func ContinuePrompt(prev string) (string, error) {
fmt.Print(multilinePrompt) fmt.Printf("> ")
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)

Просмотреть файл

@ -18,16 +18,12 @@ commander.register('cd', function (args)
if err == 1 then if err == 1 then
print('directory does not exist') print('directory does not exist')
end end
bait.throw('command.exit', err) bait.throw('command.fail', nil)
else bait.throw('command.exit', 0) end else bait.throw('command.success', nil) end
return return
end end
fs.cd(os.getenv 'HOME') fs.cd(os.getenv 'HOME')
bait.throw('command.exit', 0) bait.throw('command.success', nil)
end)
commander.register('exit', function()
os.exit(0)
end) end)
do do

Просмотреть файл

@ -47,41 +47,47 @@ func RunInput(input string) {
Protect: true, Protect: true,
}, luar.New(l, cmdArgs[1:])) }, luar.New(l, cmdArgs[1:]))
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, // TODO: dont panic
"Error in command:\n\n" + err.Error()) panic(err)
} }
if cmdArgs[0] != "exit" { HandleHistory(cmdString) } HandleHistory(cmdString)
return return
} }
// Last option: use sh interpreter // Last option: use sh interpreter
err = execCommand(cmdString) switch cmdArgs[0] {
if err != nil { case "exit":
// If input is incomplete, start multiline prompting os.Exit(0)
if syntax.IsIncomplete(err) { default:
for { err := execCommand(cmdString)
cmdString, err = ContinuePrompt(strings.TrimSuffix(cmdString, "\\")) if err != nil {
if err != nil { break } // If input is incomplete, start multiline prompting
err = execCommand(cmdString) if syntax.IsIncomplete(err) {
for {
cmdString, err = ContinuePrompt(strings.TrimSuffix(cmdString, "\\"))
if err != nil { break }
err = execCommand(cmdString)
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 {
bait.Em.Emit("command.exit", code) bait.Em.Emit("command.exit", code)
} else if err != nil { } else if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
bait.Em.Emit("command.exit", 1) bait.Em.Emit("command.exit", 1)
}
break
} }
break } else {
if code, ok := interp.IsExitStatus(err); ok {
bait.Em.Emit("command.exit", code)
} else { fmt.Fprintln(os.Stderr, err) }
} }
} else { } else {
if code, ok := interp.IsExitStatus(err); ok { bait.Em.Emit("command.exit", 0)
bait.Em.Emit("command.exit", code)
} else { fmt.Fprintln(os.Stderr, err) }
} }
} else { HandleHistory(cmdString)
bait.Em.Emit("command.exit", 0)
} }
HandleHistory(cmdString)
} }
// Run command in sh interpreter // Run command in sh interpreter
@ -162,7 +168,7 @@ func StartMultiline(prev string, sb *strings.Builder) bool {
// save input from previous prompts // save input from previous prompts
if sb.String() == "" { sb.WriteString(prev + "\n") } if sb.String() == "" { sb.WriteString(prev + "\n") }
fmt.Print(multilinePrompt) fmt.Printf("sh> ")
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)