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