6.1 配置框架

无论是 bash,还是 zsh,我们都能根据自己的好恶来进行配置。这样的好处是配置完全由自己所掌控。但其缺点也很明显,那就是不便于公开分享和贡献。正因为如此,一些 Shell 配置框架应运而生。所谓“众人拾柴火焰高”,积社区之力,Shell 配置框架的内容极其丰富。这使我们得以能够直接将其拿来享用。

虽然现在有很多 Shell 配置框架可以选择,有的宣称很轻量,也有的号称速度快,但是我们将根据流行度和活跃性来进行选择。经过综合比较,我们选择的 bash 配置框架是 Bash-it,zsh 配置框架是 Oh My Zsh。下面,我们将分别进行介绍。

6.1.1 bash 配置框架

Bash-it 配置框架从社区收集了许多实用的命令和脚本,主要包括别名、自动补全代码、定制函数、以及提示符主题等四大类型。得益于 Bash-it 良好的模块化架构,我们也可以添加自己的定制内容。

6.1.1.1 安装

因为 Bash-it 位于 GitHub 上,所以在安装 Bash-it 之前,首先需要确认的是系统中是否含有 git 命令:

xiaodong@codeland:~$ which git

如果输出内容为:

/usr/bin/git

则可进行下一个安装步骤。否则,可通过所用操作系统的软件包管理器(如 aptyumpacmanemerge 等)来安装。

接着,使用 git 命令将 Bash-it 克隆到用户主目录下的 .bash_it 子目录:

xiaodong@codeland:~$ git clone --depth=1 \
https://github.com/Bash-it/bash-it.git \
~/.bash_it

然后,执行 install.sh 安装脚本来安装 Bash-it:

xiaodong@codeland:~$ cd ~/.bash_it
xiaodong@codeland:~/.bash_it$ ./install.sh -h
xiaodong@codeland:~/.bash_it$ ./install.sh

install.sh 脚本包括下列 3 个选项,大家可根据需要使用:

  1. interactive (-i):这个选项允许我们交互式选择要启用哪些别名、自动补全和插件。
  2. --silent (-s):静默安装,没有任何输入提示。
  3. --no-modify-config (-n):不修改现有的 bash 配置文件 .bashrc.bash_profile

我们不加任何选项,采用默认安装。在安装脚本询问是否保留 .bashrc 并追加 Bash-it 模板内容时,回答“N”。这样,我们原有的 .bashrc 配置文件将备份为 .bashrc.bak

当看到“安装成功完成”的消息时,则说明 Bash-it 安装成功。如图 6.1 所示。

Bash-it 安装过程

图 6.1: Bash-it 安装过程

最后,我们关闭并重新打开终端(远端机器则注销并重新登录)或者执行下面的命令就可以开始使用 Bash-it 了:

xiaodong@codeland:~/.bash_it$ source ~/.bashrc

6.1.1.2 查看别名、补全和插件

Bash-it 的 install.sh 脚本在默认情况下只会启用少量的别名、自动补全和插件,下面就让我们找出来。

首先,我们来看看启用了哪些别名:

xiaodong@codeland:~$ bash-it show aliases | less

该命令的输出分为 3 列,第一列为别名的名称,第二列显示该别名是否启用(启用的别名在 [] 中有 X),最后一列是有关别名的说明。如图 6.2 所示。

在 Bash-it 中查看别名

图 6.2: 在 Bash-it 中查看别名

在此我们可以看到 Bash-it 启用了 general、apt、ansible 等别名。

接着,我们看看启用了哪些自动补全:

xiaodong@codeland:~$ bash-it show completions | less

我们发现 system、bash-it 等自动补全已经启用了。如图 6.3 所示。

在 Bash-it 中查看补全

图 6.3: 在 Bash-it 中查看补全

最后,我们再看看启用了哪些插件:

xiaodong@codeland:~$ bash-it show plugins | less

在输出中显示 base、alias-completion 等插件已经启用。如图 6.4 所示。

在 Bash-it 中查看插件

图 6.4: 在 Bash-it 中查看插件

6.1.1.3 搜索内容

除了直接列出所有的别名、自动补全和插件之外,Bash-it 还提供了一个非常快捷的方式来查找所需的内容。比如,我们想要看看有关 tmux 和 ansible 的情况,不妨执行以下命令:

xiaodong@codeland:~$ bash-it search tmux ansible
    aliases:  ansible tmux
    plugins:  tmux tmuxinator
completions:  tmux

从命令输出中我们看到 tmux 的别名、补全和插件都没有启用,而 ansible 的别名已经启用,因为其颜色为绿色。

