小土刀

zsh 全程指南

新年新气象,打算从 bash 迁移到 zsh 上来。网上教程很多,但是大多比较零散也不够让人知其所以然,而且很多配置也不符合我个人的习惯,于是打算『贪天之功』,写这么一个『全程指南』,希望能给大家带来些帮助。


工欲善其事,必先利其器。工欲利其器,必先思其行。凡事谋定而后动,得有个基本的目标,才好一步一步细化并实施。实话说,zsh 真的比 bash 好很多吗?从小处着眼,是的,无论是历史记录还是搜索还是自定义插件,zsh 都比 bash 强,但是看看隔壁的 powershell(windows),才算得上真正现代化面向对象的命令行工具。而且很多时候我们都是连接到远程的机器上进行编程和配置,在那里 bash 可是一统天下的(当然每次都愿意配置折腾一次,zsh 也不是不行)。那么问题就来了,为什么还要折腾呢?

答案很简单,充分利用高级功能,来提高自己的效率。当然,如果顺带能让界面更漂亮一点的话,何乐不为呢?不过有一点需要注意,如果要用 shell 脚本进行编程的话,最好还是按照 bash 的语法来做,不然把自己绑定到『非标准』的语法上,换个环境就可能导致巨大的问题。

如果只是想要换个主题弄得花里胡哨的话,那么还不如节省点时间去做有意义的事情,虽然网上都说 zsh 是『终结 shell』,但是其实哪有所谓的『终极』?只有自己成为了大师,才能『飞花落叶皆可伤人』。

不过既然说是『全程指南』,还是会尽量事无巨细介绍清楚,总体来说选择标准取决于我个人的审美和习惯,这点需要注意。

准备工作

  1. 安装 iTerm2(最近要出新版了,很多新特性还是值得期待的)
  2. 安装完成后可以在 iTerm2 中输入命令安装 oh-my-zsh
    • curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
    • 因为 zsh 配置比较繁琐,所以这里可以直接用配置好的配置文件的基础上进行使用
  3. 安装 Powerline (一个 vim 的插件,随后有用)
    • pip install powerline-status
    • 如果没有 pip 命令的话,先把 pip 装上:sudo easy_install pip
  4. 有些 zsh 中的主题需要使用额外的字体,我们也一并装好,下载地址。把所有东西下载下来,然后用命令行进入到 install.sh 所在文件夹,执行 ./install.sh 进行安装

更新并切换成 zsh

  • 安装最新的 zsh brew install zsh
  • 然后修改 /etc/shells,添加一行 /usr/local/Cellar/zsh/5.2/bin/zsh-5.2
  • 切换 chsh -s /usr/local/Cellar/zsh/5.2/bin/zsh-5.2

重新启动 zsh 即可见到效果

环境配置

字体

前面我们安装了额外的字体,但是还是需要在 iTerm2 中配置一下,具体的字体选择有很多,只要是后面带有 Powerline 字样的就可以,注意 Regular Font 和 Non-ASCII Font 都需要进行修改

Preference -> Profiles -> Text

我觉得比较不错的字体有:

  • Incosolata-dz for Powerline
  • Roboto Mono Light for Powerline
  • Ubuntu Mono derivative Powerline

我自己在用的是

  • Regular Font: 18pt Ubuntu Mono derivative Powerline
  • Non-ASCII Font: 14pt Roboto Mono for Powerline

效果图

配色

这里就不推荐烂大街的 Solarized 配色了,而是直接给成吨选择,在配色页面中下载,然后根据截图自己选择,选择好之后在 Preference -> Profiles -> Colors 里面的 Load Presets 进行导入即可。我比较喜欢的是 Tomorrow Night 这个主题,并且稍微把颜色调亮了一点,显得比较活泼。像下面这样:

Tomorrow Night

