diff --git a/halyde/apps/lua.lua b/halyde/apps/lua.lua index d503be3..5c85c30 100644 --- a/halyde/apps/lua.lua +++ b/halyde/apps/lua.lua @@ -1,8 +1,9 @@ print("\27[44m".._VERSION.."\27[0m shell") print('Type "exit" to exit.') +termlib.readHistory["lua"] = {""} while true do print("\27[44mlua>\27[0m ", false) - local command = read() + local command = read("lua") if command == "exit" then return else diff --git a/halyde/core/boot.lua b/halyde/core/boot.lua index b0cb264..50f2b63 100644 --- a/halyde/core/boot.lua +++ b/halyde/core/boot.lua @@ -1,7 +1,7 @@ local loadfile = ... local filesystem = loadfile("/halyde/lib/filesystem.lua")(loadfile) -_G._OSVERSION = "Halyde 0.8.1" +_G._OSVERSION = "Halyde 0.8.2" function _G.import(module, ...) local args = table.pack(...) diff --git a/halyde/core/shell.lua b/halyde/core/shell.lua index 12f0271..3928005 100644 --- a/halyde/core/shell.lua +++ b/halyde/core/shell.lua @@ -90,6 +90,6 @@ while true do print(shellcfg["prompt"]:format(shell.workingDirectory),false) -- termlib.cursorPosX = #(shell.workingDirectory .. " > ") -- termlib.cursorPosY = termlib.cursorPosY - 1 - local shellCommand = read() + local shellCommand = read("shell") shell.run(shellCommand) end diff --git a/halyde/core/termlib.lua b/halyde/core/termlib.lua index 1e90427..9dea799 100644 --- a/halyde/core/termlib.lua +++ b/halyde/core/termlib.lua @@ -5,6 +5,7 @@ local gpu = component.proxy(component.list("gpu")()) -- replace with component.g _G.termlib = {} termlib.cursorPosX = 1 termlib.cursorPosY = 1 +termlib.readHistory = {} local width, height = gpu.getResolution() termlib.width = width @@ -165,25 +166,72 @@ function _G.clear() termlib.cursorPosX, termlib.cursorPosY = 1, 1 end -function _G.read() +function _G.read(readHistoryType) + checkArg(1, readHistoryType, "string", "nil") local curtext = "" + local RHIndex + if readHistoryType then + if not termlib.readHistory[readHistoryType] then + termlib.readHistory[readHistoryType] = {curtext} + elseif termlib.readHistory[readHistoryType][#termlib.readHistory[readHistoryType]] ~= "" then + table.insert(termlib.readHistory[readHistoryType], curtext) + end + RHIndex = #termlib.readHistory[readHistoryType] -- read history index + end local cursorPosX, cursorPosY = termlib.cursorPosX, termlib.cursorPosY local cursorWhite = true while true do + if cursorWhite then + print("\27[107m ", false) + else + print(" ", false) + end + termlib.cursorPosX = termlib.cursorPosX - 1 local args = {event.pull("key_down", 0.5)} if args[4] then + cursorWhite = true local keycode = args[4] local key = keyboard.keys[keycode] + if key == "up" and readHistoryType then + termlib.cursorPosX, termlib.cursorPosY = cursorPosX, cursorPosY + print(curtext .. " ", false) + RHIndex = RHIndex - 1 + if RHIndex <= 0 then + RHIndex = 1 + end + termlib.cursorPosX, termlib.cursorPosY = cursorPosX, cursorPosY + print(termlib.readHistory[readHistoryType][RHIndex] .. string.rep(" ", unicode.wlen(curtext) - unicode.wlen(termlib.readHistory[readHistoryType][RHIndex])), false) + curtext = termlib.readHistory[readHistoryType][RHIndex] + end + if key == "down" and readHistoryType then + termlib.cursorPosX, termlib.cursorPosY = cursorPosX, cursorPosY + print(curtext .. " ", false) + RHIndex = RHIndex + 1 + if RHIndex > #termlib.readHistory[readHistoryType] then + RHIndex = #termlib.readHistory[readHistoryType] + end + termlib.cursorPosX, termlib.cursorPosY = cursorPosX, cursorPosY + print(termlib.readHistory[readHistoryType][RHIndex] .. string.rep(" ", unicode.wlen(curtext) - unicode.wlen(termlib.readHistory[readHistoryType][RHIndex])), false) + curtext = termlib.readHistory[readHistoryType][RHIndex] + end if args[3] >= 32 and args[3] <= 126 then curtext = curtext .. (unicode.char(args[3]) or "") + if readHistoryType then + termlib.readHistory[readHistoryType][RHIndex] = curtext + end else if key == "back" then curtext = curtext:sub(1, #curtext-1) termlib.cursorPosX, termlib.cursorPosY = cursorPosX, cursorPosY - print(curtext.." ", false) + print(curtext.." ", false) elseif key == "enter" then termlib.cursorPosX, termlib.cursorPosY = cursorPosX, cursorPosY - print(curtext) + print(curtext .. " ") + if readHistoryType then + while #termlib.readHistory[readHistoryType] > 50 do + table.remove(termlib.readHistory[readHistoryType], 1) + end + end return curtext end end