Zsh使用

使用默认指令列模式(bash shell)的管理员可能想仔细看看zshell或是zsh。由于它于bash相似,功能又有所加强,zsh在Linux社区获得了关注。
那么zsh有什么不同之处呢?首先,zsh在感觉和功能上都和bash相似。但是一些增强功能让zsh变成一个有趣的选择。
Zsh增强功能:标签完成和拼写错误修正

用过bash标签完成的管理员会发现zsh中的增加功能令人印象深刻。这些功能包括菜单中现有的自动完成命令选项,该菜单可以通过使用箭头键滚动。举例来说,键入以下命令将提供可能命令行标记的列表:
$ ls -或是
$ rm -选择要取消的特定程序,程序列表就和取消命令一起可用了。
另一个功能在内置页面程序中,它提供到less命令的快捷方式。要访问它,输入:
$ 这和在命令行上运行more文件名一样。
对笨拙的打字员来说,拼写错误修正功能可用了。例如,如果你输入了一条错误命令,zsh会提示修正:
$ llszsh: 要将 ‘lls’修改为 ‘ls’ [nyae]吗?
要修改它,输入y,命令就更正为ls,接着命令就准备运行了。
其它选项也很实用。输入n拒绝命令修正,输入a中断命令,输入e跳转到命令行进行编辑。这个自动修正功能也能用于命令行标记和文件名,包括修改无效Git分支名称一类的机密事务。
开始使用zsh

为了快速地开始使用zsh,可利用Robby Russell收集的zsh主题、功能和工具,它们被预先打包成“Oh My Zsh”。
$ wget –no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
还可以手工安装这个工具包。如果您在运行另一种 shell,只是想试试 Z shell,那么手工安装可能会更好。请使用 Git 复制这个工具包,然后运行 zsh:
$ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
$ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshr
c$ zsh
OMZ! 的默认主题称为 “robbyrussell”,由 OMZ! 的管理者命名。您可以将它更改为 ~/.oh-my-zsh/themes 中列出的任何主题。更改主题的方法是,打开 ~/.zshrc 文件,将 ZSH_THEME 变量设置为主题文件的基本名称。例如,要想使用 cloud.zsh-theme,则应该设置 ZSH_THEME=cloud。您可能会注意到,许多主题的输出状态信息显示在提示符中和提示符的最右边。 例如,Clean 主题在最右边输出当前时间。与硬件屏幕不同,屏幕模拟器的底部通常没有状态条,但是可以使用提示符右边的区域提供动态反馈。还记得可以在提示符中使用 \e[ 编码设置颜色吗?有一组这样的 “转义” 可以将光标移动到窗口中的不同位置。另外,目前的 UNIX 系统并没有使用神秘的符号和数字,而是使用 tput 按名称或用途查找和产生转义。Z shell 使用这种方法提供 RPS1 和 RPS2,它们分别表示初始行和后续行右边的提示符。
除了通过主题控制颜色和提示符之外,OMZ! 还提供了一些插件,这些插件将同类的函数和特性集中在一起。例如,如果您使用 Git 进行源代码控制,可以启用 Git OMZ! 插件,它会在提示符中增加 Git 状态。请打开 ~/.zshrc 文件,然后编辑插件行,在其中包含 git>。现在,当切换到一个 Git 存储库时,提示符会反映该状态。(极限shell改造)“Oh My Zsh”知识库包含一个主题和功能集合用于现有zsh环境的建立和改变。它也能和卸载脚本一起用来简化移除:
$ uninstall_oh_my_zsh
与zsh shell一起供给的还有一些很好的文档和zsh参考卡。GitHub等网站上的在线资源是.zshrc文件的例子,它相当于zsh版的.bashrc文件,这些资源同时也提供如何定制zsh的示例或是示范加强命令行经验的炫酷技巧。
一些zsh功能可和bash一起用,但在bash上设置、配置更加复杂,这也解释了为什么人们有多页.bashrc文件。如果是Shell的高度使用者,zsh会是吸引你用来取代bash的选择。它的使用快速且简单,而它的一些重要功能也让与shell的互动更有趣。
非常好用的特性
加强的 alias,在bash里如果你用 alias,新名不用有补全功能了,所以alias功能有限,几次想用它简化软件包管理都放弃了。而zsh里的alias生成的新名同样支持选项补全,就样就可以很放心地 alias ai=”sudo apt-get install” 等了,再也不用频繁输入长命令了。 zsh可以方便里使用快捷键,例如可以实现按两下[esc],在命令之前加加sudo,按[esc][h],显示man,等等。 zsh可以对单个命令的补全进行设置,使常用命令高效。例如 kill [tab] 就可以选择所有进程。 zsh的命令提示符设置更灵活。 zsh对目录的操作特别灵活。 zsh对重定向,管道等提供更多功能。
配置

#color{{{
    autoload colors zsh/terminfo
    if [[ "$terminfo[colors]" -ge 8 ]]; then
    colors
    fi
    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]%}"
    #}}}

#命令提示符 {{{
    precmd () {
    local count_db_wth_char=$}}

#标题栏、任务栏样式{{{
    case $TERM in (*xterm*|*rxvt*|(dt|k|E)term)
    preexec () { print -Pn "\e]0;%n@%M//%/\ $1\a" }
    ;;
    esac
    #}}}

