我目前只使用一个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可以直接跳,接口应该是有的。但是我真没找到
PS:其实最爽的还是用emacs中类似ivy,helm这种动态过滤的方式
按 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 说的一致。
奇怪,那你们为啥没有预览呢?
跳转到其它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水平还搞不定这个问题 。可以将就使用了。
2 个赞
我知道了。我重新安装了最新的tmux,但是原来的tmux程序没有退出,还在内存里面。所以我一直使有的都是原来的老一点点的tmux。所以才没有预览功能。现在有了,谢谢啦。
My fault,我更新了tmux,但是tmux没有重启。还是用的以前老版本的tmux。重启新的tmux后,find-window是可以在多个session中选择的。谢谢啦。
知道真相的我眼泪掉下来
我也是前段时间折腾 framebuffer 时,才知道这一功能的 感觉挺好的。
list-panes
是不是更好一点?如果只列出窗口,pane_current_path
之外的路径就搜索不到了。