跳到正文
像素日志
返回

Yazi 入门:把文件管理搬回终端

编辑本页

Yazi 是一个用 Rust 写的终端文件管理器,作者 sxyazi, 2024 年初发布。特点是异步架构(大目录滚动不卡)、内置图片/视频/PDF 预览、支持 Lua 插件。 版本号是日历式的,现在装到的是 26.8.15(2026 年 8 月),下文所有键位和配置都以它为准。

这篇写给没用过终端文件管理器的人:从安装到”能舒服地日常使用”需要哪些步骤。 如果你想知道它比 ls + cd 好在哪,结论先放在前面——文件操作全程不离开键盘, 而且能直接预览内容再决定要不要打开

安装

brew install yazi

同时建议装上这四个,yazi 的搜索和跳转会直接用它们(缺了功能就降级):

brew install fd ripgrep zoxide fzf

装完直接敲 yazi 就能用,零配置。但先别急着用,下一节才是最重要的一步。

第一件事:退出时带回当前目录

终端文件管理器有个先天限制:它是 shell 的子进程,改不了父 shell 的工作目录。 也就是说你在 yazi 里 cd 到天涯海角,按 q 退出后,shell 还站在原地。 这也是很多人试了五分钟就放弃的原因。

解法是官方推荐的包装函数。在 ~/.zshrc 里加:

function y() {
	local tmp="$(mktemp -t "yazi-cwd")" cwd
	yazi "$@" --cwd-file="$tmp"
	if cwd="$(command cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
		builtin cd -- "$cwd"
	fi
	rm -f -- "$tmp"
}

原理:yazi 退出时把当前目录写进 --cwd-file 指定的临时文件,函数读出来替你 cd 过去。 之后y 而不是 yazi 启动,退出时 shell 会自动跟到你看的那个目录。

配套记住一对按键:q 退出并带回目录,Q 退出但留在原地。 偶尔只是进去看一眼、不想让 shell 跳走,就用 Q

第一天需要的按键

yazi 默认键位是 vim 风格,但方向键也能用,新手不至于卡死。最小集:

操作按键说明
上下移动j / kgg 到顶部,G 到底部
进/退目录l / h目录就是一个文件,Enter 也能进
前进/后退L / H历史,像浏览器
打开文件oO 弹菜单选打开方式
选多个Space选中并下移一行;v 进可视模式批量选
复制 / 剪切 / 粘贴y / x / p和 vim 一个思路;Y 取消
删到废纸篓dD永久删除,不经过废纸篓
新建a文件名以 / 结尾就是建目录
重命名r
隐藏文件.按一次开关
执行 shell 命令;会对选中文件生效;: 阻塞等待输出

一个容易从 vim 带过来的误解:d 在 vim 里是剪切,在 yazi 里是删除(进废纸篓)。 剪切是 x

滚预览内容用 K / J(注意大写),长文档往下翻就靠它们。忘了按键按 ~F1 打开帮助,所有键位都能在里面查,这一条比背表格重要。

找文件

这是 yazi 相比 Finder/ls 拉开差距的地方:

日常组合拳:Z 跳到项目目录,s 敲半个文件名,o 打开,全程不过手。

预览

光标停在哪,右边预览面板就渲染什么。开箱支持文本、图片、视频(截帧)、PDF、压缩包(看目录结构)、字体等。

两个前提要知道:

  1. 图片预览依赖终端的图形协议(Kitty/Sixel/iTerm2 三种之一)。 Ghostty、Kitty、WezTerm 都支持;macOS 自带的 Terminal.app 不支持,图片会显示不出来。 我主力终端是 Ghostty(之前写过),所以这块是零配置。
  2. 部分格式需要额外装工具,缺了就只当普通文件处理:
brew install ffmpegseven poppler 7zip unar
# 分别管:视频截帧、PDF、压缩包

另外 Tab 会打开 “spot” 面板,显示悬停文件的元信息(尺寸、MIME、图片分辨率等), 不确定一个文件是什么的时候很方便。

配置入门

配置都在 ~/.config/yazi/ 下,三个文件,全部可选,没有就不生效、用默认值:

文件管什么
yazi.toml行为:打开方式、预览器、排序、tab 行为
keymap.toml键位
theme.toml颜色主题

改完即时生效,不用重启。想看当前版本的完整默认配置,去仓库的 preset 目录对着抄最稳, 比搜索引擎里的旧文章可靠。

主题在 yazi 里叫 flavor,用包管理器装:

ya pkg install yazi-rs/flavors:catppuccin-latte

插件同样走 ya pkg install,装完在配置里引用。

一个实际例子:Markdown 用 glow 渲染

默认的 Markdown 预览是当纯文本显示,我想看渲染后的样子(标题、加粗、代码高亮), 所以做了两件事:预览面板用 glow 渲染; 回车打开也走 glow,分页用 less

~/.config/yazi/yazi.toml:

# 预览面板:md 交给 glow 插件渲染,而不是当纯文本
[plugin]
prepend_previewers = [
  { url = "*.md", run = "glow" },
]

# 回车打开:glow 渲染 + less 分页,q 退回 yazi
[opener]
markdown = [
  { run = 'CLICOLOR_FORCE=1 glow --style=auto %s | less -R', block = true, for = "unix", desc = "glow 渲染阅读" },
]

[open]
# 回车用第一个(glow);O 菜单里还有 vim 编辑等选项
prepend_rules = [
  { url = "*.md", use = [ "markdown", "edit", "open", "reveal" ] },
]

社区有个现成的 Reledia/glow.yazi,但停更了, 不适配新版 API,所以照着内置的 json.lua 自己写了一个, 放在 ~/.config/yazi/plugins/glow.yazi/main.lua,核心就一段——起一个 glow 子进程, 把 ANSI 输出按预览区宽度换行后画出来:

function M:peek(job)
	local child = Command("glow")
		:arg({ "--style", "auto", "--width", tostring(job.area.w), tostring(job.file.url) })
		:env("CLICOLOR_FORCE", "1")
		:stdout(Command.PIPED)
		:stderr(Command.NULL)
		:spawn()

	if not child then
		return require("code"):peek(job)
	end
	-- 后面就是逐行读取、ui.lines 按宽度换行、
	-- 用 job.skip / job.limit 实现 K/J 滚动,约 40 行

这个例子值得新手注意两件事:

为什么不用 glow -p glow 自带分页,但 yazi 的 opener 里 stdin 不是 tty, -p 会立刻退出,所以改成管道给 less -R。TUI 程序互相嵌套时这类问题很常见。

API 改名了。 社区教程里的老写法在这代已经全部失效: argsargpreview_widgetspreview_widgetmgr_emitemit、 opener 占位符 $1%s。搜到的插件教程报 Lua 错误,大概率就是版本对不上。 排查方法:对照你装的那个版本的内置 json.lua 看 API 长什么样, 不真开终端也能测——用 tmux detached session 跑 yazi 再 capture-pane 抓输出。

和其他终端文件管理器比

链接


编辑本页
分享这篇文章:

💬 评论


上一篇
把主终端换成 Ghostty 之后