🌸
357 subscribers
127 photos
17 videos
197 links
记录一些 学习笔记,工具,和其它奇怪的东西
Download Telegram
Yazi 终端文件管理器 v0.3 发布!

经过 3 个月开发,很高兴宣布 Yazi 0.3 今天正式发布。

这个版本带来了许多新功能和改善,像是:

• 鼠标支持
• 新解压插件
• 字体、SVG、HEIC、JPEG XL 预览支持
• 包管理器
• 重新设计图标
• 归档预览性能大提升

请阅读 https://github.com/sxyazi/yazi/releases/tag/v0.3.0 捕捉所有细节。
🎉18
This media is not supported in your browser
VIEW IN TELEGRAM
社区老哥给 Yazi 写了个受 React 启发的 Panes 系统 - 包含了常见的 Rows、Columns、Boxes 部件,每个部件都是一个函数并可以被自由组合和定制(content,padding,margin,borders 等)。

他在 Yazi 的 Discord server 分享了它,看完之后非常震惊,因为默认 UI 被 100% 重写了,并多了一堆新功能(双列布局、尺寸调整、横纵布局切换、窗格选择模式),刚开始我甚至没认出来这是 Yazi。

很开心看到这样的插件出现,也真的很惊讶社区的创造力,目前仍然处于测试阶段,不过有个很棒的演示视频:
👍17
Rust std::fs::copy() 平台差异记录

fs::copy()io::copy() 不同,除了复制文件本身,还会复制文件权限,但一些(网络)文件系统不支持设置权限 - Operation not supported (os error 95),这会导致文件也没法复制。

这个问题只存在于 Linux/Android,因为 Linux 没有像 macOS 的 fclonefileatfcopyfile,Windows 的 CopyFileEx 一个 syscall 搞定整个复制的 API,因此需要将一个原子操作拆成 2 个,Rust 为了保证安全,之中任何一个失败都视为整体失败。

而文件能在所有 FS 复制是预期行为,因此对于 Linux/Android,我会 io::copy() + 静默 fchmod。strace 了下它和 fs::copy() 一致,这意味着它仍然会尝试 copy_file_range,不会损失 CoW FS 的优势。

需要注意的是,对于 macOS,当前实现,io::copy() 就只是个 userspace read-write-loop,所以 macOS 应该仍然使用 fs::copy(),反正也不存在这个问题。

TLDR:为了让文件在所有 FS 都能复制,并且保留 CoW,Linux/Android 使用 io::copy() + fchmod,其它使用 fs::copy()

https://www.reddit.com/r/rust/comments/57cmm1/weird_behavior_of_stdfscopy_on_networkmounted/
👍6❤‍🔥1
mlua v0.10 升级体验

昨天把 mlua 从 0.9.9 升到 0.10.0,以为就 10 分钟的事,结果改了一个小时也没改完,从满血直接给我干到吐血:

• 所有 struct、trait lifetime 都删了,行吧,为了更方便推断类型,我可以批量替换下

• trait 名从 TableExt 换成了 ObjectLike,也可以替换下

• Scope 的 create_any_userdata 给扬了,啊?变更日志没有啊,也没标记 deprecated,就没了??直接把 owned any userdata 需求干死了,害,那就把我 struct 从 register_userdata_type() 全换成 UserData trait 吧

mlua::Stringto_str()as_bytes() 返回类型也变了?从 Cow<str>&[u8] 变成了 BorrowedStrBorrowedBytes,用得时候得 let s = s.to_str(); let s = s.as_ref()。这个也没任何记录,对着编译器自己修吧

mlua::Stringto_string_lossy() 返回值从 Cow<str> 改成了 String,啊?标准库都不敢这么干,反正你 to lossy 我就分配内存。这个也没记录,对着编译器自己修吧

• 好消息,0.10.0 的 UserDataRef 只能在 non-scoped 用了,scoped 就自求多福吧,https://github.com/mlua-rs/mlua/issues/475 - 这个昨天调了好久,它甚至不是一个编译错误,而是行为变化产生的运行时错误,同样没记录,不问不知道

MultiValue::from_vec 也删了,没记录,也没标记 deprecated 就没了


总之,非常糟糕升级体验,连迁移文档都没,全靠自己猜,改了 89 个文件了,卡在 UserDataRef 问题上,预感还远远没改完,还是头一次升级个 crate 改那么多东西。。。

