keymap.toml

你可以在 keymap.toml 文件中修改 Yazi 的快捷键绑定。它由以下 8 个层(layer)组成:

  • [mgr] - 文件列表
  • [tasks] - 任务管理器
  • [spot] - 文件信息 spotter
  • [pick] - 选择组件,例如文件的 “open with”
  • [input] - 输入组件,例如 create、rename 等
  • [confirm] - 确认对话框,例如 remove、overwrite 等
  • [cmp] - 补全组件,例如 “cd” 的 URL 补全
  • [help] - 帮助菜单

在每一层中,都有两个属性:prepend_keymapappend_keymap。 prepend 会插入到默认快捷键之前,而 append 会插入到默认快捷键之后。

由于 Yazi 会执行第一个匹配到的按键,因此 prepend 的优先级总是高于默认配置,而 append 的优先级总是低于默认配置:

  1. [mgr]
  2. prepend_keymap = [
  3. { on = "<C-a>", run = "act1", desc = "Single action with `Ctrl + a`" },
  4. ]
  5. append_keymap = [
  6. { on = [ "g", "b" ], run = "act2", desc = "Single action with `g ⇒ b`" },
  7. { on = "c", run = [ "act1", "act2" ], desc = "Multiple actions with `c`" }
  8. ]

或者你也可以用另一种写法:

  1. [[mgr.prepend_keymap]]
  2. on = "<C-a>"
  3. run = "act1"
  4. desc = "Single action with `Ctrl + a`"
  5. [[mgr.append_keymap]]
  6. on = [ "g", "b" ]
  7. run = "act2"
  8. desc = "Single action with `g ⇒ b`"
  9. [[mgr.append_keymap]]
  10. on = "c"
  11. run = [ "act1", "act2" ]
  12. desc = "Multiple actions with `c`"

但要注意,你只能选择其中一种写法,不能把两种混用,因为 TOML 语言不允许这样做:

  1. [mgr]
  2. prepend_keymap = [
  3. { on = "<C-a>", run = "act1" },
  4. ]
  5. [[mgr.append_keymap]]
  6. on = [ "g", "b" ]
  7. run = "act2"

当你不需要任何默认快捷键,并想完全自定义自己的键位时,可以使用 keymap,例如:

  1. [mgr]
  2. keymap = [
  3. # 这会覆盖所有默认快捷键,只保留下面两个。
  4. { on = "<C-a>", run = "act1" },
  5. { on = [ "g", "b" ], run = "act2" },
  6. ]

按键表示法

你可以在每条快捷键规则的 on 中指定一个或多个按键。每个按键都可以用以下表示法之一来表示:

表示法 说明 表示法 说明
a - z 小写字母 A - Z 大写字母
<Space> 空格键 <Backspace> 退格键
<Enter> 回车键 - -
<Left> 左方向键 <Right> 右方向键
<Up> 上方向键 <Down> 下方向键
<Home> Home 键 <End> End 键
<PageUp> PageUp 键 <PageDown> PageDown 键
<Tab> Tab 键 <BackTab> Shift + Tab
<Delete> Delete 键 <Insert> Insert 键
<F1> - <F19> 功能键 <Esc> Esc 键

你还可以为上述按键组合以下修饰键:

修饰键 说明
<S-…> Shift 键
<C-…> Ctrl 键
<A-…> Alt/Meta 键
<D-…> Command/Windows/Super 键

例如:

  • <C-a> 表示 Ctrl + a
  • <C-S-b><C-B> 表示 Ctrl + Shift + b

注意:

  1. 并不是所有终端都支持 <D-...>。如果你想使用它,请确保你的终端支持并启用了 CSI u
  2. macOS 没有 Alt 键,因此 <A-...> 无法直接工作。有些终端提供将 Option 映射为 Alt 的设置,请确保已启用。
  3. 传统终端键盘协议 会将 <Tab><C-i><Enter><C-m> 等视为同一个按键。如果你想区分它们,请确保你的终端支持并启用了 CSI u

[mgr]

