Skip to main content

Tips

These tips require prior knowledge of the Yazi configuration file.

If you are using Yazi for the first time, please read our configuration and plugins documentation first.

Full border

Moved to https://github.com/yazi-rs/plugins/tree/main/full-border.yazi

Dropping to the shell

Add this keybinding to your keymap.toml:

[[manager.prepend_keymap]]
on = "!"
run = 'shell "$SHELL" --block --confirm'
desc = "Open shell here"

Close input by once Esc press

You can change the Esc of input component from the default escape to close command, in your keymap.toml:

[[input.prepend_keymap]]
on = "<Esc>"
run = "close"
desc = "Cancel input"

to exiting input directly, without entering Vi mode, making it behave like a regular input box.

Smart enter: enter for directory, open for file

Save these lines as ~/.config/yazi/plugins/smart-enter.yazi/init.lua:

--- @sync entry
return {
entry = function()
local h = cx.active.current.hovered
ya.manager_emit(h and h.cha.is_dir and "enter" or "open", { hovered = true })
end,
}

Then bind it for l key, in your keymap.toml:

[[manager.prepend_keymap]]
on = "l"
run = "plugin --sync smart-enter"
desc = "Enter the child directory, or open the file"

This plugin adds hovered = true to make the behavior of open consistent with enter avoiding accidental triggers, which means both will only target the currently hovered file. If you still want open to target multiple selected files, set it to false.

Smart paste: paste files without entering the directory

Save these lines as ~/.config/yazi/plugins/smart-paste.yazi/init.lua:

--- @sync entry
return {
entry = function()
local h = cx.active.current.hovered
if h and h.cha.is_dir then
ya.manager_emit("enter", {})
ya.manager_emit("paste", {})
ya.manager_emit("leave", {})
else
ya.manager_emit("paste", {})
end
end,
}

Then bind it for p key, in your keymap.toml:

[[manager.prepend_keymap]]
on = "p"
run = "plugin --sync smart-paste"
desc = "Paste into the hovered directory or CWD"
Demonstrate smart paste

Smart tab: create a tab and enter the hovered directory

Save these lines as ~/.config/yazi/plugins/smart-tab.yazi/init.lua:

--- @sync entry
return {
entry = function()
local h = cx.active.current.hovered
ya.manager_emit("tab_create", h and h.cha.is_dir and { h.url } or { current = true })
end,
}

Then bind it for t key, in your keymap.toml:

[[manager.prepend_keymap]]
on = "t"
run = "plugin --sync smart-tab"
desc = "Create a tab and enter the hovered directory"

Folder-specific rules

You can subscribe to directory change events through the cd event provided by DDS, and then do any action you want, such as setting different sorting methods for specific directories.

The following code demonstrates making the Downloads directory to sort by modification time, while others are sorted alphabetically. Save these lines as ~/.config/yazi/plugins/folder-rules.yazi/init.lua:

local function setup()
ps.sub("cd", function()
local cwd = cx.active.current.cwd
if cwd:ends_with("Downloads") then
ya.manager_emit("sort", { "modified", reverse = true, dir_first = false })
else
ya.manager_emit("sort", { "alphabetical", reverse = false, dir_first = true })
end
end)
end

return { setup = setup }

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

require("folder-rules"):setup()

Credits to @tianze0926 for sharing it.

Folder-specific previewer and preloader

In addition to the mime rules, Yazi also has name rules for pre{viewer,loader}, which accept a glob expression. This allows for flexible creation of different pre{viewer,loader} rules for various directories.

For example, you can use the noop builtin preloader for a remote mount point like /remote, disabling preloads in that directory:

# yazi.toml
[[plugin.prepend_preloaders]]
name = "/remote/**"
run = "noop"

Drag and drop via dragon

Original post: https://github.com/sxyazi/yazi/discussions/327

[[manager.prepend_keymap]]
on = "<C-n>"
run = '''
shell 'dragon -x -i -T "$1"' --confirm
'''

Copy selected files to the system clipboard while yanking

Yazi allows multiple commands to be bound to a single key, so you can set y to not only do the yank but also run a shell script:

[[manager.prepend_keymap]]
on = "y"
run = [ '''
shell 'echo "$@" | xclip -i -selection clipboard -t text/uri-list' --confirm
''', "yank" ]

