* /etc/zsh/zshrc: added some more checks so the config works
[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 Okt 15 23:20:08 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 # command for process lists, the local web server details and host completion
582   hosts=(`hostname` grml.org)
583   zstyle '*' hosts $hosts
584   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
585
586 # caching
587   [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
588                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
589
590 # use ~/.ssh/known_hosts for completion [does not work with hashing of new ssh versions anymore]
591   if [ -f "$HOME/.ssh/known_hosts" ] ; then
592     hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*})
593     zstyle ':completion:*:hosts' hosts $hosts
594   fi
595
596 # use generic completion system for programs not yet defined:
597   compdef _gnu_generic tail head feh cp mv gpg df stow uname ipacsum fetchipac
598
599 # see upgrade function in this file
600   compdef _hosts upgrade
601 }
602 # }}}
603
604 # {{{ grmlstuff
605 grmlstuff() {
606 # people should use 'grml-x'!
607   function startx() {
608     if [ -e /etc/X11/xorg.conf ] ; then
609        [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
610     else
611       echo "Please use the script \"grml-x\" for starting the X Window System
612 because there does not exist /etc/X11/xorg.conf yet.
613 If you want to use startx anyway please call \"/usr/bin/startx\"."
614       return -1
615     fi
616   }
617
618   function xinit() {
619     if [ -e /etc/X11/xorg.conf ] ; then
620        [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
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 xinit anyway please call \"/usr/bin/xinit\"."
625       return -1
626     fi
627   }
628
629   if [ -x /usr/sbin/915resolution ] ; then
630      alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
631   fi
632
633   alias grml-version='cat /etc/grml_version'
634
635   if [ -x /usr/sbin/rebuildfstab ] ; then
636      local fstabuser=$(getent passwd 1000 | cut -d: -f1)
637      alias grml-rebuildfstab="rebuildfstab -v -r -u $fstabuser -g $fstabuser"
638   fi
639 }
640 # }}}
641
642 # {{{ now run the functions
643   isgrml && checkhome
644   is4    && isgrml    && grmlstuff
645   is4    && grmlcomp
646 # }}}
647
648 # {{{ keephack
649   [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
650 # }}}
651
652 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
653 # You use it as follows:
654 # $ NTREF=/reference/file
655 # $ ls -l *(e:nt:)
656 # This lists all the files in the current directory newer than the reference file.
657 # You can also specify the reference file inline; note quotes:
658 # $ ls -l *(e:'nt ~/.zshenv':)
659   is4 && nt() {
660     if [[ -n $1 ]]; then
661       local NTREF=${~1}
662     fi
663     [[ $REPLY -nt $NTREF ]]
664   }
665 # }}}
666
667 # shell functions {{{
668   setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
669   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
670   manzsh()  {  /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
671 #  manzsh()  { man zshall | $MYLESS -p $1 ; }
672 #  manzsh() {  /usr/bin/man zshall |  most +/"$1" ; }
673
674 # use "dchange <package-name>" to view Debian's changelog of the package:
675   dchange() { most /usr/share/doc/${1}/changelog.Debian.gz ; }
676   _dchange() { _files -W /usr/share/doc -/ }
677   compdef _dchange dchange
678
679 # use "uchange <package-name>" to view upstream's changelog of the package:
680   uchange() { most /usr/share/doc/${1}/changelog.gz ; }
681   _uchange() { _files -W /usr/share/doc -/ }
682   compdef _uchange uchange
683
684 # edit alias via zle:
685   edalias() {
686     [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
687   }
688   compdef _aliases edalias
689
690 # edit function via zle:
691   edfun() {
692     [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
693   }
694   compdef _functions edfun
695
696 # use it e.g. via 'Restart apache2'
697  if [ -d /etc/init.d ] ; then
698   for i in Start Restart Stop Reload ; do
699     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} $2 ; }"
700   done
701 # now the completion for this:
702   compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Reload
703  fi
704 # }}}
705
706 # source another config file if present {{{
707   if [ -r /etc/zsh/zshrc.local ]; then
708    source /etc/zsh/zshrc.local
709   fi
710 # }}}
711
712 # "persistent history" {{{
713 # just write important commands you always need to ~/.important_commands
714   if [ -r ~/.important_commands ] ; then
715      fc -R ~/.important_commands
716   fi
717 # }}}
718
719 ## END OF FILE #################################################################
720 # vim:foldmethod=marker