escape

取消查找、退出可视模式、清除选中项、取消过滤,或取消搜索。

参数/选项 说明
--all 执行以下所有操作
--find 取消查找
--visual 退出可视模式
--select 清除选中项
--filter 取消过滤
--search 取消搜索

默认会自动判断要执行的操作;指定选项后,只会执行被选中的操作;多个选项可以叠加使用。

quit

退出进程。

参数/选项 说明
--code=[n] 退出码
--no-cwd-file 不将当前目录输出到 yazi --cwd-file 指定的文件中

close

关闭当前标签页;如果这是最后一个标签页,则改为退出进程。

参数/选项 说明
--code=[n] 退出时使用的退出码
--no-cwd-file 退出时不将当前目录输出到 yazi --cwd-file 指定的文件中

suspend

暂停 Yazi,并返回父 shell 继续执行其他任务。

完成后,可在 shell 中使用 fg 命令发送恢复信号并返回 Yazi。

arrow

leave

返回到当前悬停文件的父目录;如果当前没有悬停文件,则返回当前工作目录的父目录。

enter

进入子目录。

back

返回上一个目录。

forward

前进到下一个目录。

seek

滚动预览面板中的内容。

参数/选项 说明
[n] 负值表示向上滚动,正值表示向下滚动

spot

使用预设或用户自定义的 spotter 显示文件信息。

cd

切换当前目录。

参数/选项 说明
[url] 要切换到的 URL
--interactive 使用交互式 UI 输入 URL

你可以添加自己的 g 系列按键,来实现简单的书签功能:

  1. [[mgr.prepend_keymap]]
  2. on = [ "g", "d" ]
  3. run = "cd ~/Downloads"
  4. desc = "Cd to ~/Downloads"
  5. [[mgr.prepend_keymap]]
  6. on = [ "g", "p" ]
  7. run = "cd ~/Pictures"
  8. desc = "Cd to ~/Pictures"

对于 Windows 用户,也可以通过 cd 动作切换盘符:

  1. [[mgr.prepend_keymap]]
  2. on = [ "g", "d" ]
  3. run = "cd D:"
  4. desc = "Switch to D drive"
  5. [[mgr.prepend_keymap]]
  6. on = [ "g", "p" ]
  7. run = 'cd "E:\\Pictures"' # 需要转义反斜杠
  8. desc = 'Cd to E:\Pictures'

更完整的书签 plugin 可参见 resources page

follow

如果当前悬停文件是符号链接,则跟随它。

reveal

将光标悬停到指定文件上。

如果该文件不在当前目录中,会先切换当前目录到该文件的父目录。

参数/选项 说明
[url] 要 reveal 的 URL

toggle

切换当前悬停文件的选中状态。

参数/选项 说明
N/A 反转选中状态
--state=on 选中文件
--state=off 取消选中文件

toggle_all

切换当前工作目录中所有文件的选中状态。

参数/选项 说明
N/A 反转所有选中状态
--state=on 选中文件
--state=off 取消选中文件

注意,toggle_all --state=off 只会取消当前工作目录(CWD)中的选中项;如果你在多个目录中选中了文件,并想全部取消,请使用 escape --select

visual_mode

进入可视模式。

参数/选项 说明
N/A 选择模式
--unset 取消选择模式

open

使用 [open] 中定义的规则 打开所选文件。

参数/选项 说明
--interactive 用交互式 UI 打开当前悬停/已选中的文件,并选择打开方式
--hovered 无论当前是否有选中项,都始终打开当前悬停文件

yank

Yank 选中的文件。

参数/选项 说明
N/A 复制模式
--cut 剪切模式

unyank

取消文件的 yank 状态。

paste

粘贴已 yank 的文件。

参数/选项 说明
--force 如果目标文件已存在,则直接覆盖
--follow 复制符号链接所指向的文件,而不是复制符号链接本身。仅在复制时可用

link

为已 yank 的文件创建符号链接。(在 Windows 上这是特权操作,必须以管理员身份运行。)

