diff --git a/yazi-plugin/preset/setup.lua b/yazi-plugin/preset/setup.lua index 66597d00..77b2a8a8 100644 --- a/yazi-plugin/preset/setup.lua +++ b/yazi-plugin/preset/setup.lua @@ -3,7 +3,9 @@ package.path = BOOT.plugin_dir .. "/?.yazi/init.lua;" .. package.path local _require = require require = function(name) YAZI_PLUGIN_NAME, YAZI_SYNC_CALLS = name, 0 - return _require(name) + local mod = _require(name) + mod._name = name + return mod end YAZI_SYNC_BLOCKS = {} diff --git a/yazi-plugin/src/elements/line.rs b/yazi-plugin/src/elements/line.rs index 9f41a8ec..37bc43cd 100644 --- a/yazi-plugin/src/elements/line.rs +++ b/yazi-plugin/src/elements/line.rs @@ -1,4 +1,7 @@ -use mlua::{AnyUserData, ExternalError, FromLua, IntoLua, Lua, Table, UserData, UserDataMethods, Value}; +use std::mem; + +use ansi_to_tui::IntoText; +use mlua::{AnyUserData, ExternalError, ExternalResult, FromLua, IntoLua, Lua, Table, UserData, UserDataMethods, Value}; use super::{Span, Style}; @@ -39,7 +42,21 @@ impl Line { Err("expected a table of Spans or Lines".into_lua_err()) })?; + let parse = lua.create_function(|_, code: mlua::String| { + let Some(line) = code.as_bytes().split_inclusive(|&b| b == b'\n').next() else { + return Ok(Line(Default::default())); + }; + + let mut lines = line.into_text().into_lua_err()?.lines; + if lines.is_empty() { + return Ok(Line(Default::default())); + } + + Ok(Line(mem::take(&mut lines[0]))) + })?; + let line = lua.create_table_from([ + ("parse", parse.into_lua(lua)?), // Alignment ("LEFT", LEFT.into_lua(lua)?), ("CENTER", CENTER.into_lua(lua)?), diff --git a/yazi-plugin/src/loader.rs b/yazi-plugin/src/loader.rs index b8d02b1b..3408b418 100644 --- a/yazi-plugin/src/loader.rs +++ b/yazi-plugin/src/loader.rs @@ -60,6 +60,7 @@ impl Loader { None => Err(format!("plugin `{name}` not found").into_lua_err())?, }; + t.raw_set("_name", LUA.create_string(name)?)?; loaded.raw_set(name, t.clone())?; Ok(t) } diff --git a/yazi-plugin/src/opt.rs b/yazi-plugin/src/opt.rs index e7854097..0bc86cc7 100644 --- a/yazi-plugin/src/opt.rs +++ b/yazi-plugin/src/opt.rs @@ -21,7 +21,7 @@ impl TryFrom for Opt { fn try_from(mut c: Cmd) -> Result { let Some(name) = c.take_first().filter(|s| !s.is_empty()) else { - bail!("invalid plugin name"); + bail!("plugin name cannot be empty"); }; let mut data: OptData = c.take_data().unwrap_or_default(); diff --git a/yazi-plugin/src/process/command.rs b/yazi-plugin/src/process/command.rs index 33a65ce4..3b67fa5e 100644 --- a/yazi-plugin/src/process/command.rs +++ b/yazi-plugin/src/process/command.rs @@ -49,6 +49,10 @@ impl UserData for Command { } Ok(ud) }); + methods.add_function("cwd", |_, (ud, dir): (AnyUserData, mlua::String)| { + ud.borrow_mut::()?.inner.current_dir(dir.to_str()?); + Ok(ud) + }); methods.add_function( "env", |_, (ud, key, value): (AnyUserData, mlua::String, mlua::String)| {