/etc/zsh/zshrc: added zstyle for url-quote-magic
[grml-etc-core.git] / etc / zsh / zshrc
1 # Filename:      zshrc
2 # Purpose:       config file for zsh (z shell)
3 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports:   see http://grml.org/bugs/
5 # License:       This file is licensed under the GPL v2.
6 # Latest change: Son Apr 15 22:36:24 CEST 2007 [mika]
7 ################################################################################
8 # This file is sourced only for interactive shells. It
9 # should contain commands to set up aliases, functions,
10 # options, key bindings, etc.
11 #
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
14
15 # zsh profiling {{{
16 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
17   if [[ -n $ZSH_PROFILE_RC ]] ; then
18      zmodload zsh/zprof
19   fi
20 # }}}
21
22 # {{{ check for version/system
23 # check for versions (compatibility reasons)
24   if autoload is-at-least && is-at-least 2>/dev/null ; then
25      is4() { is-at-least 4 }
26      is42() { is-at-least 4.2 }
27   else
28     is4(){
29       [[ $ZSH_VERSION == 4.* ]] && return 0
30       return 1
31     }
32     is42(){
33       [[ $ZSH_VERSION == 4.<2->* ]] && return 0
34       return 1
35     }
36   fi
37
38 # grml specific stuff
39   isgrml(){
40     [ -f /etc/grml_version ] && return 0
41     return 1
42   }
43
44   isgrmlcd(){
45     [ -f /etc/grml_cd ] && return 0
46     return 1
47   }
48
49   if isgrml ; then
50     isgrmlsmall() {
51     [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
52   }
53   else
54     isgrmlsmall() { return 1 }
55   fi
56
57   # are we running within an utf environment?
58   isutfenv() {
59     case "$LANG $CHARSET $LANGUAGE" in
60       *utf*) return 0 ;;
61       *UTF*) return 0 ;;
62       *)     return 1 ;;
63     esac
64   }
65
66 # check for user, if not running as root set $SUDO to sudo
67  (( EUID != 0 )) && SUDO='sudo' || SUDO=''
68
69 # change directory to home on first invocation of zsh
70 # important for rungetty -> autologin
71 # Thanks go to Bart Schaefer!
72   isgrml && checkhome() {
73   if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
74      export ALREADY_DID_CD_HOME=$HOME
75      cd
76   fi
77   }
78 # }}}
79
80 # {{{ set some variables
81   export EDITOR=${EDITOR:-vim}
82   export MAIL=${MAIL:-/var/mail/$USER}
83   # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
84   export SHELL='/bin/zsh'
85   [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
86   [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
87
88 # Search path for the cd comman
89 #  cdpath=(.. ~)
90
91 # Support our own site-functions
92   [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
93
94 # automatically remove duplicates from these arrays
95   typeset -U path cdpath fpath manpath
96 # }}}
97
98 # {{{ keybindings
99  if [[ "$TERM" != emacs ]]; then
100   [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
101   [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
102   [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
103   [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
104   [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
105   [[ -z "$terminfo[kend]"  ]] || bindkey -M vicmd "$terminfo[kend]"  vi-end-of-line
106   [[ -z "$terminfo[cuu1]"  ]] || bindkey -M viins "$terminfo[cuu1]"  vi-up-line-or-history
107   [[ -z "$terminfo[cuf1]"  ]] || bindkey -M viins "$terminfo[cuf1]"  vi-forward-char
108   [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
109   [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
110   [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
111   [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
112   # ncurses stuff:
113   [[ "$terminfo[kcuu1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
114   [[ "$terminfo[kcud1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
115   [[ "$terminfo[kcuf1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
116   [[ "$terminfo[kcub1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
117   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
118   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}"  end-of-line
119   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
120   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
121 fi
122
123 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
124 # use emacs style per default:
125   bindkey -e
126 # use vi style:
127 # bindkey -v
128
129 #if [[ "$TERM" == screen ]]; then
130   bindkey '\e[1~' beginning-of-line       # home
131   bindkey '\e[4~' end-of-line             # end
132   bindkey "^[[A"  up-line-or-search       # cursor up
133   bindkey "^[[B"  down-line-or-search     # <ESC>-
134   bindkey '^x'    history-beginning-search-backward # alternative ways of searching the shell history
135 # bindkey -s '^L' "|less\n"             # ctrl-L pipes to less
136 # bindkey -s '^B' " &\n"                # ctrl-B runs it in the background
137 # if terminal type is set to 'rxvt':
138   bindkey '\e[7~' beginning-of-line       # home
139   bindkey '\e[8~' end-of-line             # end
140 #fi
141
142 # insert unicode character
143 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง
144 # See for example http://unicode.org/charts/ for unicode characters code
145   autoload insert-unicode-char
146   zle -N insert-unicode-char
147   bindkey '^Xi' insert-unicode-char
148
149 # just type 'cd ...' to get 'cd ../..'
150 #  rationalise-dot() {
151 #  if [[ $LBUFFER = *.. ]]; then
152 #    LBUFFER+=/..
153 #  else
154 #    LBUFFER+=.
155 #  fi
156 #  }
157 #  zle -N rationalise-dot
158 #  bindkey . rationalise-dot
159
160 #  bindkey '\eq' push-line-or-edit
161 # }}}
162
163 # power completion - abbreviation expansion {{{
164 # power completion / abbreviation expansion / buffer expansion
165 # see http://zshwiki.org/home/examples/zleiab for details
166 # less risky than the global aliases but powerful as well
167 # just type the abbreviation key and afterwards ',.' to expand it
168   declare -A abk
169   setopt extendedglob
170   setopt interactivecomments
171   abk=(
172    # key  # value
173    'C'    '| wc -l'
174    '...' '../..'
175    '....' '../../..'
176    'BG' '& exit'
177    'C' '| wc -l'
178    'G' '|& grep --color=auto'
179    'H' '| head'
180    'Hl' ' --help |& less -r'
181    'L' '| less'
182    'LL' '|& less -r'
183    'M' '| most'
184    'N' '&>/dev/null'
185    'R' '| tr A-z N-za-m'
186    'SL' '| sort | less'
187    'S' '| sort -u'
188    'T' '| tail'
189    'V' '|& vim -'
190    'hide' "echo -en '\033]50;nil2\007'"
191    'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
192    'small' 'echo -en "\033]50;6x10\007"'
193    'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
194    'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
195    'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
196    'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
197    'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
198    'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
199    'da' 'du -sch'
200    'j' 'jobs -l'
201    'u' 'translate -i'
202    'co' "./configure && make && sudo make install"
203    'CH' "./configure --help"
204    'conkeror' 'firefox -chrome chrome://conkeror/content'
205    'dir' 'ls -lSrah'
206    'lad' $'ls -d .*(/)\n# only show dot-directories'
207    'lsa' $'ls -a .*(.)\n# only show dot-files'
208    'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
209    'lsl' $'ls -l *(@[1,10])\n# only symlinks'
210    'lsx' $'ls -l *(*[1,10])\n# only executables'
211    'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
212    'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
213    'lsd' $'ls -d *(/)\n# only show directories'
214    'lse' $'ls -d *(/^F)\n# only show empty directories'
215    'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
216    'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
217    'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
218    'rw-' 'chmod 600'
219    '600' 'chmod u+rw-x,g-rwx,o-rwx'
220    'rwx' 'chmod u+rwx'
221    '700' 'chmod u+rwx,g-rwx,o-rwx'
222    'r--' 'chmod u+r-wx,g-rwx,o-rwx'
223    '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
224    '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
225    'md' 'mkdir -p '
226    'cmplayer' 'mplayer -vo -fs -zoom fbdev'
227    'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
228    'fblinks' 'links2 -driver fb'
229    'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
230    'fori' 'for i ({..}) { }'
231    'cx' 'chmod +x'
232    'e'  'print -l'
233    'se' 'setopt interactivecomments'
234    'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
235    'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
236    'fb3' '=mplayer -vo fbdev -fs  -zoom 1>/dev/null -xy 3'
237    'ci' 'centericq'
238    'D'  'export DISPLAY=:0.0'
239    'mp' 'mplayer -vo xv -fs -zoom'
240   )
241
242   globalias () {
243         local MATCH
244         matched_chars='[.-|_a-zA-Z0-9]#'
245         LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
246         LBUFFER+=${abk[$MATCH]:-$MATCH}
247   }
248
249   zle -N globalias
250   bindkey ",." globalias
251 # }}}
252
253 # {{{ autoloading
254   autoload -U zmv    # who needs mmv or rename?
255   autoload history-search-end
256
257   # we don't want to quote/espace URLs on our own...
258   # if autoload -U url-quote-magic ; then
259   #    zle -N self-insert url-quote-magic
260   #    zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
261   # else
262   #    print 'Notice: no url-quote-magic available :('
263   # fi
264   alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
265
266   alias run-help >&/dev/null && unalias run-help
267   autoload run-help # use via 'esc-h'
268
269 # completion system
270   if autoload -U compinit && compinit 2>/dev/null ; then
271      compinit 2>/dev/null || print 'Notice: no compinit available :('
272    else
273      print 'Notice: no compinit available :('
274      function zstyle { }
275      function compdef { }
276   fi
277
278   is4 && autoload -U zed                  # use ZLE editor to edit a file or function
279
280   is4 && for mod in complist deltochar mathfunc ; do
281              zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
282          done
283
284 # autoload zsh modules when they are referenced
285   is4 && for opt mod in a  stat    \
286                         a  zpty    \
287                         ap zprof   \
288                         ap mapfile ; do
289              zmodload -${opt} zsh/${mod} ${mod}
290          done ; unset opt mod
291
292   is4 && autoload -U insert-files && \
293   zle -N insert-files && \
294   bindkey "^Xf" insert-files # C-x-f
295
296   bindkey ' '   magic-space    # also do history expansion on space
297   bindkey '\ei' menu-complete  # menu completion via esc-i
298
299 # press esc-e for editing command line in $EDITOR or $VISUAL
300   is4 && autoload -U edit-command-line && \
301   zle -N edit-command-line && \
302   bindkey '\ee' edit-command-line
303
304 # menu selection: pick item but stay in the menu (press esc-return)
305   is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
306
307 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
308   _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
309   bindkey '\C-ed' _bkdate
310   zle -N _bkdate
311
312 # press esc-m for inserting last typed word again (thanks to caphuso!)
313   insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
314   zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
315
316 # set command prediction from history, see 'man 1 zshcontrib'
317 #  is4 && autoload -U predict-on && \
318 #  zle -N predict-on         && \
319 #  zle -N predict-off        && \
320 #  bindkey "^X^Z" predict-on && \
321 #  bindkey "^Z" predict-off
322
323 # put job into foreground via ctrl-z:
324   bindkey -s '^z' "fg\n"
325
326 # press ctrl-q to quote line:
327 #  mquote () {
328 #        zle beginning-of-line
329 #        zle forward-word
330 #        # RBUFFER="'$RBUFFER'"
331 #        RBUFFER=${(q)RBUFFER}
332 #        zle end-of-line
333 #  }
334 #  zle -N mquote && bindkey '^q' mquote
335
336 # run command line as user root via sudo:
337   _sudo-command-line() {
338     [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
339   }
340   zle -N sudo-command-line _sudo-command-line
341   bindkey "^Os" sudo-command-line
342 # }}}
343
344 # {{{ set some important options
345   (( EUID != 0 )) && umask 002 || umask 022
346
347 # history:
348   setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
349   is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
350   setopt extended_history     # save each command's beginning timestamp and the duration to the history file
351   is4 && setopt histignorealldups # If  a  new  command  line being added to the history
352                               # list duplicates an older one, the older command is removed from the list
353   setopt histignorespace      # remove command lines from the history list when
354                               # the first character on the line is a space
355 #  setopt histallowclobber    # add `|' to output redirections in the history
356 #  setopt NO_clobber          # warning if file exists ('cat /dev/null > ~/.zshrc')
357   setopt auto_cd              # if a command is issued that can't be executed as a normal command,
358                               # and the command is the name of a directory, perform the cd command to that directory
359   setopt extended_glob        # in order to use #, ~ and ^ for filename generation
360                               # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
361                               # -> searches for word not in compressed files
362                               # don't forget to quote '^', '~' and '#'!
363   setopt notify               # report the status of backgrounds jobs immediately
364   setopt hash_list_all        # Whenever a command completion is attempted, make sure \
365                               # the entire command path is hashed first.
366   setopt completeinword       # not just at the end
367 # setopt nocheckjobs          # don't warn me about bg processes when exiting
368   setopt nohup                # and don't kill them, either
369 # setopt printexitvalue       # alert me if something failed
370 # setopt dvorak               # with spelling correction, assume dvorak kb
371   setopt auto_pushd           # make cd push the old directory onto the directory stack.
372   setopt nonomatch            # try to avoid the 'zsh: no matches found...'
373   setopt nobeep               # avoid "beep"ing
374
375   MAILCHECK=30       # mailchecks
376   REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 secondes
377   watch=(notme root) # watch for everyone but me and root
378
379 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
380 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
381 #  WORDCHARS=.
382 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
383 #  WORDCHARS='${WORDCHARS:s@/@}'
384
385 # only slash should be considered as a word separator:
386   slash-backward-kill-word() {
387     local WORDCHARS="${WORDCHARS:s@/@}"
388     # zle backward-word
389     zle backward-kill-word
390   }
391   zle -N slash-backward-kill-word
392   bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
393 # }}}
394
395 # {{{ history
396   export ZSHDIR=$HOME/.zsh
397   HISTFILE=$HOME/.zsh_history
398   isgrmlcd && HISTSIZE=500  || HISTSIZE=5000
399   isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
400 # }}}
401
402 # dirstack handling {{{
403   DIRSTACKSIZE=20
404   if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
405      dirstack=( ${(uf)"$(< ~/.zdirs)"} )
406      # "cd -" won't work after login by just setting $OLDPWD, so
407      cd $dirstack[0] && cd $OLDPWD
408   fi
409   chpwd() {
410     builtin dirs -pl >! ~/.zdirs
411   }
412 # }}}
413
414 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
415   if [ -n "$BATTERY" ] ; then
416      if [ -x $(which acpi) ] ; then
417         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
418         [ -z "$PERCENT" ] && PERCENT='acpi not present'
419         if [ "${PERCENT%%%}" -lt 20 ] ; then
420            PERCENT="warning: ${PERCENT}%"
421         fi
422      fi
423   fi
424 # }}}
425
426 # {{{ set prompt
427   if autoload promptinit && promptinit 2>/dev/null ; then
428      promptinit # people should be able to use their favourite prompt
429   else
430      print 'Notice: no promptinit available :('
431   fi
432
433 # precmd() => a function which is executed just before each prompt
434 # use 'NOPRECMD=1' to disable the precmd + preexec commands
435
436   # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
437
438   is4 && [[ -z $NOPRECMD ]] && precmd () {
439       [[ -n $NOPRECMD ]] && return 0
440       # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
441       if [[ -z ${DONTSETRPROMPT} ]] ; then
442         if [ -n "$BATTERY" ] ; then
443           # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
444           RPROMPT="${PERCENT}${SCREENTITLE}"
445         else
446           # RPROMPT="%(?..:()% ${SCREENTITLE}"
447           RPROMPT="${SCREENTITLE}"
448         fi
449       fi
450       # adjust title of xterm
451       # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
452       case $TERM in (xterm*|rxvt)
453         print -Pn "\e]0;%n@%m: %~\a"
454         ;;
455       esac
456   }
457
458 # chpwd () => a function which is executed whenever the directory is changed
459
460 # preexec() => a function running before every command
461   is4 && [[ -z $NOPRECMD ]] && preexec () {
462       [[ -n $NOPRECMD ]] && return 0
463   # set hostname if not running on host with name 'grml'
464       local HOSTNAME=$(hostname)
465       if [[ "$HOSTNAME" != grml ]] ; then
466          NAME="@$HOSTNAME"
467       fi
468   # get the name of the program currently running and hostname of local machine
469   # set screen window title if running in a screen
470       if [[ "$TERM" == screen* ]]; then
471           # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # dont't use hostname
472           local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
473           echo -ne "\ek$CMD\e\\"
474       fi
475   # set the screen title to "zsh" when sitting at the command prompt:
476       if [[ "$TERM" == screen* ]]; then
477            SCREENTITLE=$'%{\ekzsh\e\\%}'
478       else
479            SCREENTITLE=''
480       fi
481   # adjust title of xterm
482       case $TERM in (xterm*|rxvt)
483         print -Pn "\e]0;%n@%m: $1\a"
484         ;;
485       esac
486   }
487
488 # set colors
489   if autoload colors && colors 2>/dev/null ; then
490      BLUE="%{${fg[blue]}%}"
491      RED="%{${fg_bold[red]}%}"
492      GREEN="%{${fg[green]}%}"
493      CYAN="%{${fg[cyan]}%}"
494      WHITE="%{${fg[white]}%}"
495      NO_COLOUR="%{${reset_color}%}"
496   else
497      BLUE="%{\e[1;34m%}"
498      RED="%{\e[1;31m%}"
499      GREEN="%{\e[1;32m%}"
500      CYAN="%{\e[1;36m%}"
501      WHITE="%{\e[1;37m%}"
502      NO_COLOUR="%{\e[0m%}"
503   fi
504
505   EXITCODE="%(?..%?%1v )"
506   PS2='`%_> '       # secondary prompt, printed when the shell needs more information to complete a command.
507   PS3='?# '         # selection prompt used within a select loop.
508   PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
509
510   # set variable debian_chroot if running in a chroot with /etc/debian_chroot
511   if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
512     debian_chroot=$(cat /etc/debian_chroot)
513   fi
514
515   # don't use colors on dumb terminals (like emacs):
516   if [[ "$TERM" == dumb ]] ; then
517     PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
518   else
519     # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
520     # set variable identifying the chroot you work in (used in the prompt below)
521     if [[ -n "$GRMLPROMPT" ]]; then
522       PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
523 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
524     else
525       if (( EUID != 0 )); then
526         PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
527       else
528         PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
529       fi
530     fi
531   fi
532
533   # if we are inside a grml-chroot set a specific prompt theme
534   if [ -n "$GRML_CHROOT" ] ; then
535      PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
536   fi
537 # }}}
538
539 # {{{ 'hash' some often used directories
540   hash -d deb=/var/cache/apt/archives
541   hash -d doc=/usr/share/doc
542   hash -d linux=/lib/modules/$(command uname -r)/build/
543   hash -d log=/var/log
544   hash -d slog=/var/log/syslog
545   hash -d src=/usr/src
546   hash -d templ=/usr/share/doc/grml-templates
547   hash -d tt=/usr/share/doc/texttools-doc
548   hash -d www=/var/www
549 # }}}
550
551 # {{{ some aliases
552   if [ $UID = 0 ] ; then
553      [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
554   elif [ -r $HOME/.screenrc ] ; then
555      alias screen="/usr/bin/screen -c $HOME/.screenrc"
556   else
557      [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
558   fi
559
560   if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
561      alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
562      alias la='ls -la --color=auto'
563      alias ll='ls -l --color=auto'
564      alias lh='ls -hAl --color=auto'
565      alias l='ls -lF --color=auto'
566   else
567      alias ls='ls -b -CF'
568      alias la='ls -la'
569      alias ll='ls -l'
570      alias lh='ls -hAl'
571      alias l='ls -lF'
572   fi
573
574   alias mdstat='cat /proc/mdstat'
575   alias ...='cd ../../'
576
577   alias cp='nocorrect cp'         # no spelling correction on cp
578   alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
579   alias mv='nocorrect mv'         # no spelling correction on mv
580   alias rm='nocorrect rm'         # no spelling correction on rm
581
582   alias rd='rmdir'
583   alias md='mkdir'
584
585   # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
586   alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '\e%@'"
587   alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '\e%G'"
588
589   alias utf2iso='if isutfenv ; then
590    for ENV in `env | grep UTF` ; do
591        eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
592    done
593    fi'
594   alias iso2utf='if isutfenv ; then
595    for ENV in `env | grep '\.iso'` ; do
596        eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
597    done
598    fi'
599
600 # set up software synthesizer via speakup
601   alias swspeak='
602     aumix -w 90 -v 90 -p 90 -m 90
603     if ! [ -r /dev/softsynth ] ; then
604        flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
605        return 1
606     else
607        setopt singlelinezle
608        unsetopt prompt_cr
609        export PS1="%m%# "
610        nice -n -20 speechd-up
611        flite -o play -t "Finished setting up software synthesizer"
612     fi
613   '
614
615   # I like clean prompt, so provide simple way to get that
616   alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
617
618 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
619   if [ -x /usr/sbin/truecrypt ] ; then
620      if isutfenv ; then
621         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
622      else
623         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
624      fi
625   fi
626
627   zsh-help(){print "$bg[white]$fg[black]
628 zsh-help - hints for use of zsh on grml
629 =======================================$reset_color
630
631 Main configuration of zsh happens in /etc/zsh/zshrc (global)
632 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
633 The files are part of the package grml-etc-core, if you want to
634 use them on a non-grml-system just get the tar.gz from
635 http://deb.grml.org/ or get the files from the mercurial
636 repository:
637
638   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
639   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
640
641 If you want to stay in sync with zsh configuration of grml
642 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
643 your own stuff in \$HOME/.zshrc.local. System wide configuration
644 without touching configuration files of grml can take place
645 in /etc/zsh/zshrc.local.
646
647 If you want to use the configuration of user grml also when
648 running as user root just run 'zshskel' which will source
649 the file /etc/skel/.zshrc.
650
651 For information regarding zsh start at http://grml.org/zsh/
652
653 Take a look at grml's zsh refcard:
654 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
655
656 Check out the main zsh refcard:
657 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
658
659 And of course visit the zsh-lovers:
660 % man zsh-lovers
661
662 You can adjust some options through environment variables when
663 invoking zsh without having to edit configuration files.
664 Basically meant for bash users who are not used to the power of
665 the zsh yet. :)
666
667   \"NOCOR=1    zsh\" => deactivate automatic correction
668   \"NOMENU=1   zsh\" => do not use menu completion (note: use strg-d for completion instead!)
669   \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
670   \"BATTERY=1  zsh\" => activate battery status (via acpi) on right side of prompt
671 $bg[white]$fg[black]
672 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
673 Enjoy your grml system with the zsh!$reset_color"
674 }
675
676 # debian stuff
677   if [ -r /etc/debian_version ] ; then
678     alias acs='apt-cache search'
679     alias acsh='apt-cache show'
680     alias acp='apt-cache policy'
681     alias adg="$SUDO apt-get dist-upgrade"
682     alias agi="$SUDO apt-get install"
683     alias ati="$SUDO aptitude install"
684     alias ag="$SUDO apt-get upgrade"
685     alias au="$SUDO apt-get update"
686     alias up="$SUDO aptitude update ; $SUDO aptitude upgrade"
687     alias dbp='dpkg-buildpackage'
688     alias ge='grep-excuses'
689
690     # debian upgrade
691     upgrade () {
692       if [ -z "$1" ] ; then
693           $SUDO apt-get update
694           $SUDO apt-get -u upgrade
695       else
696           ssh $1 $SUDO apt-get update
697           # ask before the upgrade
698           local dummy
699           ssh $1 $SUDO apt-get --no-act upgrade
700           echo -n 'Process the upgrade?'
701           read -q dummy
702           if [[ $dummy == "y" ]] ; then
703               ssh $1 $SUDO apt-get -u upgrade --yes
704           fi
705       fi
706     }
707
708     isgrmlcd && alias su="sudo su"          # change to user root
709     alias tlog="tail -f /var/log/syslog"    # take a look at the syslog
710     alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
711   fi
712
713 # sort installed Debian-packages by size
714   if [ -x /usr/bin/grep-status ] ; then
715      alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
716                 -n "install ok installed" | paste -sd "  \n" | sort -rn'
717   fi
718
719 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
720   if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
721      if [ -x $(which wodim) ] ; then
722         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
723 See #377109 in the BTS of Debian for more details.
724
725 Please use the wodim binary instead' ; return 1"
726      fi
727   fi
728
729 # get_tw_cli has been renamed into get_3ware
730   if [ -x /usr/bin/get_3ware ] ; then
731      get_tw_cli() {
732        echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
733        get_3ware
734      }
735   fi
736
737 # I hate lacking backward compability, so provide an alternative therefore
738   if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
739    function apache2-ssl-certificate(){
740
741      print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
742      print 'You might want to take a look at Debian the package ssl-cert as well.'
743      print 'To generate a certificate for use with apache2 follow the instructions:'
744
745      echo '
746
747 export RANDFILE=/dev/random
748 mkdir /etc/apache2/ssl/
749 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
750 chmod 600 /etc/apache2/ssl/apache.pem
751
752 Run "grml-tips ssl-certificate" if you need further instructions.
753 '
754    }
755   fi
756 # }}}
757
758 # {{{ Use hard limits, except for a smaller stack and no core dumps
759   unlimit
760   limit stack 8192
761   isgrmlcd && limit core 0 # important for a live-cd-system
762   limit -s
763 # }}}
764
765 # {{{ completion stuff
766
767 # Where to look for autoloaded function definitions
768   if [ -d /etc/zsh/completion.d ] ; then
769     local comp=/etc/zsh/completion.d
770     for func in $comp/*(N-.:t); . ${comp}/${func}
771   fi
772
773 # called later (via is4 && grmlcomp)
774 # notice: use 'zstyle' for getting current settings
775 #         press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
776 grmlcomp() {
777 ## completion system
778   zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
779   zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
780   zstyle ':completion:*:correct:*'       insert-unambiguous true             # start menu completion only if it could find no unambiguous initial string
781   zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
782   zstyle ':completion:*:correct:*'       original true                       #
783   zstyle ':completion:*:default'         list-colors ${(s.:.)LS_COLORS}      # activate color-completion(!)
784   zstyle ':completion:*:descriptions'    format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'  # format on completion
785   zstyle ':completion:*:*:cd:*:directory-stack' menu yes select              # complete 'cd -<tab>' with menu
786   zstyle ':completion:*:expand:*'        tag-order all-expansions            # insert all expansions for expand completer
787   zstyle ':completion:*:history-words'   list false                          #
788   zstyle ':completion:*:history-words'   menu yes                            # activate menu
789   zstyle ':completion:*:history-words'   remove-all-dups yes                 # ignore duplicate entries
790   zstyle ':completion:*:history-words'   stop yes                            #
791   zstyle ':completion:*'                 matcher-list 'm:{a-z}={A-Z}'        # match uppercase from lowercase
792   zstyle ':completion:*:matches'         group 'yes'                         # separate matches into groups
793   zstyle ':completion:*'                 group-name ''
794   if [[ -z "$NOMENU" ]] ; then
795     zstyle ':completion:*'               menu select=5                       # if there are more than 5 options allow selecting from a menu
796   else
797     setopt no_auto_menu # don't use any menus at all
798   fi
799   zstyle ':completion:*:messages'        format '%d'                         #
800   zstyle ':completion:*:options'         auto-description '%d'               #
801   zstyle ':completion:*:options'         description 'yes'                   # describe options in full
802   zstyle ':completion:*:processes'       command 'ps -au$USER'               # on processes completion complete all user processes
803   zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters        # offer indexes before parameters in subscripts
804   zstyle ':completion:*'                 verbose true                        # provide verbose completion information
805   zstyle ':completion:*:warnings'        format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
806   zstyle ':completion:*:*:zcompile:*'    ignored-patterns '(*~|*.zwc)'       # define files to ignore for zcompile
807   zstyle ':completion:correct:'          prompt 'correct to: %e'             #
808   zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'    # Ignore completion functions for commands you don't have:
809
810 # complete manual by their section
811   zstyle ':completion:*:manuals'    separate-sections true
812   zstyle ':completion:*:manuals.*'  insert-sections   true
813   zstyle ':completion:*:man:*'      menu yes select
814
815 ## correction
816 # run rehash on completion so new installed program are found automatically:
817   _force_rehash() {
818       (( CURRENT == 1 )) && rehash
819          return 1 # Because we didn't really complete anything
820     }
821 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
822   if [[ -n "$NOCOR" ]] ; then
823     zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
824     setopt nocorrect # do not try to correct the spelling if possible
825   else
826 #    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
827     setopt correct  # try to correct the spelling if possible
828     zstyle -e ':completion:*' completer '
829         if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
830           _last_try="$HISTNO$BUFFER$CURSOR"
831           reply=(_complete _match _prefix _files)
832         else
833           if [[ $words[1] = (rm|mv) ]]; then
834             reply=(_complete _files)
835           else
836             reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
837           fi
838         fi'
839   fi
840 # zstyle ':completion:*' completer _complete _correct _approximate
841 # zstyle ':completion:*' expand prefix suffix
842
843 # automatic rehash? Credits go to Frank Terbeck
844 # function my_accept () {
845 #   local buf
846 #   [[ -z ${BUFFER} ]] && zle accept-line && return
847 #   buf=( ${(z)BUFFER}  )
848 #   [[ -z ${commands[${buf[1]}]} ]] && rehash
849 #   zle accept-line
850 # }
851 # zle -N my_accept
852 # bindkey "^M" my_accept
853
854 # command for process lists, the local web server details and host completion
855   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
856
857 # caching
858   [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
859                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
860
861 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
862   if is42 ; then
863     [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
864     [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
865   else
866     _ssh_hosts=()
867     _etc_hosts=()
868   fi
869   hosts=(
870       `hostname`
871       "$_ssh_hosts[@]"
872       "$_etc_hosts[@]"
873       grml.org
874       localhost
875   )
876   zstyle ':completion:*:hosts' hosts $hosts
877 #  zstyle '*' hosts $hosts
878
879 # specify your logins:
880 # my_accounts=(
881 #  {grml,grml1}@foo.invalid
882 #  grml-devel@bar.invalid
883 # )
884 # other_accounts=(
885 #  {fred,root}@foo.invalid
886 #  vera@bar.invalid
887 # )
888 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
889 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
890
891 # specify specific port/service settings:
892 #  telnet_users_hosts_ports=(
893 #    user1@host1:
894 #    user2@host2:
895 #    @mail-server:{smtp,pop3}
896 #    @news-server:nntp
897 #    @proxy-server:8000
898 #  )
899 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
900
901 # use generic completion system for programs not yet defined:
902   compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
903
904 # see upgrade function in this file
905   compdef _hosts upgrade
906 }
907 # }}}
908
909 # {{{ grmlstuff
910 grmlstuff() {
911 # people should use 'grml-x'!
912   function startx() {
913     if [ -e /etc/X11/xorg.conf ] ; then
914        [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
915     else
916       echo "Please use the script \"grml-x\" for starting the X Window System
917 because there does not exist /etc/X11/xorg.conf yet.
918 If you want to use startx anyway please call \"/usr/bin/startx\"."
919       return -1
920     fi
921   }
922
923   function xinit() {
924     if [ -e /etc/X11/xorg.conf ] ; then
925        [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
926     else
927       echo "Please use the script \"grml-x\" for starting the X Window System.
928 because there does not exist /etc/X11/xorg.conf yet.
929 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
930       return -1
931     fi
932   }
933
934   if [ -x /usr/sbin/915resolution ] ; then
935      alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
936   fi
937
938   alias grml-version='cat /etc/grml_version'
939
940   if [ -x /usr/sbin/rebuildfstab ] ; then
941      alias grml-rebuildfstab='rebuildfstab -v -r -config'
942   fi
943 }
944 # }}}
945
946 # {{{ now run the functions
947   isgrml && checkhome
948   is4    && isgrml    && grmlstuff
949   is4    && grmlcomp
950 # }}}
951
952 # {{{ keephack
953   [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
954 # }}}
955
956 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
957 # You use it as follows:
958 # $ NTREF=/reference/file
959 # $ ls -l *(e:nt:)
960 # This lists all the files in the current directory newer than the reference file.
961 # You can also specify the reference file inline; note quotes:
962 # $ ls -l *(e:'nt ~/.zshenv':)
963   is4 && nt() {
964     if [[ -n $1 ]]; then
965       local NTREF=${~1}
966     fi
967     [[ $REPLY -nt $NTREF ]]
968   }
969 # }}}
970
971 # shell functions {{{
972   setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
973   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
974   reload () {
975    if [[ "$#*" -eq 0 ]]; then
976       [ -r ~/.zshrc ] && . ~/.zshrc
977    else
978       local fn
979       for fn in "$@"; do
980           unfunction $fn
981           autoload -U $fn
982       done
983    fi
984   }
985   compdef _functions reload freload
986
987   # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
988   sll() {
989     [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
990     for i in "$@" ; do
991       file=$i
992       while [ -h "$file" ] ; do
993         ls -l $file
994         file=$(readlink "$file")
995       done
996     done
997   }
998
999   # fast manual access
1000   if type -p qma &>/dev/null ; then
1001      manzsh()  { qma zshall "$1" }
1002      compdef _man qma
1003   else
1004      manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1005      # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
1006      # manzsh()  { man zshall | $MYLESS -p $1 ; }
1007   fi
1008
1009   if [ -x /usr/bin/most ] ; then
1010   # use "dchange <package-name>" to view Debian's changelog of the package:
1011     dchange() {
1012       if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1013          most /usr/share/doc/${1}/changelog.Debian.gz
1014       else
1015          if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1016             most /usr/share/doc/${1}/changelog.gz
1017          else
1018             echo "No changelog for package $1 found, sorry."
1019             return 1
1020          fi
1021       fi
1022     }
1023     _dchange() { _files -W /usr/share/doc -/ }
1024     compdef _dchange dchange
1025   
1026   # use "uchange <package-name>" to view upstream's changelog of the package:
1027     uchange() {
1028       if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1029          most /usr/share/doc/${1}/changelog.gz
1030       else
1031          echo "No changelog for package $1 found, sorry."
1032          return 1
1033       fi
1034     }
1035     _uchange() { _files -W /usr/share/doc -/ }
1036     compdef _uchange uchange
1037   fi
1038
1039 # zsh profiling
1040   profile () {
1041       ZSH_PROFILE_RC=1 $SHELL "$@"
1042   }
1043
1044 # edit alias via zle:
1045   edalias() {
1046     [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1047   }
1048   compdef _aliases edalias
1049
1050 # edit function via zle:
1051   edfunc() {
1052     [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1053   }
1054   compdef _functions edfunc
1055
1056 # use it e.g. via 'Restart apache2'
1057  if [ -d /etc/init.d ] ; then
1058   for i in Start Restart Stop Force-Reload Reload ; do
1059     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1060   done
1061   # now the completion for this:
1062   compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1063  fi
1064
1065 # provide useful information on globbing
1066   H-Glob() {
1067   echo -e "
1068       /      directories
1069       .      plain files
1070       @      symbolic links
1071       =      sockets
1072       p      named pipes (FIFOs)
1073       *      executable plain files (0100)
1074       %      device files (character or block special)
1075       %b     block special files
1076       %c     character special files
1077       r      owner-readable files (0400)
1078       w      owner-writable files (0200)
1079       x      owner-executable files (0100)
1080       A      group-readable files (0040)
1081       I      group-writable files (0020)
1082       E      group-executable files (0010)
1083       R      world-readable files (0004)
1084       W      world-writable files (0002)
1085       X      world-executable files (0001)
1086       s      setuid files (04000)
1087       S      setgid files (02000)
1088       t      files with the sticky bit (01000)
1089
1090    print *(m-1)          # Files modified up to a day ago
1091    print *(a1)           # Files accessed a day ago
1092    print *(@)            # Just symlinks
1093    print *(Lk+50)        # Files bigger than 50 kilobytes
1094    print *(Lk-50)        # Files smaller than 50 kilobytes
1095    print **/*.c          # All *.c files recursively starting in \$PWD
1096    print **/*.c~file.c   # Same as above, but excluding 'file.c'
1097    print (foo|bar).*     # Files starting with 'foo' or 'bar'
1098    print *~*.*           # All Files that do not contain a dot
1099    chmod 644 *(.^x)      # make all plain non-executable files publically readable
1100    print -l *(.c|.h)     # Lists *.c and *.h
1101    print **/*(g:users:)  # Recursively match all files that are owned by group 'users'
1102    echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1103   }
1104   alias help-zshglob=H-Glob
1105
1106   type -p qma &>/dev/null && alias ?='qma zshall'
1107
1108   # grep for running process, like: 'any vim'
1109   any() {
1110   if [ -z "$1" ] ; then
1111      echo "any - grep for process(es) by keyword" >&2
1112      echo "Usage: any <keyword>" >&2 ; return 1
1113   else
1114      local STRING=$1
1115      local LENGTH=$(expr length $STRING)
1116      local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1117      local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1118      ps xauwww| grep "[$FIRSCHAR]$REST"
1119   fi
1120   }
1121
1122   # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1123   # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1124   [ -r /proc/1/maps ] && deswap() {
1125      print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1126      cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/')  > /dev/null
1127      print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1128   }
1129
1130   # print hex value of a number
1131   hex() {
1132     [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1133   }
1134
1135   # calculate (or eval at all ;-)) with perl => p[erl-]eval
1136   # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1137   peval() {
1138     [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1139     perl -e "print eval($CALC),\"\n\";"
1140   }
1141   functions peval &>/dev/null && alias calc=peval
1142
1143   # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1144   # bash() {
1145   #  NO_SWITCH="yes" command bash "$@"
1146   # }
1147   # restart () {
1148   #  exec $SHELL $SHELL_ARGS "$@"
1149   # }
1150
1151 # }}}
1152
1153 # log out? set timeout in seconds {{{
1154 # TMOUT=1800
1155 # do not log out in some specific terminals:
1156 #  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1157 #    unset TMOUT
1158 #  fi
1159 # }}}
1160
1161 # {{{ make sure our environment is clean regarding colors
1162   for color in BLUE RED GREEN CYAN WHITE ; unset $color
1163 # }}}
1164
1165 # source another config file if present {{{
1166   if [ -r /etc/zsh/zshrc.local ]; then
1167    source /etc/zsh/zshrc.local
1168   fi
1169 # }}}
1170
1171 # "persistent history" {{{
1172 # just write important commands you always need to ~/.important_commands
1173   if [ -r ~/.important_commands ] ; then
1174      fc -R ~/.important_commands
1175   fi
1176 # }}}
1177
1178 ## END OF FILE #################################################################
1179 # vim:foldmethod=marker expandtab