参数/选项 说明
--relative 对符号链接使用相对路径
--force 如果目标文件已存在,则直接覆盖

hardlink

为已 yank 的文件创建硬链接。

参数/选项 说明
--force 如果目标文件已存在,则直接覆盖
--follow 为符号链接指向的文件创建硬链接,而不是为符号链接本身创建硬链接

remove

在 macOS / Windows 上将文件移动到废纸篓 / 回收站。对于 Linux,则遵循 FreeDesktop.org Trash Specification

在 Android 平台上,由于不存在回收站概念,因此只能结合 --permanently 选项使用。

参数/选项 说明
--force 不显示确认对话框,直接移动到回收站或删除
--permanently 永久删除文件
--hovered 无论当前是否有选中项,都始终删除当前悬停文件

create

创建文件或目录。以 /(Unix)或 \(Windows)结尾时表示创建目录。

参数/选项 说明
--dir 始终创建目录,不受是否以 /\ 结尾影响
--force 如果目标文件已存在,则直接覆盖,不显示确认对话框

rename

重命名文件或目录;如果选中了多个文件,则执行批量重命名(默认使用 $EDITOR 编辑文件名,详见 Specify a different editor for bulk renaming)。

  • --hovered:无论当前是否有选中项,都始终重命名当前悬停文件
  • --force:如果目标文件已存在,则直接覆盖,不显示确认对话框
  • --empty:清空文件名的一部分

    • "stem":清空主文件名,例如 "foo.jpg" -> ".jpg"
    • "ext":清空扩展名,例如 "foo.jpg" -> "foo."
    • "dot_ext":清空点号和扩展名,例如 "foo.jpg" -> "foo"
    • "all":清空整个文件名,例如 "foo.jpg" -> ""
  • --cursor:指定重命名输入框中的光标位置

    • "end":文件名末尾
    • "start":文件名开头
    • "before_ext":扩展名前

你也可以将 --cursor--empty 结合使用。例如,rename --empty=stem --cursor=start 会清空文件主名,并把光标移动到开头。

这会让文件名 foo.jpg 在输入框中显示为 |.jpg,其中 | 表示光标位置。

copy

复制已选中或当前悬停的文件/目录的 URL。

参数/选项 说明
[what] 要复制的内容,见下表
--separator 路径分隔符,见下表
--hovered 无论当前是否有选中项,都始终复制当前悬停文件

[what] 可取以下值之一:

说明
"path" 文件的 URL
"dirname" 父目录的 URL
"filename" 文件名
"name_without_ext" 不带扩展名的文件名

--separator 可取以下值之一:

说明
N/A 平台相关分隔符,例如 Windows 使用 \,Unix 使用 /
"unix" 在所有平台上一律使用 /

shell

运行 shell 命令。

参数/选项 说明
[template] 可选,要运行的命令模板
--block 以阻塞方式打开。设置后,Yazi 会隐藏到 secondary screen,并在 main screen 显示该程序,直到程序退出。在此期间它可以接收 I/O 信号,这对交互式程序很有用。
--orphan 即使 Yazi 已退出,也保持进程继续运行。指定后,进程会从任务调度系统中分离。
--interactive 通过交互方式让用户输入要执行的命令
--cursor 设置交互式命令输入框中光标的初始位置。例如,shell 'zip -r .zip %h' --cursor=7 --interactive 会把光标放在 .zip 之前。

你可以在 [template] 中使用以下格式化参数:

  • %h:当前悬停文件的路径;如果当前目录为空且没有悬停文件,则为空
  • %s:所有已选文件的路径
  • %sN:第 N 个已选文件的路径,例如 %s1%s2
  • %d:所有已选文件所在目录的路径
  • %dN:第 N 个已选文件所在目录的路径,例如 %d1%d2
  • %%:转义后的 % 字符本身

以及它们的 URL 版本:

  • %H:当前悬停文件的 URL;如果当前目录为空且没有悬停文件,则为空
  • %S:所有已选文件的 URL
  • %SN:第 N 个已选文件的 URL,例如 %S1%S2
  • %D:所有已选文件所在目录的 URL
  • %DN:第 N 个已选文件所在目录的 URL,例如 %D1%D2

