X-Git-Url: http://git.grml.org/?p=grml-etc-core.git;a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=afcb5b760e72800d43d05505ab6e313f83995cc1;hp=417ab816d70d6d9250464062d8fdb568d48bb2a1;hb=2735a118643b1cdbea1928c9f726e706d7d6c604;hpb=c4db6d7ae04cad5b87d1b6a1e0f79bf09ad5794e diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 417ab81..afcb5b7 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -388,9 +388,6 @@ setopt extended_glob # display PID when suspending processes as well setopt longlistjobs -# try to avoid the 'zsh: no matches found...' -setopt nonomatch - # report the status of backgrounds jobs immediately setopt notify @@ -434,11 +431,21 @@ ZSH_NO_DEFAULT_LOCALE=${ZSH_NO_DEFAULT_LOCALE:-0} typeset -ga ls_options typeset -ga grep_options + +# Colors on GNU ls(1) if ls --color=auto / >/dev/null 2>&1; then ls_options+=( --color=auto ) +# Colors on FreeBSD and OSX ls(1) elif ls -G / >/dev/null 2>&1; then ls_options+=( -G ) fi + +# Natural sorting order on GNU ls(1) +if ls -v / >/dev/null 2>&1; then + ls_options+=( -v ) +fi + +# Color on GNU and FreeBSD grep(1) if grep --color=auto -q "a" <<< "a" >/dev/null 2>&1; then grep_options+=( --color=auto ) fi @@ -528,30 +535,6 @@ salias() { return 0 } -# a "print -l ${(u)foo}"-workaround for pre-4.2.0 shells -# usage: uprint foo -# Where foo is the *name* of the parameter you want printed. -# Note that foo is no typo; $foo would be wrong here! -if ! is42 ; then - uprint () { - emulate -L zsh - local -a u - local w - local parameter=$1 - - if [[ -z ${parameter} ]] ; then - printf 'usage: uprint \n' - return 1 - fi - - for w in ${(P)parameter} ; do - [[ -z ${(M)u:#$w} ]] && u=( $u $w ) - done - - builtin print -l $u - } -fi - # Check if we can read given files and source those we can. xsource() { if (( ${#argv} < 1 )) ; then @@ -624,14 +607,6 @@ export PAGER=${PAGER:-less} #v# export MAIL=${MAIL:-/var/mail/$USER} -# if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/ -if [[ -z "$SHELL" ]] ; then - SHELL="$(which zsh)" - if [[ -x "$SHELL" ]] ; then - export SHELL - fi -fi - # color setup for ls: check_com -c dircolors && eval $(dircolors -b) # color setup for ls on OS X / FreeBSD: @@ -840,9 +815,16 @@ grmlcomp() { # command for process lists, the local web server details and host completion 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/ + # Some functions, like _apt and _dpkg, are very slow. We can use a cache in + # order to speed things up + if [[ ${GRML_COMP_CACHING:-yes} == yes ]]; then + GRML_COMP_CACHE_DIR=${GRML_COMP_CACHE_DIR:-${ZDOTDIR:-$HOME}/.cache} + if [[ ! -d ${GRML_COMP_CACHE_DIR} ]]; then + command mkdir -p "${GRML_COMP_CACHE_DIR}" + fi + zstyle ':completion:*' use-cache yes + zstyle ':completion:*:complete:*' cache-path "${GRML_COMP_CACHE_DIR}" + fi # host completion if is42 ; then @@ -989,7 +971,7 @@ function Accept-Line-HandleContext() { function accept-line() { setopt localoptions noksharrays - local -ax cmdline + local -a cmdline local -x alcontext local buf com fname format msg default_action @@ -1615,8 +1597,6 @@ function command_not_found_handler() { # history -ZSHDIR=${ZDOTDIR:-${HOME}/.zsh} - #v# HISTFILE=${ZDOTDIR:-${HOME}}/.zsh_history isgrmlcd && HISTSIZE=500 || HISTSIZE=5000 @@ -1627,23 +1607,52 @@ isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history DIRSTACKSIZE=${DIRSTACKSIZE:-20} DIRSTACKFILE=${DIRSTACKFILE:-${ZDOTDIR:-${HOME}}/.zdirs} -if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then - dirstack=( ${(f)"$(< $DIRSTACKFILE)"} ) - # "cd -" won't work after login by just setting $OLDPWD, so - [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD -fi +typeset -gaU GRML_PERSISTENT_DIRSTACK +function grml_dirstack_filter() { + local -a exclude + local filter entry + if zstyle -s ':grml:chpwd:dirstack' filter filter; then + $filter $1 && return 0 + fi + if zstyle -a ':grml:chpwd:dirstack' exclude exclude; then + for entry in "${exclude[@]}"; do + [[ $1 == ${~entry} ]] && return 0 + done + fi + return 1 +} chpwd() { - if (( $DIRSTACKSIZE <= 0 )) || [[ -z $DIRSTACKFILE ]]; then return; fi - local -ax my_stack - my_stack=( ${PWD} ${dirstack} ) - if is42 ; then - builtin print -l ${(u)my_stack} >! ${DIRSTACKFILE} - else - uprint my_stack >! ${DIRSTACKFILE} - fi + (( $DIRSTACKSIZE <= 0 )) && return + [[ -z $DIRSTACKFILE ]] && return + grml_dirstack_filter $PWD && return + GRML_PERSISTENT_DIRSTACK=( + $PWD "${(@)GRML_PERSISTENT_DIRSTACK[1,$DIRSTACKSIZE]}" + ) + builtin print -l ${GRML_PERSISTENT_DIRSTACK} >! ${DIRSTACKFILE} } +if [[ -f ${DIRSTACKFILE} ]]; then + # Enabling NULL_GLOB via (N) weeds out any non-existing + # directories from the saved dir-stack file. + dirstack=( ${(f)"$(< $DIRSTACKFILE)"}(N) ) + # "cd -" won't work after login by just setting $OLDPWD, so + [[ -d $dirstack[1] ]] && cd -q $dirstack[1] && cd -q $OLDPWD +fi + +if zstyle -T ':grml:chpwd:dirstack' filter-on-load; then + for i in "${dirstack[@]}"; do + if ! grml_dirstack_filter "$i"; then + GRML_PERSISTENT_DIRSTACK=( + "${GRML_PERSISTENT_DIRSTACK[@]}" + $i + ) + fi + done +else + GRML_PERSISTENT_DIRSTACK=( "${dirstack[@]}" ) +fi + # directory based profiles if is433 ; then @@ -2510,16 +2519,14 @@ hash -d www=/var/www if check_com -c screen ; then if [[ $UID -eq 0 ]] ; then if [[ -r /etc/grml/screenrc ]]; then - alias screen="${commands[screen]} -c /etc/grml/screenrc" + alias screen='screen -c /etc/grml/screenrc' fi - elif [[ -r $HOME/.screenrc ]] ; then - alias screen="${commands[screen]} -c $HOME/.screenrc" - else + elif [[ ! -r $HOME/.screenrc ]] ; then if [[ -r /etc/grml/screenrc_grml ]]; then - alias screen="${commands[screen]} -c /etc/grml/screenrc_grml" + alias screen='screen -c /etc/grml/screenrc_grml' else if [[ -r /etc/grml/screenrc ]]; then - alias screen="${commands[screen]} -c /etc/grml/screenrc" + alias screen='screen -c /etc/grml/screenrc' fi fi fi @@ -2709,11 +2716,10 @@ __EOF0__ fi fi -# Use hard limits, except for a smaller stack and no core dumps -unlimit -is425 && limit stack 8192 -isgrmlcd && limit core 0 # important for a live-cd-system -limit -s +if isgrmlcd; then + # No core dumps: important for a live-cd-system + limit -s core 0 +fi # grmlstuff grmlstuff() { @@ -2765,16 +2771,98 @@ is4 && nt() { freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done } compdef _functions freload -#f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s') +# +# Usage: +# +# e.g.: a -> b -> c -> d .... +# +# sll a +# +# +# if parameter is given with leading '=', lookup $PATH for parameter and resolve that +# +# sll =java +# +# Note: limit for recursive symlinks on linux: +# http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/namei.c?id=refs/heads/master#l808 +# This limits recursive symlink follows to 8, +# while limiting consecutive symlinks to 40. +# +# When resolving and displaying information about symlinks, no check is made +# that the displayed information does make any sense on your OS. +# We leave that decission to the user. +# +# The zstat module is used to detect symlink loops. zstat is available since zsh4. +# With an older zsh you will need to abort with in that case. +# When a symlink loop is detected, a warning ist printed and further processing is stopped. +# +# Module zstat is loaded by default in grml zshrc, no extra action needed for that. +# +# Known bugs: +# If you happen to come accross a symlink that points to a destination on an other partition +# with the same inode number, that will be marked as symlink loop though it is not. +# Two hints for this situation: +# I) Play lottery the same day, as you seem to be rather lucky right now. +# II) Send patches. +# +# return status: +# 0 upon success +# 1 file/dir not accesible +# 2 symlink loop detected +# +#f1# List symlinks in detail (more detailed version of 'readlink -f', 'whence -s' and 'namei -l') sll() { - [[ -z "$1" ]] && printf 'Usage: %s \n' "$0" && return 1 - local file - for file in "$@" ; do + if [[ -z ${1} ]] ; then + printf 'Usage: %s \n' "${0}" + return 1 + fi + + local file jumpd curdir + local -i RTN LINODE i + local -a SEENINODES + curdir="${PWD}" + RTN=0 + + for file in "${@}" ; do + SEENINODES=() + ls -l "${file:a}" || RTN=1 + while [[ -h "$file" ]] ; do - ls -l $file + if is4 ; then + LINODE=$(zstat -L +inode "${file}") + for i in ${SEENINODES} ; do + if (( ${i} == ${LINODE} )) ; then + builtin cd "${curdir}" + print "link loop detected, aborting!" + return 2 + fi + done + SEENINODES+=${LINODE} + fi + jumpd="${file:h}" + file="${file:t}" + + if [[ -d ${jumpd} ]] ; then + builtin cd "${jumpd}" || RTN=1 + fi file=$(readlink "$file") + + jumpd="${file:h}" + file="${file:t}" + + if [[ -d ${jumpd} ]] ; then + builtin cd "${jumpd}" || RTN=1 + fi + + ls -l "${PWD}/${file}" || RTN=1 done + shift 1 + if (( ${#} >= 1 )) ; then + print "" + fi + builtin cd "${curdir}" done + return ${RTN} } # TODO: Is it supported to use pager settings like this? @@ -2856,7 +2944,7 @@ fi # zsh profiling profile() { - ZSH_PROFILE_RC=1 $SHELL "$@" + ZSH_PROFILE_RC=1 zsh "$@" } #f1# Edit an alias via zle @@ -2872,12 +2960,12 @@ edfunc() { compdef _functions edfunc # use it e.g. via 'Restart apache2' -#m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start} -#m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart} -#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} -#m# f6 Status() \kbd{/etc/init.d/\em{process}}\quad\kbd{status} +#m# f6 Start() \kbd{service \em{process}}\quad\kbd{start} +#m# f6 Restart() \kbd{service \em{process}}\quad\kbd{restart} +#m# f6 Stop() \kbd{service \em{process}}\quad\kbd{stop} +#m# f6 Reload() \kbd{service \em{process}}\quad\kbd{reload} +#m# f6 Force-Reload() \kbd{service \em{process}}\quad\kbd{force-reload} +#m# f6 Status() \kbd{service \em{process}}\quad\kbd{status} if [[ -d /etc/init.d || -d /etc/service ]] ; then __start_stop() { local action_="${1:l}" # e.g Start/Stop/Restart @@ -2898,8 +2986,12 @@ if [[ -d /etc/init.d || -d /etc/service ]] ; then *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;; esac else - # sysvinit - $SUDO "/etc/init.d/$service_" "${action_}" "$param_" + # sysv/sysvinit-utils, upstart + if check_com -c service ; then + $SUDO service "$service_" "${action_}" "$param_" + else + $SUDO "/etc/init.d/$service_" "${action_}" "$param_" + fi fi } @@ -3435,17 +3527,6 @@ _simple_extract() compdef _simple_extract simple-extract alias se=simple-extract -#f5# Set all ulimit parameters to \kbd{unlimited} -allulimit() { - ulimit -c unlimited - ulimit -d unlimited - ulimit -f unlimited - ulimit -l unlimited - ulimit -n unlimited - ulimit -s unlimited - ulimit -t unlimited -} - #f5# Change the xterm title from within GNU-screen xtrename() { emulate -L zsh