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