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 个表。如果我说,它会显示一堆 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 shells(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 略好。它不会插入制表符,但是如果您尝试一下 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.