#关于历史纪录的配置 {{{
    #历史纪录条目数量
    export HISTSIZE=1000
    #注销后保存的历史纪录条目数量
    export SAVEHIST=1000
    #历史纪录文件
    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
    #}}}


#杂项 {{{
    #允许在交互模式中使用注释 例如:
    #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
    #设置 [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-slashes '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=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'
    zstyle ':completion:*:options' auto-description '%d'
    zstyle ':completion:*:descriptions' format $'\e[01;33m -- %d --\e[0m'
    zstyle ':completion:*:messages' format $'\e[01;35m -- %d --\e[0m'
    zstyle ':completion:*:warnings' format $'\e[01;31m -- No Matches Found --\e[0m'
    zstyle ':completion:*:corrections' format $'\e[01;32m -- %d (errors: %e) --\e[0m'

    # cd ~ 补全顺序
    zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path- directories' 'users' 'expand'
    #}}}

##行编辑高亮模式 {{{
    # Ctrl+@ 设置标记,标记和光标点之间为 region
    zle_highlight=(region:bg=magenta #选中区域
    special:bold #特殊字符
    isearch:underline)#搜索时使用的关键字
    #}}}

##空行(光标在行首)补全 "cd " {{{
    user-complete(){
    case $BUFFER in
    "" ) # 空行填入 "cd "
    BUFFER="cd "
    zle end-of-line
    zle expand-or-complete
    ;;
    "cd " ) # TAB + 空格 替换为 "cd ~"
    BUFFER="cd ~"
    zle end-of-line
    zle expand-or-complete
    ;;
    " " )
    BUFFER="!?"
    zle end-of-line
    ;;
    "cd --" ) # "cd --" 替换为 "cd +"
    BUFFER="cd +"
    zle end-of-line
    zle expand-or-complete
    ;;
    "cd +-" ) # "cd +-" 替换为 "cd -"
    BUFFER="cd -"
    zle end-of-line
    zle expand-or-complete
    ;;
    * )
    zle expand-or-complete
    ;;
    esac
    }
    zle -N user-complete
    bindkey "\t" user-complete

    #显示 path-directories ,避免候选项唯一时直接选中
    cdpath="/home"
    #}}}

##在命令前插入 sudo {{{
    #定义功能
    sudo-command-line() {
    [[ -z $BUFFER ]] && zle up-history
    [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
    zle end-of-line #光标移动到行末
    }
    zle -N sudo-command-line
    #定义快捷键为: [Esc] [Esc]
    bindkey "\e\e" sudo-command-line
    #}}}

#命令别名 {{{

    alias -g ls='ls -F --color=auto'
    alias -g ll='ls -l'
    alias -g la='ls -a'
    alias -g l='ls'
    alias -g grep='grep --color=auto'
    #alias -g history='history -fi'
    alias -g ai='sudo apt-get install'
    alias -g aar='sudo apt-get autoremove'
    alias -g ap='sudo apt-get purge'
    alias -g aud='sudo apt-get update'
    alias -g aug='sudo apt-get upgrade'
    alias -g adu='sudo apt-get dist-upgrade'

    #[Esc][h] man 当前命令时,显示简短说明
    alias run-help >&/dev/null && unalias run-help
    autoload run-help

    #历史命令 top10
    #alias top10='print -l ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
    #}}}

#路径别名 {{{
    #进入相应的路径时只要 cd ~xxx
    hash -d HIST="$HISTDIR"
    #}}}

#{{{自定义补全
    #补全 ping
    zstyle ':completion:*:ping:*' hosts g.cn facebook.com
    #补全 ssh scp sftp 等
    my_accounts=(
    {ly50247,osily,lg50247,root}@{192.168.1.1,192.168.0.1}
    osily@localhost
    )
    zstyle ':completion:*:my-accounts' users-hosts $my_accounts

    #def pacman-color completion as pacman
    #compdef pacman-color=pacman
    #}}}

#{{{ F1 计算器
    arith-eval-echo() {
    LBUFFER="${LBUFFER}echo \$(( "
    RBUFFER=" ))$RBUFFER"
    }
    zle -N arith-eval-echo
    bindkey "^[[11~" arith-eval-echo
    #}}}

####{{{
    #function timeconv { date -d @$1 +"%Y-%m-%d %T" }

    # }}}

####{{{
    function command_not_found_handler() {
    python /usr/lib/command-not-found $1
    return 0
    }
    # }}}

## END OF FILE   #################################################################
# vim:filetype=zsh foldmethod=marker autoindent expandtab   shiftwidth=4


export http_proxy=http://192.168.187.145:80
#export JAVA_HOME="/usr/lib/jvm/java-6-sun"
#export JRE_HOME="/usr/lib/jvm/java-6-sun/jre"
export PATH="$PATH:/home/osily/program/bin"
#exportCLASSPATH="$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/li b:/home/osily/program/tomcat620/lib:/home/osily/program/tomcat620/lib/servlet-api.jar"
alias upg="sudo apt-get update && sudo apt-get upgrade"
alias qq="nohup google-chrome --no-proxy-server --  app=http://web.qq.com >/dev/null 2>/dev/null &"
#alias tomstart="sudo ~/program/tomcat620/bin/startup.sh"
#alias tomshut="sudo ~/program/tomcat620/bin/shutdown.sh"
#alias js2="rhino"
alias gmusic="google-chrome --no-proxy-server --  app=http://g.top100.cn/12174704/html/player.html#loaded"
alias apa="dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P"