6.1.1.4 启用别名、补全和插件

既然 Bash-it 为我们提供了如此丰富的别名、自动补全和插件,那么不用的话就太可惜了。下面,我们就来分别看看如何启用别名、自动补全和插件。

时下非常流行的版本控制系统 Git,相信大家都有过接触和使用。让我们先启用 git 别名:

xiaodong@codeland:~$ bash-it enable alias git
git enabled with priority 150.

Bash-it 为我们回显出启用的结果,并设置优先级 150。

接着,我们执行以下命令:

xiaodong@codeland:~$ bash-it reload

以便让 Bash-it 自动为我们重新载入配置。这样,我们就能够立即开始使用刚才启用的 git 别名。但是,到底有哪些 git 别名呢?别着急,我们可以通过下面的命令了解:

xiaodong@codeland:~$ bash-it help aliases git | less

大致估算一下,Bash-it 提供的 git 别名差不多有近 80 个,实在是非常多。如图 6.5 所示。

Bash-it 提供的 git 别名

图 6.5: Bash-it 提供的 git 别名

最后,我们拿 Bash-it 的源代码目录来验证 git 别名是否生效:

xiaodong@codeland:~$ cd ~/.bash_it
xiaodong@codeland:~/.bash_it$ gs
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

gs 所显示出的 git 仓库状态,我们可以确信 git 别名一切正常。

再来让我们启用 git 自动补全:

xiaodong@codeland:~$ bash-it enable completion git
git enabled with priority 350.

与启用 git 别名类似,在启用 git 自动补全时,Bash-it 也为其分配了一个优先级 350。

还有 git 插件,我们也将其启用:

xiaodong@codeland:~$ bash-it enable plugin git
git enabled with priority 250.

Bash-it 命令的输出仍然与启用别名和自动补全时相似。

除了通过 bash-it enable 命令来启用别名、自动补全和插件外,我们也可以在搜索模块和组件时加以启用。例如:

xiaodong@codeland:~$ bash-it search git --enable
    aliases:  git gitsvn
    plugins:  autojump fasd git git-subrepo jgitflow jump
completions:  git git_flow git_flow_avh

这样,将把包含 git 关键字的所有别名、自动补全和插件全都启用。本例中的 gitsvn、jgitflow、git_flow 也一并启用了。

此外,我们也可以通过下列命令来分别启用所有的别名、自动补全和插件:

xiaodong@codeland:~$ bash-it enable alias all
xiaodong@codeland:~$ bash-it enable completion all
xiaodong@codeland:~$ bash-it enable plugin all

禁用别名、自动补全和插件跟启用时类似,只是把 enable 换成 disable 即可。比如,假设我们想要禁用 gitsvn 别名,则可以执行:

xiaodong@codeland:~$ bash-it disable alias gitsvn

如果禁用成功,Bash-it 命令输出如下结果:

gitsvn disabled.

6.1.1.5 更改主题

Bash-it 随附了大约 50 多个提示符主题样式,如果想要看看这些主题的真实外观,那么我们可以执行下面的命令:

xiaodong@codeland:~$ BASH_PREVIEW=true bash-it reload

Bash-it 的默认主题为 bobby。要是你不喜欢的话,那么可以将其更改为别的主题。不过,Bash-it 并没有提供相关的更改命令,我们需要直接编辑 .bashrc 配置文件。

使用文本编辑器(如 vim)打开 ~/.bashrc

xiaodong@codeland:~$ vim ~/.bashrc

然后找到下行内容:

export BASH_IT_THEME='bobby'

将单引号中的内容(bobby)替换成别的主题名称(如 powerline),并保存即可。

为了使新设置的提示符主题生效,你需要关闭并重新打开终端,或者注销并重新登录。如图 6.6 所示。

Bash-it 提示符主题

图 6.6: Bash-it 提示符主题

6.1.1.6 定制别名、插件和主题

Bash-it 的确为我们提供了不少好用的别名、自动补全和插件,然而,我们还是有不能满足的时候。为此,Bash-it 提供了一种方便我们进行定制的机制,可以定制的内容包括别名、自动补全、插件、主题样式等等,它们的路径和名称如下:

  • aliases/custom.aliases.bash:别名
  • completion/custom.completion.bash:自动补全
  • lib/custom.bash:库
  • plugins/custom.plugins.bash:插件
  • custom/themes/<theme name>/<theme name>.theme.bash:主题样式

在此,我们以如何定制别名为例来说明,其它类型的定制方法类似,无非就是以特定的名称命名并放在确定的目录。

