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