如果你编写过代码,那么一定听说过“代码补全”吧。在如今流行的代码编辑器和 IDE (集成开发环境) 中,这绝对是一项深受大家喜欢的功能。在此我要讲的 Shell 补全与它很相似。我相信,在学习了本章所讲的内容后,你肯定会爱上它。首先,我们会谈谈什么叫自动补全,然后看看如何触发自动补全,接着详细探讨诸如文件名或路径名、程序名或命令名、用户名、主机名、以及变量名等各种自动补全类型,最后再介绍可编程补全。

何谓补全

现在回过头来看,在学习命令行时,我最想率先学习的功能一定是自动补全。为什么这么说呢?因为自动补全这项功能让我们只需输入开头的一个或几个字符便能通过 Shell 自动补全剩下的内容。对于痛恨输入长命令或文件名的朋友而言,自动补全绝对是福音。自动补全不仅减少了输入,而且节省了时间,从而极大的提高了我们的操作效率。

让我们通过一个例子来说明何谓自动补全。首先,我通过在 bash 中直接输入完整的命令行

xiaodong@codeland:~$ ls -l reallylongname.txt

来查看 reallylongname.txt 这个文本文件的信息。

然后,我在输入

xiaodong@codeland:~$ ls -l r

之后按 Tab 键,于是 bash 帮我自动补全了该文件名剩下的部分。

xiaodong@codeland:~$ ls -l reallylongname.txt

比较两次输入,bash 帮我少输了 17 个字符。是不是感觉很爽呢?

再看一个例子:这次,我在输入

xiaodong@codeland:~$ ls -l f

后按 Tab,bash 自动补全了 file

xiaodong@codeland:~$ ls -l file

接着,我连按两下 Tab,这时 bash 向我们展示了可以自动补全的文件名列表,总共包括 5 个项目。

xiaodong@codeland:~$ ls -l file
file1  file2  file3  file4  file5

我输入 1 来完成 bash 自动补全过程。

比较这两个例子,我们可以发现,如果我们输入的开头字符唯一,那么 bash 将直接自动补全余下的内容。反之,则提供一个可供补全的备选列表。不过,这时候需要我们连按两下 Tab 键。这样的话,经常操作起来感觉还是有点麻烦。

下面我们对 bash 自动补全的配置进行一番优化,使之更加好用。利用文本编辑器打开 ~/.inputrc 文件 (若不存在,则创建一个),加入下列内容:

# completion
set show-all-if-ambiguous on
set visible-stats on
set colored-completion-prefix on

其中,开启 show-all-if-ambiguous 这个选项后,我们只需按一次 Tab 即可看到备选补全列表;visible-stats 选项通过在列表项目尾部添加指示符号来说明类型,例如:@ 代表符号链接、/ 代表目录等;最后的 colored-completion-prefix 选项则给补全的前缀字符加上颜色。如图 ref(fig:bash-comp-conf) 所示。

bash-comp

补全触发按键

通过这些例子,我们也可以知道,要触发自动补全,一般只要按 Tab 键即可。bash 和 zsh 都是这个默认设定。