首先,我们在 aliases 目录下使用文本编辑器(如 vim)创建 custom.aliases.bash 文件:

xiaodong@codeland:~$ cd ~/.bash_it/aliases
xiaodong@codeland:~$ vim custom.aliases.bash

接着,添加具体的别名内容:

alias sd='shutdown -h now'
alias up='uptime'

编辑完成后保存。

然后,我们可以利用以下命令来查看:

xiaodong@codeland:~$ bash-it help aliases
custom:
sd='shutdown -h now'
up='uptime'

末尾显示的 custom 正是我们添加的内容。

我们再重新加载一下配置:

xiaodong@codeland:~$ bash-it reload

现在,我们刚刚添加的定制别名就可以开始使用了:

xiaodong@codeland:~$ up
07:54:08 up  5:23,  1 user,  load average: 0.00, 0.00, 0.00

6.1.1.7 更新 Bash-it

Bash-it 是社区化项目,隔段时间便会增添新的模块和组件,或是修正过往版本中的缺陷。我们可以通过将 Bash-it 更新到最新版本,以保持同步。为了更新 Bash-it,我们可执行以下命令:

xiaodong@codeland:~$ bash-it update

6.1.2 zsh 配置框架

与 Bash-it 一样,Oh My Zsh 也是开源的社区性项目。在所有的 zsh 配置框架中,Oh My Zsh 算得上是最流行的。Oh My Zsh 包含了许多来自 zsh 社区的好东东,它主要体现在插件、实用的函数、辅助例程、提示符主题样式等方面。

6.1.2.1 安装 Oh My Zsh

因为 Oh My Zsh 的安装依赖 git 和 curl(或 wget),所以在安装它之前,我们先检查一下系统中是否存在它们:

xiaodong@codeland:~$ which git curl wget

如果以上命令没有返回结果,那么我们需要先把它们安装到系统中。

好了,若是一切准备就绪,现在就可以执行下面的命令来安装 Oh My Zsh:

xiaodong@codeland:~$ sh -c \
"$(curl -fsSL
https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

安装过程要花一会儿功夫,我们需耐心等待。Oh My Zsh 在安装时将对原来的 .zshrc 配置文件备份,若是出现“….is now installed!”的字样时,就说明 Oh My Zsh 安装成功了。如图 6.7 所示。

Oh My Zsh 安装过程

图 6.7: Oh My Zsh 安装过程

6.1.2.2 启用插件

在安装时,Oh My Zsh 只启用了一个 git 插件。若想用得更舒服,我们就得启用其它插件。对 Oh My Zsh 而言,所谓插件通常包括别名、实用函数、自动补全等内容。在启用其它插件之前,也许你想要了解一下 Oh My Zsh 到底有哪些插件?为此,我们可以转到 Oh My Zsh 安装目录下的 plugins 子目录查看:

xiaodong@codeland:~$ cd ~/.oh-my-zsh/plugins
xiaodong@codeland:~/.oh-my-zsh/plugins$ ls

我们可以看到,在 Oh My Zsh 中,每个插件都有一个单独的目录。例如,我们继续进入 systemd 目录:

xiaodong@codeland:~/.oh-my-zsh/plugins$ cd systemd
xiaodong@codeland:~/.oh-my-zsh/plugins/systemd$ ls

其下包含 README.mdsystemd.plugin.zsh 两个文件。前者为有关该插件的使用说明,而后者为 systemd 插件的源代码。如图 6.8

Oh My Zsh 插件目录

图 6.8: Oh My Zsh 插件目录

另外,我们也可以通过浏览器查看 Oh My Zsh 的 Wiki 页面来了解它有哪些插件。

在知晓了有哪些插件及其插件的用途后,现在我们就来启用插件。我们先使用文本编辑器打开 .zshrc 配置文件:

xiaodong@codeland:~$ vim ~/.zshrc

然后找到下行内容:

plugins=(git)

将需要启用的插件追加到 git 后面即可。

plugins=(git colored-man-pages systemd)

我们在此启用了 colored-man-pagessystemd 插件。

为了使启用的插件生效,我们还需要执行下面的命令:

xiaodong@codeland:~$ source ~/.zshrc

现在让我们来验证一下启用的插件,如图 6.96.10 所示。

xiaodong@codeland:~$ man zsh
xiaodong@codeland:~$ sc-status sshd
xiaodong@codeland:~$ sc-list-units
执行 man zsh 的输出结果

图 6.9: 执行 man zsh 的输出结果

执行 sc-status sshd 的输出结果

图 6.10: 执行 sc-status sshd 的输出结果

