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