X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=479de0429455aef095ce3009bb1fd500d167ffd6;hb=430b9c2ab968caeadd979644e99c3f7b3d91a654;hp=3b6d6de0fdaaa3bc3638d1ba308c9dadae5fc047;hpb=24aab95cd888adc1a7bad3120174b88ba72b26af;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 3b6d6de..479de04 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -3,7 +3,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Mon Jul 02 18:17:08 CEST 2007 [mika] +# Latest change: Don Nov 22 11:13:15 CET 2007 [mika] ################################################################################ # This file is sourced only for interactive shells. It # should contain commands to set up aliases, functions, @@ -11,8 +11,8 @@ # # Global Order: zshenv, zprofile, zshrc, zlogin ################################################################################ -# -# zsh-refcard-tag documentation: + +# zsh-refcard-tag documentation: {{{ # You may notice strange looking comments in the zshrc (and ~/.zshrc as # well). These are there for a purpose. grml's zsh-refcard can now be # automatically generated from the contents of the actual configuration @@ -20,7 +20,7 @@ # and what lines of code to take into account (and for what purpose). # # Here is what they mean: -#{{{ +# # List of tags (comment types) used: # #a# Next line contains an important alias, that should # be included in the grml-zsh-refcard. @@ -93,17 +93,17 @@ # }}} # locale setup {{{ - if [ -n "$LANG" ] ; then + if [[ -n "$LANG" ]] ; then export LANG else - [ -r /etc/default/locale ] && source /etc/default/locale + [[ -r /etc/default/locale ]] && source /etc/default/locale fi - [ -n "$LANG" ] && export LANG || export LANG="en_US.iso885915" - [ -n "$LC_ALL" ] && export LC_ALL - [ -n "$LC_MESSAGES" ] && export LC_MESSAGES + [[ -n "$LANG" ]] && export LANG || export LANG="en_US.iso885915" + [[ -n "$LC_ALL" ]] && export LC_ALL + [[ -n "$LC_MESSAGES" ]] && export LC_MESSAGES - [ -r /etc/sysconfig/keyboard ] && source /etc/sysconfig/keyboard - [ -r /etc/timezone ] && TZ=$(cat /etc/timezone) + [[ -r /etc/sysconfig/keyboard ]] && source /etc/sysconfig/keyboard + [[ -r /etc/timezone ]] && TZ=$(cat /etc/timezone) # }}} # check for potentially old files in 'completion.d' {{{ @@ -136,6 +136,7 @@ # check for versions (compatibility reasons) if autoload is-at-least && is-at-least 2>/dev/null ; then is4() { is-at-least 4 } + is41() { is-at-least 4.1 } is42() { is-at-least 4.2 } else is4(){ @@ -151,13 +152,13 @@ # grml specific stuff #f1# Checks whether or not you're running grml isgrml(){ - [ -f /etc/grml_version ] && return 0 + [[ -f /etc/grml_version ]] && return 0 return 1 } #f1# Checks whether or not you're running a grml cd isgrmlcd(){ - [ -f /etc/grml_cd ] && return 0 + [[ -f /etc/grml_cd ]] && return 0 return 1 } @@ -165,7 +166,7 @@ #f1# Checks whether or not you're running grml-small isgrmlsmall() { [[ ${${${(f)"$( autologin # Thanks go to Bart Schaefer! isgrml && checkhome() { - if [[ -z "$ALREADY_DID_CD_HOME" ]]; then + if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then export ALREADY_DID_CD_HOME=$HOME cd fi @@ -230,21 +231,31 @@ # {{{ set some variables #v# - export EDITOR=${EDITOR:-vim} + if type -p vim &>/dev/null ; then + export EDITOR=${EDITOR:-vim} + else + export EDITOR=${EDITOR:-vi} + fi #v# + export MAIL=${MAIL:-/var/mail/$USER} + # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/ export SHELL='/bin/zsh' - [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less' - [ -x $(which dircolors) ] && eval `dircolors -b` -# Search path for the cd command -# cdpath=(.. ~) + # color setup for ls: + [[ -x $(type dircolors) ]] && eval `dircolors -b` + + # set width of man pages to 80 for more convenient reading + # (( ${+MANWIDTH} )) || export MANWIDTH=80 -# completion functions go to /etc/zsh/completion.d -# function files may be put into /etc/zsh/functions.d, from where they -# will be automatically autoloaded. - if [ -n "$BROKEN_COMPLETION_DIR" ] ; then + # Search path for the cd command + # cdpath=(.. ~) + + # completion functions go to /etc/zsh/completion.d + # function files may be put into /etc/zsh/functions.d, from where they + # will be automatically autoloaded. + if [[ -n "$BROKEN_COMPLETION_DIR" ]] ; then print 'Warning: not setting completion directories because broken files have been found.'>&2 else [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d ) @@ -256,12 +267,12 @@ fi fi -# automatically remove duplicates from these arrays + # automatically remove duplicates from these arrays typeset -U path cdpath fpath manpath # }}} # {{{ keybindings - if [[ "$TERM" != emacs ]]; then + if [[ "$TERM" != emacs ]] ; then [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line @@ -291,7 +302,7 @@ fi # use vi style: # bindkey -v -#if [[ "$TERM" == screen ]]; then +#if [[ "$TERM" == screen ]] ; then bindkey '\e[1~' beginning-of-line # home bindkey '\e[4~' end-of-line # end bindkey '\e[A' up-line-or-search # cursor up @@ -314,7 +325,7 @@ fi # just type 'cd ...' to get 'cd ../..' # rationalise-dot() { -# if [[ $LBUFFER = *.. ]]; then +# if [[ $LBUFFER == *.. ]] ; then # LBUFFER+=/.. # else # LBUFFER+=. @@ -451,12 +462,20 @@ fi done # autoload zsh modules when they are referenced - is4 && for opt mod in a stat \ - a zpty \ - ap zprof \ - ap mapfile ; do - zmodload -${opt} zsh/${mod} ${mod} - done ; unset opt mod + if is4 ; then + tmpargs=( + a stat + a zpty + ap zprof + ap mapfile + ) + + while (( ${#tmpargs} > 0 )) ; do + zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]} + shift 2 tmpargs + done + unset tmpargs + fi is4 && autoload -U insert-files && \ zle -N insert-files && \ @@ -509,10 +528,11 @@ fi # zle -N mquote && bindkey '^q' mquote # run command line as user root via sudo: - _sudo-command-line() { - [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER" + sudo-command-line() { + [[ -z $BUFFER ]] && zle up-history + [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER" } - zle -N sudo-command-line _sudo-command-line + zle -N sudo-command-line #k# Put the current command line into a \kbd{sudo} call bindkey "^Os" sudo-command-line @@ -567,6 +587,7 @@ fi setopt auto_pushd # make cd push the old directory onto the directory stack. setopt nonomatch # try to avoid the 'zsh: no matches found...' setopt nobeep # avoid "beep"ing + setopt pushd_ignore_dups # don't push the same dir twice. MAILCHECK=30 # mailchecks REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 seconds @@ -600,8 +621,8 @@ fi # dirstack handling {{{ DIRSTACKSIZE=20 - if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then - dirstack=( ${(uf)"$(< ~/.zdirs)"} ) + if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then + dirstack=( ${(f)"$(< ~/.zdirs)"} ) # "cd -" won't work after login by just setting $OLDPWD, so [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD fi @@ -611,17 +632,78 @@ fi # }}} # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh' - if [ -n "$BATTERY" ] ; then - if [ -x $(which acpi) ] ; then + if [[ -n "$BATTERY" ]] ; then + if [[ -x $(type acpi) ]] ; then PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}" - [ -z "$PERCENT" ] && PERCENT='acpi not present' - if [ "${PERCENT%%%}" -lt 20 ] ; then + [[ -z "$PERCENT" ]] && PERCENT='acpi not present' + if [[ "${PERCENT%%%}" -lt 20 ]] ; then PERCENT="warning: ${PERCENT}%" fi fi fi # }}} +# display version control information on right side of prompt if $VCS is set {{{ +# based on Mike Hommey's http://web.glandium.org/blog/?p=170 + __vcs_dir() { + local vcs base_dir sub_dir ref + sub_dir() { + local sub_dir + sub_dir=$(readlink -f "${PWD}") + sub_dir=${sub_dir#$1} + echo ${sub_dir#/} + } + + git_dir() { + base_dir=$(git-rev-parse --show-cdup 2>/dev/null) || return 1 + base_dir=$(readlink -f "$base_dir/..") + sub_dir=$(git-rev-parse --show-prefix) + sub_dir=${sub_dir%/} + ref=$(git-symbolic-ref -q HEAD || git-name-rev --name-only HEAD 2>/dev/null) + ref=${ref#refs/heads/} + vcs="git" + } + + svn_dir() { + [[ -d ".svn" ]] || return 1 + base_dir="." + while [[ -d "$base_dir/../.svn" ]]; do base_dir="$base_dir/.."; done + base_dir=$(readlink -f "$base_dir") + sub_dir=$(sub_dir "${base_dir}") + ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }') + vcs="svn" + } + + svk_dir() { + [[ -f ~/.svk/config ]] || return 1 + base_dir=$(awk '/: *$/ { sub(/^ */,"",$0); sub(/: *$/,"",$0); if (match("'${PWD}'", $0"(/|$)")) { print $0; d=1; } } /depotpath/ && d == 1 { sub(".*/","",$0); r=$0 } /revision/ && d == 1 { print r ":" $2; exit 1 }' ~/.svk/config) && return 1 + ref=${base_dir##* + } + base_dir=${base_dir%% + *} + sub_dir=$(sub_dir "${base_dir}") + vcs="svk" + } + + hg_dir() { + base_dir="." + while [[ ! -d "$base_dir/.hg" ]]; do base_dir="$base_dir/.."; [[ $(readlink -f "${base_dir}") = "/" ]] && return 1; done + base_dir=$(readlink -f "$base_dir") + sub_dir=$(sub_dir "${base_dir}") + ref=$(< "${base_dir}/.hg/branch") + vcs="hg" + } + + hg_dir || + git_dir || + svn_dir || + svk_dir # || + # base_dir="$PWD" + # echo "${vcs:+($vcs)}${base_dir/$HOME/~}${vcs:+[$ref]${sub_dir}}" + echo "${vcs:+($vcs)}${base_dir}${vcs:+[$ref]${sub_dir}}" + } +# }}} + # {{{ set prompt if autoload promptinit && promptinit 2>/dev/null ; then promptinit # people should be able to use their favourite prompt @@ -629,26 +711,29 @@ fi print 'Notice: no promptinit available :(' fi + # precmd() => a function which is executed just before each prompt # use 'NOPRECMD=1' to disable the precmd + preexec commands # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l; # make sure to use right prompt only when not running a command - is4 && setopt transient_rprompt + is41 && setopt transient_rprompt is4 && [[ -z $NOPRECMD ]] && precmd () { [[ -n $NOPRECMD ]] && return 0 # allow manual overwriting of RPROMPT if [[ -n $RPROMPT ]] ; then [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\' - return 0 + # return 0 fi # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT if [[ -z $DONTSETRPROMPT ]] ; then if [[ -n $BATTERY ]] ; then RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}" # RPROMPT="${PERCENT}${SCREENTITLE}" + elif [[ -n $VCS ]] ; then + RPROMPT="%(?..:()% $(__vcs_dir)${SCREENTITLE}" else RPROMPT="%(?..:()% ${SCREENTITLE}" # RPROMPT="${SCREENTITLE}" @@ -674,13 +759,13 @@ fi fi # get the name of the program currently running and hostname of local machine # set screen window title if running in a screen - if [[ "$TERM" == screen* ]]; then + if [[ "$TERM" == screen* ]] ; then # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname echo -ne "\ek$CMD\e\\" fi # set the screen title to "zsh" when sitting at the command prompt: - if [[ "$TERM" == screen* ]]; then + if [[ "$TERM" == screen* ]] ; then SCREENTITLE=$'%{\ekzsh\e\\%}' else SCREENTITLE='' @@ -715,7 +800,7 @@ fi PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>' # set variable debian_chroot if running in a chroot with /etc/debian_chroot - if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then + if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then debian_chroot=$(cat /etc/debian_chroot) fi @@ -725,7 +810,7 @@ fi else # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt # set variable identifying the chroot you work in (used in the prompt below) - if [[ -n $GRMLPROMPT ]]; then + if [[ -n $GRMLPROMPT ]] ; then PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " else @@ -738,7 +823,7 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " fi # if we are inside a grml-chroot set a specific prompt theme - if [ -n "$GRML_CHROOT" ] ; then + if [[ -n "$GRML_CHROOT" ]] ; then PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# " fi # }}} @@ -758,16 +843,16 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # }}} # {{{ some aliases - if [ $UID = 0 ] ; then - [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc' - elif [ -r $HOME/.screenrc ] ; then + if [[ $UID -eq 0 ]] ; then + [[ -r /etc/grml/screenrc ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc' + elif [[ -r $HOME/.screenrc ]] ; then alias screen="/usr/bin/screen -c $HOME/.screenrc" else - [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml' + [[ -r /etc/grml/screenrc_grml ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml' fi # do we have GNU ls with color-support? - if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then + if ls --help 2>/dev/null | grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then #a1# execute \kbd{@a@}:\quad ls with colors alias ls='ls -b -CF --color=auto' #a1# execute \kbd{@a@}:\quad list all files, with colors @@ -790,7 +875,7 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " alias ...='cd ../../' # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec: - if [ -x /sbin/kexec ] ; then + if [[ -x /sbin/kexec -a -r /proc/cmdline ]] ; then alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)"" fi @@ -808,21 +893,30 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'" alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'" - alias utf2iso='if isutfenv ; then - for ENV in `env | grep UTF` ; do - eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')" - done - fi' - alias iso2utf='if isutfenv ; then - for ENV in `env | grep '\.iso'` ; do - eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')" - done - fi' + # make sure it is not assigned yet + [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso + utf2iso() { + if isutfenv ; then + for ENV in $(env | command grep -i '.utf') ; do + eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')" + done + fi + } + + # make sure it is not assigned yet + [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf + iso2utf() { + if ! isutfenv ; then + for ENV in $(env | command grep -i '\.iso') ; do + eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')" + done + fi + } # set up software synthesizer via speakup alias swspeak=' aumix -w 90 -v 90 -p 90 -m 90 - if ! [ -r /dev/softsynth ] ; then + if ! [[ -r /dev/softsynth ]] ; then flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?" return 1 else @@ -838,8 +932,15 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # I like clean prompt, so provide simple way to get that alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0' +# for really lazy people like mika: + type S &>/dev/null || alias S='screen' + type s &>/dev/null || alias s='ssh' + +# get top 10 shell commands: + alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10' + # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i' - if [ -x $(which truecrypt) ] ; then + if [[ -x $(type truecrypt) ]] ; then if isutfenv ; then alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" ' else @@ -898,7 +999,7 @@ Enjoy your grml system with the zsh!$reset_color" } # debian stuff - if [ -r /etc/debian_version ] ; then + if [[ -r /etc/debian_version ]] ; then #a3# Execute \kbd{apt-cache search} alias acs='apt-cache search' #a3# Execute \kbd{apt-cache show} @@ -915,8 +1016,8 @@ Enjoy your grml system with the zsh!$reset_color" salias ag="apt-get upgrade" #a3# Execute \kbd{apt-get update} salias au="apt-get update" - #a3# Execute \kbd{aptitude update ; aptitude upgrade} - salias -a up="aptitude update ; aptitude upgrade" + #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade} + salias -a up="aptitude update ; aptitude safe-upgrade" #a3# Execute \kbd{dpkg-buildpackage} alias dbp='dpkg-buildpackage' #a3# Execute \kbd{grep-excuses} @@ -925,7 +1026,7 @@ Enjoy your grml system with the zsh!$reset_color" # debian upgrade #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade} upgrade () { - if [ -z "$1" ] ; then + if [[ -z "$1" ]] ; then $SUDO apt-get update $SUDO apt-get -u upgrade else @@ -951,14 +1052,14 @@ Enjoy your grml system with the zsh!$reset_color" fi # sort installed Debian-packages by size - if [ -x $(which grep-status) ] ; then + if [[ -x $(type grep-status) ]] ; then #a3# List installed Debian-packages sorted by size alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn' fi # if cdrecord is a symlink (to wodim) or isn't present at all warn: - if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then - if [ -x $(which wodim) ] ; then + if [[ -L /usr/bin/cdrecord -o ! -x $(type cdrecord) ]] ; then + if [[ -x $(type wodim) ]] ; then alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore. See #377109 in the BTS of Debian for more details. @@ -967,7 +1068,7 @@ Please use the wodim binary instead' ; return 1" fi # get_tw_cli has been renamed into get_3ware - if [ -x $(which get_3ware) ] ; then + if [[ -x $(type get_3ware) ]] ; then get_tw_cli() { echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2 get_3ware @@ -975,7 +1076,7 @@ Please use the wodim binary instead' ; return 1" fi # I hate lacking backward compatibility, so provide an alternative therefore - if ! [ -x $(which apache2-ssl-certificate) ] ; then + if ! [[ -x $(type apache2-ssl-certificate) ]] ; then apache2-ssl-certificate(){ print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :(' @@ -1010,7 +1111,7 @@ Run "grml-tips ssl-certificate" if you need further instructions. grmlcomp() { ## completion system zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer - zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables + zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)' # don't complete backup files as executables zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' # zstyle ':completion:*:correct:*' original true # @@ -1054,20 +1155,20 @@ grmlcomp() { } # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it if [[ -n "$NOCOR" ]] ; then - zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files + zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored setopt nocorrect # do not try to correct the spelling if possible else -# zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files +# zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _ignored _correct _approximate _files setopt correct # try to correct the spelling if possible zstyle -e ':completion:*' completer ' - if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then + if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then _last_try="$HISTNO$BUFFER$CURSOR" - reply=(_complete _match _prefix _files) + reply=(_complete _match _ignored _prefix _files) else - if [[ $words[1] = (rm|mv) ]]; then + if [[ $words[1] == (rm|mv) ]] ; then reply=(_complete _files) else - reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files) + reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files) fi fi' fi @@ -1089,13 +1190,13 @@ grmlcomp() { zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html' # caching - [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \ + [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \ zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/ # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */ if is42 ; then - [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=() - [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(\n' "$0" && return 1 + [[ -z "$1" ]] && printf 'Usage: %s \n' "$0" && return 1 for i in "$@" ; do file=$i - while [ -h "$file" ] ; do + while [[ -h "$file" ]] ; do ls -l $file file=$(readlink "$file") done @@ -1247,19 +1348,22 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." else manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; } # manzsh() { /usr/bin/man zshall | most +/"$1" ; } + # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less' # manzsh() { man zshall | $MYLESS -p $1 ; } fi - if [ -x $(which most) ] ; then + if [[ -x $(type most) ]] ; then #f1# View Debian's changelog of a given package dchange() { - if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then + if [[ -r /usr/share/doc/${1}/changelog.Debian.gz ]] ; then most /usr/share/doc/${1}/changelog.Debian.gz + elif [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then + most /usr/share/doc/${1}/changelog.gz else if type -p aptitude &>/dev/null ; then echo "No changelog for package $1 found, using aptitude to retrieve it." if isgrml ; then - aptitude -t unstable changelog tsclient + aptitude -t unstable changelog ${1} else aptitude changelog ${1} fi @@ -1274,10 +1378,10 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." #f1# View Debian's NEWS of a given package dnews() { - if [ -r /usr/share/doc/${1}/NEWS.Debian.gz ] ; then + if [[ -r /usr/share/doc/${1}/NEWS.Debian.gz ]] ; then most /usr/share/doc/${1}/NEWS.Debian.gz else - if [ -r /usr/share/doc/${1}/NEWS.gz ] ; then + if [[ -r /usr/share/doc/${1}/NEWS.gz ]] ; then most /usr/share/doc/${1}/NEWS.gz else echo "No NEWS file for package $1 found, sorry." @@ -1290,7 +1394,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." #f1# View upstream's changelog of a given package uchange() { - if [ -r /usr/share/doc/${1}/changelog.gz ] ; then + if [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then most /usr/share/doc/${1}/changelog.gz else echo "No changelog for package $1 found, sorry." @@ -1308,13 +1412,13 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." #f1# Edit an alias via zle edalias() { - [ -z "$1" ] && { echo "Usage: edalias " ; return 1 } || vared aliases'[$1]' ; + [[ -z "$1" ]] && { echo "Usage: edalias " ; return 1 } || vared aliases'[$1]' ; } compdef _aliases edalias #f1# Edit a function via zle edfunc() { - [ -z "$1" ] && { echo "Usage: edfun " ; return 1 } || zed -f "$1" ; + [[ -z "$1" ]] && { echo "Usage: edfun " ; return 1 } || zed -f "$1" ; } compdef _functions edfunc @@ -1324,7 +1428,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop} #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload} #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload} - if [ -d /etc/init.d ] ; then + if [[ -d /etc/init.d ]] ; then for i in Start Restart Stop Force-Reload Reload ; do eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }" done @@ -1375,7 +1479,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # grep for running process, like: 'any vim' any() { - if [ -z "$1" ] ; then + if [[ -z "$1" ]] ; then echo "any - grep for process(es) by keyword" >&2 echo "Usage: any " >&2 ; return 1 else @@ -1389,7 +1493,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # After resuming from suspend, system is paging heavily, leading to very bad interactivity. # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt - [ -r /proc/1/maps ] && deswap() { + [[ -r /proc/1/maps ]] && deswap() { print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.' cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null print 'Finished, running "swapoff -a; swapon -a" may also be useful.' @@ -1397,13 +1501,13 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # print hex value of a number hex() { - [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex ' ; return 1 } + [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex ' ; return 1 } } # calculate (or eval at all ;-)) with perl => p[erl-]eval # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC' peval() { - [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]" + [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]" perl -e "print eval($CALC),\"\n\";" } functions peval &>/dev/null && alias calc=peval @@ -1411,7 +1515,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under # certain circumstances, so work around it, no matter which environment we have brltty() { - if [ -z "$DISPLAY" ] ; then + if [[ -z "$DISPLAY" ]] ; then consolechars -f /usr/share/consolefonts/default8x16.psf.gz command brltty "$@" else @@ -1422,12 +1526,12 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # just press 'asdf' keys to toggle between dvorak and us keyboard layout aoeu() { echo -n 'Switching to us keyboard layout: ' - [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null + [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null echo 'Done' } asdf() { echo -n 'Switching to dvorak keyboard layout: ' - [ -z "$DISPLAY" ] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null + [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null echo 'Done' } # just press 'asdf' key to toggle from neon layout to us keyboard layout @@ -1444,9 +1548,9 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." print 'ipv6 tunnel already set up, nothing to be done.' print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1 else - [ -n "$PUBLIC_IP" ] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \ + [[ -n "$PUBLIC_IP" ]] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \ awk '/inet addr:/ {print $2}' | tr -d 'addr:') - [ -n "$PUBLIC_IP" ] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 } + [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 } local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ })) print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: " ifconfig sit0 tunnel ::192.88.99.1 up @@ -1484,6 +1588,11 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh } + # make a backup of a file + bk() { + cp -a "$1" "${1}_$(date --iso-8601=seconds)" + } + # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html # bash() { # NO_SWITCH="yes" command bash "$@" @@ -1497,7 +1606,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # log out? set timeout in seconds {{{ # TMOUT=1800 # do not log out in some specific terminals: -# if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then +# if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]] ; then # unset TMOUT # fi # }}} @@ -1507,14 +1616,14 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # }}} # source another config file if present {{{ - if [ -r /etc/zsh/zshrc.local ]; then + if [[ -r /etc/zsh/zshrc.local ]] ; then source /etc/zsh/zshrc.local fi # }}} # "persistent history" {{{ # just write important commands you always need to ~/.important_commands - if [ -r ~/.important_commands ] ; then + if [[ -r ~/.important_commands ]] ; then fc -R ~/.important_commands fi # }}}