我长期以来一直是Screen的重度用户,但是我使用的是2002年修改的版本。主要是因为我希望窗口“ next / prev”的导航顺序能够与new的顺序保持一致。创建了窗口,类似于i3或Ion的平铺窗口管理器。标准的屏幕行为是让“下一个”和“上一个”按窗口编号显示,因此通常“新”窗口(拥有最小的可用编号)将位于“下一个”窗口之外的其他位置-如果您不这样做,将会造成混淆记住数字。此后,我的首选行为已在Tmux中实现,作为2010年new-window命令和2012年renumber-windows选项的标志。。我试图使我的Screen补丁(包括文档添加等)尽可能地被接受,但在2002年7月的Screen列表上没有引起任何讨论(当时“ screen@informatik.uni-erlangen.de”,无法查找档案)。实际上,即使是一年后我再次发送时,它甚至都没有得到认可。
自2002年以来,我多次“调整”我的补丁程序,以将其应用于新版本的Screen。但是,当我使用版本4.3(2015)时,我注意到一个未记录的更改破坏了我对屏幕的用途之一-即“材料”现在可以插值环境变量。我不需要该功能,也无法弄清楚如何轻松地将“ stuff”的参数转义(以便我可以发送包含美元符号的文本),因此我一直使用4.0版本(从2004年开始)。
我在Emacs函数中使用Screen的“ stuff”(在Tmux中为“ send-keys”),该函数将当前Emacs区域的内容发送到特定的窗口号。这样,当我用脚本语言编写代码时,我打开了一个解释器,为解释器窗口指定了一个特殊的数字,然后可以使用此Emacs绑定将代码行从编辑器窗口直接发送到解释器窗口。它很hacky,但我比纯Emacs解决方案好,因为我还可以使用标准的击键在其“屏幕”窗口中与解释器进行交互。它有点像GUI IDE,但是我不必使用鼠标或盯着闪烁的光标。
我在补丁中实现的另一个功能是能够“标记”窗口,然后将标记的窗口重新定位为当前窗口之后的“下一个”。对我来说,这是一种重新排序窗口的自然方法,而不是重新编号。就像复制/粘贴范例或“拖放”一样。(我最近也想出了如何在i3中执行此操作。)
应该可以在Tmux中执行相同的操作,例如,自2015年起,就可以使用“标记”窗格的功能。或者,也许可以使用有状态的shell脚本制定出更基本的解决方案。我实现了一个简短的脚本和快捷键来尝试“标记窗格”方法,该方法工作了几次,但是Tmux崩溃了,并显示“ [丢失服务器]”。然后我发现Tmux崩溃了,即使我没有尝试做任何复杂的事情。显然,至少对于某些用户来说,它已经崩溃了。有时服务器崩溃,有时服务器开始使用100%的CPU并变得无响应。我从未见过Screen可以做这两种事情。
从理论上讲,Tmux在几个方面都优于Screen。它具有更好的脚本编写能力,这意味着您可以执行一些操作,例如从命令行查询当前会话中的窗口列表,而这在Screen中是不可能的。例如,在2015年,Screen 添加了一个命令“按标题对窗口进行排序”。我不确定何时使用这样的专门命令,但是可以通过Tmux中的shell脚本相对容易地完成此操作以及更实际的变化(例如,按CPU使用率对窗口进行排序)。在我看来,至少在不修改C代码的情况下,在Screen中做任何有创意的工作似乎都很困难。
正如其他发布者所提到的,Tmux具有单服务器模型,我认为这是主要缺点,尤其是在服务器崩溃时。通过为每个“会话”指定一个单独的套接字,可以解决此问题。我仍然更喜欢Screen的“每会话一台服务器”默认值,它看起来稍微优雅一些。
早在2002年,使用Screen代码对我来说是有教育意义的,并且很有趣。奇怪的是,对于所有其他功能,Tmux的代码行数比Screen少25%(3万对4万)。我注意到Tmux使用了许多树和列表数据结构,这对我来说有点难以理解。屏幕似乎更喜欢数组。
据我了解,由于Unix终端接口非常稳定,因此Screen或Tmux代码几乎不需要适应底层操作系统的变化。这些程序实际上没有安全更新,例如Web浏览器或Web服务器,甚至Shell。我没有注意到运行自定义版本的Screen(最后一次于2004年更新)时遇到任何问题(除了需要添加一些配置文件以防止Systemd删除套接字外); 无论如何,这些文件通常都是分发包的一部分。也许我可以通过在崩溃之前运行Tmux版本来解决在Tmux中遇到的问题。当然,如果有足够的用户这样做,那么这对于新用户来说将不是很好,因为这意味着更少的专家将寻找这些程序的最新正式版本中的错误。但是,很难激励自己切换到对我来说不稳定(最新的Tmux)或缺少我想要的某些功能(标准屏幕)的产品。
我知道这不能为OP的问题提供简单的答案,但我希望我的观点有用。