本文档介绍了如何在 fzf 中定制键绑定,以增强您与模糊查找器的交互。键绑定允许您将按键和事件映射到特定操作,从而使您能够创建定制的工作流程并提高生产力。有关 shell 集成功能的更多信息,请参阅Shell Integration。
在 fzf 中,键绑定将用户输入(按键或事件)与修改应用程序行为的操作连接起来。键绑定系统包含三个主要组件:
来源:src/terminal.go290-291 src/terminal.go450-595 src/options.go1396-1421
您可以使用 --bind 选项,后跟一个逗号分隔的绑定表达式列表,来定制键绑定。
fzf --bind KEY:ACTION,KEY2:ACTION2,...
每个绑定表达式遵循 KEY:ACTION 的格式,其中:
KEY 是一个键标识符(例如,ctrl-j、alt-enter)或一个事件名称(例如,change、start)。ACTION 是一个操作名称,可选参数(例如,accept、execute(ls))。您还可以将多个按键和事件绑定到同一个操作。
fzf --bind 'start,ctrl-r:reload:ps -ef'
来源:man/man1/fzf.11056-1058 man/man1/fzf.11152-1157
fzf 随附一套用于常见操作的默认键绑定。
来源:src/terminal.go670-746 src/terminal.go450-599
fzf 支持多种可以绑定到操作的键标识符。
| 键类型 | 示例 |
|---|---|
| Ctrl 键 | ctrl-a 至 ctrl-z, ctrl-space, ctrl-\ |
| Alt 键 | alt-a 至 alt-z, alt-/ |
| 功能键 | f1 至 f12 |
| 特殊按键 | enter, space, bspace, esc, tab, btab (shift-tab) |
| 箭头键 | up, down, left, right |
| 鼠标操作 | left-click, right-click, scroll-up, scroll-down |
您也可以直接绑定任何单个字符键。
事件是可绑定到操作的系统触发的发生。
| 事件 | 描述 |
|---|---|
start | fzf 启动时触发一次。 |
load | 初始输入流完成时触发。 |
change | 查询字符串更改时触发。 |
result | 过滤完成且结果列表就绪时触发。 |
focus | 因光标移动导致焦点改变时触发。 |
one | 只有一个匹配项时触发。 |
zero | 没有匹配项时触发。 |
resize | 终端大小改变时触发。 |
backward-eof | 尝试删除已为空的查询字符串时触发。 |
jump | 在跳转模式下成功跳转到目标项目时触发。 |
jump-cancel | 取消跳转模式时触发。 |
click-header | 在标题栏中发生鼠标单击时触发。 |
来源:man/man1/fzf.11469-1598 CHANGELOG.md579-1068
fzf 提供了许多可以绑定到按键或事件的操作。以下是一些重要的类别:
up, down:向上/向下移动光标(实现为 actUp, actDown)。page-up, page-down:向上/向下翻页(actPageUp, actPageDown)。half-page-up, half-page-down:向上/向下滚动半页(actHalfPageUp, actHalfPageDown)。jump:类似于 EasyMotion 的 2 键移动(actJump)。first, last:移动到第一个/最后一个项目(actFirst, actLast)。pos(N):移动到位置 N(负值表示从末尾开始)(actPosition)。accept:接受当前选择(actAccept)。accept-non-empty:仅当存在选择时接受(actAcceptNonEmpty)。toggle:切换当前选择(actToggle)。select-all, deselect-all:选择/取消选择所有匹配项(actSelectAll, actDeselectAll)。toggle-all:切换所有匹配项的选择状态(actToggleAll)。toggle-in, toggle-out:切换并向上/向下移动(actToggleIn, actToggleOut)。clear-query:清除查询字符串(actClearQuery)。change-query(text):更改查询字符串(actChangeQuery)。transform-query(cmd):使用外部命令转换查询(actTransformQuery)。search(text):使用给定字符串触发搜索(actSearch)。preview(cmd):执行预览命令(actPreview)。preview-up, preview-down:滚动预览窗口(actPreviewUp, actPreviewDown)。toggle-preview:切换预览窗口可见性(actTogglePreview)。execute(cmd):在不离开 fzf 的情况下执行命令(actExecute)。execute-silent(cmd):静默执行命令(actExecuteSilent)。become(cmd):用命令替换 fzf 进程(actBecome)。reload(cmd):重新加载候选列表(actReload)。change-prompt(text):更改提示符字符串(actChangePrompt)。transform-prompt(cmd):使用外部命令转换提示符(actTransformPrompt)。change-preview-window(opts):更改预览窗口选项(actChangePreviewWindow)。track-current:在更新期间跟踪当前项目(actTrackCurrent)。来源:src/terminal.go450-599 src/options.go1486-1730
可以使用 + 分隔符将多个操作链接在一起。
fzf --bind 'ctrl-a:select-all+accept'
这将按顺序执行操作。如果包含会终止 fzf 的操作(例如 accept 或 abort),则会忽略后续操作。
来源:src/options.go1486 src/options.go1496-1730
许多操作都可以接受参数。通用语法是:
action-name(argument)
例如
fzf --bind 'ctrl-v:preview(cat {})'
如果参数包含括号,您可以使用替代表示法来避免解析错误。
action-name[argument]
action-name{argument}
action-name<argument>
action-name~argument~
还有其他几种表示法可以避免解析问题。
来源:man/man1/fzf.11744-1776 CHANGELOG.md740-760
占位符可以在操作参数中使用,以引用动态值。
| 占位符 | 描述 | 实现 |
|---|---|---|
{} | 当前行(项目) | placeholderItem |
{q} | 当前查询字符串 | placeholderQuery |
{n} | 当前项目的零基序数索引。 | placeholderOrdinal |
{+} | 选定的项目,每个项目单独引用 | placeholderItems |
{+f} | 包含所选项目的文件夹路径 | placeholderItemsFile |
{s} | 使用字段索引表达式时保留空格 | placeholderFlags 中的标志 |
{r} | 原始输出,不带引号 | placeholderFlags 中的标志 |
可以使用字段索引表达式来提取特定字段
fzf --bind 'enter:execute(echo Field 1: {1})'
来源: src/terminal.go69-70 src/terminal.go627-634
转换操作允许根据命令的输出有条件地执行其他操作
fzf --bind 'enter:transform:[[ -n {} ]] && echo accept || echo "change-header:Invalid selection"'
这实际上是在您的按键绑定中创建了一个 if-else 语句。转换操作(actTransform)执行一个命令,然后将输出作为新操作进行处理。
来源: src/terminal.go549-550 src/options.go1841-1842
您可以在运行时修改按键绑定
unbind(KEY): 移除按键绑定 (actUnbind)rebind(KEY): 解绑后恢复按键绑定 (actRebind)toggle-bind: 切换按键绑定状态 (actToggleBind)fzf --bind 'ctrl-g:unbind(ctrl-t)+change-header:Unbound'
这些操作会修改 Terminal 结构中的 keymap 和 keymapOrg 映射,以动态更改可用的按键绑定。
来源: src/terminal.go590-592 src/options.go1793-1795
您可以在不离开 fzf 的情况下执行命令
fzf --bind "enter:execute(less {})"
这会在 less 中打开选定的文件。该命令在新终端会话中执行,fzf 在返回控制之前等待其完成。
来源: man/man1/fzf.11779-1786 CHANGELOG.md827-835
fzf 会将一些环境变量导出到子进程,这些变量可用于自定义命令
| 可变 | 描述 | 代码中的来源 |
|---|---|---|
$FZF_QUERY | 当前查询字符串。 | FZF_QUERY="+string(t.input)" |
$FZF_PROMPT | 提示字符串 | FZF_PROMPT="+string(t.promptString)" |
$FZF_PREVIEW_LINES | 预览窗口的行数 | 预览环境中的 LINES=%d |
$FZF_PREVIEW_COLUMNS | 预览窗口的列数 | 预览环境中的 COLUMNS=%d |
$FZF_POS | 列表中光标的垂直位置 | FZF_POS=%d |
$FZF_ACTION | 上一个执行的操作的名称 | FZF_ACTION="+t.lastAction.Name()" |
$FZF_KEY | 上一个按下的键的名称 | FZF_KEY="+t.lastKey" |
这些可以用来创建动态行为
fzf --bind 'focus:transform-preview-label:echo [ Position: $FZF_POS ]'
来源: src/terminal.go1078-1137 src/terminal.go1092-1117
以下是一些按键绑定自定义的实用示例
fzf --bind 'ctrl-a:select-all,ctrl-d:deselect-all,ctrl-t:toggle-all'
git ls-files | fzf --preview 'cat {}' \
--bind 'ctrl-/:toggle-preview' \
--bind 'ctrl-y:execute-silent(echo {} | clipboard)+abort'
find . -type f | fzf \
--bind 'enter:execute(less {})' \
--bind 'ctrl-e:execute(vim {})' \
--bind 'ctrl-y:execute-silent(echo {} | xclip -selection clipboard)'
fzf --bind 'enter:transform:[[ -n {} ]] && echo accept || echo "change-header:Please select an item"'
fzf --bind 'space:jump,jump:accept'
来源: man/man1/fzf.11056-1058 CHANGELOG.md450-550 CHANGELOG.md792-827
按键绑定在将 fzf 与 shell 脚本集成时特别有用。例如
来源: man/man1/fzf.11779-1786 CHANGELOG.md1049-1062
fzf 中按键绑定系统的内部架构如下所示
来源: src/terminal.go290-291 src/terminal.go450-599 src/terminal.go670-746
按键绑定自定义是 fzf 的一个强大功能,它允许您创建定制的工作流程。通过了解可用的键、事件和操作,您可以显著提高使用 fzf 的效率。尝试不同的组合,找到最适合您特定用例的设置。
请记住,您还可以通过 FZF_DEFAULT_OPTS 环境变量设置默认的按键绑定,这样就不必每次运行 fzf 时都指定它们了。