将较小的显示器切换到较大的显示器时,有什么方法可以重画tmux窗口?


399

假设您正在使用Terminal.app通过ssh连接到远程服务器。当您从以前启动过的较小的监视器中以较大的分辨率监视器“附加tmux”时,它将在控制台周围绘制点。它不适合新的窗口大小。有什么方法可以重画和清洁窗户吗?CTRL+ LCTRL- B+ R没有帮助。我找不到关于男人的任何正确命令。

% tmux -V
tmux 1.5

7
我想知道如何重新绘制所有会话而不分离它们中的任何一个。
PJ Brunet

3
每个人都超脱...您找到方法了吗?
Patoshiパトシ2016年


是的,我仍然很想知道问题的答案:“有什么方法可以重绘和清洁窗户吗?”
jaydel

Answers:


579

tmux将窗口的尺寸限制为该窗口所连接的所有会话中每个尺寸的最小值。如果不这样做,将没有明智的方式来显示所有附加客户端的整个窗口区域。

最简单的方法是在附加时从会话中分离其他任何客户端:

tmux attach -d

或者,您可以在附加到会话之前将任何其他客户端移动到其他会话:

takeover() {
    # create a temporary session that displays the "how to go back" message
    tmp='takeover temp session'
    if ! tmux has-session -t "$tmp"; then
        tmux new-session -d -s "$tmp"
        tmux set-option -t "$tmp" set-remain-on-exit on
        tmux new-window -kt "$tmp":0 \
            'echo "Use Prefix + L (i.e. ^B L) to return to session."'
    fi

    # switch any clients attached to the target session to the temp session
    session="$1"
    for client in $(tmux list-clients -t "$session" | cut -f 1 -d :); do
        tmux switch-client -c "$client" -t "$tmp"
    done

    # attach to the target session
    tmux attach -t "$session"
}
takeover 'original session' # or the session number if you do not name sessions

如果较小的客户端切换到会话,则屏幕将再次缩小。

还有一种变体,您仅“接管”窗口(将窗口链接到新的会话,进行设置aggressive-resize,然后将使该窗口处于活动状态的任何其他会话切换到其他窗口),但是在一般情况下很难编写脚本情况(与“退出”不同,因为您要取消链接窗口或终止会话而不是仅仅从会话中分离)。


请注意,您可以使用获取当前会话$(tmux display-message -p '#S'),请参阅:superuser.com/questions/410017/…
GManNickG 2014年

3
该答案为详细信息和知识库提供了支持。但是请参阅Shi B.的答案,Ctrl-b + D以易于使用(并记住)。
fbicknel

“ tmux detach -a”为我工作;“ tmux附加-d”没有。
mahemoff

(1)个更新的tmux错误set-option... set-remain-on-exit on。参见tmux#787。现在,使用:tmux set-hook -t "$tmp" window-linked 'set remain-on-exit on
user1902689 '18 -10-28

1
(2)在更新的tmux上,必须使用new-window类似这样的最后一个参数,'echo "Use Prefix + L (i.e. ^B L) to return to session.'; while(true); do read; done"否则您将看不到该消息。(在某些情况下,如果向上滚动或终端更高,您会看到它。)如果使用此功能,最好不用我的注释“(1)”或任何设置remain-on-exit
user1902689

462

您始终可以按CTRL- B+ SHIFT- D选择要从会话中分离的客户端。

tmux将列出所有具有当前维度的会话。然后,您只需脱离所有较小规模的会话。


6
澄清。它是大写字母D。小“ d”使客户脱离。
Raghuram Murthy P

2
CTRL-B如果这是您的前缀。矿一直CTRL-A以来,我从屏幕切换。
Blaskovicz

1
实际上,您需要从同一会话组中分离出所有较小的会话。但是,CTRL-B + SHIFT-D不会显示每个会话属于哪个组。我希望运行时tmux list-sessions显示会话名称,大小和组信息,然后tmux kill-session -t <session_name>杀死同一组的会话。
Zhichang Yu

180

现在,您可以执行一个针对tmux最新版本(在1.9版上测试)的简单解决方案:

tmux detach -a

-a 适用于此会话上的所有其他客户端,当前会话除外

您可以在。[bash | zsh] rc中为其添加别名

alias takeover="tmux detach -a"

工作流程:您可以正常连接到您的会话,如果您被另一个会话压低了tmux窗口大小,则可以直接致电takeover


13
非常感谢!工作了。如果您在活动的tmux会话中执行此操作,只需按CTRL + B(或您自定义的tmux命令中的:detach -a
任意一个

或者只是tmux detach -a在Tmux中的shell命令行上执行。
jdhao

4

其他答案对我没有帮助,因为我只附加了客户端(启动会话的上一个已分离)。

为了解决这个问题,我遵循了这里的答案(我没有使用xterm)。

简单地说:

  1. 从tmux会话中分离
  2. 运行resizelinux命令
  3. 重新连接到tmux会话

3

我只是遇到了这个问题,偶然发现了另一种情况。尽管它可能只是一个独角兽,但我认为我会进行布局。

我有一个较小的会话,并且我注意到字体大小是不同的:较​​小的会话具有较小的字体。显然,由于某种原因,我更改了窗口字体大小。

因此,在OS X中,我只是Cmd-+进行了较小的会话,然后又恢复到原来的位置。


这修复了tmux状态栏在macOS终端中的怪异位置。打开终端标签后,它会弄乱tmux状态栏的位置。通过cmd-+或进行变焦播放-
保罗

0
ps ax | grep tmux
17685 pts/22   S+     0:00 tmux a -t 13g2
17920 pts/11   S+     0:00 tmux a -t 13g2
18065 pts/19   S+     0:00 grep tmux

杀死另一个。


8
尽管有更好的答案,但似乎是标题问题的有效答案。我不明白为什么它被低估了。
JoL

是的,这是唯一对我
有用的


0

我使用Ctrl- b+ q使其成为每个窗格的闪烁编号,并在途中重新绘制它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.