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