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 #1723
- refactor: turn
RectRef
,PaddingRef
,PositionRef
intoRect
,Padding
,Position
by @sxyazi in #1730 - refactor: use
Kgp
instead ofKitty
since "Kitty" is a terminal emulator not a protocol name by @sxyazi in #1732 - fix: compositors not supported by Überzug Wayland layer, or WSL not with WezTerm should fallback to Chafa by @sxyazi in #1735
- fix: clamp when seeking a non-zero unit between
-1
and1
by @sxyazi in #1736 - fix: upserting operation should handle deleting in edge cases where the source and target URNs are different by @sxyazi in #1737
- refactor: derive the
Into<Opt>
trait with procedural macros to avoid bloat by @sxyazi in #1742 - perf: merge multiple file operations into one to greatly speed up updates in large directories by @sxyazi in #1745
- fix!: introduce a new
btime
term to alignctime
with Unix by @sxyazi in #1761 - feat:
yazi --debug
supports detecting whethertmux
is built with--enable-sixel
by @sxyazi in #1762 - refactor: simplify module exports by @sxyazi in #1770
- refactor!: rename the term
select
totoggle
to reserveselect
for future use by @sxyazi in #1773 - feat!: add
ui.Text
,ui.Table
, removeui.Paragraph
andui.ListItem
by @sxyazi in #1776 - feat!: decouple
ui.List
,ui.Bar
,ui.Border
, andui.Gauge
from coordinates by @sxyazi in #1782 - feat: prevent paths from being treated as options in
file
command by @gaesa in #1783 - refactor: replace
Metadata
withCha
in the file scheduler to improve interoperability withyazi-fs
by @sxyazi in #1785 - feat: append the suffix to the end when generating unique filenames for directories, i.e., after not before the extension by @Saru2003 in #1784
- fix: images were not cleared when closing a tab in front of the current tab by @sxyazi in #1792
- feat: add a compatibility layer for
ui.Paragraph
to help users transition more smoothly to the newui.Text
by @sxyazi in #1794 - refactor: remove migration code as it's no longer needed and causes errors by @sxyazi in #1795
- feat: custom styles for the
confirm
component by @GrzegorzKozub in #1789 - perf: apply rotate in place to images with orientation by @sxyazi in #1807
- feat: add ICC profile to images for better color accuracy by @sxyazi in #1808
- fix: use std copy function in a blocking thread by @sxyazi in #1817
- feat: allow customizing Zoxide's FZF options with
YAZI_ZOXIDE_OPTS
by @sxyazi in #1822 - fix: use a unique
Id
for each tab by @sxyazi in #1826 - feat: launch from preset settings if the user's config cannot be parsed by @sxyazi in #1832
- fix: reset image rendering and skip peeking if the TUI in the background by @sxyazi in #1833
- refactor: add tests for
Pattern::match_path
by @sxyazi in #1837 - perf: eliminate all memory reallocations during sorting by @sxyazi in #1846
- feat: suggest keywords in the header if a finder is active by @sxyazi in #1847
- fix: copy the CWD path regardless even if the directory is empty by @sxyazi in #1849
- perf: introduce reflow for the rendering engine by @sxyazi in #1863
- fix: wrong file list offset squeeze when
scrolloff = 0
by @aidancz in #1866 - refactor: use for loop to generate completions file by @Integral-Tech in #1869
- fix: use complete rendering instead of partial rendering for no task progress report by @sxyazi in #1876
- refactor: destructure tuples to enhance readability by @Integral-Tech in #1874
- feat: new
copy --separator
option to allow specifying the path separator by @alan910127 in #1877 - feat: allow disabling certain preset keybinds with the new
noop
virtual command by @sxyazi in #1882 - feat: include package revision hash in
ya pack --list
by @yudai0804 in #1884 - feat: add a new
tab
parameter for all tab-specific commands to specify which one by @sxyazi in #1885 - feat: support searching with the alias
fdfind
iffd
cannot be found by @Integral-Tech in #1889 - feat!: deprecate
--sync
option for theplugin
command by @sxyazi in #1891 - perf: lazy load
ui
,ya
,fs
, andps
by @sxyazi in #1903 - chore: add
CODE_OF_CONDUCT.md
by @Perfectio07 in #1911 - feat: spotter by @sxyazi in #1802
- feat:
noop
for spotters by @boydaihungst in #1924 - fix: show "0/0" instead of "1/0" in empty directories by @Integral-Tech in #1925
- fix!: eliminate the
x-
prefix in mime-types by @sxyazi in #1927 - refactor: make error messages more user-friendly by @Integral-Tech in #1935
- refactor: remove unnecessary UI element construction by @sxyazi in #1938
- feat!: use an
Error
userdata instead of a plain error code for I/O errors by @sxyazi in #1939 - feat: new log system by @sxyazi in #1945
- perf: introduce copy-on-write for event system to eliminate all memory reallocations by @sxyazi in #1962
- feat: true custom
mime
fetcher support - using user rules even during open or in watcher by @sxyazi in #1976 - feat: support
assets
installation for theya pack
subcommand by @zooeywm in #1973 - feat: new
ya emit
andya emit-to
subcommands to emit commands to a specified instance for execution by @sxyazi in #1979 - feat: new
load
DDS event by @sxyazi in #1980 - feat!: remove the meaningless
--confirm
option to simplify theshell
command by @sxyazi in #1982 - feat: move notification from top-right to bottom-right corner to avoid covering content as much as possible by @sxyazi in #1984
- fix: propagate and update the directory node till its first parent when the files of a directory change by @sxyazi in #1987
- fix: missing a repeek on unyanking files in the hovered folder by @sxyazi in #1988
- fix: revise
revision
if the new file list is empty but the previous one was not by @sxyazi in #2003 - feat: fallback to
CSI 16 t
for certain terminals that do not supportTIOCGWINSZ
by @sxyazi in #2004 - docs: add README for default configuration files by @sxyazi in #2005
- fix: respect
PREVIEW.image_quality
for the default PDF previewer by @gaesa in #2006 - fix: introduce own
CWD
instead ofchdir
to avoid potential race conditions by @sxyazi in #2008 - fix:
backspace --under
didn't map UTF-8 character code points to byte indices by @sxyazi in #2010 - chore: bump version to 0.4.0 by @sxyazi in #2011
New Contributors
- @DirkFi made their first contribution in #1583
- @diegodorado made their first contribution in #1556
- @Tyarel8 made their first contribution in #1650
- @v3natio made their first contribution in #1684
- @dm9pZCAq made their first contribution in #1689
- @raphamorim made their first contribution in #1690
- @Saru2003 made their first contribution in #1784
- @GrzegorzKozub made their first contribution in #1789
- @aidancz made their first contribution in #1866
- @alan910127 made their first contribution in #1877
- @yudai0804 made their first contribution in #1884
- @Perfectio07 made their first contribution in #1911
- @boydaihungst made their first contribution in #1924
Full Changelog: v0.3.3...v0.4.0