Releases: sxyazi/yazi
v0.4.1
This is a quick patch version with 4 fixes:
- Fixed an issue where Yazi would freeze when waiting for terminal response, in old tmux versions (v3.2a or lower), or 2-layer nested terminal setup (tmux -> Neovim's
:terminal
-> Yazi). - Fixed a bug in the Überzug++ backend where certain image dimension parsing failed, preventing images from displaying.
- Fixed a build failure for Android 32-bit architectures.
- Fixed an issue with the preset
archive
andjson
plugins not handling CRLF properly on Windows.
What's Changed
- fix: disable passthrough when the user launches Yazi in Neovim inside tmux by @sxyazi in #2014
- refactor: replace
format!
withconcat!
for string literals by @Integral-Tech in #2012 - fix: correctly handle CRLF on Windows in preset
archive
andjson
plugins by @sxyazi in #2017 - fix: failed to parse certain image dimensions for Überzug++ backend by @sxyazi in #2020
- chore: bump version to 0.4.1 by @sxyazi in #2022
Full Changelog: v0.4.0...v0.4.1
v0.4.0
This is the biggest release ever, with 53 new features, 41 fixes, and 12 performance optimizations.
The main focus of this release is improving the plugin system, and we’ve made some adjustments to certain APIs based on real-world usage to better support future extensibility. This release is a key step in moving the plugin system from BETA to stable!
This is a breaking change release, so please make sure to read: Migrating to Yazi v0.4.0
Spotter
#1802 introduces the concept of "spotter". When you "spot" a file, a popup will show up with metadata about that file.
For example, it can display the mime type and size of a regular file, the dimensions and color space of an image, the duration and resolution of a video, or the line count of a code file, etc.
You can easily copy this info with a simple keystroke or quickly swipe through files in the spot window.
What's even cooler is that users can set custom spotters for different file types, and plugin developers can use Lua APIs to build various spotters, just like with previewers!
output.mp4
Support for Transparent Image Preview
Transparent image previews are now supported in #1556 (Thanks to @diegodorado), and it works across all 4 image backends Yazi supports (kitty graphics-protocol, Inline images protocol, Sixel graphics format, Überzug++).
Auto Switch Between Dark and Light Icons/Flavors Based on Terminal Background
#1946 adds dark/light mode support — Yazi will automatically detect your terminal's color scheme and choose the appropriate icon color and flavor.
In theme.toml
, the [flavor]
section now includes two new attributes, dark
and light
, to allow setting different flavors for light and dark modes:
# theme.toml
[flavor]
dark = "dracula"
light = "one-light"
New ya emit
and ya emit-to
Subcommands to Emit Commands to a Specific Instance
Two new subcommands, ya emit
and ya emit-to
, have been added to the ya
CLI tool in #1946.
They allow you to send commands from outside Yazi (e.g., from your shell) to run on a specific Yazi instance for better interactivity.
The new ya emit
subcommand allows users to send a command to the current Yazi instance. The format is:
ya emit <command> <args>
For example:
ya emit cd /tmp
ya emit reveal /tmp/foo
Just like you would write them in your keymap.toml
file! You can also send commands to a specific remote instance using ya emit-to
:
ya emit-to <receiver> <command> <args>
For example:
ya emit-to "$YAZI_ID" cd /tmp
Support Passing Arguments to Previewer/Preloader/Spotter/Fetcher
With #1979, you can now pass arguments to previewers, preloaders, spotters, and fetchers when configuring them:
# yazi.toml
[plugin]
prepend_previewers = [
{ mime = "image/*", run = 'my-plugin test --foo --bar=baz' }
]
prepend_preloaders = [
{ mime = "image/*", run = 'my-plugin test --foo --bar=baz' }
]
prepend_spotters = [
{ mime = "image/*", run = 'my-plugin test --foo --bar=baz' }
]
prepend_fetchers = [
{ id = "test", mime = "image/*", run = 'my-plugin test --foo --bar=baz' }
]
This makes them much more flexible, meaning the same plugin can behave differently based on different arguments, tailored to the user's preferences!
Suggest Keywords in the Header When a Finder Is Active
A new keyword indicator has been added to the header, in #1847, letting users know the current finding state with real-time feedback:
screenshot-002086.mp4
Allow Disabling Certain Preset Keybinds with the New noop
Virtual Command
A new noop
command has been introduced in #1882:
[[manager.prepend_keymap]]
on = [ "g", "c" ]
run = "noop"
This allows users to disable specific default keybindings, and the disabled keys won’t appear in the "which key" component or the help menu.
Make the Built-in extract
Plugin Support Compressed Tarballs (*.tar.gz
, *.tar.bz2
, etc.)
The built-in extract plugin now has experimental support for extracting compressed tarballs, making it more convenient for users who frequently work with .tar
files.
Thanks to @DirkFi for his excellent work on #1583
Prioritize Paths That Need to Be Processed First During Bulk Renaming
The bulk renaming feature now has smart conflict resolution, done in #1801 (thanks to @yw1ee).
For example, if you’re renaming a list of files:
1
2
3
And renaming them to:
1 -> 2
2 -> 3
3 -> 4
Previously, Yazi would stop with an error when trying to rename 1 -> 2
because 2
already exists.
Now, it will intelligently pick files that won’t conflict and process them in order, so in this case, it will rename them like this:
3 -> 4
2 -> 3
1 -> 2
Fallback to CSI 16 t
for Terminals That Don’t Support TIOCGWINSZ
All terminals on Windows (MS Terminal, WezTerm for Windows) do not support TIOCGWINSZ
because Windows doesn't have ioctl
.
Some terminals based on node-pty
also don't support it (like Tabby, VSCode, Hyper, etc.).
#2004 falls back to CSI 16 t
when TIOCGWINSZ
is unavailable to provide better image size calculation for previews.
screenshot-002175.mp4
Launch From Preset Settings If the User’s Config Cannot Be Parsed
Now, if Yazi can’t parse your config file because of invalid values, it will ask if you want to launch with the default settings instead of failing to start.
This improves the user experience. Done in #1832
Other improvements
These are a few of my favorite features. For a complete list of improvements in Yazi 0.4, check out the full changelog below.
What's Changed
- fix: match icon by extension case-insensitive by @sxyazi in #1614
- refactor: privatize
url
of theFile
by @sxyazi in #1619 - perf: introduce URN to speed up large directory file sorting by @sxyazi in #1622
- fix: set
allow-passthrough
always toall
instead ofon
to prevent overriding a user setting with a higher priorityall
by @sxyazi in #1626 - fix: set a dedicated
Mimetype
agency to reconcile regular files and search results by @sxyazi in #1627 - feat: make the builtin
extract
plugin support compressed tarballs (*.tar.gz
,*.tar.bz2
, etc.) by @DirkFi in #1583 - feat: support transparent image preview by @diegodorado in #1556
- perf: avoid unnecessary allocations in base64 encoding of IIP by @sxyazi in #1639
- perf: introduce URN to speed up large directory locating by @sxyazi in #1648
- feat: support setting different input titles for
create --dir
by @Tyarel8 in #1650 - perf: introduce URN to speed up large directory file updates by @sxyazi in #1652
- refactor: ensure that each
Url
contains the full location information by @sxyazi in #1659 - feat: support calling methods in builtin plugins with arbitrary types of arguments (
self
can now be omitted) by @sxyazi in #1666 - feat: add the
area()
API for renderable elements by @sxyazi in #1667 - fix: one file's mime-type changed multiple times without triggering a preview again by @sxyazi in #1682
- fix:
enter
andleave
commands should treat the search results as regular entities by @sxyazi in #1687 - fix:
magick
previewer for multi-layered image files with-flatten
argument by @v3natio in #1684 - feat: improve jemalloc memory efficiency by @dm9pZCAq in #1689
- feat: adapt for image preview in the Rio terminal by @raphamorim in #1690
- fix: increase the revision when there is a change in
Urn
on updating by @sxyazi in #1691 - feat: allow overriding and rewriting the sync methods of builtin plugins by @sxyazi in #1695
- feat: add more context to error messages by @sxyazi in #1701
- fix: replace control characters to printable characters in plain text preview by @sxyazi in #1704
- feat: async micro task initialization error handling by @sxyazi in #1710
- feat!: make
backspace
command not close the input even when value is empty by @XYenon in #1680 - feat: reuse the
code
previewer seeking behavior forjson
,archive
, andempty
by @sxyazi in #1721 - fix: temporarily disable TIFF decoding by @sxyazi in...
v0.3.3
This version fixes a regression from the previous release that caused some keys to stop working. And it resolves a long-standing issue where the file list couldn't refresh automatically in Windows WSL.
This version also introduces the following three new features:
Git integration
Show the status of Git file changes as a linemode in the file list.
Feel free to use it and report any issues! For now, you need to manually install it (pretty easy to do) from https://github.com/yazi-rs/plugins/tree/main/git.yazi. In the future, it will be included as one of Yazi's built-in plugins.
screenshot-001986.mp4
size
linemode supports displaying the number of files in a directory
#1591 updates the size
linemode for directories to support displaying the number of files within the directory instead of leaving it blank as before.
If size information is available for the directory (triggered when sorting by size), that information will be shown as a priority.
screenshot-001992.mp4
Windows Terminal support for image previews
Windows Terminal Preview v1.22.2362.0 now supports the Sixel image format. Yazi provided an adaptation for this in #1588 (Thanks @e82eric).
Note that Windows Terminal Preview v1.22.2362.0 has a bug that can cause Yazi to time out at startup. If you want to try this feature, make sure to apply the patch from microsoft/terminal#17833.
output.mp4
What's Changed
- fix: keybindings disappear when mixing presets with a wrong filter condition by @sxyazi in #1568
- fix: check compositor support status before using ueberzug wayland output by @taoky in #1566
- fix: fallback to
PollWatcher
on WSL by @sxyazi in #1574 - fix: continuous fetcher was not scheduled consecutively by @sxyazi in #1575
- fix:
Rail
component should have a higher rendering priority by @sxyazi in #1585 - perf: truncate long lists in confirm dialogs by @sxyazi in #1590
- feat:
size
linemode supports showing the file count for directories by @sxyazi in #1591 - feat: support image preview in Windows Terminal by @e82eric in #1588
- chore: upgrade
ratatui
to 0.28.1 by @sxyazi in #1601 - feat: add
is_absolute
,has_root
,starts_with
,ends_with
,strip_prefix
toUrl
Userdata by @sxyazi in #1605 - feat: add
dict_merge()
function by @sxyazi in #1609
New Contributors
Full Changelog: v0.3.2...v0.3.3
v0.3.2
This version introduces two eagerly awaited new features: a brand-new confirm
component, and word wrapping.
Brand-new confirm
component
#1167 (thanks to @thelamb) introduces a brand-new confirm
component that handles various confirmations (like trashing files, deleting files, overwriting files, and exit confirmations). The goal is to provide a safer and more efficient user experience:
- Safer: Now, when you trash, delete, or overwrite files, it'll show a list of affected files for a second confirmation, instead of just the number of files like before.
- More efficient: Confirmation now only requires pressing
Enter
once, instead of typing"y"
and then pressingEnter
. This should be a nice quality-of-life improvement.
screenshot-001973.mp4
Word wrapping
#1159 (thanks to @mskvsk and @ArtyomArtamonov) adds a new wrap
option under [preview]
, which can be set to "no"
or "yes"
. When set to "yes"
, word wrapping is enabled:
# ~/.config/yazi/yazi.toml
[preview]
wrap = "yes"
Image preview performance optimization
I've been working on optimizing Yazi's image preview speed, and with multi-threading, preloading, and a built-in image decoder, it should already be the fastest among all terminal file managers.
However, I noticed some lag during fast scrolling and realized that at this point, the performance bottleneck isn't Yazi itself, but rather the terminal. When users scroll quickly, Yazi processes the images at a very high speed and sends them to the terminal, but the terminal can't keep up with processing them in time, which gives the impression of lag. In reality, it's not Yazi that's lagging, but the terminal.
#1512 introduces a new image_delay
configuration option to address this issue. When previewing images, it will wait at least image_delay
milliseconds before starting to send the decoded image data to the terminal.
This gives the terminal a breather and creates the perception that the file list is still scrolling smoothly. Additionally, this can reduce the CPU overhead caused by immediate image decoding during fast scrolling, thereby extending battery life.
Before:
358916490-8cf40a08-95b5-44fd-a16b-a1efb70b25f6.mp4
Now:
358916499-b5dde838-b700-4fa3-97be-543abff0f4ab.mp4
New --dir
option for the create
command
The create
command is designed to support creating both files and directories (with /
or \
at the end to indicate a directory).
However, this isn't user-friendly for those who need to create many directories but few files, as they always have to type /
or \
.
#1505 (thanks to @abstrakct) introduces a new --dir
option that explicitly specifies creating directories without needing to type /
or \
every time.
What's Changed
- fix: overlong single-line text containing escape sequences was not being properly escaped by @sxyazi in #1497
- fix: upgrade
ansi-to-tui
to5.0.0-rc.1
to resolveratatui
version conflict by @sxyazi in #1499 - feat: add
--dir
option tocreate
command by @abstrakct in #1505 - feat: add
ext()
method toUrl
userdata by @sxyazi in #1528 - feat: new
confirm
component by @thelamb in #1167 - chore: set
MACOSX_DEPLOYMENT_TARGE
to 10.11 to make the binary compatible with old macOS by @hronro in #1532 - fix: use a different cache directory for each user to avoid permission issues by @sxyazi in #1541
- fix: wait till mimetype is resolved to avoid flickering by @sxyazi in #1542
- docs: add links to all terminal emulators by @nyurik in #1538
- feat: make the builtin
code
previewer handle invalid carriage return chars and binary streams better by @sxyazi in #1550 - perf: only scan the first 1024 bytes to detect if it's binary, apply
\r
fixes only to content within the visible range, avoid unnecessary allocations during natural sorting by @sxyazi in #1551 - feat: word wrapping in builtin code preview by @ArtyomArtamonov in #1159
- fix: filter out the
which
candidates that overlap with longer key chords by @sxyazi in #1562 - fix:
DECSET
andDECRQM
tmux passthrough by @sxyazi in #1564
New Contributors
- @abstrakct made their first contribution in #1505
- @hronro made their first contribution in #1532
- @nyurik made their first contribution in #1538
- @ArtyomArtamonov made their first contribution in #1159
Full Changelog: v0.3.1...v0.3.2
v0.3.1
This is a quick patch release that addresses several issues introduced in version 0.3.
Additionally, here are some notable new features included in this version:
- A loading state indicator has been added for slow directories (usually network-mounted points).
- Support for opening multiple tabs at startup:
yazi /dir1 /dir2/file
will open two tabs, one in/dir1
and another in/dir2
, withfile
selected. - Allows the use of shorthand for keybindings, such as writing
<C-X>
instead of<C-S-x>
. - A new
--cursor
option has been added to theshell
command to specify the cursor position. For example,shell 'zip -r .zip "$0"' --cursor=7
places the cursor before.zip
. - A new previewer has been added for previewing virtual files in the
/proc
directory. - Support for
F13
-F19
keys. - A nightly build that uses the latest Yazi source code from the past 6 hours, and a new
yazi-nightly-bin
AUR package for Arch Linux users (Thanks @latipun7)
What's Changed
- fix: android building error caused by
trash
crate by @Xerxes-2 in #1393 - feat: add filtering tip in help component by @MarkZaytsev in #1361
- feat: add
title_format
manager config option by @chriszarate in #1281 - chore: move common dependencies to workspace Cargo.toml by @karimElmougi in #1388
- fix: precache for images with alpha by @Vikdos in #1414
- fix: preview files containing special
\x1b
characters as plain text and escape by @Xerxes-2 in #1395 - feat: add support portrait orientation preview for EXIF image by @TobisLee in #1412
- chore: update snap to core24 by @gapplef in #1415
- feat: new
search_do
command to make it easier to achieve a flat view by @sxyazi in #1431 - fix: newly created directories with the same name causing a false positive in directory loading optimization due to having the same modification time by @sxyazi in #1434
- refactor(nix): home keeping by @isabelroses in #1380
- fix(nix): pin
rust-overlay
to workaroundcargo-c
by @isabelroses in #1442 - fix: directory loading status by @sxyazi in #1439
- feat: support
F13
-F19
keys by @sxyazi in #1446 - feat: allows shorthand forms like
<C-S-x>
as<C-X>
by @sxyazi in #1448 - feat: add
cursor
option to theshell
command by @HE7086 in #1422 - fix: 7zip shows different error messages for wrong password by @sxyazi in #1451
- refactor(nix)!: update dependencies by @XYenon in #1456
- fix: loss of order in Lua sequence table for inter-thread data exchange by @sxyazi in #1457
- feat: start with multiple tabs with different paths by @coolkiid in #1443
- fix: close stdin before waiting for child process by @sxyazi in #1464
- fix: DDS static messages only work when at least two instances are running by @sxyazi in #1467
- feat: add
status()
method toCommand
by @sxyazi in #1473 - feat: new
empty
previewer for empty and/proc
files by @sxyazi in #1482 - feat: add
hidden
file type tois
rule by @sxyazi in #1483 - fix: replace
#
with:
to resolve the problem where certain shells recognize it as a special character by @sxyazi in #1490 - feat: new
tab
DDS event on tab switch by @mikavilpas in #1474 - feat: add keybinding for the
hardlink
command by @ahanniga in #1461
New Contributors
- @MarkZaytsev made their first contribution in #1361
- @karimElmougi made their first contribution in #1388
- @Vikdos made their first contribution in #1414
- @isabelroses made their first contribution in #1380
- @coolkiid made their first contribution in #1443
- @ahanniga made their first contribution in #1461
Full Changelog: v0.3.0...v0.3.1
Nightly Build
From commit: 61cab0f
Generated on: 2024-12-11 06:36 UTC
v0.3.0
After three months of development, I'm excited to announce the release of Yazi 0.3 today! This version brings a host of new features and bug fixes. Thank you to every contributor for making Yazi better and better!
This is a breaking change release, so please make sure to read:
Mouse support
The plugin system now includes five new APIs for each component - click
, scroll
, touch
, move
, and drag
to handle mouse events. These APIs come with default implementations to cover common operations.
This also allows plugin developers to extend mouse behavior and create any functionality they desire.
335989621-ffe7c094-b5a2-4391-9b07-3ff8140a3f5b.mp4
See #1038 for more info, thanks to @qsdrqs for his work on this!
New builtin extract
plugin
#1321 adds a builtin extract
plugin for decompressing archives, with these features:
- Interactive password input.
- Smart output directory selection with auto renaming.
- Supports decompressing multiple files at once.
- Fully async, decompression tasks can queue up and run in the background.
screenshot-001928.mp4
Enhanced file preview
Yazi 0.3 now supports the following new format to preview:
- Fonts
- SVGs
- HEIC files
- JPEG XL files
This feature requires the optional dependency ImageMagick to enable it.
screenshot-001930.mp4
Package manager
Yazi 0.3 introduces the new ya pack
subcommand for package management, making plugin and theme updates more convenient. This is especially important as the plugin system is not yet stable, so providing users with the ability to easily keep everything up to date is necessary.
Add a new one to package.toml
, then install it:
ya pack -a Reledia/glow
# If it's a sub-directory under the repository
ya pack -a yazi-rs/flavors#catppuccin-mocha
Install all packages configured in package.toml
:
ya pack -i
Upgrade all packages in package.toml
to the latest commit:
ya pack -u
See #985 for details.
Redesigned Icons
#1086 redesigns the icons, bringing the following improvements:
- Improved Matching Performance: The new
dirs
,files
, andexts
compile the icon rules into a HashMap at startup. This allows most icon matches to be completed with O(1) complexity, significantly enhancing performance. - Built-in
nvim-web-devicons
: This includes a richer and ready-to-use set of icons out of the box. - Enhanced Icon Styling: Each icon now supports specifying both dark and light colors (currently only
fg_dark
is used). In the future, the terminal color will automatically choose the appropriate color. This was added as part of #988. - Enhanced
is
Function: The originalis
functionality has been reimplemented asconds
to allow more complex conditional expressions, such ascond = "!dir & exec"
.
Significant archive preview performance improvements
#1220 reimplements archive previewing to be streamed. This means only a small amount of necessary data needs to be read to display the preview immediately, rather than waiting for all the data to be returned and parsed as before.
Additionally, by replacing lsar
with 7zip
, the preview speed has been further improved. The new implementation also introduces two new features: icon display and file size display.
Other improvements
These are a few of my favorite features. For a complete list of improvements in Yazi 0.3, check out the full changelog below.
What's Changed
- feat: support
yazi-cli
for Nix flake by @XYenon in #944 - feat: allow building with the system Lua by @Kladki in #943
- feat: support expanding Windows paths like "D:" that only have a drive letter but no root by @sxyazi in #948
- fix: always create XDG cache directory even if user has set a custom one by @sxyazi in #956
- feat: support previewing files containing non-UTF-8 characters by @sxyazi in #958
- fix: correct the glob pattern for the icons to fit the new matching algorithm by @sxyazi in #959
- feat: add
*.opus
file icon by @Brixy in #967 - fix: improve accessibility by avoiding hex color code for white by @Brixy in #968
- fix: avoiding duplicate candidates in the
which
component by @mikavilpas in #975 - feat: detect terminal type in tmux with CSI sequence in passthrough mode by @sxyazi in #977
- feat: add more rules to
[filetype]
and[icon]
by @Brixy in #966 - feat: re-enable the file
created
attribute by @rafi in #987 - feat: add
--force-window
option to mpv by @GOWxx in #998 - feat: close confirmation prompts and exit automatically when the ongoing task gone by @sxyazi in #997
- fix: notification title width does not include the width of the icon by @sxyazi in #1000
- feat: support
cargo binstall yazi-fm
andcargo binstall yazi-cli
by @slowsage in #1003 - feat: yazi --debug shows
ya
version in its output by @mikavilpas in #1005 - feat: add git commit hash to
ya --version
by @fzdwx in #1006 - feat: package manager by @sxyazi in #985
- feat:
ya pack
displays help if no arguments are given by @mikavilpas in #1012 - feat: new
--args
parameter forfd
anrg
search by @LatentDream in #1013 - fix: correct wasm target condition by @itsjunetime in #1018
- fix: broaden file watcher event types to accommodate permission changes on certain platforms by @sxyazi in #1024
- feat: add new
debounce
option toya.input()
API by @sxyazi in #1025 - fix: recognize
TERM=rxvt-unicode-256color
by @dtolnay in #1027 - feat: support
stdin
and pipe forChild
API by @sxyazi in #1033 - ci: consistently enforce Lua coding style by @mikavilpas in #1029
- ci: fix cargo unit tests execution by @clispios in #1041
- refactor: eliminate
exec
by @sxyazi in #1045 - feat: use
Ctrl-c
instead ofCtrl-q
as the universal close key for all components by @sxyazi in #1047 - fix: remove
ignore
options fromrg
andfd
search by @chriszarate in #1043 - feat: font preview by @sxyazi in #1048
- docs: add
CONTRIBUTING.md
by @johan-naizu in #1052 - feat: prefetcher by @sxyazi in #1061
- fix: ePUB file mime-type matching for the opener rule by @sxyazi in #1063
- fix: cursor gets out of sync occasionally at image previewing through IIP under tmux by @sxyazi in #1070
- feat: support Super/Command/Windows key notation
D-
by @sxyazi in #1069 - fix: remove the default keybinding for going to the temporary directory by @sxyazi in #1073
- feat!: redesign icons by @sxyazi in #1086
- fix: Sixel support from certain
st
forks cannot be detected by @sxyazi in #1094 - feat: support case insensitive special keys in keymappings by @mikavilpas in #1082
- refactor!: v0.3 API changes by @sxyazi in #1108
- feat: add
pack --list
subcommand to Ya CLI by @lpnh in #1110 - feat!: DDS client-server version check by @sxyazi in #1111
- feat: support mouse event by @qsdrqs in #1038
- feat: add some dependency version information to
yazi --debug
by @omagdy7 in #1112 - fix: block
SIGINT
signal from the spawned subprocess by @sxyazi in #1131 - feat: support completely disabling mouse with
mouse_events=[]
; add newcursor_blink
to control cursor style of input components by @sxyazi in #1139 - fix: different filenames should be treated as the same file on case-insensitive file systems by @sxyazi in #1151
- feat: support
ya sub
subcommand for the Ya CLI by @mikavilpas in #1004 - fix: file watcher didn't handle realname resolution used for case-insensitive file systems correctly by ...
v0.2.5
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:
-
dds-session.mp4
-
Change Yazi's
CWD
toPWD
on subshell exitdds-cd.mp4
-
Integration with the new
yazi.nvim
plugin: subscribing to file deletion, movement, and renaming events throughyazi --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
Performance optimizations
- Reduced CPU overhead during icon matching: Icon matching accounted for 35.6% of CPU time during rendering, and by changing the matching algorithm, this proportion has been reduced by ~10%
- Caching of each matched icon to avoid repeated calculations: By caching icons, further reductions in CPU usage for matching are achieved, as only a few new files that appear when scrolling through panes need to be matched
- Re-implemented the file watcher in an async way: This is the only sync I/O operation besides configuration initialization at startup, which occurs during
cd
and scrolling through the file list. For certain slow external devices, Yazi would experience noticeable lagginess, which has now been addressed, see #877 for more details
Feature enhancements
- Re-implemented
fzf
andzoxide
as plugins for better flexibility:fzf
andzoxide
have added more runtime error handling.zoxide
now supports the newupdate_db
feature, which automatically adds Yazi'sCWD
tozoxide
when navigating. To enable it, add the following to yourinit.lua
:require("zoxide"):setup { update_db = true, }
- Maintain the original modification time when copying files
- Support smart case for
cd
path completion - Add placeholder messages when there are no files in the directory
- Preserve the order of file selection when performing
open
,shell
, or bulk rename on multiple selected files - Prevent copying a directory to itself
The plugin system has also seen some improvements:
ya.dbg()
andya.err()
now support printing any type of data- New
ps
API as a carrier for DDS interaction ya.manager_emit()
now supports passingUrl
type
What's Changed
- fix: use
BTreeSet
for selected files to maintain order by @sxyazi in #799 - refactor: wrap
Opener
withCow
to avoid unnecessary memory reallocations when opening files by @sxyazi in #805 - fix: respond to the
SIGTERM
signal even when Yazi is in the background and has passed control of the terminal to the spawned process by @sxyazi in #797 - refactor: switch to
stderr
by @sxyazi in #819 - feat: fix all dependencies to specific version numbers to allow non-
--locked
builds by @sxyazi in #821 - fix: adjust calculation for number of lines in a notification message by @Rolv-Apneseth in #828
- fix: disable ANSI encoding for formatted events for the
tracing_subscriber
to clean up the logs by @Rolv-Apneseth in #832 - feat: enhance the
ya.dbg()
andya.err()
debugging functions by @sxyazi in #835 - perf: accelerate kitty graphics protocol encoding by avoiding string reallocation by @sxyazi in #837
- fix: mime-type for xz archives by @sxyazi in #841
- feat: time-based selection order preservation by @sxyazi in #843
- feat: add support for
YAZI_FILE_ONE
to the built-infile
previewer by @sxyazi in #846 - fix: Windows
cmd.exe
not responding to correct CSI sequences due to ConPTY by @sxyazi in #845 - perf: add
BufWriter
toStderr
to avoid frequent system calls and increase rendering frame rate by @sxyazi in #849 - feat: DDS (Data Distribution Service) by @sxyazi in #826
- perf: port
require()
andya.sync()
to Rust to avoid plugin information initialization process by @sxyazi in #853 - feat: readable toml parsing error by @SoloJacobs in #854
- feat: add a new
sender
property to the DDS payload by @sxyazi in #855 - feat: the
cd
event in DDS will now also be triggered when the tab is first created by @sxyazi in #861 - feat: detect CSI u through
Stderr
to allow usingStdout
as the carrier of DDS payload without an ANSI sequence response timeout by @sxyazi in #867 - fix: a race condition in DDS static messages sent as internal events by @sxyazi in #868
- feat: add
is_exec
andis_sticky
toCha
bindings by @sxyazi in #875 - perf: re-implement file watcher in an async way by @sxyazi in #877
- fix: CJK text rendering issue where the input popup component overlaps with images by @sxyazi in #879
- feat: re-implement
fzf
as a built-in plugin by @sxyazi in #884 - feat: add new
--orphan
option to theshell
command by @sxyazi in #887 - fix: file list expansion arguments (
$@
,$*
) of shell command under opener rules are out of order by @sxyazi in #890 - feat: add new
move
,trash
, anddelete
event kinds to DDS by @mikavilpas in #880 - feat: add
YAZI_ID
environment variable by @sxyazi in #895 - feat: when there are no files in the list, add a placeholder message by @sxyazi in #900
- feat: add loading state to directories by @sxyazi in #904
- feat: default "Reveal" opener for Linux by @sxyazi in #907
- perf: switch to
globset
to reduce CPU time spent on matching icons by @sxyazi in #908 - feat: trigger path completion with both
/
and\
on Windows by @ndtoan96 in #909 - feat: add a new
ya send
command to allow standalone client processes to communicate with DDS from the command line by @sxyazi in #913 - feat: allow creating a tab with the startup directory when the
tab_create
command is called without specifying apath
parameter by @sxyazi in #917 - feat: generate autocomplete script for
ya
command by @sxyazi in #919 - feat: allow opening interactively with the
--chosen-file
flag by @mikavilpas in #920 - fix: rollback ratatui to v0.26.1 to avoid panicking by @sxyazi in #922
- feat: expand the types supported by the event system by @sxyazi in #923
- feat: change status bar percent at 100 to Bot by @AidanV in #930
- fix: prevent pasting a directory into itself by @Rolv-Apneseth in #925
- feat: preserve files' modified at timestamp while copying by @Rolv-Apneseth in #926
- perf: cache each file's icon to avoid redundant calculations at rendering by @sxyazi in #931
- feat: split
ya send
intoya pub
andya pub-static
to make it more ergonomic by @sxyazi in #933 - feat: new builtin
session.lua
plugin by @sxyazi in #940
New Contributors
- @SoloJacobs made their first contribution in #854
- @mikavilpas made their first contribution in #880
- @AidanV made their first contribution in #930
Full Changelog: v0.2.4...v0.2.5
v0.2.4
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:
Vim-like.notification.mp4
For more changes, please read "What's Changed" below.
Heads up
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.
What's Changed
- perf: cheaper sync context initialization by @sxyazi in #643
- feat: allows access to complete app data for all tabs by @sxyazi in #644
- feat: add
<Home>
and<End>
to[input]
keymap by @grig-iv in #655 - feat: add
<Delete>
to[input]
keymap by @grig-iv in #665 - ci: add clippy/rustfmt workflow by @uncenter in #663
- feat: enable the ability to sort the which key by @abhaysp95 in #662
- refactor: tab-specific selection by @sxyazi in #653
- feat: Vim-like notification by @sxyazi in #659
- feat: add
prepend_rules
andappend_rules
for[icon]
by @grig-iv in #670 - feat: add new
scrolloff
option to[manager]
by @dedukun in #679 - feat: add color to icons by @Andy-W-Developer in #683
- feat: expose selected/yanked files as API by @sxyazi in #674
- feat: add new file marked state by @sxyazi in #682
- feat: add counter component to the header for displaying currently selected/yanked items by @Rolv-Apneseth in #646
- feat: add icons for Scala, Elm and Java (.jar & .class) by @jpaju in #684
- feat: add a new option
--hovered
to theopen
command by @fakerepic in #687 - refactor: using definite patterns to simplify keybindings by @sxyazi in #690
- feat: nested selection conflict detection by @evpeople in #689
- feat: cross-directory selection by @sxyazi in #693
- fix: allow running
ya.sync
in a sync plugin call by @dedukun in #702 - fix: ignore further classified mime-types by @sxyazi in #707
- perf: cache loaded plugins by @sxyazi in #710
- feat: add icons for C#, KDL and Nushell by @lpnh in #711
- feat: better accessibility by @sxyazi in #719
- fix: rendering fails when no file type style is matched by @sxyazi in #721
- fix: skip when the mime-type cannot match due to file permissions by @sxyazi in #725
- refactor: new
yazi-boot
crate by @sxyazi in #728 - fix: initialize logs right after configurations by @dedukun in #708
- refactor: prefer
Display
overToString
by @sxyazi in #734 - feat: add hovered as
$0
for shell and opener by @rrveex in #738 - feat: add a new
[notify]
section to thetheme.toml
to configure thenotify
component's style by @evpeople in #749 - feat: add
prepend_rules
andappend_rules
for[open]
inyazi.toml
by @lpnh in #754 - feat: support
YAZI_FILE_ONE
environment variable forfile(1)
path by @ndtoan96 in #752 - perf: apply
add_many()
/remove_many()
to the visual mode items for selection conflict detecting by @sxyazi in #758 - feat: support
%0
as the hovered file for Windows by @sxyazi in #761 - feat:
ya.input()
plugin API by @sxyazi in #762 - feat: add musl linux build targets by @uznog in #759
- fix: nested conflict detection exception when performing cross-level searches by @sxyazi in #769
- refactor: add new
run
property by @sxyazi in #773 - feat: add
Ctrl-[
as an escape key by @hankertrix in #763 - feat:
ya.notify()
plugin API by @sxyazi in #780 - feat:
ui.Clear
component for UI plugins by @sxyazi in #786 - feat: add
<C-p>
and<C-n>
to the select component for moving the cursor up/down by @hankertrix in #779 - feat: send a foreground notification to the user when the process fails to run by @hqwuzhaoyi in #775
- feat:
cx.yanked
plugin API by @sxyazi in #788 - fix: track the latest file changes for the
selected
,yanked
state when available by @sxyazi in #791 - feat: truncate path for deeply nested directories by @yixiaojiu in #787
- feat:
ya.hide()
plugin API by @sxyazi in #792
New Contributors
- @grig-iv made their first contribution in #655
- @abhaysp95 made their first contribution in #662
- @dedukun made their first contribution in #679
- @jpaju made their first contribution in #684
- @fakerepic made their first contribution in #687
- @evpeople made their first contribution in #689
- @lpnh made their first contribution in #711
- @rrveex made their first contribution in #738
- @uznog made their first contribution in #759
- @hankertrix made their first contribution in #763
- @hqwuzhaoyi made their first contribution in #775
- @yixiaojiu made their first contribution in #787
Full Changelog: v0.2.3...v0.2.4
v0.2.3
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 #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!
What's Changed
- feat: customizing the number of columns of "which key" component by @sxyazi in #571
- fix: input offset is not reset when renaming with
--cursor=start
and the filename is too long by @sxyazi in #575 - feat: new
image_quality
andsixel_fraction
options to allow users to configure the image preview quality by @sxyazi in #576 - feat: allow to configure image filter by @sxyazi in #586
- feat: support passing arguments to plugin by @sxyazi in #587
- feat: plugin-specific state persistence by @sxyazi in #590
- feat: preview image over SSH by @sxyazi in #585
- perf: read directory in bulk in the background at startup, make Yazi ~2.5 times faster than before by @sxyazi in #599
- refactor: use
Cmd
instead ofExec
by @sxyazi in #604 - feat: support
unyank
by @15cm in #313 - feat: make
trash
crate optional on Android by @sxyazi in #600 - feat: plugin interface for key events via
ya.which()
by @sxyazi in #617 - feat:
app_emit
andmanager_emit
accepts boolean, integer, and number as option values by @sxyazi in #625 - fix: attach plugin
args
to theentry
method for better future optimization possibilities by @sxyazi in #627 - feat: support char device in filetype by @HE7086 in #628
- fix: hidden attribute of files on Windows by @sxyazi in #632
- fix: task manager not re-rendering after progress update by @sxyazi in #633
- feat: if input is empty, close it on
backspace
command by @Rolv-Apneseth in #630
New Contributors
Full Changelog: v0.2.2...v0.2.3