The above is available on X11, there is also a Wayland version (Thanks @hurutparittya for sharing this in Yazi's discord server):

[[manager.prepend_keymap]]
on = "y"
run = [ '''
shell 'for path in "$@"; do echo "file://$path"; done | wl-copy -t text/uri-list' --confirm
''', "yank" ]

cd back to the root of the current Git repository

[[manager.prepend_keymap]]
on = [ "g", "r" ]
run = '''
shell 'ya pub dds-cd --str "$(git rev-parse --show-toplevel)"' --confirm
'''

Credits to @aidanzhai for sharing it in Yazi's telegram group.

Unix: Add subtitle to the running MPV

Add these lines to your ~/.config/yazi/yazi.toml:

[[opener.add-sub]]
run = ''' echo sub-add "'$0'" | socat - /tmp/mpv.sock '''
desc = "Add sub to MPV"

[[open.prepend_rules]]
name = "*.{ass,srt,ssa,sty,sup,vtt}"
use = [ "add-sub", "edit" ]

To make it work, make sure you've:

  1. Installed socat and can be found in your $PATH
  2. Enabled and configured the ipc socket to /tmp/mpv.sock, that is, include:
    input-ipc-server=/tmp/mpv.sock
    in your ~/.config/mpv/mpv.conf. See the documentation of --input-ipc-server for more info.

Maximize preview pane

Moved to https://github.com/yazi-rs/plugins/tree/main/max-preview.yazi

Hide preview pane

Moved to https://github.com/yazi-rs/plugins/tree/main/hide-preview.yazi

Save these lines as ~/.config/yazi/plugins/arrow.yazi/init.lua:

--- @sync entry
return {
entry = function(_, args)
local current = cx.active.current
local new = (current.cursor + args[1]) % #current.files
ya.manager_emit("arrow", { new - current.cursor })
end,
}

Then bind it for k and j key, in your keymap.toml:

[[manager.prepend_keymap]]
on = "k"
run = "plugin --sync arrow --args=-1"

[[manager.prepend_keymap]]
on = "j"
run = "plugin --sync arrow --args=1"

Navigation in the parent directory without leaving the CWD

Save these lines as ~/.config/yazi/plugins/parent-arrow.yazi/init.lua:

--- @sync entry
local function entry(_, args)
local parent = cx.active.parent
if not parent then return end

local target = parent.files[parent.cursor + 1 + args[1]]
if target and target.cha.is_dir then
ya.manager_emit("cd", { target.url })
end
end

return { entry = entry }

Then bind it for K and J key, in your keymap.toml:

[[manager.prepend_keymap]]
on = "K"
run = "plugin --sync parent-arrow --args=-1"

[[manager.prepend_keymap]]
on = "J"
run = "plugin --sync parent-arrow --args=1"

No status bar

Moved to https://github.com/yazi-rs/plugins/tree/main/no-status.yazi

Copy the Status:name() method only to your ~/.config/yazi/init.lua, and apply the following patch:

@@ -65,7 +65,11 @@ function Status:name()
return ui.Line {}
end

- return ui.Line(" " .. h.name)
+ local linked = ""
+ if h.link_to ~= nil then
+ linked = " -> " .. tostring(h.link_to)
+ end
+ return ui.Line(" " .. h.name .. linked)
end

Show user/group of files in status bar

Add the following code to your ~/.config/yazi/init.lua:

Status:children_add(function()
local h = cx.active.current.hovered
if h == nil or ya.target_family() ~= "unix" then
return ui.Line {}
end

return ui.Line {
ui.Span(ya.user_name(h.cha.uid) or tostring(h.cha.uid)):fg("magenta"),
ui.Span(":"),
ui.Span(ya.group_name(h.cha.gid) or tostring(h.cha.gid)):fg("magenta"),
ui.Span(" "),
}
end, 500, Status.RIGHT)

Show username and hostname in header

Add the following code to your ~/.config/yazi/init.lua:

Header:children_add(function()
if ya.target_family() ~= "unix" then
return ui.Line {}
end
return ui.Span(ya.user_name() .. "@" .. ya.host_name() .. ":"):fg("blue")
end, 500, Header.LEFT)

macOS: Preview files with the system Quick Look

[[manager.prepend_keymap]]
on = "<C-p>"
run = '''
shell 'qlmanage -p "$@"' --confirm
'''

Credits to @UncleGravity for sharing it in Yazi's discord server.

Specify a different editor for bulk renaming

This tip currently requires Yazi nightly version.

For bulk renaming, Yazi finds the first matching opener in your [open] rules with:

Value
blocktrue
name"bulk-rename.txt"
mime"text/plain"

to use as the editor for editing the file list.

By default, this matches your editor used for opening normal text files, if you want to use an editor different from that:

# ~/.config/yazi/yazi.toml
[[opener.bulk-rename]]
run = 'hx "$@"'
block = true

[[open.prepend_rules]]
name = "bulk-rename.txt"
use = "bulk-rename"

File tree picker in Helix with Zellij

Yazi can be used as a file picker to browse and open file(s) in your current Helix instance (running in a Zellij session).

Add a keymap to your Helix config, for example Ctrl + y:

# ~/.config/helix/config.toml
[keys.normal]
C-y = ":sh zellij run -c -f -x 10% -y 10% --width 80% --height 80% -- bash ~/.config/helix/yazi-picker.sh open"

Or if you also want to support splitting the pane, you can add more keymaps:

# ~/.config/helix/config.toml
[keys.normal.C-y]
# Open the file(s) in the current window
y = ":sh zellij run -c -f -x 10% -y 10% --width 80% --height 80% -- bash ~/.config/helix/yazi-picker.sh open"
# Open the file(s) in a vertical pane
v = ":sh zellij run -c -f -x 10% -y 10% --width 80% --height 80% -- bash ~/.config/helix/yazi-picker.sh vsplit"
# Open the file(s) in a horizontal pane
h = ":sh zellij run -c -f -x 10% -y 10% --width 80% --height 80% -- bash ~/.config/helix/yazi-picker.sh hsplit"

Then save the following script as ~/.config/helix/yazi-picker.sh:

#!/usr/bin/env bash

paths=$(yazi --chooser-file=/dev/stdout | while read -r; do printf "%q " "$REPLY"; done)

if [[ -n "$paths" ]]; then
zellij action toggle-floating-panes
zellij action write 27 # send <Escape> key
zellij action write-chars ":$1 $paths"
zellij action write 13 # send <Enter> key
else
zellij action toggle-floating-panes
fi

Note: this uses a floating window, but you should also be able to open a new pane to the side, or in place. Review the Zellij documentation for more info.

Original post: https://github.com/zellij-org/zellij/issues/3018#issuecomment-2086166900, credits to @rockboynton, @postsolar and @TheAwiteb for sharing and polishing it!

Demonstrate Helix+Zellij+Yazi workflow

Email selected files using Thunderbird

To send selected files using Thunderbird, with a keybinding Ctrl + e:

# ~/.config/yazi/keymap.toml
[[manager.prepend_keymap]]
on = "<C-e>"
run = '''
shell --confirm '
paths=$(for p in "$@"; do echo "$p"; done | paste -s -d,)
quoted="'\'$paths\''"
thunderbird -compose "attachment=$quoted"
'
'''

Make Yazi even faster than fast

While Yazi is already fast, there is still plenty of room for optimization for specific users or under certain conditions:

  • For users who don't need image previews at all, disabling the default image previewer and preloader will make Yazi faster by reducing the I/O read file and CPU decode image consumption.
  • For users managing network files, it's recommended to disable all previewers and preloaders since previewing and preloading these files means they need to be downloaded locally.
  • For low-spec devices like Raspberry Pi, reducing the concurrency will make Yazi faster since the default configuration is optimized for PCs, and high concurrency on these low-spec devices may have the opposite effect.
  • For users who don't need accurate mime-type, mime-ext.yazi may be useful, as it simply returns mime-type based on file extensions, while Yazi defaults to obtaining mime-type based on file content for accuracy. Mime-type is used for matching opening, previewing, rendering rules. Encourage users to choose an appropriate mime plugin based on their needs, which is why we decided to open it up to plugin developers.
  • For high-performance terminal emulators, lowering the image_delay option or setting it to 0 can reduce image preview latency.