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