在本文中,我将探讨命令行界面(CLI)的一个缺点——可发现性——以及克服这个问题的一些方法。
我喜欢命令行。我的第一个命令行是 DOS 6.2,那是在 1997 年。我学习了各种命令的语法,并炫耀了如何在目录中列出隐藏文件 (attrib)。我会小心翼翼地一次编写一个字符的命令。当我犯错时,我会从头开始重新输入命令。有一天,有人向我展示了如何使用向上和向下箭头键来遍历历史记录,我感到非常震惊。
后来当我接触到 Linux 时,我惊喜地发现向上和向下箭头仍然保留了遍历历史记录的能力。我仍然一丝不苟地输入每个字符,但现在我已经知道如何盲打了,并且我的每分钟 55 个单词的速度非常出色。然后有人向我展示了 Tab 键自动完成功能,再次改变了我的生活。
在 GUI 应用程序中,菜单、工具提示和图标用于向用户宣传某个功能。命令行缺乏这种能力,但有一些方法可以克服这个问题。在深入研究解决方案之前,我将介绍几个有问题的 CLI 应用程序
1. MySQL
首先我们有我们心爱的 MySQL REPL。我经常发现自己输入 SELECT * FROM,然后习惯性地按 Tab 键。MySQL 询问我是否想查看所有 871 个可能性。我的数据库中绝对没有 871 个表。如果我说 是,它会显示一堆 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 条评论