added documentation for the genrefcard.pl tags on top of 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: Mit Jun 20 10:28:28 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-refcard-tag documentation:
16 #   You may notice strange looking comments in the zshrc (and ~/.zshrc as
17 #   well). These are there for a purpose. grml's zsh-refcard can now be
18 #   automatically generated from the contents of the actual comfiguration
19 #   files. However, we need a little extra information on which comments
20 #   and what lines of code to take into account (and for what purpose).
21 #
22 # Here is what they mean:
23 #{{{
24 # List of tags (comment types) used:
25 #   #a#     Next line contains an important alias, that should
26 #           be included in the grml-zsh-refcard.
27 #           (placement tag: @@INSERT-aliases@@)
28 #   #f#     Next line contains the beginning of an important function.
29 #           (placement tag: @@INSERT-functions@@)
30 #   #v#     Next line contains an important variable.
31 #           (placement tag: @@INSERT-variables@@)
32 #   #k#     Next line contains an important keybinding.
33 #           (placement tag: @@INSERT-keybindings@@)
34 #   #d#     Hashed directories list generation:
35 #               start   denotes the start of a list of 'hash -d'
36 #                       definitions.
37 #               end     denotes its end.
38 #           (placement tag: @@INSERT-hasheddirs@@)
39 #   #A#     Abbreviation expansion list generation:
40 #               start   denotes the beginning of abbreviations.
41 #               end     denotes their end.
42 #           Lines within this section that end in '#d .*' provide
43 #           extra documentation to be included in the refcard.
44 #           (placement tag: @@INSERT-abbrev@@)
45 #   #m#     This tag allows you to manually generate refcard entries
46 #           for code lines that are hard/impossible to parse.
47 #               Example:
48 #                   #m# k ESC-h Call the run-help function
49 #               That would add a refcard entry in the keybindings table
50 #               for 'ESC-h' with the given comment.
51 #           So the systax is: #m# <section> <argument> <comment>
52 #   #o#     This tag lets you insert entries to the 'other' hash.
53 #           Generally, this should not be used. It is there for
54 #           things that cannot be done easily in another way.
55 #           (placement tag: @@INSERT-other-foobar@@)
56 #
57 #   All of these tags (except for m and o) take two arguments, the first
58 #   within the tag, the other after the tag:
59 #
60 #   #<tag><section># <comment>
61 #
62 #   Where <section> is really just a number, which are defined by the
63 #   @secmap array on top of 'genrefcard.pl'. The reason for numbers
64 #   instead of names is, that for the reader, the tag should not differ
65 #   much from a regular comment. For zsh, it is a regular comment indeed.
66 #   The numbers have got the following meanings:
67 #         0 -> "default"
68 #         1 -> "system"
69 #         2 -> "user"
70 #         3 -> "debian"
71 #         4 -> "search"
72 #         5 -> "shortcuts"
73 #         6 -> "services"
74 #
75 #   So, the following will add an entrie to the 'functions' table in the
76 #   'system' section, with a (hopefully) descriptive comment:
77 #       #f1# Edit an alias via zle
78 #       edalias() {
79 #
80 #   It will then show up in the @@INSERT-aliases-system@@ replacement tag
81 #   that can be found in 'grml-zsh-refcard.tex.in'.
82 #   If the section number is ommited, the 'default' section is assumed.
83 #   Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
84 #   exactly the same as @@INSERT-aliases-default@@. If you want a list of
85 #   *all* aliases, for example, use @@INSERT-aliases-all@@.
86 #}}}
87 #
88
89
90 # zsh profiling {{{
91 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
92   if [[ -n $ZSH_PROFILE_RC ]] ; then
93      zmodload zsh/zprof
94   fi
95 # }}}
96
97 # locale setup {{{
98   if [ -n "$LANG" ]  ; then
99      export LANG
100   else
101      [ -r /etc/default/locale ] && source /etc/default/locale
102   fi
103   [ -n "$LANG" ]          && export LANG || export LANG="en_US.iso885915"
104   [ -n "$LC_ALL" ]        && export LC_ALL
105   [ -n "$LC_MESSAGES" ]   && export LC_MESSAGES
106
107   [ -r /etc/sysconfig/keyboard ] && source /etc/sysconfig/keyboard
108   [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
109 # }}}
110
111 # check for potentially old files in 'completion.d' {{{
112   setopt extendedglob
113   xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
114   if (( ${#xof} > 0 )) ; then
115     printf '\n -!- INFORMATION\n\n'
116     printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
117     printf ' -!- /etc/zsh/completion.d/.\n\n'
118     printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
119     printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
120     printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
121     printf ' -!- named _* to that directory.\n\n'
122     printf ' -!- If you added functions to completion.d yourself, please consider\n'
123     printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
124     printf ' -!- starting with an underscore are marked for automatic loading\n'
125     printf ' -!- by default (so that is quite convenient).\n\n'
126     printf ' -!- If there are files *not* starting with an underscore from an older\n'
127     printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
128     printf ' -!- Delete the files for example via running:\n\n'
129     printf "      rm ${xof}\n\n"
130     printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
131     printf ' -!- resolve the situation manually.\n\n'
132     BROKEN_COMPLETION_DIR=1
133   fi
134   unset xof
135 # }}}
136
137 # {{{ check for version/system
138 # check for versions (compatibility reasons)
139   if autoload is-at-least && is-at-least 2>/dev/null ; then
140      is4() { is-at-least 4 }
141      is42() { is-at-least 4.2 }
142   else
143     is4(){
144       [[ $ZSH_VERSION == 4.* ]] && return 0
145       return 1
146     }
147     is42(){
148       [[ $ZSH_VERSION == 4.<2->* ]] && return 0
149       return 1
150     }
151   fi
152
153 # grml specific stuff
154 #f1# Checks whether or not you're running grml
155   isgrml(){
156     [ -f /etc/grml_version ] && return 0
157     return 1
158   }
159
160 #f1# Checks whether or not you're running a grml cd
161   isgrmlcd(){
162     [ -f /etc/grml_cd ] && return 0
163     return 1
164   }
165
166   if isgrml ; then
167   #f1# Checks whether or not you're running grml-small
168     isgrmlsmall() {
169     [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
170   }
171   else
172     isgrmlsmall() { return 1 }
173   fi
174
175 #f1# are we running within an utf environment?
176   isutfenv() {
177     case "$LANG $CHARSET $LANGUAGE" in
178       *utf*) return 0 ;;
179       *UTF*) return 0 ;;
180       *)     return 1 ;;
181     esac
182   }
183
184 # check for user, if not running as root set $SUDO to sudo
185  (( EUID != 0 )) && SUDO='sudo' || SUDO=''
186
187   salias() {
188     # creates an alias and precedes the command with
189     # sudo if $EUID is not zero.
190     local only=0 ; local multi=0
191     while [[ ${1} == -* ]] ; do
192       case ${1} in
193         (-o) only=1 ;;
194         (-a) multi=1 ;;
195         (--) shift ; break ;;
196         (-h)
197           printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
198           printf '  -h      shows this help text.\n'
199           printf '  -a      replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
200           printf '          be careful using this option.\n'
201           printf '  -o      only sets an alias if a preceding sudo would be needed.\n'
202           return 0
203           ;;
204         (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
205       esac
206       shift
207     done
208     if (( ${#argv} > 1 )) ; then
209       printf 'Too many arguments %s\n' "${#argv}"
210       return 1
211     fi
212     key="${1%%\=*}" ;  val="${1#*\=}"
213     if (( EUID == 0 )) && (( only == 0 )); then
214       alias -- "${key}=${val}"
215     elif (( EUID > 0 )) ; then
216       (( multi > 0 )) && val="${val// ; / ; sudo }"
217       alias -- "${key}=sudo ${val}"
218     fi
219     return 0
220   }
221
222 # change directory to home on first invocation of zsh
223 # important for rungetty -> autologin
224 # Thanks go to Bart Schaefer!
225   isgrml && checkhome() {
226   if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
227      export ALREADY_DID_CD_HOME=$HOME
228      cd
229   fi
230   }
231 # }}}
232
233 # {{{ set some variables
234   #v#
235   export EDITOR=${EDITOR:-vim}
236   #v#
237   export MAIL=${MAIL:-/var/mail/$USER}
238   # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
239   export SHELL='/bin/zsh'
240   [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
241   [ -x $(which dircolors) ] && eval `dircolors -b`
242
243 # Search path for the cd comman
244 #  cdpath=(.. ~)
245
246 # completion functions go to /etc/zsh/completion.d
247 # function files may be put into /etc/zsh/functions.d, from where they
248 # will be automatically autoloaded.
249   if [ -n "$BROKEN_COMPLETION_DIR" ] ; then
250      print 'Warning: not setting completion directories because broken files have been found.'>&2
251   else
252      [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
253      if [[ -d /etc/zsh/functions.d ]] ; then
254        fpath+=( /etc/zsh/functions.d )
255        for func in /etc/zsh/functions.d/[^_]*[^~] ; do
256          autoload -U ${func:t}
257        done
258      fi
259   fi
260
261 # automatically remove duplicates from these arrays
262   typeset -U path cdpath fpath manpath
263 # }}}
264
265 # {{{ keybindings
266  if [[ "$TERM" != emacs ]]; then
267   [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
268   [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
269   [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
270   [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
271   [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
272   [[ -z "$terminfo[kend]"  ]] || bindkey -M vicmd "$terminfo[kend]"  vi-end-of-line
273   [[ -z "$terminfo[cuu1]"  ]] || bindkey -M viins "$terminfo[cuu1]"  vi-up-line-or-history
274   [[ -z "$terminfo[cuf1]"  ]] || bindkey -M viins "$terminfo[cuf1]"  vi-forward-char
275   [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
276   [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
277   [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
278   [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
279   # ncurses stuff:
280   [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
281   [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
282   [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
283   [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
284   [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
285   [[ "$terminfo[kend]"  == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}"  end-of-line
286   [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
287   [[ "$terminfo[kend]"  == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
288 fi
289
290 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
291 # use emacs style per default:
292   bindkey -e
293 # use vi style:
294 # bindkey -v
295
296 #if [[ "$TERM" == screen ]]; then
297   bindkey '\e[1~' beginning-of-line       # home
298   bindkey '\e[4~' end-of-line             # end
299   bindkey '\e[A'  up-line-or-search       # cursor up
300   bindkey '\e[B'  down-line-or-search     # <ESC>-
301   bindkey '^x'    history-beginning-search-backward # alternative ways of searching the shell history
302 # bindkey -s '^L' "|less\n"             # ctrl-L pipes to less
303 # bindkey -s '^B' " &\n"                # ctrl-B runs it in the background
304 # if terminal type is set to 'rxvt':
305   bindkey '\e[7~' beginning-of-line       # home
306   bindkey '\e[8~' end-of-line             # end
307 #fi
308
309 # insert unicode character
310 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an Â§
311 # See for example http://unicode.org/charts/ for unicode characters code
312   autoload insert-unicode-char
313   zle -N insert-unicode-char
314   #k# Insert Unicode character
315   bindkey '^Xi' insert-unicode-char
316
317 # just type 'cd ...' to get 'cd ../..'
318 #  rationalise-dot() {
319 #  if [[ $LBUFFER = *.. ]]; then
320 #    LBUFFER+=/..
321 #  else
322 #    LBUFFER+=.
323 #  fi
324 #  }
325 #  zle -N rationalise-dot
326 #  bindkey . rationalise-dot
327
328 #  bindkey '\eq' push-line-or-edit
329 # }}}
330
331 # power completion - abbreviation expansion {{{
332 # power completion / abbreviation expansion / buffer expansion
333 # see http://zshwiki.org/home/examples/zleiab for details
334 # less risky than the global aliases but powerful as well
335 # just type the abbreviation key and afterwards ',.' to expand it
336   declare -A abk
337   setopt extendedglob
338   setopt interactivecomments
339   abk=(
340    # key  # value                (#d additional doc string)
341 #A# start
342    '...' '../..'
343    '....' '../../..'
344    'BG' '& exit'
345    'C' '| wc -l'
346    'G' '|& grep --color=auto'
347    'H' '| head'
348    'Hl' ' --help |& less -r'      #d (Display help in pager)
349    'L' '| less'
350    'LL' '|& less -r'
351    'M' '| most'
352    'N' '&>/dev/null'              #d (No Output)
353    'R' '| tr A-z N-za-m'          #d (ROT13)
354    'SL' '| sort | less'
355    'S' '| sort -u'
356    'T' '| tail'
357    'V' '|& vim -'
358 #A# end
359    'hide' "echo -en '\033]50;nil2\007'"
360    'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
361    'small' 'echo -en "\033]50;6x10\007"'
362    'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
363    'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
364    'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
365    'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
366    'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
367    'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
368    'da' 'du -sch'
369    'j' 'jobs -l'
370    'u' 'translate -i'
371    'co' "./configure && make && sudo make install"
372    'CH' "./configure --help"
373    'conkeror' 'firefox -chrome chrome://conkeror/content'
374    'dir' 'ls -lSrah'
375    'lad' $'ls -d .*(/)\n# only show dot-directories'
376    'lsa' $'ls -a .*(.)\n# only show dot-files'
377    'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
378    'lsl' $'ls -l *(@[1,10])\n# only symlinks'
379    'lsx' $'ls -l *(*[1,10])\n# only executables'
380    'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
381    'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
382    'lsd' $'ls -d *(/)\n# only show directories'
383    'lse' $'ls -d *(/^F)\n# only show empty directories'
384    'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
385    'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
386    'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
387    'rw-' 'chmod 600'
388    '600' 'chmod u+rw-x,g-rwx,o-rwx'
389    'rwx' 'chmod u+rwx'
390    '700' 'chmod u+rwx,g-rwx,o-rwx'
391    'r--' 'chmod u+r-wx,g-rwx,o-rwx'
392    '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
393    '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
394    'md' 'mkdir -p '
395    'cmplayer' 'mplayer -vo -fs -zoom fbdev'
396    'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
397    'fblinks' 'links2 -driver fb'
398    'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
399    'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
400    'fori' 'for i ({..}) { }'
401    'cx' 'chmod +x'
402    'e'  'print -l'
403    'se' 'setopt interactivecomments'
404    'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
405    'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
406    'fb3' '=mplayer -vo fbdev -fs  -zoom 1>/dev/null -xy 3'
407    'ci' 'centericq'
408    'D'  'export DISPLAY=:0.0'
409    'mp' 'mplayer -vo xv -fs -zoom'
410   )
411
412   globalias () {
413         local MATCH
414         matched_chars='[.-|_a-zA-Z0-9]#'
415         LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
416         LBUFFER+=${abk[$MATCH]:-$MATCH}
417   }
418
419   zle -N globalias
420   bindkey ",." globalias
421 # }}}
422
423 # {{{ autoloading
424   autoload -U zmv    # who needs mmv or rename?
425   autoload history-search-end
426
427   # we don't want to quote/espace URLs on our own...
428   # if autoload -U url-quote-magic ; then
429   #    zle -N self-insert url-quote-magic
430   #    zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
431   # else
432   #    print 'Notice: no url-quote-magic available :('
433   # fi
434   alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
435
436   #m# k ESC-h Call \kbd{run-help} for the 1st word on the commandline
437   alias run-help >&/dev/null && unalias run-help
438   autoload run-help # use via 'esc-h'
439
440 # completion system
441   if autoload -U compinit && compinit 2>/dev/null ; then
442      compinit 2>/dev/null || print 'Notice: no compinit available :('
443    else
444      print 'Notice: no compinit available :('
445      function zstyle { }
446      function compdef { }
447   fi
448
449   is4 && autoload -U zed # use ZLE editor to edit a file or function
450
451   is4 && for mod in complist deltochar mathfunc ; do
452              zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
453          done
454
455 # autoload zsh modules when they are referenced
456   is4 && for opt mod in a  stat    \
457                         a  zpty    \
458                         ap zprof   \
459                         ap mapfile ; do
460              zmodload -${opt} zsh/${mod} ${mod}
461          done ; unset opt mod
462
463   is4 && autoload -U insert-files && \
464   zle -N insert-files && \
465   #k# Insert files
466   bindkey "^Xf" insert-files # C-x-f
467
468   bindkey ' '   magic-space    # also do history expansion on space
469   #k# Trigger menu-complete
470   bindkey '\ei' menu-complete  # menu completion via esc-i
471
472 # press esc-e for editing command line in $EDITOR or $VISUAL
473   is4 && autoload -U edit-command-line && \
474   zle -N edit-command-line && \
475   #k# Edit the current line in \kbd{\$EDITOR}
476   bindkey '\ee' edit-command-line
477
478 #k# menu selection: pick item but stay in the menu
479   is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
480
481 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
482   _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
483   #k# Insert a timestamp on the commandline (yyyy-mm-dd)
484   bindkey '^Ed' _bkdate
485   zle -N _bkdate
486
487 # press esc-m for inserting last typed word again (thanks to caphuso!)
488   insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
489   zle -N insert-last-typed-word;
490   #k# Insert last typed word
491   bindkey "\em" insert-last-typed-word
492
493 # set command prediction from history, see 'man 1 zshcontrib'
494 #  is4 && autoload -U predict-on && \
495 #  zle -N predict-on         && \
496 #  zle -N predict-off        && \
497 #  bindkey "^X^Z" predict-on && \
498 #  bindkey "^Z" predict-off
499
500 #k# Shortcut for \kbd{fg<enter>}
501   bindkey -s '^z' "fg\n"
502
503 # press ctrl-q to quote line:
504 #  mquote () {
505 #        zle beginning-of-line
506 #        zle forward-word
507 #        # RBUFFER="'$RBUFFER'"
508 #        RBUFFER=${(q)RBUFFER}
509 #        zle end-of-line
510 #  }
511 #  zle -N mquote && bindkey '^q' mquote
512
513 # run command line as user root via sudo:
514   _sudo-command-line() {
515     [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
516   }
517   zle -N sudo-command-line _sudo-command-line
518 #k# Put the current commandline into a \kbd{sudo} call
519   bindkey "^Os" sudo-command-line
520
521 ### jump behind the first word on the cmdline.
522 ### useful to add options.
523   function jump_after_first_word() {
524     local words
525     words=(${(z)BUFFER})
526     if (( ${#words} <= 1 )) ; then
527       CURSOR=${#BUFFER}
528     else
529       CURSOR=${#${words[1]}}
530     fi
531   }
532   zle -N jump_after_first_word
533   bindkey '^x1' jump_after_first_word
534
535 # }}}
536
537 # {{{ set some important options
538 # Please update these tags, if you change the umask settings below.
539 #o# r_umask     002
540 #o# r_umaskstr  rwxrwxr-x
541 #o# umask       022
542 #o# umaskstr    rwxr-xr-x
543   (( EUID != 0 )) && umask 002 || umask 022
544
545 # history:
546   setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
547   is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
548   setopt extended_history     # save each command's beginning timestamp and the duration to the history file
549   is4 && setopt histignorealldups # If  a  new  command  line being added to the history
550                               # list duplicates an older one, the older command is removed from the list
551   setopt histignorespace      # remove command lines from the history list when
552                               # the first character on the line is a space
553 #  setopt histallowclobber    # add `|' to output redirections in the history
554 #  setopt NO_clobber          # warning if file exists ('cat /dev/null > ~/.zshrc')
555   setopt auto_cd              # if a command is issued that can't be executed as a normal command,
556                               # and the command is the name of a directory, perform the cd command to that directory
557   setopt extended_glob        # in order to use #, ~ and ^ for filename generation
558                               # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
559                               # -> searches for word not in compressed files
560                               # don't forget to quote '^', '~' and '#'!
561   setopt notify               # report the status of backgrounds jobs immediately
562   setopt hash_list_all        # Whenever a command completion is attempted, make sure \
563                               # the entire command path is hashed first.
564   setopt completeinword       # not just at the end
565 # setopt nocheckjobs          # don't warn me about bg processes when exiting
566   setopt nohup                # and don't kill them, either
567 # setopt printexitvalue       # alert me if something failed
568 # setopt dvorak               # with spelling correction, assume dvorak kb
569   setopt auto_pushd           # make cd push the old directory onto the directory stack.
570   setopt nonomatch            # try to avoid the 'zsh: no matches found...'
571   setopt nobeep               # avoid "beep"ing
572
573   MAILCHECK=30       # mailchecks
574   REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 secondes
575   watch=(notme root) # watch for everyone but me and root
576
577 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
578 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
579 #  WORDCHARS=.
580 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
581 #  WORDCHARS='${WORDCHARS:s@/@}'
582
583 # only slash should be considered as a word separator:
584   slash-backward-kill-word() {
585     local WORDCHARS="${WORDCHARS:s@/@}"
586     # zle backward-word
587     zle backward-kill-word
588   }
589   zle -N slash-backward-kill-word
590 # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
591 #k# Kill everything in a word up to its last \kbd{/}
592   bindkey '\ev' slash-backward-kill-word
593 # }}}
594
595 # {{{ history
596   export ZSHDIR=$HOME/.zsh
597   #v#
598   HISTFILE=$HOME/.zsh_history
599   isgrmlcd && HISTSIZE=500  || HISTSIZE=5000
600   isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
601 # }}}
602
603 # dirstack handling {{{
604   DIRSTACKSIZE=20
605   if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
606      dirstack=( ${(uf)"$(< ~/.zdirs)"} )
607      # "cd -" won't work after login by just setting $OLDPWD, so
608      [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
609   fi
610   chpwd() {
611     builtin dirs -pl >! ~/.zdirs
612   }
613 # }}}
614
615 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
616   if [ -n "$BATTERY" ] ; then
617      if [ -x $(which acpi) ] ; then
618         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
619         [ -z "$PERCENT" ] && PERCENT='acpi not present'
620         if [ "${PERCENT%%%}" -lt 20 ] ; then
621            PERCENT="warning: ${PERCENT}%"
622         fi
623      fi
624   fi
625 # }}}
626
627 # {{{ set prompt
628   if autoload promptinit && promptinit 2>/dev/null ; then
629      promptinit # people should be able to use their favourite prompt
630   else
631      print 'Notice: no promptinit available :('
632   fi
633
634 # precmd() => a function which is executed just before each prompt
635 # use 'NOPRECMD=1' to disable the precmd + preexec commands
636
637   # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
638
639   # make sure to use right prompt only when not running a command
640   is4 && setopt transient_rprompt
641
642   is4 && [[ -z $NOPRECMD ]] && precmd () {
643       [[ -n $NOPRECMD ]] && return 0
644       # allow manual overwriting of RPROMPT
645       if [[ -n $RPROMPT ]] ; then
646          [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
647          return 0
648       fi
649       # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
650       if [[ -z $DONTSETRPROMPT ]] ; then
651          if [[ -n $BATTERY ]] ; then
652             RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
653             # RPROMPT="${PERCENT}${SCREENTITLE}"
654          else
655             RPROMPT="%(?..:()% ${SCREENTITLE}"
656             # RPROMPT="${SCREENTITLE}"
657          fi
658       fi
659       # adjust title of xterm
660       # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
661       case $TERM in (xterm*|rxvt)
662         print -Pn "\e]0;%n@%m: %~\a"
663         ;;
664       esac
665   }
666
667 # chpwd () => a function which is executed whenever the directory is changed
668
669 # preexec() => a function running before every command
670   is4 && [[ -z $NOPRECMD ]] && preexec () {
671       [[ -n $NOPRECMD ]] && return 0
672   # set hostname if not running on host with name 'grml'
673       local HOSTNAME=$(hostname)
674       if [[ "$HOSTNAME" != grml ]] ; then
675          NAME="@$HOSTNAME"
676       fi
677   # get the name of the program currently running and hostname of local machine
678   # set screen window title if running in a screen
679       if [[ "$TERM" == screen* ]]; then
680          # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # dont't use hostname
681          local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
682          echo -ne "\ek$CMD\e\\"
683       fi
684   # set the screen title to "zsh" when sitting at the command prompt:
685       if [[ "$TERM" == screen* ]]; then
686          SCREENTITLE=$'%{\ekzsh\e\\%}'
687       else
688          SCREENTITLE=''
689       fi
690   # adjust title of xterm
691       case $TERM in (xterm*|rxvt)
692         print -Pn "\e]0;%n@%m: $1\a"
693         ;;
694       esac
695   }
696
697 # set colors
698   if autoload colors && colors 2>/dev/null ; then
699      BLUE="%{${fg[blue]}%}"
700      RED="%{${fg_bold[red]}%}"
701      GREEN="%{${fg[green]}%}"
702      CYAN="%{${fg[cyan]}%}"
703      WHITE="%{${fg[white]}%}"
704      NO_COLOUR="%{${reset_color}%}"
705   else
706      BLUE=$'%{\e[1;34m%}'
707      RED=$'%{\e[1;31m%}'
708      GREEN=$'%{\e[1;32m%}'
709      CYAN=$'%{\e[1;36m%}'
710      WHITE=$'%{\e[1;37m%}'
711      NO_COLOUR=$'%{\e[0m%}'
712   fi
713
714   EXITCODE="%(?..%?%1v )"
715   PS2='`%_> '       # secondary prompt, printed when the shell needs more information to complete a command.
716   PS3='?# '         # selection prompt used within a select loop.
717   PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
718
719   # set variable debian_chroot if running in a chroot with /etc/debian_chroot
720   if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
721     debian_chroot=$(cat /etc/debian_chroot)
722   fi
723
724   # don't use colors on dumb terminals (like emacs):
725   if [[ "$TERM" == dumb ]] ; then
726      PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
727   else
728     # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
729     # set variable identifying the chroot you work in (used in the prompt below)
730     if [[ -n $GRMLPROMPT ]]; then
731       PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
732 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
733     else
734       if (( EUID != 0 )); then
735         PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
736       else
737         PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
738       fi
739     fi
740   fi
741
742   # if we are inside a grml-chroot set a specific prompt theme
743   if [ -n "$GRML_CHROOT" ] ; then
744      PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
745   fi
746 # }}}
747
748 # {{{ 'hash' some often used directories
749   #d# start
750   hash -d deb=/var/cache/apt/archives
751   hash -d doc=/usr/share/doc
752   hash -d linux=/lib/modules/$(command uname -r)/build/
753   hash -d log=/var/log
754   hash -d slog=/var/log/syslog
755   hash -d src=/usr/src
756   hash -d templ=/usr/share/doc/grml-templates
757   hash -d tt=/usr/share/doc/texttools-doc
758   hash -d www=/var/www
759   #d# end
760 # }}}
761
762 # {{{ some aliases
763   if [ $UID = 0 ] ; then
764      [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
765   elif [ -r $HOME/.screenrc ] ; then
766      alias screen="/usr/bin/screen -c $HOME/.screenrc"
767   else
768      [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
769   fi
770
771   # do we have GNU ls with color-support?
772   if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
773      #a1# execute \kbd{@a@}:\quad ls with colors
774      alias ls='ls -b -CF --color=auto'
775      #a1# execute \kbd{@a@}:\quad list all files, with colors
776      alias la='ls -la --color=auto'
777      #a1# long colored list, without dotfiles (@a@)
778      alias ll='ls -l --color=auto'
779      #a1# long colored list, human readable sizes (@a@)
780      alias lh='ls -hAl --color=auto'
781      #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
782      alias l='ls -lF --color=auto'
783   else
784      alias ls='ls -b -CF'
785      alias la='ls -la'
786      alias ll='ls -l'
787      alias lh='ls -hAl'
788      alias l='ls -lF'
789   fi
790
791   alias mdstat='cat /proc/mdstat'
792   alias ...='cd ../../'
793
794   alias cp='nocorrect cp'         # no spelling correction on cp
795   alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
796   alias mv='nocorrect mv'         # no spelling correction on mv
797   alias rm='nocorrect rm'         # no spelling correction on rm
798
799   #a1# Execute \kbd{rmdir}
800   alias rd='rmdir'
801   #a1# Execute \kbd{rmdir}
802   alias md='mkdir'
803
804   # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
805   alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
806   alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
807
808   alias utf2iso='if isutfenv ; then
809    for ENV in `env | grep UTF` ; do
810        eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
811    done
812    fi'
813   alias iso2utf='if isutfenv ; then
814    for ENV in `env | grep '\.iso'` ; do
815        eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
816    done
817    fi'
818
819 # set up software synthesizer via speakup
820   alias swspeak='
821     aumix -w 90 -v 90 -p 90 -m 90
822     if ! [ -r /dev/softsynth ] ; then
823        flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
824        return 1
825     else
826        setopt singlelinezle
827        unsetopt prompt_cr
828        export PS1="%m%# "
829        nice -n -20 speechd-up
830        sleep 2
831        flite -o play -t "Finished setting up software synthesizer"
832     fi
833   '
834
835 # I like clean prompt, so provide simple way to get that
836   alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
837
838 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
839   if [ -x $(which truecrypt) ] ; then
840      if isutfenv ; then
841         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
842      else
843         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
844      fi
845   fi
846
847 #f1# Hints for the use of zsh on grml
848   zsh-help(){print "$bg[white]$fg[black]
849 zsh-help - hints for use of zsh on grml
850 =======================================$reset_color
851
852 Main configuration of zsh happens in /etc/zsh/zshrc (global)
853 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
854 The files are part of the package grml-etc-core, if you want to
855 use them on a non-grml-system just get the tar.gz from
856 http://deb.grml.org/ or get the files from the mercurial
857 repository:
858
859   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
860   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
861
862 If you want to stay in sync with zsh configuration of grml
863 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
864 your own stuff in \$HOME/.zshrc.local. System wide configuration
865 without touching configuration files of grml can take place
866 in /etc/zsh/zshrc.local.
867
868 If you want to use the configuration of user grml also when
869 running as user root just run 'zshskel' which will source
870 the file /etc/skel/.zshrc.
871
872 For information regarding zsh start at http://grml.org/zsh/
873
874 Take a look at grml's zsh refcard:
875 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
876
877 Check out the main zsh refcard:
878 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
879
880 And of course visit the zsh-lovers:
881 % man zsh-lovers
882
883 You can adjust some options through environment variables when
884 invoking zsh without having to edit configuration files.
885 Basically meant for bash users who are not used to the power of
886 the zsh yet. :)
887
888   \"NOCOR=1    zsh\" => deactivate automatic correction
889   \"NOMENU=1   zsh\" => do not use menu completion (note: use strg-d for completion instead!)
890   \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
891   \"BATTERY=1  zsh\" => activate battery status (via acpi) on right side of prompt
892 $bg[white]$fg[black]
893 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
894 Enjoy your grml system with the zsh!$reset_color"
895 }
896
897 # debian stuff
898   if [ -r /etc/debian_version ] ; then
899     #a3# Execute \kbd{apt-cache search}
900     alias acs='apt-cache search'
901     #a3# Execute \kbd{apt-cache show}
902     alias acsh='apt-cache show'
903     #a3# Execute \kbd{apt-cache policy}
904     alias acp='apt-cache policy'
905     #a3# Execute \kbd{apt-get dist-upgrade}
906     salias adg="apt-get dist-upgrade"
907     #a3# Execute \kbd{apt-get install}
908     salias agi="apt-get install"
909     #a3# Execute \kbd{aptitude install}
910     salias ati="aptitude install"
911     #a3# Execute \kbd{apt-get upgrade}
912     salias ag="apt-get upgrade"
913     #a3# Execute \kbd{apt-get update}
914     salias au="apt-get update"
915     #a3# Execute \kbd{aptitude update ; aptitude upgrade}
916     salias -a up="aptitude update ; aptitude upgrade"
917     #a3# Execute \kbd{dpkg-buildpackage}
918     alias dbp='dpkg-buildpackage'
919     #a3# Execute \kbd{grep-excuses}
920     alias ge='grep-excuses'
921
922     # debian upgrade
923     #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
924     upgrade () {
925       if [ -z "$1" ] ; then
926           $SUDO apt-get update
927           $SUDO apt-get -u upgrade
928       else
929           ssh $1 $SUDO apt-get update
930           # ask before the upgrade
931           local dummy
932           ssh $1 $SUDO apt-get --no-act upgrade
933           echo -n 'Process the upgrade?'
934           read -q dummy
935           if [[ $dummy == "y" ]] ; then
936               ssh $1 $SUDO apt-get -u upgrade --yes
937           fi
938       fi
939     }
940
941     isgrmlcd && alias su="sudo -s"          # get a root shell
942     #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
943     alias llog="$PAGER /var/log/syslog"     # take a look at the syslog
944     #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
945     alias tlog="tail -f /var/log/syslog"    # follow the syslog
946     #a1# (Re)-source \kbd{/etc/skel/.zshrc}
947     alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
948   fi
949
950 # sort installed Debian-packages by size
951   if [ -x $(which grep-status) ] ; then
952      #a3# List installed Debian-packages sorted by size
953      alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd "  \n" | sort -rn'
954   fi
955
956 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
957   if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
958      if [ -x $(which wodim) ] ; then
959         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
960 See #377109 in the BTS of Debian for more details.
961
962 Please use the wodim binary instead' ; return 1"
963      fi
964   fi
965
966 # get_tw_cli has been renamed into get_3ware
967   if [ -x $(which get_3ware) ] ; then
968      get_tw_cli() {
969        echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
970        get_3ware
971      }
972   fi
973
974 # I hate lacking backward compability, so provide an alternative therefore
975   if ! [ -x $(which apache2-ssl-certificate) ] ; then
976      apache2-ssl-certificate(){
977
978      print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
979      print 'You might want to take a look at Debian the package ssl-cert as well.'
980      print 'To generate a certificate for use with apache2 follow the instructions:'
981
982      echo '
983
984 export RANDFILE=/dev/random
985 mkdir /etc/apache2/ssl/
986 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
987 chmod 600 /etc/apache2/ssl/apache.pem
988
989 Run "grml-tips ssl-certificate" if you need further instructions.
990 '
991    }
992   fi
993 # }}}
994
995 # {{{ Use hard limits, except for a smaller stack and no core dumps
996   unlimit
997   limit stack 8192
998   isgrmlcd && limit core 0 # important for a live-cd-system
999   limit -s
1000 # }}}
1001
1002 # {{{ completion stuff
1003
1004 # called later (via is4 && grmlcomp)
1005 # notice: use 'zstyle' for getting current settings
1006 #         press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
1007 grmlcomp() {
1008 ## completion system
1009   zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
1010   zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
1011   zstyle ':completion:*:correct:*'       insert-unambiguous true             # start menu completion only if it could find no unambiguous initial string
1012   zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
1013   zstyle ':completion:*:correct:*'       original true                       #
1014   zstyle ':completion:*:default'         list-colors ${(s.:.)LS_COLORS}      # activate color-completion(!)
1015   zstyle ':completion:*:descriptions'    format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'  # format on completion
1016   zstyle ':completion:*:*:cd:*:directory-stack' menu yes select              # complete 'cd -<tab>' with menu
1017   zstyle ':completion:*:expand:*'        tag-order all-expansions            # insert all expansions for expand completer
1018   zstyle ':completion:*:history-words'   list false                          #
1019   zstyle ':completion:*:history-words'   menu yes                            # activate menu
1020   zstyle ':completion:*:history-words'   remove-all-dups yes                 # ignore duplicate entries
1021   zstyle ':completion:*:history-words'   stop yes                            #
1022   zstyle ':completion:*'                 matcher-list 'm:{a-z}={A-Z}'        # match uppercase from lowercase
1023   zstyle ':completion:*:matches'         group 'yes'                         # separate matches into groups
1024   zstyle ':completion:*'                 group-name ''
1025   if [[ -z "$NOMENU" ]] ; then
1026     zstyle ':completion:*'               menu select=5                       # if there are more than 5 options allow selecting from a menu
1027   else
1028     setopt no_auto_menu # don't use any menus at all
1029   fi
1030   zstyle ':completion:*:messages'        format '%d'                         #
1031   zstyle ':completion:*:options'         auto-description '%d'               #
1032   zstyle ':completion:*:options'         description 'yes'                   # describe options in full
1033   zstyle ':completion:*:processes'       command 'ps -au$USER'               # on processes completion complete all user processes
1034   zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters        # offer indexes before parameters in subscripts
1035   zstyle ':completion:*'                 verbose true                        # provide verbose completion information
1036   zstyle ':completion:*:warnings'        format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
1037   zstyle ':completion:*:*:zcompile:*'    ignored-patterns '(*~|*.zwc)'       # define files to ignore for zcompile
1038   zstyle ':completion:correct:'          prompt 'correct to: %e'             #
1039   zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'    # Ignore completion functions for commands you don't have:
1040
1041 # complete manual by their section
1042   zstyle ':completion:*:manuals'    separate-sections true
1043   zstyle ':completion:*:manuals.*'  insert-sections   true
1044   zstyle ':completion:*:man:*'      menu yes select
1045
1046 ## correction
1047 # run rehash on completion so new installed program are found automatically:
1048   _force_rehash() {
1049       (( CURRENT == 1 )) && rehash
1050          return 1 # Because we didn't really complete anything
1051     }
1052 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
1053   if [[ -n "$NOCOR" ]] ; then
1054     zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
1055     setopt nocorrect # do not try to correct the spelling if possible
1056   else
1057 #    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
1058     setopt correct  # try to correct the spelling if possible
1059     zstyle -e ':completion:*' completer '
1060         if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
1061           _last_try="$HISTNO$BUFFER$CURSOR"
1062           reply=(_complete _match _prefix _files)
1063         else
1064           if [[ $words[1] = (rm|mv) ]]; then
1065             reply=(_complete _files)
1066           else
1067             reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
1068           fi
1069         fi'
1070   fi
1071 # zstyle ':completion:*' completer _complete _correct _approximate
1072 # zstyle ':completion:*' expand prefix suffix
1073
1074 # automatic rehash? Credits go to Frank Terbeck
1075 # my_accept() {
1076 #   local buf
1077 #   [[ -z ${BUFFER} ]] && zle accept-line && return
1078 #   buf=( ${(z)BUFFER}  )
1079 #   [[ -z ${commands[${buf[1]}]} ]] && rehash
1080 #   zle accept-line
1081 # }
1082 # zle -N my_accept
1083 # bindkey "^M" my_accept
1084
1085 # command for process lists, the local web server details and host completion
1086   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
1087
1088 # caching
1089   [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
1090                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
1091
1092 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
1093   if is42 ; then
1094     [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
1095     [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
1096   else
1097     _ssh_hosts=()
1098     _etc_hosts=()
1099   fi
1100   hosts=(
1101       `hostname`
1102       "$_ssh_hosts[@]"
1103       "$_etc_hosts[@]"
1104       grml.org
1105       localhost
1106   )
1107   zstyle ':completion:*:hosts' hosts $hosts
1108 #  zstyle '*' hosts $hosts
1109
1110 # specify your logins:
1111 # my_accounts=(
1112 #  {grml,grml1}@foo.invalid
1113 #  grml-devel@bar.invalid
1114 # )
1115 # other_accounts=(
1116 #  {fred,root}@foo.invalid
1117 #  vera@bar.invalid
1118 # )
1119 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
1120 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
1121
1122 # specify specific port/service settings:
1123 #  telnet_users_hosts_ports=(
1124 #    user1@host1:
1125 #    user2@host2:
1126 #    @mail-server:{smtp,pop3}
1127 #    @news-server:nntp
1128 #    @proxy-server:8000
1129 #  )
1130 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
1131
1132 # use generic completion system for programs not yet defined:
1133   compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
1134
1135 # see upgrade function in this file
1136   compdef _hosts upgrade
1137 }
1138 # }}}
1139
1140 # {{{ grmlstuff
1141 grmlstuff() {
1142 # people should use 'grml-x'!
1143   startx() {
1144     if [ -e /etc/X11/xorg.conf ] ; then
1145        [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
1146     else
1147       echo "Please use the script \"grml-x\" for starting the X Window System
1148 because there does not exist /etc/X11/xorg.conf yet.
1149 If you want to use startx anyway please call \"/usr/bin/startx\"."
1150       return -1
1151     fi
1152   }
1153
1154   xinit() {
1155     if [ -e /etc/X11/xorg.conf ] ; then
1156        [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
1157     else
1158       echo "Please use the script \"grml-x\" for starting the X Window System.
1159 because there does not exist /etc/X11/xorg.conf yet.
1160 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
1161       return -1
1162     fi
1163   }
1164
1165   if [ -x $(which 915resolution) ] ; then
1166      alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
1167   fi
1168
1169   #a1# Output version of running grml
1170   alias grml-version='cat /etc/grml_version'
1171
1172   if [ -x $(which rebuildfstab) ] ; then
1173      #a1# Rebuild /etc/fstab
1174      alias grml-rebuildfstab='rebuildfstab -v -r -config'
1175   fi
1176
1177   if [ -x $(which grml-debootstrap) ] ; then
1178      alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
1179   fi
1180 }
1181 # }}}
1182
1183 # {{{ now run the functions
1184   isgrml && checkhome
1185   is4    && isgrml    && grmlstuff
1186   is4    && grmlcomp
1187 # }}}
1188
1189 # {{{ keephack
1190   [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
1191 # }}}
1192
1193 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
1194 # You use it as follows:
1195 # $ NTREF=/reference/file
1196 # $ ls -l *(e:nt:)
1197 # This lists all the files in the current directory newer than the reference file.
1198 # You can also specify the reference file inline; note quotes:
1199 # $ ls -l *(e:'nt ~/.zshenv':)
1200   is4 && nt() {
1201     if [[ -n $1 ]]; then
1202       local NTREF=${~1}
1203     fi
1204     [[ $REPLY -nt $NTREF ]]
1205   }
1206 # }}}
1207
1208 # shell functions {{{
1209   #f1# Provide csh compatibility
1210   setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
1211   #f1# Reload an autoloadable function
1212   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
1213   #f1# Reload zsh setup
1214   reload () {
1215    if [[ "$#*" -eq 0 ]]; then
1216       [ -r ~/.zshrc ] && . ~/.zshrc
1217    else
1218       local fn
1219       for fn in "$@"; do
1220           unfunction $fn
1221           autoload -U $fn
1222       done
1223    fi
1224   }
1225   compdef _functions reload freload
1226
1227   #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1228   sll() {
1229     [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1230     for i in "$@" ; do
1231       file=$i
1232       while [ -h "$file" ] ; do
1233         ls -l $file
1234         file=$(readlink "$file")
1235       done
1236     done
1237   }
1238
1239   # fast manual access
1240   if type -p qma &>/dev/null ; then
1241   #f1# View the zsh manual
1242      manzsh()  { qma zshall "$1" }
1243      compdef _man qma
1244   else
1245      manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1246      # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
1247      # manzsh()  { man zshall | $MYLESS -p $1 ; }
1248   fi
1249
1250   if [ -x $(which most) ] ; then
1251   #f1# View Debian's changelog of a given package
1252     dchange() {
1253       if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1254          most /usr/share/doc/${1}/changelog.Debian.gz
1255       else
1256          if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1257             most /usr/share/doc/${1}/changelog.gz
1258          else
1259             echo "No changelog for package $1 found, sorry."
1260             return 1
1261          fi
1262       fi
1263     }
1264     _dchange() { _files -W /usr/share/doc -/ }
1265     compdef _dchange dchange
1266
1267   #f1# View Debian's NEWS of a given package
1268     dnews() {
1269       if [ -r /usr/share/doc/${1}/NEWS.Debian.gz ] ; then
1270          most /usr/share/doc/${1}/NEWS.Debian.gz
1271       else
1272          if [ -r /usr/share/doc/${1}/NEWS.gz ] ; then
1273             most /usr/share/doc/${1}/NEWS.gz
1274          else
1275             echo "No NEWS file for package $1 found, sorry."
1276             return 1
1277          fi
1278       fi
1279     }
1280     _dnews() { _files -W /usr/share/doc -/ }
1281     compdef _dnews dnews
1282
1283   #f1# View upstream's changelog of a given package
1284     uchange() {
1285       if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1286          most /usr/share/doc/${1}/changelog.gz
1287       else
1288          echo "No changelog for package $1 found, sorry."
1289          return 1
1290       fi
1291     }
1292     _uchange() { _files -W /usr/share/doc -/ }
1293     compdef _uchange uchange
1294   fi
1295
1296 # zsh profiling
1297   profile () {
1298       ZSH_PROFILE_RC=1 $SHELL "$@"
1299   }
1300
1301 #f1# Edit an alias via zle
1302   edalias() {
1303     [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1304   }
1305   compdef _aliases edalias
1306
1307 #f1# Edit a function via zle
1308   edfunc() {
1309     [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1310   }
1311   compdef _functions edfunc
1312
1313 # use it e.g. via 'Restart apache2'
1314 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
1315 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
1316 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
1317 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
1318 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
1319  if [ -d /etc/init.d ] ; then
1320   for i in Start Restart Stop Force-Reload Reload ; do
1321     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1322   done
1323  fi
1324
1325   #f1# Provides useful information on globbing
1326   H-Glob() {
1327   echo -e "
1328       /      directories
1329       .      plain files
1330       @      symbolic links
1331       =      sockets
1332       p      named pipes (FIFOs)
1333       *      executable plain files (0100)
1334       %      device files (character or block special)
1335       %b     block special files
1336       %c     character special files
1337       r      owner-readable files (0400)
1338       w      owner-writable files (0200)
1339       x      owner-executable files (0100)
1340       A      group-readable files (0040)
1341       I      group-writable files (0020)
1342       E      group-executable files (0010)
1343       R      world-readable files (0004)
1344       W      world-writable files (0002)
1345       X      world-executable files (0001)
1346       s      setuid files (04000)
1347       S      setgid files (02000)
1348       t      files with the sticky bit (01000)
1349
1350    print *(m-1)          # Files modified up to a day ago
1351    print *(a1)           # Files accessed a day ago
1352    print *(@)            # Just symlinks
1353    print *(Lk+50)        # Files bigger than 50 kilobytes
1354    print *(Lk-50)        # Files smaller than 50 kilobytes
1355    print **/*.c          # All *.c files recursively starting in \$PWD
1356    print **/*.c~file.c   # Same as above, but excluding 'file.c'
1357    print (foo|bar).*     # Files starting with 'foo' or 'bar'
1358    print *~*.*           # All Files that do not contain a dot
1359    chmod 644 *(.^x)      # make all plain non-executable files publically readable
1360    print -l *(.c|.h)     # Lists *.c and *.h
1361    print **/*(g:users:)  # Recursively match all files that are owned by group 'users'
1362    echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1363   }
1364   alias help-zshglob=H-Glob
1365
1366   type -p qma &>/dev/null && alias ?='qma zshall'
1367
1368   # grep for running process, like: 'any vim'
1369   any() {
1370   if [ -z "$1" ] ; then
1371      echo "any - grep for process(es) by keyword" >&2
1372      echo "Usage: any <keyword>" >&2 ; return 1
1373   else
1374      local STRING=$1
1375      local LENGTH=$(expr length $STRING)
1376      local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1377      local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1378      ps xauwww| grep "[$FIRSCHAR]$REST"
1379   fi
1380   }
1381
1382   # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1383   # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1384   [ -r /proc/1/maps ] && deswap() {
1385      print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1386      cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/')  > /dev/null
1387      print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1388   }
1389
1390   # print hex value of a number
1391   hex() {
1392     [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1393   }
1394
1395   # calculate (or eval at all ;-)) with perl => p[erl-]eval
1396   # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1397   peval() {
1398     [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1399     perl -e "print eval($CALC),\"\n\";"
1400   }
1401   functions peval &>/dev/null && alias calc=peval
1402
1403   # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1404   # certain circumstances, so work around it, no matter which environment we have
1405   brltty() {
1406     if [ -z "$DISPLAY" ] ; then
1407        consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1408        command brltty "$@"
1409     else
1410        command brltty "$@"
1411     fi
1412   }
1413
1414   # just press 'asdf' keys to toggle between dvorak and us keyboard layout
1415   aoeu() {
1416      if [ -n "$XKEYBOARD" -a -n "$KEYTABLE" ] ; then
1417         echo -n "Switching to $KEYTABLE keyboard layout: "
1418         [ -z "$DISPLAY" ] && $SUDO loadkeys $KEYTABLE &>/dev/null || setxkbmap $XKEYBOARD &>/dev/null
1419      else
1420         echo -n 'Switching to us keyboard layout: '
1421         [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
1422      fi
1423      echo 'Done'
1424   }
1425   asdf() {
1426      echo -n 'Switching to dvorak keyboard layout: '
1427      [ -z "$DISPLAY" ] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
1428      echo 'Done'
1429   }
1430   # just press 'asdf' key to toggle from neon layout to us keyboard layout
1431   uiae() {
1432      echo -n 'Switching to us keyboard layout: '
1433      setxkbmap us && echo 'Done' || echo 'Failed'
1434   }
1435
1436   # set up an ipv6 tunnel
1437   ipv6-tunnel() {
1438     case $1 in
1439       start)
1440        if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1441           print 'ipv6 tunnel already set up, nothing to be done.'
1442           print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
1443        else
1444           [ -n "$PUBLIC_IP" ] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
1445                                              awk '/inet addr:/ {print $2}' | tr -d 'addr:')
1446           [ -n "$PUBLIC_IP" ] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
1447           local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
1448           print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
1449           ifconfig sit0 tunnel ::192.88.99.1 up
1450           ifconfig sit1 add "$IPV6ADDR" && print done || print failed
1451        fi
1452        ;;
1453       status)
1454        if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1455           print 'ipv6 tunnel available' ; return 0
1456        else
1457           print 'ipv6 tunnel not available' ; return 1
1458        fi
1459        ;;
1460       stop)
1461        if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1462           print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
1463           ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
1464        else
1465           print 'No ipv6 tunnel found, nothing to be done.' ; return 1
1466        fi
1467        ;;
1468       *)
1469        print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
1470        ;;
1471     esac
1472   }
1473
1474   # run dhclient for wireless device
1475   iwclient() {
1476     salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
1477   }
1478
1479   # spawn a minimally set up ksh - useful if you want to umount /usr/.
1480   minimal-shell() {
1481     exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
1482   }
1483
1484   # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1485   # bash() {
1486   #  NO_SWITCH="yes" command bash "$@"
1487   # }
1488   # restart () {
1489   #  exec $SHELL $SHELL_ARGS "$@"
1490   # }
1491
1492 # }}}
1493
1494 # log out? set timeout in seconds {{{
1495 # TMOUT=1800
1496 # do not log out in some specific terminals:
1497 #  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1498 #    unset TMOUT
1499 #  fi
1500 # }}}
1501
1502 # {{{ make sure our environment is clean regarding colors
1503   for color in BLUE RED GREEN CYAN WHITE ; unset $color
1504 # }}}
1505
1506 # source another config file if present {{{
1507   if [ -r /etc/zsh/zshrc.local ]; then
1508    source /etc/zsh/zshrc.local
1509   fi
1510 # }}}
1511
1512 # "persistent history" {{{
1513 # just write important commands you always need to ~/.important_commands
1514   if [ -r ~/.important_commands ] ; then
1515      fc -R ~/.important_commands
1516   fi
1517 # }}}
1518
1519 ## genrefcard.pl settings {{{
1520 ### example: split funtions-search 8,16,24,32
1521 #@# split functions-search 8
1522 ## }}}
1523
1524 # add variable to be able to check whether the file has been read {{{
1525   ZSHRC_GLOBAL_HAS_BEEN_READ=1
1526 # }}}
1527
1528 ## END OF FILE #################################################################
1529 # vim:foldmethod=marker expandtab