X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=843b0f88c95bd7d975113428bf802e167890af41;hb=ac8a97797662df20aa9bc239e434ca8f94596bab;hp=e47b10664eb50c0f9186f5654310062217a5c32c;hpb=da48c656abbb58141937936c9e36c10327a868fc;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index e47b106..843b0f8 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: Don Nov 30 16:15:06 CET 2006 [mika] +# Latest change: Son Jän 14 10:57:03 CET 2007 [mika] ################################################################################ # This file is sourced only for interactive shells. It # should contain commands to set up aliases, functions, @@ -12,6 +12,13 @@ # Global Order: zshenv, zprofile, zshrc, zlogin ################################################################################ +# zsh profiling {{{ +# just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details + if [[ -n $ZSH_PROFILE_RC ]] ; then + zmodload zsh/zprof + fi +# }}} + # {{{ check for version/system # check for versions (compatibility reasons) if autoload is-at-least && is-at-least 2>/dev/null ; then @@ -47,6 +54,15 @@ isgrmlsmall() { return 1 } fi + # are we running within an utf environment? + isutfenv() { + case "$LANG $CHARSET $LANGUAGE" in + *utf*) return 0 ;; + *UTF*) return 0 ;; + *) return 1 ;; + esac + } + # check for user, if not running as root set $SUDO to sudo (( EUID != 0 )) && SUDO='sudo' || SUDO='' @@ -231,8 +247,8 @@ fi autoload run-help # use via 'esc-h' # completion system - if autoload -U compinit && [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Completion/compinit" ] && compinit 2>/dev/null ; then - compinit + if autoload -U compinit && compinit 2>/dev/null ; then + compinit 2>/dev/null || print 'Notice: no compinit available :(' else print 'Notice: no compinit available :(' function zstyle { } @@ -242,13 +258,13 @@ fi is4 && autoload -U zed # use ZLE editor to edit a file or function is4 && for mod in complist deltochar mathfunc ; do - zmodload -i zsh/${mod} + zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :(" done # autoload zsh modules when they are referenced is4 && for opt mod in a stat \ a zpty \ - a zprof \ + ap zprof \ ap mapfile ; do zmodload -${opt} zsh/${mod} ${mod} done ; unset opt mod @@ -306,7 +322,8 @@ fi # }}} # {{{ set some important options - umask 022 + # umask 022 + umask 002 # history: setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!) @@ -363,9 +380,21 @@ fi isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history # }}} +# dirstack handling {{{ + DIRSTACKSIZE=20 + if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then + dirstack=( ${(uf)"$(< ~/.zdirs)"} ) + # "cd -" won't work after login by just setting $OLDPWD, so + cd $dirstack[0] && cd $OLDPWD + fi + chpwd() { + builtin dirs -pl >! ~/.zdirs + } +# }}} + # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh' if [ -n "$BATTERY" ] ; then - if [ -x =acpi ] ; then + if [ -x $(which acpi) ] ; then PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}" [ -z "$PERCENT" ] && PERCENT='acpi not present' if [ "${PERCENT%%%}" -lt 20 ] ; then @@ -387,8 +416,8 @@ fi # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l; - is4 && ! [[ -n "$NOPRECMD" ]] && precmd () { - (( NOPRECMD > 0 )) && return 0 + is4 && [[ -z $NOPRECMD ]] && precmd () { + [[ -n $NOPRECMD ]] && return 0 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT if [[ -z ${DONTSETRPROMPT} ]] ; then if [ -n "$BATTERY" ] ; then @@ -410,8 +439,8 @@ fi # chpwd () => a function which is executed whenever the directory is changed # preexec() => a function running before every command - is4 && ! [[ -n "$NOPRECMD" ]] && preexec () { - (( NOPRECMD > 0 )) && return 0 + is4 && [[ -z $NOPRECMD ]] && preexec () { + [[ -n $NOPRECMD ]] && return 0 # set hostname if not running on host with name 'grml' local HOSTNAME=$(hostname) if [[ "$HOSTNAME" != grml ]] ; then @@ -533,9 +562,16 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth. -# truecrypt; use e.g. via 'truec /dev/ice' /mnt/ice' or 'truec -i' + # I like clean prompt, so provide simple way to get that + alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0' + +# truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i' if [ -x /usr/sbin/truecrypt ] ; then - alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" ' + if isutfenv ; then + alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" ' + else + alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" ' + fi fi zsh-help(){print "$bg[white]$fg[black] @@ -546,7 +582,7 @@ Main configuration of zsh happens in /etc/zsh/zshrc (global) and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once. The files are part of the package grml-etc-core, if you want to use them on a non-grml-system just get the tar.gz from -http://grml.org/repos/ or get the files from the mercurial +http://deb.grml.org/ or get the files from the mercurial repository: http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc @@ -622,9 +658,15 @@ Enjoy your grml system with the zsh!$reset_color" alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc fi +# sort installed Debian-packages by size + if [ -x /usr/bin/grep-status ] ; then + 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 =cdrecord ] ; then - if [ -x =wodim ] ; then + if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then + if [ -x $(which 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. @@ -632,6 +674,25 @@ Please use the wodim binary instead' ; return 1" fi fi +# I hate lacking backward compability, so provide an alternative therefore + if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then + function apache2-ssl-certificate(){ + + print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :(' + print 'You might want to take a look at Debian the package ssl-cert as well.' + print 'To generate a certificate for use with apache2 follow the instructions:' + + echo ' + +export RANDFILE=/dev/random +mkdir /etc/apache2/ssl/ +openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem +chmod 600 /etc/apache2/ssl/apache.pem + +Run "grml-tips ssl-certificate" if you need further instructions. +' + } + fi # }}} # {{{ Use hard limits, except for a smaller stack and no core dumps @@ -667,8 +728,6 @@ grmlcomp() { zstyle ':completion:*:history-words' menu yes # activate menu zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries zstyle ':completion:*:history-words' stop yes # - zstyle ':completion:*:*:linda:*' file-patterns '*.deb' # complete debian packages for command 'linda' - zstyle ':completion:*:*:lintian:*' file-patterns '*.deb' # complete debian packages for command 'lintian' zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase zstyle ':completion:*:matches' group 'yes' # separate matches into groups zstyle ':completion:*' group-name '' @@ -733,22 +792,54 @@ grmlcomp() { # bindkey "^M" my_accept # command for process lists, the local web server details and host completion - hosts=(`hostname` grml.org) - zstyle '*' hosts $hosts zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html' # caching [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \ zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/ -# use ~/.ssh/known_hosts for completion [does not work with hashing of new ssh versions anymore] - if [ -f "$HOME/.ssh/known_hosts" ] ; then - hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) - zstyle ':completion:*:hosts' hosts $hosts +# 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)~~"$(/dev/null ; then + manzsh() { qma zshall "$1" } + compdef _man qma + else + manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; } + # manzsh() { /usr/bin/man zshall | most +/"$1" ; } + # manzsh() { man zshall | $MYLESS -p $1 ; } + fi # use "dchange " to view Debian's changelog of the package: dchange() { @@ -830,10 +940,10 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." most /usr/share/doc/${1}/changelog.Debian.gz else if [ -r /usr/share/doc/${1}/changelog.gz ] ; then - most /usr/share/doc/${1}/changelog.gz + most /usr/share/doc/${1}/changelog.gz else - echo "No changelog for package $1 found, sorry." - return 1 + echo "No changelog for package $1 found, sorry." + return 1 fi fi } @@ -852,6 +962,11 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." _uchange() { _files -W /usr/share/doc -/ } compdef _uchange uchange +# zsh profiling + profile () { + ZSH_PROFILE_RC=1 $SHELL "$@" + } + # edit alias via zle: edalias() { [ -z "$1" ] && { echo "Usage: edalias " ; return 1 } || vared aliases'[$1]' ; @@ -859,19 +974,114 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." compdef _aliases edalias # edit function via zle: - edfun() { + edfunc() { [ -z "$1" ] && { echo "Usage: edfun " ; return 1 } || zed -f "$1" ; } - compdef _functions edfun + compdef _functions edfunc # use it e.g. via 'Restart apache2' 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 -# now the completion for this: + # now the completion for this: compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload fi + +# provide useful information on globbing + H-Glob() { + echo -e " + / directories + . plain files + @ symbolic links + = sockets + p named pipes (FIFOs) + * executable plain files (0100) + % device files (character or block special) + %b block special files + %c character special files + r owner-readable files (0400) + w owner-writable files (0200) + x owner-executable files (0100) + A group-readable files (0040) + I group-writable files (0020) + E group-executable files (0010) + R world-readable files (0004) + W world-writable files (0002) + X world-executable files (0001) + s setuid files (04000) + S setgid files (02000) + t files with the sticky bit (01000) + + print *(m-1) # Files modified up to a day ago + print *(a1) # Files accessed a day ago + print *(@) # Just symlinks + print *(Lk+50) # Files bigger than 50 kilobytes + print *(Lk-50) # Files smaller than 50 kilobytes + print **/*.c # All *.c files recursively starting in \$PWD + print **/*.c~file.c # Same as above, but excluding 'file.c' + print (foo|bar).* # Files starting with 'foo' or 'bar' + print *~*.* # All Files that do not contain a dot + chmod 644 *(.^x) # make all plain non-executable files publically readable + print -l *(.c|.h) # Lists *.c and *.h + print **/*(g:users:) # Recursively match all files that are owned by group 'users' + echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<" + } + alias help-zshglob=H-Glob + + type -p qma &>/dev/null && alias ?='qma zshall' + + # grep for running process, like: 'any vim' + any() { + if [ -z "$1" ] ; then + echo "any - grep for process(es) by keyword" >&2 + echo "Usage: any " >&2 ; return 1 + else + local STRING=$1 + local LENGTH=$(expr length $STRING) + local FIRSCHAR=$(echo $(expr substr $STRING 1 1)) + local REST=$(echo $(expr substr $STRING 2 $LENGTH)) + ps xauwww| grep "[$FIRSCHAR]$REST" + fi + } + + # After resuming from suspend, system is paging heavilly, leading to very bad interactivity. + # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt + [ -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.' + } + + # print hex value of a number + hex() { + [ -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]" + perl -e "print eval($CALC),\"\n\";" + } + functions peval &>/dev/null && alias calc=peval + + # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html + # bash() { + # NO_SWITCH="yes" command bash "$@" + # } + # restart () { + # exec $SHELL $SHELL_ARGS "$@" + # } + +# }}} + +# log out? set timeout in seconds {{{ +# TMOUT=1800 +# do not log out in some specific terminals: +# if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then +# unset TMOUT +# fi # }}} # {{{ make sure our environment is clean regarding colors @@ -892,4 +1102,4 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." # }}} ## END OF FILE ################################################################# -# vim:foldmethod=marker +# vim:foldmethod=marker expandtab