From 214bcecf7b656b14b49354ee1effb11cb79770b0 Mon Sep 17 00:00:00 2001 From: Leonmmcoset Date: Sun, 31 Aug 2025 19:05:26 +0800 Subject: [PATCH] =?UTF-8?q?refactor(programs/list):=20=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除详细显示模式(-l参数)和文件类型颜色区分 将文件和目录分开显示,使用更简洁的表格输出 修改错误信息格式,移除多余的双引号 --- data/computercraft/lua/rom/programs/list.lua | 142 +++---------------- 1 file changed, 17 insertions(+), 125 deletions(-) diff --git a/data/computercraft/lua/rom/programs/list.lua b/data/computercraft/lua/rom/programs/list.lua index c769ff6..4e03ce9 100644 --- a/data/computercraft/lua/rom/programs/list.lua +++ b/data/computercraft/lua/rom/programs/list.lua @@ -7,148 +7,40 @@ local shell = require("shell") local colors = require("colors") local settings = require("settings") 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 -end - --- 如果没有参数了,默认为当前目录 -if #args == 0 then args[1] = shell.dir() end - --- 获取文件大小的格式化函数 -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 - 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) + error(dir .. ": that directory does not exist", 0) elseif not fs.isDir(dir) then - error("\"" .. dir .. "\" is not a directory", 0) + error(dir .. ": not a directory", 0) end local raw_files = fs.list(dir) - local items = {} + local files, dirs = {}, {} - -- 收集文件信息 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) - 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) + local full = fs.combine(dir, raw_files[i]) - -- 显示标题 - 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 + if raw_files[i]:sub(1,1) ~= "." or show_hidden then + if fs.isDir(full) then + dirs[#dirs+1] = raw_files[i] + + else + files[#files+1] = raw_files[i] + end 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) + + textutils.pagedTabulate(colors.green, dirs, colors.white, files) end for i=1, #args, 1 do - list_dir(args[i]) - if i < #args then - print() -- 不同目录之间添加空行 + if #args > 1 then + textutils.coloredPrint(colors.yellow, args[i]..":\n", colors.white) end -end + list_dir(args[i]) +end \ No newline at end of file