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