菜单

tmux 集成

相关源文件

此页面介绍了 fzf 如何与 tmux(一个终端多路复用器)集成。这种集成使得 fzf 可以在 tmux 窗格或弹出窗口中运行,而不是占用整个终端屏幕。当在 tmux 会话中运行时,这能提供更灵活、更具视觉吸引力的用户体验。

使用 fzf 与 tmux 的主要有两种方法:

  1. fzf 最新版本中内置的 --tmux 选项。
  2. 为了向后兼容和提供额外的布局选项,使用了 fzf-tmux 包装脚本。

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 可以是:centertopbottomleft,或 right

常见用法示例

来源: plugin/fzf.vim600-608

示例命令

命令描述
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

fzf-tmux 包装脚本

对于较旧的 tmux 版本或需要更多对分栏的控制,fzf 提供了 fzf-tmux 包装脚本,以保持向后兼容性。此脚本位于 fzf 仓库的 bin/fzf-tmux 文件中。

语法和操作

fzf-tmux [LAYOUT OPTIONS] [--] [FZF OPTIONS]

fzf-tmux 脚本:

  1. 检查是否在 tmux 中运行。
  2. 根据选项创建分栏或弹出窗口。
  3. 在该窗格/窗口中运行 fzf。
  4. -- 之后的所有 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% 进行分栏。该脚本会自动处理基于百分比的尺寸调整和基于尺寸参数格式的绝对尺寸调整。

示例

来源: man/man1/fzf-tmux.143-68

与 shell 键绑定集成

在使用 fzf 的 shell 集成时,你可以为 CTRL-T、CTRL-R 和 ALT-C 等键绑定配置 tmux 集成。shell 集成脚本会检查 tmux 特定的环境变量,以确定如何启动 fzf。

Shell 集成实现

shell 集成脚本(key-bindings.bashkey-bindings.zshkey-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 插件集成中实现。

  1. fzf-tmux 中,如果不在 tmux 中运行,它会直接执行常规的 fzf bin/fzf-tmux141-144
  2. 在 Vim 插件中,s_tmux_enabled() 函数会检查 tmux 的可用性 plugin/fzf.vim258-279
  3. Vim 插件中的 fzf#run() 函数根据各种条件确定是否使用 tmux plugin/fzf.vim545-546

来源:bin/fzf-tmux141-144 plugin/fzf.vim258-279 plugin/fzf.vim545-546

实现细节

Vim 插件集成

fzf Vim 插件包含对 tmux 集成的特殊处理。该插件会检查 tmux 的可用性并在适当时使用它

Vim 插件中的 s_tmux_enabled() 函数会检查:

  1. 是否在 GUI 模式下运行(返回 false)
  2. 是否存在 $TMUX 环境变量
  3. fzf-tmux 脚本是否可执行,或者 fzf-tmux 是否在 PATH 中
  4. tmux 版本是否是 1.7 或更新版本

来源:plugin/fzf.vim258-279 plugin/fzf.vim545-546 plugin/fzf.vim589-598

fzf-tmux 实现

fzf-tmux 脚本使用临时文件和命名管道来处理进程间的通信

该脚本处理一些特殊情况,例如:

来源:bin/fzf-tmux160-254

有效使用技巧

与其他选项结合使用

tmux 集成与其他 fzf 选项配合良好

默认配置

将 tmux 设置为默认的显示模式,但在非 tmux 环境下回退到基于高度的模式

此配置将在 tmux 中使用 tmux 弹出窗口,在非 tmux 环境下回退到基于高度的布局。

来源:bin/fzf-tmux149 plugin/fzf.vim600-608

结论

fzf 中的 tmux 集成提供了一种灵活的方式,可以在不占用整个终端屏幕的情况下使用 fzf。内置的 --tmux 选项为现代 tmux 版本提供了一种简单的方法,而 fzf-tmux 包装器则提供向后兼容性和对布局的更多控制。

通过利用这些集成选项,用户可以增强他们的终端工作流程,尤其是在处理需要宝贵的屏幕空间的复杂 tmux 会话时。