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