diff --git a/yazi-plugin/preset/plugins/archive.lua b/yazi-plugin/preset/plugins/archive.lua index d6bad650..0d139d05 100644 --- a/yazi-plugin/preset/plugins/archive.lua +++ b/yazi-plugin/preset/plugins/archive.lua @@ -79,7 +79,7 @@ end --- 2: wrong password --- 3: partial success function M.list_files(args, skip, limit) - local child = M.spawn_7z { "l", "-ba", "-slt", table.unpack(args) } + local child = M.spawn_7z { "l", "-ba", "-slt", "-sccUTF-8", table.unpack(args) } if not child then return {}, 0, 1 end @@ -136,7 +136,7 @@ end --- 2: wrong password --- 3: partial success function M.list_meta(args) - local child = M.spawn_7z { "l", "-slt", table.unpack(args) } + local child = M.spawn_7z { "l", "-slt", "-sccUTF-8", table.unpack(args) } if not child then return nil, 1 end diff --git a/yazi-plugin/preset/plugins/extract.lua b/yazi-plugin/preset/plugins/extract.lua index 3ed701d3..6528221a 100644 --- a/yazi-plugin/preset/plugins/extract.lua +++ b/yazi-plugin/preset/plugins/extract.lua @@ -48,7 +48,7 @@ function M:try_with(from, pwd, to) end local archive = require("archive") - local child, code = archive.spawn_7z { "x", "-aou", "-p" .. pwd, "-o" .. tostring(tmp), tostring(from) } + local child, code = archive.spawn_7z { "x", "-aou", "-sccUTF-8", "-p" .. pwd, "-o" .. tostring(tmp), tostring(from) } if not child then fail("Spawn `7z` and `7zz` both commands failed, error code %s", code) end diff --git a/yazi-plugin/src/process/child.rs b/yazi-plugin/src/process/child.rs index f2705b0e..fc740d16 100644 --- a/yazi-plugin/src/process/child.rs +++ b/yazi-plugin/src/process/child.rs @@ -26,21 +26,19 @@ impl Child { impl UserData for Child { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { #[inline] - // TODO: return mlua::String instead of String - async fn read_line(me: &mut Child) -> (String, u8) { - async fn read(r: Option) -> Option { - let mut r = r?; - let mut buf = String::new(); - match r.read_line(&mut buf).await { + async fn read_line(me: &mut Child) -> (Option>, u8) { + async fn read(r: Option) -> Option> { + let mut buf = Vec::new(); + match r?.read_until(b'\n', &mut buf).await { Ok(0) | Err(_) => None, Ok(_) => Some(buf), } } select! { - Some(r) = read(me.stdout.as_mut()) => (r, 0u8), - Some(r) = read(me.stderr.as_mut()) => (r, 1u8), - else => (String::new(), 2u8), + r @ Some(_) = read(me.stdout.as_mut()) => (r, 0u8), + r @ Some(_) = read(me.stderr.as_mut()) => (r, 1u8), + else => (None, 2u8), } } @@ -61,12 +59,20 @@ impl UserData for Child { else => (vec![], 2u8) }) }); - methods.add_async_method_mut("read_line", |_, me, ()| async move { Ok(read_line(me).await) }); - methods.add_async_method_mut("read_line_with", |_, me, options: Table| async move { - let timeout: u64 = options.raw_get("timeout")?; - match tokio::time::timeout(Duration::from_millis(timeout), read_line(me)).await { - Ok(value) => Ok(value), - Err(_) => Ok((String::new(), 3u8)), + methods.add_async_method_mut("read_line", |lua, me, ()| async move { + match read_line(me).await { + (Some(b), event) => (lua.create_string(b)?, event).into_lua_multi(lua), + (None, event) => (Value::Nil, event).into_lua_multi(lua), + } + }); + methods.add_async_method_mut("read_line_with", |lua, me, options: Table| async move { + let timeout = Duration::from_millis(options.raw_get("timeout")?); + let Ok(result) = tokio::time::timeout(timeout, read_line(me)).await else { + return (Value::Nil, 3u8).into_lua_multi(lua); + }; + match result { + (Some(b), event) => (lua.create_string(b)?, event).into_lua_multi(lua), + (None, event) => (Value::Nil, event).into_lua_multi(lua), } }); diff --git a/yazi-shared/src/fs/cha.rs b/yazi-shared/src/fs/cha.rs index 294ffed1..57f7fea9 100644 --- a/yazi-shared/src/fs/cha.rs +++ b/yazi-shared/src/fs/cha.rs @@ -3,8 +3,6 @@ use std::{fs::{FileType, Metadata}, path::Path, time::SystemTime}; use bitflags::bitflags; use yazi_macro::unix_either; -use super::Urn; - bitflags! { #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct ChaKind: u8 { @@ -149,7 +147,7 @@ impl Cha { let mut attached = ChaKind::empty(); #[cfg(unix)] - if Urn::new(path).is_hidden() { + if super::Urn::new(path).is_hidden() { attached |= ChaKind::HIDDEN; } #[cfg(windows)]