在本文中,我将探讨命令行界面(discoverability)的一个缺点——可发现性——以及克服此问题的一些方法。
我喜欢命令行。我的第一个命令行是 DOS 6.2,那是 1997 年。我学习了各种命令的语法,并炫耀如何在目录中列出隐藏文件 (attrib)。我会小心翼翼地一次一个字符地编写命令。当我犯错时,我会从头开始重新键入命令。有一天,有人向我展示了如何使用向上和向下箭头键来遍历历史记录,我感到非常震惊。
后来,当我接触到 Linux 时,我惊喜地发现向上和向下箭头保留了它们遍历历史记录的功能。我仍然一丝不苟地键入每个字符,但现在我已经知道如何盲打了,而且我的速度达到了每分钟 55 个单词,表现非常出色。然后有人向我展示了 Tab 键补全,再次改变了我的生活。
在 GUI 应用程序中,菜单、工具提示和图标用于向用户宣传功能。命令行缺乏这种能力,但有一些方法可以克服这个问题。在深入研究解决方案之前,我将先看看几个有问题的 CLI 应用程序
1. MySQL
首先是我们挚爱的 MySQL REPL。我经常发现自己输入 SELECT * FROM,然后习惯性地按 Tab 键。MySQL 询问我是否想查看所有 871 种可能性。我的数据库中绝对没有 871 个表。如果我说 yes,它会显示一堆 SQL 关键字、表、函数等等。
2. Python
让我们看看另一个例子,标准的 Python REPL。我开始输入命令,然后习惯性地按下 Tab 键。结果插入了一个 Tab 字符,考虑到 Tab 字符在 Python 源代码中没有任何意义,这是一个问题。
良好的用户体验
现在让我们看看设计良好的 CLI 程序,以及它们如何克服一些可发现性问题。
自动补全:bpython
Bpython 是 Python REPL 的一个很棒的替代品。当我启动 bpython 并开始输入时,建议会立即出现。我没有通过特殊的组合键触发它们,甚至没有使用著名的 Tab 键。
当我习惯性地按下 Tab 键时,它会完成列表中的第一个建议。这是一个将可发现性带入 CLI 设计的绝佳示例。
bpython 的下一个方面是它显示模块和函数文档的方式。当我输入函数名称时,它会显示函数签名和附加到该函数的文档字符串。这是一个多么贴心的设计。
上下文感知补全:mycli
Mycli 是默认 MySQL 客户端的现代替代品。这个工具对 MySQL 所做的事情,就像 bpython 对标准 Python REPL 所做的事情一样。Mycli 会在您键入时自动补全关键字、表名、列和函数。
补全建议是上下文敏感的。例如,在 SELECT * FROM 之后,补全列表中只列出当前数据库中的表,而不是所有可能的关键字。
模糊搜索和在线帮助:pgcli
如果您正在寻找 mycli 的 PostgreSQL 版本,请查看 pgcli。与 mycli 一样,它也提供了上下文感知的自动补全。菜单中的项目通过模糊搜索进行缩小。模糊搜索允许用户从整个字符串的不同部分键入子字符串,以尝试找到正确的匹配项。
pgcli 和 mycli 都在其 CLI 中实现了此功能。斜杠命令的文档作为补全菜单的一部分呈现。
可发现性:fish
在传统的 Unix shell(Bash、zsh 等)中,有一种搜索历史记录的方法。此搜索模式由 Ctrl-R 触发。这是一个非常方便的工具,用于回忆您上周运行的以 ssh 或 docker 开头的命令。一旦您了解了此功能,您会发现自己经常使用它。
如果此功能如此有用,为什么不一直进行此搜索呢?这正是 fish shell 所做的。一旦您开始键入命令,fish 就会开始从历史记录中建议与您键入的命令类似的命令。然后,您可以按向右箭头键接受该建议。
命令行礼仪
我已经回顾了解决可发现性问题的创新方法,但是每个人都应该将一些命令行基础知识作为基本 REPL 功能的一部分来实现
- 确保 REPL 具有可以通过箭头键调用的历史记录。确保历史记录在会话之间持久存在。
- 提供一种在编辑器中编辑命令的方法。无论您的补全功能多么出色,有时用户只需要一个编辑器来编写完美的命令以删除生产环境中的所有表。
- 使用分页器来管道输出。不要让用户滚动浏览他们的终端。哦,并为您的分页器使用合理的默认值。(添加处理颜色代码的选项。)
- 提供一种搜索历史记录的方法,可以通过 Ctrl-R 界面或 fish 风格的自动搜索。
结论
在第 2 部分中,我将介绍 Python 中允许您实现这些技术的特定库。同时,请查看以下一些设计良好的命令行应用程序
- bpython 或 ptpython:用于 Python 的高级 REPL,具有自动补全支持。
- http-prompt:交互式 HTTP 客户端。
- mycli:用于 MySQL、MariaDB 和 Percona 的命令行界面,具有自动补全和语法高亮显示。
- pgcli:psql 的替代品,具有自动补全和语法高亮显示。
- wharfee:用于管理 Docker 容器的 shell。
在 Amjith Ramanujam 的 PyCon US 2017 演讲 Awesome Commandline Tools 中了解更多信息,5 月 20 日在俄勒冈州波特兰举行。
11 条评论