diff --git a/README.md b/README.md
index 391a3f2..9a2bbe2 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,7 @@ CodeForge 是一款轻量级、高性能的桌面代码执行器,专为开发
+
diff --git a/public/icons/lua.svg b/public/icons/lua.svg
new file mode 100644
index 0000000..71970e1
--- /dev/null
+++ b/public/icons/lua.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src-tauri/src/examples/lua.lua b/src-tauri/src/examples/lua.lua
new file mode 100644
index 0000000..2cb269c
--- /dev/null
+++ b/src-tauri/src/examples/lua.lua
@@ -0,0 +1,82 @@
+-- Lua 示例代码 - CodeForge 代码执行环境
+
+print("🎉 欢迎使用 CodeForge!")
+print("Welcome to CodeForge!")
+print("")
+
+print("=========================================")
+print(" CodeForge Lua ")
+print("=========================================")
+print("")
+
+-- 基本输出示例
+print("✅ Lua运行成功! (Lua is working!)")
+print("⚡ 这是Lua程序 (This is Lua program)")
+print("")
+
+-- 变量操作
+local name = "CodeForge"
+local version = "Lua"
+local number1 = 10
+local number2 = 20
+local result = number1 + number2
+
+print("🔢 简单计算 (Simple calculation):")
+print(string.format("%d + %d = %d", number1, number2, result))
+print("")
+
+-- 字符串操作
+print("📝 字符串操作 (String operations):")
+print("平台名称 (Platform): " .. name)
+print("语言版本 (Language): " .. version)
+print("完整信息 (Full info): " .. name .. " - " .. version)
+print("")
+
+-- 表(数组)操作
+print("🍎 表示例 (Table example):")
+local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
+for i, fruit in ipairs(fruits) do
+ print(string.format("%d. %s", i, fruit))
+end
+print("")
+
+-- 条件判断
+local score = 85
+print("📊 成绩评估 (Score evaluation):")
+if score >= 90 then
+ print("优秀! (Excellent!)")
+elseif score >= 80 then
+ print("良好! (Good!)")
+elseif score >= 60 then
+ print("及格 (Pass)")
+else
+ print("需要努力 (Need improvement)")
+end
+print("")
+
+-- 循环示例
+print("🔄 循环输出 (Loop output):")
+for i = 1, 5 do
+ print(string.format("第 %d 次输出 (Output #%d): Hello from CodeForge!", i, i))
+end
+print("")
+
+-- while循环示例
+print("🔁 While循环示例 (While loop example):")
+local counter = 1
+while counter <= 3 do
+ print(string.format("While循环: 第 %d 次", counter))
+ counter = counter + 1
+end
+print("")
+
+-- 函数示例
+local function greet(msg)
+ return "🎯 " .. msg
+end
+
+print(greet("CodeForge Lua代码执行完成!"))
+print(greet("CodeForge Lua execution completed!"))
+print("")
+print("感谢使用 CodeForge 代码执行环境! 🚀")
+print("Thank you for using CodeForge! 🚀")
\ No newline at end of file
diff --git a/src-tauri/src/plugins/lua.rs b/src-tauri/src/plugins/lua.rs
new file mode 100644
index 0000000..234b200
--- /dev/null
+++ b/src-tauri/src/plugins/lua.rs
@@ -0,0 +1,82 @@
+use super::{LanguagePlugin, PluginConfig};
+use std::vec;
+
+pub struct LuaPlugin;
+
+impl LanguagePlugin for LuaPlugin {
+ fn get_order(&self) -> i32 {
+ 26
+ }
+
+ fn get_language_name(&self) -> &'static str {
+ "Lua"
+ }
+
+ fn get_language_key(&self) -> &'static str {
+ "lua"
+ }
+
+ fn get_file_extension(&self) -> String {
+ self.get_config()
+ .map(|config| config.extension.clone())
+ .unwrap_or_else(|| "lua".to_string())
+ }
+
+ fn get_version_args(&self) -> Vec<&'static str> {
+ vec!["-v"]
+ }
+
+ fn get_path_command(&self) -> String {
+ "which lua".to_string()
+ }
+
+ fn get_command(
+ &self,
+ _file_path: Option<&str>,
+ _is_version: bool,
+ _file_name: Option,
+ ) -> String {
+ if _is_version {
+ let lua_command = if self.get_execute_home().is_some() {
+ "./lua"
+ } else {
+ "lua"
+ };
+
+ return lua_command.to_string();
+ }
+
+ // 执行代码时
+ if let Some(config) = self.get_config() {
+ if let Some(run_cmd) = &config.run_command {
+ return if let Some(file_name) = _file_name {
+ run_cmd.replace("$filename", &file_name)
+ } else {
+ run_cmd.clone()
+ };
+ }
+ }
+ self.get_default_command()
+ }
+
+ fn get_default_config(&self) -> PluginConfig {
+ PluginConfig {
+ enabled: true,
+ language: String::from("lua"),
+ before_compile: None,
+ extension: String::from("lua"),
+ execute_home: None,
+ run_command: Some(String::from("lua $filename")),
+ after_compile: None,
+ template: Some(String::from("-- Lua 示例代码 - CodeForge 代码执行环境\n\n")),
+ timeout: Some(30),
+ console_type: Some(String::from("console")),
+ }
+ }
+
+ fn get_default_command(&self) -> String {
+ self.get_config()
+ .and_then(|config| config.run_command.clone())
+ .unwrap_or_else(|| "lua".to_string())
+ }
+}
diff --git a/src-tauri/src/plugins/manager.rs b/src-tauri/src/plugins/manager.rs
index 64271a4..111cdf6 100644
--- a/src-tauri/src/plugins/manager.rs
+++ b/src-tauri/src/plugins/manager.rs
@@ -14,6 +14,7 @@ use crate::plugins::javascript_browser::JavaScriptBrowserPlugin;
use crate::plugins::javascript_jquery::JavaScriptJQueryPlugin;
use crate::plugins::javascript_nodejs::JavaScriptNodeJsPlugin;
use crate::plugins::kotlin::KotlinPlugin;
+use crate::plugins::lua::LuaPlugin;
use crate::plugins::nodejs::NodeJSPlugin;
use crate::plugins::php::PHPPlugin;
use crate::plugins::python2::Python2Plugin;
@@ -62,6 +63,7 @@ impl PluginManager {
plugins.insert("r".to_string(), Box::new(RPlugin));
plugins.insert("cangjie".to_string(), Box::new(CangjiePlugin));
plugins.insert("haskell".to_string(), Box::new(HaskellPlugin));
+ plugins.insert("lua".to_string(), Box::new(LuaPlugin));
plugins.insert(
"javascript-nodejs".to_string(),
Box::new(JavaScriptNodeJsPlugin),
diff --git a/src-tauri/src/plugins/mod.rs b/src-tauri/src/plugins/mod.rs
index 8253379..1715f53 100644
--- a/src-tauri/src/plugins/mod.rs
+++ b/src-tauri/src/plugins/mod.rs
@@ -384,6 +384,7 @@ pub mod javascript_browser;
pub mod javascript_jquery;
pub mod javascript_nodejs;
pub mod kotlin;
+pub mod lua;
pub mod manager;
pub mod nodejs;
pub mod php;
diff --git a/src/composables/useCodeMirrorEditor.ts b/src/composables/useCodeMirrorEditor.ts
index 78e6ced..f6dfb07 100644
--- a/src/composables/useCodeMirrorEditor.ts
+++ b/src/composables/useCodeMirrorEditor.ts
@@ -17,6 +17,7 @@ import {ruby} from '@codemirror/legacy-modes/mode/ruby'
import {groovy} from '@codemirror/legacy-modes/mode/groovy'
import {r} from "@codemirror/legacy-modes/mode/r"
import {haskell} from "@codemirror/legacy-modes/mode/haskell"
+import {lua} from "@codemirror/legacy-modes/mode/lua"
import {
abcdef,
abyss,
@@ -216,6 +217,8 @@ export function useCodeMirrorEditor(props: Props)
return StreamLanguage.define(r)
case 'haskell':
return StreamLanguage.define(haskell)
+ case 'lua':
+ return StreamLanguage.define(lua)
default:
return null
}