如何在tmux中像在屏幕上那样在窗口内的窗格之间循环切换?


41

我以为将tmux窗格移至窗口是相同的问题,但事实并非如此。

由于经常使用GNU屏幕,我正在寻找tmux做同样的事情。我经常要做的事情是打开几个不同的窗口,一个在vim中打开一些代码,打开几个终端窗口以测试代码,有时还需要一两个窗口来处理其他各种事情。我垂直分割屏幕,通常在顶部窗格中有vim窗口,然后在底部窗格中具有其他窗口之一。

然后Ctrla,我使用的主要命令是,Tab在窗格之间旋转,以及Ctrlan在窗格内的窗口之间旋转。例如,在顶部窗格中使用vim,我切换到底部窗格,然后在其他终端上旋转,以完成所需的操作。屏幕始终保持拆分状态。

问题是我无法找到可比的能力,屏幕的Ctrlan在TMUX。切换窗口似乎无法在窗格内运行,但会完全跳转。如果屏幕被拆分,则似乎仅有的两个选项是跳转到某个未拆分的窗口,然后拆分它或对窗格进行子拆分。我要找的东西都不是。

建议(除了坚持使用屏幕之外)?


您的术语有点混乱。在tmux一个窗口中可以分为多个窗格。您是否正在尝试在具有键绑定的窗口中的窗格之间循环?
jasonwryan 2012年

我试图遵循这些工具的名称,但我承认这很令人困惑。我知道如何将焦点从一个窗格更改为另一个窗格。我试图找出的是如何在不更改布局的情况下循环显示特定窗格中的内容。
FooBar 2012年

要将内容从一个窗格移到另一窗格?您在找swap-pane吗?如果您要模拟屏幕的Ctrl-a n,则tmux等效为Ctrl-b n
jasonwryan

Answers:


28

tmuxscreen具有不同的模型,因此没有完全等效的模型。

屏幕术语来说,拆分可让您同时显示多个窗口。nextC-a n)旋转窗口以显示拆分的活动部分;这使您可以在拆分的活动区域中旋转“隐藏”窗口。

tmux来说,拆分将一个窗口划分为一个或多个窗格。拆分窗口的每个部分都是一个单独的窗格,窗格永远不会被隐藏(如果一个窗口被选中(可见),其所有窗格也都被隐藏),并且窗格只能在一个窗口的单个拆分中使用(窗格可以不能位于多个窗口中,并且不能位于同一窗口的多个拆分中)。有一些命令可以在窗口中(或窗口之间)移动窗格,但是移动的方式与nextin 屏幕中的方式不同。


您可以使用如下所示的绑定来安排类似的效果:

bind-key C-n swap-pane -s :+.top \; rotate-window -Ut :+

您可能希望将其放入~/.tmux.conf文件中,但是只需在Prefix :将其绑定到当前服务器实例中后键入/粘贴即可。

要使用绑定,请选择“主窗口”,将其拆分,在“主窗口”之后立即创建一个“窗格容器”窗口,然后使用绑定在“主窗口”中的组之间旋转“主窗口”中的任何窗格。窗格容器”窗口。

这是创建设置的方法:

  • 选择一个窗口用作“主窗口”。在其中启动(例如)Vim

  • 将“主窗口”划分为两个窗格。

    例如Prefix ":split-window

    您可以将此窗格用作测试窗口(或日志查看器,或其他)。

  • 在主窗口之后立即创建一个新窗口(“窗格容器”)。

    例如Prefix c:new-window

    重要的是,其他任何窗口都不能进入“主窗口”和“窗格容器”窗口的索引之间(+在绑定命令中使用的窗口指定符表示“下一个编号较高的窗口”)。

  • 将该窗口分为多个窗格。要在三个窗格之间旋转,请将此窗口分为两个窗格(第三个窗格是“主窗口”中的一个)。

    也许您需要一个用于git的外壳,以及一个用于运行数据库接口的外壳。将它们放在此“窗格容器”窗口中的单独窗格中。

  • 切换回您的“主窗口”。选择要“旋转”的窗格。

    您可以使用Prefix Up/ Down/ Left/ Right在窗格之间移动。

  • 调用绑定以将当前窗格与“窗格容器”窗口中的第一个窗格交换,然后(在“幕后”)旋转“窗格容器”窗口内的窗格(以便下次运行绑定时,第一个命令与序列中的“下一个”窗格交换)。

    Prefix Control- n(绑定使用Cn,但是您可以将其更改为所需的任何值)。

  • 要向后滚动窗格,可以使用以下命令:

绑定键Cp交换窗格-s:+。bottom \; 旋转窗口-Dt:+

谢谢!很棒的解释,并且您建议的绑定确实似乎至少可以复制我想要的功能。
FooBar

对不起,如何将一个窗格全尺寸然后交换回以前的布局
MageProspero 2013年

