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