Linux 终端带有自定义按钮来执行脚本或命令

Linux 终端带有自定义按钮来执行脚本或命令

我的目标是通过创建仪表板来改善软件开发的终端使用情况。首先,我想要垂直/水平分割,这已经可以通过 Tilix 或 Terminator 实现(我不太喜欢 Tmux)。但我缺少一种用鼠标运行脚本的方法。我经常运行脚本,喜欢清理或检查代码。我所做的就是聚焦终端,按向上箭头,然后输入,这不像单击按钮那么容易。

是否有一个终端允许在顶部(或其他地方)添加按钮,允许我运行自定义命令或脚本?例如,单击“检查”可能会运行“scripts/check.sh”,它应该在特定终端中运行并显示其输出。

我使用的另一个按钮是重新启动正在运行的程序的按钮,例如在更改代码后更新它。

答案1

看看TerminatorCustom Commands Menu插件。

在终结者的首选项中启用它,然后在右键单击菜单中...它应该非常明显。

如果您想要按钮而不是菜单项,那么相应地修改终结者的用户界面可能是一个相对简单的 Python 和 GTK 编程挑战。

另外,我认为您需要修改 Terminator 的源代码,不要添加尾随\n,即不要立即执行命令。应该很容易找到插件的源代码(在终结者的官方源代码中)以及其中附加换行符的位置。 (我认为上游会很乐意接受添加相应 UI 切换的补丁。)


这就是为什么我认为只有少数终端模拟器具有这样的功能。

例如,单击“检查”可能会运行“scripts/check.sh”,它应该在特定终端中运行并显示其输出。

当您启动终端时,它几乎总是(*)也运行一个进程:通常是您的 shell。

您不能以相同的方式在同一终端中“运行”另一个程序,旁边你的外壳。两者会为了投入而互相争斗,也许还有其他资源。你所说的“运行”肯定是指询问已经在运行的运行您的应用程序。

这样做的方法是假装您按下相应的键,即合成终端的输入(然后将它们转发到 shell)。 [自定义命令插件源代码中的这个特定步骤是使用vte.feed_child()方法完成的。]

但这有一个固有的问题。您无法知道 shell 是否处于提示符处等待输入、输入行当前是否为空以及是否启用了特殊模式(例如字母的重复计数)。即,您无法知道这些输入字符是否会按字面解释并形成您希望执行的命令。

您可以输入部分命令,然后您所需的按钮将向其中添加文本。您可以在一个应用程序中,每次击键都会调用一个菜单或其他内容。您可以在 vim 的命令模式下,注入类似的字符串scripts/check.sh将对文件执行各种随机 vim 编辑命令。 ETC。

在某些情况下,粘贴预定义文本完全符合您的要求。在其他情况下,它很容易造成很大的伤害。并且终端无法真正判断将发生哪一种情况,因此无法保护您免受此类错误的影响。

这就是为什么人们往往更喜欢 shell 别名和函数,或者交互式 shell 命令编辑和相关功能(如历史搜索),而不是此类 UI 功能。


(*)如果你深入研究 VTE(Terminator 使用的终端仿真库)的编程,你会发现它可以不运行任何命令(甚至不运行 shell),只需让该终端闲置,然后您可以添加一个按钮,直接在该终端中启动您喜欢的命令。一旦完成,您可以使用其中一个按钮启动另一个命令。但同样:没有 shell 可供您输入下一个命令。在这种情况下,您不必担心上下文。但我真的不确定探索这种可能性是否值得您付出努力。

答案2

据我所知还没有。

如果您使用某种形式的分割终端,您可以dialog在两侧之一运行,例如:

list=( */ )
folder=$( dialog --title "List directory" --cancel-label "Exit" \
                 --no-items --menu "Please choose one folder: " \
                 --output-fd 1 10 40 0 ${list[@]///} )
echo $folder

取决于您的终端,这可能使您可以使用鼠标。

但是,除非您在控制台模式下运行(几乎没有人这样做),否则创建一个单独的窗口要容易得多。查看tk您最喜欢的语言(TCL/Tk、Perl/Tk、Python tkinter 甚至 Bash/Tk)来了解如何做到这一点。

如果您想在仪表板中嵌入终端窗口,您可以使用:

from tkinter import *
import os

root = Tk()
termf = Frame(root, height=400, width=500)
root.attributes("-fullscreen", True)    
termf.pack(fill=BOTH, expand=YES)
wid = termf.winfo_id()
os.system('xterm -into %d -geometry 400x500 -sb -e "ls; sleep 10" &' % wid)
root.mainloop()

相关内容