Shell 的进化 - Zsh

(1) Zsh和Oh-my-zsh的安装

(1.1) install zsh

OSX自带了zsh,不必再安装. 对于Redhat系/Debian系的Linux,使用yum/apt-get工具安装: sudo -c 'yum install zsh'.

(1.2) install oh-my-zsh

方式1 自动安装:
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
方式2 手动安装:
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

(2) 切换到zsh

已经安装完了zsh和oh-my-zsh,接下来在终端里输入zsh就可以进入了.
然后输入chsh把默认的bash切换到zsh,chsh的具体用法可以man.

(3) zsh的简单体验

zsh的自动补全很强大,所有你能想象到的都可以用tab触发补全,甚至kill这样的命令也支持补全了-.-! 比如想kill掉fcitx,直接输入kill fcitx再加tab就可以了,你会看到zsh已经把有关fcitx的进程id都列出来,我觉得时间久了会被zsh的智能补全惯坏,对不对?
在.zshrc里加入alias -s c=gvim,就相当于把*.c文件和gvim关联起来了,假如我当前目录下有个test.c文件,在终端直接输入test.c+回车,gvim就自动打开这个文件了,很方便.
当然,还支持

alias -s tgz='tar -xzvf'
alias -s bz2='tar -xjvf'

这样的关联,你再也不必记住tar的z和j参数了!

(4) zsh的主题/插件

zsh的配置文件在~/.zshrc,打开后找到”ZSH_THEME”一行: ZSH_THEME="robbyrussell" 修改这里可以改变zsh的主题.
更多的主题可以在~/.oh-my-zsh/themes目录找到.

再找到”plugin”一行:
plugins=(git ruby autojump mvn gradle)
上面分别启用了git,ruby,autojump等几个插件. 其中git是默认已经安装的,下面介绍autojump:

(4.1) 插件之一autojump

autojump提供了一个快速切换当前目录的功能,比如我经常使用的目录是~/workspace,在任何目录下只要输入j wo就能自动跳转到~/workspace了.
安装步骤:

git clone https://github.com/joelthelion/autojump.git
cd autojump
python ./install.py

不要忘记在.zshrc中启用autojump这个插件,并且在.zshrc里加入一行: [[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
之后你就能用j 目录名快速切换目录了,甚至不用输入完整的目录名,autojump会根据你的使用习惯记录下常用目录,关于目录优先权重可以用autojump -s查看:

22.4: /home/xxx/Dropbox/Fedora One
22.4: /home/xxx/Github
26.5: /home/xxx/Dropbox

(5) bye,bash

bash再见了,最后备份一下bash的配置cp ~/.bashrc ~/Dropbox/
我的bash里还有一些有用的东西,比如mark-directory,这个工具有些类似autojump,也是方便你在各个常用目录间跳来跳去的,只不过需要在目录下运行一下mark加”书签”,然后j dir_name跳转,当然也是支持tab补全的,食用方式也很简单,在.bashrc加入下面的配置:

# mark-directory: provide a quick way to change directory from the command line
# github.com/dangoakachan/mark-directory
export MARKPATH=$HOME/.marks
function j {
cd -P "$MARKPATH/$1" 2>/dev/null || echo "No such mark: $1"
}
function mark {
mkdir -p "$MARKPATH"; ln -s "$(pwd)" "$MARKPATH/$1"
}
function unmark {
rm -i "$MARKPATH/$1"
}
function marks {
ls -l "$MARKPATH" | sed 's/ / /g' | cut -d' ' -f9- | sed 's/ -/\t-/g' && echo
}
_completemarks() {
local curw=${COMP_WORDS[COMP_CWORD]}
local wordlist=$(find $MARKPATH -type l -printf "%f\n")
COMPREPLY=($(compgen -W '${wordlist[@]}' -- "$curw"))
return 0
}
complete -F _completemarks j unmark