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