在 Mac 上使用 zsh 和 oh-my-zsh

2019年8月17日星期六 / , ,
摘要:
抛弃 Mac 上默认的 bash,改用 zsh 和 oh-my-zsh 优化终端体验。

Mac 的终端默认用的是 bash,但是 bash 的体验实在有点简陋,补全只能补个文件名,命令打错了也要等按下回车才知道,要获得好的终端体验,还是得切换到 zsh。zsh 本身就比 bash 强大很多,再配上 oh-my-zsh 这个配置框架,补全、建议、高亮这些功能都能直接用。

查看默认

先确认一下当前的 shell,以及系统里有哪些 shell 可以用。

Shell
echo $SHELL
# /bin/bash

cat /etc/shells

/etc/shells 里列出来的,就是系统允许作为登录 shell 的程序。可以看到里面其实已经有一个 /bin/zsh 了,不过这是系统自带的,版本比较老,所以一般都会建议用 Homebrew 另外装一个新版的 zsh。

安装 zsh

如果还没有装 Homebrew,要先把它装上。

Shell
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然后安装 zsh。

Shell
brew install zsh
zsh --version

Homebrew 装的 zsh 在 /usr/local/bin/zsh,但是它并不在 /etc/shells 里,这时候直接 chsh 会被拒绝,提示这不是一个合法的 shell。所以要先把它加进去,然后再切换默认 shell。

Shell
# 把 Homebrew 的 zsh 加进允许的 shell 列表
echo /usr/local/bin/zsh | sudo tee -a /etc/shells

# 切换默认 shell
chsh -s /usr/local/bin/zsh

切换之后要把终端完全退出再重新打开,然后再 echo $SHELL 看一眼,变成 /usr/local/bin/zsh 就说明成功了。

第一次进入 zsh 的时候,因为还没有 ~/.zshrc,它会弹出一个配置向导,问你要怎么设置。这里直接按 q 退出就行,因为接下来 oh-my-zsh 会帮我们生成一份。

安装 oh-my-zsh

zsh 本身的默认配置很朴素,几乎什么都没有,所以大部分人都会再装一个配置框架,最常见的就是 oh-my-zsh。它把主题、插件、补全这些东西都打包好了,装完基本就能直接用。

官方提供了一键安装命令:

Shell
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

脚本会把 oh-my-zsh 克隆到 ~/.oh-my-zsh,如果原来已经有 ~/.zshrc,它会先备份成 ~/.zshrc.pre-oh-my-zsh,然后换上自己的模板。

装完之后终端会立刻换个样子,提示符变成了一个箭头加上当前目录名,在 git 仓库里还会显示当前分支,有改动没提交的话后面还会多一个小叉。

主题

主题由 ~/.zshrc 里的 ZSH_THEME 决定,默认是 robbyrussell。

Shell
ZSH_THEME="robbyrussell"

oh-my-zsh 自带了很多主题,都放在 ~/.oh-my-zsh/themes 里。还可以去 Oh My Zsh Themes 查看第三方主题。

插件

oh-my-zsh 最好用的地方还是插件。插件同样在 ~/.zshrc 里配置,写在 plugins 这个数组里就行。

Shell
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting)

其中 git 和 z 是自带的,另外两个是第三方插件,需要先克隆到 oh-my-zsh 的 custom 目录下面。

Shell
git clone https://github.com/zsh-users/zsh-autosuggestions \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-syntax-highlighting \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

然后 source ~/.zshrc 或者重新打开终端就能生效了。

git

git 插件提供了一大堆缩写,常用的几个记住之后,打 git 命令能省不少事。

Shell
gst     # git status
gaa     # git add --all
gcmsg   # git commit -m
gco     # git checkout
gl      # git pull
gp      # git push
glog    # git log --oneline --decorate --graph

想看全部的话,可以直接 alias | grep git。

z

z 会记住你去过的目录,然后根据访问的频率和时间来排序。所以只要去过一次,之后输入目录名的一部分就能直接跳过去。

Shell
z blog     # 跳到最常去的、路径里带 blog 的目录

用了几天之后,我基本就不怎么手打长路径了。

zsh-autosuggestions

这个插件会根据历史记录,在你输入的时候用灰色字把可能的命令补在后面,按方向键右就能直接接受。很多长命令只要打前几个字母,后面就自己出来了。

zsh-syntax-highlighting

它会给输入中的命令上色,命令存在就是绿色,打错了或者不存在就是红色,所以还没按回车就能看出来有没有拼错。

另外它在 plugins 里要放在最后,因为它要包住其他插件定义的那些 widget,放在前面的话,后加载的插件就可能不会被高亮到。

把 bash 的配置搬过来

原来写在 ~/.bash_profile 里的东西,比如一些 PATH 和别名,zsh 是不会去读的,所以要手动搬到 ~/.zshrc 里。我建议放在 source $ZSH/oh-my-zsh.sh 这一行的后面,这样自己定义的别名才能覆盖掉插件里的同名别名。

Shell
source $ZSH/oh-my-zsh.sh

# User configuration
export PATH="$HOME/bin:$PATH"
export EDITOR="vim"

alias ll="ls -lah"

另外 bash 和 zsh 的语法大部分是兼容的,平时用的那些命令基本不需要改。只有少数地方不太一样,比如 zsh 里没匹配到的通配符会直接报错,而不是像 bash 那样原样传下去,所以遇到 no matches found 的时候,给参数加上引号就好了。

更新

oh-my-zsh 默认会定期检查更新,到时间了打开终端会问你要不要更新,回车就行。如果想手动更新,可以直接运行下面的命令。

Shell
upgrade_oh_my_zsh

zsh 本身则是跟着 Homebrew 一起更新,brew upgrade 的时候就会升级到最新版。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...