1
@JamesAndino:tmux 1.8具有resize-pane -Z(默认情况下绑定到Prefix + z),可以将窗格暂时“缩放”为窗口的整个大小。对于1.8之前的版本,没有内置的方法可以实现。其他人则从其他内置命令中编写了脚本解决方案(例如,对SU问题“最大化” tmux中的窗格的一些答案)。
克里斯·约翰森

ty,编译和加载
MageProspero 2013年

3
我相信C-b o周期窗格。
Sam Selikoff 2014年

39

我相信你正在寻找的是Ctrlb+( ,,)。 这些将允许您在窗格之间移动。


2
对不起,我不太清楚。我已经弄清楚了如何在面板之间移动。在tmux中,Ctrl b + o的功能与屏幕中的Ctrl a + Tab相同。我要寻找的是与屏幕Ctrl a + n等效的功能。
FooBar 2012年

@FooBar怎么样Ctrl-b+{还是Ctrl-b+}?这与我所能找到的功能差不多。窗格在tmux中的处理方式与在屏幕中处理的方式不同。
sparticvs 2012年

我经常在聚焦突出显示的窗格时遇到麻烦,例如我经常按两个窗格^b↑。然后,我如何真正聚焦于突出显示的窗格,以便外壳将捕获另一块而不是tmux?
ThorSummoner

6

使用bind -r,因此您可以按prefix顺序按一次,然后按其他键以找到窗格。可以通过调整超时repeat-time。校验man tmux

bind -r Tab select-pane -t :.+

如果您愿意hjkl

bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R

2

这是一个小conf,可让您使用ALT或SHIFT +箭头快捷键移动到另一窗格或窗口。无需使用键前缀就很舒服。

## NAVIGATION: ############################

# Switch panes 
# Usage: "ALT+arrow keys" (without prefix key)
# from https://gist.github.com/spicycode
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Switch windows 
# usage: "SHIFT+arrow" (without prefix key)
bind -n S-Left  previous-window
bind -n S-Right next-window

如果您比我更懒惰,那么以下允许通过鼠标导航窗格的代码也可能引起您的兴趣。(用法:键前缀+ m打开,M关闭)

## MOUSE CONTROL: #########################
set -g mode-mouse off
set -g mouse-resize-pane off
set -g mouse-select-pane off
set -g mouse-select-window off

# Toggle mouse on 
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'

# Toggle mouse off
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

这个配置应该可以正常工作,对于tmux 1.6到1.9。


2

此答案为您提供了两个窗格,其中两个窗格都包含同一组窗口,但是每个窗格都可以独立地在窗口之间切换。

tmux方法是使用三个会话:

  • 窗格的外部会话,
  • Windows的内部会话(您可以从一个窗格附加到该会话),
  • 内部会话的辅助视图(用于另一个窗格)。

是的,这使UNIX哲学发疯了。让我们开始吧:

# Create a session to hold the multiple windows
$ tmux new-session -s inner

    <Ctrl-b> c   to create a few windows, run some things

    <Ctrl-b> d   to detach, but leave it running

# Create a session to hold multiple panes (the view)
$ tmux new-session -s outer

    <Ctrl-b> "   to split

# Open the inner session in the current (bottom) pane
$ unset TMUX ; tmux attach -t inner

现在您可以切换到顶部窗格,并照常打开Vim。要循环浏览内部会话中的窗口(下部窗格),您需要使用Ctrl-b Ctrl-b np

另外:有点笨拙,但是您可以随时更改外部会话的前缀,例如,改为Ctrl-a

<Ctrl-b> :set-option prefix C-a

然后,它也只是Ctrl-b np循环内的窗口,而Ctrl-a o循环外窗格。

现在确定,而不是在顶部窗格中打开Vim,让我们再次连接到内部会话。退出vim,这次使用new-session命令(尤其是-tnot -s):

$ tmux new-session -t inner

瞧!现在,您可以在顶部和底部窗格中的窗口之间循环。

我们必须new-session -t第二次使用的原因是,如果我们只是简单地attach -t再次做一次,那么顶部和底部窗格将被同步,始终显示相同的窗口,这不是您想要的。为了使该窗格独立于其他窗格在窗口之间移动,我们创建了一个新的“ view”会话,但将其后端直接连接到保存该窗口的现有会话。这也称为“ 分组会话 ”。(顺便说一句,该链接还建议[un]link-window用于在会话之间移动窗口。)

当然,为了对称起见,您也可以tmux new-session -t inner在底部窗格中运行,而不是attach。在这种情况下,您将运行4个tmux实例(再加上一个服务器的tmux进程)!


0

将以下代码放入您的.tmux.conf

# cycle prev/next pane
bind -n S-right select-pane -t :.+
bind -n S-left select-pane -t :.-

刷新配置,那么你可以按(不直接前缀键)Shift+ 以顺时针方向循环窗格和Shift+ 在反方向循环。

在Tmux 2.8中测试。


如果您不想编辑配置,则prefix+ o是顺时针循环的默认键绑定。我偶尔会找到此键绑定,然后从中获取命令tmux list-keys并将其用于我自己的键绑定:

bind-key    -T prefix       o                 select-pane -t :.+
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.