以编程方式滚动 gnome-terminal 输出?

以编程方式滚动 gnome-terminal 输出?

有没有办法自动滚动到 sh 脚本的终端输出的开头?

我在开发过程中有自定义构建例程:sh 脚本使用 inotifywait 来检测源文件的变化并运行各种内容,如渲染模板、检查语法、编译源等。我首先清除每次更改的终端,然后执行其余操作,因此所有终端输出始终只与源中最新的更改相关。

但是如果出现错误,通常会有很多错误相互级联,我希望首先看到第一个错误,但它总是需要手动将终端输出滚动到顶部。

大多数时候终端都没有聚焦,因此模拟击键将不起作用(除非可以仅将击键发送到当前终端窗口。)

UPD:我尝试使用 xdotool - 对于终端,它仅在将键发送到当前活动窗口时才有效。我尝试使用键盘命令的 --window 选项,并在搜索后链接键盘命令 - 什么也没发生。

答案1

不,这是不可能的(至少在不修改其源代码的情况下不可能)。

我建议将构建脚本的输出重定向到分页器,例如less

xdotool由于安全问题,确实受到限制,并且 GNOME 正在从 X11 向 Wayland 转变,我认为在那里不可能做任何这样的事情。

终端有一个“滚动输出”首选项,但首先您必须生成多一点的数据,然后将其向后滚动一点,这样输出的底部就不可见了,一旦您手动执行此操作,新的输出将不再将视口弹回到底部。这不是您想要的。

滚动条设计为由用户控制,而不是通过程序进行调整。


更新:您应该将此补丁应用于静脉血栓栓塞症,GNOME 终端背后的引擎,用于您所需的行为:

--- a/src/vte.cc
+++ b/src/vte.cc
@@ -3931,7 +3931,7 @@ Terminal::process_incoming()
                 /* Keep the cursor on-screen if we scroll on output, or if
                  * we're currently at the bottom of the buffer. */
                 update_insert_delta();
-                if (m_scroll_on_output || context.m_bottom) {
+                if (m_scroll_on_output) {
                         maybe_scroll_to_bottom();
                 }
                 /* Deselect the current selection if its contents are changed

使用meson和进行编译ninja,然后作为 运行测试应用程序./src/app/vte-2.91

我建议您在此 VTE 测试应用程序内运行您的构建脚本。

当然,您可以在整个系统范围内安装这个修改后的 libvte,但这样您的所有终端都会以这种方式运行,这可能不是您想要的。或者,为了获得真正的 GNOME 终端体验,请在其他地方安装库,然后手动启动gnome-terminal-server非默认的--app-id a.b或类似的,以及自定义LD_LIBRARY_PATH以查找修改后的 VTE,然后通过相应的方式连接到它gnome-terminal --app-id a.b以打开窗口……或者为此行为添加新的 API。或者添加自定义转义序列以启用给定终端的此行为……这取决于您。

相关内容