其他我觉得比较不错的还有:

  • Argonaut
  • Cobalt2
  • Molokai
  • Monokai Soda
  • PaulMillr
  • Solarized Dark Higher Contrast
  • SpaceGray Eighties
  • Thayer Bright
  • Tomorrow Night 全系列
  • Wez

配置文件

大部分配置都可以在配置文件中进行设置,这里我大概翻译一下,以及给出自己的一些使用偏好。

# ZSH的环境变量
export ZSH=/Users/dawang/.oh-my-zsh
# 主题设置
# 主题列表在 ~/.oh-my-zsh/themes/
# 如果设置为 "random", 每次开启都会是不同的主题
ZSH_THEME="agnoster"
# 如果想要大小写敏感,可以取消注释下面的一行
# CASE_SENSITIVE="true"
# 如果想要连接符不敏感,可以取消注释下面的一行。_ 和 - 将可以互换
# HYPHEN_INSENSITIVE="true"
# 如果不想要自动更新,可以取消注释下面的一行
# DISABLE_AUTO_UPDATE="true"
# 自动更新的时间间隔,单位是天,这里设置 30 天更新一次
export UPDATE_ZSH_DAYS=30
# 如果不想要 ls 命令输出带颜色,可以取消注释下面的一行
# DISABLE_LS_COLORS="true"
# 是否禁止更改终端标题,不要禁止,不然所有终端tab只显示zsh了,而不随着目录的改变而改变显示
# DISABLE_AUTO_TITLE="true"
# 自动纠正命令,不启用,不怎么好用
# ENABLE_CORRECTION="true"
# 按tab键补全命令的时候,如果没什么可补全的就会出现三个红点,更人性化显示,这里我们启用
COMPLETION_WAITING_DOTS="true"
# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# 不要在意这些细节,不需要改动
# DISABLE_UNTRACKED_FILES_DIRTY="true"
# 历史命令日期显示格式
# 有三种方式: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd",我比较习惯最后那种
HIST_STAMPS="yyyy-mm-dd"
# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# 插件设置,如果添加太多启动速度会比较慢
plugins=(git autojump)
[[ -s ~/.autojump/etc/profile.d/autojump.zsh ]] && . ~/.autojump/etc/profile.d/autojump.zsh
# 剩下部分比较不常改动
# User configuration
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/TeX/texbin"
# export MANPATH="/usr/local/man:$MANPATH"
source $ZSH/oh-my-zsh.sh
# You may need to manually set your language environment
# export LANG=en_US.UTF-8
# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
# export EDITOR='vim'
# else
# export EDITOR='mvim'
# fi
# Compilation flags
# export ARCHFLAGS="-arch x86_64"
# ssh
# export SSH_KEY_PATH="~/.ssh/dsa_id"
# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"

高级功能

常用快捷键

  • 命令历史记录
    • 一旦在 shell 敲入正确命令并能执行后,shell 就会存储你所敲入命令的历史记录(存放在~/.zsh_history 文件中),方便再次运行之前的命令。可以按方向键↑和↓来查看之前执行过的命令
    • 可以用 !!来执行上一条命令
    • 使用 ctrl-r 来搜索命令历史记录
  • 命令和文件补全(按tab键)
  • 命令别名
    • 可以简化命令输入,在 .zshrc 中添加 alias shortcut='this is the origin command' 一行就相当于添加了别名
    • 在命令行中输入 alias 可以查看所有的命令别名

一些比较好用的设置

alias cls='clear'
alias ll='ls -l'
alias la='ls -a'
alias grep="grep --color=auto"
alias -s html='vim' # 在命令行直接输入后缀为 html 的文件名,会在 Vim 中打开
alias -s rb='vim' # 在命令行直接输入 ruby 文件,会在 Vim 中打开
alias -s py='vim' # 在命令行直接输入 python 文件,会用 vim 中打开,以下类似
alias -s js='vim'
alias -s c='vim'
alias -s java='vim'
alias -s txt='vim'
alias -s gz='tar -xzvf' # 在命令行直接输入后缀为 gz 的文件名,会自动解压打开
alias -s tgz='tar -xzvf'
alias -s zip='unzip'
alias -s bz2='tar -xjvf'

