tmux求助,跨session选择window

我目前只使用一个terminal。然后绑定快捷键,需要的时候直接使用快捷键来切换。

所以我的tmux中开启了多个session。每个session分别处理不同的事情。比如work,Mail等等。

每个session中开启了多个window。

以前只有一个session的时候,直接find-window可以通过搜索直接跳到对应的window中。

但是我发现find-window只能在当前session的window中跳转。

最后我发现使用choose-tree -u可以在多个session中选择对应的window直接切过去。

window一多,通过上下来选的效率就很低。

我想问下有没有类似find-window这种方式,输入一些字符先过滤掉一些window。但是可以跨session选择所以window。我理解choose-tree可以直接跳,接口应该是有的。但是我真没找到 :frowning:

PS:其实最爽的还是用emacs中类似ivy,helm这种动态过滤的方式 :slight_smile:

按 leader 键,再按 w 键,想怎么跳就怎么跳。还是互动有预览的哦~

我试了 find-window 的检索范围是全部 session,我的 tmux 版本是 2.7

如果习惯一个终端窗口的话,可以写个脚本列出所有 window 用 fzf 之类的过滤

我自己的使用习惯是,开 N 个终端的 Tab,使用 ModifierKey + NumberKey 切换;留两三个Tab给远程机器使用, 平时在开发的几个项目(在本地机器),每个项目分配一个Tab,同时也是一个 tmux session,并且 Tab 的索引 Number 也是固定的;最后其他本地和具体项目无关的杂事的处理,用一个 Tab,也是一个 session,Tab 索引固定

这个就是 LZ 说的 choose-tree,这个不能通过名字搜索和过滤,如果 session/window/pane 多了,会看花眼的

这个下面调的是choose-window,只是在一个session中的window。

另外,互动预览是咋玩的呀?我这边怎么不能展开每个window看里面的pane呢?

树形列表 + 预览,一般不会花眼的。当然如果你说开 50+ 窗口,没有搜索确实要费劲些。

谢谢。

我编了一个2.7的tmux试了一下。

tmux find-window还是找不到其它session中的window。

我写了脚本,使用choose-tree来列出所有,然后通过percol来选择。但是最后跳转的那一步不知道调用啥接口了。

默认是跨 session 的。

互动预览按 prefix key(我这里是 ctrl+q),然后按 w 就可以了。

刚试了下,直接执行 choose-tree 也是可以调出来的。和 @lululau 说的一致。


奇怪,那你们为啥没有预览呢?:flushed:

跳转到其它session的window,如果不用choose-tree 比较麻烦,需要先 switch-client 到所选窗口所属的 session,最后再用 select-window 就可以了

tmux switchc -t $SESSION_NAME; tmux select-window -t $SESSION_NAME:$WINDOW_INDEX

谢谢。

我先用percol试了一下,感觉选择起来还是不爽然后我在emacs中搞了一下这玩意儿:

(defun peng-switch-all-tmux-window ()
  (interactive)
  (let* ((tmux-list-command "tmux list-windows -a -F '#{session_name}:#{window_index}: #{window_name} #{pane_current_path} pane:#{window_panes}'")
         (line (ivy-read "Please choose a terminal to switch: "
                         (split-string (shell-command-to-string
                                        tmux-list-command) "\n")))
         (session-name (car (split-string line ":")))
         (window-index (cadr (split-string line ":")))
         (command (concat "wmctrl -xR lilyterm.Lilyterm && "
                          "tmux switchc -t "
                          session-name
                          " && tmux select-window -t "
                          session-name
                          ":"
                          window-index)))
    (shell-command command)))

其实想法很简单,就是emacs中直接调tmux的list接口来显示所有的window,然后用ivy-read来选择。

选择好后,使用wmctrl来切换窗口到我的terminal,然后调用tmux select-window选择就行。全部的命令都搞成一行,用emacs调用就行了。

这样只能在emacs中绑快捷键。全局的话,我又搞了一个这样的脚本:

#!/bin/bash

wmctrl -xR emacs.Emacs
emacsclient --no-wait -e "(peng-switch-all-tmux-window)"

然后全局绑到一个快捷键,就好了。

当然,唯一不爽的是,如果emacs当前正在使用ivy来读取东西的时候,这个功能就用不了。不过这种情况对我来说比较少。主要还是现在我elisp水平还搞不定这个问题 :slight_smile: 。可以将就使用了。

2 个赞

我知道了。我重新安装了最新的tmux,但是原来的tmux程序没有退出,还在内存里面。所以我一直使有的都是原来的老一点点的tmux。所以才没有预览功能。现在有了,谢谢啦。

My fault,我更新了tmux,但是tmux没有重启。还是用的以前老版本的tmux。重启新的tmux后,find-window是可以在多个session中选择的。谢谢啦。

知道真相的我眼泪掉下来 :joy:

我也是前段时间折腾 framebuffer 时,才知道这一功能的 :grin: 感觉挺好的。

list-panes 是不是更好一点?如果只列出窗口,pane_current_path 之外的路径就搜索不到了。

是的,不过我一般定位到window就可以啦 :slight_smile: