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

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

Opensource.com

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

我喜欢命令行。我的第一个命令行是 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 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 部分在哪里?

© . All rights reserved.