6.1.2.3 更换主题

Oh My Zsh 的默认提示符主题样式是 robbyrussell,若是你不喜欢,那么可以更换成别的主题样式。在 Oh My Zsh 中包含有上百个主题样式,每种主题样式的外观可通过其 Wiki 页面查看。

一旦选定了 Oh My Zsh 的主题样式,便可通过编辑 .zshrc 配置文件的方式来更换。

xiaodong@codeland:~$ vim ~/.zshrc

zshrc 文件中找到下面这行:

ZSH_THEME="robbyrussell"

将双引号中的内容替换成另外的主题样式名称(如 simple)。如果你拿不定主意选哪个主题样式,那么不妨将其设置为 random。这样,Oh My Zsh 就会为你随机选择一种主题样式。

保存编辑后执行以下命令以便使更改生效,如图 6.11 所示。

xiaodong@codeland:~$ source ~/.zshrc
Oh My Zsh 的 simple 主题样式

图 6.11: Oh My Zsh 的 simple 主题样式

6.1.2.4 定制插件和主题

虽然 Oh My Zsh 已经涵盖了不少插件和主题,但是我们还是有可能去添加一些个性化的东西。直接修改原有内容的方法明显不可取。为了解决这个问题,Oh My Zsh 提供了一个名为 custom 的目录。我们只需把要定制的内容保存到 .zsh 结尾的文件即可。例如,如果我们打算添加一些新的别名,那么在创建 myaliases.zsh 文件后,再加入下列内容:

xiaodong@codeland:~$ cd ~/.oh-my-zsh/custom
xiaodong@codeland:~$ vim myaliases.zsh
alias sd='shutdown -h now'
alias up='uptime'

然后保存编辑结果,并执行:

xiaodong@codeland:~$ source ~/.zshrc

现在我们就可以使用新加的别名了:

xiaodong@codeland:~$ up

类似的,如果要定制插件和主题,它们有专门存放的目录。定制的插件代码需放在以下目录:

~/.oh-my-zsh/custom/plugins

除了我们自己的插件外,这个目录也可以用来安装外部插件。zsh-syntax-highlighting 是一个为 zsh 提供语法加亮的插件,其实现灵感来自于 fish shell。遗憾的是,该插件并没有包含到 Oh My Zsh 中。为了使用它,我们可以把它安装到上述目录:

xiaodong@codeland:~$ cd ~/.oh-my-zsh/custom/plugins
xiaodong@codeland:~/.oh-my-zsh/custom/plugins$ git clone \
https://github.com/zsh-users/zsh-syntax-highlighting.git

然后在 .zshrc 配置文件中启用:

plugins=(<原有插件> zsh-syntax-highlighting)

添加 zsh-syntax-highlighting 前,如图 6.12 所示。

xiaodong@codeland:~$ echo $'hello, world\x21'
未启用 zsh-syntax-highlighting 时

图 6.12: 未启用 zsh-syntax-highlighting 时

启用 zsh-syntax-highlighting 后,如图 6.13 所示。

xiaodong@codeland:~$ source ~/.zshrc
xiaodong@codeland:~$ echo $'hello, world\x21'
启用 zsh-syntax-highlighting 后

图 6.13: 启用 zsh-syntax-highlighting 后

此外,要把定制的主题代码放在下面的目录:

~/.oh-my-zsh/custom/themes

6.1.2.5 其它命令和配置

Oh My Zsh 还带了其它几个有趣而实用的命令。下面简单对其作个介绍:

  • take:创建新目录,并转到该目录,而且支持多级目录,如:take www/oops
  • zsh_stats:列出使用次数最多的 20 个命令,包含使用次数和所占百分比统计,如图 6.14 所示。
zsh stats

图 6.14: zsh stats

此外,Oh My Zsh 也包含其它一些有用的配置,我们可根据自己的需要设置:

xiaodong@codeland:~$ vim ~/.zshrc

ENABLE_CORRECTION="true" # 启用命令自动纠正

6.1.2.6 获取更新

Oh My Zsh 在默认情况下将每隔几周检查是否有更新。若有更新,则予以提示并进行升级。如果你觉得提示烦人的话,那么可以将其关闭。关闭提示更新的方法是,把下行内容追加到 ~/.zshrc 配置文件中:

DISABLE_UPDATE_PROMPT=true

我们也可以手动更新 Oh My Zsh,为此,可以执行以下命令,结果如图 6.15 所示。

xiaodong@codeland:~$ upgrade_oh_my_zsh
更新 Oh My Zsh

图 6.15: 更新 Oh My Zsh