Why ZSH?

之前一直在使用BASH和Linux系统做交互。虽然BASH很强大,但是在某些情况下非常累眼且不方便,比如:

  • 在写完C/C++代码后执行make时,由于码力低下,会有超级多编译错误(毕竟不是用宇宙第一IDE Visual Studio写程序,好多问题写的时候就能查出来),这些编译错误信息会像瀑布一样疯狂地在屏幕上滚动。在这样一堆错误信息中,要找到第一个出错的位置(实际上是运行make命令的那行)相当费眼,因为命令行提示符xxx@xxx$ make并没有高亮,眼神不好的我完全找不到。

  • 在一个git库下进行开发的时候,每次都需要用git status来查看库的状态,很不方便

  • Terminal全屏coding的时候,想看时间,还得退出全屏看操作系统状态栏才行,这样切屏很影响效率

  • 在使用BASH进行自动补全的时候,必须通过prefix来补全,有时候却希望可以在字符串的任意位置进行补全,比如有下面这样一个文件夹:
        ABC ABC2 ABC3 ABC4 CBA CBA2
    

    如果要匹配ABC3,在BASH里面需要打A+Tab+3来补全,但实际上可以只打3就能补全ABC3,因为只有它的名字里才有字符3

  • 经常会遇到这种情况:希望按UP寻找来重复刚刚执行过的命令,然而想找的命令可能“比较久远”,需要按好久UP才能找着,比如:
      hahaha  <--- This is what I want to execute
      heihei
      ...     <--- So many other commands here
      hohoho
      xxx@xxx& ha<tab>  <--- Just type ha and press tab
    

    我们可以只打出想要的那个命令的前缀,ZSH会通过字符串匹配自动地遍历所有以那个前缀开头的命令,省去了不断地按UP去寻找想要的命令的操作

安装ZSH

由于在公司服务器上没有权限sudo,所以选择从source code编译安装,首先从zsh官网下载zsh-X.X.X.tar.gz,解压并进入对应目录:

wget <link to gzip>
tar -zxvf zsh-X.X.X.tar.gz
cd zsh-X.X.X

然后运行以下命令安装:

./configure --prefix=$HOME
make -j $(nproc)
make install

安装过程中可能会出现这个问题:

configure: error: "No terminal handling library was found on your system. This is probably a library called curses or ncurses. You may need to install a package called 'curses-devel' or 'ncurses-devel' on your system"

原因是这个curses-devel或ncurses-devel没有安装,所以还需要找到其中一个的source code编译安装一下:下载ncurses-devel,解压并进入目录执行./configure --prefix=$HOME; make -j $(nproc); make install安装。安装完后要把对应的include, lib, bin所在的目录分别加入到环境变量:

export CFLAGS=-I/path/to/include
export CPPFLAGS=-I/path/to/include
export LDFLAGS=-L/path/to/lib

再执行刚刚的configure等命令就可以正常安装ZSH了

让ZSH成为默认SHELL

需要在~/.bashrc后面加上一下几行:

export SHELL=$HOME/bin/zsh
exec $HOME/bin/zsh -l

注意 由于刚刚安装ZSH的时候用到了path/to/lib这个链接库路径,所以需要确保在.bashrc加上上面两句话之前,正确设置LD_LIBRARY_PATH这个环境变量,不然再次登入会报错,提示找不到ncurses之类的错误,这时候只能通过远程拷贝命令scp把一个没有加入上面两行的bashrc拷贝到服务器的HOME下。设置完毕再次登入时会提示没有.zshrc这个配置文件,输入0,ZSH会自动帮你建立一个空的.zshrc并进入到ZSH中

安装Oh-My-Zsh

直接按照Oh-My-Zsh的README中的步骤安装可能会遇到以下错误:

Zsh is not installed! Please install zsh first!

这是由于我们安装的ZSH是在自己的HOME目录下,所以不会出现在/etc/shells里面,而安装Oh-My-Zsh所执行的命令会在最后调用chsh命令,这个命令最后会在/etc/shells里面寻找可用的SHELL,所以肯定会失败,解决办法如下(参考了stack-over-flow的高票答案):

git clone --depth=1 https://github.com/robbyrussell/oh-my-zsh.git $HOME/.oh-my-zsh
cp $HOME/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

配置

  1. 主题: 在.zshrc里面设置ZSH_THEME="obraun",大量主题可以参考主题截图