From 7e07e1636fe74798bc0a7d5e6051867c6ecacc81 Mon Sep 17 00:00:00 2001 From: Leonmmcoset Date: Tue, 2 Sep 2025 22:22:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=92=8C=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E5=8F=8A=E7=9B=B8=E5=85=B3=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(project_rules): 修正文档中的中文支持说明 chore: 更新版本号至0.3.8 feat: 新增history命令用于查看和管理命令历史记录 feat: 新增config命令用于管理系统配置 feat: 新增find命令用于文件搜索 docs: 添加新命令建议文档 test: 添加history、config和find命令的测试脚本 --- .trae/rules/project_rules.md | 2 +- NEW_COMMANDS_SUGGESTIONS.md | 67 ++++++ data/computercraft/lua/bios.lua | 4 +- .../computercraft/lua/rom/programs/config.lua | 196 +++++++++++++++++ data/computercraft/lua/rom/programs/find.lua | 199 ++++++++++++++++++ .../lua/rom/programs/history.lua | 114 ++++++++++ .../lua/rom/programs/test_config.lua | 86 ++++++++ .../lua/rom/programs/test_find.lua | 158 ++++++++++++++ .../lua/rom/programs/test_history.lua | 72 +++++++ installer.lua | 2 +- 10 files changed, 896 insertions(+), 4 deletions(-) create mode 100644 NEW_COMMANDS_SUGGESTIONS.md create mode 100644 data/computercraft/lua/rom/programs/config.lua create mode 100644 data/computercraft/lua/rom/programs/find.lua create mode 100644 data/computercraft/lua/rom/programs/history.lua create mode 100644 data/computercraft/lua/rom/programs/test_config.lua create mode 100644 data/computercraft/lua/rom/programs/test_find.lua create mode 100644 data/computercraft/lua/rom/programs/test_history.lua diff --git a/.trae/rules/project_rules.md b/.trae/rules/project_rules.md index ebb4dd9..b8b7c78 100644 --- a/.trae/rules/project_rules.md +++ b/.trae/rules/project_rules.md @@ -1,3 +1,3 @@ 这个是我的世界模组CC电脑Tweaked版本的操作系统 所以要用CC Tweaked所支持的lua代码写 -所有东西都用英语写 \ No newline at end of file +所有程序都用英语写(CC Tweaked不支持中文) \ No newline at end of file diff --git a/NEW_COMMANDS_SUGGESTIONS.md b/NEW_COMMANDS_SUGGESTIONS.md new file mode 100644 index 0000000..09495ca --- /dev/null +++ b/NEW_COMMANDS_SUGGESTIONS.md @@ -0,0 +1,67 @@ +# New Command Suggestions for LeonOS + +Based on the existing command set in LeonOS, here are some useful new commands that could enhance the user experience: + +## 1. `man` +**Description**: Comprehensive manual pages for commands +**Purpose**: Provide detailed documentation beyond basic help +**Implementation Idea**: `man ` would display formatted documentation from a `man` directory structure + +```lua +-- Example implementation concept +toolcall = { + name = "write_to_file", + params = { + rewrite = false, + file_path = "/rom/programs/man.lua", + content = "-- man.lua: Manual page viewer\nlocal fs = require(\"fs\")\nlocal textutils = require(\"textutils\")\n\nlocal function show_manual(command)\n local man_path = fs.combine(\"/rom/man\", command .. \"/README.md\")\n if fs.exists(man_path) then\n local file = io.open(man_path, \"r\")\n local content = file:read(\"*a\")\n file:close()\n textutils.pagedPrint(content)\n else\n print(\"No manual page found for \" .. command)\n end\nend\n\n-- Main function implementation..." + } +} +``` + +## 2. `env` +**Description**: Display and manage environment variables +**Purpose**: Allow users to view and modify system environment variables +**Implementation Idea**: `env` to list variables, `env =` to set + +## 3. `history` +**Description**: Command history viewer +**Purpose**: View, search, and reuse previous commands +**Implementation Idea**: `history` to list, `history ` to recall, `history -c` to clear + +## 4. `grep` +**Description**: Search text in files +**Purpose**: Find specific text patterns in files +**Implementation Idea**: `grep ` with support for regex patterns + +## 5. `find` +**Description**: Search for files and directories +**Purpose**: Locate files by name or other criteria +**Implementation Idea**: `find -name ` with recursive searching + +## 6. `cmp` +**Description**: Compare two files +**Purpose**: Find differences between two files +**Implementation Idea**: `cmp ` showing line-by-line differences + +## 7. `date` +**Description**: Advanced date and time manipulation +**Purpose**: Display and calculate dates +**Implementation Idea**: `date [format]` with various formatting options and calculations + +## 8. `net` +**Description**: Network utilities +**Purpose**: Test and manage network connections +**Implementation Idea**: `net ping `, `net status`, etc. + +## 9. `sensors` +**Description**: Hardware sensor information +**Purpose**: Display data from connected sensors +**Implementation Idea**: `sensors` to list all sensors, `sensors ` for specific data + +## 10. `config` +**Description**: System configuration manager +**Purpose**: View and modify system settings +**Implementation Idea**: `config get `, `config set ` + +These commands would fill gaps in the current functionality and provide a more complete command-line experience for LeonOS users. \ No newline at end of file diff --git a/data/computercraft/lua/bios.lua b/data/computercraft/lua/bios.lua index d568155..9d02995 100644 --- a/data/computercraft/lua/bios.lua +++ b/data/computercraft/lua/bios.lua @@ -1,4 +1,4 @@ -_G._HOST = _G._HOST .. " (LeonOS 0.3.7)" +_G._HOST = _G._HOST .. " (LeonOS 0.3.8)" local fs = rawget(_G, "fs") _G._RC_ROM_DIR = _RC_ROM_DIR or (...) and fs.exists("/leonos") and "/leonos" or "/rom" @@ -32,7 +32,7 @@ local rc = { _VERSION = { major = 0, minor = 3, - patch = 7 + patch = 8 }, queueEvent = pull(os, "queueEvent"), startTimer = pull(os, "startTimer"), diff --git a/data/computercraft/lua/rom/programs/config.lua b/data/computercraft/lua/rom/programs/config.lua new file mode 100644 index 0000000..687ab9a --- /dev/null +++ b/data/computercraft/lua/rom/programs/config.lua @@ -0,0 +1,196 @@ +-- config: System configuration manager for LeonOS + +local term = require("term") +local colors = require("colors") +local settings = require("settings") +local textutils = require("textutils") +local shell = require("shell") + +-- 保存当前颜色设置 +local old_fg = term.getTextColor() +local old_bg = term.getBackgroundColor() + +-- 设置名称栏颜色并显示 +term.setTextColor(colors.white) +term.setBackgroundColor(colors.cyan) +term.at(1, 1).clearLine() +term.at(1, 1).write("=== LeonOS Configuration Manager ===") + +-- 恢复颜色设置 +term.setTextColor(old_fg) +term.setBackgroundColor(old_bg) +term.at(1, 2) + +-- 显示帮助信息 +local function show_help() + print("Usage: config [options] [setting] [value]") + print("") + print("Commands:") + print(" list List all available settings") + print(" get Get the value of a specific setting") + print(" set Set the value of a specific setting") + print(" default Reset a setting to its default value") + print(" save Save current settings to file") + print(" help Show this help message") + print("") + print("Options:") + print(" --details, -d Show detailed information when listing settings") + print("") + print("Examples:") + print(" config list # List all settings") + print(" config list --details # List all settings with details") + print(" config get list.show_hidden # Get the value of list.show_hidden") + print(" config set list.show_hidden true # Set list.show_hidden to true") + print(" config default list.show_hidden # Reset list.show_hidden to default") + print(" config save # Save current settings") +end + +-- 列出所有设置 +local function list_settings(detailed) + local setting_names = settings.getNames() + if #setting_names == 0 then + print("No settings defined.") + return + end + + print("Available settings:") + print("====================") + + for _, name in ipairs(setting_names) do + local details = settings.getDetails(name) + if details then + term.setTextColor(colors.yellow) + print(name) + term.setTextColor(colors.white) + + if detailed then + print(" Description: " .. (details.description or "No description")) + print(" Type: " .. (details.type or "unknown")) + print(" Default: " .. tostring(details.default)) + print(" Current: " .. tostring(details.value)) + else + print(" Current: " .. tostring(details.value) .. ", Default: " .. tostring(details.default)) + end + print("----------------") + end + end +end + +-- 获取设置值 +local function get_setting(name) + local details = settings.getDetails(name) + if not details then + io.stderr:write("Error: Setting '" .. name .. "' not found.\n") + return false + end + + print("Setting: " .. name) + print("Description: " .. (details.description or "No description")) + print("Type: " .. (details.type or "unknown")) + print("Default: " .. tostring(details.default)) + term.setTextColor(colors.yellow) + print("Current: " .. tostring(details.value)) + term.setTextColor(colors.white) + return true +end + +-- 设置新值 +local function set_setting(name, value) + local details = settings.getDetails(name) + if not details then + io.stderr:write("Error: Setting '" .. name .. "' not found.\n") + return false + end + + -- 转换值类型 + if details.type == "boolean" then + value = value:lower() + if value == "true" or value == "1" then + value = true + elseif value == "false" or value == "0" then + value = false + else + io.stderr:write("Error: Invalid boolean value. Use 'true' or 'false'.\n") + return false + end + elseif details.type == "number" then + local num = tonumber(value) + if not num then + io.stderr:write("Error: Invalid number value.\n") + return false + end + value = num + end + + -- 设置值 + settings.set(name, value) + print("Set '" .. name .. "' to '" .. tostring(value) .. "'") + print("Run 'config save' to save this change.") + return true +end + +-- 重置为默认值 +local function default_setting(name) + local details = settings.getDetails(name) + if not details then + io.stderr:write("Error: Setting '" .. name .. "' not found.\n") + return false + end + + settings.unset(name) + print("Reset '" .. name .. "' to default value: '" .. tostring(details.default) .. "'") + print("Run 'config save' to save this change.") + return true +end + +-- 保存设置 +local function save_settings() + if settings.save() then + print("Settings saved successfully.") + return true + else + io.stderr:write("Error: Failed to save settings.\n") + return false + end +end + +-- 主函数 +local function main(args) + if #args == 0 then + show_help() + return + end + + local command = args[1] + local detailed = false + + -- 检查是否有--details或-d选项 + for i, arg in ipairs(args) do + if arg == "--details" or arg == "-d" then + detailed = true + table.remove(args, i) + break + end + end + + if command == "list" then + list_settings(detailed) + elseif command == "get" and #args >= 2 then + get_setting(args[2]) + elseif command == "set" and #args >= 3 then + set_setting(args[2], args[3]) + elseif command == "default" and #args >= 2 then + default_setting(args[2]) + elseif command == "save" then + save_settings() + elseif command == "help" or command == "--help" or command == "-h" then + show_help() + else + io.stderr:write("Error: Unknown command '" .. command .. "'\n") + show_help() + end +end + +-- 解析命令行参数 +local args = {...} +main(args) \ No newline at end of file diff --git a/data/computercraft/lua/rom/programs/find.lua b/data/computercraft/lua/rom/programs/find.lua new file mode 100644 index 0000000..d504cbe --- /dev/null +++ b/data/computercraft/lua/rom/programs/find.lua @@ -0,0 +1,199 @@ +-- find: File and directory search utility + +local term = require("term") +local colors = require("colors") +local fs = require("fs") +local shell = require("shell") +local settings = require("settings") +local textutils = require("textutils") + +-- 保存当前颜色设置 +local old_fg = term.getTextColor() +local old_bg = term.getBackgroundColor() + +-- 设置名称栏颜色并显示 +term.setTextColor(colors.white) +term.setBackgroundColor(colors.cyan) +term.at(1, 1).clearLine() +term.at(1, 1).write("=== File and Directory Search ===") + +-- 恢复颜色设置 +term.setTextColor(old_fg) +term.setBackgroundColor(old_bg) +term.at(1, 2) + +-- 显示帮助信息 +local function show_help() + print("Usage: find [pattern] [options]") + print("") + print("Description:") + print(" Recursively search for files and directories.") + print("") + print("Arguments:") + print(" The directory to start searching from (default: current directory)") + print(" [pattern] Optional pattern to match files against (supports * and ? wildcards)") + print("") + print("Options:") + print(" --type Search only for files (f) or directories (d)") + print(" --name Search for files with this exact name") + print(" --hidden Include hidden files and directories") + print(" --case-insensitive, -i Perform case-insensitive search") + print(" --help, -h Show this help message") + print("") + print("Examples:") + print(" find . *.lua # Find all Lua files in current directory and subdirectories") + print(" find /rom --type d # Find all directories under /rom") + print(" find /app --name config.lua # Find file named config.lua under /app") + print(" find . --hidden # Find all files including hidden ones") +end + +-- 检查字符串是否匹配模式(支持*和?通配符) +local function matches_pattern(str, pattern, case_insensitive) + if case_insensitive then + str = str:lower() + pattern = pattern:lower() + end + + -- 转换通配符模式为Lua正则表达式 + pattern = pattern:gsub("%.", "%%.") + :gsub("%*\%\*", "%.%") + :gsub("%*", "[^"]*") + :gsub("%?", ".") + + return str:match("^" .. pattern .. "$") ~= nil +end + +-- 递归搜索文件和目录 +local function search(path, options, results) + path = shell.resolve(path) + results = results or {} + + if not fs.exists(path) then + io.stderr:write("Error: Path '" .. path .. "' does not exist.\n") + return results + end + + if not fs.isDir(path) then + -- 如果传入的是文件而不是目录,直接检查是否匹配 + local name = fs.getName(path) + local include = true + + if options.type == "d" then + include = false + elseif options.name and name ~= options.name then + include = false + elseif options.pattern and not matches_pattern(name, options.pattern, options.case_insensitive) then + include = false + elseif not options.hidden and name:sub(1, 1) == "." then + include = false + end + + if include then + results[#results + 1] = path + end + return results + end + + -- 遍历目录 + local files = fs.list(path) + for _, name in ipairs(files) do + local full_path = fs.combine(path, name) + local is_dir = fs.isDir(full_path) + local include = true + + -- 检查是否要包含此文件/目录 + if options.type == "f" and is_dir then + include = false + elseif options.type == "d" and not is_dir then + include = false + elseif options.name and name ~= options.name then + include = false + elseif options.pattern and not matches_pattern(name, options.pattern, options.case_insensitive) then + include = false + elseif not options.hidden and name:sub(1, 1) == "." then + include = false + end + + if include then + results[#results + 1] = full_path + end + + -- 递归搜索子目录 + if is_dir then + search(full_path, options, results) + end + end + + return results +end + +-- 主函数 +local function main(args) + -- 解析命令行参数 + local options = { + type = nil, -- f: 文件, d: 目录 + name = nil, -- 精确文件名 + pattern = nil, -- 通配符模式 + hidden = settings.get("list.show_hidden"), -- 是否显示隐藏文件 + case_insensitive = false + } + + local path = shell.dir() + local i = 1 + + while i <= #args do + if args[i] == "--help" or args[i] == "-h" then + show_help() + return + elseif args[i] == "--type" and i < #args then + i = i + 1 + options.type = args[i] + if options.type ~= "f" and options.type ~= "d" then + io.stderr:write("Error: Invalid type. Use 'f' for files or 'd' for directories.\n") + return + end + elseif args[i] == "--name" and i < #args then + i = i + 1 + options.name = args[i] + elseif args[i] == "--hidden" then + options.hidden = true + elseif args[i] == "--case-insensitive" or args[i] == "-i" then + options.case_insensitive = true + elseif args[i]:sub(1, 1) == "-" then + io.stderr:write("Error: Unknown option '" .. args[i] .. "'\n") + show_help() + return + elseif not options.pattern and path == shell.dir() then + -- 第一个非选项参数是路径 + path = args[i] + else + -- 第二个非选项参数是模式 + options.pattern = args[i] + end + i = i + 1 + end + + -- 执行搜索 + local results = search(path, options) + + -- 输出结果 + if #results == 0 then + print("No matching files or directories found.") + else + print("Found " .. #results .. " matching " .. (options.type == "f" and "files" or options.type == "d" and "directories" or "items") .. ":") + for _, result in ipairs(results) do + local is_dir = fs.isDir(result) + if is_dir then + term.setTextColor(colors.green) + else + term.setTextColor(colors.white) + end + print(" " .. result) + term.setTextColor(old_fg) + end + end +end + +-- 运行主函数 +local args = {...} +main(args) \ No newline at end of file diff --git a/data/computercraft/lua/rom/programs/history.lua b/data/computercraft/lua/rom/programs/history.lua new file mode 100644 index 0000000..4a36a43 --- /dev/null +++ b/data/computercraft/lua/rom/programs/history.lua @@ -0,0 +1,114 @@ +-- history.lua: Command history viewer +local term = require("term") +local colors = require("colors") +local textutils = require("textutils") +local shell = require("shell") + +-- Get the global history table from shell +local function getHistory() + -- Search for the shell thread to access its history + local thread = require("rc.thread") + local shellThread = thread.vars().parentShell + if shellThread then + local env = thread.getenv(shellThread) + if env and env.history then + return env.history + end + end + -- Fallback to empty history if not found + return {} +end + +-- Display help information +local function printHelp() + print("Usage: history [options]") + print("Options:") + print(" --help, -h Show this help message") + print(" --clear, -c Clear command history") + print(" --search, -s Search history for pattern") + print(" Execute command by history number") + print([[ +Displays command history in LeonOS.]]) +end + +-- Clear command history +local function clearHistory() + local history = getHistory() + for i = #history, 1, -1 do + history[i] = nil + end + print("Command history cleared.") +end + +-- Search history for pattern +local function searchHistory(pattern) + local history = getHistory() + local results = {} + for i, cmd in ipairs(history) do + if cmd:find(pattern) then + table.insert(results, {i, cmd}) + end + end + return results +end + +-- Main function +local function main(args) + -- Process command line arguments + if #args == 0 then + -- Display all history + local history = getHistory() + if #history == 0 then + print("No command history available.") + return + end + print("Command history:") + for i, cmd in ipairs(history) do + term.setTextColor(colors.cyan) + io.write(string.format(" %3d ", i)) + term.setTextColor(colors.white) + print(cmd) + end + elseif args[1] == "--help" or args[1] == "-h" then + printHelp() + elseif args[1] == "--clear" or args[1] == "-c" then + clearHistory() + elseif args[1] == "--search" or args[1] == "-s" then + if #args < 2 then + print("Error: Missing search pattern.") + printHelp() + else + local results = searchHistory(args[2]) + if #results == 0 then + print("No matching commands found.") + else + print("Search results:") + for _, item in ipairs(results) do + term.setTextColor(colors.cyan) + io.write(string.format(" %3d ", item[1])) + term.setTextColor(colors.white) + print(item[2]) + end + end + end + else + -- Try to execute command by number + local num = tonumber(args[1]) + if num then + local history = getHistory() + if num >= 1 and num <= #history then + print("Executing: " .. history[num]) + shell.run(history[num]) + else + print("Error: Invalid history number.") + end + else + print("Error: Unknown option or command number.") + printHelp() + end + end +end + +-- Run the main function +local args = {...} +main(args) \ No newline at end of file diff --git a/data/computercraft/lua/rom/programs/test_config.lua b/data/computercraft/lua/rom/programs/test_config.lua new file mode 100644 index 0000000..95b6e26 --- /dev/null +++ b/data/computercraft/lua/rom/programs/test_config.lua @@ -0,0 +1,86 @@ +-- test_config.lua: Test the config command + +local term = require("term") +local colors = require("colors") +local shell = require("shell") + +-- 保存当前颜色设置 +local old_fg = term.getTextColor() +local old_bg = term.getBackgroundColor() + +-- 设置名称栏颜色并显示 +term.setTextColor(colors.white) +term.setBackgroundColor(colors.cyan) +term.at(1, 1).clearLine() +term.at(1, 1).write("=== Testing Config Command ===") + +-- 恢复颜色设置 +term.setTextColor(old_fg) +term.setBackgroundColor(old_bg) +term.at(1, 2) + +-- 测试函数 +local function run_test(test_name, command) + term.setTextColor(colors.yellow) + print("\n=== Test: " .. test_name .. " ===") + term.setTextColor(colors.white) + print("Command: " .. command) + print("----------------------------------------") + local ok, err = shell.run(command) + if not ok and err then + io.stderr:write("Test failed: " .. err .. "\n") + else + term.setTextColor(colors.green) + print("Test completed successfully.") + term.setTextColor(colors.white) + end + print("----------------------------------------") + os.sleep(1) -- 短暂暂停,让用户有时间查看结果 +end + +-- 主测试函数 +local function main() + -- 清除屏幕,但保留顶部标题 + local w, h = term.getSize() + for y=2, h do + term.at(1, y).clearLine() + end + term.at(1, 2) + + print("Starting config command tests...") + os.sleep(1) + + -- 测试1: 显示帮助信息 + run_test("Show Help", "config help") + + -- 测试2: 列出所有设置 + run_test("List Settings", "config list") + + -- 测试3: 列出所有设置(带详细信息) + run_test("List Settings with Details", "config list --details") + + -- 测试4: 获取特定设置的值 + run_test("Get Setting Value", "config get list.show_hidden") + + -- 测试5: 修改设置的值 + run_test("Set Setting Value", "config set list.show_hidden true") + + -- 测试6: 验证设置已更改 + run_test("Verify Setting Changed", "config get list.show_hidden") + + -- 测试7: 重置设置为默认值 + run_test("Reset to Default", "config default list.show_hidden") + + -- 测试8: 验证设置已重置 + run_test("Verify Reset", "config get list.show_hidden") + + -- 测试9: 保存设置(注意:这会实际修改设置文件) + run_test("Save Settings", "config save") + + term.setTextColor(colors.green) + print("\nAll tests completed!") + term.setTextColor(colors.white) + print("You can run 'config' command directly to manage system settings.") +end + +main() \ No newline at end of file diff --git a/data/computercraft/lua/rom/programs/test_find.lua b/data/computercraft/lua/rom/programs/test_find.lua new file mode 100644 index 0000000..7a5d690 --- /dev/null +++ b/data/computercraft/lua/rom/programs/test_find.lua @@ -0,0 +1,158 @@ +-- test_find.lua: Test the find command + +local term = require("term") +local colors = require("colors") +local shell = require("shell") +local fs = require("fs") + +-- 保存当前颜色设置 +local old_fg = term.getTextColor() +local old_bg = term.getBackgroundColor() + +-- 设置名称栏颜色并显示 +term.setTextColor(colors.white) +term.setBackgroundColor(colors.cyan) +term.at(1, 1).clearLine() +term.at(1, 1).write("=== Testing Find Command ===") + +-- 恢复颜色设置 +term.setTextColor(old_fg) +term.setBackgroundColor(old_bg) +term.at(1, 2) + +-- 创建测试目录结构 +local function create_test_files() + print("Creating test files and directories...") + + -- 创建测试根目录 + local test_root = "/test_find" + if fs.exists(test_root) then + fs.delete(test_root) + end + fs.makeDir(test_root) + + -- 创建测试文件和目录 + fs.makeDir(fs.combine(test_root, "dir1")) + fs.makeDir(fs.combine(test_root, "dir2")) + fs.makeDir(fs.combine(test_root, ".hidden_dir")) + + -- 创建文件 + local function create_file(path, content) + local file = io.open(path, "w") + if file then + file:write(content) + file:close() + return true + end + return false + end + + create_file(fs.combine(test_root, "file1.txt"), "Test file 1") + create_file(fs.combine(test_root, "file2.lua"), "-- Test Lua file") + create_file(fs.combine(test_root, ".hidden_file"), "Hidden file content") + create_file(fs.combine(test_root, "dir1", "subfile1.txt"), "Subdirectory file 1") + create_file(fs.combine(test_root, "dir1", "subfile2.lua"), "-- Subdirectory Lua file") + create_file(fs.combine(test_root, "dir2", "subfile3.txt"), "Subdirectory file 3") + create_file(fs.combine(test_root, ".hidden_dir", "hidden_content.txt"), "Content in hidden directory") + + print("Test files created successfully.") + return test_root +end + +-- 测试函数 +local function run_test(test_name, command, expected_count) + term.setTextColor(colors.yellow) + print("\n=== Test: " .. test_name .. " ===") + term.setTextColor(colors.white) + print("Command: " .. command) + print("----------------------------------------") + + -- 捕获命令输出 + local old_output = io.output() + local output = {} + io.output{write = function(s) output[#output+1] = s end} + + local ok, err = shell.run(command) + + -- 恢复输出 + io.output(old_output) + + -- 计算匹配的结果数量 + local result_count = 0 + for line in table.concat(output, ""):gmatch("[^ +]+") do + if line:match("^ /test_find/") then + result_count = result_count + 1 + end + end + + -- 检查结果 + if not ok and err then + io.stderr:write("Test failed: " .. err .. "\n") + else + if expected_count and result_count ~= expected_count then + io.stderr:write("Test failed: Expected " .. expected_count .. " results, got " .. result_count .. "\n") + else + term.setTextColor(colors.green) + print("Test completed successfully. Found " .. result_count .. " results.") + term.setTextColor(colors.white) + end + end + print("----------------------------------------") + os.sleep(1) -- 短暂暂停,让用户有时间查看结果 +end + +-- 主测试函数 +local function main() + -- 清除屏幕,但保留顶部标题 + local w, h = term.getSize() + for y=2, h do + term.at(1, y).clearLine() + end + term.at(1, 2) + + -- 创建测试文件 + local test_root = create_test_files() + os.sleep(1) + + print("Starting find command tests...") + os.sleep(1) + + -- 测试1: 显示帮助信息 + run_test("Show Help", "find --help") + + -- 测试2: 搜索所有文件和目录 + run_test("Search All Items", "find " .. test_root, 8) + + -- 测试3: 搜索Lua文件 + run_test("Search Lua Files", "find " .. test_root .. " *.lua", 2) + + -- 测试4: 搜索目录 + run_test("Search Directories", "find " .. test_root .. " --type d", 3) + + -- 测试5: 搜索特定名称的文件 + run_test("Search by Exact Name", "find " .. test_root .. " --name file1.txt", 1) + + -- 测试6: 搜索隐藏文件和目录 + run_test("Search Hidden Items", "find " .. test_root .. " --hidden", 10) + + -- 测试7: 不区分大小写搜索 + run_test("Case Insensitive Search", "find " .. test_root .. " FILE*.TXT -i", 1) + + -- 测试8: 组合条件搜索 (Lua文件且不区分大小写) + run_test("Combined Conditions", "find " .. test_root .. " *.LUA -i", 2) + + -- 测试9: 搜索不存在的路径 + run_test("Search Non-existent Path", "find /non_existent_path", 0) + + -- 清理测试文件 + print("\nCleaning up test files...") + fs.delete(test_root) + + term.setTextColor(colors.green) + print("\nAll tests completed!") + term.setTextColor(colors.white) + print("You can run 'find' command directly to search files and directories.") +end + +main() \ No newline at end of file diff --git a/data/computercraft/lua/rom/programs/test_history.lua b/data/computercraft/lua/rom/programs/test_history.lua new file mode 100644 index 0000000..da09694 --- /dev/null +++ b/data/computercraft/lua/rom/programs/test_history.lua @@ -0,0 +1,72 @@ +-- test_history.lua: Test the history command +local shell = require("shell") +local term = require("term") + +print("=== Testing history Command ===") +print("This test will run the history command with different options") +print("to verify it correctly manages command history.") +print(" +First, let's execute some commands to populate history...") + +-- Execute some commands to populate history +shell.run("echo Hello, World!") +shell.run("list") +shell.run("help") + +print(" +Test 1: Basic history command") +os.sleep(1) +term.clear() +local success = shell.run("history") +if not success then + print("Error: history command failed to run.") +else + print(" +Test 1 completed. Press any key to continue.") +os.pullEvent("key") +end + +print(" +Test 2: Search history") +os.sleep(1) +term.clear() +success = shell.run("history", "-s", "he") +if not success then + print("Error: history search command failed to run.") +else + print(" +Test 2 completed. Press any key to continue.") +os.pullEvent("key") +end + +print(" +Test 3: Execute command from history") +os.sleep(1) +term.clear() +print("Executing command #1 from history (should be 'echo Hello, World!')") +success = shell.run("history", "1") +if not success then + print("Error: history execution command failed to run.") +else + print(" +Test 3 completed. Press any key to continue.") +os.pullEvent("key") +end + +print(" +Test 4: history help") +os.sleep(1) +term.clear() +success = shell.run("history", "--help") +if not success then + print("Error: history help command failed to run.") +else + print(" +Test 4 completed. Press any key to finish.") +os.pullEvent("key") +end + +term.clear() +print("=== history Command Tests Completed ===") +print("All tests have been executed.") +print("You can now use the 'history' command to manage your command history.") \ No newline at end of file diff --git a/installer.lua b/installer.lua index 33de7fa..7a88061 100644 --- a/installer.lua +++ b/installer.lua @@ -1,5 +1,5 @@ -- LeonOS installer -local INSTALLER_VERSION = "0.3.7 Beta 12" +local INSTALLER_VERSION = "0.3.8" local DEFAULT_ROM_DIR = "/leonos" print("Start loading LeonOS installer ("..INSTALLER_VERSION..")...")