我想在终端中向下滚动非命令运行区域的页面,例如手册页或者设置 | 更少页。
我发现通过按压fn 钥匙,我们可以快速向下滚动,左右箭头分别带你到底部或开始。有没有编写扩展程序的代码通过它可以像滚动条一样平滑地向下滚动。它可以允许滚动条出现,或者可以使用鼠标。
答案1
许多终端仿真器会显示滚动条,并允许您查看我认为您称之为“命令运行区域”的“历史记录”。您的 shell 和您可以从 shell 运行的许多命令都以“线性”方式逐行打印到终端。您的终端仿真器可能设置为记住屏幕外的行,然后它允许您滚动查看它们。
滚动less
或man
(使用寻呼机,可能是less
,more
或者most
无论如何)是不同的。像less
请求备用屏幕。终端仿真器不保存任何内容。滚动(如果有)是因为程序通过控制整个屏幕来实现的。
请注意,概念上存在很大的差异:
前一种滚动方法仅涉及您的终端仿真器,但是 shell 或由 shell 运行的任何程序都不知道您当前正在查看历史记录的哪一部分。
后一种方法涉及
less
或类似程序,通常可以通过一次又一次重写整个屏幕来滚动。终端仿真器很乐意显示这些更改,但控制您看到的内容的是程序。
终端仿真器可能会(并且确实会)显示 GUI 滚动条。据我所知,没有标准接口供程序less
请求这样的滚动条。程序可以做的是使用字符显示自己的滚动条。Less 不会这样做,有些程序可能会(例子)。
程序可能会或可能不会对鼠标滚动事件做出反应。您所描述的(“我发现……”)是一个对、 和PgUp1PgDown做出反应的寻呼机。滚动事件和这些键的传输方式如下HomeEnd转义序列在承载您输入内容的同一流中。
如今看来你可以less
对鼠标滚动做出反应。
如果程序本身不响应鼠标滚动,一种实用的方法是将滚动事件转换为(一系列)箭头键等。您的终端仿真器可能能够做到这一点。它可能能够做到这一点选择性地less
,取决于在前台运行的(本地)命令(例如,仅当命令为、more
或 时才会执行翻译man
)。
可以在终端仿真器和程序之间进行转换。tmux
可以做到。请参阅这个答案和这个。后者包含 的代码~/.tmux.conf
,代码捕获WheelUpPane
并发送 3xUp
等。事实上,我使用这个或类似的代码。使用 的原因更多,它的主要工作是多路复用终端(创建窗口和窗格)。如果您使用2tmux
,则通过 进行选择性翻译tmux
可能比通过终端仿真器进行选择性翻译更好。ssh
无论哪种方式,都不要指望由less
或类似程序控制的滚动完全流畅。即使输入很流畅(比较这个答案)即使你的终端能够将平滑的数据传递给程序(我认为它不能),该程序也可以使用 WIDTHxHEIGHT 的网格人物并且它无法滚动一行的一小部分。从技术上讲,GUI 终端仿真器应该能够逐行滚动,至少当它独自负责滚动时(即在我们称为前一种方法的情况下);但即使在那时,我使用的终端仿真器也总是逐行滚动字符。
我认为将鼠标滚轮的一次“滴答”转换为多个向上或向下键(并容忍整个屏幕的断断续续的更新)是你能做的最好的事情。如果另一个答案证明我错了,那就更好了。
1几乎总是fn由键盘内部处理,操作系统不知道,它只是不同的按键。显然,使用箭头fn键可以变成PgUp、PgDown和。HomeEnd
2澄清一下:如果你less
在前台运行本地,你的本地终端仿真器能够分辨出它是less
;但如果你ssh
在本地运行,然后你运行less
在服务器上那么你的本地终端仿真器只能识别ssh
,它不知道服务器上运行的是什么程序,它的行为不能依赖于远程程序。但如果你运行tmux
在服务器上并且您less
在其中tmux
运行tmux
就能发现,less
因为它们都在同一个操作系统中运行。