zshrc: Fixing a stupid typo in the last commit, which totally broke our prompt
[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: Wed Aug 06 23:50:53 CEST 2008 [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 # {{{ check for version/system
96 # check for versions (compatibility reasons)
97 is4(){
98     [[ $ZSH_VERSION == <4->* ]] && return 0
99     return 1
100 }
101
102 is41(){
103     [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0
104     return 1
105 }
106
107 is42(){
108     [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0
109     return 1
110 }
111
112 is43(){
113     [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
114     return 1
115 }
116
117 #f1# Checks whether or not you're running grml
118 isgrml(){
119     [[ -f /etc/grml_version ]] && return 0
120     return 1
121 }
122
123 #f1# Checks whether or not you're running a grml cd
124 isgrmlcd(){
125     [[ -f /etc/grml_cd ]] && return 0
126     return 1
127 }
128
129 if isgrml ; then
130 #f1# Checks whether or not you're running grml-small
131     isgrmlsmall() {
132         [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
133     }
134 else
135     isgrmlsmall() { return 1 }
136 fi
137
138 #f1# are we running within an utf environment?
139 isutfenv() {
140     case "$LANG $CHARSET $LANGUAGE" in
141         *utf*) return 0 ;;
142         *UTF*) return 0 ;;
143         *)     return 1 ;;
144     esac
145 }
146
147 # check for user, if not running as root set $SUDO to sudo
148 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
149
150 # change directory to home on first invocation of zsh
151 # important for rungetty -> autologin
152 # Thanks go to Bart Schaefer!
153 isgrml && checkhome() {
154     if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
155         export ALREADY_DID_CD_HOME=$HOME
156         cd
157     fi
158 }
159
160 # check for zsh v3.1.7+
161
162 if ! [[ ${ZSH_VERSION} == 3.1.<7->*      \
163      || ${ZSH_VERSION} == 3.<2->.<->*    \
164      || ${ZSH_VERSION} == <4->.<->*   ]] ; then
165
166     printf '-!-\n'
167     printf '-!- In this configuration we try to make use of features, that only\n'
168     printf '-!- require version 3.1.7 of the shell; That way this setup can be\n'
169     printf '-!- used with a wide range of zsh versions, while using fairly\n'
170     printf '-!- advanced features in all supported versions.\n'
171     printf '-!-\n'
172     printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION"
173     printf '-!-\n'
174     printf '-!- While this *may* work, it might as well fail.\n'
175     printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n'
176     printf '-!-\n'
177     printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n'
178     printf '-!- If it does today, you'\''ve been lucky.\n'
179     printf '-!-\n'
180     printf '-!- Ye been warned!\n'
181     printf '-!-\n'
182
183     function zstyle() { : }
184 fi
185
186 # }}}
187
188 # utility functions {{{
189 # this function checks if a command exists and returns either true
190 # or false. This avoids using 'which' and 'whence', which will
191 # avoid problems with aliases for which on certain weird systems. :-)
192 check_com() {
193     local -i comonly
194
195     if [[ ${1} == '-c' ]] ; then
196         (( comonly = 1 ))
197         shift
198     else
199         (( comonly = 0 ))
200     fi
201
202     if (( ${#argv} != 1 )) ; then
203         printf 'usage: check_com [-c] <command>\n' >&2
204         return 1
205     fi
206
207     if (( comonly > 0 )) ; then
208         [[ -n ${commands[$1]}  ]] && return 0
209         return 1
210     fi
211
212     if   [[ -n ${commands[$1]}    ]] \
213       || [[ -n ${functions[$1]}   ]] \
214       || [[ -n ${aliases[$1]}     ]] \
215       || [[ -n ${reswords[(r)$1]} ]] ; then
216
217         return 0
218     fi
219
220     return 1
221 }
222
223 # creates an alias and precedes the command with
224 # sudo if $EUID is not zero.
225 salias() {
226     local only=0 ; local multi=0
227     while [[ ${1} == -* ]] ; do
228         case ${1} in
229             (-o) only=1 ;;
230             (-a) multi=1 ;;
231             (--) shift ; break ;;
232             (-h)
233                 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
234                 printf '  -h      shows this help text.\n'
235                 printf '  -a      replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
236                 printf '          be careful using this option.\n'
237                 printf '  -o      only sets an alias if a preceding sudo would be needed.\n'
238                 return 0
239                 ;;
240             (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
241         esac
242         shift
243     done
244
245     if (( ${#argv} > 1 )) ; then
246         printf 'Too many arguments %s\n' "${#argv}"
247         return 1
248     fi
249
250     key="${1%%\=*}" ;  val="${1#*\=}"
251     if (( EUID == 0 )) && (( only == 0 )); then
252         alias -- "${key}=${val}"
253     elif (( EUID > 0 )) ; then
254         (( multi > 0 )) && val="${val// ; / ; sudo }"
255         alias -- "${key}=sudo ${val}"
256     fi
257
258     return 0
259 }
260
261 # a "print -l ${(u)foo}"-workaround for pre-4.2.0 shells
262 # usage: uprint foo
263 #   Where foo is the *name* of the parameter you want printed.
264 #   Note that foo is no typo; $foo would be wrong here!
265 if ! is42 ; then
266     uprint () {
267         local -a u
268         local w
269         local parameter=${1}
270
271         if [[ -z ${parameter} ]] ; then
272             printf 'usage: uprint <parameter>\n'
273             return 1
274         fi
275
276         for w in ${(P)parameter} ; do
277             [[ -z ${(M)u:#${w}} ]] && u=( ${u} ${w} )
278         done
279
280         builtin print -l ${u}
281     }
282 fi
283
284 # Check if we can read given files and source those we can.
285 xsource() {
286     if (( ${#argv} < 1 )) ; then
287         printf 'usage: xsource FILE(s)...\n' >&2
288         return 1
289     fi
290
291     while (( ${#argv} > 0 )) ; do
292         [[ -r ${1} ]] && source ${1}
293         shift
294     done
295     return 0
296 }
297
298 # Check if we can read a given file and 'cat(1)' it.
299 xcat() {
300     if (( ${#argv} != 1 )) ; then
301         printf 'usage: xcat FILE\n' >&2
302         return 1
303     fi
304
305     [[ -r ${1} ]] && cat ${1}
306     return 0
307 }
308
309 # Remove these functions again, they are of use only in these
310 # setup files. This should be called at the end of .zshrc.
311 xunfunction() {
312     local -a funcs
313     funcs=(salias xcat xsource xunfunction zrcautoload)
314
315     for func in $funcs ; do
316         [[ -n ${functions[$func]} ]] \
317             && unfunction $func
318     done
319     return 0
320 }
321
322 # autoload wrapper - use this one instead of autoload directly
323 function zrcautoload() {
324     setopt local_options extended_glob
325     local fdir ffile
326     local -i ffound
327
328     ffile=${1}
329     (( found = 0 ))
330     for fdir in ${fpath} ; do
331         [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 ))
332     done
333
334     (( ffound == 0 )) && return 1
335     if [[ $ZSH_VERSION == 3.1.<6-> || $ZSH_VERSION == <4->* ]] ; then
336         autoload -U ${ffile} || return 1
337     else
338         autoload ${ffile} || return 1
339     fi
340     return 0
341 }
342
343 #}}}
344
345 # Load is-at-least() for more precise version checks {{{
346
347 # Note that this test will *always* fail, if the is-at-least
348 # function could not be marked for autoloading.
349 zrcautoload is-at-least || is-at-least() { return 1 }
350
351 # }}}
352
353 # locale setup {{{
354 if [[ -z "$LANG" ]] ; then
355    xsource "/etc/default/locale"
356 fi
357
358 export LANG=${LANG:-en_US.iso885915}
359 for var in LC_ALL LC_MESSAGES ; do
360     [[ -n ${(P)var} ]] && export $var
361 done
362
363 xsource "/etc/sysconfig/keyboard"
364
365 TZ=$(xcat /etc/timezone)
366 # }}}
367
368 # check for potentially old files in 'completion.d' {{{
369 setopt extendedglob
370 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
371 if (( ${#xof} > 0 )) ; then
372     printf '\n -!- INFORMATION\n\n'
373     printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
374     printf ' -!- /etc/zsh/completion.d/.\n\n'
375     printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
376     printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
377     printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
378     printf ' -!- named _* to that directory.\n\n'
379     printf ' -!- If you added functions to completion.d yourself, please consider\n'
380     printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
381     printf ' -!- starting with an underscore are marked for automatic loading\n'
382     printf ' -!- by default (so that is quite convenient).\n\n'
383     printf ' -!- If there are files *not* starting with an underscore from an older\n'
384     printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
385     printf ' -!- Delete the files for example via running:\n\n'
386     printf "      rm ${xof}\n\n"
387     printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
388     printf ' -!- resolve the situation manually.\n\n'
389     BROKEN_COMPLETION_DIR=1
390 fi
391 unset xof
392 # }}}
393
394 # {{{ set some variables
395 if check_com -c vim ; then
396 #v#
397     export EDITOR=${EDITOR:-vim}
398 else
399     export EDITOR=${EDITOR:-vi}
400 fi
401
402 #v#
403 export PAGER=${PAGER:-less}
404
405 #v#
406 export MAIL=${MAIL:-/var/mail/$USER}
407
408 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
409 export SHELL='/bin/zsh'
410
411 # color setup for ls:
412 check_com -c dircolors && eval $(dircolors -b)
413
414 # set width of man pages to 80 for more convenient reading
415 # export MANWIDTH=${MANWIDTH:-80}
416
417 # Search path for the cd command
418 #  cdpath=(.. ~)
419
420 # completion functions go to /etc/zsh/completion.d
421 # function files may be put into /etc/zsh/functions.d, from where they
422 # will be automatically autoloaded.
423 if [[ -n "$BROKEN_COMPLETION_DIR" ]] ; then
424     print 'Warning: not setting completion directories because broken files have been found.' >&2
425 else
426     [[ -d /etc/zsh/completion.d ]] && fpath=( $fpath /etc/zsh/completion.d )
427     if [[ -d /etc/zsh/functions.d ]] ; then
428         fpath+=( /etc/zsh/functions.d )
429         for func in /etc/zsh/functions.d/[^_]*[^~] ; do
430             zrcautoload -U ${func:t}
431         done
432     fi
433 fi
434
435 # automatically remove duplicates from these arrays
436 typeset -U path cdpath fpath manpath
437 # }}}
438
439 # {{{ keybindings
440 if [[ "$TERM" != emacs ]] ; then
441     [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
442     [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
443     [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
444     [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
445     [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
446     [[ -z "$terminfo[kend]"  ]] || bindkey -M vicmd "$terminfo[kend]"  vi-end-of-line
447     [[ -z "$terminfo[cuu1]"  ]] || bindkey -M viins "$terminfo[cuu1]"  vi-up-line-or-history
448     [[ -z "$terminfo[cuf1]"  ]] || bindkey -M viins "$terminfo[cuf1]"  vi-forward-char
449     [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
450     [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
451     [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
452     [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
453     # ncurses stuff:
454     [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
455     [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
456     [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
457     [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
458     [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
459     [[ "$terminfo[kend]"  == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}"  end-of-line
460     [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
461     [[ "$terminfo[kend]"  == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
462 fi
463
464 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
465 # use emacs style per default:
466 bindkey -e
467 # use vi style:
468 # bindkey -v
469
470 #if [[ "$TERM" == screen ]] ; then
471 bindkey '\e[1~' beginning-of-line       # home
472 bindkey '\e[4~' end-of-line             # end
473 bindkey '\e[A'  up-line-or-search       # cursor up
474 bindkey '\e[B'  down-line-or-search     # <ESC>-
475
476 bindkey '^xp'   history-beginning-search-backward
477 bindkey '^xP'   history-beginning-search-forward
478 # bindkey -s '^L' "|less\n"             # ctrl-L pipes to less
479 # bindkey -s '^B' " &\n"                # ctrl-B runs it in the background
480 # if terminal type is set to 'rxvt':
481 bindkey '\e[7~' beginning-of-line       # home
482 bindkey '\e[8~' end-of-line             # end
483 #fi
484
485 # insert unicode character
486 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an Â§
487 # See for example http://unicode.org/charts/ for unicode characters code
488 zrcautoload insert-unicode-char
489 zle -N insert-unicode-char
490 #k# Insert Unicode character
491 bindkey '^Xi' insert-unicode-char
492
493 # just type 'cd ...' to get 'cd ../..'
494 #  rationalise-dot() {
495 #  if [[ $LBUFFER == *.. ]] ; then
496 #    LBUFFER+=/..
497 #  else
498 #    LBUFFER+=.
499 #  fi
500 #  }
501 #  zle -N rationalise-dot
502 #  bindkey . rationalise-dot
503
504 #  bindkey '\eq' push-line-or-edit
505
506 ## toggle the ,. abbreviation feature on/off
507 # NOABBREVIATION: default abbreviation-state
508 #                 0 - enabled (default)
509 #                 1 - disabled
510 NOABBREVIATION=${NOABBREVIATION:-0}
511
512 grml_toggle_abbrev() {
513     if (( ${NOABBREVIATION} > 0 )) ; then
514         NOABBREVIATION=0
515     else
516         NOABBREVIATION=1
517     fi
518 }
519
520 zle -N grml_toggle_abbrev
521 bindkey '^xA' grml_toggle_abbrev
522
523 # }}}
524
525 # a generic accept-line wrapper {{{
526
527 # This widget can prevent unwanted autocorrections from command-name
528 # to _command-name, rehash automatically on enter and call any number
529 # of builtin and user-defined widgets in different contexts.
530 #
531 # For a broader description, see:
532 # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
533 #
534 # The code is imported from the file 'zsh/functions/accept-line' from
535 # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
536 # distributed under the same terms as zsh itself.
537
538 # A newly added command will may not be found or will cause false
539 # correction attempts, if you got auto-correction set. By setting the
540 # following style, we force accept-line() to rehash, if it cannot
541 # find the first word on the command line in the $command[] hash.
542 zstyle ':acceptline:*' rehash true
543
544 function Accept-Line() {
545     setopt localoptions noksharrays
546     local -a subs
547     local -xi aldone
548     local sub
549
550     zstyle -a ":acceptline:${alcontext}" actions subs
551
552     (( ${#subs} < 1 )) && return 0
553
554     (( aldone = 0 ))
555     for sub in ${subs} ; do
556         [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
557         zle ${sub}
558
559         (( aldone > 0 )) && break
560     done
561 }
562
563 function Accept-Line-getdefault() {
564     local default_action
565
566     zstyle -s ":acceptline:${alcontext}" default_action default_action
567     case ${default_action} in
568         ((accept-line|))
569             printf ".accept-line"
570             ;;
571         (*)
572             printf ${default_action}
573             ;;
574     esac
575 }
576
577 function accept-line() {
578     setopt localoptions noksharrays
579     local -a cmdline
580     local -x alcontext
581     local buf com fname format msg default_action
582
583     alcontext='default'
584     buf="${BUFFER}"
585     cmdline=(${(z)BUFFER})
586     com="${cmdline[1]}"
587     fname="_${com}"
588
589     zstyle -t ":acceptline:${alcontext}" rehash \
590         && [[ -z ${commands[$com]} ]]           \
591         && rehash
592
593     if    [[ -n ${reswords[(r)$com]} ]] \
594        || [[ -n ${aliases[$com]}     ]] \
595        || [[ -n ${functions[$com]}   ]] \
596        || [[ -n ${builtins[$com]}    ]] \
597        || [[ -n ${commands[$com]}    ]] ; then
598
599         # there is something sensible to execute, just do it.
600         alcontext='normal'
601         zle Accept-Line
602
603         default_action=$(Accept-Line-getdefault)
604         zstyle -T ":acceptline:${alcontext}" call_default \
605             && zle ${default_action}
606         return
607     fi
608
609     if    [[ -o correct              ]] \
610        || [[ -o correctall           ]] \
611        && [[ -n ${functions[$fname]} ]] ; then
612
613         # nothing there to execute but there is a function called
614         # _command_name; a completion widget. Makes no sense to
615         # call it on the commandline, but the correct{,all} options
616         # will ask for it nevertheless, so warn the user.
617         if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
618             # Okay, we warned the user before, he called us again,
619             # so have it his way.
620             alcontext='force'
621             zle Accept-Line
622
623             default_action=$(Accept-Line-getdefault)
624             zstyle -T ":acceptline:${alcontext}" call_default \
625                 && zle ${default_action}
626             return
627         fi
628
629         # prepare warning message for the user, configurable via zstyle.
630         zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
631
632         if [[ -z ${msg} ]] ; then
633             msg="%c will not execute and completion %f exists."
634         fi
635
636         zformat -f msg "${msg}" "c:${com}" "f:${fname}"
637
638         zle -M -- "${msg}"
639         return
640     elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
641         # If we are here, the commandline contains something that is not
642         # executable, which is neither subject to _command_name correction
643         # and is not empty. might be a variable assignment
644         alcontext='misc'
645         zle Accept-Line
646
647         default_action=$(Accept-Line-getdefault)
648         zstyle -T ":acceptline:${alcontext}" call_default \
649             && zle ${default_action}
650         return
651     fi
652
653     # If we got this far, the commandline only contains whitespace, or is empty.
654     alcontext='empty'
655     zle Accept-Line
656
657     default_action=$(Accept-Line-getdefault)
658     zstyle -T ":acceptline:${alcontext}" call_default \
659         && zle ${default_action}
660 }
661
662 zle -N accept-line
663 zle -N Accept-Line
664
665 # }}}
666
667 # power completion - abbreviation expansion {{{
668 # power completion / abbreviation expansion / buffer expansion
669 # see http://zshwiki.org/home/examples/zleiab for details
670 # less risky than the global aliases but powerful as well
671 # just type the abbreviation key and afterwards ',.' to expand it
672 declare -A abk
673 setopt extendedglob
674 setopt interactivecomments
675 abk=(
676 # key  # value                (#d additional doc string)
677 #A# start
678     '...' '../..'
679     '....' '../../..'
680     'BG' '& exit'
681     'C' '| wc -l'
682     'G' '|& grep --color=auto'
683     'H' '| head'
684     'Hl' ' --help |& less -r'      #d (Display help in pager)
685     'L' '| less'
686     'LL' '|& less -r'
687     'M' '| most'
688     'N' '&>/dev/null'              #d (No Output)
689     'R' '| tr A-z N-za-m'          #d (ROT13)
690     'SL' '| sort | less'
691     'S' '| sort -u'
692     'T' '| tail'
693     'V' '|& vim -'
694 #A# end
695     'hide' "echo -en '\033]50;nil2\007'"
696     'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
697     'small' 'echo -en "\033]50;6x10\007"'
698     'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
699     'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
700     'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
701     'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
702     'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
703     'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
704     'da' 'du -sch'
705     'j' 'jobs -l'
706     'u' 'translate -i'
707     'co' "./configure && make && sudo make install"
708     'CH' "./configure --help"
709     'conkeror' 'firefox -chrome chrome://conkeror/content'
710     'dir' 'ls -lSrah'
711     'lad' $'ls -d .*(/)\n# only show dot-directories'
712     'lsa' $'ls -a .*(.)\n# only show dot-files'
713     'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
714     'lsl' $'ls -l *(@[1,10])\n# only symlinks'
715     'lsx' $'ls -l *(*[1,10])\n# only executables'
716     'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
717     'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
718     'lsd' $'ls -d *(/)\n# only show directories'
719     'lse' $'ls -d *(/^F)\n# only show empty directories'
720     'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
721     'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
722     'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
723     'rw-' 'chmod 600'
724     '600' 'chmod u+rw-x,g-rwx,o-rwx'
725     'rwx' 'chmod u+rwx'
726     '700' 'chmod u+rwx,g-rwx,o-rwx'
727     'r--' 'chmod u+r-wx,g-rwx,o-rwx'
728     '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
729     '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
730     'md' 'mkdir -p '
731     'cmplayer' 'mplayer -vo -fs -zoom fbdev'
732     'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
733     'fblinks' 'links2 -driver fb'
734     'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
735     'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
736     'fori' 'for i ({..}) { }'
737     'cx' 'chmod +x'
738     'e'  'print -l'
739     'se' 'setopt interactivecomments'
740     'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
741     'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
742     'fb3' '=mplayer -vo fbdev -fs  -zoom 1>/dev/null -xy 3'
743     'ci' 'centericq'
744     'D'  'export DISPLAY=:0.0'
745     'mp' 'mplayer -vo xv -fs -zoom'
746 )
747
748 globalias() {
749     local MATCH
750
751     if (( NOABBREVIATION > 0 )) ; then
752         LBUFFER="${LBUFFER},."
753         return 0
754     fi
755
756     matched_chars='[.-|_a-zA-Z0-9]#'
757     LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
758     LBUFFER+=${abk[$MATCH]:-$MATCH}
759 }
760
761 zle -N globalias
762 bindkey ",." globalias
763 # }}}
764
765 # {{{ autoloading
766 zrcautoload zmv    # who needs mmv or rename?
767 zrcautoload history-search-end
768
769 # we don't want to quote/espace URLs on our own...
770 # if autoload -U url-quote-magic ; then
771 #    zle -N self-insert url-quote-magic
772 #    zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
773 # else
774 #    print 'Notice: no url-quote-magic available :('
775 # fi
776 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
777
778 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
779 alias run-help >&/dev/null && unalias run-help
780 zrcautoload run-help # use via 'esc-h'
781
782 # completion system
783 if zrcautoload compinit && compinit 2>/dev/null ; then
784     compinit 2>/dev/null || print 'Notice: no compinit available :('
785 else
786     print 'Notice: no compinit available :('
787     function zstyle { }
788     function compdef { }
789 fi
790
791 is4 && zrcautoload zed # use ZLE editor to edit a file or function
792
793 is4 && \
794 for mod in complist deltochar mathfunc ; do
795     zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
796 done
797
798 # autoload zsh modules when they are referenced
799 if is4 ; then
800     tmpargs=(
801         a   stat
802         a   zpty
803         ap  zprof
804         ap  mapfile
805     )
806
807     while (( ${#tmpargs} > 0 )) ; do
808         zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
809         shift 2 tmpargs
810     done
811     unset tmpargs
812 fi
813
814 if is4 && zrcautoload insert-files && zle -N insert-files ; then
815     #k# Insert files
816     bindkey "^Xf" insert-files # C-x-f
817 fi
818
819 bindkey ' '   magic-space    # also do history expansion on space
820 #k# Trigger menu-complete
821 bindkey '\ei' menu-complete  # menu completion via esc-i
822
823 # press esc-e for editing command line in $EDITOR or $VISUAL
824 if is4 && zrcautoload edit-command-line && zle -N edit-command-line ; then
825     #k# Edit the current line in \kbd{\$EDITOR}
826     bindkey '\ee' edit-command-line
827 fi
828
829 if is4 && [[ -n ${(k)modules[zsh/complist]} ]] ; then
830     #k# menu selection: pick item but stay in the menu
831     bindkey -M menuselect '\e^M' accept-and-menu-complete
832
833     # use the vi navigation keys (hjkl) besides cursor keys in menu completion
834     #bindkey -M menuselect 'h' vi-backward-char        # left
835     #bindkey -M menuselect 'k' vi-up-line-or-history   # up
836     #bindkey -M menuselect 'l' vi-forward-char         # right
837     #bindkey -M menuselect 'j' vi-down-line-or-history # bottom
838
839     # accept a completion and try to complete again by using menu
840     # completion; very useful with completing directories
841     # by using 'undo' one's got a simple file browser
842     bindkey -M menuselect '^o' accept-and-infer-next-history
843 fi
844
845 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
846 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
847 zle -N _bkdate
848
849 #k# Insert a timestamp on the command line (yyyy-mm-dd)
850 bindkey '^Ed' _bkdate
851
852 # press esc-m for inserting last typed word again (thanks to caphuso!)
853 insert-last-typed-word() { zle insert-last-word -- 0 -1 };
854 zle -N insert-last-typed-word;
855
856 #k# Insert last typed word
857 bindkey "\em" insert-last-typed-word
858
859 # set command prediction from history, see 'man 1 zshcontrib'
860 #  is4 && zrcautoload predict-on && \
861 #  zle -N predict-on         && \
862 #  zle -N predict-off        && \
863 #  bindkey "^X^Z" predict-on && \
864 #  bindkey "^Z" predict-off
865
866 #k# Shortcut for \kbd{fg<enter>}
867 bindkey -s '^z' "fg\n"
868
869 # press ctrl-q to quote line:
870 #  mquote () {
871 #        zle beginning-of-line
872 #        zle forward-word
873 #        # RBUFFER="'$RBUFFER'"
874 #        RBUFFER=${(q)RBUFFER}
875 #        zle end-of-line
876 #  }
877 #  zle -N mquote && bindkey '^q' mquote
878
879 # run command line as user root via sudo:
880 sudo-command-line() {
881     [[ -z $BUFFER ]] && zle up-history
882     [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
883 }
884 zle -N sudo-command-line
885
886 #k# Put the current command line into a \kbd{sudo} call
887 bindkey "^Os" sudo-command-line
888
889 ### jump behind the first word on the cmdline.
890 ### useful to add options.
891 function jump_after_first_word() {
892     local words
893     words=(${(z)BUFFER})
894
895     if (( ${#words} <= 1 )) ; then
896         CURSOR=${#BUFFER}
897     else
898         CURSOR=${#${words[1]}}
899     fi
900 }
901 zle -N jump_after_first_word
902
903 bindkey '^x1' jump_after_first_word
904
905 # }}}
906
907 # {{{ set some important options
908 # Please update these tags, if you change the umask settings below.
909 #o# r_umask     002
910 #o# r_umaskstr  rwxrwxr-x
911 #o# umask       022
912 #o# umaskstr    rwxr-xr-x
913 (( EUID != 0 )) && umask 002 || umask 022
914
915 # history:
916 setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
917 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
918 setopt extended_history     # save each command's beginning timestamp and the duration to the history file
919 is4 && setopt histignorealldups # If  a  new  command  line being added to the history
920                             # list duplicates an older one, the older command is removed from the list
921 setopt histignorespace      # remove command lines from the history list when
922                             # the first character on the line is a space
923 #  setopt histallowclobber    # add `|' to output redirections in the history
924 #  setopt NO_clobber          # warning if file exists ('cat /dev/null > ~/.zshrc')
925 setopt auto_cd              # if a command is issued that can't be executed as a normal command,
926                             # and the command is the name of a directory, perform the cd command to that directory
927 setopt extended_glob        # in order to use #, ~ and ^ for filename generation
928                             # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
929                             # -> searches for word not in compressed files
930                             # don't forget to quote '^', '~' and '#'!
931 setopt longlistjobs         # display PID when suspending processes as well
932 setopt notify               # report the status of backgrounds jobs immediately
933 setopt hash_list_all        # Whenever a command completion is attempted, make sure \
934                             # the entire command path is hashed first.
935 setopt completeinword       # not just at the end
936 # setopt nocheckjobs          # don't warn me about bg processes when exiting
937 setopt nohup                # and don't kill them, either
938 # setopt printexitvalue       # alert me if something failed
939 # setopt dvorak               # with spelling correction, assume dvorak kb
940 setopt auto_pushd           # make cd push the old directory onto the directory stack.
941 setopt nonomatch            # try to avoid the 'zsh: no matches found...'
942 setopt nobeep               # avoid "beep"ing
943 setopt pushd_ignore_dups    # don't push the same dir twice.
944
945 MAILCHECK=30       # mailchecks
946 REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 seconds
947 watch=(notme root) # watch for everyone but me and root
948
949 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
950 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
951 #  WORDCHARS=.
952 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
953 #  WORDCHARS='${WORDCHARS:s@/@}'
954
955 # only slash should be considered as a word separator:
956 slash-backward-kill-word() {
957     local WORDCHARS="${WORDCHARS:s@/@}"
958     # zle backward-word
959     zle backward-kill-word
960 }
961 zle -N slash-backward-kill-word
962
963 #k# Kill everything in a word up to its last \kbd{/}
964 bindkey '\ev' slash-backward-kill-word
965
966 # }}}
967
968 # {{{ history
969
970 ZSHDIR=$HOME/.zsh
971
972 #v#
973 HISTFILE=$HOME/.zsh_history
974 isgrmlcd && HISTSIZE=500  || HISTSIZE=5000
975 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
976
977 # }}}
978
979 # dirstack handling {{{
980
981 DIRSTACKSIZE=${DIRSTACKSIZE:-20}
982 DIRSTACKFILE=${DIRSTACKFILE:-${HOME}/.zdirs}
983
984 if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
985     dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
986     # "cd -" won't work after login by just setting $OLDPWD, so
987     [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
988 fi
989
990 chpwd() {
991     if is42 ; then
992         builtin print -l ${(u)dirstack} >! ${DIRSTACKFILE}
993     else
994         uprint dirstack >! ${DIRSTACKFILE}
995     fi
996 }
997
998 # }}}
999
1000 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
1001 if [[ -n "$BATTERY" ]] ; then
1002     if check_com -c acpi ; then
1003         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
1004         [[ -z "$PERCENT" ]] && PERCENT='acpi not present'
1005
1006         if [[ "${PERCENT%%%}" -lt 20 ]] ; then
1007             PERCENT="warning: ${PERCENT}%"
1008         fi
1009     fi
1010 fi
1011 # }}}
1012
1013 # gather version control information for inclusion in a prompt {{{
1014
1015 # vcs_info() documentation: {{{
1016 #
1017 # The vcs_info () feature can be configured via zstyle:
1018 #   First, the context in which we are working:
1019 #       :vcs_info:<vcs-string>
1020 #   ...where <vcs-string> is one of: git, hg, bzr, svn or svk
1021 #
1022 #   You can of course use ':vcs_info:*' to match all VCSs at once.
1023 #
1024 # There is one special context named 'init', that is in effect as long
1025 # as there was no decision what vcs backend to use.
1026 #
1027 # There are currently two styles, that are looked up:
1028 #   promptformat        - Used in most circumstances.
1029 #   promptactionformat  - Used if a there is a special action going on;
1030 #                         (like an interactive rebase or a merge conflict)
1031 #   enable              - check in the 'init' context. If set to false,
1032 #                         vcs_info() will do nothing.
1033 #
1034 # The default values for these in all contexts are:
1035 #   promptformat        " (%s)-[%b|%a]-"
1036 #   promptactionformat  " (%s)-[%b]-"
1037 #   enable              true
1038 #
1039 # In these formats, the following replacements are done:
1040 #   %s  - The vcs in use (git, hg, svn etc.)
1041 #   %b  - Information about the current branch.
1042 #   %a  - An identifier, that describes the action.
1043 #         Only makes sense in promptactionformat.
1044 #   %R  - base directory of the repository.
1045 #   %r  - repository name
1046 #         If %R is '/foo/bar/repoXY', %r is 'repoXY'.
1047 #
1048 # Not all vcs backends may support all replacements
1049 #
1050 # If you want colors, make sure you enclose the color codes in %{...%}, because
1051 # the string provided by vcs_info() is commonly used for prompts.
1052 #
1053 #   Example: PROMPT='%(?..[%?]-)%3~%$(vcs_info)#'
1054 #
1055 # This *requires* 'setopt prompt_subst'.
1056 # }}}
1057 VCS_INFO_default_action_format=' (%s)-[%b|%a]-'
1058 VCS_INFO_default_format=' (%s)-[%b]-'
1059 VCS_INFO_realpath () { #{{{
1060     # replacing 'readlink -f', which is really not portable.
1061     (( ${+functions[chpwd]} )) && unfunction chpwd
1062     setopt chaselinks
1063     cd $1 2>/dev/null && pwd
1064 }
1065 # }}}
1066 VCS_INFO_git_getaction () { #{{{
1067     local gitaction='' gitdir=${1}
1068     local tmp
1069
1070     for tmp in "${gitdir}/rebase-apply" \
1071                "${gitdir}/rebase"       \
1072                "${gitdir}/../.dotest" ; do
1073         if [[ -d ${tmp} ]] ; then
1074             if   [[ -f "${tmp}/rebasing" ]] ; then
1075                 gitaction="rebase"
1076             elif [[ -f "${tmp}/applying" ]] ; then
1077                 gitaction="am"
1078             else
1079                 gitaction="am/rebase"
1080             fi
1081             print '%s' ${gitaction}
1082             return 0
1083         fi
1084     done
1085
1086     for tmp in "${gitdir}/rebase-merge/interactive" \
1087                "${gitdir}/.dotest-merge/interactive" ; do
1088         if [[ -f "${tmp}" ]] ; then
1089             printf '%s' "rebase-i"
1090             return 0
1091         fi
1092     done
1093
1094     for tmp in "${gitdir}/rebase-merge" \
1095                "${gitdir}/.dotest-merge" ; do
1096         if [[ -d "${tmp}" ]] ; then
1097             printf '%s' "rebase-m"
1098             return 0
1099         fi
1100     done
1101
1102     if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1103         printf '%s' "merge"
1104     else
1105         if [[ -f "${gitdir}/BISECT_LOG" ]] ; then
1106             printf '%s' "bisect"
1107         fi
1108     fi
1109
1110     return 1
1111 }
1112 # }}}
1113 VCS_INFO_git_getbranch () { #{{{
1114     local gitbranch gitdir=${1}
1115     local gitsymref='git symbolic-ref HEAD'
1116
1117     if    [[ -d "${gitdir}/rebase-apply" ]] \
1118        || [[ -d "${gitdir}/rebase" ]]       \
1119        || [[ -d "${gitdir}/../.dotest" ]]   \
1120        || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1121         gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1122
1123     elif   [[ -f "${gitdir}/rebase-merge/interactive" ]] \
1124         || [[ -d "${gitdir}/rebase-merge" ]] ; then
1125         gitbranch="$(< ${gitdir}/rebase-merge/head-name)"
1126
1127     elif   [[ -f "${gitdir}/.dotest-merge/interactive" ]] \
1128         || [[ -d "${gitdir}/.dotest-merge" ]] ; then
1129         gitbranch="$(< ${gitdir}/.dotest-merge/head-name)"
1130
1131     else
1132         gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1133
1134         if [[ $? -ne 0 ]] ; then
1135             gitbranch="$(git describe --exact-match HEAD 2>/dev/null)"
1136
1137             if [[ $? -ne 0 ]] ; then
1138                 gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..."
1139             fi
1140         fi
1141     fi
1142
1143     printf '%s' "${gitbranch##refs/heads/}"
1144 }
1145 # }}}
1146 VCS_INFO_git_get_data () { # {{{
1147     setopt localoptions extendedglob
1148     local gitdir gitbase gitbranch gitaction msg
1149
1150     gitdir="$(git rev-parse --git-dir 2> /dev/null)"
1151
1152     if [[ $? -eq 0 ]] ; then
1153         gitbranch="$(VCS_INFO_git_getbranch ${gitdir})"
1154     fi
1155
1156     if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then
1157         return
1158     fi
1159
1160     gitaction="$(VCS_INFO_git_getaction ${gitdir})"
1161     msg=$(VCS_INFO_format ${gitaction})
1162
1163     gitbase=${PWD%/${$(git rev-parse --show-prefix)%/##}}
1164
1165     zformat -f msg "${msg}" "a:${gitaction}" "b:${gitbranch}" "s:${vcs}" "r:${gitbase:t}" "R:${gitbase}"
1166     printf '%s' ${msg}
1167 }
1168 # }}}
1169 VCS_INFO_hg_get_data () { # {{{
1170     local msg hgbranch hgbase
1171
1172     hgbase=${1}
1173     hgbranch=$(< ${hgbase}/.hg/branch)
1174     msg=$(VCS_INFO_format)
1175     zformat -f msg "${msg}" "a:" "b:${hgbranch}" "s:${vcs}" "r:${hgbase:t}" "R:${hgbase}"
1176     printf '%s' ${msg}
1177 }
1178 # }}}
1179 VCS_INFO_svk_get_data () { # {{{
1180     local msg svkbranch svkbase
1181
1182     svkbase=${1}
1183     svkbranch=${svkbase##*
1184   }
1185     svkbase=${svkbase%%
1186   *}
1187
1188     msg=$(VCS_INFO_format)
1189     zformat -f msg "${msg}" "a:" "b:${svkbranch}" "s:${vcs}" "r:${svkbase:t}" "R:${svkbase}"
1190     printf '%s' ${msg}
1191 }
1192 # }}}
1193 VCS_INFO_svn_get_data () { # {{{
1194     local msg svnbranch svnbase
1195
1196     svnbase="."
1197     while [[ -d "${svnbase}/../.svn" ]]; do
1198         svnbase="${svnbase}/.."
1199     done
1200     svnbase=$(VCS_INFO_realpath ${svnbase})
1201     svnbranch=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }')
1202
1203     msg=$(VCS_INFO_format)
1204     zformat -f msg "${msg}" "a:" "b:${svnbranch}" "s:${vcs}" "r:${svnbase:t}" "R:${svnbase}"
1205     printf '%s' ${msg}
1206 }
1207 # }}}
1208 VCS_INFO_bzr_get_data () { # {{{
1209     local msg bzrbranch bzrbase bzrrevno i j
1210
1211     bzrbase=$(bzr info | sed -rne 's, *branch root: ,,p')
1212     case ${bzrbase} in
1213         .) bzrbase=${PWD} ;;
1214     esac
1215
1216     bzr version-info | while read i j; do
1217         case "${i}" in
1218             revno:)
1219                 bzrrevno=${j} ;;
1220             branch-nick:)
1221                 bzrbranch=${j} ;;
1222         esac
1223     done
1224
1225     msg=$(VCS_INFO_format)
1226     zformat -f msg "${msg}" "a:" "b:${bzrbranch}:${bzrrevno}" "s:${vcs}" "r:${bzrbase:t}" "R:${bzrbase}"
1227     printf '%s' ${msg}
1228 }
1229 # }}}
1230 # VCS_INFO_*_detect () {{{
1231
1232 VCS_INFO_bzr_detect() {
1233     check_com -c bzr || return 1
1234     [[ -d ".bzr" ]] && return 0
1235     return 1
1236 }
1237
1238 VCS_INFO_git_detect() {
1239     check_com -c git && git rev-parse --is-inside-work-tree &> /dev/null && return 0
1240     return 1
1241 }
1242
1243 VCS_INFO_hg_detect() {
1244     local basedir="."
1245
1246     check_com -c hg || return 1
1247     while [[ ! -d ${basedir}/.hg ]]; do
1248         basedir=${basedir}/..
1249         [[ $(VCS_INFO_realpath ${basedir}) = "/" ]] && return 1
1250     done
1251
1252     printf '%s' $(VCS_INFO_realpath ${basedir})
1253     return 0
1254 }
1255
1256 VCS_INFO_svk_detect() {
1257     local output
1258
1259     check_com -c svk || return 1
1260     [[ -f ~/.svk/config ]] || return 1
1261
1262     output=$(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
1263
1264     printf '%s' ${output}
1265     return 0
1266 }
1267
1268 VCS_INFO_svn_detect() {
1269     check_com -c svn || return 1
1270     [[ -d ".svn" ]] && return 0
1271     return 1
1272 }
1273
1274 # }}}
1275 VCS_INFO_format () { # {{{
1276     local msg
1277
1278     if [[ -n ${1} ]] ; then
1279         zstyle -s ":vcs_info:${vcs}" promptactionformat msg
1280         [[ -z ${msg} ]] && msg=${VCS_INFO_default_action_format}
1281     else
1282         zstyle -s ":vcs_info:${vcs}" promptformat msg
1283         [[ -z ${msg} ]] && msg=${VCS_INFO_default_format}
1284     fi
1285     printf '%s' ${msg}
1286 }
1287 # }}}
1288 vcs_info () { # {{{
1289     local string output
1290     local -i found
1291     local -a VCSs
1292     local -x vcs
1293
1294     vcs="init"
1295     zstyle -T ":vcs_info:${vcs}" "enable" || return 0
1296
1297     VCSs=(git hg bzr svn svk)
1298
1299     (( found = 0 ))
1300     for vcs in ${VCSs} ; do
1301         output=$(VCS_INFO_${vcs}_detect) && (( found = 1 )) && break
1302     done
1303
1304     (( found == 0 )) && return 0
1305
1306     string=$(VCS_INFO_${vcs}_get_data ${output}) || return 1
1307     printf '%s' ${string}
1308     return 0
1309 }
1310 # }}}
1311
1312 # change vcs_info formats for the grml prompt
1313 if [[ "$TERM" == dumb ]] ; then
1314     zstyle ':vcs_info:*' promptactionformat "(%s%)-[%b|%a] "
1315     zstyle ':vcs_info:*' promptformat       "(%s%)-[%b] "
1316 else
1317     # these are the same, just with a lot of colours:
1318     zstyle ':vcs_info:*' promptactionformat \
1319 "%{${fg[magenta]}%}(%{${reset_color}%}%s%{${fg[magenta]}%})%{${fg[yellow]}%}-%{${fg[magenta]}%}[%{${fg[green]}%}%b%{${fg[yellow]}%}|%{${fg[red]}%}%a%{${fg[magenta]}%}]%{${reset_color}%} "
1320     zstyle ':vcs_info:*' promptformat \
1321 "%{${fg[magenta]}%}(%{${reset_color}%}%s%{${fg[magenta]}%})%{${fg[yellow]}%}-%{${fg[magenta]}%}[%{${fg[green]}%}%b%{${fg[magenta]}%}]%{${reset_color}%} "
1322 fi
1323
1324 # }}}
1325
1326 # {{{ set prompt
1327 if zrcautoload promptinit && promptinit 2>/dev/null ; then
1328     promptinit # people should be able to use their favourite prompt
1329 else
1330     print 'Notice: no promptinit available :('
1331 fi
1332
1333 setopt prompt_subst
1334
1335 # precmd() => a function which is executed just before each prompt
1336 # use 'NOPRECMD=1' to disable the precmd + preexec commands
1337
1338 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
1339
1340 # make sure to use right prompt only when not running a command
1341 is41 && setopt transient_rprompt
1342
1343 is4 && [[ -z $NOPRECMD ]] && precmd () {
1344     [[ -n $NOPRECMD ]] && return 0
1345     # allow manual overwriting of RPROMPT
1346     if [[ -n $RPROMPT ]] ; then
1347         [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
1348         # return 0
1349     fi
1350     # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
1351     if [[ -z $DONTSETRPROMPT ]] ; then
1352         if [[ -n $BATTERY ]] ; then
1353             RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
1354             # RPROMPT="${PERCENT}${SCREENTITLE}"
1355         else
1356             RPROMPT="%(?..:()% ${SCREENTITLE}"
1357             # RPROMPT="${SCREENTITLE}"
1358         fi
1359     fi
1360     # adjust title of xterm
1361     # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
1362     case $TERM in
1363         (xterm*|rxvt)
1364             print -Pn "\e]0;%n@%m: %~\a"
1365             ;;
1366     esac
1367 }
1368
1369 # chpwd () => a function which is executed whenever the directory is changed
1370
1371 # preexec() => a function running before every command
1372 is4 && [[ -z $NOPRECMD ]] && \
1373 preexec () {
1374     [[ -n $NOPRECMD ]] && return 0
1375 # set hostname if not running on host with name 'grml'
1376     if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then
1377        NAME="@$HOSTNAME"
1378     fi
1379 # get the name of the program currently running and hostname of local machine
1380 # set screen window title if running in a screen
1381     if [[ "$TERM" == screen* ]] ; then
1382         # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # don't use hostname
1383         local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
1384         echo -ne "\ek$CMD\e\\"
1385     fi
1386 # set the screen title to "zsh" when sitting at the command prompt:
1387     if [[ "$TERM" == screen* ]] ; then
1388         SCREENTITLE=$'%{\ekzsh\e\\%}'
1389     else
1390         SCREENTITLE=''
1391     fi
1392 # adjust title of xterm
1393     case $TERM in
1394         (xterm*|rxvt)
1395             print -Pn "\e]0;%n@%m: $1\a"
1396             ;;
1397     esac
1398 }
1399
1400 # set colors
1401 if zrcautoload colors && colors 2>/dev/null ; then
1402     BLUE="%{${fg[blue]}%}"
1403     RED="%{${fg_bold[red]}%}"
1404     GREEN="%{${fg[green]}%}"
1405     CYAN="%{${fg[cyan]}%}"
1406     WHITE="%{${fg[white]}%}"
1407     NO_COLOUR="%{${reset_color}%}"
1408 else
1409     BLUE=$'%{\e[1;34m%}'
1410     RED=$'%{\e[1;31m%}'
1411     GREEN=$'%{\e[1;32m%}'
1412     CYAN=$'%{\e[1;36m%}'
1413     WHITE=$'%{\e[1;37m%}'
1414     NO_COLOUR=$'%{\e[0m%}'
1415 fi
1416
1417 EXITCODE="%(?..%?%1v )"
1418 PS2='`%_> '       # secondary prompt, printed when the shell needs more information to complete a command.
1419 PS3='?# '         # selection prompt used within a select loop.
1420 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
1421
1422 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
1423 if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
1424     debian_chroot=$(cat /etc/debian_chroot)
1425 fi
1426
1427 # don't use colors on dumb terminals (like emacs):
1428 if [[ "$TERM" == dumb ]] ; then
1429     PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# "
1430 else
1431     # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
1432     # set variable identifying the chroot you work in (used in the prompt below)
1433     if [[ -n $GRMLPROMPT ]] ; then
1434         PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
1435 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
1436     else
1437         # This assembles the primary prompt string
1438         if (( EUID != 0 )); then
1439             PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# "
1440         else
1441             PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# "
1442         fi
1443     fi
1444 fi
1445
1446 # if we are inside a grml-chroot set a specific prompt theme
1447 if [[ -n "$GRML_CHROOT" ]] ; then
1448     PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
1449 fi
1450 # }}}
1451
1452 # {{{ 'hash' some often used directories
1453 #d# start
1454 hash -d deb=/var/cache/apt/archives
1455 hash -d doc=/usr/share/doc
1456 hash -d linux=/lib/modules/$(command uname -r)/build/
1457 hash -d log=/var/log
1458 hash -d slog=/var/log/syslog
1459 hash -d src=/usr/src
1460 hash -d templ=/usr/share/doc/grml-templates
1461 hash -d tt=/usr/share/doc/texttools-doc
1462 hash -d www=/var/www
1463 #d# end
1464 # }}}
1465
1466 # {{{ some aliases
1467 if [[ $UID -eq 0 ]] ; then
1468     [[ -r /etc/grml/screenrc ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
1469 elif [[ -r $HOME/.screenrc ]] ; then
1470     alias screen="/usr/bin/screen -c $HOME/.screenrc"
1471 else
1472     [[ -r /etc/grml/screenrc_grml ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
1473 fi
1474
1475 # do we have GNU ls with color-support?
1476 if ls --help 2>/dev/null | grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then
1477     #a1# execute \kbd{@a@}:\quad ls with colors
1478     alias ls='ls -b -CF --color=auto'
1479     #a1# execute \kbd{@a@}:\quad list all files, with colors
1480     alias la='ls -la --color=auto'
1481     #a1# long colored list, without dotfiles (@a@)
1482     alias ll='ls -l --color=auto'
1483     #a1# long colored list, human readable sizes (@a@)
1484     alias lh='ls -hAl --color=auto'
1485     #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
1486     alias l='ls -lF --color=auto'
1487 else
1488     alias ls='ls -b -CF'
1489     alias la='ls -la'
1490     alias ll='ls -l'
1491     alias lh='ls -hAl'
1492     alias l='ls -lF'
1493 fi
1494
1495 alias mdstat='cat /proc/mdstat'
1496 alias ...='cd ../../'
1497
1498 # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
1499 if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
1500     alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
1501 fi
1502
1503 alias cp='nocorrect cp'         # no spelling correction on cp
1504 alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
1505 alias mv='nocorrect mv'         # no spelling correction on mv
1506 alias rm='nocorrect rm'         # no spelling correction on rm
1507
1508 #a1# Execute \kbd{rmdir}
1509 alias rd='rmdir'
1510 #a1# Execute \kbd{rmdir}
1511 alias md='mkdir'
1512
1513 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
1514 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
1515 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
1516
1517 # make sure it is not assigned yet
1518 [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
1519
1520 utf2iso() {
1521     if isutfenv ; then
1522         for ENV in $(env | command grep -i '.utf') ; do
1523             eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
1524         done
1525     fi
1526 }
1527
1528 # make sure it is not assigned yet
1529 [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
1530 iso2utf() {
1531     if ! isutfenv ; then
1532         for ENV in $(env | command grep -i '\.iso') ; do
1533             eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
1534         done
1535     fi
1536 }
1537
1538 # set up software synthesizer via speakup
1539 swspeak() {
1540     aumix -w 90 -v 90 -p 90 -m 90
1541     if ! [[ -r /dev/softsynth ]] ; then
1542         flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
1543         return 1
1544     else
1545         setopt singlelinezle
1546         unsetopt prompt_cr
1547         export PS1="%m%# "
1548         nice -n -20 speechd-up
1549         sleep 2
1550         flite -o play -t "Finished setting up software synthesizer"
1551     fi
1552 }
1553
1554 # I like clean prompt, so provide simple way to get that
1555 check_com 0 || alias 0='return 0'
1556
1557 # for really lazy people like mika:
1558 check_com S &>/dev/null || alias S='screen'
1559 check_com s &>/dev/null || alias s='ssh'
1560
1561 # get top 10 shell commands:
1562 alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
1563
1564 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
1565 if check_com -c truecrypt ; then
1566     if isutfenv ; then
1567         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
1568     else
1569         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
1570     fi
1571 fi
1572
1573 #f1# Hints for the use of zsh on grml
1574 zsh-help() {
1575     print "$bg[white]$fg[black]
1576 zsh-help - hints for use of zsh on grml
1577 =======================================$reset_color"
1578
1579     print '
1580 Main configuration of zsh happens in /etc/zsh/zshrc (global)
1581 and /etc/skel/.zshrc which is copied to $HOME/.zshrc once.
1582 The files are part of the package grml-etc-core, if you want to
1583 use them on a non-grml-system just get the tar.gz from
1584 http://deb.grml.org/ or get the files from the mercurial
1585 repository:
1586
1587   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
1588   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
1589
1590 If you want to stay in sync with zsh configuration of grml
1591 run '\''ln -sf /etc/skel/.zshrc $HOME/.zshrc'\'' and configure
1592 your own stuff in $HOME/.zshrc.local. System wide configuration
1593 without touching configuration files of grml can take place
1594 in /etc/zsh/zshrc.local.
1595
1596 If you want to use the configuration of user grml also when
1597 running as user root just run '\''zshskel'\'' which will source
1598 the file /etc/skel/.zshrc.
1599
1600 For information regarding zsh start at http://grml.org/zsh/
1601
1602 Take a look at grml'\''s zsh refcard:
1603 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
1604
1605 Check out the main zsh refcard:
1606 % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
1607
1608 And of course visit the zsh-lovers:
1609 % man zsh-lovers
1610
1611 You can adjust some options through environment variables when
1612 invoking zsh without having to edit configuration files.
1613 Basically meant for bash users who are not used to the power of
1614 the zsh yet. :)
1615
1616   "NOCOR=1    zsh" => deactivate automatic correction
1617   "NOMENU=1   zsh" => do not use menu completion (note: use strg-d for completion instead!)
1618   "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
1619   "BATTERY=1  zsh" => activate battery status (via acpi) on right side of prompt'
1620
1621     print "
1622 $bg[white]$fg[black]
1623 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
1624 Enjoy your grml system with the zsh!$reset_color"
1625 }
1626
1627 # debian stuff
1628 if [[ -r /etc/debian_version ]] ; then
1629     #a3# Execute \kbd{apt-cache search}
1630     alias acs='apt-cache search'
1631     #a3# Execute \kbd{apt-cache show}
1632     alias acsh='apt-cache show'
1633     #a3# Execute \kbd{apt-cache policy}
1634     alias acp='apt-cache policy'
1635     #a3# Execute \kbd{apt-get dist-upgrade}
1636     salias adg="apt-get dist-upgrade"
1637     #a3# Execute \kbd{apt-get install}
1638     salias agi="apt-get install"
1639     #a3# Execute \kbd{aptitude install}
1640     salias ati="aptitude install"
1641     #a3# Execute \kbd{apt-get upgrade}
1642     salias ag="apt-get upgrade"
1643     #a3# Execute \kbd{apt-get update}
1644     salias au="apt-get update"
1645     #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
1646     salias -a up="aptitude update ; aptitude safe-upgrade"
1647     #a3# Execute \kbd{dpkg-buildpackage}
1648     alias dbp='dpkg-buildpackage'
1649     #a3# Execute \kbd{grep-excuses}
1650     alias ge='grep-excuses'
1651
1652     # debian upgrade
1653     #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
1654     upgrade() {
1655         if [[ -z "$1" ]] ; then
1656             $SUDO apt-get update
1657             $SUDO apt-get -u upgrade
1658         else
1659             ssh $1 $SUDO apt-get update
1660             # ask before the upgrade
1661             local dummy
1662             ssh $1 $SUDO apt-get --no-act upgrade
1663             echo -n 'Process the upgrade?'
1664             read -q dummy
1665             if [[ $dummy == "y" ]] ; then
1666                 ssh $1 $SUDO apt-get -u upgrade --yes
1667             fi
1668         fi
1669     }
1670
1671     # get a root shell as normal user in live-cd mode:
1672     if isgrmlcd && [[ $UID -ne 0 ]] ; then
1673        alias su="sudo su"
1674      fi
1675
1676     #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
1677     alias llog="$PAGER /var/log/syslog"     # take a look at the syslog
1678     #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
1679     alias tlog="tail -f /var/log/syslog"    # follow the syslog
1680     #a1# (Re)-source \kbd{/etc/skel/.zshrc}
1681     alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
1682 fi
1683
1684 # sort installed Debian-packages by size
1685 if check_com -c grep-status ; then
1686     #a3# List installed Debian-packages sorted by size
1687     alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd "  \n" | sort -rn'
1688 fi
1689
1690 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
1691 if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord ; then
1692     if check_com -c wodim ; then
1693         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
1694 See #377109 in the BTS of Debian for more details.
1695
1696 Please use the wodim binary instead' ; return 1"
1697     fi
1698 fi
1699
1700 # get_tw_cli has been renamed into get_3ware
1701 if check_com -c get_3ware ; then
1702     get_tw_cli() {
1703         echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
1704         get_3ware
1705     }
1706 fi
1707
1708 # I hate lacking backward compatibility, so provide an alternative therefore
1709 if ! check_com -c apache2-ssl-certificate ; then
1710
1711     apache2-ssl-certificate() {
1712
1713     print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
1714     print 'You might want to take a look at Debian the package ssl-cert as well.'
1715     print 'To generate a certificate for use with apache2 follow the instructions:'
1716
1717     echo '
1718
1719 export RANDFILE=/dev/random
1720 mkdir /etc/apache2/ssl/
1721 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
1722 chmod 600 /etc/apache2/ssl/apache.pem
1723
1724 Run "grml-tips ssl-certificate" if you need further instructions.
1725 '
1726     }
1727 fi
1728 # }}}
1729
1730 # {{{ Use hard limits, except for a smaller stack and no core dumps
1731 unlimit
1732 is4 && limit stack 8192
1733 isgrmlcd && limit core 0 # important for a live-cd-system
1734 limit -s
1735 # }}}
1736
1737 # {{{ completion system
1738
1739 # called later (via is4 && grmlcomp)
1740 # notice: use 'zstyle' for getting current settings
1741 #         press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
1742 grmlcomp() {
1743     # TODO: This could use some additional information
1744
1745     # allow one error for every three characters typed in approximate completer
1746     zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
1747
1748     # don't complete backup files as executables
1749     zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
1750
1751     # start menu completion only if it could find no unambiguous initial string
1752     zstyle ':completion:*:correct:*'       insert-unambiguous true
1753     zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
1754     zstyle ':completion:*:correct:*'       original true
1755
1756     # activate color-completion
1757     zstyle ':completion:*:default'         list-colors ${(s.:.)LS_COLORS}
1758
1759     # format on completion
1760     zstyle ':completion:*:descriptions'    format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
1761
1762     # complete 'cd -<tab>' with menu
1763     zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
1764
1765     # insert all expansions for expand completer
1766     zstyle ':completion:*:expand:*'        tag-order all-expansions
1767     zstyle ':completion:*:history-words'   list false
1768
1769     # activate menu
1770     zstyle ':completion:*:history-words'   menu yes
1771
1772     # ignore duplicate entries
1773     zstyle ':completion:*:history-words'   remove-all-dups yes
1774     zstyle ':completion:*:history-words'   stop yes
1775
1776     # match uppercase from lowercase
1777     zstyle ':completion:*'                 matcher-list 'm:{a-z}={A-Z}'
1778
1779     # separate matches into groups
1780     zstyle ':completion:*:matches'         group 'yes'
1781     zstyle ':completion:*'                 group-name ''
1782
1783     if [[ -z "$NOMENU" ]] ; then
1784         # if there are more than 5 options allow selecting from a menu
1785         zstyle ':completion:*'               menu select=5
1786     else
1787         # don't use any menus at all
1788         setopt no_auto_menu
1789     fi
1790
1791     zstyle ':completion:*:messages'        format '%d'
1792     zstyle ':completion:*:options'         auto-description '%d'
1793
1794     # describe options in full
1795     zstyle ':completion:*:options'         description 'yes'
1796
1797     # on processes completion complete all user processes
1798     zstyle ':completion:*:processes'       command 'ps -au$USER'
1799
1800     # offer indexes before parameters in subscripts
1801     zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
1802
1803     # provide verbose completion information
1804     zstyle ':completion:*'                 verbose true
1805
1806     # recent (as of Dec 2007) zsh versions are able to provide descriptions
1807     # for commands (read: 1st word in the line) that it will list for the user
1808     # to choose from. The following disables that, because it's not exactly fast.
1809     zstyle ':completion:*:-command-:*:'    verbose false
1810
1811     # set format for warnings
1812     zstyle ':completion:*:warnings'        format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
1813
1814     # define files to ignore for zcompile
1815     zstyle ':completion:*:*:zcompile:*'    ignored-patterns '(*~|*.zwc)'
1816     zstyle ':completion:correct:'          prompt 'correct to: %e'
1817
1818     # Ignore completion functions for commands you don't have:
1819     zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
1820
1821     # Provide more processes in completion of programs like killall:
1822     zstyle ':completion:*:processes-names' command 'ps c -u ${USER} -o command | uniq'
1823
1824     # complete manual by their section
1825     zstyle ':completion:*:manuals'    separate-sections true
1826     zstyle ':completion:*:manuals.*'  insert-sections   true
1827     zstyle ':completion:*:man:*'      menu yes select
1828
1829     # run rehash on completion so new installed program are found automatically:
1830     _force_rehash() {
1831         (( CURRENT == 1 )) && rehash
1832         return 1
1833     }
1834
1835     ## correction
1836     # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
1837     if [[ -n "$NOCOR" ]] ; then
1838         zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
1839         setopt nocorrect
1840     else
1841         # try to be smart about when to use what completer...
1842         setopt correct
1843         zstyle -e ':completion:*' completer '
1844             if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
1845                 _last_try="$HISTNO$BUFFER$CURSOR"
1846                 reply=(_complete _match _ignored _prefix _files)
1847             else
1848                 if [[ $words[1] == (rm|mv) ]] ; then
1849                     reply=(_complete _files)
1850                 else
1851                     reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
1852                 fi
1853             fi'
1854     fi
1855
1856     # zstyle ':completion:*' completer _complete _correct _approximate
1857     # zstyle ':completion:*' expand prefix suffix
1858
1859     # complete shell aliases
1860     # zstyle ':completion:*' completer _expand_alias _complete _approximate
1861
1862     # command for process lists, the local web server details and host completion
1863     zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
1864
1865     # caching
1866     [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
1867                             zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
1868
1869     # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
1870     if is42 ; then
1871         [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
1872         [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
1873     else
1874         _ssh_hosts=()
1875         _etc_hosts=()
1876     fi
1877     hosts=(
1878         $(hostname)
1879         "$_ssh_hosts[@]"
1880         "$_etc_hosts[@]"
1881         grml.org
1882         localhost
1883     )
1884     zstyle ':completion:*:hosts' hosts $hosts
1885     #  zstyle '*' hosts $hosts
1886
1887     # specify your logins:
1888     # my_accounts=(
1889     #  {grml,grml1}@foo.invalid
1890     #  grml-devel@bar.invalid
1891     # )
1892     # other_accounts=(
1893     #  {fred,root}@foo.invalid
1894     #  vera@bar.invalid
1895     # )
1896     # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
1897     # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
1898
1899     # specify specific port/service settings:
1900     #  telnet_users_hosts_ports=(
1901     #    user1@host1:
1902     #    user2@host2:
1903     #    @mail-server:{smtp,pop3}
1904     #    @news-server:nntp
1905     #    @proxy-server:8000
1906     #  )
1907     # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
1908
1909     # use generic completion system for programs not yet defined; (_gnu_generic works
1910     # with commands that provide a --help option with "standard" gnu-like output.)
1911     compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
1912
1913     # see upgrade function in this file
1914     compdef _hosts upgrade
1915 }
1916 # }}}
1917
1918 # {{{ grmlstuff
1919 grmlstuff() {
1920 # people should use 'grml-x'!
1921     startx() {
1922         if [[ -e /etc/X11/xorg.conf ]] ; then
1923             [[ -x /usr/bin/startx ]] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
1924         else
1925             echo "Please use the script \"grml-x\" for starting the X Window System
1926 because there does not exist /etc/X11/xorg.conf yet.
1927 If you want to use startx anyway please call \"/usr/bin/startx\"."
1928             return -1
1929         fi
1930     }
1931
1932     xinit() {
1933         if [[ -e /etc/X11/xorg.conf ]] ; then
1934             [[ -x /usr/bin/xinit ]] && /usr/bin/xinit || /usr/X11R6/bin/xinit
1935         else
1936             echo "Please use the script \"grml-x\" for starting the X Window System.
1937 because there does not exist /etc/X11/xorg.conf yet.
1938 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
1939             return -1
1940         fi
1941     }
1942
1943     if check_com -c 915resolution ; then
1944         alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
1945     fi
1946
1947     #a1# Output version of running grml
1948     alias grml-version='cat /etc/grml_version'
1949
1950     if check_com -c rebuildfstab ; then
1951         #a1# Rebuild /etc/fstab
1952         alias grml-rebuildfstab='rebuildfstab -v -r -config'
1953     fi
1954
1955     if check_com -c grml-debootstrap ; then
1956         alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
1957     fi
1958 }
1959 # }}}
1960
1961 # {{{ now run the functions
1962 isgrml && checkhome
1963 is4    && isgrml    && grmlstuff
1964 is4    && grmlcomp
1965 # }}}
1966
1967 # {{{ keephack
1968 is4 && xsource "/etc/zsh/keephack"
1969 # }}}
1970
1971 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
1972 # You use it as follows:
1973 # $ NTREF=/reference/file
1974 # $ ls -l *(e:nt:)
1975 # This lists all the files in the current directory newer than the reference file.
1976 # You can also specify the reference file inline; note quotes:
1977 # $ ls -l *(e:'nt ~/.zshenv':)
1978 is4 && nt() {
1979     if [[ -n $1 ]] ; then
1980         local NTREF=${~1}
1981     fi
1982     [[ $REPLY -nt $NTREF ]]
1983 }
1984 # }}}
1985
1986 # shell functions {{{
1987
1988 #f1# Provide csh compatibility
1989 setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
1990
1991 #f1# Reload an autoloadable function
1992 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
1993
1994 #f1# Reload zsh setup
1995 reload() {
1996     if [[ "$#*" -eq 0 ]] ; then
1997         [[ -r ~/.zshrc ]] && . ~/.zshrc
1998     else
1999         local fn
2000         for fn in "$@"; do
2001             unfunction $fn
2002             autoload -U $fn
2003         done
2004     fi
2005 }
2006 compdef _functions reload freload
2007
2008 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
2009 sll() {
2010     [[ -z "$1" ]] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
2011     for i in "$@" ; do
2012         file=$i
2013         while [[ -h "$file" ]] ; do
2014             ls -l $file
2015             file=$(readlink "$file")
2016         done
2017     done
2018 }
2019
2020 # fast manual access
2021 if check_com qma ; then
2022     #f1# View the zsh manual
2023     manzsh()  { qma zshall "$1" }
2024     compdef _man qma
2025 else
2026     manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
2027     # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
2028     # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
2029     # manzsh()  { man zshall | $MYLESS -p $1 ; }
2030 fi
2031
2032 if check_com -c $PAGER ; then
2033     #f1# View Debian's changelog of a given package
2034     dchange() {
2035         if [[ -r /usr/share/doc/${1}/changelog.Debian.gz ]] ; then
2036             $PAGER /usr/share/doc/${1}/changelog.Debian.gz
2037         elif [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
2038             $PAGER /usr/share/doc/${1}/changelog.gz
2039         else
2040             if check_com -c aptitude ; then
2041                 echo "No changelog for package $1 found, using aptitude to retrieve it."
2042                 if isgrml ; then
2043                     aptitude -t unstable changelog ${1}
2044                 else
2045                     aptitude changelog ${1}
2046                 fi
2047             else
2048                 echo "No changelog for package $1 found, sorry."
2049                 return 1
2050             fi
2051         fi
2052     }
2053     _dchange() { _files -W /usr/share/doc -/ }
2054     compdef _dchange dchange
2055
2056     #f1# View Debian's NEWS of a given package
2057     dnews() {
2058         if [[ -r /usr/share/doc/${1}/NEWS.Debian.gz ]] ; then
2059             $PAGER /usr/share/doc/${1}/NEWS.Debian.gz
2060         else
2061             if [[ -r /usr/share/doc/${1}/NEWS.gz ]] ; then
2062                 $PAGER /usr/share/doc/${1}/NEWS.gz
2063             else
2064                 echo "No NEWS file for package $1 found, sorry."
2065                 return 1
2066             fi
2067         fi
2068     }
2069     _dnews() { _files -W /usr/share/doc -/ }
2070     compdef _dnews dnews
2071
2072     #f1# View upstream's changelog of a given package
2073     uchange() {
2074         if [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
2075             $PAGER /usr/share/doc/${1}/changelog.gz
2076         else
2077             echo "No changelog for package $1 found, sorry."
2078             return 1
2079         fi
2080     }
2081     _uchange() { _files -W /usr/share/doc -/ }
2082     compdef _uchange uchange
2083 fi
2084
2085 # zsh profiling
2086 profile() {
2087     ZSH_PROFILE_RC=1 $SHELL "$@"
2088 }
2089
2090 #f1# Edit an alias via zle
2091 edalias() {
2092     [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
2093 }
2094 compdef _aliases edalias
2095
2096 #f1# Edit a function via zle
2097 edfunc() {
2098     [[ -z "$1" ]] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
2099 }
2100 compdef _functions edfunc
2101
2102 # use it e.g. via 'Restart apache2'
2103 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
2104 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
2105 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
2106 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
2107 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
2108 if [[ -d /etc/init.d || -d /etc/service ]] ; then
2109     __start_stop() {
2110         local action_="${1:l}"  # e.g Start/Stop/Restart
2111         local service_="$2"
2112         local param_="$3"
2113
2114         local service_target_="$(readlink /etc/init.d/$service_)"
2115         if [[ $service_target_ == "/usr/bin/sv" ]]; then
2116             # runit
2117             case "${action_}" in
2118                 start) if [[ ! -e /etc/service/$service_ ]]; then
2119                            $SUDO ln -s "/etc/sv/$service_" "/etc/service/"
2120                        else
2121                            $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2122                        fi ;;
2123                 # there is no reload in runits sysv emulation
2124                 reload) $SUDO "/etc/init.d/$service_" "force-reload" "$param_" ;;
2125                 *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;;
2126             esac
2127         else
2128             # sysvinit
2129             $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2130         fi
2131     }
2132
2133     for i in Start Restart Stop Force-Reload Reload ; do
2134         eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }"
2135     done
2136 fi
2137
2138 #f1# Provides useful information on globbing
2139 H-Glob() {
2140     echo -e "
2141     /      directories
2142     .      plain files
2143     @      symbolic links
2144     =      sockets
2145     p      named pipes (FIFOs)
2146     *      executable plain files (0100)
2147     %      device files (character or block special)
2148     %b     block special files
2149     %c     character special files
2150     r      owner-readable files (0400)
2151     w      owner-writable files (0200)
2152     x      owner-executable files (0100)
2153     A      group-readable files (0040)
2154     I      group-writable files (0020)
2155     E      group-executable files (0010)
2156     R      world-readable files (0004)
2157     W      world-writable files (0002)
2158     X      world-executable files (0001)
2159     s      setuid files (04000)
2160     S      setgid files (02000)
2161     t      files with the sticky bit (01000)
2162
2163   print *(m-1)          # Files modified up to a day ago
2164   print *(a1)           # Files accessed a day ago
2165   print *(@)            # Just symlinks
2166   print *(Lk+50)        # Files bigger than 50 kilobytes
2167   print *(Lk-50)        # Files smaller than 50 kilobytes
2168   print **/*.c          # All *.c files recursively starting in \$PWD
2169   print **/*.c~file.c   # Same as above, but excluding 'file.c'
2170   print (foo|bar).*     # Files starting with 'foo' or 'bar'
2171   print *~*.*           # All Files that do not contain a dot
2172   chmod 644 *(.^x)      # make all plain non-executable files publically readable
2173   print -l *(.c|.h)     # Lists *.c and *.h
2174   print **/*(g:users:)  # Recursively match all files that are owned by group 'users'
2175   echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
2176 }
2177 alias help-zshglob=H-Glob
2178
2179 check_com -c qma && alias ?='qma zshall'
2180
2181 # grep for running process, like: 'any vim'
2182 any() {
2183     if [[ -z "$1" ]] ; then
2184         echo "any - grep for process(es) by keyword" >&2
2185         echo "Usage: any <keyword>" >&2 ; return 1
2186     else
2187         local STRING=$1
2188         local LENGTH=$(expr length $STRING)
2189         local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
2190         local REST=$(echo $(expr substr $STRING 2 $LENGTH))
2191         ps xauwww| grep "[$FIRSCHAR]$REST"
2192     fi
2193 }
2194
2195 # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
2196 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
2197 [[ -r /proc/1/maps ]] && \
2198 deswap() {
2199     print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
2200     cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/')  > /dev/null
2201     print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
2202 }
2203
2204 # print hex value of a number
2205 hex() {
2206     [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
2207 }
2208
2209 # calculate (or eval at all ;-)) with perl => p[erl-]eval
2210 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
2211 peval() {
2212     [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]"
2213     perl -e "print eval($CALC),\"\n\";"
2214 }
2215 functions peval &>/dev/null && alias calc=peval
2216
2217 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
2218 # certain circumstances, so work around it, no matter which environment we have
2219 brltty() {
2220     if [[ -z "$DISPLAY" ]] ; then
2221         consolechars -f /usr/share/consolefonts/default8x16.psf.gz
2222         command brltty "$@"
2223     else
2224         command brltty "$@"
2225     fi
2226 }
2227
2228 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
2229 aoeu() {
2230     echo -n 'Switching to us keyboard layout: '
2231     [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
2232     echo 'Done'
2233 }
2234 asdf() {
2235     echo -n 'Switching to dvorak keyboard layout: '
2236     [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
2237     echo 'Done'
2238 }
2239 # just press 'asdf' key to toggle from neon layout to us keyboard layout
2240 uiae() {
2241     echo -n 'Switching to us keyboard layout: '
2242     setxkbmap us && echo 'Done' || echo 'Failed'
2243 }
2244
2245 # set up an ipv6 tunnel
2246 ipv6-tunnel() {
2247     case $1 in
2248         start)
2249             if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2250                 print 'ipv6 tunnel already set up, nothing to be done.'
2251                 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
2252             else
2253                 [[ -n "$PUBLIC_IP" ]] || \
2254                     local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
2255                                       awk '/inet addr:/ {print $2}' | tr -d 'addr:')
2256
2257                 [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
2258                 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
2259                 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
2260                 ifconfig sit0 tunnel ::192.88.99.1 up
2261                 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
2262             fi
2263             ;;
2264         status)
2265             if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2266                 print 'ipv6 tunnel available' ; return 0
2267             else
2268                 print 'ipv6 tunnel not available' ; return 1
2269             fi
2270             ;;
2271         stop)
2272             if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2273                 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
2274                 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
2275             else
2276                 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
2277             fi
2278             ;;
2279         *)
2280             print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
2281             ;;
2282     esac
2283 }
2284
2285 # run dhclient for wireless device
2286 iwclient() {
2287     salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
2288 }
2289
2290 # spawn a minimally set up ksh - useful if you want to umount /usr/.
2291 minimal-shell() {
2292     exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
2293 }
2294
2295 # make a backup of a file
2296 bk() {
2297     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
2298 }
2299
2300 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
2301 # bash() {
2302 #  NO_SWITCH="yes" command bash "$@"
2303 # }
2304 # restart () {
2305 #  exec $SHELL $SHELL_ARGS "$@"
2306 # }
2307
2308 # }}}
2309
2310 # log out? set timeout in seconds {{{
2311 # TMOUT=1800
2312 # do not log out in some specific terminals:
2313 #  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]] ; then
2314 #    unset TMOUT
2315 #  fi
2316 # }}}
2317
2318 # {{{ make sure our environment is clean regarding colors
2319 for color in BLUE RED GREEN CYAN WHITE ; unset $color
2320 # }}}
2321
2322 # source another config file if present {{{
2323 xsource "/etc/zsh/zshrc.local"
2324 xsource "${HOME}/.zshenv"
2325 # }}}
2326
2327 # "persistent history" {{{
2328 # just write important commands you always need to ~/.important_commands
2329 if [[ -r ~/.important_commands ]] ; then
2330     fc -R ~/.important_commands
2331 fi
2332 # }}}
2333
2334 ## genrefcard.pl settings {{{
2335 ### example: split functions-search 8,16,24,32
2336 #@# split functions-search 8
2337 ## }}}
2338
2339 # add variable to be able to check whether the file has been read {{{
2340 ZSHRC_GLOBAL_HAS_BEEN_READ=1
2341 # }}}
2342
2343 ## END OF FILE #################################################################
2344 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4