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