使用 fzf-tmux 进行快速窗口切换的 tmux 脚本给了我错误的选项

GTF*_*GTF 5 tmux fzf

我写了以下内容,允许我使用 fzf 切换 tmux 窗口:

tmux list-windows -F "#I:#W" | fzf-tmux | cut -d ":" -f 1 | xargs tmux select-window -t
Run Code Online (Sandbox Code Playgroud)

当我在 shell 中运行它时,它运行良好,为我提供了一个fzf窗口列表,我可以搜索并切换到这些窗口。

我将它绑定到ftmux 中的键:

# fast window switching
unbind f
bind-key f run "tmux list-windows -F \"#I:#W\" | fzf-tmux | cut -d \":\" -f 1 | xargs tmux select-window -t"
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,它会显示 N 次相同的窗口(其中 N 是我打开的窗口数)。

所以如果我打开了 3 个窗口,在 zsh 中运行脚本会给我:

1. first window
2. second window
3. third window
Run Code Online (Sandbox Code Playgroud)

tmux 键绑定给我的地方

1. first window
1. first window
1. first window
Run Code Online (Sandbox Code Playgroud)

我以前没有写过 tmux 脚本,所以也许有比我在这里做的更好的获取窗口的方法?否则,我不明白为什么从 tmux 运行并在 shell 中运行时会得到不同的选项。

更新:

似乎run-shell "tmux list-windows"正确输出了不同的窗口(但带有我不想要的大量布局信息),而run-shell "tmux list-windows -F '#I:#W'"给了我每个窗口条目重复相同窗口的原始问题。

我认为问题在于 tmux 正在#I:#W当前 window扩展,而不是将其传递给list-windows命令,因此我需要对它们进行转义。关于如何做到这一点的任何想法?

更新 2:

答案是对变量进行双重散列(##I:##W而不是#I:#W)。

pet*_*ion 6

感谢您分享您的解决方案!帮了我很多:)

对于遇到这篇文章并想知道如何使用此命令在 tmux 会话之间切换的人:

bind-key C-f run-shell "tmux list-sessions -F \"##S\" | fzf-tmux | xargs tmux switch -t"


GTF*_*GTF 5

如果将来有人想使用这个脚本,正确的版本是:

# fast window switching
bind -n C-f run-shell "tmux list-windows -F \"##I:##W\" | fzf-tmux | cut -d \":\" -f 1 | xargs tmux select-window -t"
Run Code Online (Sandbox Code Playgroud)

  • 从 tmux 3.0a 开始,需要 -b 标志。请参阅:https://github.com/junegunn/fzf/issues/1841#issuecomment-580975759。现在所有这些都在一起: `bind -n Cf run-shell -b "tmux list-windows -F \"##I:##W\" | fzf-tmux | cut -d \":\" -f 1 | xargs tmux 选择窗口 -t"` (4认同)