How to install and configure Yazi on Hyprland
Contents
Preface
Recently I came across Yazi, which describes itself as a “blazing fast terminal file manager written in Rust, based on async I/O.”
Since I am currently experimenting with Hyprland, I was looking for a terminal file manager.
Yazi looked interesting, so I wrote down how I configured it to work with Kitty and how to use it as a file picker.
Installing Yazi
According to the Yazi Wiki, all you need to do is:
sudo pacman -S yazi ffmpeg 7zip jq poppler fd ripgrep fzf zoxide resvg imagemagick
Configuring hyprland.conf
In your hyprland.conf there is a variable called $fileManager.
If we change it to simply call yazi, nothing happens because Hyprland does not know which terminal to launch it in.
Set it like this:
$fileManager = kitty -e yazi
Now, pressing your Hyprland file-manager shortcut (mine is SUPER+E) should open Yazi.
However, when quitting Yazi, Kitty may show an annoying warning:
“Are you sure you want to close this OS window? It is running: yazi.”
Let’s disable that.
Disable Kitty’s window close warning
Edit your Kitty config:
nano ~/.config/kitty/kitty.conf
Find the setting confirm_os_window_close, uncomment it, and set it to:
confirm_os_window_close 0
Configure Yazi openers
mkdir -p ~/.config/yazi
cd ~/.config/yazi
nano yazi.toml
Add:
[mgr]
show_hidden = true
[opener]
play = [
{ run = 'mpv "$@"', orphan = true }
]
edit = [
{ run = 'nano "$@"', block = true }
]
json = [
# If you have VSCODIUM installed
{ run = 'vscodium --ozone-platform-hint=wayland "$@"', block = true }
]
[open]
prepend_rules = [
{ name = "*.json", use = "json" },
{ name = "*.jsonc", use = "json" },
{ mime = "text/*", use = "edit" },
{ mime = "video/*", use = "play" },
# Multiple openers for a single rule
{ name = "*.html", use = [ "open", "edit" ] }
]
prepend_rules puts these rules in front of Yazi’s defaults. Plain rules would replace the defaults entirely, and everything not listed here, like images or PDFs, would lose its opener.
Set Yazi as the default file picker
This is somewhat of a rabbit hole. Some applications use the configured system FileChooser, while others implement their own, Firefox being a notable example.
Even with a configured ~/.config/mimeapps.list I could not get Firefox to use Yazi.
The following setup worked for me.
Install xdg-desktop-portal-termfilechooser
yay -S xdg-desktop-portal-termfilechooser-hunkyburrito-git
Configure termfilechooser
mkdir -p ~/.config/xdg-desktop-portal-termfilechooser
cp /usr/share/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh ~/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh
nano ~/.config/xdg-desktop-portal-termfilechooser/config
Paste this:
[filechooser]
cmd=yazi-wrapper.sh
env=TERMCMD=kitty
create_help_file=0
default_dir=$HOME
open_mode = suggested
save_mode = last
Restart the xdg desktop portal service:
systemctl --user restart xdg-desktop-portal.service
Configure xdg-desktop-portal
We should also set our preferred FileChooser in ~/.config/xdg-desktop-portal/portals.conf.
mkdir -p ~/.config/xdg-desktop-portal
nano ~/.config/xdg-desktop-portal/portals.conf
Add:
[preferred]
org.freedesktop.impl.portal.FileChooser=termfilechooser
Configure Firefox
In the Firefox address bar type:
about:config
Accept the warning and continue.
At the top is a search bar. Type in:
widget.use-xdg-desktop-portal.file-picker
Set the value to 1.
Let the file picker float!
If you want the file picker window to float, add the following rule to your hyprland.conf:
windowrule = float, center, size 800 600, class:kitty, title:termfilechooser
On a newer version, check the Hyprland wiki for the current syntax.
That’s it!
Applications should now be able to use Yazi to select files.
One more thing to keep in mind:
While testing this with Firefox downloads, I noticed one quirk.
If you press Enter, the file is not saved. Instead, the instruction file is saved. Press O to confirm the save.
Cheers.