在本文中,我将探讨命令行界面 (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 条评论