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