X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=820b06406016de494d4677962d6c9c7932a03033;hb=cb4f982aba9993a99b791b3f8d97c57af3c721b3;hp=a31cb8ad8444be90e0328dd307c47eceb8e284cf;hpb=8249df82d369284ba879a604b714f05c38714d05;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index a31cb8a..820b064 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: Sam Jul 07 10:56:20 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, @@ -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(){ @@ -165,7 +166,7 @@ #f1# Checks whether or not you're running grml-small isgrmlsmall() { [[ ${${${(f)"$(/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' + + # color setup for ls: [ -x $(which dircolors) ] && eval `dircolors -b` -# Search path for the cd command -# cdpath=(.. ~) + # 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. + # 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 @@ -256,7 +267,7 @@ fi fi -# automatically remove duplicates from these arrays + # automatically remove duplicates from these arrays typeset -U path cdpath fpath manpath # }}} @@ -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 @@ -623,6 +643,67 @@ 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 @@ -630,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}" @@ -809,16 +893,25 @@ ${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=' @@ -923,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} @@ -1018,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 # @@ -1062,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 _last_try="$HISTNO$BUFFER$CURSOR" - reply=(_complete _match _prefix _files) + reply=(_complete _match _ignored _prefix _files) else 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 @@ -1255,6 +1348,7 @@ 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 @@ -1494,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 "$@"