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