我认为如果我们有一个更具交互性的终端,可以通过将交互性添加到程序的输出中,通过将文本元素转换为可点击的小部件(例如简单的链接或上下文菜单)来加速某些操作,那就太好了。
例子:
- 与 git 集成:
git分支
,它被转换为可点击的分支名称。单击其中的任何一个都将切换到给定的分支。
- 与标准命令集成:
ls -al
,然后单击目录名称将使您进入ls
该目录。右键单击将显示上下文菜单,其中包含“cd 到...”、“ls 目录...”等。
任何现有的解决方案都支持此类脚本并在终端的文本窗格顶部创建 UI 元素层吗?
答案1
我看过一两次有关提供此类功能的终端仿真器 (TE) 的视频。我不记得它的名字了,而且我相当确定我没有再听说过它。可能是有充分理由的。
在 TE 中实现这种行为是完全没有希望的。我想通过提出一些问题来证明这一点。这些是反问句,旨在证明问题的本质,我并不期待答案,对于每个答案,我可能会问数十个类似性质的后续问题。
我们首先假设 TE 以某种方式知道某个输出来自ls
orls -l
或类似的。它会如何解析它?
看看ls
有多少格式选项。长列表可以添加或删除一些列。有多种日期格式,包括您自己的自定义格式,最近文件与旧文件可能有两种完全不同的格式。有多种方法可以表示文件名中的特殊字符,包括难以解析的方法。
当然,您可能会尝试向解析器传授所有这些格式,但它会知道应用哪一种吗?如何?它会查看执行的命令,例如找到该prompt$ ls -l
行然后从中知道吗?不,它不知道,因为ls
通常会使用别名来包含一些命令行开关(其他实用程序可以类似地通过环境变量进行控制,而 TE 也看不到这些变量)。
也许用户甚至ls
安装了多个具有不同输出格式的实现,也许他执行了~/bin/foo-ls
,如何处理它的输出?
许多用户都有别名,例如l
或ll
代表ls -l
或类似的东西。如果是这种情况,TE 将如何识别?
也许用户执行ls $dir
或ls $(some-command-that-prints-a-directory-name)
。 TE 如何知道它看到的是哪个目录列表?
git branch
对我来说,会调出less
寻呼机,暂时隐藏终端中可见的所有其他内容。我确信它可以配置为仅打印分支的名称(无需调用less
),或者less
当且仅当内容适合一页时可以被告知立即退出。如果在内部less
,您可以开始水平滚动内容,长分支名称可以部分消失,或者您可以调用帮助页面,然后返回查看实际内容。 TE 如何跟踪所有这些情况并知道屏幕上的哪些单词是分支机构名称?
您如何识别git
别名,例如git br
用户是否配置了这样的别名?例如,TE 是否会调查并解析git
随后无法正常工作的配置ssh
?
您如何知道正在执行哪个命令?最接近的猜测是解析提示(这可能会导致错误的猜测,正如我所演示的那样),而且......您如何找到提示?用户,尤其是那些像您一样要求奇特功能的用户,往往会大量定制他们的提示。那么如何定位正在执行的命令呢?您必须进入解析大量且无法控制的可自定义提示的领域。 (好吧,这里 iTerm2 的 shell 集成通过可以复制的显式转义序列引入了一个很好的解决方案。)
另外,如何知道正在使用什么外壳?对于更复杂的命令行,不同的 shell 有不同的语法。
如何处理更复杂的命令?例如,执行ls; git branch
,如何从输出中判断文件列表结束和 git 分支列表开始的位置?
如何处理目录更改,例如如何跟踪命令等cd foo; ls; cd ..; git branch
操作的目录?考虑到$CDPATH
, 并cd
可能别名为cd -P
, 等等?
现在,假设您以某种方式克服了所有这些问题,并且 TE 会为某些单词显示一个下拉框。用户单击,TE 希望执行操作。
怎么做?
TE 没有正确的方法向内部应用程序(例如 shell)发送指令。它可能会合成按键,例如假装用户键入ls -l that-particular-directory
后按 Enter,但只有当 shell 正在等待输入命令且其命令行当前为空时,它才有效。如果另一个交互式应用程序正在运行,或者已经输入了一些部分命令,或者您已经终止了打印的ssh
连接that-particular-directory
等,那么合成这些按键可能会严重破坏事情。 TE 如何知道当前注入这些按键是否安全?
或者 TE 本身会执行所需的命令(中间没有 shell)?那么它应该在屏幕上哪里插入输出,并且没有属于它的提示符和命令行,这不会令人困惑吗?而且它也无法跨ssh
.
上述问题仅仅触及了事情如何出错的表面。
终端仿真和在此之上的应用程序已经发展了大约 40-50 年(我不确定),而这种高级可用性从来都不是目标。为了实现这个目标,一切都需要以完全不同的方式进行。
还有开发人员资源方面的故事。有多少公用事业公司需要这样的处理?你提到了ls
,git
我想你还可以想出更多很多。这些公用事业有多少种操作模式?这两个人的数量都非常巨大。那么,我们是否正在谈论数百、数千、甚至数万种命令输出格式,TE 需要能够解析这些命令输出格式,决定提供哪些操作,并决定如何执行这些操作(考虑到诸如此后 shell 的工作目录可能已更改)。
谁来实施这个?知道从事物的本质来看,这只是一堆复杂的启发式方法,无论您如何努力,可能会比正常工作更频繁地发生故障?知道解析是计算机编程中最糟糕的领域之一,尤其是当输出没有被设计为可解析时,更不用说什么时候它不能明确解析了?谁将以一种用户相当容易扩展的方式来设计和实现它,以便用户可以教授他们常用的别名等,以便他们按预期工作?谁将维护它,使其与所有这些实用程序的新版本和新功能保持同步?谁来解决不可避免的永无休止的错误报告流?它注定会失败。
忘记这种方法。习惯以当前的方式使用 TE 和基于 TE 的应用程序。
或者寻找替代解决方案。
也许您想git
在工作中使用图形前端。
如果您经常需要文件列表,然后需要子目录列表,那么您可能正在寻找 Midnight Commander 或其他图形文件管理器。
学习盲打,这样你就可以更快地告诉计算机你想告诉它的任何内容,更重要的是,它变成了一项完全自动的无意识任务,不会分散你实际想要实现的目标的任何注意力。让打字像说话一样自然。