8

我希望能够为特定窗格指定辅助大小参数,以便它在聚焦窗格时分配新大小,并在退出时返回它。所以例如

(注[]表示焦点终端光标)

________________
|$ ls  |       |
|a's   |       |
|dir   |       |
|$     |$ []   |
|______|_______|

交换窗格焦点

_______________
|        |    |
|$ ls    |    |
|a's dir |    |
|$ []    |$   |
|________|____|

等等。特别是会很酷,因为在最近的 tmux 版本中调整窗格的大小可以很好地重新流动内容而不是切掉它。

在示例中,左侧窗格的宽度设置为在获得焦点时自动切换为 8 列,并且在失去焦点时变得更薄。注意内容仍然是可见的(这毕竟是我们喜欢 tmux 的原因)但是我们仍然可以通过让当前聚焦的窗格自动扩展自身来吃蛋糕,所以它总是足够大来工作!

我可能会想出一些复杂的绑定来自动应用resize-pane命令来执行此操作,并使其恰到好处地满足我的愿望。但我希望有某种内置功能。

跟踪并允许修改每个窗格的辅助 4 元组整数是很实用的。这些指定resize-pane -L/D/U/R在该窗格聚焦时要执行的操作量,以及该窗格散焦时的相反方向。

可能还有其他更合理的表述。

4

2 回答 2

1

抱歉,到目前为止这只是猜测,但我考虑了一些,我认为 tmux 内置的功能可以支持这一点,但它需要一些/很多脚本。

请参阅我发布的这个问题。

http://sourceforge.net/p/tmux/mailman/message/31221459/

本质上,该命令看起来select-layout可以(可能!??!)用于对布局应用任意突变。不过,我还没有测试它是否有效。

Thomas Adam 建议查看 layout-custom.c 源以了解更多关于发生了什么的信息。这就是我所得到的。但如果确实有可能以编程方式改变布局并生成工作字符串以传递给select-layout,那么这将是一个非常好的方法。

更新:现在我直接问了这个(仅仅生成一个合适的字符串是否确实可以实现任意布局的大小调整),但还没有收到亚当先生本人的回复,但是我怀疑如果我们可以的话这可以工作的原因生成一个通过校验和的字符串是我能够以任何方式调整窗格的大小,并在我记录字符串(由list-windows命令产生)后将它们更改,然后使用字符串恢复到记录的布局。这意味着不需要采取某种明确的行动来“保存”布局或任何东西,似乎校验和只是一种帮助防止垃圾/病态字符串对字符串造成严重破坏的聪明方法执行窗格布局重新排列的解释器。

您肯定需要传递一个非平凡的构造字符串才能使其正常工作。但是,用于计算校验和的代码和其余部分在layout-custom.c. 有一天,我可能会带着一个实现适当转换的 shell 脚本(或者只是一个 C 程序,如果可以取出代码的话)回来。应该很有趣。

是的,如果我能把它搞定并获得那笔不错的小赏金,那真是太棒了,但不幸的是,我今晚有 Real Work TM等着我。

于 2014-11-19T16:38:40.727 回答
1

找到了一个部分解决方案......我已经让我的窗格切换与 vim 同步,所以每当我切换切换窗格时,我也会调整 tmux 的大小。

这不是最优的,因为 tmux 没有验证当前窗格大小并相应地调整它的大小。无论如何,它工作得很好,因为您可以执行 ctr-h 或 ctrl-k 两次来调整窗格大小。

相关配置如下:

# Sync panes with vi
bind -n C-h run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-h) || tmux select-pane -L && tmux resize-pane -R 30"
bind -n C-l run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-l) || tmux select-pane -R && tmux resize-pane -L 30"
bind -n C-j run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-j) || tmux select-pane -D"
# Move panes up and down, wont resize
bind -n C-k run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-k) || tmux select-pane -U"
于 2014-11-19T11:34:33.257 回答