终极 Shell——ZSH
Posted 追鑫少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了终极 Shell——ZSH相关的知识,希望对你有一定的参考价值。
Shell是Linux/Unix的一个外壳,你理解成衣服也行。它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。
Linux/Unix提供了很多种Shell,为毛要这么多Shell?难道用来炒着吃么?那我问你,你同类型的衣服怎么有那么多件?花色,质地还不一样。写程序比买衣服复杂多了,而且程序员往往负责把复杂的事情搞简单,简单的事情搞复杂。牛程序员看到不爽的Shell,就会自己重新写一套,慢慢形成了一些标准,常用的Shell有这么几种,sh、bash、csh等,想知道你的系统有几种shell,可以通过以下命令查看:
cat /etc/shells
显示如下:
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
在 Linux 里执行这个命令和 Mac 略有不同,你会发现 Mac 多了一个 zsh,也就是说 OS X 系统预装了个 zsh,这是个神马 Shell 呢?
目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』,但是由于配置过于复杂,所以初期无人问津,很多人跑过来看看 zsh 的配置指南,什么都不说转身就走了。直到有一天,国外有个穷极无聊的程序员开发出了一个能够让你快速上手的zsh项目,叫做「oh my zsh」,Github 网址是:https://github.com/robbyrussell/oh-my-zsh。这玩意就像「X天叫你学会 C++」系列,可以让你神功速成,而且是真的。
好,下面我们看看如何安装、配置和使用 zsh。
安装zsh如果你用 Mac,就可以直接看下一节
如果你用 Redhat Linux,执行:sudo yum install zsh
如果你用 Ubuntu Linux,执行:sudo apt-get install zsh
如果你用 Windows……去洗洗睡吧。
安装完成后设置当前用户使用 zsh:chsh -s /bin/zsh,根据提示输入当前用户的密码就可以了。
安装oh my zsh首先安装 Git,安装方式同上,把 zsh 换成 git 即可。
安装「oh my zsh」可以自动安装也可以手动安装。
自动安装:
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
手动安装:
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
都不复杂,安装完成之后退出当前会话重新打开一个终端窗口,你就可以见到这个彩色的提示了:
配置
zsh 的配置主要集中在用户当前目录的.zshrc里,用 vim 或你喜欢的其他编辑器打开.zshrc,在最下面会发现这么一行字:
# Customize to your needs…
可以在此处定义自己的环境变量和别名,当然,oh my zsh 在安装时已经自动读取当前的环境变量并进行了设置,你可以继续追加其他环境变量。
接下来进行别名的设置,我自己的部分配置如下:
- alias cls=‘clear‘
- alias ll=‘ls -l‘
- alias la=‘ls -a‘
- alias vi=‘vim‘
- alias javac="javac -J-Dfile.encoding=utf8"
- alias grep="grep --color=auto"
- alias -s html=mate # 在命令行直接输入后缀为 html 的文件名,会在 TextMate 中打开
- alias -s rb=mate # 在命令行直接输入 ruby 文件,会在 TextMate 中打开
- alias -s py=vi # 在命令行直接输入 python 文件,会用 vim 中打开,以下类似
- alias -s js=vi
- alias -s c=vi
- alias -s java=vi
- alias -s txt=vi
- alias -s gz=‘tar -xzvf‘
- alias -s tgz=‘tar -xzvf‘
- alias -s zip=‘unzip‘
- alias -s bz2=‘tar -xjvf‘
- #color{{{
- autoload colors
- colors
- for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
- eval _$color=‘%{$terminfo[bold]$fg[${(L)color}]%}‘
- eval $color=‘%{$fg[${(L)color}]%}‘
- (( count = $count + 1 ))
- done
- FINISH="%{$terminfo[sgr0]%}"
- #}}}
- #命令提示符
- RPROMPT=$(echo "$RED%D %T$FINISH")
- PROMPT=$(echo "$CYAN%[email protected]$YELLOW%M:$GREEN%/$_YELLOW>$FINISH ")
- #PROMPT=$(echo "$BLUE%M$GREEN%/
- #$CYAN%[email protected]$BLUE%M:$GREEN%/$_YELLOW>>>$FINISH ")
- #标题栏、任务栏样式{{{
- case $TERM in (*xterm*|*rxvt*|(dt|k|E)term)
- precmd () { print -Pn "\e]0;%[email protected]%M//%/\a" }
- preexec () { print -Pn "\e]0;%[email protected]%M//%/\ $1\a" }
- ;;
- esac
- #}}}
- #编辑器
- export EDITOR=vim
- #输入法
- export XMODIFIERS="@im=ibus"
- export QT_MODULE=ibus
- export GTK_MODULE=ibus
- #关于历史纪录的配置 {{{
- #历史纪录条目数量
- export HISTSIZE=10000
- #注销后保存的历史纪录条目数量
- export SAVEHIST=10000
- #历史纪录文件
- export HISTFILE=~/.zhistory
- #以附加的方式写入历史纪录
- setopt INC_APPEND_HISTORY
- #如果连续输入的命令相同,历史纪录中只保留一个
- setopt HIST_IGNORE_DUPS
- #为历史纪录中的命令添加时间戳
- setopt EXTENDED_HISTORY
- #启用 cd 命令的历史纪录,cd -[TAB]进入历史路径
- setopt AUTO_PUSHD
- #相同的历史路径只保留一个
- setopt PUSHD_IGNORE_DUPS
- #在命令前添加空格,不将此命令添加到纪录文件中
- #setopt HIST_IGNORE_SPACE
- #}}}
- #每个目录使用独立的历史纪录{{{
- cd() {
- builtin cd "[email protected]" # do actual cd
- fc -W # write current history file
- local HISTDIR="$HOME/.zsh_history$PWD" # use nested folders for history
- if [ ! -d "$HISTDIR" ] ; then # create folder if needed
- mkdir -p "$HISTDIR"
- fi
- export HISTFILE="$HISTDIR/zhistory" # set new history file
- touch $HISTFILE
- local ohistsize=$HISTSIZE
- HISTSIZE=0 # Discard previous dir‘s history
- HISTSIZE=$ohistsize # Prepare for new dir‘s history
- fc -R #read from current histfile
- }
- mkdir -p $HOME/.zsh_history$PWD
- export HISTFILE="$HOME/.zsh_history$PWD/zhistory"
- function allhistory { cat $(find $HOME/.zsh_history -name zhistory) }
- function convhistory {
- sort $1 | uniq |
- sed ‘s/^:
[0?9]? :[0-9]*;.? /\1::::::\2/‘ | - awk -F"::::::" ‘{ $1=strftime("%Y-%m-%d %T",$1) "|"; print }‘
- }
- #使用 histall 命令查看全部历史纪录
- function histall { convhistory =(allhistory) |
- sed ‘/^.\{20\} *cd/i\\‘ }
- #使用 hist 查看当前目录历史纪录
- function hist { convhistory $HISTFILE }
- #全部历史纪录 top50
- function top50 { allhistory | awk -F‘:[ 0-9]*:[0-9]*;‘ ‘{ $1="" ; print }‘ | sed ‘s/ /\n/g‘ | sed ‘/^$/d‘ | sort | uniq -c | sort -nr | head -n 50 }
- #}}}
- #杂项 {{{
- #允许在交互模式中使用注释 例如:
- #cmd #这是注释
- setopt INTERACTIVE_COMMENTS
- #启用自动 cd,输入目录名回车进入目录
- #稍微有点混乱,不如 cd 补全实用
- setopt AUTO_CD
- #扩展路径
- #/v/c/p/p => /var/cache/pacman/pkg
- setopt complete_in_word
- #禁用 core dumps
- limit coredumpsize 0
- #Emacs风格 键绑定
- bindkey -e
- #bindkey -v
- #设置 [DEL]键 为向后删除
- #bindkey "\e[3~" delete-char
- #以下字符视为单词的一部分
- WORDCHARS=‘*?_-[]~=&;!#$%^(){}<>‘
- #}}}
- #自动补全功能 {{{
- setopt AUTO_LIST
- setopt AUTO_MENU
- #开启此选项,补全时会直接选中菜单项
- #setopt MENU_COMPLETE
- autoload -U compinit
- compinit
- #自动补全缓存
- #zstyle ‘:completion::complete:*‘ use-cache on
- #zstyle ‘:completion::complete:*‘ cache-path .zcache
- #zstyle ‘:completion:*:cd:*‘ ignore-parents parent pwd
- #自动补全选项
- zstyle ‘:completion:*‘ verbose yes
- zstyle ‘:completion:*‘ menu select
- zstyle ‘:completion:*:*:default‘ force-list always
- zstyle ‘:completion:*‘ select-prompt ‘%SSelect: lines: %L matches: %M [%p]‘
- zstyle ‘:completion:*:match:*‘ original only
- zstyle ‘:completion::prefix-1:*‘ completer _complete
- zstyle ‘:completion:predict:*‘ completer _complete
- zstyle ‘:completion:incremental:*‘ completer _complete _correct
- zstyle ‘:completion:*‘ completer _complete _prefix _correct _prefix _match _approximate
- #路径补全
- zstyle ‘:completion:*‘ expand ‘yes‘
- zstyle ‘:completion:*‘ squeeze-shlashes ‘yes‘
- zstyle ‘:completion::complete:*‘ ‘\\‘
- #彩色补全菜单
- eval $(dircolors -b)
- export ZLSCOLORS="${LS_COLORS}"
- zmodload zsh/complist
- zstyle ‘:completion:*‘ list-colors ${(s.:.)LS_COLORS}
- zstyle ‘:completion:*:*:kill:*:processes‘ list-colors ‘=(#b) #([0-9]#)*=0=01;31‘
- #修正大小写
- zstyle ‘:completion:*‘ matcher-list ‘‘ ‘m:{a-zA-Z}={A-Za-z}‘
- #错误校正
- zstyle ‘:completion:*‘ completer _complete _match _approximate
- zstyle ‘:completion:*:match:*‘ original only
- zstyle ‘:completion:*:approximate:*‘ max-errors 1 numeric
- #kill 命令补全
- compdef pkill=kill
- compdef pkill=killall
- zstyle ‘:completion:*:*:kill:*‘ menu yes select
- zstyle ‘:completion:*:*:*:*:processes‘ force-list always
- zstyle ‘:completion:*:processes‘ command ‘ps -au$USER‘
- #补全类型提示分组
- zstyle ‘:completion:*:matches‘ group ‘yes‘
- zstyle ‘:completion:*‘ group-name ‘‘
- zstyle ‘:completion:*:options‘ description ‘yes‘
以上是关于终极 Shell——ZSH的主要内容,如果未能解决你的问题,请参考以下文章
Linux终极shell-zsh的完美配置方案!——oh-my-zsh