Yazi

A blazing fast terminal file manager written in Rust, with async I/O, image previews, and a rich plugin system.

Screenshot of Yazi

Yazi ("duck" in Chinese) is a terminal file manager built from the ground up around async I/O. Everything β€” directory traversal, file previews, plugin execution β€” happens concurrently, so the UI stays snappy even on slow network mounts or when previewing large files. It supports image rendering via Kitty, iTerm2, Sixel, and other protocols, making it one of the few terminal file managers that can show true inline image previews.

Features

  • Async everywhere β€” non-blocking I/O throughout means the UI never freezes waiting for slow filesystems or preview generation
  • Image previews β€” renders images inline in the terminal using the Kitty graphics protocol, iTerm2 inline images, Sixel, or Überzug++
  • Rich preview support β€” previews text files with syntax highlighting (via bat), PDFs, videos (via ffmpegthumbnailer), archives, and more
  • Lua plugin system β€” extend and customise Yazi with Lua 5.4 plugins; a growing community registry is available
  • Multi-tab support β€” open multiple directory tabs and switch between them instantly
  • Bulk rename β€” select multiple files and rename them all at once in your $EDITOR
  • Vim-style keybindings β€” h/j/k/l navigation, visual selection, marks, and a command palette
  • Shell integration β€” a ya helper lets you change your shell's working directory to wherever you navigate in Yazi

Installation

cargo install yazi-fm yazi-cli

Or via your package manager:

# Arch Linux
pacman -S yazi

# macOS
brew install yazi

# Nix
nix-env -iA nixpkgs.yazi

For the best experience, also install the optional dependencies:

# File previews
apt install ffmpegthumbnailer unar jq poppler-utils fd ripgrep fzf zoxide

# Syntax highlighting and paging
cargo install bat

Shell integration

Add the y shell wrapper so Yazi can change your shell's working directory on exit:

# bash / zsh β€” add to ~/.bashrc or ~/.zshrc
function y() {
  local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd
  yazi "$@" --cwd-file="$tmp"
  if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
    builtin cd -- "$cwd"
  fi
  rm -f -- "$tmp"
}

Then launch with y instead of yazi to get directory-changing on exit.

Keybindings

KeyAction
h / ←Go to parent directory
l / β†’ / EnterEnter directory or open file
j / kMove down / up
gg / GJump to top / bottom
SpaceToggle selection
vEnter visual selection mode
yYank (copy) selected files
dCut selected files
pPaste
rRename file
RBulk rename in $EDITOR
aCreate file or directory
DMove to trash
tOpen new tab
/Search by name
zJump with zoxide
qQuit

Configuration

Yazi looks for config files in ~/.config/yazi/. The main files are yazi.toml, keymap.toml, and theme.toml.

# ~/.config/yazi/yazi.toml
[manager]
ratio = [1, 3, 4]          # column width ratios (parent : current : preview)
sort_by = "natural"
sort_dir_first = true
show_hidden = false

[preview]
image_filter = "triangle"
image_quality = 75
video_start = 0.0

Plugins

Install plugins using the ya CLI:

# Install a plugin from the community registry
ya pack -a yazi-rs/plugins:git
ya pack -a yazi-rs/plugins:full-border

Then enable them in your ~/.config/yazi/init.lua:

require("git"):setup()
require("full-border"):setup()