From 95165d491d8c5db9fe0c25723c0aebe266e4e71f Mon Sep 17 00:00:00 2001 From: Leonmmcoset Date: Sun, 31 Aug 2025 19:51:45 +0800 Subject: [PATCH] =?UTF-8?q?refactor(rom):=20=E9=87=8D=E5=86=99list.lua?= =?UTF-8?q?=E4=B8=BArc.shell=E5=B9=B6=E6=B7=BB=E5=8A=A0shell=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原有的list.lua程序完全重构为rc.shell,实现以下改进: 1. 添加shell初始化流程,包括运行startup脚本 2. 实现命令别名和自动补全功能 3. 添加交互式shell循环和历史记录功能 --- data/computercraft/lua/rom/programs/list.lua | 195 ++++++------------- 1 file changed, 60 insertions(+), 135 deletions(-) diff --git a/data/computercraft/lua/rom/programs/list.lua b/data/computercraft/lua/rom/programs/list.lua index c769ff6..f11430a 100644 --- a/data/computercraft/lua/rom/programs/list.lua +++ b/data/computercraft/lua/rom/programs/list.lua @@ -1,154 +1,79 @@ --- list - -local args = {...} +-- rc.shell +local rc = require("rc") local fs = require("fs") +local term = require("term") local shell = require("shell") local colors = require("colors") -local settings = require("settings") +local thread = require("rc.thread") local textutils = require("textutils") -local term = require("term") -if #args == 0 then args[1] = shell.dir() end - -local show_hidden = settings.get("list.show_hidden") -local show_details = false - --- 检查是否有显示详细信息的参数 -for i=1, #args, 1 do - if args[i] == "-l" then - show_details = true - table.remove(args, i) - break - end +if os.version then + textutils.coloredPrint(colors.yellow, os.version(), colors.white) +else + textutils.coloredPrint(colors.yellow, rc.version(), colors.white) end --- 如果没有参数了,默认为当前目录 -if #args == 0 then args[1] = shell.dir() end +thread.vars().parentShell = thread.id() +shell.init(_ENV) --- 获取文件大小的格式化函数 -local function format_size(size) - if size < 1024 then - return size .. " B" - elseif size < 1024 * 1024 then - return string.format("%.1f KB", size / 1024) - else - return string.format("%.1f MB", size / (1024 * 1024)) - end -end - --- 获取文件类型和对应的颜色 -local function get_file_info(filename, full_path) - local is_dir = fs.isDir(full_path) - local color, indicator - - if is_dir then - color = colors.green - indicator = "/" - else - -- 根据文件扩展名设置不同颜色 - local ext = filename:match("%.(%w+)$") or "" - ext = ext:lower() - - if ext == "lua" then - color = colors.cyan - elseif ext == "txt" or ext == "md" or ext == "hlp" then - color = colors.white - elseif ext == "png" or ext == "jpg" or ext == "gif" then - color = colors.magenta - else - color = colors.lightGray +if not shell.__has_run_startup then + shell.__has_run_startup = true + if fs.exists("/startup.lua") then + local ok, err = pcall(dofile, "/startup.lua") + if not ok and err then + io.stderr:write(err, "\n") end - indicator = "" - end - - return color, indicator -end - -local function list_dir(dir) - if not fs.exists(dir) then - error("\"" .. dir .. "\" that directory does not exist", 0) - elseif not fs.isDir(dir) then - error("\"" .. dir .. "\" is not a directory", 0) end - local raw_files = fs.list(dir) - local items = {} + if fs.exists("/startup") and fs.isDir("/startup") then + local files = fs.list("/startup/") + table.sort(files) - -- 收集文件信息 - for i=1, #raw_files, 1 do - local name = raw_files[i] - local full = fs.combine(dir, name) - - if name:sub(1,1) ~= "." or show_hidden then - local color, indicator = get_file_info(name, full) - local size = "" - - if show_details and not fs.isDir(full) then - local size_bytes = fs.getSize(full) - size = format_size(size_bytes) + for f=1, #files, 1 do + local ok, err = pcall(dofile, "/startup/"..files[f]) + if not ok and err then + io.stderr:write(err, "\n") end - - table.insert(items, { - name = name, - color = color, - indicator = indicator, - size = size, - is_dir = fs.isDir(full) - }) end end - - -- 先排序目录,再排序文件 - table.sort(items, function(a, b) - if a.is_dir and not b.is_dir then return true end - if not a.is_dir and b.is_dir then return false end - return a.name < b.name - end) +end - -- 显示标题 - local w = term.getSize() - local title = dir - textutils.coloredPrint(colors.yellow, string.rep("=", w), colors.white) - textutils.coloredPrint(colors.yellow, title, colors.white) - textutils.coloredPrint(colors.yellow, string.rep("=", w), colors.white) - - -- 显示文件列表 - local display_items = {} - local max_name_len = 0 - - -- 计算最长文件名长度 - for _, item in ipairs(items) do - local display_name = item.name .. item.indicator - max_name_len = math.max(max_name_len, #display_name) - end - - -- 创建格式化的显示项 - for _, item in ipairs(items) do - local display_name = item.name .. item.indicator - if show_details then - local padding = string.rep(" ", max_name_len - #display_name + 2) - display_name = display_name .. padding .. item.size +local aliases = { + background = "bg", + clr = "clear", + cp = "copy", + dir = "list", + foreground = "fg", + mv = "move", + rm = "delete", + rs = "redstone", + sh = "shell", + ps = "threads" +} + +for k, v in pairs(aliases) do + shell.setAlias(k, v) +end + +local completions = "/rc/completions" +for _, prog in ipairs(fs.list(completions)) do + dofile(fs.combine(completions, prog)) +end + +local history = {} +while true do + term.setTextColor(colors.yellow) + term.setBackgroundColor(colors.black) + rc.write(colors.yellow.."$"..shell.dir()..colors.green.." >>> ") + term.setTextColor(colors.white) + + local text = term.read(nil, history, shell.complete) + if #text > 0 then + history[#history+1] = text + local ok, err = shell.run(text) + if not ok and err then + io.stderr:write(err, "\n") end - table.insert(display_items, {item.color, display_name, colors.white}) end - - -- 使用分页表格显示 - textutils.pagedTabulate(unpack(display_items)) - - -- 显示统计信息 - textutils.coloredPrint(colors.yellow, "\nTotal: " .. #items .. " items", colors.white) - - -- 显示提示 - if not show_details then - textutils.coloredPrint(colors.lightGray, "Type 'list -l' for detailed information", colors.white) - end - textutils.coloredPrint(colors.yellow, string.rep("=", w), colors.white) -end - -for i=1, #args, 1 do - list_dir(args[i]) - if i < #args then - print() -- 不同目录之间添加空行 - end -end +end \ No newline at end of file