4 个带有出色命令行 UI 的终端应用程序

我们来看看一些设计良好的 CLI 程序,以及它们如何克服一些可发现性问题。
742 位读者喜欢这篇文章。
An introduction to GNU Screen

Opensource.com

在本文中,我将探讨命令行界面(discoverability)的一个缺点——可发现性——以及克服此问题的一些方法。

我喜欢命令行。我的第一个命令行是 DOS 6.2,那是 1997 年。我学习了各种命令的语法,并炫耀如何在目录中列出隐藏文件 (attrib)。我会小心翼翼地一次一个字符地编写命令。当我犯错时,我会从头开始重新键入命令。有一天,有人向我展示了如何使用向上和向下箭头键来遍历历史记录,我感到非常震惊。

后来,当我接触到 Linux 时,我惊喜地发现向上和向下箭头保留了它们遍历历史记录的功能。我仍然一丝不苟地键入每个字符,但现在我已经知道如何盲打了,而且我的速度达到了每分钟 55 个单词,表现非常出色。然后有人向我展示了 Tab 键补全,再次改变了我的生活。

在 GUI 应用程序中,菜单、工具提示和图标用于向用户宣传功能。命令行缺乏这种能力,但有一些方法可以克服这个问题。在深入研究解决方案之前,我将先看看几个有问题的 CLI 应用程序

1. MySQL

首先是我们挚爱的 MySQL REPL。我经常发现自己输入 SELECT * FROM,然后习惯性地按 Tab 键。MySQL 询问我是否想查看所有 871 种可能性。我的数据库中绝对没有 871 个表。如果我说 yes,它会显示一堆 SQL 关键字、表、函数等等。

MySQL gif

2. Python

让我们看看另一个例子,标准的 Python REPL。我开始输入命令,然后习惯性地按下 Tab 键。结果插入了一个 Tab 字符,考虑到 Tab 字符在 Python 源代码中没有任何意义,这是一个问题。

Python gif

良好的用户体验

现在让我们看看设计良好的 CLI 程序,以及它们如何克服一些可发现性问题。

自动补全:bpython

Bpython 是 Python REPL 的一个很棒的替代品。当我启动 bpython 并开始输入时,建议会立即出现。我没有通过特殊的组合键触发它们,甚至没有使用著名的 Tab 键。

bpython gif

当我习惯性地按下 Tab 键时,它会完成列表中的第一个建议。这是一个将可发现性带入 CLI 设计的绝佳示例。

bpython 的下一个方面是它显示模块和函数文档的方式。当我输入函数名称时,它会显示函数签名和附加到该函数的文档字符串。这是一个多么贴心的设计。

上下文感知补全:mycli

Mycli 是默认 MySQL 客户端的现代替代品。这个工具对 MySQL 所做的事情,就像 bpython 对标准 Python REPL 所做的事情一样。Mycli 会在您键入时自动补全关键字、表名、列和函数。

补全建议是上下文敏感的。例如,在 SELECT * FROM 之后,补全列表中只列出当前数据库中的表,而不是所有可能的关键字。

mycli gif

模糊搜索和在线帮助:pgcli

如果您正在寻找 mycli 的 PostgreSQL 版本,请查看 pgcli。与 mycli 一样,它也提供了上下文感知的自动补全。菜单中的项目通过模糊搜索进行缩小。模糊搜索允许用户从整个字符串的不同部分键入子字符串,以尝试找到正确的匹配项。

pgcli gif

pgcli 和 mycli 都在其 CLI 中实现了此功能。斜杠命令的文档作为补全菜单的一部分呈现。

可发现性:fish

在传统的 Unix shell(Bash、zsh 等)中,有一种搜索历史记录的方法。此搜索模式由 Ctrl-R 触发。这是一个非常方便的工具,用于回忆您上周运行的以 sshdocker 开头的命令。一旦您了解了此功能,您会发现自己经常使用它。

如果此功能如此有用,为什么不一直进行此搜索呢?这正是 fish shell 所做的。一旦您开始键入命令,fish 就会开始从历史记录中建议与您键入的命令类似的命令。然后,您可以按向右箭头键接受该建议。

命令行礼仪

