💥 Blazing fast terminal file manager written in Rust, based on async I/O.
This version introduces a new DDS (Data Distribution Service) aimed at facilitating communication and state synchronization between multiple Yazi instances, as well as state persistence.
It's built on a client/server architecture (without the need for running additional server processes), and deeply integrates with a Lua-based publish-subscribe model.
It also provides a set of new command-line options for interaction, such as ya pub
, ya pub-static
, yazi --local-events
, yazi --remote-events
, and currently used for:
https://github.com/sxyazi/yazi/assets/17523360/c1e78168-c604-4390-ba55-e990b510baba
Change Yazi's CWD
to PWD
on subshell exit
https://github.com/sxyazi/yazi/assets/17523360/fe571f77-1922-4d72-99f8-3a341c2c9046
Integration with the new yazi.nvim
plugin: subscribing to file deletion, movement, and renaming events through yazi --local-events
to keep Neovim's buffer/LSP in sync
bookmarks.yazi
plugin: Saving bookmarks added by the user through the persistence feature provided by DDS
cd
and scrolling through the file list. For certain slow external devices, Yazi would experience noticeable lagginess, which has now been addressed, see https://github.com/sxyazi/yazi/pull/877 for more detailsfzf
and zoxide
as plugins for better flexibility: fzf
and zoxide
have added more runtime error handling. zoxide
now supports the new update_db
feature, which automatically adds Yazi's CWD
to zoxide
when navigating. To enable it, add the following to your init.lua
:
require("zoxide"):setup {
update_db = true,
}
cd
path completionopen
, shell
, or bulk rename on multiple selected filesThe plugin system has also seen some improvements:
ya.dbg()
and ya.err()
now support printing any type of dataps
API as a carrier for DDS interactionya.manager_emit()
now supports passing Url
typeBTreeSet
for selected files to maintain order by @sxyazi in https://github.com/sxyazi/yazi/pull/799
Opener
with Cow
to avoid unnecessary memory reallocations when opening files by @sxyazi in https://github.com/sxyazi/yazi/pull/805
SIGTERM
signal even when Yazi is in the background and has passed control of the terminal to the spawned process by @sxyazi in https://github.com/sxyazi/yazi/pull/797
stderr
by @sxyazi in https://github.com/sxyazi/yazi/pull/819
--locked
builds by @sxyazi in https://github.com/sxyazi/yazi/pull/821
tracing_subscriber
to clean up the logs by @Rolv-Apneseth in https://github.com/sxyazi/yazi/pull/832
ya.dbg()
and ya.err()
debugging functions by @sxyazi in https://github.com/sxyazi/yazi/pull/835
YAZI_FILE_ONE
to the built-in file
previewer by @sxyazi in https://github.com/sxyazi/yazi/pull/846
cmd.exe
not responding to correct CSI sequences due to ConPTY by @sxyazi in https://github.com/sxyazi/yazi/pull/845
BufWriter
to Stderr
to avoid frequent system calls and increase rendering frame rate by @sxyazi in https://github.com/sxyazi/yazi/pull/849
require()
and ya.sync()
to Rust to avoid plugin information initialization process by @sxyazi in https://github.com/sxyazi/yazi/pull/853
sender
property to the DDS payload by @sxyazi in https://github.com/sxyazi/yazi/pull/855
cd
event in DDS will now also be triggered when the tab is first created by @sxyazi in https://github.com/sxyazi/yazi/pull/861
Stderr
to allow using Stdout
as the carrier of DDS payload without an ANSI sequence response timeout by @sxyazi in https://github.com/sxyazi/yazi/pull/867
is_exec
and is_sticky
to Cha
bindings by @sxyazi in https://github.com/sxyazi/yazi/pull/875
fzf
as a built-in plugin by @sxyazi in https://github.com/sxyazi/yazi/pull/884
--orphan
option to the shell
command by @sxyazi in https://github.com/sxyazi/yazi/pull/887
$@
, $*
) of shell command under opener rules are out of order by @sxyazi in https://github.com/sxyazi/yazi/pull/890
move
, trash
, and delete
event kinds to DDS by @mikavilpas in https://github.com/sxyazi/yazi/pull/880
YAZI_ID
environment variable by @sxyazi in https://github.com/sxyazi/yazi/pull/895
globset
to reduce CPU time spent on matching icons by @sxyazi in https://github.com/sxyazi/yazi/pull/908
/
and \
on Windows by @ndtoan96 in https://github.com/sxyazi/yazi/pull/909
ya send
command to allow standalone client processes to communicate with DDS from the command line by @sxyazi in https://github.com/sxyazi/yazi/pull/913
tab_create
command is called without specifying a path
parameter by @sxyazi in https://github.com/sxyazi/yazi/pull/917
ya
command by @sxyazi in https://github.com/sxyazi/yazi/pull/919
--chosen-file
flag by @mikavilpas in https://github.com/sxyazi/yazi/pull/920
ya send
into ya pub
and ya pub-static
to make it more ergonomic by @sxyazi in https://github.com/sxyazi/yazi/pull/933
session.lua
plugin by @sxyazi in https://github.com/sxyazi/yazi/pull/940
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.2.4...v0.2.5
This version adds support for cross-directory selection, which means you can select files from multiple different directories and perform operations on them.
Yazi's accessibility also has been greatly improved, including adding color to icons, a new file selection counter, improved visibility of hovered files, enhanced keyword recognition in finds, long path truncation, and a new color system.
As for the plugin system, we have rewritten Yazi's Lua binding using Unsafe Rust, making the initialization process of plugins very inexpensive by lazy-loading app data. This fundamentally solves the difficulty of cross-tab data access, making future plans for dual-pane/tree-view possible, as they can be efficiently implemented as a plugin!
In addition, loaded plugins are now cached, meaning that plugin loading speed will be faster. The improvement in plugin performance directly reflects the overall performance of Yazi because in Yazi, plugins are first-class citizens, with most UI being drawn by built-in UI plugins, and previews and preloads also being done through plugins, which is the biggest driving force for us to constantly improve plugin performance.
Finally, we have added some new APIs that we hope plugin developers will find useful:
ya.input()
: Request user input;ya.notify()
: Send a foreground notification to the user, which is useful for background tasks;ya.hide()
: Request terminal control and hide Yazi in the background. This is useful for calling interactive programs like fzf, zoxide, etc., in plugins;ui.Clear()
: Clear a specific UI area, which is useful for implementing custom UI layouts.To implement ya.notify()
, we have added a new Vim-like notification component:
https://github.com/sxyazi/yazi/assets/17523360/0765ecf4-9d90-49da-90d1-6b5d9a27901c
For more changes, please read "What's Changed" below.
The exec
property will be deprecated in the next major version, v0.3, and will be replaced by run
.
Please replace all instances of exec = ...
with run = ...
in your yazi.toml
and keymap.toml
if any.
<Home>
and <End>
to [input]
keymap by @grig-iv in https://github.com/sxyazi/yazi/pull/655
<Delete>
to [input]
keymap by @grig-iv in https://github.com/sxyazi/yazi/pull/665
prepend_rules
and append_rules
for [icon]
by @grig-iv in https://github.com/sxyazi/yazi/pull/670
scrolloff
option to [manager]
by @dedukun in https://github.com/sxyazi/yazi/pull/679
--hovered
to the open
command by @fakerepic in https://github.com/sxyazi/yazi/pull/687
ya.sync
in a sync plugin call by @dedukun in https://github.com/sxyazi/yazi/pull/702
yazi-boot
crate by @sxyazi in https://github.com/sxyazi/yazi/pull/728
Display
over ToString
by @sxyazi in https://github.com/sxyazi/yazi/pull/734
$0
for shell and opener by @rrveex in https://github.com/sxyazi/yazi/pull/738
[notify]
section to the theme.toml
to configure the notify
component's style by @evpeople in https://github.com/sxyazi/yazi/pull/749
prepend_rules
and append_rules
for [open]
in yazi.toml
by @lpnh in https://github.com/sxyazi/yazi/pull/754
YAZI_FILE_ONE
environment variable for file(1)
path by @ndtoan96 in https://github.com/sxyazi/yazi/pull/752
add_many()
/remove_many()
to the visual mode items for selection conflict detecting by @sxyazi in https://github.com/sxyazi/yazi/pull/758
%0
as the hovered file for Windows by @sxyazi in https://github.com/sxyazi/yazi/pull/761
ya.input()
plugin API by @sxyazi in https://github.com/sxyazi/yazi/pull/762
run
property by @sxyazi in https://github.com/sxyazi/yazi/pull/773
Ctrl-[
as an escape key by @hankertrix in https://github.com/sxyazi/yazi/pull/763
ya.notify()
plugin API by @sxyazi in https://github.com/sxyazi/yazi/pull/780
ui.Clear
component for UI plugins by @sxyazi in https://github.com/sxyazi/yazi/pull/786
<C-p>
and <C-n>
to the select component for moving the cursor up/down by @hankertrix in https://github.com/sxyazi/yazi/pull/779
cx.yanked
plugin API by @sxyazi in https://github.com/sxyazi/yazi/pull/788
selected
, yanked
state when available by @sxyazi in https://github.com/sxyazi/yazi/pull/791
ya.hide()
plugin API by @sxyazi in https://github.com/sxyazi/yazi/pull/792
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.2.3...v0.2.4
This version optimizes the loading speed for large directories - Yazi is now ~2.5 times faster than before. For a directory benchmark containing 500,000 files (See https://github.com/sxyazi/yazi/pull/599 for details):
eza -l took 19.03 seconds
ls -l took 10.99 seconds
yazi took 4.79 seconds
The release also adds support for previewing images over SSH, this allows you to preview images directly on your local terminal by running Yazi on a server, a highly anticipated new feature.
As for the plugin system, many improvements have been also made, such as supporting passing arguments, plugin-specific state persistence, and listening to key events in the plugin. During this period, we added a new Resources page that documents plugins contributed by the community. Thanks to the lovely plugin authors for creating and sharing these awesome plugins!
Lastly, some great news: Yazi has been featured on The Linux Cast - this is Yazi's first appearance in video format, and I am really excited and proud to see more and more people beginning to notice and take an interest in Yazi!
--cursor=start
and the filename is too long by @sxyazi in https://github.com/sxyazi/yazi/pull/575
image_quality
and sixel_fraction
options to allow users to configure the image preview quality by @sxyazi in https://github.com/sxyazi/yazi/pull/576
Cmd
instead of Exec
by @sxyazi in https://github.com/sxyazi/yazi/pull/604
unyank
by @15cm in https://github.com/sxyazi/yazi/pull/313
trash
crate optional on Android by @sxyazi in https://github.com/sxyazi/yazi/pull/600
ya.which()
by @sxyazi in https://github.com/sxyazi/yazi/pull/617
app_emit
and manager_emit
accepts boolean, integer, and number as option values by @sxyazi in https://github.com/sxyazi/yazi/pull/625
args
to the entry
method for better future optimization possibilities by @sxyazi in https://github.com/sxyazi/yazi/pull/627
backspace
command by @Rolv-Apneseth in https://github.com/sxyazi/yazi/pull/630
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.2.2...v0.2.3
This version fixes many bugs and adds support for two new platforms: Windows ARM64 and Ubuntu (via Snap).
The release also introduces a new way of configuring keymaps. You can now customize your key bindings by using prepend_keymap
or append_keymap
without having to copy the entire keymap.toml
file. (See this example. I am a Colemak keyboard layout user, which requires remapping many keys, but it's still neat.)
As for performance, this version rewrites Yazi's event system, allowing multiple renderings triggered by events to be merged into a single rendering more efficiently, saving CPU resources. You may notice that the preview pane no longer flickers when switching directories, as unnecessary intermediate rendering steps are skipped.
For packaging, this version adds yazi.desktop
and logo.png
files, which can be used in packaging scripts for different platforms.
prepend_keymap
and append_keymap
for configuring mixing by @sxyazi in https://github.com/sxyazi/yazi/pull/546
<Enter>
key by @sxyazi in https://github.com/sxyazi/yazi/pull/565
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.2.1...v0.2.2
Sorry, this is an urgent fix. The newly added rename --cursor=before_ext
may cause a crash when renaming files with Unicode characters, affecting new users in CJK languages.
This version also adds support for trash v3.2.1, addressing a bug where the trash bin couldn't be located correctly.
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.2.0...v0.2.1
This version has added support for custom previewers and custom preloaders, as well as completed most of the work on the concurrent plugin system.
In addition, it includes many performance optimizations, such as rewriting the entire file system, refactoring the entire UI rendering architecture, enhancing the task scheduling system, and implementing partial rendering for frequently updated components.
This version also introduces many meaningful new features, such as path auto-completion, real-time file filtering, Kitty Unicode placeholders protocol support. Read the changelog below for details.
This is a breaking change version, please refer to our upgrade guide: Migrating to Yazi v0.2.0
Folder:icon()
API to make it easier for users to extend icons by @sxyazi in https://github.com/sxyazi/yazi/pull/301
\x2B[K
to be compatible with GNOME VTE by @linsui in https://github.com/sxyazi/yazi/pull/309
shell.nix
from stable to nightly by @15cm in https://github.com/sxyazi/yazi/pull/314
WAYLAND_DISPLAY
and DISPLAY
to detect Wayland/X11 when XDG_SESSION_TYPE
is not set by @sxyazi in https://github.com/sxyazi/yazi/pull/312
jq
previews empty when the user sets tab_size=8
by @sxyazi in https://github.com/sxyazi/yazi/pull/320
.vscode
and .idea
to .gitignore by @XOR-op in https://github.com/sxyazi/yazi/pull/322
USERPROFILE
to retrieve readable path on Windows by @sravioli in https://github.com/sxyazi/yazi/pull/331
reveal
command by @sxyazi in https://github.com/sxyazi/yazi/pull/341
tmux
through Unicode placeholders by @sxyazi in https://github.com/sxyazi/yazi/pull/365
symlink_metadata
instead of metadata
by @sxyazi in https://github.com/sxyazi/yazi/pull/367
Input
and Select
positions customizable by @Hanaasagi in https://github.com/sxyazi/yazi/pull/361
yazi --version
by @Hanaasagi in https://github.com/sxyazi/yazi/pull/393
folder_offset
specified by @sxyazi in https://github.com/sxyazi/yazi/pull/416
LuaJIT
in riscv64 and loongarch64 architecture by @eatradish in https://github.com/sxyazi/yazi/pull/439
set_hook
by @sxyazi in https://github.com/sxyazi/yazi/pull/459
--follow
option to paste
command by @eatradish in https://github.com/sxyazi/yazi/pull/436
quit
command by @aserowy in https://github.com/sxyazi/yazi/pull/484
--empty
and --cursor
options to the rename
command by @Akmadan23 in https://github.com/sxyazi/yazi/pull/513
YAZI_LEVEL
env variable for shells by @Isti115 in https://github.com/sxyazi/yazi/pull/514
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.1.5...v0.2.0
This is the biggest update ever, with 36 new features, 24 bug fixes, and 3 performance improvements.
Thank you to every contributor for making Yazi better and better!
Url
instead of PathBuf
by @sxyazi in https://github.com/sxyazi/yazi/pull/107
Ctrl-Z
) by @sxyazi in https://github.com/sxyazi/yazi/pull/120
show_hidden
not properly applied to hovered folder by @sxyazi in https://github.com/sxyazi/yazi/pull/124
Input
streamable by @sxyazi in https://github.com/sxyazi/yazi/pull/127
V
, D
, C
keybinding for Input component by @sxyazi in https://github.com/sxyazi/yazi/pull/139
jq
is not installed by @ndtoan96 in https://github.com/sxyazi/yazi/pull/151
\s
to make it sensitive by @sxyazi in https://github.com/sxyazi/yazi/pull/156
expand_path
by @sxyazi in https://github.com/sxyazi/yazi/pull/165
current
by @sxyazi in https://github.com/sxyazi/yazi/pull/172
trash
optional by @sxyazi in https://github.com/sxyazi/yazi/pull/178
Shift
key behavior on Unix and Windows by @ndtoan96 in https://github.com/sxyazi/yazi/pull/174
force
option added for the remove
command, which does not show the confirmation dialog on trashing/deleting by @sxyazi in https://github.com/sxyazi/yazi/pull/173
orphan
option for opener rules, to keep the process running even when Yazi exited by @sxyazi in https://github.com/sxyazi/yazi/pull/216
arrow
percentage supported, and new Vi-like <C-u>
, <C-d>
, <C-b>
, and <C-f>
keybindings added by @TD-Sky in https://github.com/sxyazi/yazi/pull/213
BackTab
support by @sxyazi in https://github.com/sxyazi/yazi/pull/209
force
option for creating and renaming by @sxyazi in https://github.com/sxyazi/yazi/pull/208
n/N
to keep with Vim's conventions by @sxyazi in https://github.com/sxyazi/yazi/pull/238
--no-cwd-file
option to quit
command for flexible cwd-file setting by @XOR-op in https://github.com/sxyazi/yazi/pull/245
cd
path by @ndtoan96 in https://github.com/sxyazi/yazi/pull/241
application/x-wine-extension-ini
to text mime by @ndtoan96 in https://github.com/sxyazi/yazi/pull/259
Bar
component, and make border styles customizable by @sxyazi in https://github.com/sxyazi/yazi/pull/278
$TERM
value of foot-extra
for foot by @sxyazi in https://github.com/sxyazi/yazi/pull/277
Manager
component for better style extensions by @sxyazi in https://github.com/sxyazi/yazi/pull/284
SIGINT
signal of processes with orphan=true
to their parent by @sxyazi in https://github.com/sxyazi/yazi/pull/290
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.1.4...v0.1.5
Select
component by @sxyazi in https://github.com/sxyazi/yazi/pull/65
xclip
and xsel
support by @sxyazi in https://github.com/sxyazi/yazi/pull/74
EDITOR
environment variable, close #90 by @sxyazi in https://github.com/sxyazi/yazi/pull/91
cache_dir
option by @sxyazi in https://github.com/sxyazi/yazi/pull/96
YAZI_CONFIG_HOME
env variable by @sxyazi in https://github.com/sxyazi/yazi/pull/97
--cwd
in favor of the positional argument by @sxyazi in https://github.com/sxyazi/yazi/pull/100
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.1.3...v0.1.4
This is the biggest update ever, with 22 new features, 9 bug fixes, and 5 performance improvements.
Thank you to every contributor for making Yazi better!
yazi-bin
AUR package by @g-plane in https://github.com/sxyazi/yazi/pull/16
pdftoppm
by @Eric-Song-Nop in https://github.com/sxyazi/yazi/pull/18
md5
wtih md-5
by @TD-Sky in https://github.com/sxyazi/yazi/pull/21
max_width
is set too large by @sxyazi in https://github.com/sxyazi/yazi/pull/28
display_name
to opener by @XYenon in https://github.com/sxyazi/yazi/pull/31
inode/x-empty
by @sxyazi in https://github.com/sxyazi/yazi/pull/36
show_hidden
not working by @sxyazi in https://github.com/sxyazi/yazi/pull/47
shell
by @fzdwx in https://github.com/sxyazi/yazi/pull/48
BufWriter
by @sxyazi in https://github.com/sxyazi/yazi/pull/55
let-else
by @sxyazi in https://github.com/sxyazi/yazi/pull/56
RoCell
to replace OnceCell
by @sxyazi in https://github.com/sxyazi/yazi/pull/63
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.1.2...v0.1.3
Esc
, and the new op of Cut
by @sxyazi in https://github.com/sxyazi/yazi/pull/6
BTreeMap
to improve performance by @sxyazi in https://github.com/sxyazi/yazi/pull/7
Full Changelog: https://github.com/sxyazi/yazi/compare/v0.1.1...v0.1.2