https://github.com/sxyazi/yazi/pull/1842
🤣7
🌸
mlua v0.10 升级体验 昨天把 mlua 从 0.9.9 升到 0.10.0,以为就 10 分钟的事,结果改了一个小时也没改完,从满血直接给我干到吐血: • 所有 struct、trait lifetime 都删了,行吧,为了更方便推断类型,我可以批量替换下 • trait 名从 TableExt 换成了 ObjectLike,也可以替换下 • Scope 的 create_any_userdata 给扬了,啊?变更日志没有啊,也没标记 deprecated,就没了??直接把 owned any…
今天终于把它合了,拖了两周期间一直在跟 mlua 作者对线友好交流 - 巨大感谢 Alex 的所有帮助!

上个 post 提到的问题基本都解决了:

• 0.10 把 Scope::create_any_userdata 扬了:加回去了!

• 0.10 把 MultiValue::from_vec() 扬了:加回去了!

• 0.10 的 UserDataRef 只能在 non-scope 用,行为变了没记录:补充进了 breaking changes!

• 中途发现随机 panic bug:报告&修复了,https://github.com/mlua-rs/mlua/issues/477

• 中途发现 AnyUserData::borrow() 行为也变了:加了 2 个新 API AnyUserData::destroy()Scope::add_destructor() 还原之前行为,https://github.com/mlua-rs/mlua/issues/476
👍4
想加个 CODE_OF_CONDUCT.md,但不会写文案,发了个 good first issue,半小时收到了 claim,开心

上次 CONTRIBUTING.md 也是这样找人写的,专业的事给专业的人,并且可以得到贡献机会 - 很多人想贡献只是不懂 Rust/编码,感觉这是个良性的社区互动

https://github.com/sxyazi/yazi/issues/1905
4
昨天看 mlua 源码学到一个挺精妙的 trick:运行时检查类型 T 是否 Sync

大概原理是给 T 创建一个 newtype,并为 newtype 实现 CopyClone 两个 trait,而 Copy 只在 T: Sync 时实现,然后调用 newtype 的 .clone(),看看走的 Copy 还是 Clone,如果是 Clone 表示 TSync

mlua 利用这个 trick 为并发环境做了一些性能优化,如果 T: Sync,就加 shared lock,否则 exclusive lock

https://github.com/mlua-rs/mlua/commit/bb311349ecb24cb9ad4598f9c997eb9bf658f716
👍10
Yazi 终端文件管理器 v0.4 发布!

经过 3 个月开发,很高兴宣布 Yazi 0.4 今天正式发布。

这是有史以来最大的一个版本,53 个新功能,41 项错误修复,以及 12 项性能改善。以下是新功能一览:

• Spotter
• 透明图像预览
• dark/light mode 支持
ya emit / ya emit-to 子命令
• Previewer/Preloader/Spotter/Fetcher 支持传递参数
• 查找关键字指示器
noop 虚拟命令
• tarballs 解压支持
• 智能批量重命名
• 更好的图像尺寸适配、用户配置解析

请阅读 https://github.com/sxyazi/yazi/releases/tag/v0.4.0 捕捉所有细节。
🎉8🔥1
Yazi 本月 Rust 榜第一 🎉 🎉

最近涨了好多星,快要超过 nnn 成为宇宙最多⭐️ terminal file manager 啦!
👍29
想监听 Linux mount/umount,一开始直接 libc::epoll,写一半想起来 tokio 本身带了个 AsyncFd


let f = File::open("/proc/mounts")?;
let fd = AsyncFd::with_interest(f.as_fd(), Interest::READABLE)?;

loop {
let mut guard = fd.readable().await?;
guard.clear_ready();
println!("Changed...");
}


真好!不用 unsafe,也不用自己再起个线程 epoll_wait
👍8
最近收到了 Warp 的赞助,这还是咱第一次被赞助,超开心的!

以后咱能多喝几杯咖啡,把更多精力和空闲时间投入开源世界啦!💖
👍30🎉32
This media is not supported in your browser
VIEW IN TELEGRAM
昨天花了点时间给 Yazi 添加了 Helix 支持

现在可以在 Helix 里丝滑使用 Yazi 管理文件了,不需要 Zellij 或 tmux,甚至能预览图片、视频!

反响还不错,得到了 250 个 upvotes!https://www.reddit.com/r/HelixEditor/comments/1j72tmr/use_yazi_file_manager_directly_in_helix_without/
👍11
This media is not supported in your browser
VIEW IN TELEGRAM
一老哥给 Duck 做了个 YaziDB 插件!🦆

https://github.com/wylie102/duckdb.yazi
👍8🦄1