我已经回顾了解决可发现性问题的创新方法,但是每个人都应该将一些命令行基础知识作为基本 REPL 功能的一部分来实现

  • 确保 REPL 具有可以通过箭头键调用的历史记录。确保历史记录在会话之间持久存在。
  • 提供一种在编辑器中编辑命令的方法。无论您的补全功能多么出色,有时用户只需要一个编辑器来编写完美的命令以删除生产环境中的所有表。
  • 使用分页器来管道输出。不要让用户滚动浏览他们的终端。哦,并为您的分页器使用合理的默认值。(添加处理颜色代码的选项。)
  • 提供一种搜索历史记录的方法,可以通过 Ctrl-R 界面或 fish 风格的自动搜索。

结论

第 2 部分中,我将介绍 Python 中允许您实现这些技术的特定库。同时,请查看以下一些设计良好的命令行应用程序

  • bpythonptpython:用于 Python 的高级 REPL,具有自动补全支持。
  • http-prompt:交互式 HTTP 客户端。
  • mycli:用于 MySQL、MariaDB 和 Percona 的命令行界面,具有自动补全和语法高亮显示。
  • pgclipsql 的替代品,具有自动补全和语法高亮显示。
  • wharfee:用于管理 Docker 容器的 shell。

在 Amjith Ramanujam 的 PyCon US 2017 演讲 Awesome Commandline Tools 中了解更多信息,5 月 20 日在俄勒冈州波特兰举行。

User profile image.
Amjith Ramanujam 是 Netflix 的高级软件工程师。他的团队负责在极端逆境中保持 Netflix 服务的运行。换句话说,他的团队负责进行区域故障转移。在业余时间,他编写现代 CLI 工具。他是 pgcli 和 mycli 的创建者。您应该在 Twitter 上向他问好。

11 条评论

我不记得从哪里得到的了,但我把它放在我的 home 目录中,为 python 的默认 REPL 提供历史记录和 Tab 键补全

$ cat ~/.pythonrc
import os, atexit, readline, rlcompleter

hfile = os.path.join(os.environ['HOME'], '.python_history')

try
readline.read_history_file(hfile)
except IOError
pass

readline.parse_and_bind('tab: complete')
atexit.register(readline.write_history_file, hfile)
del atexit, hfile

只是想让您知道,python 3 REPL 实际上具有您期望的出色的 Tab 键补全功能。
除非您以某种方式被迫使用 python 2,否则至少对于新项目而言,任何人都没有理由不进行跳跃。

您是对的,Python 3 在这方面比 Python 2 略好。它不会插入 Tab 字符,但是如果您尝试一下 bpython 或 ptpython,您会看到它们的补全功能实际上有多好。

回复 作者 Manu (未验证)

Amjith,非常感谢您的这篇文章。

我喜欢 NetBeans 代码编写窗口的一件事是它具有出色的补全功能。当然,这在像 Python、Java 或 Groovy 这样的“电池已包含”环境中特别有用。

虽然我还没有尝试过,但我真的必须尝试一下,因为它看起来像是一个很棒的工具

https://valloric.github.io/YouCompleteMe/

我很想看到你们评论 dockly,作为一个控制台 UI 工具,可以有效地为喜欢留在终端中的开发人员管理 docker 容器 :)

https://github.com/lirantal/dockly

与 `fish` shell 类似,我使用 zsh + oh-my-zsh 实现了历史记录搜索(不记得是哪个启用的)。在空白终端上向上和向下滚动会滚动浏览以前的命令,类似于 bash,而在不完整的命令上执行此操作将通过滚动浏览以前以相同方式开头的命令来完成它。这种设置还在单独的终端实例之间共享历史记录,即使在不同的目录中也是如此,除非它们是通过 ssh 进行远程访问。

您是对的。可以通过调整配置或为 zsh 安装插件来实现与 fish 相同的结果。这很好,但我想表达的观点是,为了使这些功能易于访问,它们应该作为默认功能提供,而不是通过配置文件或某些扩展启用。

回复 作者 TomK

谢谢!我以前从没听说过 bpython,但它对于入门非常有用。命令在脑海中还不清楚,并且拥有自动建议功能很有帮助。我不知道命令行中有这样的工具。

第 2 部分在哪里?

© . All rights reserved.