dual-yazi: 给 Yazi 加上我想要的双栏模式
最近在终端里管理文件时, 我一直有点拧巴: 一方面, Yazi 这种新一代 terminal file manager 确实做得很好, 速度快, 预览强, 插件系统也灵活; 另一方面, 如果你像我一样长期用过 Midnight Commander, Total Commander 这类双栏文件管理器, 很多操作习惯其实已经刻在手上了.
所以这两天我干脆 fork 了一份 Yazi, 做了个 dual-yazi: https://github.com/jtianling/dual-yazi. 它不是另起炉灶重写一个文件管理器, 而是在原版 Yazi 上补上我自己最想要的一层工作流: 固定双栏, 每栏独立 tabs, 直接跨栏复制/移动, 以及单栏/双栏和预览模式的切换.
对我自己来说, 这是个挺自然的方向. 我喜欢 Yazi 这套比较现代的 TUI 文件管理体验, 但也一直怀念传统双栏管理器那种”左右两个目录永远摆在眼前”的直接感. 现在总算把这两边拼到一起了.
仓库地址:
- Yazi 官方仓库: https://github.com/sxyazi/yazi
- 我的 fork: https://github.com/jtianling/dual-yazi
Yazi 为什么值得折腾
如果还没用过 Yazi, 我觉得它算是这几年 terminal 文件管理器里很值得一试的一个.
官方 README 里列的点很多, 不过我自己最看重的其实是下面几件事: 它真的很快, 异步 I/O 和任务调度做得比较彻底; 预览能力很完整, 不只是看文本, 图片、PDF、压缩包、代码高亮这些都考虑到了; 另外 Lua 插件系统也足够开放, 不会让人有一种”功能很多, 但改不动”的感觉.
换句话说, 它不是那种只能拿来简单 hjkl 浏览目录的小工具, 而是已经能比较认真地当 daily driver 用的 terminal file manager. 我现在想做双栏, 也正是因为我觉得它本体已经足够好, 值得在这个基础上继续补自己想要的交互.
我为什么还是想要双栏
tab 当然有用, 单栏 + preview 其实也已经能覆盖不少场景. 但这和真正的双栏工作流还是不一样.
比如整理下载目录, 对比两个目录结构, 从一个地方筛文件再搬到另一个地方, 或者一边看项目目录一边把东西归档, 双栏的心智模型就是更直接: 左边是来源, 右边是目标, 焦点在哪一栏, 操作就对哪一栏生效. 你不需要频繁在脑子里记”我刚才那个目标目录在哪个 tab 里”, 也不需要反复切来切去确认当前上下文.
这也是为什么很多老文件管理器到今天依然有人喜欢. 它们不一定更现代, 但在”批量整理文件”这个问题上, 工作流非常顺手.
dual-yazi 现在有什么
1. Dual-Pane Mode
程序启动后默认就是固定双栏模式, 左右各一个 pane, 左边默认获得焦点. 每个 pane 都有自己的 header 和 status bar, 所以它不是简单把原界面从中间切一刀, 而是把每一栏都当成一个完整的浏览上下文来处理.
默认的双栏布局更偏目录浏览: 每栏显示 parent + current, 也就是父目录列加当前目录列, preview 默认先隐藏. 这样做的原因很简单, 双栏模式下最常见的需求通常不是看大预览, 而是快速在两个目录之间来回操作.
切换 pane 也尽量沿用了大家熟悉的习惯:
TabCtrl-w wCtrl-w Ctrl-wCtrl-w hCtrl-w l
2. Per-Pane Independent Tabs
双栏和 tabs 不是互斥关系. dual-yazi 里, 每个 pane 都独立维护自己的一组 tabs, 也各自有自己的 tab cursor 和状态. 这样一来, 你就不是只有两个固定目录, 而是相当于有两套互不干扰的工作区.
这点我自己很喜欢. 比如左边可以长期放源码、文档、下载目录这几组 tab, 右边放归档、临时目录、目标目录这几组 tab. 传统双栏文件管理器的直接感还在, 但比传统双栏多了一层更灵活的组织方式.
更重要的是, 原本 Yazi 的 tab 相关操作也基本保留下来了. 默认 keymap 里这一组现在是:
t新建 tabCtrl-c关闭当前 tab, 如果已经是最后一个 tab 则退出1-9切换 tab[/]前后切换{/}交换 tab
tab_rename 这个动作目前还在, 但默认没有单独分配快捷键, 需要的话可以自己在 keymap 里绑定.
这些操作现在都是对当前 pane 生效, 而不是全局共享一套 tab 列表.
3. Cross-Pane Copy/Move (MC-style F5/F6)
这个是我最想补的点之一.
原版 Yazi 本来就有 y / p 这种 yank/paste 工作流, 其实很好用. 但如果你已经习惯了双栏管理器里”左边选中, 直接 F5 复制到右边; 或者 F6 直接移动到右边”这种操作, 还是会希望它是一个一键动作, 而不是先 yank, 再切 pane, 再 paste.
这里直接提供了:
F5: 复制当前选中项到另一栏当前目录F6: 移动当前选中项到另一栏当前目录
它们走的是直接跨栏操作, 不经过 yank register. 如果当前没有显式 selection, 就对 hover 的那个文件生效. 这样做的好处是, 它不会打断原来 y / p 的使用习惯, 但在双栏场景里又能提供更像 MC 的肌肉记忆.
顺手也把 F7 / F8 对上了更传统的语义: F7 创建文件或目录, F8 删除到回收站; 如果你想永久删除, 还是用原本的 D. 这一套按下来, 终端里的文件整理体验确实会更像老派双栏管理器.
4. Single/Dual Toggle
虽然我大部分时候想要双栏, 但也不是任何时候都必须同时看到两边.
Ctrl-w o 用来在双栏和单栏之间切换. 这里我比较在意的一点是: 切成单栏时, 另一栏不是被重置, 而只是隐藏. 它原来的目录、cursor、selection、history 都会保留下来. 再切回双栏时, 状态会原样恢复.
这意味着单栏模式不是”退出双栏”, 而更像”暂时把注意力集中到当前这一栏”. 需要全宽查看内容的时候可以单栏, 需要继续做双目录操作的时候再切回双栏, 不会有上下文丢失的问题.
另外在单栏模式下, pane 的概念其实还在. 你仍然可以切换 active pane, 也仍然可以把 F5 / F6 的目标指向那个当前隐藏着的 pane. 这一点我自己觉得挺实用.
5. Preview Toggle
双栏模式默认优先目录浏览, 但有时候还是会想临时看一下预览.
Ctrl-w p 用来切换双栏下的两种布局:
- 目录模式:
parent + current - 预览模式:
current + preview
也就是说, 你不需要退出双栏, 就能把两边同时切成更偏”查看内容”的布局. 平时整理目录时用目录模式, 需要确认文件内容时切到预览模式, 这两种都保留在双栏工作流里.
我感觉这比只保留一种固定双栏布局更顺手. 不然的话, 双栏很容易变成一个只能”搬文件”的模式, 而不是一个真正能长期使用的主界面.
6. Undo/Redo
这个功能也很关键.
双栏管理器里 F5 / F6 当然很顺手, 但真要放心大胆地整理文件, 还是得有”后悔药”. 现在 dual-yazi 已经支持 u 撤销和 Ctrl-r 重做. 不只是 rename、create、copy、move, trash 这些普通文件操作能撤销, 连双栏里的 copy_to / move_to 也会进 undo 栈.
当然, 这个 undo 目前也不是万能的. 像永久删除 D, shell command, bulk rename, plugin 自己做的操作, 现在都不在这套撤销范围里. 不过对于我最常用的那批文件整理动作来说, 已经很够用了.
怎么试
目前这还是一个 fork, 我暂时没有单独给它做完整 release 流程. 如果你本来就会从源码装 Rust 项目, 直接试就行:
git clone https://github.com/jtianling/dual-yazi.git
cd dual-yazi
cargo install --path ./yazi-fm
yazi
如果你已经在用原版 Yazi, 也完全可以把它当成一个实验分支来试. 喜不喜欢双栏工作流, 基本上用半小时就能判断出来.
总之, 我不是想证明”双栏一定比单栏先进”, 而是想把一种我自己已经用了很多年的文件管理习惯, 补回到一个我本来就很喜欢的现代工具里. 对我来说, dual-yazi 更像是把 Yazi 往我自己的 daily workflow 推近了一步.
如果你也喜欢 Yazi 的速度、预览和插件能力, 但同时又舍不得双栏管理器那种非常直接的操作感, 可以试试看这份 fork.
分类:
编程
标签:
Rust
Yazi
TUI
文件管理器
开源软件
By 九天雁翎
2026年03月17日 | 九天雁翎的博客