v25.5.28

sxyazi/yaziv25.5.28May 28, 2025by github-actions[bot]

AI Summary

This release introduces a redesigned tab bar, real-time directory size calculation in the spotter, and a massive 9x speed improvement for Sixel image previews using a new quantization algorithm.

Key Highlights

  • Redesigned tabs decoupled from the header for better UX
  • Real-time directory size calculation for folders
  • 9x faster Sixel image preview using Wu's Color Quantizer
  • New `piper.yazi` plugin for shell command output previews
  • Input component now supports password mode

Breaking Changes

  • `[manager]` config section deprecated in favor of `[mgr]`
  • `tab_width` removed as it no longer needs to be set manually
  • `tab_active` and `tab_inactive` moved under the new `[tabs]` section
  • `sixel_fraction` has been removed
  • Multiple Lua APIs deprecated (e.g., `ya.mgr_emit`, `ya.preview_widgets`, `Command:args`)

New Features

  • Truncate long items in the file list with extension display
  • New `types.yazi` plugin for Lua API type definitions
  • Improved built-in video and magick previewers
  • Path auto-completion improvements
  • New `fs.calc_size()` API

Full Release Notes

## Breaking Changes

- `[manager]` is deprecated in favor of the new `[mgr]`. https://github.com/sxyazi/yazi/pull/2803
- `tab_width` has been removed as it no longer needs to be set manually. https://github.com/sxyazi/yazi/pull/2745
- `tab_active` and `tab_inactive` are moved under the new `[tabs]` section. https://github.com/sxyazi/yazi/pull/2745
- `sixel_fraction` has been removed as it's no longer needed. https://github.com/sxyazi/yazi/pull/2707

## Deprecated

- `ya.mgr_emit()`, `ya.app_emit()` and `ya.input_emit()` are deprecated. https://github.com/sxyazi/yazi/pull/2653
- `ya.preview_widgets()` is deprecated. https://github.com/sxyazi/yazi/pull/2706
- `Command:args()` is deprecated. https://github.com/sxyazi/yazi/pull/2752
- The `ya pack` subcommand is deprecated. https://github.com/sxyazi/yazi/pull/2770
- `LEFT`, `CENTER`, `RIGHT` on `ui.Line`, `ui.Text` are deprecated. https://github.com/sxyazi/yazi/pull/2802
- `NONE`, `TOP`, `RIGHT`, `BOTTOM`, `LEFT`, `ALL` on `ui.Bar`, `ui.Border` are deprecated. https://github.com/sxyazi/yazi/pull/2802
- `WRAP_NO`, `WRAP`, `WRAP_TRIM` on `ui.Text` are deprecated. https://github.com/sxyazi/yazi/pull/2802

## Redesign Tabs

https://github.com/sxyazi/yazi/pull/2745 decouples tabs from the header into an independent tab bar component to enhance UX:

- A standalone single-line component increases the available space for displaying tabs.
- Tab titles are displayed by default to increase recognizability.
- Supports switching tabs via mouse for easier navigation.

The new tab bar is only shown when there is more than one tab, ensuring no space is wasted for users who don't use tabs.

https://github.com/user-attachments/assets/5ca33561-7558-4b9c-8b6a-9dfbc0bc8aa4

## Calculate Real-Time Directory Size in Spotter

https://github.com/sxyazi/yazi/pull/2695 adds directory sizes to the `folder` spotter. The size is computed dynamically in real time and asynchronously, which means:

- Every time a user clicks `<Tab>` on a directory, the latest size is calculated.
- For large directories, real-time changes in size are reported to the user, with "(?)" appended at the end to indicate that the calculation is in progress.
- If the user closes the spotter or switches directories using the left/right arrow keys, any ongoing calculations will be canceled to avoid wasting resources.

Also, the computed directory size will be updated in the file list:

- If the user sets `linemode = size`, the latest size will be shown on the right of the file line.
- If the user sets `sort_by = size`, the file list will be sorted by the latest sizes (if necessary).

https://github.com/user-attachments/assets/eb2981e6-3e02-4997-abfc-83cc456a1677

## 9x Faster Sixel Image Preview

https://github.com/sxyazi/yazi/pull/2707 replaces the existing neural network quantization algorithm with Wu's Color Quantizer, which offers [better performance](https://github.com/Ivordir/quantette/blob/main/docs/Benchmarks%20and%20Accuracy.md#time) while [maintaining comparable quality](https://github.com/Ivordir/quantette/blob/main/docs/Benchmarks%20and%20Accuracy.md#accuracydssim).

