此页面介绍了 fzf 如何与 tmux(一个终端多路复用器)集成。这种集成使得 fzf 可以在 tmux 窗格或弹出窗口中运行,而不是占用整个终端屏幕。当在 tmux 会话中运行时,这能提供更灵活、更具视觉吸引力的用户体验。
使用 fzf 与 tmux 的主要有两种方法:
--tmux 选项。fzf-tmux 包装脚本。下图展示了 fzf 的 tmux 集成在整个 fzf 架构中的位置。
来源: bin/fzf-tmux1-255 shell/key-bindings.bash38-40 shell/key-bindings.zsh64-66 shell/key-bindings.fish42-51
--tmux 选项fzf 的最新版本(需要 tmux 3.2 或更高版本)包含一个内置的 --tmux 选项,该选项会在你的 tmux 会话中创建一个弹出窗口。这是在核心 fzf 二进制文件中实现的,也是最新 tmux 版本的推荐方法。
--tmux [position][,WIDTH[%]][,HEIGHT[%]][,border-native]
position 可以是:center、top、bottom、left,或 right。
| 命令 | 描述 |
|---|---|
fzf --tmux center | 以 50% 的宽度和高度在中心打开 fzf。 |
fzf --tmux 80% | 以 80% 的宽度和高度在中心打开 fzf。 |
fzf --tmux 100%,50% | 以全宽度和 50% 的高度在中心打开 fzf。 |
fzf --tmux left,40% | 在左侧以 40% 的宽度打开 fzf。 |
fzf --tmux left,40%,90% | 在左侧以 40% 的宽度、90% 的高度打开 fzf。 |
fzf --tmux top,40% | 在顶部以 40% 的高度打开 fzf。 |
fzf --tmux bottom,80%,40% | 在底部以 80% 的宽度、40% 的高度打开 fzf。 |
当不在 tmux 会话中运行时,--tmux 选项会被静默忽略,因此可以安全地将其包含在可能在 tmux 外部使用的脚本和配置中。
来源: README.md338-345
对于较旧的 tmux 版本或需要更多对分栏的控制,fzf 提供了 fzf-tmux 包装脚本,以保持向后兼容性。此脚本位于 fzf 仓库的 bin/fzf-tmux 文件中。
fzf-tmux [LAYOUT OPTIONS] [--] [FZF OPTIONS]
fzf-tmux 脚本:
-- 之后的所有 fzf 选项转发给 fzf 本身。来源: bin/fzf-tmux1-255 bin/fzf-tmux141-254
fzf-tmux 脚本为弹出窗口和分栏提供了广泛的布局选项。
| 选项 | 描述 | 实现 |
|---|---|---|
-p [宽度[%][,高度[%]]] | 创建一个弹出窗口。 | 在内部设置 -E 选项。 |
-w 宽度[%] | 设置弹出窗口的宽度。 | 设置宽度参数。 |
-h 高度[%] | 设置弹出窗口的高度。 | 设置高度参数。 |
-x 列 | 设置弹出窗口的 X 位置。 | 设置列位置。 |
-y 行 | 设置弹出窗口的 Y 位置。 | 设置行位置。 |
| 选项 | 描述 | 实现 |
|---|---|---|
-u [高度[%]] | 向上分割(上方)。 | 设置 -d 选项并进行窗格交换。 |
-d [高度[%]] | 向下分割(下方)——默认。 | 默认分割方向。 |
-l [宽度[%]] | 向左分割。 | 设置 -h -d 选项并进行窗格交换。 |
-r [宽度[%]] | 向右分割。 | 设置 -h 选项。 |
来源: bin/fzf-tmux31-44 bin/fzf-tmux61-126
默认情况下,如果未指定布局选项,fzf-tmux 将使用 -d 50% 进行分栏。该脚本会自动处理基于百分比的尺寸调整和基于尺寸参数格式的绝对尺寸调整。
在使用 fzf 的 shell 集成时,你可以为 CTRL-T、CTRL-R 和 ALT-C 等键绑定配置 tmux 集成。shell 集成脚本会检查 tmux 特定的环境变量,以确定如何启动 fzf。
shell 集成脚本(key-bindings.bash、key-bindings.zsh 和 key-bindings.fish)都包含一个名为 __fzfcmd 的辅助函数,该函数决定是使用 fzf-tmux 还是常规的 fzf。
来源: shell/key-bindings.bash37-40 shell/key-bindings.zsh63-66 shell/key-bindings.fish42-51
你可以设置这些环境变量来定制每个键绑定在 tmux 中出现的方式。
来源: shell/key-bindings.bash38-40 shell/key-bindings.zsh64-66 shell/key-bindings.fish42-51
--tmux 选项和 fzf-tmux 包装脚本的一个关键特性是它们在不在 tmux 会话中或在某些功能不可用时能够优雅地降级。
回退逻辑同时在 fzf-tmux 脚本和 Vim 插件集成中实现。
fzf-tmux 中,如果不在 tmux 中运行,它会直接执行常规的 fzf bin/fzf-tmux141-144s_tmux_enabled() 函数会检查 tmux 的可用性 plugin/fzf.vim258-279fzf#run() 函数根据各种条件确定是否使用 tmux plugin/fzf.vim545-546来源:bin/fzf-tmux141-144 plugin/fzf.vim258-279 plugin/fzf.vim545-546
fzf Vim 插件包含对 tmux 集成的特殊处理。该插件会检查 tmux 的可用性并在适当时使用它
Vim 插件中的 s_tmux_enabled() 函数会检查:
fzf-tmux 脚本是否可执行,或者 fzf-tmux 是否在 PATH 中来源:plugin/fzf.vim258-279 plugin/fzf.vim545-546 plugin/fzf.vim589-598
fzf-tmux 脚本使用临时文件和命名管道来处理进程间的通信
该脚本处理一些特殊情况,例如:
tmux 集成与其他 fzf 选项配合良好
将 tmux 设置为默认的显示模式,但在非 tmux 环境下回退到基于高度的模式
此配置将在 tmux 中使用 tmux 弹出窗口,在非 tmux 环境下回退到基于高度的布局。
来源:bin/fzf-tmux149 plugin/fzf.vim600-608
fzf 中的 tmux 集成提供了一种灵活的方式,可以在不占用整个终端屏幕的情况下使用 fzf。内置的 --tmux 选项为现代 tmux 版本提供了一种简单的方法,而 fzf-tmux 包装器则提供向后兼容性和对布局的更多控制。
通过利用这些集成选项,用户可以增强他们的终端工作流程,尤其是在处理需要宝贵的屏幕空间的复杂 tmux 会话时。