我喜欢命令行。我第一次接触命令行是在 1997 的 DOS 6.2 上。我学习了各类命令的语法,并展现了如何在目录中列出隐藏的文件(attrib)。我会每次仔细检查命令中的每一个字符。 当我犯了一个错误,我会从头开始从新输入命令。直到有一天,有人向我展现了如何使用向上和向下箭头按键遍历命令行历史,我被震惊了。html
后来当我接触到 Linux 时,让我感到惊喜的是,上下箭头保留了它们遍历历史记录的能力。我仍然很仔细地打字,可是如今,我了解如何盲打,而且我能打的很快,每分钟能够达到 55 个单词的速度。接着有人向我展现了 tab 补完,再一次改变了个人生活。python
在 GUI 应用程序中,菜单、工具提示和图标用于向用户展现功能。而命令行缺少这种能力,可是有办法克服这个问题。在深刻解决方案以前,我会来看看几个有问题的 CLI 程序:linux
一、 MySQLgit
首先让咱们看看咱们所钟爱的 MySQL REPL。我常常发现本身在输入SELECT * FROM而后按Tab的习惯。MySQL 会询问我是否想看到全部的 871 种可能性。个人数据库中绝对没有 871 张表。若是我选择yes,它会显示一堆 SQL 关键字、表、函数等。(LCTT 译注:REPL —— Read-Eval-Print Loop,交互式开发环境)github
二、 Pythonsql
咱们来看另外一个例子,标准的 Python REPL。我开始输入命令,而后习惯按Tab键。瞧,插入了一个Tab字符,考虑到Tab在 Python 源代码中没有特定做用,这是一个问题。docker
好的用户体验shell
让我看下设计良好的 CLI 程序以及它们是如何克服这些可发现性问题的。数据库
自动补全: bpythonapp
Bpython 是对 Python REPL 的一个很好的替代。当我运行 bpython 并开始输入时,建议会当即出现。我没用经过特殊的键盘绑定触发它,甚至没有按下Tab键。
当我出于习惯按下Tab键时,它会用列表中的第一个建议补全。这是给 CLI 设计带来可发现性性的一个很好的例子。
bpython 的另外一个方面是能够展现模块和函数的文档。当我输入一个函数的名字时,它会显示这个函数附带的签名以及文档字符串。这是一个多么使人难以置信的周到设计啊。
上下文感知补全:mycli
mycli 是默认的 MySQL 客户端的现代替代品。这个工具对 MySQL 来讲就像 bpython 之于标准 Python REPL 同样。mycli 将在你输入时自动补全关键字、表名、列和函数。
补全建议是上下文相关的。例如,在SELECT * FROM以后,只有来自当前数据库的表才会列出,而不是全部可能的关键字。
模糊搜索和在线帮助: pgcli
若是您正在寻找 PostgreSQL 版本的 mycli,请看看 pgcli。 与 mycli 同样,它提供了上下文感知的自动补全。菜单中的项目使用模糊搜索缩小范围。模糊搜索容许用户输入总体字符串中的任意子字符串来尝试找到正确的匹配项。
pgcli 和 mycli 在其 CLI 中都实现了这个功能。斜杠命令的文档也做为补全菜单的一部分展现。
可发现性: fish
在传统的 Unix shell(Bash、zsh 等)中,有一种搜索历史记录的方法。此搜索模式由Ctrl-R触发。当再次调用你上周运行过的命令时,例如 ssh或 docker,这是一个使人难以置信的有用的工具。 一旦你知道这个功能,你会发现本身常常会使用它。
若是这个功能是如此有用,那为何不每次都搜索呢?这正是 fish shell 所作的。一旦你开始输入命令,fish 将开始建议与历史记录相似的命令。而后,你能够按右箭头键接受该建议。
命令行规矩
我已经回顾了一些解决可发现性的问题的创新方法,但也有一些基本的命令行功能应该做为每一个 REPL 所实现基础功能的一部分:
总结
在第 2 节中,我未来看看 Python 中使你可以实现这些技术的特定库。同时,请查看其中一些精心设计的命令行应用程序:
本文地址:http://www.linuxprobe.com/excellent-command-terminal.html