Old implementation (neural network via [`color_quant`](https://github.com/image-rs/color_quant), with default `sixel_fraction = 20`) – average 189.5763999ms:

```sh
time: 190.025ms
time: 191.054417ms
time: 187.696792ms
time: 188.060791ms
time: 189.381958ms
time: 191.618042ms
time: 192.383125ms
time: 190.511291ms
time: 187.8395ms
time: 187.193083ms
```

New implementation (Wu - sRGB via [`quantette`](https://github.com/Ivordir/quantette)) – average 20.9199916ms:

```sh
time: 21.226458ms
time: 20.719542ms
time: 21.207583ms
time: 20.815875ms
time: 21.071291ms
time: 21.273459ms
time: 20.811792ms
time: 20.723166ms
time: 20.52675ms
time: 20.824ms
```

## [`piper.yazi` Plugin](https://github.com/yazi-rs/plugins/tree/main/piper.yazi)

With [`piper.yazi`](https://github.com/yazi-rs/plugins/tree/main/piper.yazi), you can use the output of any shell command as preview content. This eliminates the need to write a separate plugin for each command, making the use of custom previewers much more convenient.

![screenshot-002418](https://github.com/user-attachments/assets/59618aed-fa80-46e6-a6fc-82918317e9c2)

See https://github.com/yazi-rs/plugins/tree/main/piper.yazi#examples for more examples!

## Double Directory Size Calculation Speed

https://github.com/sxyazi/yazi/pull/2683 greatly improves directory computation performance by dividing the task into chunks and reusing existing threads. Directory sorting and file trashing will be observably twice as fast.

Run the benchmark script against a 10.16GB folder 5 times in release mode:

```sh
Old: elapsed 759.877791ms
New: elapsed 364.802583ms

Old: elapsed 734.5155ms
New: elapsed 360.103375ms

Old: elapsed 734.124167ms
New: elapsed 365.662458ms

Old: elapsed 733.27325ms
New: elapsed 365.694042ms

Old: elapsed 743.394875ms
New: elapsed 364.455083ms
```

## Input Component Now Supports Password Mode

With https://github.com/sxyazi/yazi/pull/2675, a new `obscure = true` option is available:

```lua
local value = ya.input {
  title = "Password:",
  obscure = true,
  position = { "center", w = 50 },
}
```

https://github.com/user-attachments/assets/ff5b21f2-977b-4e9f-a279-e4cb15b51a57

## Truncate Long Items in the File List

https://github.com/sxyazi/yazi/pull/2754, https://github.com/sxyazi/yazi/pull/2759, and https://github.com/sxyazi/yazi/pull/2778 add truncation support for long filenames in the file list and archive preview, and display file extensions at the end, ensuring that even if a filename is truncated, you can still know what file type it is by its extension.

https://github.com/user-attachments/assets/0f1afbdb-17ec-410f-adea-e8b1d2ed6341

## [`types.yazi` Plugin](https://github.com/yazi-rs/plugins/tree/main/types.yazi)

For a long time, Yazi lacked a type definition file, which made plugin development very painful. Now, it's here!

[`types.yazi`](https://github.com/yazi-rs/plugins/tree/main/types.yazi) provides type definitions for Yazi's Lua API, empowering an efficient plugin development experience.

## Improved Built-In Previewers

- The `video` previewer now supports displaying embedded video covers, https://github.com/sxyazi/yazi/pull/2640
- The `magick` previewer will respect the user's `image_alloc` and `image_bound` settings, to limit its maximum resource usage, https://github.com/sxyazi/yazi/pull/2602, thanks to @ze0987
- The `video` previewer will respect the user's `max_width` setting, https://github.com/sxyazi/yazi/pull/2560, thanks to @ze0987

## Improve Path Auto-Completion Results

The auto-completion results for interactive cd (key: `g` => `<Space>`) will now more closely match the user's input keywords. 

Done in https://github.com/sxyazi/yazi/pull/2765

## What's Changed
* fix: reverse the mixing order of theme and flavor configuration by @sxyazi in https://github.com/sxyazi/yazi/pull/2594
* feat: limit memory usage for previewing large images by @ze0987 in https://github.com/sxyazi/yazi/pull/2602
* fix: respect the user's `max_width` setting for the built-in video previewer by @ze0987 in https://github.com/sxyazi/yazi/pull/2560
* feat: allow custom exit code with `quit --code` by @Nicholas42 in https://github.com/sxyazi/yazi/pull/2609
* fix: ensure state synchronization even when the package update fails midway by @sxyazi in https://github.com/sxyazi/yazi/pull/2613
* fix: do not change revision when package deployment fails by @sxyazi in https://github.com/sxyazi/yazi/pull/2627
* feat: copy-on-write support for field caching by @sxyazi in https://github.com/sxyazi/yazi/pull/2629
* feat: fall back to `CSI 16 t` when PowerShell OpenSSH returns a fake terminal size by @sxyazi in https://github.com/sxyazi/yazi/pull/2636
* feat: support embedded cover for video preview by @sxyazi in https://github.com/sxyazi/yazi/pull/2640
* fix: lazily update files to avoid triggering issues dependent on sort order by @sxyazi in https://github.com/sxyazi/yazi/pull/2643
* feat: new `ya.emit()` API by @sxyazi in https://github.com/sxyazi/yazi/pull/2653
* feat: fine-grained `peek` and `watch` by @sxyazi in https://github.com/sxyazi/yazi/pull/2655
* feat: new `--no-dummy` option for `reveal` command by @sxyazi in https://github.com/sxyazi/yazi/pull/2664
* feat: obscure input component for inputting passwords by @sxyazi in https://github.com/sxyazi/yazi/pull/2675
* feat: increase the maximum allowed value of `sixel_fraction` to `30` by @sxyazi in https://github.com/sxyazi/yazi/pull/2682
* perf: double directory size calculation speed by @sxyazi in https://github.com/sxyazi/yazi/pull/2683
* feat: new `fs.calc_size()` API by @sxyazi in https://github.com/sxyazi/yazi/pull/2691
* feat: promote `Id` to a first-class type by @sxyazi in https://github.com/sxyazi/yazi/pull/2692
* feat: calculate real-time directory size in spotter by @sxyazi in https://github.com/sxyazi/yazi/pull/2695
* feat: checks in `ya pub` and `ya emit` subcommands to verify receiver exists and has necessary abilities by @sxyazi in https://github.com/sxyazi/yazi/pull/2696
* feat: add `s` and `S` keybinds in the input component by @hankertrix in https://github.com/sxyazi/yazi/pull/2678
* fix: no title is set when starts the first time by @sxyazi in https://github.com/sxyazi/yazi/pull/2700
* refactor: move `tty` to the new `yazi-term` crate by @sxyazi in https://github.com/sxyazi/yazi/pull/2701
* feat: show error when image preview fails by @sxyazi in https://github.com/sxyazi/yazi/pull/2706
* feat!: 9x faster Sixel image preview by @sxyazi in https://github.com/sxyazi/yazi/pull/2707
* fix: reset the cursor position with `arrow()` after deleting files by @sxyazi in https://github.com/sxyazi/yazi/pull/2708
* fix: `ya pub-to 0` checks if any peer is able to receive the message by @mikavilpas in https://github.com/sxyazi/yazi/pull/2697
* feat: add `--hovered` to the `copy` command by @hankertrix in https://github.com/sxyazi/yazi/pull/2709
* fix: missing a `hover` event after `cd` by @sxyazi in https://github.com/sxyazi/yazi/pull/2719
* fix: detach background and orphan processes from the controlling terminal with `setsid()` by @sxyazi in https://github.com/sxyazi/yazi/pull/2723
* fix: avoid tmux interfering with kitty graphical sequences by @sxyazi in https://github.com/sxyazi/yazi/pull/2734
* fix: `windows-sys` missing a `Win32_Security` feature by @Kreijstal in https://github.com/sxyazi/yazi/pull/2728
* feat: make `ui.Line` renderable by @sxyazi in https://github.com/sxyazi/yazi/pull/2743
* feat!: redesign tabs by @sxyazi in https://github.com/sxyazi/yazi/pull/2745
* refactor: deprecate the `Command:args()` method by @sxyazi in https://github.com/sxyazi/yazi/pull/2752
* perf: avoid unnecessary memory allocation in `ya.truncate()` by @sxyazi in https://github.com/sxyazi/yazi/pull/2753
* fix: icon rules mixing by @sxyazi in https://github.com/sxyazi/yazi/pull/2755
* feat: show file extension for truncated file list items by @sxyazi in https://github.com/sxyazi/yazi/pull/2759
* perf: remove intermediate variables in natural sorting algorithm to avoid unnecessary allocation by @sxyazi in https://github.com/sxyazi/yazi/pull/2764
* feat: improve path auto-completion results by @sxyazi in https://github.com/sxyazi/yazi/pull/2765
* fix: always try to create state directory before draining DDS data by @sxyazi in https://github.com/sxyazi/yazi/pull/2769
* feat: truncate long paths in archive preview file list by @sxyazi in https://github.com/sxyazi/yazi/pull/2778
* feat: add a `/` to the interactive cd auto-completion candidates by @ineu in https://github.com/sxyazi/yazi/pull/2777
* feat: make custom tab bar easier by @sxyazi in https://github.com/sxyazi/yazi/pull/2782
* fix: update `rust-onig` to v6.5.1 for GCC 15 compatibility by @sxyazi in https://github.com/sxyazi/yazi/pull/2794
* feat: new `ui.Align`, `ui.Wrap`, and `ui.Edge` by @sxyazi in https://github.com/sxyazi/yazi/pull/2802
* refactor!: deprecate `[manager]` in favor of `[mgr]` by @sxyazi in https://github.com/sxyazi/yazi/pull/2803
* chore: bump version to 25.5.28 by @sxyazi in https://github.com/sxyazi/yazi/pull/2804

## New Contributors
* @Nicholas42 made their first contribution in https://github.com/sxyazi/yazi/pull/2609
* @Kreijstal made their first contribution in https://github.com/sxyazi/yazi/pull/2728
* @ineu made their first contribution in https://github.com/sxyazi/yazi/pull/2777

**Full Changelog**: https://github.com/sxyazi/yazi/compare/v25.4.8...v25.5.28