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

我们来看看一些设计良好的 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 条评论

我不记得我在哪里得到的,但我在我的 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 略好。它不会插入 Tab 字符,但是如果你尝试一下 bpython 或 ptpython,你就会看到它们的补全功能真的好很多。

回复 作者 Manu (未验证)

Amjith,非常感谢你的这篇文章。

我喜欢 NetBeans 代码编写窗口的一件事是它具有很好的补全功能。当然,这在“batteries included”的环境中特别有用,例如 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.