local tArgs = {...} if type(tArgs[1]) == "string" and fs.exists(tArgs[1]) then lOS.execute(table.concat(tArgs," ")) return end if LevelOS then LevelOS.self.window.icon = {"\3","b"} end local lex = "LevelOS/modules/lex.lua" local docs = "Program_Files/Slime_Text/highlight/lua/docs.json" local docstable if not fs.exists(lex) then -- oh no end if not fs.exists(docs) then local webres = http.get("http://tweaked.cc/index.json") if webres then docstable = textutils.unserializeJSON(webres.readAll()) end --[[if webres then lUtils.fwrite(docs,webres.readAll()) end]] end if fs.exists(docs) then docstable = textutils.unserializeJSON(lUtils.fread(docs)) end local pretty = require "cc.pretty" local tCommandHistory = {} local hCur = 0 local bRunning = true local tEnv = { ["exit"] = setmetatable({}, { __tostring = function() return "Call exit() to exit." end, __call = function() bRunning = false end, __type = "function", }), ["_echo"] = function(...) return ... end, } setmetatable(tEnv, { __index = _ENV }) term.setTextColor(colors.yellow) print("LevelOS interactive Lua prompt.\nCall exit() to exit.") term.setTextColor(colors.white) while bRunning do hCur = #tCommandHistory+1 write("lua> ") local w,h = term.getSize() local x,y = term.getCursorPos() local self = lUtils.input(x,y,w,y) self.opt.cursorColor = colors.white self.opt.overflowY = "scroll" self.scrollY = 0 self.opt.syntax = { type="lua", keyword=colors.yellow, comment=colors.green, string=colors.red, number=colors.purple, symbol=colors.white, operator=colors.lightGray, value=colors.purple, ident=colors.white, ["function"]=colors.cyan, nfunction=colors.lime, arg=colors.orange, lexer=lex, whitespace=colors.lightGray, } self.opt.complete = { docs = docstable, env = tEnv, overlay = true, LevelOS = LevelOS, } self.opt.selectColor=colors.gray self.opt.overflowY="stretch" self.opt.overflowX="scroll" _G.debugeditor = self while true do tCommandHistory[hCur] = self.txt self.state = true local doUpdate = true local e = {os.pullEvent()} if e[1] == "term_resize" then local w,h = term.getSize() self.x2 = w elseif e[1] == "key" and (e[2] == keys.up or e[2] == keys.down) and not self.opt.complete.list then doUpdate = false local o = 1 if e[2] == keys.up then o = -1 end if tCommandHistory[hCur+o] then hCur = hCur+o self.txt = tCommandHistory[hCur] self.cursor.x = #self.txt+1 self.cursor.a = #self.txt+1 end self.update("term_resize") elseif e[1] == "key" and e[2] == keys.enter and not lUtils.isHolding(keys.leftShift) then if hCur < #tCommandHistory then hCur = #tCommandHistory tCommandHistory[hCur] = self.txt end doUpdate = false term.setCursorBlink(false) LevelOS.overlay = nil print("") local s = self.txt local nForcePrint = 0 local func, e = load(s, "=lua", "t", tEnv) local func2 = load("return _echo(" .. s .. ");", "=lua", "t", tEnv) if not func then if func2 then func = func2 e = nil nForcePrint = 1 end else if func2 then func = func2 end end if func then local tResults = table.pack(pcall(func)) if tResults[1] then local n = 1 while n < tResults.n or n <= nForcePrint do local value = tResults[n + 1] local ok, serialised = pcall(pretty.pretty, value, { function_args = settings.get("lua.function_args"), function_source = settings.get("lua.function_source"), }) if ok then pretty.print(serialised) else print(tostring(value)) end n = n + 1 end else printError(tResults[2]) end else printError(e) end break elseif e[1] == "key" or e[1] == "char" or e[1] == "paste" then if hCur < #tCommandHistory then hCur = #tCommandHistory tCommandHistory[hCur] = self.txt end end if doUpdate then self.update(unpack(e)) end local w,h = term.getSize() while self.y2 > h do if self.y1 > 1 then term.scroll(1) self.y2 = self.y2-1 self.y1 = self.y1-1 else self.y1 = 1 self.y2 = h self.opt.overflowY = "scroll" end end self.render() end end