* Fix typo in /etc/zsh/zshrc.
[grml-etc-core.git] / etc / zsh / zshrc
1 # Filename:      zshrc
2 # Purpose:       config file for zsh (z shell)
3 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports:   see http://grml.org/bugs/
5 # License:       This file is licensed under the GPL v2.
6 # Latest change: Sam Okt 21 16:20:30 CEST 2006 [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 # {{{ check for version/system
16 # check for versions (compatibility reasons)
17   is4(){
18     if [[ $ZSH_VERSION == 4.* ]]; then
19         return 0
20     else
21         return 1
22     fi
23   }
24
25 # current release
26   is42(){
27     if [[ $ZSH_VERSION == 4.<2->* ]]; then
28         return 0
29     else
30         return 1
31     fi
32   }
33
34 # grml specific stuff
35   isgrml(){
36     if [ -f /etc/grml_version ] ; then
37         return 0
38     else
39         return 1
40     fi
41   }
42
43   isgrmlcd(){
44     if [ -f /etc/grml_cd ] ; then
45         return 0
46     else
47         return 1
48     fi
49   }
50
51 # check for user, if not running as root set $SUDO to sudo
52  (( EUID != 0 )) && SUDO='sudo' || SUDO=''
53
54 # change directory to home on first invocation of zsh
55 # important for rungetty -> autologin
56 # Thanks go to Bart Schaefer!
57   isgrml && checkhome() {
58   if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
59      export ALREADY_DID_CD_HOME=$HOME
60      cd
61   fi
62   }
63 # }}}
64
65 # {{{ set some variables
66   [[ -z "$EDITOR" ]] && export EDITOR='vim'
67   [[ -z "$SHELL"  ]] && export SHELL='/bin/zsh'
68   [[ -z "$MAIL"   ]] && export MAIL="/var/mail/$USER"
69   [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
70   [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
71
72 # Search path for the cd comman
73 #  cdpath=(.. ~)
74
75 # Support our own site-functions
76   [ -d /etc/zsh/site-functions ] && export FPATH=/etc/zsh/site-functions:$FPATH
77
78 # automatically remove duplicates from these arrays
79   typeset -U path cdpath fpath manpath
80 # }}}
81
82 # {{{ keybindings
83  if [[ "$TERM" != emacs ]]; then
84   [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
85   [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
86   [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
87   [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
88   [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
89   [[ -z "$terminfo[kend]"  ]] || bindkey -M vicmd "$terminfo[kend]"  vi-end-of-line
90   [[ -z "$terminfo[cuu1]"  ]] || bindkey -M viins "$terminfo[cuu1]"  vi-up-line-or-history
91   [[ -z "$terminfo[cuf1]"  ]] || bindkey -M viins "$terminfo[cuf1]"  vi-forward-char
92   [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
93   [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
94   [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
95   [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
96   # ncurses stuff:
97   [[ "$terminfo[kcuu1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
98   [[ "$terminfo[kcud1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
99   [[ "$terminfo[kcuf1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
100   [[ "$terminfo[kcub1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
101   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
102   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}"  end-of-line
103   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
104   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
105 fi
106
107 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
108 # use emacs style per default
109   bindkey -e
110 # use vi style:
111 # bindkey -v
112
113 #if [[ "$TERM" == screen ]]; then
114   bindkey '\e[1~' beginning-of-line       # home
115   bindkey '\e[4~' end-of-line             # end
116   bindkey "^[[A"  up-line-or-search       # cursor up
117   bindkey "^[[B"  down-line-or-search     # <ESC>-
118   bindkey '^x'    history-beginning-search-backward # alternative ways of searching the shell history
119 # bindkey -s '^L' "|less\n"             # ctrl-L pipes to less
120 # bindkey -s '^B' " &\n"                # ctrl-B runs it in the background
121 # if terminal type is set to 'rxvt':
122   bindkey '\e[7~' beginning-of-line       # home
123   bindkey '\e[8~' end-of-line             # end
124 #fi
125
126 #  bindkey '\eq' push-line-or-edit
127 # }}}
128
129 # {{{ autoloading
130   autoload -U zmv    # who needs mmv or rename?
131   autoload history-search-end
132
133   # we don't want to quote/espace URLs on our own...
134   # avoid 'url-quote-magic: function definition file not found' on some older boxes
135   if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] ; then
136      autoload -U url-quote-magic && zle -N self-insert url-quote-magic
137   else
138      print 'Notice: no url-quote-magic available :('
139   fi
140
141   alias run-help >&/dev/null && unalias run-help
142   autoload run-help # use via 'esc-h'
143
144 # completion system
145   is42 && if autoload -U compinit && [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Completion/compinit" ] ; then
146     compinit
147    else
148      print 'Notice: no compinit available :('
149      function zstyle { }
150      function compdef { }
151   fi
152   is4 && autoload -U zed                  # use ZLE editor to edit a file or function
153
154   is4 && zmodload -i zsh/complist
155   is4 && zmodload -i zsh/deltochar
156   is4 && zmodload -i zsh/mathfunc
157 # autoload zsh modules when they are referenced
158   is4 && zmodload -a zsh/stat stat
159   is4 && zmodload -a zsh/zpty zpty
160   is4 && zmodload -a zsh/zprof zprof
161   is4 && zmodload -ap zsh/mapfile mapfile
162
163   is4 && autoload -U insert-files && \
164   zle -N insert-files && \
165   bindkey "^Xf" insert-files # C-x-f
166
167   bindkey ' '   magic-space    # also do history expansion on space
168   bindkey '\ei' menu-complete  # menu completion via esc-i
169
170 # press esc-e for editing command line in $EDITOR or $VISUAL
171   is4 && autoload -U edit-command-line && \
172   zle -N edit-command-line && \
173   bindkey '\ee' edit-command-line
174
175 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
176   _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
177   bindkey '\C-ed' _bkdate
178   zle -N _bkdate
179
180 # press esc-m for inserting last typed word again (thanks to caphuso!)
181   insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
182   zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
183
184 # set command prediction from history, see 'man 1 zshcontrib'
185 #  is4 && autoload -U predict-on && \
186 #  zle -N predict-on         && \
187 #  zle -N predict-off        && \
188 #  bindkey "^X^Z" predict-on && \
189 #  bindkey "^Z" predict-off
190
191 # put job into foreground via ctrl-z:
192   bindkey -s '^z' "fg\n"
193
194 # press ctrl-q to quote line:
195 #  mquote () {
196 #        zle beginning-of-line
197 #        zle forward-word
198 #        # RBUFFER="'$RBUFFER'"
199 #        RBUFFER=${(q)RBUFFER}
200 #        zle end-of-line
201 #  }
202 #  zle -N mquote && bindkey '^q' mquote
203
204 # run command line as user root via sudo:
205   _sudo-command-line() {
206     [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
207   }
208   zle -N sudo-command-line _sudo-command-line
209   bindkey "^Os" sudo-command-line
210 # }}}
211
212 # {{{ set some important options
213   umask 022
214
215 # history:
216   setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
217   is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
218   setopt extended_history     # save each command's beginning timestamp and the duration to the history file
219   is4 && setopt histignorealldups # If  a  new  command  line being added to the history
220                               # list duplicates an older one, the older command is removed from the list
221   setopt histignorespace      # remove command lines from the history list when
222                               # the first character on the line is a space
223 #  setopt histallowclobber    # add `|' to output redirections in the history
224 #  setopt NO_clobber          # warning if file exists ('cat /dev/null > ~/.zshrc')
225   setopt auto_cd              # if a command is issued that can't be executed as a normal command,
226                               # and the command is the name of a directory, perform the cd command to that directory
227   setopt extended_glob        # in order to use #, ~ and ^ for filename generation
228                               # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
229                               # -> searches for word not in compressed files
230                               # don't forget to quote '^', '~' and '#'!
231   setopt notify               # report the status of backgrounds jobs immediately
232   setopt hash_list_all        # Whenever a command completion is attempted, make sure \
233                               # the entire command path is hashed first.
234   setopt completeinword       # not just at the end
235 # setopt nocheckjobs          # don't warn me about bg processes when exiting
236   setopt nohup                # and don't kill them, either
237 # setopt printexitvalue       # alert me if something failed
238 # setopt dvorak               # with spelling correction, assume dvorak kb
239   setopt auto_pushd           # make cd push the old directory onto the directory stack.
240   setopt nonomatch            # try to avoid the 'zsh: no matches found...'
241   setopt nobeep               # avoid "beep"ing
242
243   MAILCHECK=30       # mailchecks
244   REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 secondes
245   watch=(notme root) # watch for everyone but me and root
246
247 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
248 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
249 #  WORDCHARS=.
250 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
251 #  WORDCHARS='${WORDCHARS:s@/@}'
252
253 # only slash should be considered as a word separator:
254   slash-backward-kill-word() {
255     local WORDCHARS="${WORDCHARS:s@/@}"
256     # zle backward-word
257     zle backward-kill-word
258   }
259   zle -N slash-backward-kill-word
260   bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
261 # }}}
262
263 # {{{ history
264   export ZSHDIR=$HOME/.zsh
265   HISTFILE=$HOME/.zsh_history
266   isgrmlcd && HISTSIZE=500  || HISTSIZE=5000
267   isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
268 # }}}
269
270 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
271   if [ -n "$BATTERY" ] ; then
272      if [ -x =acpi ] ; then
273         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
274         [ -z "$PERCENT" ] && PERCENT='acpi not present'
275         if [ "${PERCENT%%%}" -lt 20 ] ; then
276            PERCENT="warning: ${PERCENT}%"
277         fi
278      fi
279   fi
280 # }}}
281
282 # {{{ set prompt
283   if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] ; then
284      autoload promptinit && promptinit # people should be able to use their favourite prompt
285   else
286      print 'Notice: no prompiinit available :('
287   fi
288   # precmd() => a function which is executed just before each prompt
289   # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
290   # run 'NOPRECMD=1 zsh' to disable the precmd + preexec commands
291   is4 && ! [[ -n "$NOPRECMD" ]] && precmd () {
292       if [ -n "$BATTERY" ] ; then
293         RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
294       else
295         RPROMPT="%(?..:()% ${SCREENTITLE}"
296       fi
297       # adjust title of xterm
298       # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
299       case $TERM in (xterm*|rxvt)
300         print -Pn "\e]0;%n@%m: %~\a"
301         ;;
302       esac
303   }
304
305   # chpwd () => a function which is executed whenever the directory is changed
306
307   # preexec() => a function running before every command
308   is4 && ! [[ -n "$NOPRECMD" ]] && preexec () {
309   # set screen window title if running in a screen
310   # get the name of the program currently running and hostname of local machine
311       local HOSTNAME=$(hostname)
312       if [[ "$HOSTNAME" != grml ]] ; then
313          NAME="@$HOSTNAME"
314       fi
315       if [[ "$TERM" == screen* ]]; then
316 #          local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # dont't use hostname
317           local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
318           echo -ne "\ek$CMD\e\\"
319       fi
320   # set the screen title to "zsh" when sitting at the command prompt:
321       if [[ "$TERM" == screen* ]]; then
322            SCREENTITLE=$'%{\ekzsh\e\\%}'
323       else
324            SCREENTITLE=''
325       fi
326   # adjust title of xterm
327       case $TERM in (xterm*|rxvt)
328         print -Pn "\e]0;%n@%m: $1\a"
329         ;;
330       esac
331   }
332
333   EXITCODE="%(?..%?%1v )"
334   local BLUE="%{\e[1;34m%}"
335   local RED="%{\e[1;31m%}"
336   local GREEN="%{\e[1;32m%}"
337   local CYAN="%{\e[1;36m%}"
338   local WHITE="%{\e[1;37m%}"
339   local NO_COLOUR="%{\e[0m%}"
340   PS2='`%_> '       # secondary prompt, printed when the shell needs more information to complete a command.
341   PS3='?# '         # selection prompt used within a select loop.
342   PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
343
344 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
345   if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
346     debian_chroot=$(cat /etc/debian_chroot)
347   fi
348
349 # don't use colors on dumb terminals (like emacs):
350   if [[ "$TERM" == dumb ]] ; then
351     PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
352   else
353     # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
354     # set variable identifying the chroot you work in (used in the prompt below)
355     if [[ -n "$GRMLPROMPT" ]]; then
356       PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
357 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
358     else
359       if (( EUID != 0 )); then
360         PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
361       else
362         PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
363       fi
364     fi
365   fi
366
367 # if we are inside a grml-chroot set a specific prompt theme
368   if [ -n "$GRML_CHROOT" ] ; then
369      PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
370   fi
371 # }}}
372
373 # {{{ 'hash' some often used directories
374   hash -d deb=/var/cache/apt/archives
375   hash -d doc=/usr/share/doc
376   hash -d linux=/lib/modules/$(command uname -r)/build/
377   hash -d log=/var/log
378   hash -d slog=/var/log/syslog
379   hash -d src=/usr/src
380   hash -d templ=/usr/share/doc/grml-templates
381   hash -d tt=/usr/share/doc/texttools-doc
382   hash -d www=/var/www
383 # }}}
384
385 # {{{ some aliases
386   if [ $UID = 0 ] ; then
387      [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
388   elif [ -r $HOME/.screenrc ] ; then
389      alias screen="/usr/bin/screen -c $HOME/.screenrc"
390   else
391      [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
392   fi
393
394   if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
395      alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
396      alias la='ls -la --color=auto'
397      alias ll='ls -l --color=auto'
398      alias lh='ls -hAl --color=auto'
399      alias l='ls -lF --color=auto'
400   else
401      alias ls='ls -b -CF'
402      alias la='ls -la'
403      alias ll='ls -l'
404      alias lh='ls -hAl'
405      alias l='ls -lF'
406   fi
407
408   alias cp='nocorrect cp'         # no spelling correction on cp
409   alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
410   alias mv='nocorrect mv'         # no spelling correction on mv
411   alias rm='nocorrect rm'         # no spelling correction on rm
412
413   alias rd='rmdir'
414   alias md='mkdir'
415
416   alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
417
418 # truecrypt; use e.g. via 'truec /dev/ice' /mnt/ice' or 'truec -i'
419   if [ -x /usr/sbin/truecrypt ] ; then
420      alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
421   fi
422
423   zsh-help(){print "$bg[white]$fg[black]
424 zsh-help - hints for use of zsh on grml
425 =======================================$reset_color
426
427 Main configuration of zsh happens in /etc/zsh/zshrc (global)
428 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
429 The files are part of the package grml-etc, if you want to
430 use them on a non-grml-system just get the tar.gz from
431 http://grml.org/repos/
432
433 If you want to stay in sync with zsh configuration of grml
434 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
435 your own stuff in \$HOME/.zshrc.local. System wide configuration
436 without touching configuration files of grml can take place
437 in /etc/zsh/zshrc.local.
438
439 If you want to use the configuration of user grml also when
440 running as user root just run 'zshskel' which will source
441 the file /etc/skel/.zshrc.
442
443 For information regarding zsh start at http://grml.org/zsh/
444
445 Take a look at grml's zsh refcard:
446 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
447
448 Check out the main zsh refcard:
449 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
450
451 And of course visit the zsh-lovers:
452 % man zsh-lovers
453
454 You can adjust some options through environment variables when
455 invoking zsh without having to edit configuration files.
456 Basically meant for bash users who are not used to the power of
457 the zsh yet. :)
458
459   \"NOCOR=1    zsh\" => deactivate automatic correction
460   \"NOMENU=1   zsh\" => do not use menu completion (note: use strg-d for completion instead!)
461   \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
462   \"BATTERY=1  zsh\" => activate battery status (via acpi) on right side of prompt
463 $bg[white]$fg[black]
464 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
465 Enjoy your grml system with the zsh!$reset_color"
466 }
467
468 # debian stuff
469   if [ -r /etc/debian_version ] ; then
470     alias acs="apt-cache search"
471     alias acsh="apt-cache show"
472     alias adg="$SUDO apt-get dist-upgrade"
473     alias agi="$SUDO apt-get install"
474     alias ag="$SUDO apt-get upgrade"
475     alias au="$SUDO apt-get update"
476     alias dbp="dpkg-buildpackage"
477     alias ge="grep-excuses"
478
479     isgrmlcd && alias su="sudo su"          # change to user root
480     alias tlog="tail -f /var/log/syslog"    # take a look at the syslog
481     alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
482   fi
483
484 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
485   if [ -L /usr/bin/cdrecord -o ! -x =cdrecord ] ; then
486      if [ -x =wodim ] ; then
487         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
488 See #377109 in the BTS of Debian for more details.
489
490 Please use the wodim binary instead' ; return 1"
491      fi
492   fi
493
494 # }}}
495
496 # {{{ Use hard limits, except for a smaller stack and no core dumps
497   unlimit
498   limit stack 8192
499   limit core 0      # important for a live-cd-system
500   limit -s
501 # }}}
502
503 # {{{ completion stuff
504
505 # Where to look for autoloaded function definitions
506   if [ -d /etc/zsh/completion.d ] ; then
507     local comp=/etc/zsh/completion.d
508     for func in $comp/*(N-.:t); . ${comp}/${func}
509   fi
510
511 # called later (via is4 && grmlcomp)
512 # notice: use 'zstyle' for getting current settings
513 #         press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
514 grmlcomp() {
515 ## completion system
516   zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
517   zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
518   zstyle ':completion:*:correct:*'       insert-unambiguous true             # start menu completion only if it could find no unambiguous initial string
519   zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
520   zstyle ':completion:*:correct:*'       original true                       #
521   zstyle ':completion:*:default'         list-colors ${(s.:.)LS_COLORS}      # activate color-completion(!)
522   zstyle ':completion:*:descriptions'    format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'  # format on completion
523   zstyle ':completion:*:*:cd:*:directory-stack' menu yes select              # complete 'cd -<tab>' with menu
524   zstyle ':completion:*:expand:*'        tag-order all-expansions            # insert all expansions for expand completer
525   zstyle ':completion:*:history-words'   list false                          #
526   zstyle ':completion:*:history-words'   menu yes                            # activate menu
527   zstyle ':completion:*:history-words'   remove-all-dups yes                 # ignore duplicate entries
528   zstyle ':completion:*:history-words'   stop yes                            #
529   zstyle ':completion:*:*:linda:*'       file-patterns '*.deb'               # complete debian packages for command 'linda'
530   zstyle ':completion:*:*:lintian:*'     file-patterns '*.deb'               # complete debian packages for command 'lintian'
531   zstyle ':completion:*'                 matcher-list 'm:{a-z}={A-Z}'        # match uppercase from lowercase
532   zstyle ':completion:*:matches'         group 'yes'                         # separate matches into groups
533   if [[ -z "$NOMENU" ]] ; then
534     zstyle ':completion:*'               menu select=5                       # if there are more than 5 options allow selecting from a menu
535   else
536     setopt no_auto_menu # don't use any menus at all
537   fi
538   zstyle ':completion:*:messages'        format '%d'                         #
539   zstyle ':completion:*:options'         auto-description '%d'               #
540   zstyle ':completion:*:options'         description 'yes'                   # describe options in full
541   zstyle ':completion:*:processes'       command 'ps -au$USER'               # on processes completion complete all user processes
542   zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters        # offer indexes before parameters in subscripts
543   zstyle ':completion:*'                 verbose true                        # provide verbose completion information
544   zstyle ':completion:*:warnings'        format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
545   zstyle ':completion:*:*:zcompile:*'    ignored-patterns '(*~|*.zwc)'       # define files to ignore for zcompile
546   zstyle ':completion:correct:'          prompt 'correct to: %e'             #
547   zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'    # Ignore completion functions for commands you don't have:
548
549 # complete manual by their section
550   zstyle ':completion:*:manuals' separate-sections true
551   zstyle ':completion:*:man:*' menu yes select
552
553 ## correction
554 # run rehash on completion so new installed program are found automatically:
555   _force_rehash() {
556       (( CURRENT == 1 )) && rehash
557          return 1 # Because we didn't really complete anything
558     }
559 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
560   if [[ -n "$NOCOR" ]] ; then
561     zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
562     setopt nocorrect # do not try to correct the spelling if possible
563   else
564 #    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
565     setopt correct  # try to correct the spelling if possible
566     zstyle -e ':completion:*' completer '
567         if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
568           _last_try="$HISTNO$BUFFER$CURSOR"
569           reply=(_complete _match _prefix)
570         else
571           if [[ $words[1] = (rm|mv) ]]; then
572             reply=(_complete)
573           else
574             reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
575           fi
576         fi'
577   fi
578 # zstyle ':completion:*' completer _complete _correct _approximate
579 # zstyle ':completion:*' expand prefix suffix
580
581 # automatic rehash? Credits go to Frank Terbeck
582 # function my_accept () {
583 #   local buf
584 #   [[ -z ${BUFFER} ]] && zle accept-line && return
585 #   buf=( ${(z)BUFFER}  )
586 #   [[ -z ${commands[${buf[1]}]} ]] && rehash
587 #   zle accept-line
588 # }
589 # zle -N my_accept
590 # bindkey "^M" my_accept
591
592 # command for process lists, the local web server details and host completion
593   hosts=(`hostname` grml.org)
594   zstyle '*' hosts $hosts
595   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
596
597 # caching
598   [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
599                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
600
601 # use ~/.ssh/known_hosts for completion [does not work with hashing of new ssh versions anymore]
602   if [ -f "$HOME/.ssh/known_hosts" ] ; then
603     hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*})
604     zstyle ':completion:*:hosts' hosts $hosts
605   fi
606
607 # use generic completion system for programs not yet defined:
608   compdef _gnu_generic tail head feh cp mv gpg df stow uname ipacsum fetchipac
609
610 # see upgrade function in this file
611   compdef _hosts upgrade
612 }
613 # }}}
614
615 # {{{ grmlstuff
616 grmlstuff() {
617 # people should use 'grml-x'!
618   function startx() {
619     if [ -e /etc/X11/xorg.conf ] ; then
620        [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
621     else
622       echo "Please use the script \"grml-x\" for starting the X Window System
623 because there does not exist /etc/X11/xorg.conf yet.
624 If you want to use startx anyway please call \"/usr/bin/startx\"."
625       return -1
626     fi
627   }
628
629   function xinit() {
630     if [ -e /etc/X11/xorg.conf ] ; then
631        [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
632     else
633       echo "Please use the script \"grml-x\" for starting the X Window System.
634 because there does not exist /etc/X11/xorg.conf yet.
635 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
636       return -1
637     fi
638   }
639
640   if [ -x /usr/sbin/915resolution ] ; then
641      alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
642   fi
643
644   alias grml-version='cat /etc/grml_version'
645
646   if [ -x /usr/sbin/rebuildfstab ] ; then
647      local fstabuser=$(getent passwd 1000 | cut -d: -f1)
648      alias grml-rebuildfstab="rebuildfstab -v -r -u $fstabuser -g $fstabuser"
649   fi
650 }
651 # }}}
652
653 # {{{ now run the functions
654   isgrml && checkhome
655   is4    && isgrml    && grmlstuff
656   is4    && grmlcomp
657 # }}}
658
659 # {{{ keephack
660   [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
661 # }}}
662
663 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
664 # You use it as follows:
665 # $ NTREF=/reference/file
666 # $ ls -l *(e:nt:)
667 # This lists all the files in the current directory newer than the reference file.
668 # You can also specify the reference file inline; note quotes:
669 # $ ls -l *(e:'nt ~/.zshenv':)
670   is4 && nt() {
671     if [[ -n $1 ]]; then
672       local NTREF=${~1}
673     fi
674     [[ $REPLY -nt $NTREF ]]
675   }
676 # }}}
677
678 # shell functions {{{
679   setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
680   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
681   manzsh()  {  /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
682 #  manzsh()  { man zshall | $MYLESS -p $1 ; }
683 #  manzsh() {  /usr/bin/man zshall |  most +/"$1" ; }
684
685 # use "dchange <package-name>" to view Debian's changelog of the package:
686   dchange() {
687     if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
688        most /usr/share/doc/${1}/changelog.Debian.gz
689     else
690        if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
691           most /usr/share/doc/${1}/changelog.gz
692        else
693           echo "No changelog for package $1 found, sorry."
694           return 1
695        fi
696     fi
697   }
698   _dchange() { _files -W /usr/share/doc -/ }
699   compdef _dchange dchange
700
701 # use "uchange <package-name>" to view upstream's changelog of the package:
702   uchange() {
703     if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
704        most /usr/share/doc/${1}/changelog.gz
705     else
706        echo "No changelog for package $1 found, sorry."
707        return 1
708     fi
709   _uchange() { _files -W /usr/share/doc -/ }
710   compdef _uchange uchange
711
712 # edit alias via zle:
713   edalias() {
714     [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
715   }
716   compdef _aliases edalias
717
718 # edit function via zle:
719   edfun() {
720     [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
721   }
722   compdef _functions edfun
723
724 # use it e.g. via 'Restart apache2'
725  if [ -d /etc/init.d ] ; then
726   for i in Start Restart Stop Reload ; do
727     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} $2 ; }"
728   done
729 # now the completion for this:
730   compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Reload
731  fi
732 # }}}
733
734 # source another config file if present {{{
735   if [ -r /etc/zsh/zshrc.local ]; then
736    source /etc/zsh/zshrc.local
737   fi
738 # }}}
739
740 # "persistent history" {{{
741 # just write important commands you always need to ~/.important_commands
742   if [ -r ~/.important_commands ] ; then
743      fc -R ~/.important_commands
744   fi
745 # }}}
746
747 ## END OF FILE #################################################################
748 # vim:foldmethod=marker