插件

git

在进入一个 git 文件夹后会切换显示的模式:

自带大部分 git 命令的缩写,命令内容可以参考 ~/.oh-my-zsh/plugins/git/git.plugin.zsh

Oh My Zsh 提供了一套系统别名(alias),来达到相同的功能。比如gst作为git status的别名。而且 Git 插件是 Oh My Zsh 默认启用的,相当于你使用了 Oh My Zsh,你就拥有了一套高效率的别名,而且还是全球通用的。是不是棒棒哒?下面是一些我常用的别名:

Alias Command
gapa git add --patch
gc! git commit -v --amend
gcl git clone --recursive
gclean git reset --hard && git clean -dfx
gcm git checkout master
gcmsg git commit -m
gco git checkout
gd git diff
gdca git diff --cached
gp git push
grbc git rebase --continue
gst git status
gup git pull --rebase

完整列表请参考:https://github.com/robbyrussell/oh-my-zsh/wiki/Plugin:git

osx

  • tab - 在一个新标签打开当前目录
  • cdf - cd到当前Finder目录
  • quick-look - 快速浏览特殊的文件
  • man-preview - 在Preview应用打开特定的man page
  • trash - 将特定的文件移到垃圾桶

autojump

这个插件会记录进入过的文件夹,下次再进入只要输入很少的内容即可,如下图所示:

zsh-syntax-highlighting

这是一个类似 fish 的命令高亮插件,安装也很简单 brew install zsh-syntax-highlighting,需要把 source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 添加到 .zshrc 的最后面。

其他的安装方法

extract

解压文件插件,所有的文件直接 x filename 即可,不用再记忆各类参数

catimg

用来在命令行显示图片 catimg filename

encode64

调试编码 encode64 string

urltools

对 url 进行编码 urlencode http://wdxtub.com

对 url 进行解码 urldecode http%3A%2F%2Fwdxtub.com

使用技巧

  1. 连按两次Tab会列出所有的补全列表并直接开始选择,补全项可以使用 ctrl+n/p/f/b上下左右切换
  2. 命令选项补全。在zsh中只需要键入 tar -<tab> 就会列出所有的选项和帮助说明
  3. 命令参数补全。键入 kill <tab> 就会列出所有的进程名和对应的进程号
  4. 更智能的历史命令。在用或者方向上键查找历史命令时,zsh支持限制查找。比如,输入ls,然后再按方向上键,则只会查找用过的ls命令。而此时使用则会仍然按之前的方式查找,忽略 ls
  5. 多个终端会话共享历史记录
  6. 智能跳转,安装了 autojump 之后,zsh 会自动记录你访问过的目录,通过 j 目录名 可以直接进行目录跳转,而且目录名支持模糊匹配和自动补全,例如你访问过 hadoop-1.0.0 目录,输入j hado 即可正确跳转。j --stat 可以看你的历史路径库。
  7. 目录浏览和跳转:输入 d,即可列出你在这个会话里访问的目录列表,输入列表前的序号,即可直接跳转。
  8. 在当前目录下输入 ..... ,或直接输入当前目录名都可以跳转,你甚至不再需要输入 cd 命令了。在你知道路径的情况下,比如 /usr/local/bin 你可以输入 cd /u/l/b 然后按进行补全快速输入
  9. 通配符搜索:ls -l **/*.sh,可以递归显示当前目录下的 shell 文件,文件少时可以代替 find。使用 **/ 来递归搜索
  10. 扩展环境变量,输入环境变量然后按 就可以转换成表达的值
  11. .zshrc 中添加 setopt HIST_IGNORE_DUPS 可以消除重复记录,也可以利用 sort -t ";" -k 2 -u ~/.zsh_history | sort -o ~/.zsh_history 手动清除

参考资料

捧个钱场?

热评文章