具有出色命令行用户界面的 4 个终端应用程序

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

Opensource.com

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

我喜欢命令行。我的第一个命令行是 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 条评论

我不记得从哪里得到的,但我在我的主目录中有这个,为 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 部分在哪里?

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可获得许可。
© . All rights reserved.