Las*_*bye 6 mouse terminal scrolling tmux
我注意到在 tmux 中滚动很麻烦,我想知道是否可以让 tmux 将它们传递给应用程序或终端。
我可能在这里理解错误,但我观察到我可以在术语(我的终端模拟器)中滚动手册页,但在 tmux 运行时不能滚动。即使 tmux 未运行,手册页中的鼠标滚动在 xterm 中也不起作用,这让我认为终端处理鼠标事件,然后将它们发送到应用程序。
所以我目前对鼠标事件流程的理解是这样的:
terminal -> tmux
Run Code Online (Sandbox Code Playgroud)
所以问题似乎是 tmux 阻止了事件到达底层应用程序。想要的是这个:
terminal -> tmux -> application
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会将 Terminology 的本机滚动与 tmux 的复制模式(假设鼠标模式已启用并且它自动进入和退出复制模式)相结合,但似乎不可能,因为 tmux 可以自行处理滚动。
这和我来的时候一样接近我想要的。鼠标滚动工作并自动进入和退出复制模式,但在应用程序中,man它会滚动出应用程序到旧的终端历史记录。该解决方案还包括一个非官方补丁,这使得可移植性成为一个问题。
那么是否有可能让 tmux 完全忽略鼠标信号并将它们发送到底层终端或应用程序?
如果您直接使用术语查看手册页,则会发生以下情况:
less(手册分页器)将终端切换到所谓的备用屏幕,该屏幕没有回滚缓冲区,当您退出应用程序时,您将返回到终端的先前内容。此模式通常由全屏应用程序(查看器、编辑器、文件管理器等)使用。
less根本无法处理鼠标,并且terminology非常清楚内部运行的应用程序对鼠标事件不感兴趣。
当terminology(实际上大多数终端模拟器)意识到这两个条件都满足时(即交替屏幕,对鼠标不感兴趣),它会将滚动事件转换为向上和向下击键。所以less看不到任何鼠标事件,它只看到按键。
现在让我们tmux介于两者之间。
tmux一方面只是在终端中运行的应用程序。根据它的配置,它可能会或可能不会要求鼠标事件;我假设您已启用它,因为这是默认设置。在内部运行的应用程序根本不需要任何鼠标支持。tmux也切换到备用屏幕。
tmux另一方面,它本身就是一个终端模拟器,就像terminology. 它跟踪(对于每个窗口/窗格)在那里运行的应用程序是否对鼠标感兴趣,以及应用程序是否已切换到备用屏幕。这些状态不反映在terminology,这tmux是私人企业。
从理论上讲,没有什么可以阻止 tmux 像图形仿真器那样运行,并将这些鼠标滚动事件terminology转换为向上/向下按键以less在内部运行,因为tmux它完全意识到在内部运行的应用程序正在使用备用屏幕并且不感兴趣鼠标事件。
这可能是 缺少的功能,tmux我建议您针对它们提交功能请求。
如果您对多汁的细节感兴趣,让我们让它变得更复杂。我们暂时取出来tmux。
这里有一个小问题需要注意。使用传统鼠标,滚轮通常会产生 1 个以上的按键,可能大约 3-5 个,否则滚动会太慢。触摸板能够报告更平滑的坐标,一些终端模拟器(包括terminology)确实可以识别这些,因此逐个报告向上/向下按键(假设每滚动 1/3 个单位后按一次按键,单位表示鼠标滚轮会做什么)马上做)。(我现在没有鼠标,所以我无法验证terminology鼠标确实可以跳多行,但我认为是这样。)
一次报告多个按键在某些情况下没有意义,例如在搜索提示下less它一次返回 3 个历史条目,这完全没用,并且很好地证明了这确实是幕后发生的事情. terminology如果应用程序不关心鼠标,那么使用像触摸板这样的终端模拟器这不是问题,因此您可以在例如less. 然而,如果应用程序关心鼠标,你又回到了粗糙的滚动体验,因为终端内部的鼠标协议不能报告细粒度,只有老式的鼠标滚动单元。例如,mcview您不能平滑滚动,一次只能滚动多行。
让我们tmux回到游戏中。它是一个替代屏幕的鼠标感知应用程序,就像 一样mcview,因此它只能接收老式大型单元的鼠标滚动事件。它大概应该一次发送多个向上/向下击键,就像实际的终端模拟器在老式鼠标滚动上所做的那样,否则滚动会慢得难以忍受。因此,即使tmux开发人员继续实施此功能,您也会失去滚动的流畅性。
我已经打开了错误https://bugzilla.gnome.org/show_bug.cgi?id=755183来改进这一点,但到目前为止还没有完成任何实际工作。