简介
“终极Shell”。它是一个扩展的sh,提供了大量的改进。它包含了Bash、ksh和tcsh的很多特性,同时也增加了很多独有的特性。
安装及使用
zsh的配置比较复杂。使用Oh-My-Zsh框架可以很方便地管理zsh的配置。
以下介绍一些常用的特性。
目录导航和跳转
痛点:cd命令非常常用,但从一个目录跳转到另一个有时候需要输入很长的路径,尤其是这些目录“离得很远”的时候。
autojump
简介
会“学习”的cd命令,它维护了你最常使用的目录的数据库。
安装
参考autojump。并在~/.zshrc中加入:
[[ -s /home/haobin.hb/.autojump/etc/profile.d/autojump.sh ]] && source /home/haobin.hb/.autojump/etc/profile.d/autojump.sh
autoload -U compinit && compinit
显示统计情况
dev ~/code ‹master*› » j --stat
# j是autojump的包裹函数,可以认为它们是等价的
# 省略了一些项,所以可能和下面的汇总不一致
10.0: /tmp/sandbox
10.0: /usr/lib64
10.0: /proc/self
10.0: /home/haobin.hb/tools
14.1: /home/haobin.hb/code/autojump
17.3: /home/haobin.hb/code/os/test-leveldb
20.0: /home/haobin.hb/logs
20.0: /home/haobin.hb/code/os
22.4: /home/haobin.hb/code/tools
22.4: /home/haobin.hb/sandbox/java/category/bin
22.4: /home/haobin.hb/code/os/test-leveldb/leveldb-master/table
31.6: /home/haobin.hb/tools/odps/bin
40.0: /home/haobin.hb/code
51.0: /home/haobin.hb/code/os/test-leveldb/leveldb-master
________________________________________
597: total weight
38: number of entries
40.00: current directory weight
data: /home/haobin.hb/.local/share/autojump/autojump.txt
目录的权重越大,反映你使用得越多。
跳转
dev ~/code ‹master*› » j leveldb
/home/haobin.hb/code/os/test-leveldb/leveldb-master
它将自动跳转到匹配的且最常使用的目录。有时候你可能不想跳去权重最大的目录,这时你可以向autojump传递多个参数:
dev ~ » j --stat | grep wrk
14.1: /home/haobin.hb/code/open_source/wrk
22.4: /home/haobin.hb/code/wrk/src
36.1: /home/haobin.hb/code/wrk
77.5: /home/haobin.hb/projects/wrk
dev ~ » j wrk # 跳去权重最大的目录
/home/haobin.hb/projects/wrk
dev projects/wrk » j open wrk # 跳去路径包含open和wrk的目录
/home/haobin.hb/code/open_source/wrk
当然,autojump也支持tab补全。比如,输入j level,并按两次tab,将出现:
再使用tab或箭头键选择你想跳去的目录。
它还有一定的纠错能力。比如j testcliennt,可以跳转到/home/haobin.hb/tools/testclient。
d
相关命令:pushd/popd/dirs。
dev ~/code ‹master*› » d
0 ~/code
1 /proc/self
2 /usr/lib64
3 /usr/local/bin
4 /tmp
dev ~/code ‹master*› » 3
/usr/local/bin
打印你在当前会话下访问过的目录列表。选择数字后可以直接跳到相应的目录。
自动补全(增强的tab)
ll debug->ll testclient_debug # 输入ll debug,按tab,得到ll testclient_debug
vim bu->vim BUILD.gn
make rel->make release # 识别Makefile的target
# tar:只显示出目录或tar.gz/tgz文件供选择
# cd:只显示出目录供选择
对于kill,输入kill和空格,按tab,出现自己的进程列表。也可以使用kill $proc,这样出来的匹配结果更少:
别名alias
for git
不需要通过git config配置,且别名更短:
# 共142个别名。常用的有:
ga='git add'
gb='git branch'
gc='git commit -v'
gco='git checkout'
gd='git diff'
ggpull='git pull origin $(git_current_branch)'
ggpush='git push origin $(git_current_branch)'
gm='git merge'
grh='git reset'
grm='git rm'
gst='git status'
gstall='git stash --all'
gstl='git stash list'
gstp='git stash pop'
gsts='git stash show --text'
其他的一些命令别名
-='cd -'
...=../..
....=../../..
.....=../../../..
......=../../../../..
d='dirs -v | head -10'
针对文件类型设置对应的“打开方式”
dev ~ ‹master*› » alias -s zip='unzip'
dev ~ ‹master*› » ls
test.zip
dev ~ ‹master*› » test.zip # 相当于unzip test.zip
Archive: test.zip
inflating: README.md
dev ~ ‹master*› » ls
README.md test.zip
相当于给特定后缀的文件绑定了相应的“打开方式”。
设置“全局”别名
dev ~ » alias -g hb=haobin
dev ~ » id | grep hb
uid=1542(haobin.hb) gid=1542(haobin.hb) groups=1542(haobin.hb)
-g设置的别名在命令行的任何地方都能生效,而不仅限于开头。
其他
push-line
痛点:命令输入到一半,需要执行另一个命令(如切换目录)。
dev test-leveldb/leveldb-master ‹master*› » head table_bu
# 按Ctrl-Q,变成:
dev test-leveldb/leveldb-master ‹master*› »
dev test-leveldb/leveldb-master ‹master*› » cd table # 切换目录
dev leveldb-master/table ‹master*› » head table_bu # 自动显示上次未完成的命令
基于ls递归查找文件(!!)
# 如果是Bash,则只列出一级子目录下的文件
dev test-leveldb/leveldb-master ‹master*› » ll **/*.cc | grep -i cache
# 打开include/leveldb/table_builder.h
dev test-leveldb/leveldb-master ‹master*› » vim **/table_builder.h
插件
修改~/.zshrc:
plugins=(
git
urltools # urlencode/urldecode命令
)
主题
修改~/.zshrc:
# ZSH_THEME="gallifrey"
ZSH_THEME="ys"
效果如下:
注意事项
如果代码库很大,需要配置:
git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1
否则会很卡。