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