你可以使用 end-of-options marker(--)来避免转义问题——-- 之后的所有内容都会被当作原始字符串处理:

  1. [[mgr.prepend_keymap]]
  2. on = "d"
  3. - run = "shell \"trash-put %s\""
  4. + run = "shell -- trash-put %s"
  5. desc = "Trash selected files"

对于复杂的 shell 脚本,你可以使用 TOML 的基础字符串('''""")将其写成多行,示例见 this tip

hidden

设置隐藏文件的可见性。

参数/选项 说明
"show" 显示隐藏文件
"hide" 隐藏隐藏文件
"toggle" 切换隐藏状态

linemode

设置 line mode

参数/选项 说明
"none" 不启用 line mode
"size" 显示文件的字节大小。注意,目前目录大小仅会在 sort_by = "size" 时被计算,未来可能会改变。
"btime" 显示文件创建时间
"mtime" 显示文件最后修改时间
"permissions" 显示文件权限,仅在 Unix-like 系统可用
"owner" 显示文件所有者,仅在 Unix-like 系统可用

search

参数/选项 说明
--via 搜索引擎,可用值:fdrgrga
--args 传递给指定引擎的额外参数,例如 search --via=fd --args='-e -H'

你可以通过 fd 配合空关键字("")来实现平铺视图(flat view)。

演示平铺视图

原帖:https://github.com/sxyazi/yazi/issues/676#issuecomment-1943494129

或者把一个按键绑定到 search_do 动作上,以便快速切换到平铺视图:

  1. [[mgr.prepend_keymap]]
  2. on = [ "g", "f" ]
  3. run = 'search_do --via=fd --args="-d 3"'
  4. desc = "Switch to the flat view with a max depth of 3"

find

在当前工作目录中以交互、增量的方式查找文件。

参数/选项 说明
--previous 查找上一个匹配项
--smart 使用 smart-case 查找:如果查询中包含大写字母则区分大小写,否则不区分大小写
--insensitive 使用不区分大小写的查找

find_arrow

将光标移动到下一个或上一个匹配项。

参数/选项 说明
--previous 移动到上一个匹配项

filter

参数/选项 说明
--smart 使用 smart-case 过滤:如果关键字中包含大写字母则区分大小写,否则不区分大小写
--insensitive 使用不区分大小写的过滤

sort

  • [by]:可选;如果不提供,则保持当前排序方式不变

    • "none":不排序
    • "mtime":按最后修改时间排序
    • "btime":按创建时间排序
    • "extension":按文件扩展名排序
    • "alphabetical":按字母顺序排序,例如 1.md < 10.md < 2.md
    • "natural":按自然顺序排序,例如 1.md < 2.md < 10.md
    • "size":按文件大小排序
    • "random":随机排序
  • --reverse:倒序显示文件。--reverse--reverse=yes 为启用,--reverse=no 为禁用。
  • --dir-first:目录优先显示。--dir-first--dir-first=yes 为启用,--dir-first=no 为禁用。
  • --translit:对文件名进行音译转换排序,详见 sort_translit--translit--translit=yes 为启用,--translit=no 为禁用。

tab_create

参数/选项 说明
[url] 可选,使用指定 URL 创建新标签页
--current 可选,使用当前 URL 创建新标签页

如果既没有指定 [url],也没有指定 --current,则会使用启动目录创建标签页。

tab_close

参数/选项 说明
[n] 关闭位置为 n 的标签页,从 0 开始

如果你想关闭当前标签页,请改用 close 动作。

tab_switch

参数/选项 说明
[n] 切换到位置为 n 的标签页,从 0 开始
--relative 切换到相对于当前标签页的位置。使用该参数时,n 可以是负数

tab_swap

参数/选项 说明
[n] 将当前标签页与位置为 n 的标签页交换。负值表示向前移动标签页,正值表示向后移动标签页

help

打开帮助菜单。

plugin

参见 Functional plugin

noop

如果你想禁用某些预设快捷键,而不重写整个 keymap,可以使用虚拟动作 noop

例如,要禁用默认的 gc

  1. [[mgr.prepend_keymap]]
  2. on = [ "g", "c" ]
  3. run = "noop"

或者如果你更喜欢数组写法:

  1. [[mgr.prepend_keymap]]
  2. on = [ "g", "c" ]
  3. run = [ "noop" ] # 数组只能有一个元素,且必须是 "noop"

被禁用的按键按下后不会触发任何动作,也不会显示在 which 组件中。

[tasks]

show

显示任务管理器。

close

隐藏任务管理器。

arrow

inspect

查看任务日志:

  • 失败文件操作的 I/O error
  • 失败异步 plugin 任务的 Lua error
  • 后台运行或失败的 shell 任务的实时 stdout/stderr

q 退出 inspect 视图。

cancel

取消任务。

help

打开帮助菜单。

plugin

参见 Functional plugin

noop

参见 noop action

[spot]

close

隐藏 spotter。

arrow

swipe

参数/选项 说明
[n] 在文件列表中向上或向下滑动 n 个文件。负值表示向上,正值表示向下

copy

从 spotter 中复制内容。

参数/选项 说明
"cell" 复制当前选中的表格单元格

plugin

参见 Functional plugin

noop

参见 noop action

help

打开帮助菜单。

[pick]

close

取消 picker。

参数/选项 说明
--submit 提交 picker

arrow

help

打开帮助菜单。

plugin

参见 Functional plugin

noop

参见 noop action

[input]

close

取消输入。

参数/选项 说明
--submit 提交输入

escape

返回普通模式,或取消输入。

move

将光标向左或向右移动。

参数/选项 说明
[n] 将光标向左或向右移动 n 个字符。负值表示向左,正值表示向右
--in-operating 仅当当前正在等待一个操作时才移动光标

backward

向后移动到当前单词或上一个单词的开头。

forward

向前移动到下一个单词的开头。

参数/选项 说明
--end-of-word 向前移动到当前单词或下一个单词的结尾

insert

进入插入模式。该动作仅在普通模式下可用。

参数/选项 说明
--append 在光标后插入

visual

进入可视模式。该动作仅在普通模式下可用。

delete

删除选中的字符。该动作仅在普通模式下可用。

参数/选项 说明
--cut 将选中的字符剪切到剪贴板,而不只是删除
--insert 删除后进入插入模式

yank

复制选中的字符。该动作仅在普通模式下可用。

paste

在光标后粘贴已复制的字符。该动作仅在普通模式下可用。

参数/选项 说明
--before 在光标前粘贴复制的字符

undo

撤销上一次操作。该动作仅在普通模式下可用。

redo

重做上一次操作。该动作仅在普通模式下可用。

help

打开帮助菜单。该动作仅在普通模式下可用。

backspace

删除光标前的字符。该动作仅在插入模式下可用。

参数/选项 说明
--under 删除光标所在位置的字符

kill

删除指定范围内的字符。该动作仅在插入模式下可用。

参数/选项 说明
"bol" 向后删除到行首(BOL)
"eol" 向前删除到行尾(EOL)
"backward" 向后删除到当前单词开头
"forward" 向前删除到当前单词结尾

plugin

参见 Functional plugin。该动作仅在普通模式下可用。

noop

参见 noop action

[confirm]

close

取消并关闭确认对话框。

参数/选项 说明
--submit 提交确认

arrow

help

打开帮助菜单。

[cmp]

close

隐藏补全菜单。

参数/选项 说明
--submit 提交补全结果

arrow

help

打开帮助菜单。

plugin

参见 Functional plugin

noop

参见 noop action

[help]

close

隐藏帮助菜单。

escape

清除过滤条件,或隐藏帮助菜单。

arrow

filter

为帮助项应用过滤条件。

plugin

参见 Functional plugin

noop

参见 noop action